Tech stack

Boring tools, chosen on purpose.

Our technology radar, summarised. Every tool sits in one ring, and every choice was written down with its reason. The full story is in Introducing the BlendPay tech stack.

Adopt

In use, and the default choice.

Python 3.12, FastAPI, PydanticThe engine and its API boundary
SQLAlchemy 2, psycopg 3, AlembicPersistence and expand-only migrations
Postgres 16 on NeonThe only datastore, and the ledger
httpx, no provider SDKsEvery provider call visible and testable
State machines as dataOrders, parts and two-part orders
Integer centsThe only way money is represented
pytest, hypothesis, respx, PlaywrightA four-layer test pyramid, nightly sandbox runs
ruff, mypy strict, bandit, pip-audit, gitleaksQuality and security gates on every change
uvLocked, reproducible dependencies
structlogOne JSON log surface
Docker, RailwayThe deployable artefact and where it runs
Preact, shadow DOMThe row in a merchant’s checkout, about 20 kB gzipped
Cloudflare PagesStatic sites and the reference store

Trial

In use somewhere, not yet the default.

import-linterEnforcing the layering rule in CI
Postgres as the concurrency primitiveRow locks and unique indexes instead of a coordinator

Assess

Worth a spike when the need appears.

A Postgres-backed job queueRetries and reconciliation, without a second datastore
OpenTelemetryTracing across the engine and the row
WooCommerce and Shopify surfacesBlendPay beyond custom checkouts

Hold

Not for us now, with the reason written down.

KubernetesRight at scale, wrong for one service
Actor frameworksA row lock gives one-order-one-mailbox without hidden control flow
Provider SDKsThey hide their HTTP and are hard to test
A second datastoreOne Postgres carries us through the next phases
Floats near moneyNever