Software · Cloud and infrastructure
Serverless applications
Event-driven functions and APIs that run only when needed, scaling with demand and costing little when idle.
Many workloads sit idle most of the day and are busy for a few minutes: webhooks, file processing, scheduled jobs, spiky APIs. We build these on serverless platforms so you pay for execution rather than idle servers, and design around cold starts, timeouts and retries so the system stays correct when traffic jumps or a step fails.
What we build
- HTTP APIs on AWS Lambda, Azure Functions or Cloud Run behind an API gateway
- Event pipelines driven by queues, storage uploads and database change streams
- Scheduled jobs for reports, clean-ups and data syncs, with no server to patch
- Edge functions on Cloudflare Workers for redirects, auth and personalisation
- Step Functions and Durable Functions workflows for long multi-step processes
- Webhook receivers that verify, queue and process third-party events reliably
DemoInteractive · sample data
Try it live.
A working sample with made-up data. It runs in your browser; nothing is sent anywhere.
import type { S3Event } from "aws-lambda";
import { makeThumbnail } from "./images";
import { alreadyDone, markDone } from "./ledger";
export const handler = async (event: S3Event) => {
for (const rec of event.Records) {
const key = decodeURIComponent(rec.s3.object.key);
if (await alreadyDone(key)) {
console.log("skip", key, "(retry)");What it does well
Pay per use
Costs follow requests and run time, so quiet periods cost very little.
Idempotent handlers
Every function can safely run twice, because retries and duplicate events do happen.
Dead-letter queues
Events that keep failing are parked with their error for inspection and replay.
Cold start tuning
Bundle size, runtime and provisioned concurrency are tuned for latency-sensitive paths.
Local testing
Functions run and are tested locally with emulated events before they are deployed.
Traced end to end
Each request carries a trace ID across functions, queues and databases.
Questions
Is serverless always cheaper?
No. It is cheapest for spiky or low, uneven traffic. A service under heavy, steady load around the clock can cost less on containers or reserved servers. We estimate both from your real traffic before choosing, and mixed designs are common.
What about cold starts?
A cold start adds delay when a function has not run recently. We keep bundles small, choose fast runtimes, move heavy setup out of the request path and use provisioned concurrency only where users would notice. Background jobs usually need none of this.
Are we locked in to one cloud?
Partly, because triggers and managed services differ. We keep business logic in plain modules with thin platform adapters, and use portable pieces such as containers on Cloud Run or OpenTelemetry where it matters, so a later move is a contained job.