Free 15-min triage

Works locally, fails live

File and image uploads broken in production

Uploads are the feature most likely to pass every local test and still fail on launch day. On your machine there is no proxy in front of the app, no execution clock, and no separate storage origin. On a production host every one of those appears at once. So the avatar upload that worked all week now returns a 413, stalls at 90 per cent, or succeeds and serves a broken image. The causes below are specific and mechanical, and every one of them is findable.

Fixed £4,500 · 3 days · pass-or-refund · next slot w/c 3 August

What actually breaks

The shape production uploads are supposed to have

Production uploads have a standard shape. The browser asks your server for permission to upload. The server checks who is asking, checks the declared file type and size, and returns a short-lived presigned URL scoped to a single object key. The browser sends the file directly to the bucket with that URL; the bytes never pass through your function, so body limits and execution clocks stop mattering. The server records the key once the upload confirms, and downloads go out through signed URLs or a CDN, never the raw bucket. Every failure on this page is either a symptom of skipping this shape or a gap this shape closes.

What “done” looks like

We agree one of these in writing before you pay anything. If it passes, the sprint passed. If it doesn't, you get a full refund and keep the work.

Pass-or-refund guarantee

We agree the acceptance test before any work starts. If it doesn't pass within three working days, you get a full refund and keep every change I've committed. The risk is mine, not yours.

Get a yes/no on your blocker · free, 15 min