Content model
Architecture — part 1 of 13
How the engine works inside -- one page, following a post's life from keystroke to visitor. The why behind these shapes lives in Decisions.
$EDITOR (markdown) → CLI parse → JSON blocks → build (ERB) → static HTML → deploy backend → host
↑ ↑
importers target the cron refreshes widget
same schema JSON + post stats
One post = one JSON file at content.nosync/posts/<year>/<slug>.json:
slug,title,date(ISO 8601),tags,state(published/draft),source(which platform it came from), optionallymastodon_url(its comment toot),draft_tokenandcreated_at(drafts),type(explicit content type override).contentis an array of typed blocks:text(withsubtypeheading1-6/quote),list,table,code,image,video,audio,file,link,chat,hr.- Inline formatting (bold/italic/strikethrough/code/link) is stored as codepoint offset ranges into plain text, not nested HTML -- the same NPF-style shape Tumblr's API uses, which is what the importers naturally produce.
- Media lives next to its post in
media.nosync/<year>/<slug>/, referenced by bare filename; nothing is ever hotlinked.
