CARIBBEIN
← All notes

Engineering note · reference

The stack, and how to check it

Not a logo wall. Technologies by the role they play, dependency budgets probed from the lockfiles, and a check attached to every claim — because a stack page you cannot verify is just an aesthetic.

August 2026 · dependency counts probed

No version numbers, anywhere on this page, on purpose. A version pin on a public page is a CVE lookup for someone else. We publish what we run, never which build of it — and hosting vendors appear as roles, not names, for the same reason.

01The front door

A plain Node http server and hand-written HTML, CSS and vanilla JavaScript. No framework, no bundler, no build step, and a manifest that declares dependencies — the runtime and the standard library are the stack.

A page whose job is to load fast and read well does not need a component runtime — and a dependency that does not exist never needs patching.

Check: view source on www.caribbein.fr, or press the audit button on /geek requests,  KB, origins, measured by your own browser.

02The marketplace

One HTML file of vanilla JavaScript carrying the whole consumer experience, plus exactly external libraries: an open-source map renderer and a thin database client. Map tiles come from a standard public tile provider.

A single file deploys atomically, caches as one object, and can be read end to end by anyone auditing us. The two libraries earn their place by replacing thousands of lines we would write worse.

Check: view source on the marketplace page; count the external script tags yourself. The live-data endpoints it calls are documented in the API note.

03The consumer app

An installable web app — manifest, service worker, offline-first caching, standard web push. No app stores, no native codebases: one web platform, installed from the browser.

Island connectivity is real life here: an app that opens offline and syncs later beats a heavier native twin nobody updates. And one codebase is a promise a small team can keep.

Check: install it from the browser menu; then open your dev tools' application panel and read the manifest and the service worker for yourself.

04The provider OS fleet

A minimal Express server, a shared vanilla-JS shell, and one configuration file per OS. The platform repo declares direct runtime dependencies — a web framework, the map renderer, a QR generator and a web-push implementation — and its lockfile resolves to packages in total, transitive included.

Every dependency is a stranger with commit access to production. A supply chain you can read in one sitting is a supply chain you can actually audit.

Check: the repo is private, so read the architecture instead: the driver note and the guards describe exactly what those few dependencies carry.

05Data

Operational Postgres on a managed provider, one schema per OS, row-level security from the first table, reached through a REST layer that selects the schema per request. Object storage with a hard public/private split; identity documents only ever by short-lived signed URL. All schema change is numbered SQL migrations, replayed from zero in CI.

Postgres because thirty years of boring is the best security audit money cannot buy; a managed provider because a company this small should not also be a database operations team.

Check: the full decision, with the alternatives we rejected, is One database, nineteen worlds and ADR-001.

06Messaging & delivery

One-time codes and provider notifications over SMS and WhatsApp; standard web push to installed apps; transactional mail from our own domain. No password store exists anywhere in the estate.

A phone is the one credential every islander and every provider already carries. WhatsApp is where Caribbean business actually happens — the stack meets people where they are.

Check: sign in anywhere on the estate — you will never meet a password. The push system's honesty contract is guard 07 in the guards note.

07Type & media

Self-hosted woff2 with a Google Fonts fallback — the one third-party origin a source-viewer will find on the front door. Brand faces are named in the /geek colophon. In the media pipeline, AI generation is allowed — but binaries never enter version control, and every asset's JSON sidecar (prompt, licence, parameters) is the tracked source of truth.

Fonts self-hosted so the page never blocks on a third party; sidecars tracked so provenance survives the binary. And no generated imagery on credibility pages — including this one.

Check: your network tab for the fonts; ADR-002 for the media policy in full.

08Tooling & CI

Node scripts, end to end. ingest and enrichment scripts, build-failing guards, and verifiers — all plain scripts, no task-runner framework, no build step anywhere on the public estate. AI does heavy lifting inside this tooling — drafting, judging, classifying — and never appears in the consumer product.

One language across product and tooling means every script is everyone's script. And guards that run with no infrastructure are guards that never get skipped.

Check: probe.mjs is one of these scripts, published — read it, run it. The guards each carry their scar in the guards note.

09Hosting

A container platform runs the processes; a managed provider hosts Postgres and storage; DNS is plain records at a registrar. No edge provider in front of the origin, no orchestrator, no microservices — a handful of long-running Node processes.

The estate's scale is islands, not continents. An architecture sized for imaginary traffic is a tax paid daily for a day that may never come — and every layer we do not run is a layer that cannot go down.

Check: the response headers on any page carry the posture; the vendor names are deliberately not here, and that policy has its own paragraph at the top.

The dependency budget, to scale

For calibration: a typical JavaScript platform's lockfile resolves to thousands of packages. Ours resolves to — small enough to read the names in one sitting, which we do. Boring is not a lack of ambition. Boring is the ambition: the excitement belongs in what providers and travellers can do, and the stack's job is to still be standing, patchable and comprehensible in ten years, on islands, run by a small team.

Check what you can

Every layer above carries its own check, and every number loads from eng-facts.json with a visible probe date. What is deliberately missing — versions, vendors, hostnames — is missing under the rule stated at the top, which is itself a fact about the stack.