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 Supabase instance
- A Supabase CLI install is optional — the repo will fall back to a pinned
pnpm dlx supabaseinvocation if one is not found globally
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 local Supabase 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 a local Supabase instance (or use your globally installed CLI)
- Reset and seed the local 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 | AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, S3_BUCKET_NAME |
| Supabase Storage | Uses the existing Supabase variables |
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.
- Create a Supabase project and copy the project URL and anon key into 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 db:migrateafter each schema change to keep Supabase 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 Supabase instance so branches do not interfere with each other. A global Supabase CLI install is optional here too — the same repo-owned fallback applies.