The bill tells you what you actually built.

Not the architecture diagram, not the README — the invoice. It records every instance somebody started for an afternoon, every environment that outlived its demo, every gigabyte that left the region because nobody modelled egress. A cloud bill is the most honest document a company owns, and almost nobody reads it line by line.

We do that read, and then we do the thing that makes it stick: put the infrastructure into code in your repository, take the person out of the deploy path, and write the runbook for whoever inherits it. Kubernetes appears here only where a workload has earned a cluster — most have not, and we say so before the invoice does.

FACT 01

We have operated a trading back office through years of change for a client in a long-running relationship, on a platform serving 8,000+ monthly active users that has to be up during market hours. Running a system for years is a different discipline from launching one.

FACT 02

The Cloudflare claim on this page is checkable in about ten seconds: Turnstile guards the forms on this site, and it challenges on submit rather than on load, so a reader who never touches a form is never challenged.

FACT 03

There is no uptime figure, SLA percentage, incident-response time or cost-saving percentage anywhere on this page. None has been cleared for publication, and a percentage without workings is the easiest number in this industry to invent. The map below is schematic and says so.

Take a bill apart ↓

30 minutes, working session. Show us how a change reaches production today and last month’s invoice; you leave with a one-page read either way. Nobody follows up more than once.

The trading terminal on the platform we operate: a candlestick price chart with a volume histogram, a depth-of-market ladder of bids and asks beside it, and a time-and-sales tape running underneath
Live during market hours — Earn2TradeThe front of a system we have run, not just built. Behind this screen sit live market feeds, billing, a CRM and analytics — and a bill with a name against every line. Earn2Trade case →

Cloud problems are ownership problems wearing technical costumes

Every one of these arrives at our door described as an infrastructure fault. None of them is. They are all the same fault: something important has no name against it, and the console is the last place that becomes visible.

DEPLOY

Releasing is a ceremony

A checklist in a document, a manual smoke test, one person who runs it, and an unwritten rule about Fridays. So the batch grows, the risk per release grows with it, and the team becomes slow and frightened at the same time — which is the expensive combination.

OWNER — ONE PERSON
BUS FACTOR

One person knows how it was built

Servers configured by hand over three years, nothing written down, and annual leave coming up. Everybody knows the bus factor is one, including that person, who has quietly stopped taking holidays. The fix is not a wiki page; it is putting the configuration somewhere a second person can read and change it safely.

OWNER — ON HOLIDAY
ATTRIBUTION

The bill grows and nobody can explain it

Idle capacity, oversized instances, three forgotten environments, storage nobody tiers and egress nobody modelled. Finance asks for a breakdown by team or by product, and there is no tagging to build one from — so the honest answer is that most of the invoice is unattributable.

OWNER — NONE
PARITY

Staging does not resemble production

Different instance sizes, different data volumes, a queue that never backs up. So the bug appears only in production and the fix is tested in an environment that cannot reproduce it. Everyone on the team knows this is the problem; nobody has the free week to fix it.

OWNER — EVERYONE
CLUSTER

Kubernetes arrived for a product that did not need it

Now there is a cluster, an upgrade cadence, a set of controllers and a YAML surface area, all owned by an application team that wanted to ship features. The technology is not the mistake. The absence of a full-time owner for it is.

OWNER — THE APP TEAM
RESTORE

The backup has never been restored

It runs nightly. It reports success. Nobody has performed a restore from it, which means the recovery objective is a belief rather than a control — and the day you first test it is the worst possible day to find out how long it takes.

OWNER — A BELIEF

A bill, drawn to scale — then put under load

Six lines, sized by what they cost. Change the load profile and watch which blocks move and which sit exactly where they were: that difference is the whole of cost work. Every block carries its own arithmetic, because a number you cannot reconstruct is a number you cannot argue with.

SCHEMATIC — ILLUSTRATIVE UNIT RATES, NO CLIENT FIGURES PROFILE: AS FOUND
Load profile
Tagging what the same bill looks like with no owner on the resources
The month
$10,230

SIX LINES · ONE ENVIRONMENT PAIR · ILLUSTRATIVE

What moved, and what did not

