How I ship
See exactly how your software gets built.
Every Pareto Ledger build runs on the same delivery system. This page documents it: how a change moves from my keyboard to a live system you can watch, what protects your data along the way, and why you own the important parts from day one.
It is written in plain language, because you should not need an engineering background to evaluate the person building your system. The bounded “under the hood” notes carry the engineering detail; skip them freely, or hand them to your technical advisor. Everything here is documented from a live engagement in a regulated industry, with the client’s specifics removed.
The one rule
Machines gate every release. People don’t have to remember anything.
The pipeline gates the deploy, not the push.
Every change I write goes through an automated gauntlet before it can reach any environment you see: the code is checked for errors, the full test suite runs, and the database changes are rehearsed from scratch on a disposable copy. If anything fails, nothing happens. The shared system simply keeps running the last good version.
Most software problems in small engagements come from human memory: someone deployed work that was never saved properly, forgot to deploy at all, or pushed a change straight to the live system to save time. Here there is no path to a shared environment that skips the checks, so those failure modes are gone. Every version that runs maps to exactly one recorded change, and there is never a question of what is actually live.
The second rule follows from the first: the safety lives in the setup, so it does not depend on anyone being careful. The checks stop broken code, automated hooks stop credentials from entering the code, and the database is rebuilt from its recorded history on every change, so it cannot drift.
Under the hood
- Trunk-based development: anyone may push to
mainanytime, but nothing reaches a shared environment without a green check suite. No branch protection rules; the deploy gate supplies the safety, and pull requests stay voluntary on high-risk areas like the order state machine and payments. - Deploys are driven by CI, not the host’s git webhooks. The platform’s native integration would deploy in parallel with the checks; a workflow-driven deploy makes passing tests a hard precondition and lets migrations sequence strictly before the deploy.
- Staging deploys serialize; per-branch preview deploys cancel superseded runs.
What this means for you
You can watch the work as it happens.
- About three minutes after a change passes its checks, it is running on a password-protected staging site you can open any day of the week.
- Weekly demos run on the same system, built the same way, as what will eventually go live. There is no separate “demo version” that behaves better than the real one.
- Every running version corresponds to exactly one recorded change with its full history. When you ask “when did this behavior change?”, there is a precise answer.
- An automated probe checks the live staging system every 15 minutes and emails me if anything is wrong, usually before anyone else notices.
The environments
Four rungs, each answering one question.
Code climbs a ladder of environments, and each rung exists to answer a single question. All of them share the same code, the same database change history, and the same deploy machinery, so what works on one rung works the same way on the next.
| Environment | The question it answers | Who sees it |
|---|---|---|
| Local | Does it work on my machine? | Just me |
| Preview | Does this specific change work when deployed? | Me, per change, password-gated |
| Staging | Is the current build shippable and demoable? | You and me, password-gated |
| Production | Is it serving customers? | The public, when you are ready |
One deliberate choice: staging runs the exact production build, in the same region your customers’ data must live in, at stable addresses. So the build you demo to stakeholders is the final product, waiting for the switch. Real production runs as a completely separate setup, so test credentials and live credentials never touch the same configuration surface.
Under the hood
- Staging is the hosting project’s “production” target: production build behavior, a region pinned for data residency, stable URLs. Real production will be a second project entirely.
- Per-branch previews share the staging database and never run migrations; schema changes are tested locally and previewed after merge, so a shared schema is never left half-migrated.
- The uptime probe expects 401 anonymous and 200 authenticated, so it catches auth and configuration regressions as well as downtime.
Your data
Every database change is rehearsed before it touches shared data.
The shape of your data has one source of truth, kept in the recorded history alongside the code, and there is exactly one way to change it: a recorded, repeatable migration applied by the pipeline. Nobody, including me, hand-edits a shared database.
Before any change reaches the shared database, the pipeline rebuilds the entire database structure from scratch on a disposable copy and runs the change there first, in the very same run. New code never meets an old database shape. Once the system is live, changes follow a discipline that keeps the previous version runnable at all times, so rolling back is always safe. And production data is continuously recoverable to any point in time, with an extra backup taken before every migration.
Under the hood
- Committed, vendor-neutral schema model; forward-only
migrate deployin the deploy job; nodb pushor console DDL in shared environments. - Every push rebuilds the schema on a throwaway Postgres and runs the idempotent seed (upserts keyed on unique codes), which kills migration sets that only work incrementally.
- Expand-contract once live: add the new shape, dual-write, backfill, contract later. Production gets point-in-time recovery plus a pre-migration backup.
Secrets
Credentials live in one place and never travel.
Every environment owns its own credentials, and nothing crosses a boundary. Two automated backstops stand between a credential and a leak: a hook that blocks credential patterns from ever entering the recorded code, and secret stores that can be written and replaced but never read back out, by anyone, through any interface.
When the system goes live, the production credentials will exist in exactly one place, reachable only through a promotion process that requires explicit human approval.
Under the hood
Local .env files are gitignored and hold test credentials only. A pre-push redaction hook screens every push. CI and hosting secrets are write-only platform stores. One earned lesson baked into the process: pulling environment values from a platform returns a literal placeholder for write-only variables inside an otherwise normal-looking file, so values are always copied from authoritative sources, never from a pulled file. The authenticated probe caught exactly that misconfiguration within minutes.
Ownership
Built to be handed over.
From day one, the infrastructure is split into two piles.
- The build tooling is mine, and disposable: the staging site, the test database, the pipeline configuration, the deploy tokens. These get rebuilt for each engagement rather than transferred, and at the end they are decommissioned or handed over cleanly, with every token revoked.
- Your identity, money, and data are yours from the first day of production: your domain, your payment account (you are the merchant of record), your production credentials, your production database and hosting. All of it is created in your accounts, with me operating as a member inside them.
At the end of an engagement, the code repository transfers to your organization and my access is removed. Nothing else has to move, because nothing that matters was ever in my accounts. This is the ownership guarantee on the main page, expressed as architecture instead of contract language.
For regulated operations there is a further reason this split is non-negotiable: the licensed entity is the data controller for customer data, so production data belongs in its accounts with me acting as operator. Go-live is gated on your entity’s regulatory readiness; the software will be ready first, and it will wait.
The rhythm
Quiet weeks, boring launches.
Day to day: I build, I push, and about three minutes later the change is live on staging. Week to week: demos happen on the staging site directly, with a short recording and a status update to your project tracker, so you see progress every week rather than in one big reveal at the end. Phase acceptance is a live end-to-end test of the real flow on staging, which by then is a rehearsed non-event.
When something does break: small and obvious problems get fixed forward; anything else gets rolled back first (which is instant) and diagnosed second. And every problem that escapes to a shared environment becomes a new automated check, so the same failure cannot happen twice.
Under the hood
Detection starts with the 15-minute uptime probe and grows into structured logging and alerting on the money paths at the hardening milestone. The expand-contract discipline guarantees the previous build runs on the current schema, which is what makes “roll back first” safe. Production promotion, when it opens, is deliberate rather than continuous: a manually triggered, approval-protected workflow that deploys the exact commit staging already verified.
Start a conversation
Want this level of rigor on your system?
This delivery system comes standard with every engagement. Tell me what is breaking, and we start with a short paid discovery.