No description
  • TypeScript 89.5%
  • CSS 4.3%
  • JavaScript 3.9%
  • PLpgSQL 2.3%
Find a file
2026-06-09 07:26:54 -05:00
apps Polish onboarding experience 2026-06-09 07:26:54 -05:00
docs Update project documentation 2026-06-09 06:58:17 -05:00
packages Add operator onboarding milestones and Playwright smoke tests 2026-06-08 14:13:57 -05:00
scripts Seed e2e operator smoke data and refresh onboarding 2026-06-08 14:36:52 -05:00
tests/e2e Seed e2e operator smoke data and refresh onboarding 2026-06-08 14:36:52 -05:00
.env.example Add hosted payment links and webhooks 2026-05-29 21:24:47 -05:00
.gitignore Add operator onboarding milestones and Playwright smoke tests 2026-06-08 14:13:57 -05:00
.node-version Pin Node 24 LTS runtime 2026-06-08 18:48:50 -05:00
.nvmrc Pin Node 24 LTS runtime 2026-06-08 18:48:50 -05:00
design.md Update project documentation 2026-06-09 06:58:17 -05:00
docker-compose.yml Add monorepo workspace foundation 2026-05-26 15:53:10 -05:00
logo.svg Revert "Sharpen DuctOS logo mark" 2026-05-30 07:26:18 -05:00
package-lock.json Adopt HeroUI Tailwind foundation 2026-06-08 22:02:30 -05:00
package.json Pin Node 24 LTS runtime 2026-06-08 18:48:50 -05:00
playwright.config.ts Seed e2e operator smoke data and refresh onboarding 2026-06-08 14:36:52 -05:00
README.md Update project documentation 2026-06-09 06:58:17 -05:00
tsconfig.base.json Add monorepo workspace foundation 2026-05-26 15:53:10 -05:00

DuctOS logo

🛠️ DuctOS

DuctOS is an all-in-one field service management ERP for HVAC and geothermal contractors. It covers tenant onboarding, CRM, equipment lifecycle, schedule/dispatch, field mobile work, invoices, payments, inventory, job costing, integrations, and DuctOS operator administration.

📚 Documentation

🧭 Current Product Surfaces

Surface Entry points Purpose
Public SaaS site /, /start, /help, /status Product overview, private trial tenant creation, public help, and public system status.
Tenant office app /dashboard, /customers, /equipment, /schedule, /dispatch, /jobs, /invoices, /inventory, /job-costing, /integrations, /users, /technicians Day-to-day HVAC operations.
Field mobile app apps/mobile/App.tsx via Expo Technician schedule, job execution, offline queue, photos, signatures, materials, timecards, and location heartbeat.
Operator admin /operator/login, /operator, /operator/users, /operator/tenants/:id DuctOS internal tenant, billing, support, KB, status, feature flag, access grant, usage, and audit control plane.
API /api/v1/* Tenant-aware and operator command/read APIs.
Database packages/db/migrations PostgreSQL/PostGIS schema, RLS, seeds, and operational tables.

🧱 Repository Layout

apps/api        NestJS API
apps/web        Next.js public site, tenant office app, and operator console
apps/mobile     Expo/React Native field app
packages/shared Shared TypeScript contracts
packages/db     SQL migrations and migration runner
docs            Workflow docs, technical spec, and development plan

🎨 Design And UI Stack

The active product design contract lives in design.md. DuctOS uses a dense, utilitarian operational UI for HVAC and geothermal teams, not a marketing-style app shell.

  • Web: Next.js 16, React 19, HeroUI v3, and Tailwind v4.
  • Shared web primitives: HeroUI-backed controls, Tailwind utility classes, and the app shell styles in apps/web/app/globals.css.
  • Mobile: Expo 52 and React Native 0.76 for the technician field app.
  • Theme support: light and dark mode through the repo CSS variables and data-theme.

🚀 Local Setup

Prerequisites:

  • Node.js 24.16.0; .nvmrc and .node-version pin the same runtime.
  • npm 11.13.x.
  • Docker with Docker Compose for PostgreSQL and Redis.
nvm use
npm install
cp .env.example .env
npm run dev

npm run dev starts PostgreSQL and Redis with Docker Compose, runs database migrations, and then starts the API on port 3001 and the web app on port 3000.

Local URLs:

Mobile app:

npm run dev:mobile

npm run dev:mobile starts Expo Metro from apps/mobile. Platform-specific Expo launch commands are available through the mobile workspace: npm --workspace @ductos/mobile run ios, npm --workspace @ductos/mobile run android, and npm --workspace @ductos/mobile run web.

Current Workflow Coverage

🧪 Verification

npm run typecheck
npm run build
npm test
npm run test:e2e

Browser checks use Playwright. Install the local Chromium runtime with:

npm run playwright:install

On Ubuntu 26.04, the install script uses Playwright's Ubuntu 24.04 x64 fallback browser build until Playwright ships a native Ubuntu 26.04 target.

Playwright smoke tests target a running local app at E2E_BASE_URL or http://127.0.0.1:3000. The suite seeds deterministic operator and tenant demo data through npm run e2e:seed; override E2E_API_URL, E2E_OPERATOR_EMAIL, or E2E_OPERATOR_PASSWORD when pointing at a different local stack.

The workflow docs describe implemented entry points and expected outcomes. Roadmap-only modules remain in the development plan until they have concrete app/API surfaces.