The everyday shape. Compute leads, egress is larger than anyone expects, and a fifth of the bill is capacity nothing is currently using. Change the profile above and watch the blocks rearrange.

The engagement this instrument describes is one to three weeks and produces workings rather than a headline. You get the line-by-line arithmetic: what each resource is, who or what it belongs to, what it would cost right-sized, and what stops working if it goes. If the bill is already tight, the read says so and it is short.

The insights screen of the cybersecurity platform we built: a dark console with a left menu for hosts, live notifications, compliance and policies, and five dashboard cards for access control, user activity, activity by IP address, general network traffic and all traffic
The same instinct, one layer down — cybersecurity platformEDR, SIEM, IPS and IDS in one product, with kernel-level detection and remediation that runs without waiting for a human rota. Acting automatically on a signal that might be wrong is the same engineering problem as an autoscaler or a self-healing deployment. Cybersecurity case →

Five providers on the bench, and what each is honestly good at

We hold no partner status with any of them, and there is nothing on this page that a partner badge would make truer. What we have is the boring, useful thing: enough time on each to know where the bill goes and where the migration hurts. AWS, GCP and DigitalOcean are the three we run most, and we run them on equal terms — the choice belongs to your workload shape, not to our habits.

AWSRun most · equal footing
The widest managed surface, and the one where the difference between what a service does and what you are charged for it matters most. Worth its price when you genuinely need the managed pieces — queues, streams, managed databases, IAM as a real access model, OIDC federation so CI never holds a long-lived key. Wasted when it is running the same three containers a cheaper host would run.
GCPRun most · equal footing
Where the data stack pulls you. If the product's centre of gravity is analytics, warehousing or model work, the surrounding services stop being a preference and start being the reason. We also see it chosen for the identity model and for the network, and both are defensible reasons that survive a second year.
DigitalOceanRun most · equal footing
A straightforward product at moderate scale is simply cheaper here, and the mental model is small enough that a whole team can hold it. This is frequently the correct answer and it is rarely the fashionable one. This site runs on a DigitalOcean droplet behind nginx, deployed from its own repository on merge — which is a modest example, and a real one.
HetznerLess often · handled properly
Where raw compute per euro decides the architecture — heavy batch work, model training runs, anything where the managed convenience was never the point. It asks more of you in exchange, so it goes on the bench when the workload is well understood and the team is comfortable owning more of the stack.
AzureLess often · handled properly
Usually chosen upstream of us, by an identity estate or a procurement position rather than by an engineer. That is a legitimate reason, and we work inside it professionally rather than arguing with it. The engineering does not change: infrastructure in code, a reviewed plan before apply, and a deploy path with nobody standing in the middle of it.

Because the infrastructure is in code from the first week, the provider decision stays revisitable. That is the actual argument for Terraform — not elegance, but the ability to price the alternative later without a rewrite, and to import the resources somebody created by hand in a hurry rather than leaving them outside the model forever.

The edge either halves your egress or quietly does nothing

A CDN in front of an origin is not a setting you turn on. It is a set of decisions about what is cacheable, for how long, keyed on what, and what happens when it is wrong — and the difference between a considered configuration and a default one shows up on the same invoice line the cost read is about.

CLOUDFLARE — WHAT WE WORK WITH

DNS and zone management, proxying and TLS, cache rules and the cache keys behind them, page and redirect rules, the WAF and managed rule sets, rate limiting on the endpoints that deserve it, bot controls, Workers for logic that belongs at the edge rather than in the origin, R2 where egress is the thing being avoided, and Turnstile on forms.

CLOUDFRONT — WHAT WE WORK WITH

Distributions and multiple origins, cache behaviours split by path, cache-policy and origin-request-policy design, origin shield where the origin is the fragile part, signed URLs and signed cookies for private assets, Lambda@Edge and CloudFront Functions for header and routing work, and invalidation used sparingly rather than as a deploy step.

THE CHECKABLE ONE

Cloudflare Turnstile runs on the forms of this site. It renders explicitly rather than by class scan, it challenges on submit rather than on page load — so a visitor who never touches a form is never challenged and no token goes stale while they read — and the token is verified server-side before a lead is ever written. Open the contact form and you are looking at it.

