Getting Started
Set up Software Multitool locally in under 10 minutes.
Prerequisites
Before you begin, make sure you have:
- Node.js 22+ (or use nvm with the repo's
.nvmrc) - pnpm (
npm install -g pnpm) - Docker (with the daemon running) — required for the local PostgreSQL container managed by Docker Compose
Install dependencies
pnpm installLocal evaluation (fastest path)
This path boots the app locally without connecting any external providers. Authentication, the dashboard shell, and the AI tools all work via the local PostgreSQL container and seeded test credentials.
1. Run setup
pnpm run setupThis command will:
- Check prerequisites (Docker, pnpm) and give guided recovery output if anything is missing
- Start the local PostgreSQL container via Docker Compose (port 54322)
- Apply Prisma migrations and seed the database with a preview user
- Create
apps/web/.env.localfrom the example file if it does not exist - Auto-populate the boot-critical environment variables so you do not need to hunt for values
2. Start the app
pnpm devThe app will be available at http://localhost:3500.
3. Sign in with the preview user
| Field | Value |
|---|---|
test@preview.local | |
| Password | TestPassword123 |
4. Run the smoke check (optional)
For a repeatable, automated proof that the local path is working:
pnpm local-eval:smokeThis reruns setup, verifies the seeded user exists in Postgres, starts the app, and checks that both / and /auth/login respond as expected.
Environment variables
After running setup, apps/web/.env.local will contain the boot-critical local defaults. The following additional variables unlock provider-gated features:
Authentication
| Variable | Purpose |
|---|---|
GITHUB_CLIENT_ID / GITHUB_CLIENT_SECRET | GitHub OAuth sign-in |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | Google OAuth sign-in |
Set exactly one of these sets to enable transactional email:
| Provider | Variables |
|---|---|
| Resend | RESEND_API_KEY |
| Postmark | POSTMARK_API_KEY |
| Plunk | PLUNK_API_KEY |
| Mailgun | MAILGUN_API_KEY, MAILGUN_DOMAIN |
| SMTP/Nodemailer | SMTP_HOST, SMTP_PORT, SMTP_USER, SMTP_PASSWORD |
Payments
Set one of these to enable billing, subscriptions, and credit purchases:
| Provider | Variables |
|---|---|
| Stripe | STRIPE_SECRET_KEY, STRIPE_WEBHOOK_SECRET |
| Creem | CREEM_API_KEY, CREEM_WEBHOOK_SECRET |
| Polar | POLAR_ACCESS_TOKEN, POLAR_WEBHOOK_SECRET |
| DodoPay | DODOPAYMENTS_API_KEY, DODOPAYMENTS_WEBHOOK_KEY |
File storage
| Provider | Variables |
|---|---|
| AWS S3 (or any S3-compatible service) | S3_ACCESS_KEY_ID, S3_SECRET_ACCESS_KEY, S3_ENDPOINT, S3_REGION |
AI tools
| Variable | Purpose |
|---|---|
OPENAI_API_KEY | News Analyzer, Invoice Processor, Contract Analyzer, and other LLM-backed tools |
ASSEMBLYAI_API_KEY | Speaker Separation |
REPLICATE_API_TOKEN | Background Remover |
Analytics
| Provider | Variables |
|---|---|
| PostHog | NEXT_PUBLIC_POSTHOG_KEY, NEXT_PUBLIC_POSTHOG_HOST |
| Umami | NEXT_PUBLIC_UMAMI_WEBSITE_ID, NEXT_PUBLIC_UMAMI_SRC |
| Plausible | NEXT_PUBLIC_PLAUSIBLE_DOMAIN |
| Pirsch | NEXT_PUBLIC_PIRSCH_ID |
| Google Analytics | NEXT_PUBLIC_GA_ID |
Monitoring
| Provider | Variables |
|---|---|
| Sentry | NEXT_PUBLIC_SENTRY_DSN, SENTRY_AUTH_TOKEN |
Full integrated setup (Vercel + external providers)
For a fully wired environment with real auth, email, payments, and storage:
- Create a Vercel project and link it to your repository.
- Provision a Neon Postgres database (or any managed Postgres provider) and add
DATABASE_URLandDATABASE_URL_UNPOOLEDto your Vercel environment variables. - Add the provider variables listed above to Vercel (Settings → Environment Variables).
- Push to your branch — Vercel will build and deploy automatically.
- Run
pnpm --filter @repo/database migrateafter each schema change to keep the database in sync.
Parallel development with worktrees
If you work across multiple features in parallel, the repo includes worktree helpers:
# Create a new worktree for a feature branch
pnpm worktree:create
# Resume an existing worktree
pnpm worktree:resume
# List all active worktrees
pnpm worktree:list
# Remove a worktree when done
pnpm worktree:removeEach worktree gets its own .env.local and a unique dev-server port so branches do not interfere with each other. The PostgreSQL container is shared across worktrees on port 54322.