Quickstart
From zero to a sealed PDF in under 10 minutes.
1. Sign up
Create an account at /login. The first project is free under the residential ≤ 300 m² rule. Beyond that, the Pro plan starts a 14-day trial — no card required.
2. Pick a template (optional)
From the workflow page, choose residential-200a, commercial-office, industrial-derate, or evse-retrofit. The template seeds service, panels, and a starter load list.
3. Edit anywhere
Service voltage, panel layout, load list, conduit material — change anything. The verdict bar at the top updates instantly: total demand, calculated service amps, voltage drop, conduit fill, LPD verdict, free-tier status.
4. Resolve warnings
Each warning carries a code (e.g. VD_FEEDER_OVER), a list of affectedElementIds, and a suggested fix. Click through to jump to the offending element.
5. Stamp & export
Move the project from UNDER_REVIEW to STAMPED (requires a P.E. / P.Eng on the team). Export the report PDF + single-line PDF.
Core concepts
Five ideas you need to know before reading any other doc.
ProjectState
A single immutable JSON document describing the entire project: meta, service, panels, loads, feeders, equipment, options. Everything else is derived from it.
derive(state)
A pure function. Same state in → same outputs out. No hidden DB calls, no time-dependent behavior. This is what makes EEP auditable.
Rule pack
A code object (NEC_2023_PACK, CEC_2024_PACK) listing every rule the engine evaluates. Each rule has an ID, a citation, and a function.
Element graph
Every element (panel, load, feeder) has a stable ID. The graph tracks parents and dependents so deletion impact is always knowable.
Snapshot
A (projectId, version) tuple in the database holding the full state at that moment. Versions are immutable; restore creates a new version.
NEC / CEC rule packs
Both packs ship in every plan. Switch per project.
NEC 2023 (US)
Articles 210, 215, 220 (incl. T220.42 occupancy variants for hotel / school / hospital), 230, 240, 250, 310 (T310.16 ampacity, derating for ambient + bundling), 408, 430 (motors), 450 (transformers), 625 (EVSE), Chapter 9 T1 (conduit fill).
CEC 2024 (Canada)
Sections 4 (conductors + T2/T4), 6 (services), 8 (loads + 8-200 calculation, 8-202 multi-dwelling, 8-210 commercial), 10 (grounding), 14 (overcurrent), 26 (transformers), 28 (motors), 86 (EVSE).
Provincial flags
CEC mode applies provincial deviations where they exist (Ontario 26-700 service-disconnect amendments, BC 4-006 conductor fill, Quebec rule numbering). Each fired rule includes a citation.
Tour of the workspace
Where you actually do the work. The workspace is a five-pane shell: topbar, stage bar, project tree, canvas tabs, inspector, console, status bar.
Topbar (44 px)
Project crumbs, command palette hint (Ctrl/⌘+P), save pill (auto-save status + revision number), help button, user menu. The standard chip (NEC 2023 / CEC 2024) shows the active rule pack — it locks at project creation and the engine uses it for every derive call.
Stage bar (34 px)
The nine workflow stages — Setup, Loads, Service, Distribution, Branches, Special, Compliance, Documents, Review & Seal. Click a stage to jump to its tab; the colour mirrors console state (green = done, yellow = warnings, red = violations).
Project tree (left pane)
Every node in the design. Single-click to inspect; double-click (or right-click → Open in workspace tab) to open the owning module. F2 renames, Delete deletes, Enter inspects. On touch devices, long-press opens the context menu.
Canvas tabs (centre)
Each tool gets a tab: Single Line Diagram (the design surface), Project Setup, Load Calculation, Service Entrance, Distribution Panels, Branch Circuits, Special Equipment, Compliance, Documents, Review & Seal. Alt+W closes a tab; Alt+./, cycles tabs; Alt+1–9 jumps to a stage tab.
Inspector (right pane)
Properties of the selected node, each tagged with provenance: DEFAULT (engine default), CALC (computed), OVERRIDE (engineer-set), VALIDATED (P.Eng accepted), WARN, or VIOLATION. Override fields show the engine value alongside the override + reason.
Console (bottom)
Three streams: Issues (live engine violations), Activity (every state change with timestamp + actor), Calc trace (the most recent derive() call with rule citations). All three are tab-switchable in the same pane.
Status bar (bottom)
Active rule pack, organisation, density (cycle Compact / Standard / Comfortable), connection state, last save time. Click the rule-pack cell to switch standards on a new project — locked once you start work.
Single Line Diagram canvas
IEEE 315 symbol library, drag-to-place, click-to-wire, live calc overlay, single-page landscape print.
Palette (28 symbols)
Source, transformer, breaker, fused-disconnect, contactor, motor starter, panel, switchboard, MCC, CT, PT, SPD, capacitor, reactor, meter, battery, inverter, PV, UPS, EVSE, VFD, lamp, receptacle, MTS — full IEEE 315 set, filtered per-standard so CEC mode shows CSA-spelling variants where applicable.
Placement & wiring
Drag a symbol from the palette onto the canvas; drop creates an SLD_* node with default position. Click a symbol → click a second symbol to wire them (an SLD_WIRE node is created with L-shaped routing). Right-click a wire to delete or insert a breakpoint.
Live calc overlay
Each symbol carries a ref_node_id link to the real engineering node (a PANEL, MOTOR, FIRE_PUMP, etc.). The wire label mirrors the linked node's current calc result: 200 A, 3#1/0 AL, voltage drop %, conductor temp class — pulled live from derive() output so the SLD never drifts from the calculation.
Auto-layout + print
The toolbar offers Fit (reset zoom + pan), Auto-layout (re-arrange by category Source → Load with a 60s undo banner), and Print (single-page landscape with a CSA/IEEE-style title block: project name, drawing number, date, engineer, revision).
Reports & exports
Eight RPT codes plus EXPORT-ALL. All produced from the same engine state — byte-identical given the same inputs.
| Code | Title | Source |
|---|---|---|
RPT-001 | Load Calculation | derive().demandKva + per-occupancy breakdown |
RPT-002 | Service Entrance | service ampacity + OCP + grounding |
RPT-003 | Distribution & Panel Schedules | per-panel schedules + leg balance |
RPT-004 | Branch & Feeder Sizing | conductor / OCP / VD per circuit |
RPT-005 | Special Equipment | motor / fire-pump / EVSE branches |
RPT-006 | Compliance Summary | warning list with citations (appendix A: full code list) |
RPT-007 | Single Line Diagram | landscape SLD with title block |
RPT-008 | Engineer Seal & Sign-off | checklist + seal block |
EXPORT-ALL | Bundle (ZIP) | all 8 RPTs in one archive |
Generation runs through a BullMQ job queue when Redis is reachable; falls back to inline generation when Redis is down so the row never gets stuck at QUEUED. Status streams back to the workspace via WebSocket; polling fallback is available at GET /api/v1/projects/:id/reports/:rpt/status.
derive(state) — engine surface
The single function the entire app reads from.
import { derive } from '@eep/engine'
const result = derive(projectState)
result.totalConnectedKva // raw connected load
result.demandKva // post-demand-factor
result.calculatedAmps // service ampacity needed
result.feeders // [{ id, conduitSize, conduitFillPct, vdPct, ... }]
result.panelSchedule // [{ panelId, totalConnectedKva, legBalance, ... }]
result.warnings // [{ code, severity, message, affectedElementIds }]
result.firedRuleIds // ['NEC-220.84', 'NEC-T220.42-hotel', ...]
result.freeTier // { eligible: boolean, reason?: string }
result.lpd // { pass, allowance, actual, ratio } | null
The function is exposed as a TypeScript module (@eep/engine) and over HTTP at POST /api/v1/engine/derive.
Warning codes
26 codes. Every code carries severity, message, and the element IDs it touches.
| Code | Severity | Trigger |
|---|---|---|
VD_BRANCH_OVER | error | Branch voltage drop > configured limit |
VD_FEEDER_OVER | error | Feeder voltage drop > configured limit |
AMPACITY_INSUFFICIENT | error | Conductor ampacity < calculated load after derate |
CONDUIT_OVERFILL | error | Conduit fill > 40 % (NEC) / 40 % (CEC) for 4+ wires |
PANEL_BALANCE_OFF | warn | 3φ panel leg imbalance > 10 % |
FREE_TIER_GATE | info | Project exceeds free-tier eligibility |
LPD_OVER | warn | Lighting power density > ASHRAE / NECB allowance |
NEUTRAL_NONLINEAR | warn | > 50 % non-linear load on 3φ feeder — neutral upsize |
ORPHAN_ELEMENT | warn | Element references a deleted parent |
| …and 17 more. The complete warning code list is included as appendix A of any RPT-006 (Compliance) export. | ||
Calc extensions
Targeted modules called from derive() for non-trivial sub-calculations.
conduit-fill.ts
NEC Chapter 9 Table 1. pickConduit(awgList, type) returns trade size + fill %, or flags parallel-runs needed.
lpd.ts
ASHRAE 90.1 / NECB 2017 lighting power density allowances by occupancy. checkLpd(occupancy, m², actualW/m²).
free-tier.ts
Business rule: residential dwellings ≤ 300 m² are free forever; everything else requires a paid plan.
equipment-library.ts
40+ real manufacturer items (Square D, Eaton, Siemens, ABB, Schneider). Filter by manufacturer, kind, amps.
csv-import.ts
CSV / TSV importer with header aliasing and per-row error reporting.
Projects & versions
Optimistic concurrency on (projectId, version). No lost writes, no overwritten teammate edits.
Save
Every save creates a snapshot row. The version column is unique per project; concurrent saves with the same version receive 409 Conflict and must rebase.
Restore
Restoring an older version creates a new version with that content — the older row stays untouched. History is append-only.
Branch
POST /projects/:id/branch?fromVersion=N creates a new project rooted at version N. Use it to explore an alternative without polluting the live design.
Templates
Four built-ins. Point of departure, not point of arrival.
residential-200a— single-family, 200 A service, NEC 2023commercial-office— 480/277 V, panel + lighting + receptacle distributionindustrial-derate— motor-heavy, ambient + bundling derate scenariosevse-retrofit— adding 1–6 EVSE to existing residential service
Status & sealing
DRAFT → UNDER_REVIEW → STAMPED → ARCHIVED.
The status transition UNDER_REVIEW → STAMPED requires a team member with the SEAL role. The actor's name + license number are written into the audit log permanently. STAMPED versions are content-locked; further edits create a new branch.
Free tools — 24 calculators
Standalone in-browser calculators at /free-tools. Each is dual-standard (NEC 2023 + CEC 2024 where applicable). Free Beta account required to view results; viewing the layout is open to everyone.
Cable & Conduit
- Cable size calculator — Conductor sizing per NEC T310.16 / CEC T2 + ampacity correction.
- Voltage drop calculator — 3 % branch / 5 % total — NEC 210.19(A) FPN, CEC Rule 8-102.
- Cable pulling tension — NECA 101 capstan + sidewall pressure + jam ratio.
- Conduit fill — NEC Ch. 9 Table 1 — 40 % / 31 % / 53 % limits with derate.
Load & Demand
- NEC load calculation — Art. 220 standard method + optional method (commercial).
- Demand factor calculator — T220.42 / T220.44 / T220.55 — receptacles, lighting, kitchen.
- Maximum demand — Service-entrance demand under CEC Rule 8-200 / 8-202.
- Panel load schedule — A/B/C phase balance + connected vs demand summary.
- Distribution board — CSA C22.2 No.29 panelboard + main breaker scaffold.
Protection & Fault
- Breaker sizing — 125 % continuous rule + std OCP rounding (NEC 240.6).
- Fault current — Point-to-point ISC at panels, switchboards, MCCs.
- Arc flash estimator — IEEE 1584-2018 Lee + NFPA 70E PPE category.
- Protection coordination — Upstream / downstream selectivity check at fault level.
- Transformer sizing — kVA selection + primary/secondary protection (NEC 450).
Power Quality
- Power factor correction — IEEE 1531 capacitor sizing + utility penalty savings.
- Power unit converter — kW / kVA / HP / BTU live converter, motor efficiency.
Life Safety & Lighting
- Life safety — new design — NFPA 72 + UL 464 + CAN/ULC-S524.
- Life safety — retrofit — NFPA 72 + CAN/ULC-S537 retrofit workflow.
- Lighting design — Lumen method + LPD / ASHRAE 90.1 fixture schedule.
Reference & Drafting
- NEC + CEC code reference — Article / rule lookup with cross-reference switcher.
- Equipment library — Wire / breaker / conduit / transformer preset catalog.
- Single line diagram — IEEE 315 symbol placement + auto-routing preview.
- Place on drawing — Drop symbols onto a drawing background (PNG / JPG / PDF).
- AutoCAD scale converter — Metric ↔ imperial scales + annotative scale picker.
All 24 tools save their inputs locally so you can switch between them without losing context. Each tool's result page links to the full-workspace equivalent for projects that need the audit trail + report export.
Auth
Bearer JWT. Tokens issued at POST /auth/login, refreshed at POST /auth/refresh.
curl -X POST https://api.ee-platform.com/api/v1/auth/login \
-H 'Content-Type: application/json' \
-d '{"email":"jane@firm.com","password":"…"}'
# response: { "accessToken": "eyJ…", "refreshToken": "eyJ…" }
Enterprise plans support SAML / OIDC SSO with custom IdP. Contact sales@ee-platform.com.
REST endpoints (selected)
~25 endpoints total. The most-used are listed here; the rest live behind your dashboard's API explorer.
| Verb | Path | Purpose |
|---|---|---|
| POST | /projects | Create project (optionally from template) |
| GET | /projects | List your projects |
| GET | /projects/:id | Latest version of a project |
| POST | /projects/:id/snapshots | Save a new version (optimistic on version) |
| POST | /projects/:id/restore | Restore an older version as a new version |
| POST | /projects/:id/branch | Fork into a new project |
| PATCH | /projects/:id/status | Move DRAFT → UNDER_REVIEW → STAMPED |
| POST | /projects/:id/elements/:eid/force-delete | Delete element with reason + impact log |
| GET | /projects/:id/changes?since=N | Poll for teammate edits |
| GET | /projects/:id/audit | Immutable audit log |
| POST | /engine/derive | Run derive() on a state without persisting |
| POST | /loads/import | CSV / TSV bulk import |
| GET | /equipment | Search the equipment library |
| POST | /public/contact | Public contact form (no auth) |
Webhooks
Pro plan and above. POST your endpoint when events fire.
Configure at /settings/webhooks. Events: project.saved, project.stamped, project.warning_added, project.element_deleted. Payload includes project ID, version, actor email, and a HMAC-SHA256 signature in the X-EEP-Signature header.
Plans & entitlements
Public Beta — every authenticated user gets every feature for free until launch. The plan structure below is what activates at GA.
| Plan | Includes | Limits |
|---|---|---|
FREE |
Quick calculations, 14 free calculators, single project ≤ 300 m² residential | 1 project · No PDF export · No team sharing |
INDEPENDENT_ENGINEER |
Full workspace v4, Load Analysis, SLD edit, Reports (RPT-001..008), Equipment Library, P.E. seal block | Unlimited projects · 1 user · 14-day trial |
SMALL_TEAM |
+ Team workspace, role hierarchy (FREE / ENGINEER / SEAL / ADMIN), shared templates, branch / merge | Up to 5 users · 14-day trial |
PROFESSIONAL |
+ Lighting Design, Life Safety / Retrofit, harmonic analysis, arc-flash labels, stamped PDF export, custom branding | Up to 25 users |
CONTRACTOR |
+ Contractor Desk (RFI / CCN / field notes), Contractor Toolbox (11 field calcs), takeoff CSV import | Up to 50 users |
GC_DESK |
+ Multi-firm review surface, plan-review hand-off package, document repository | Up to 100 users |
COMPANY_ENTERPRISE |
+ Admin Console, audit export, custom entitlements, SSO (SAML / OIDC), MFA enforcement, white-label, billing portal, sales contact | Unlimited users · Custom contract |
Super-admin role (set via the backend SUPER_ADMIN_EMAILS env var) bypasses every plan gate regardless of subscription state. Use it for platform administration only — every super-admin action lands in the audit log.
Beta entitlement override (EEP_BETA_FREE_OVERRIDE = true) is currently active; flipping it to false in env.js activates plan-aware paywalls site-wide without further code changes.
Deployment
Hosted SaaS or self-host on Railway + Supabase + Cloudflare Pages. (Enterprise.)
Hosted
Default. Backend on Railway, database on Supabase (Postgres 15), static frontend on Cloudflare Pages. SOC 2 Type I in progress; backups every 6 h, point-in-time recovery to 7 days.
Self-host (Enterprise)
Provided as a Docker Compose bundle: backend (NestJS), Postgres 15, Redis (optional, for Bull queues). Migration: pnpm prisma migrate deploy. See RUNBOOK.md in your customer share.
Runbook (operations)
For DevOps. The bare minimum to keep EEP healthy.
Health
GET /healthz returns 200 ok if the API is up; GET /readyz additionally pings the DB. Wire both into your uptime monitor.
Migrations
Always backwards-compatible inside a single major. Run pnpm prisma migrate deploy on release; never migrate reset against production.
Backups
Hosted: daily logical (pg_dump) + WAL streaming. Self-host: configure your own; do not skip this.
Incident
Status page: status.ee-platform.com. Sev-1 hotline (Enterprise): in your contract.
Security
Light on theatre, heavy on the basics.
- TLS 1.2+ everywhere; HSTS on the marketing + app domains
- Argon2id password hashing; 30-min access JWTs, 14-day refresh
- Rate limit on
/auth/*and/public/*viahelmet+ custom guard - Tenant isolation on every Prisma query (global guard)
- SOC 2 Type I in progress; full report at /security
- Disclosure: security@ee-platform.com