WHAT THE EDGE DOES NOT FIX

An origin that is slow because a query is slow. A cache key that includes a session cookie, so nothing is ever shared. Assets served with no cache lifetime at all. We measure the hit ratio and the egress before and after, because “we put a CDN in front of it” is a sentence, not a result.

Two people from Fluvius standing in a client's open-plan office, with the client's own team working at desks in the room behind them

Whose accounts, whose keys, whose Terraform state

This is the question the security owner is actually asking, and it deserves a plain answer rather than a paragraph about our commitment to security. We work inside your accounts, never around them.

ACCESS

Only what the work requires, in your cloud accounts, under your access model, with least-privilege roles and credentials you can rotate or revoke without asking us. Named human identities rather than a shared login, so an audit can reconstruct who changed what.

SECRETS

Never in the repository, never in the build log, never in a message. A secret manager your team already controls, OIDC federation instead of long-lived provider keys sitting in CI, and rotation that is a procedure rather than an intention.

STATE AND DNS

Terraform state lives in your account with locking, versioning and a plan a human reads before anything is applied. DNS, domains and certificates stay in your registrar and your zone. There is no point in the engagement at which we hold something you cannot take back the same afternoon.

THE HANDOVER

The runbook is written for whoever inherits it, not for us: how to deploy, how to roll back, how to restore, what each alert means and what to do about it at three in the morning. If we are the only ones who can operate what we built, the job was done badly.

The Earn2Trade back office: a left menu covering customers, funded traders, compliance search, withdrawals, financials and affiliates, beside an account-creation form with asset and exchange selectors
Operated, not just launched — Earn2Trade

The second year is where infrastructure is judged

Launching a system is a project. Keeping one correct through years of provider changes, dependency upgrades, new payment flows and a market that opens at a fixed time every morning is a different discipline, and it is the one this page is really about. Behind these screens are live market feeds, billing, a CRM and analytics — and a deploy path that had to stop being an event. Earn2Trade case →

Four systems we have run, and what was hard about each

Every one of these has a case page behind it. Longevity is first because it is the strongest infrastructure claim available and the easiest for you to check.

Earn2Trade
Operated for years
Market hours

A platform we have run, not just built

A trading back office with live market data, a CRM, billing and analytics, serving 8,000+ monthly active users, operated through years of change for a client now in a long-running relationship with us — many of our clients have been with us 7+ years straight. The hard part is not the first release. It is that the thing has to be correct on an ordinary Tuesday during market hours, two years after the people who designed it moved on to other work. Earn2Trade case →

UAE neobank
Tests in CI
Core banking

Tests wired into every pipeline execution

Automated end-to-end coverage of a UAE neobank's core banking journeys, running in CI on every change rather than in a manual pass before every release. The hard part is that a flaky suite guarding a payment journey is worse than no suite at all, because people learn to ignore red and then learn to ignore red that means something. Stability of the suite is the deliverable; coverage is the easy half. Neobank QA case →

Cybersecurity platform
EDR · SIEM · IPS · IDS
Automated response

A response that does not wait for a human rota

An open-source-based product joining EDR, SIEM, IPS and IDS, with kernel-level detection and remediation that runs automatically. The hard part is acting on a signal that might be wrong: the blast radius of a false positive, the rollback, the audit trail of what the system did on its own. That is the same problem as an autoscaler reacting to the wrong metric or a deployment healing itself into an outage — one layer down, with higher stakes. Cybersecurity case →

Sonnenrepublik
Multi-year
Embedded R&D

Where we learned what a rollback is worth

A multi-year firmware programme for a novel power station for PV systems, for sonnenrepublik.de. Firmware has no rollback story unless somebody builds one: there is no console to open, no instance to replace, and the device is in a customer's home. Designing recovery before the first update ships is a habit that transfers directly to a deployment strategy, and it is why we ask about your rollback before we ask about your cluster. Sonnenrepublik case →

Where our experience is provider-specific we say which, and this page names no managed-Kubernetes estate run for a client because we are not claiming one. The Kubernetes competence below is written at exactly the level it exists — and the operating record above is what carries the weight.

