The folder
IS the website.
A folder format for structured content. Three rules. Any conforming reader turns the folder into a site.
Switch readers — content stays.
The spec
Three rules. Nothing more.
A file is a record.
.json files hold structure. .md, .pdf, .png are opaque payloads. Metadata goes in a same-named .json sidecar.
A folder is a collection.
Any directory is a collection. Folders nest freely. index.json inside a folder is that folder's record.
The filename is the contract.
Names follow name[.modifier]*.ext. File form and folder form are the same identity — no rename, no broken refs.
Why Mosaic
Three things you get from day one.
Your content is plain files.
Git tracks them. cat reads them. No proprietary database, no export script, no vendor. Move the folder — the site moves with it.
Frameworks are interchangeable.
Today Astro. Tomorrow Next. Next year a Rust thing not invented yet. Same folder, different reader — the content stays.
SEO + AI ready, built in.
JSON-LD via @type. OpenGraph + Twitter via meta:. Crawlers and LLMs read the same JSON your renderer does. No plugin layer.
Adopt
Four lines into Astro.
Same shape in Next via @ssolu/mosaic-next. Same shape in any future adapter.
Walks your folder, resolves sidecars + refs + cascade, hands Astro a Content Layer collection. Zero runtime deps.
Validate
Drop a folder. Get the verdict.
Runs @ssolu/mosaic-validator-web right here in the page — same §§5–9 rules as the Node CLI and the Python validator. Nothing leaves the browser.
Don't have a folder handy? Clone the repo and drop any of spec/examples/{A,B,C,D,E}/content/.
Explore
Pick a path.
mosaic-migrate scanner.