Code Agency

Blog

Articles about software engineering, Odoo, cloud infrastructure and running a digital business.

16 min read

Headless commerce with Odoo and React: the complete guide

Decouple the storefront from Odoo and you get a faster, safer, upgrade-proof shop. DragonflyDB caching, island architecture, GitHub version control, PR previews, VPN-isolated ERP, PWA mobile UX — everything we ship on every headless e-commerce project.

odooreactecommerceheadlessnextjsperformancesecuritypwacaching
18 min read

The PDF stopped being the invoice: eight months of Belgian B2B e-invoicing

Belgium's structured e-invoicing mandate landed on 1 January. Switching it on was an afternoon; everything it exposed was the quarter that followed. What Peppol actually addresses, why the failures live in your contact records rather than your ERP, what UBL refuses to carry, and why 'sent' stopped meaning 'delivered'.

odooaccountingerpbusinessautomation
14 min read

One login for the whole stack: OIDC on the tools you already self-host

Every self-hosted tool ships its own user table, and a leaver has to be removed from all of them. The identity provider we put in front of Grafana, Metabase, ArgoCD and the custom apps — which parts map cleanly, why Odoo is the awkward one, and what you owe the thing once everything depends on it.

securitydevopskubernetesarchitecture
17 min read

The staging environment lie: why PR previews replaced ours

One shared staging server is always broken, always blocked and always stale — and every fix for that is really a fix for it being shared. What it takes to give each pull request a real environment instead: the database copy, the seed nobody owns, the integrations that must fail closed, and the teardown that is the whole point.

devopskubernetestestinggitops
16 min read

The column you can't just rename: schema changes without a maintenance window

A rename is the cheapest thing a database does and one of the most dangerous things a deploy does, because two versions of your application are always live at once. Expand, backfill, contract — the release boundary that makes it safe, the locks that bite anyway, and what changes when Odoo owns the schema.

postgresqldevopsarchitectureodoodevelopment
13 min read

LISTEN/NOTIFY in practice: realtime features without a message broker

Postgres can push an event to your app the moment a row commits. The trigger that catches every writer including the ERP, the listener that survives a reconnect without losing a change, the pooler that silently breaks all of it, and the bulk import that turns a live board into 40,000 notifications.

postgresqlarchitecturenextjsdevelopment
18 min read

The stale screen problem: offline-first signage that fails loudly

A dark screen is a support ticket. A screen still showing last week's price is a lie in your store, and nothing in a normal monitoring stack will tell you about it. Content as a versioned bundle instead of a URL, day-parts that depend on a clock you don't control, expiry as a safety feature, and telemetry that reports what's actually on the glass.

signagearchitecturedevopsmonitoring
13 min read

WordPress, headless or custom: a decision framework without dogma

Three good answers to "we need a website", each right for a different shape of requirements. The five questions that actually decide it — who edits, what it talks to, whether visitors change state, who owns it in three years, and what the risk surface has to look like — plus the two migrations that go wrong in both directions.

wordpressheadlessarchitecturebusinessdevelopment
15 min read

What a care plan should contain: maintenance contracts worth signing

Most maintenance contracts are a monthly invoice with a promise attached. The line items that make one real — patch cadence, backups you have restored, an SLA that says what a clock is and when it runs, and hours you can actually spend — plus the questions that expose a hollow one in five minutes, applied to ours as well as everyone else's.

businessmaintenancedevops
13 min read

The invalidation tax: where TanStack Query ends and TanStack DB begins

In an internal tool, the same order is on screen in five places at once, and every mutation has to remember all five. What a client-side store fixes that a cache can't — collections, live queries, optimistic writes that roll back on their own, and the working set that has to fit in a browser.

reacttanstackarchitectureerpdevelopment
19 min read

Two-way SMS for service businesses: confirmations that answer back

A reminder tells the customer something. A confirmation tells your calendar something — and only one of those lets you refill the slot. The virtual number that makes replies possible, the matching problem nobody warns you about, parsing what people actually type in three languages, and the Odoo automations that reschedule without a human.

smsautomationodooarchitecture
18 min read

SMS for 2FA: what it's still good for, and what it isn't

SIM-swap risk is real; so is the customer who will never install an authenticator app. An honest matrix of SMS OTP against TOTP and passkeys — plus the attack that shows up on your invoice instead of your incident channel, the network APIs that turn a phone number back into a useful signal, and why the recovery path decides your real security level, not the login screen.

securitysmsarchitecture

Want us to publish something specific?

Tell us what you'd like to read and we'll add it to our writing queue.