Bring one deploy and one invoice to the Data Flow Audit. Those two artefacts answer most of what we would otherwise spend a week discovering.

Kubernetes, including the advice not to

We have done a great deal of this work and we are comfortable anywhere in it. We also think most products we are shown do not need a cluster, and that a page recommending the heaviest option to everyone is transparently selling hours. So here is the competence, written as competence, and then the conditions under which we would actually tell you to use it.

HEALTH AND SCHEDULING

Readiness against liveness probes, and the outage that comes from confusing them — a liveness probe wired to a dependency will restart a healthy pod into a cascade at exactly the wrong moment. Resource requests and limits, and the CPU throttling that arrives at the application team disguised as slow code. Pod disruption budgets, affinity and topology spread, so a node drain is a routine event.

SCALING AND TRAFFIC

Horizontal autoscaling on a signal that reflects the work — queue depth or concurrency rather than CPU on a service that waits on I/O — plus the cluster autoscaler beneath it, ingress controllers, certificate issuance and rotation, and the difference between a rolling update that drains connections and one that drops them.

OPERATIONS

Node and control-plane upgrades, which are routine right up until the day they are not; the stuck finalizer that leaves a namespace terminating forever; CRDs and controllers and who owns them after the person who added them leaves; RBAC that is actually restrictive; and secrets that come from somewhere other than a manifest in the repository.

DELIVERY INTO IT

Helm or Kustomize with values that are reviewable, immutable image tags rather than a tag that quietly moved, environment promotion by digest, and a rollback that has been exercised in front of you rather than documented. The manifest is not the deliverable; the ability to change it safely on a Thursday afternoon is.

When we would say yes: several teams deploying independently, workloads with genuinely different scaling shapes, a real need for the ecosystem around it, and someone whose job includes owning it. When we would say no: a handful of services at moderate scale that containers on a managed platform would run for a fraction of the operational cost. That recommendation arrives in writing, with the reasoning, and it costs us hours to give — which is roughly the point.

Three people around a café table in Los Angeles with coffee cups and notes, mid-conversation about a project
Client session · Los Angeles

The read is a conversation, not a report you receive

Half of what makes a cost or deploy read useful is context an invoice cannot hold: which environment belongs to a customer pilot nobody has cancelled, which service is about to be replaced anyway, which alert everyone silently ignores. We ask, you answer, and the workings get written down while the answers are still fresh. You keep the document whether or not anything follows. About Fluvius →

The work, as we actually sell it

Timelines are indicative ranges and depend on scope. Every one of these starts small enough to cancel, and each produces an artefact you keep.

Read the bill, line by line

1–3 WEEKS

Tagging and per-environment attribution, right-sizing, idle and forgotten environments, storage tiers, egress modelled rather than discovered, and reserved or committed-use cover where the baseline is genuinely stable. You get the workings, so any saving is verifiable rather than claimed. The fastest engagement here to justify.

Merge to production, with nobody in the middle

2–6 WEEKS

Build, test, scan and deploy on merge; environment promotion by immutable artefact; secrets that never reach a build log; OIDC federation instead of long-lived keys in CI; and a rollback that gets exercised while everything is calm.

Terraform in your repository

3–8 WEEKS

Infrastructure reviewed like any other change, state held and locked in your account, drift between code and console found deliberately, and the resources somebody created by hand imported rather than left outside the model. You get an environment that can be rebuilt with a command.

Signals you will still read in month three

2–6 WEEKS

Structured logs with a correlation id that survives a queue hop, metrics with cardinality you can afford, traces across service boundaries, dashboards for the journeys that matter, and alerts tuned so that a page still means something by the time the novelty has worn off.

A restore performed in front of you

1–3 WEEKS

Automated backups, recovery objectives written down as numbers, and then the part almost nobody does: an actual restore into a clean environment, timed, with you watching. After that the objective is a control instead of a belief.

A written answer on whether you need a cluster

1–2 WEEKS

A recommendation with the reasoning, based on your workload shape, team size and deployment independence. If it says yes, it comes with probes, resource limits, autoscaling signals, upgrade cadence and a runbook. If it says no, we build the simpler thing instead.

