Projects · Platform
Clarbon

Clarbon calculates greenhouse-gas inventories for more than one company on one system, and keeps the working. The engine is a pure package. The database isolates tenants with row-level security. Evidence goes to object storage that can be locked. Reports are a separate package from the ledger.
Solutions
A deterministic inventory
The engine covers Scope 1, 2 and 3, product footprints, CBAM, PCAF and SBTi, and can recalculate with the AR4, AR5 or AR6 global-warming-potential sets. The same activity is not silently given a new answer because a factor moved.
Factors with a source
DEFRA, IEA, EPA and EXIOBASE sit in a registry, with Climatiq pinned to a known release. A number on a report can be traced to the factor that produced it.
The disclosure is not the ledger
ESRS, IFRS S2, TSRS and CDP are mappings on top of the inventory. Disclosure packs, CSV and spreadsheet output, and an iXBRL stub, are generated from that mapping rather than typed beside it.
Evidence that stays put
Supporting files go to S3-compatible storage with a write-once option. The point of the file is that a later run can still open the document the number came from.
Process
01
Name the tenant on the request
Every call carries the tenant, the user and the role. The API refuses to guess which company a row belongs to.
02
Set the database context
The data package applies the tenant with SET LOCAL and row-level policies. A query from one company does not read another company’s inventory. An enterprise tenant can move to its own schema.
03
Run the engine
The API and the worker both call the same versioned engine. A recalculation is a function of the activity, the factor and the GWP set, not of whichever process happened to run it.
04
Map, then publish
Framework mappings turn the inventory into the disclosure a regulator or a customer asked for. The reporting package writes the pack. The ledger is left alone.
Technology
Three apps, the logic in packages
Next.js for the web, Fastify for the API, and a worker for the long jobs. The engine, the schema, the factors, the frameworks, reporting, integrations, translations and the UI contracts are packages, so the web app is not where the methodology lives.
PostgreSQL 17, with vectors and policies
Drizzle models the schema and the row-level policies. pgvector is there for matching a messy activity description to a factor. Redis sits beside the database for cache and queues.
Eight languages, one glossary
The i18n package carries eight locales, the official terms, and right-to-left layout. A disclosure term is not translated ad hoc inside a component.
Connectors are a first wave, not a promise of every ERP
The integrations package starts with ERP, utility and cloud sources. Anything not in that wave is not implied.
- Next.js
- Fastify
- TypeScript
- PostgreSQL 17
- Drizzle
- pgvector
- Redis
- MinIO