A global, community-driven knowledge and resource platform by Pherus for the LGBTQIA+ community: discover trusted healthcare, legal, housing, opportunity, and life-skills resources through queer-to-queer (Q2Q) community knowledge, kept trustworthy by community submission and moderation.
We're building this as a tracer bullet: each vertical (resource
directory, atlas, guides, stories, opportunities, businesses) is built end to
end through data, API, and UI before the next one starts, so the first slice
works for real before anything else is added. See
docs/scope/scope.md for the full roadmap, current
status per feature, and what still needs a design decision.
- Runtime & tooling: Bun workspaces, Turborepo
- App (
www): TanStack Start (React 19, file-based routing via TanStack Router, SSR), deployed to Cloudflare Workers - Styling: Tailwind CSS v4 + Base UI primitives
- Design system (
shared/ui, published as@pherus/ui): shared components, tokens, and motion — seeshared/ui/AGENTS.mdfor the standard - Maps: MapLibre GL, via
@pherus/ui/map - Motion:
motion(Framer Motion), with a sharedsignatureSpring+ variant set - i18n: inlang / Paraglide JS, message-format plugin, base locale
enwithde/fr/zh - Icons: Hugeicons
www/ the product app
src/routes/ file-based routes — every page is folder/{route.tsx, index.tsx}:
route.tsx is the layout/guard layer (Outlet + any beforeLoad),
index.tsx is the actual page
src/components/ app-specific components, grouped by feature
src/data/ illustrative/placeholder data (no backend yet — see scope.md)
messages/ i18n source of truth (messages/en.json is the base locale)
src/paraglide/ generated i18n runtime — do not hand-edit, regenerated on save
shared/ui/ the @pherus/ui design system (Base UI + Tailwind, CVA + data-slot pattern)
docs/scope/ the living project scope: what's planned, in progress, done
docs/specs/ architecture decisions written by /architect, one per feature
Requires Node ≥24 and Bun ≥1.4.
bun install
bun run dev # starts every workspace's dev server via TurborepoThe app runs at http://localhost:3000. From www/ directly:
cd www
bun run dev # vite dev server
bun run typecheck # tsc --noEmit
bun run lint # eslint
bun run build # production build
bun run deploy # wrangler deploy (Cloudflare Workers)- Routes always come in pairs:
www/src/routes/(public)/<page>/route.tsx+index.tsx, never a flat<page>.tsx.route.tsxis where a future auth gate (beforeLoad) attaches;index.tsxholds the page itself. Nothing butexport const Route = createFileRoute(...)lives at module scope in a route file — page-local state and data go inside the route's component function. - No backend yet. Everything under
src/data/is illustrative, hardcoded placeholder content standing in for a future API (seedocs/scope/scope.md, feature 6: "Data model & backend"). Interactive actions that would need a backend (submitting a resource, saving a post, signing in) render as disabled controls rather than being wired to nothing. - Static UI text is localized, illustrative content is not. Headers,
page titles, section labels, button copy, and empty states go through
messages/en.jsonand are read withm["namespace.key"]()from@/paraglide/messages. Data that stands in for real user/community content — resource descriptions, post bodies, reviews, quotes — stays as plain strings insrc/data/, since that's exactly the kind of content a real backend would serve untranslated-by-us.de/fr/zhcurrently only translate what's been deliberately localized; missing keys fall back to English automatically. Runbun run translate(inwww/) to machine-translate any newly addeden.jsonkeys into the other locales. - Design system first. Before building new UI, check whether
@pherus/uialready has the primitive you need, and followshared/ui/AGENTS.mdfor color tokens, typography, motion, and the public/protected posture system.
We're in active early development. Read the full story in
docs/scope/scope.md, or reach out if you'd like to
help us build it.