You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A full-stack SaaS job management platform built for trade businesses — plumbers, electricians, HVAC technicians, and handymen. Manage jobs, clients, quotes, invoices, team members, recurring jobs, expenses, and more, all in one place.
👥 Client Management — Full CRM with contact info, address, notes, and job history
💼 Job Management — Create and track jobs through their full lifecycle (Draft → Quoted → Active → Completed → Invoiced)
📋 Line Items — Detailed cost breakdown per job with categories: Labour, Materials, Equipment, Subcontractor, Other
📄 Quotes — Generate branded PDF quotes, send via email, track acceptance
💵 Invoices — Create invoices from jobs, send via email, mark paid, track overdue
📊 Dashboard — Live summary of active jobs, revenue, outstanding invoices, and recent activity
Business
🔁 Recurring Jobs — Schedule repeating jobs (daily / weekly / monthly / yearly)
🧑🤝🧑 Team Members — Add staff with roles, assign to jobs
📅 Appointments — Schedule and track appointments linked to jobs and clients
💸 Expenses — Track job-level expenses with categories and receipts
✅ Checklists — Attach task checklists to jobs
📎 Attachments — Upload and attach files to jobs
AI (powered by Google Gemini)
✨ AI Line-Item Suggestions — Describe a job in plain English; the AI suggests appropriate line items with quantities and prices, drawing on the contractor's past job history
✨ AI Client Autofill — Paste a contact description and the AI extracts name, email, phone, address, and notes
✨ AI Job Autofill — Describe a job in plain English and the AI fills in the title, description, and dates
Integrations & Admin
💳 Stripe Billing — Subscription plans (Starter / Professional / Business) with 14-day free trial, customer portal
📧 SMTP Email — Configurable outgoing email for quotes, invoices, and test emails
🔗 QuickBooks & Xero — OAuth integration for accounting exports
📣 Ad Platforms — Google Ads and Meta Ads connections
🛠️ Admin Panel — Manage users, plans, all credentials, and app-wide settings
Technical
🔢 Automatic Numbering — Sequential quote (QT0001) and invoice (INV0001) numbers per user
💱 Precise Currency — All monetary values stored as integer pence/cents to avoid floating-point errors
🧮 Margin Tracking — Automatic profit margin calculation on jobs and line items
📑 PDF Generation — Server-side PDFs for quotes and invoices using PDFKit
# View logs
docker compose logs -f app
# Check container status
docker compose ps
# Stop
docker compose down
# Stop and wipe database
docker compose down -v
Local Development
Backend
# Install dependencies
npm install
# Copy and edit environment variables
cp .env.example .env
# Start with hot reload (requires a running Postgres instance)
npm run dev
Frontend
cd frontend
npm install
npm run dev # Vite dev server on http://localhost:5173
The Vite dev server proxies /api to http://localhost:8080 automatically.
Build
# Backend
npm run build # tsc → dist/# Frontendcd frontend
npm run build # Vite → frontend/dist/
Lint
npm run lint # Backend ESLintcd frontend && npm run lint # Frontend ESLint
Environment Variables
Required
Variable
Description
DB_HOST
Postgres host
DB_PORT
Postgres port (default 5432)
DB_NAME
Database name
DB_USER
Database user
DB_PASSWORD
Database password
JWT_SECRET
Secret for signing JWTs
JWT_EXPIRES_IN
Access token TTL (e.g. 1h)
REFRESH_TOKEN_EXPIRES_IN_DAYS
Refresh token TTL in days
Optional
Variable
Description
PORT
HTTP port (default 8080)
APP_URL
Public app URL, used in email links
CORS_ORIGINS
Comma-separated allowed CORS origins
GEMINI_API_KEY
Google Gemini API key (enables AI features)
GEMINI_MODEL
Gemini model to use (default gemini-2.0-flash)
STRIPE_API_KEY
Stripe secret key
STRIPE_WEBHOOK_SECRET
Stripe webhook signing secret
All optional credentials can also be set via the Admin → Settings panel in the UI, which stores them in the database and takes precedence over environment variables.
AI Features
AI features are powered by Google Gemini via the @google/genai SDK.