6.1 KiB
New Project Onboarding
Purpose
This guide is the local quick-start entrypoint for starting a new project from the boilerplate. It focuses on the current repository state: root scripts start the @toolctrl/web React Router runtime whose source lives in apps/web/app, while apps/api and apps/worker are extracted foundations for API and worker evolution. apps/api is a runtime-wired Hono API app with a canonical /v1 surface, and apps/worker is opt-in through worker environment flags.
Start with docs/quickstart.md for first-run bootstrap, then use docs/local-dev.md for day-to-day local development, service dependencies, verification, and troubleshooting.
Use this document for local setup and static verification. Browser, Playwright, Cypress, and other E2E checks are manual unless a focused run is explicitly approved.
Prerequisites
Install or provide these local dependencies before running the project:
- Node.js compatible with the repository
.nvmrcwhen present. - Corepack for the pinned package manager.
pnpm@10.33.0through Corepack.- PostgreSQL for the Prisma-backed application database.
- Optional Redis only when running the BullMQ worker foundation.
Enable the pinned package manager:
corepack enable
corepack prepare pnpm@10.33.0 --activate
Install Dependencies
Install the workspace dependencies from the repository root:
pnpm install
Root scripts start the active @toolctrl/web React Router runtime from apps/web/app. Workspace packages such as @toolctrl/db, @toolctrl/mail, and @toolctrl/queue describe current or target boundaries, but they do not replace the web runtime for local development.
Environment Setup
Create a local environment file from the example:
cp .env.example .env
Set placeholder values for local development. Do not copy production secrets into .env.
Required local variables:
APP_NAME: local display name for the app.SESSION_SECRET: placeholder-only local session secret.CRYPTO_SECRET: placeholder-only local encryption secret.DATABASE_URL: PostgreSQL connection string used by Prisma.APP_BASE_DOMAIN,WEB_APP_HOST,ADMIN_APP_HOST,API_HOST, andAPP_PROTOCOL: split-host routing settings from.env.example.PORT/API_PORT: listener bind ports only; keep the example defaults unless you need a custom local port.
Transactional mail is represented by the Mailjet boundary. Keep any Mailjet API keys or webhook signing secrets as placeholder-only local values unless you are deliberately testing mail delivery with a non-production account.
PostgreSQL and Prisma Setup
Start a local PostgreSQL database, then point DATABASE_URL at that database. The active database stack is PostgreSQL through Prisma. The Prisma schema and migrations still live under prisma/, while packages/db owns the server-side Prisma client boundary and database command surface.
Apply the schema with Prisma:
pnpm exec prisma migrate dev
If you need a schema push during local bootstrap, use:
pnpm exec prisma db push
Use DIRECT_URL only when you intentionally need a direct database connection for Prisma operations. Keep both DATABASE_URL and DIRECT_URL as placeholders in documentation and local examples.
Seed and Run the Web App
Seed the local database when needed:
pnpm seed
pnpm run permissions:sync
Start the active @toolctrl/web React Router runtime from the root script:
pnpm dev
Open http://app.localhost:3000 for the tenant app and http://admin.localhost:3000 for admin. The root pnpm dev command starts only the @toolctrl/web runtime; when API work is in scope, run pnpm --filter @toolctrl/api dev separately and open http://api.localhost:3001. Seeded demo tenants and users are created only when SEED_DEMO_DATA=true is set for a disposable local database; those accounts must not be reused as production credentials.
Optional Worker Redis
Redis is not required for the default web quick start. Enable worker execution only when you are working on queue-backed behavior:
- Set
WORKER_ENABLED=true. - Set
BULLMQ_REDIS_URLto a local Redis connection placeholder. - Set
WORKER_QUEUE_GROUPto the queue group you are testing, such asgeneral,mail, orplugin. - Use
REDIS_URLonly as a platform-binding fallback when that is the environment contract being tested.
apps/worker exits unless WORKER_ENABLED=true. It now contains active BullMQ processors for optional background surfaces, including general maintenance/notification/outbox work, mail-bound jobs, and the isolated plugin invocation queue. Some feature-specific processors remain behind their own environment gates, so do not treat Redis as mandatory for every new project user.
Static Verification Commands
Run scoped non-E2E checks before handing off local setup changes:
test -s docs/new-project.md
grep -Eq "Corepack|pnpm@10\.33\.0|DATABASE_URL|PostgreSQL|Prisma|WORKER_ENABLED|BULLMQ_REDIS_URL|manual" docs/new-project.md
pnpm run verify:ci-baseline
pnpm run verify:gitea-ci-workflow
Use focused lint or test commands for files you changed. Full browser and E2E suites are not part of Auto-Mode task verification unless explicitly approved for that exact run.
Manual Checks
After the static checks pass, use manual checks only for human-facing confidence:
- Confirm
.envcontains only local placeholders and no real deployment secrets. - Confirm PostgreSQL is reachable through
DATABASE_URL. - Confirm Prisma migration or push completed successfully.
- Confirm
pnpm seedcreated local development data andpnpm run permissions:syncaligned static roles and permissions. - Confirm
pnpm devstarts the@toolctrl/webReact Router runtime inapps/web/appand serves the configured app/admin hosts. - If worker work is in scope, confirm Redis is running and the worker is started with
WORKER_ENABLED=trueandBULLMQ_REDIS_URLset.
Keep Playwright, Cypress, browser automation, and other E2E execution manual by default. Record the scenario and result in handoff notes instead of adding automatic E2E runs to local onboarding.