ARCHITECTURE / CLEAR BOUNDARIES

A modular monolith. An independent core.

The product is one application with reusable packages. Pricing has a small boundary; persistence, authorization and integrations live around it.

Customer answersVisual builderREST API / SDK
Application boundaryTenant-scoped services

Permissions · revisions · transactions

01SchemaValidated portable data
02EngineDeterministic calculations
03PostgreSQLRetained quotes + outbox
Branded results & PDFsWorker → SMTP / webhooks
Schema and Engine can run independently. The website needs none of the application infrastructure.

The portable core.

Schema validates estimator documents and references. Engine evaluates definitions and answers with exact monetary arithmetic. Neither needs the web application, database or authentication.

The SDK provides server-side HTTP access and a local calculation facade. It consumes the API and public packages; it does not reach into dashboard state.

Read the architecture reference

The application.

Next.js handles UI, HTTP and verified sessions. Tenant-scoped services enforce membership, roles and ownership inside PostgreSQL transactions. Organization IDs select resources; they are not credentials.

Customer sessions pin a published revision. Estimates retain answers and results. Audit entries and outbox records commit with writes; a separate PostgreSQL-backed worker delivers webhooks and SMTP.

Entities and lifecycles

Snapshots keep
history honest.

Saving a draft does not change a live estimator. Publishing creates an immutable configuration snapshot. A customer’s in-progress session keeps the revision it opened.

Historical displays and PDFs use retained results. Reproducing arithmetic across engine upgrades also requires archiving the corresponding implementation.

Reproducibility and money semantics

Decisions are
part of the interface.

Why PostgreSQL? Why an integer money representation? Why a controlled formula AST? Nineteen decision records describe the context, chosen approach, alternatives and consequences.

Read the ADRs

OPEN SOURCE / OPEN POSSIBILITIES

Pricing logic
should belong to you.