federated social web blog
using the foundation of all-the-things
federated social web blog app. in short, i'm trying to build an open-source Tumblr (RIP). passes SWAT0!
- social features:
- RSS reader — follows Atom, RSS, ActivityPub and AT Protocol accounts side by side
- oStatus stack, WebSub/Salmon/Webfinger
- ActivityPub: two-way with Mastodon — signed delivery to followers, mentions and whoever you replied to, actor collections (outbox/followers/following/replies), NodeInfo, and inbound Create/Update/Delete/Follow/Like/Announce/Undo. Activities carry a FEP-8b32 object integrity proof, so a forwarded or relayed one still verifies.
- AT Protocol: a
did:webidentity plus a read-only XRPC surface, and a Bluesky bridge that mirrors your posts and pulls followed accounts into the reader. (Not a PDS — see below.) - feeds published as both Atom and RSS 2.0
- blogroll published as OPML at
/blogs.opml.xml(and/:username/blogs.opml.xml) - commenting
- api to follow/reblog content (pretty basic right now)
- WYSIWYG editor
- edit content in page, or add new content via dashboard
- rich content pasting (paste in url/embed and we'll grab the video or image)
- tagging objects through #catvideo and people @bestfriendforevs
- different templates (namely, albums currently)
- CSS/JS/HTML editing via CodeMirror
- technology features:
- foundation: CRA-all-the-things
- Auth.js for logging
The app serves a did:web identity (/.well-known/did.json, or
/<username>/did.json on a shared host) and answers a handful of read-only XRPC
methods at /xrpc/* — com.atproto.repo.describeRepo, listRecords,
getRecord, app.bsky.actor.getProfile and app.bsky.feed.getAuthorFeed —
projecting posts as app.bsky.feed.post records with real dag-cbor CIDs.
It is not a Personal Data Server: there are no signed repo commits, no MST,
and no com.atproto.sync.*, so relays won't index it and Bluesky clients won't
resolve it as a repo host. Actual two-way interop runs through the bridge —
link a Bluesky account in the dashboard (handle + app password) and posts mirror
there, while following an @handle.bsky.social pulls that account's feed into
your reader.
A TanStack Start app (React 19 + Vite + Nitro) with a Hono backend and Prisma over Postgres, managed with bun.
bun installPrerequisites: Node 22+.
First, run the development server:
bun run devOpen http://localhost:3000 with your browser to see the result.
To run tests:
bun run testTo setup your DB:
cp prisma/.env.example prisma/.envand set DATABASE_URL=postgresql://postgres:password@databasedomain.com:PORT/postgres
Then, to sync your DB:
npx prisma db pushTo view your DB locally:
npx prisma studioTo learn more about Prisma, read the docs here. Supabase is pretty great to get a good Postgres DB: https://app.supabase.io/
To add your name/email to relevant files:
yarn config(The format is based on Make a README)