# rfd An atproto-powered request-for-discussion (RFD) platform. A thin, single-tenant, self-hostable client over [tangled](https://tangled.org)'s **bobbin** appview — no custom indexing infrastructure required. ## How it works - Proposals are numbered Markdown files (`NNNN-slug.md`) in a tangled git repo named `rfd`. - Discussion happens through tangled pulls, issues, and comments. - This app reads everything from a **bobbin** appview (default: `https://api.tangled.org`) and writes go browser-side directly to the author's PDS via OAuth. ## Packages - `packages/core` (`@rfd/core`) — headless, transport-agnostic library over bobbin. - `packages/www` — Astro (Node) server that renders one owner's `rfd` repo. ## Self-hosting The app is single-tenant: one instance serves one owner's `rfd` repo. ### Docker ```bash docker run -p 4321:4321 -e RFD_OWNER=you.example.com natemoo-re/rfd ``` ### Railway Deploy this repo; Railway builds the `Dockerfile` and injects `PORT`. Set `RFD_OWNER` (and any optional vars below) in the service settings. ### Configuration | Var | Default | Purpose | |---|---|---| | `RFD_OWNER` | — (required) | Handle or DID of the repo owner | | `RFD_REPO_NAME` | `rfd` | Canonical repo name to serve | | `BOBBIN_URL` | `https://api.tangled.org` | Comma-separated, preference-ordered bobbin pool | | `RFD_CACHE_TTL` | `60` | Seconds to cache known-content responses | | `PUBLIC_ORIGIN` | request-derived | Origin for OAuth client metadata | | `PORT` | host-provided | HTTP listen port | ## Development ```bash pnpm install RFD_OWNER=you.example.com pnpm --filter www dev pnpm --filter @rfd/core test ```