* refactor(web): dedupe funnel form options across the 3 forms `skills`, `chatService` and `country` were byte-identical in all three form definitions. They move to `packages/funnel/src/form-options.ts` and reach the pages through `AFFORM_OPTIONS`; the form files now describe rendering only. Lists verified ordered-identical to the originals, entry for entry. Closes #140 * refactor(civi-crm): derive notion id/label maps from shared funnel options `SKILLS_MAP`, `CHAT_SERVICE_MAP` and `COUNTRY_MAP` were a fourth copy of the funnel option lists. They are now `toLabelMap()` over the shared arrays, the way `HEAR_ABOUT_MAP` already was, so an id cannot mean one thing in the dropdown and another in Notion. All 275 derived entries verified identical to the previous literals, so the Notion and n8n writes are unchanged. The one exception is country 1054, normalised to `Côte d'Ivoire` -- the spelling Notion already stored and the one the other apostrophised country names use. The dropdown label and the Ghost member note now match it.
logos-co
pnpm + Turborepo monorepo for the Logos website and its content CMS.
apps/web— public Next.js 16 site (Tailwind v4,next-intl, static export)apps/cms— Payload CMS 3.x admin (Postgres-backed; edits ship as GitHub PRs)packages/content— content schemas, loaders forcontent/**, GitHub mutation helperspackages/ui— shared React primitives and SVG icons (<LogosMark />, etc.)packages/tokens— design tokenspackages/types— shared types incl. Payload-generatedpackages/config— shared ESLint / TypeScript / Prettier configcontent/**— production source of truth (pages, press, circles, builders-hub, site)
Apps are entrypoints only. Shared logic lives in packages. The web app reads content/** at build time and never calls GitHub at request time.
Requirements
Node 24, pnpm 11.1.0.
Quick start
pnpm install
pnpm dev # web → http://localhost:3000, cms → http://localhost:3001
Payload Admin: http://localhost:3001/admin.
apps/cms requires PAYLOAD_SECRET and DATABASE_URL (Postgres). Copy apps/cms/.env.example to apps/cms/.env and fill it in. See docs/deployment.md for the full env matrix.
Workspace package builds
Apps consume internal packages (@acid-info/logos-ui, @acid-info/logos-content, etc.) through their compiled dist/ outputs declared in each package's exports map. Turborepo's dev task declares dependsOn: ["^build"], so pnpm dev builds upstream packages before starting the app servers.
If a dist/ directory goes missing (e.g. after git clean -fdx or manually removing node_modules) and an app is started directly without going through pnpm dev, you may see errors like:
Module not found: Can't resolve '@acid-info/logos-ui/client'
Rebuild the affected workspace package to fix it:
pnpm --filter @acid-info/logos-ui build
Or run pnpm build once at the repo root to compile every package.
Common scripts
pnpm build # web static export + cms build
pnpm test # vitest (apps/web)
pnpm lint # eslint --max-warnings 0
pnpm check-types # next typegen + tsc --noEmit
pnpm generate-types # regenerate packages/types/src/payload.ts from Payload schema
Branch model
develop— default branch + staging. CMS-generated content PRs target thismaster— production (created when production deploys spin up)
Direct pushes to either are blocked by branch protection.
Documentation
- AGENTS.md — conventions and rules for AI agents working in this repo
- docs/deployment.md — env vars, Vercel dev/staging, self-hosted production
- docs/cms-github-content-plan.md — schema + GitHub workflow design
- docs/web-pages.md — per-page web requirements (Figma references)
- docs/components.md — shared component specs
- docs/seo.md — SEO and metadata expectations
- docs/code-quality-followups.md — known gaps awaiting decisions