Monorepo for the okay.vote web app, API, shared contracts, and shared test helpers.
okay.vote is the plaintext "shadow" for sealed.vote, a cryptographically secure voting system. It keeps the core 1-10 score voting flow in a simpler, non-encrypted form.
The sealed.vote repository is Tenemo/sealed-vote. You can find more information on how it works, and how it mathematically guarantees vote privacy, in that repository.
apps/webcontains the React frontend.apps/apicontains the Fastify API.packages/contractscontains the shared TypeBox schemas and exported TypeScript types.packages/testkitcontains shared API test helpers used by route and integration tests.
- Frontend: TypeScript, React, Redux Toolkit, Tailwind CSS v4, shadcn/ui, Vite, Vitest
- Backend: TypeScript, Fastify, Drizzle ORM, PostgreSQL, Vitest
- Tooling: pnpm workspaces, Turborepo, Playwright, ESLint
- Node.js
24.14.1or newer pnpm@10.33.0- Docker Desktop or another Docker engine with Compose support
From the repository root:
pnpm install
pnpm local:reset
pnpm devThe default local setup serves:
- the web app at
http://127.0.0.1:3000 - the API at
http://127.0.0.1:4000 - PostgreSQL on
localhost:5433
- apps/api/README.md for API workspace usage and runtime configuration
- apps/web/README.md for frontend workspace usage and deploy notes
- docs/endpoints.md for endpoint behavior and response expectations
- docs/operations.md for local reset, verification, CI, and deployment workflows
Run the shared checks from the repository root:
pnpm install --frozen-lockfile
pnpm prebuild
pnpm e2eTo generate local coverage reports without any third-party service:
pnpm coverageThis writes coverage output to apps/api/coverage and apps/web/coverage.
The GitHub coverage workflow uses those same in-repo reports, publishes them as the coverage-reports artifact, and writes a summary on the workflow page.
- Railway uses the repository root
railway.toml. The build runs from the monorepo root, deploys@okay-vote/api, runs the built migration script withpnpm --filter @okay-vote/api db:migrate:distbefore startup, and checks/api/health-check. - Netlify uses the repository root
netlify.tomlfor the build command, publish directory, API proxy, and SPA rewrite rule. - CI publishes a deployable API artifact through
.github/workflows/api-artifact.ymlwhen API-facing files change. .github/workflows/production-smoke.ymluses Railway-triggered GitHub deployment statuses to run live production smoke checks againsthttps://api.okay.voteandhttps://okay.vote.
This project is licensed under the GNU Affero General Public License v3.0 only. See LICENSE for the full text.