crate.social is a custom-lexicon publishing service for ATProto. It defines structured record types (social.crate.*) for the things you make — notes, podcast episodes, projects, talks, illustrations — imports from any source (RSS, markdown, manual entry), publishes records to your PDS, and exposes a read API so any frontend can query them.
For the full vision, architecture decisions, and lexicon catalog, see plan.md.
crate/
├── api/ # backend service (Express, Postgres/Kysely, ATProto OAuth)
├── lexicons/ # social.crate.* lexicon JSON definitions
├── importers/ # source adapters (RSS, markdown)
└── landing/ # marketing site (Astro + Tailwind) — hibernating until ready to ship
Sibling repos: The web app has been extracted into a separate repository —
crate-web(React 19 + Vite + Chakra UI) — so it can deploy independently to GitHub Pages.crate-webreads lexicon types from../crate/lexicons/via a locallexgen:localscript. The landing site remains in this repo atlanding/until it's ready to ship.
- Node 22 (see
.nvmrc) - Postgres (for
api/)
nvm use
npm --prefix api installConvenience scripts at the root:
npm run dev:api # start api in watch mode
npm run format # format all files with prettier
npm run lexgen # regenerate TS types from lexicons/