S3 static hosting alternatives for reports
It starts reasonably. Someone needs to share an HTML report, there is already
an AWS account, and aws s3 cp is one line. Six weeks later the setup is:
- a bucket, with a policy nobody wants to touch,
- a CloudFront distribution, because S3 website endpoints do not do HTTPS on a custom domain,
- an invalidation on every publish, and a stale-report bug the one time it was forgotten,
- presigned URLs that expire, or an OAI plus a Lambda@Edge auth check somebody wrote once and nobody understands,
- and no answer at all to "what changed since last week" or "where do I leave a comment".
You did not want a static site. You wanted to send someone a report.
Where the bucket model runs out
- Presigned URLs are capabilities, not identity. Forwardable, unrevocable per person, unlogged per person, and they expire — so the link in the doc dies quietly.
- No version anyone can read. S3 versioning stores old objects; it does not give a reviewer a diff between this week's report and last week's.
- No review layer. The feedback happens in Slack, detached from the artifact, and is gone by the next publish.
- Every publish is a deploy. Sync, invalidate, hope. For a document that changes daily, that is a pipeline maintained for no product reason.
The shortlist
1. Comma — the report is the unit
Drag the file or folder into the app, or POST it from the job that generated it:
curl -fsS -X PATCH "https://commareports.com/api/v1/reports/$REPORT_ID" \
-H "Authorization: Bearer $COMMA_API_TOKEN" \
-H "Content-Type: application/json" \
-d "$(jq -n --rawfile html out/index.html '{html: $html}')"
No bucket policy, no distribution, no invalidation. Visibility is identity — private, team, email-domain-gated, named reviewers, or public. Each publish to the same id appends a revision with a diff, and comments anchor to the rendered content. Multi-file output uploads as a bundle with relative references rewritten.
Not for: hosting an application, or content that must physically reside in your own AWS account.
Pricing: Free — unlimited reports, commenters and revision history.
2. Cloudflare Pages + Access — the same idea, better ergonomics
If you genuinely want to operate static hosting, Pages plus Access is a significantly lighter version of the S3 + CloudFront + custom-auth stack, with real SSO gating and no invalidation dance. Still no review layer. Full tradeoff: Cloudflare Access alternatives.
3. Netlify / Vercel — when it became a site
If the artifact grew routes and a build step, it is an app now and belongs on an app platform. See Vercel alternatives for where that line sits.
4. Keep S3 — for the archive, not the audience
A perfectly good pattern: write the raw artifact to S3 for retention and compliance, publish the human-readable version where humans will read it. These are two different jobs and there is no rule that one bucket does both.
At a glance
| Option | Access model | Versions readers can diff | Comments | Ops per publish |
|---|---|---|---|---|
| Comma | Identity: team / domain / named | Yes | Yes | One request |
| S3 + presigned | Expiring capability | No | No | Upload |
| S3 + CloudFront | You build it | No | No | Upload + invalidate |
| CF Pages + Access | Real SSO | Per deploy | No | Deploy |
Checked August 2026. Verify current plans before committing.
How to choose
- It's a site or an app? Static hosting, and this page stops applying.
- Compliance says it stays in your account? S3, and budget for the auth layer honestly.
- It's a report someone should read and respond to? Publish it — share an HTML report — and keep the bucket for the archive.