Provider choice, and how to leave one later

2–4 WEEKS

AWS, GCP, DigitalOcean, Hetzner or Azure chosen on workload shape and modelled bill rather than on fashion — with the migration path costed, and the infrastructure in code from the start so revisiting the decision is a plan rather than a rewrite.

The edge, configured deliberately

1–3 WEEKS

Cache rules and cache keys, WAF and rate limiting where they belong, bot and form protection, Workers or edge functions for logic that should not travel to the origin — measured on hit ratio and egress before and after, so the change is a result rather than a sentence.

What you are probably thinking

“Do we need Kubernetes?”
Probably not. Most products at moderate scale are better served by containers on managed services with a simple deploy, and a cluster adds an operational burden that needs a full-time owner. When you genuinely do need it, your load and your team structure will make that obvious long before a conference talk does — and we are entirely comfortable building it when that day arrives.
“AWS or DigitalOcean?”
Whichever is cheaper for your workload shape, and we will say so when the answer is the less fashionable one. DigitalOcean often wins for straightforward products at moderate scale; AWS wins when you genuinely need its managed services; GCP wins when the data stack is the centre of the product. Infrastructure in code from the start makes revisiting that decision cheap.
“You’d have access to our production.”
Only what the work requires, in your accounts, under your access model, with least-privilege roles and credentials you rotate. Cloud accounts, DNS, certificates and Terraform state stay yours throughout, under named identities so an audit can reconstruct who changed what. We work inside your accounts, never around them.
“Can you actually reduce our bill?”
Frequently — and we show the arithmetic per line rather than quoting a percentage, which is why there is not one on this page. Right-sizing, idle and forgotten environments, storage tiers and egress are the usual sources. If the bill is already tight, the read says that plainly and it is short and cheap.
“Do you do on-call?”
Monitoring, alerting and runbooks come as standard, and we agree response arrangements where you need them. What we will not do is quote a heroic response time we cannot honour with a senior engineer actually awake. That is the sentence most vendors get wrong, and it is the one you will remember at 3 a.m.
“What happens when you leave?”
That case is designed in from the first week, because it is the normal ending rather than the sad one. Infrastructure lives in code in your repository, state and credentials are yours, and the runbook is written for whoever inherits it. Transition assistance and knowledge transfer are part of how we finish, not a negotiation at the end.
“We tried an outside dev shop and it went badly.”
Usually the same three causes: no senior person accountable, a demo-grade codebase, and a handover that never happened. Here you get direct access to the engineers doing the work, no account-manager layer, a senior architect signing off every project, and documentation written for the person who inherits the system rather than for the invoice.

The record behind the pages

200+
Clients served
10+
Years of happy clients
7+
Years our longest clients have stayed

Many of our clients have been with us for 7+ years straight. The Upwork and Clutch records are independently verifiable. We hold no cloud-provider partner status and no certification badges, and none appears on this site.

Looking for this as an engagement rather than a stack? DevOps & Cloud services — releases that stop being events covers the same discipline sold as a retained team, with the outcomes and the process rather than the tool-level detail on this page. See also Code & Developer Audit and all our work.

Not ready to talk? Take the checklist.

One page: 17 questions about your infrastructure you should be able to answer without opening the console. Who holds Terraform state and where. When the last restore was actually performed, and how long it took. What the rollback procedure is and when it was last exercised. Which environments have no owner. Where long-lived provider keys still live. What your three largest cost lines are, and which of them moves when traffic does.

Bring one deploy and one invoice.

A free 30-minute working session, not a sales call and not a demo — there is nothing to demonstrate. Show us how a change reaches production today, and last month’s bill. We tell you which of the two is costing you more, and what we would change first.

You keep a one-page read either way: the current path to production with its manual steps marked, the three largest cost lines with an estimate and the workings behind it, and a straight answer on whether your workload wants a cluster or emphatically does not. Nobody follows up more than once.

RELATED SERVICES → DevOps & Cloud Engineering AI Code Cleanup & Cloud Cost Optimization Product Engineering Team Product Rescue All services