
When a Static Site Is Enough for Your Idea. A Build Next Stack field guide for learners shipping small projects.
Static fit — criteria beyond it is simple
A static site pre-builds HTML (and assets) at deploy time; each request serves files from CDN unless you add serverless functions. Fit when content changes infrequently relative to reads, when every visitor sees the same pages or variants you can pre-render, and when forms or search needs are small enough for client-side or third-party services.
Static is not only blogs. Documentation sites, portfolios, tool directories, landing pages with waitlist forms, and marketing sites for side projects often never need a always-on server.
Complexity lives in the build step (Markdown, templates, data files)—not in runtime servers you patch at midnight.
Static does not mean frozen: rebuild on git push can happen dozens of times per day. What you lose is per-request personalization without client-side logic or serverless add-ons.
Static vs dynamic — comparison for side ideas
Static wins on: cost, speed, security surface (no SQL injection on read-only files), deploy preview per branch.
Dynamic wins on: per-user dashboards, server-side auth sessions, heavy write traffic, A/B tests computed server-side every request.
Gray zone: search and comments—often solved by Algolia/Pagefind and hosted comment widgets without running your own database.
If your idea’s unique value is not custom server logic, static may carry you to hundreds of users cheaply.
Measure write frequency: if content changes less than once daily and no user-specific writes exist, static remains candidate even when the site feels interactive thanks to client JS.
Anti-pattern: CMS for three pages
Spinning WordPress on a VPS for About, Projects, and Contact is ops homework for content that changes monthly. Another anti-pattern: choosing dynamic because you might add accounts someday—accounts never arrive, bills do.
Headless CMS adds API and build pipelines—justified at many editors and frequent updates, heavy for one author and six posts.
Markdown in git with preview deploys gives history and review for free. CMS wins when non-git editors publish weekly without bothering you for merges.
Worked example: tool directory launched statically
Idea: curated list of CLI tools with tags and search. Data: YAML files in git—one file per tool. Build: Eleventy or Hugo generates tag pages and search index JSON. Search: client-side filter on load (under 200 tools) or Pagefind at build time.
Submit form for new tools: Google Form → Sheet → manual YAML PR until volume justifies automation. Launch week: deploy on Cloudflare Pages, custom domain, no server bill.
Upgrade trigger documented: move to dynamic when submissions exceed manual review capacity weekly—not when you feel like real companies use servers.
Preview URLs per pull request let friends review content changes before main deploy—an underrated static advantage dynamic apps often skip on side budgets.
Failure modes that force a rewrite
Build time creep: thousands of pages generated each commit slows CI—shard builds or incremental adoption.
Secret leakage: API keys embedded in client JS—static cannot hide secrets; use serverless proxy or accept public keys only.
Personalization desire: logged-in homepage per user—static alone fights you; add auth host or move dynamic.
Editor non-technical collaborators: git frightens co-authors—then CMS worth cost; until then, shared Sheet export script.
Locale explosion: ten languages times five hundred pages slows builds—consider splitting locales or incremental builds before abandoning static entirely.
Generator choice — Eleventy, Hugo, Astro, or plain HTML
Plain HTML works for under ten pages. Eleventy and Hugo excel when Markdown posts multiply and tag pages should auto-generate. Astro fits when you want islands of React/Vue on mostly static pages without shipping a full SPA.
Pick generator based on template language comfort, not stars on GitHub. Switching generators later is annoying but less painful than running WordPress patches for a read-only site.
Keep content in git either way—generators are build tools, not prisons. Export paths stay portable when files remain Markdown or YAML at rest.
Static plus serverless — hybrid without a server bill
Keep marketing pages, docs, and blog static on CDN. Move only secrets-heavy or write-heavy actions to serverless functions: form posts, webhook receivers, admin approve button behind basic auth. You pay per invocation, not for idle CPU.
This hybrid delays full dynamic rewrite while solving the most common static limitation—trusted writes. Functions stay tiny; business logic that grows moves later to a dedicated service with clear boundary.
Watch function cold starts on user-facing forms; warm-up cron or always-on micro VM may appear—but only after users complain, not preemptively.
Stay static or move — decision gate
- Can all content update via git/Sheet at your current cadence?
- Do visitors need accounts on your domain?
- Are secrets required that must not ship to browsers?
- Does server-side logic run on more than 5% of requests?
- Is build+deploy under ten minutes and painless?
Four yes on static-friendly questions: stay static. Any no on secrets or accounts: plan hybrid (static marketing + small API) before full dynamic rewrite.
Rewrites are migrations, not admissions of failure—document triggers so the next choice is calm.
Hybrid exit ramps help: keep marketing static while moving app routes to a small dynamic service subdomain. Users see one brand; you split complexity deliberately.
Static-first is a speed strategy, not a purity badge. When dynamic needs appear, add the smallest dynamic piece—one function, one API route—not a full rewrite because a tutorial said so.
Measure time from content change to live URL. Static pipelines that deploy in under three minutes encourage editing; dynamic admin panels that require SSH restart discourage it—factor that into your choice.
Pre-render until the product fights back
List your pages and update frequency; if reads dominate and secrets stay server-side, ship static this week and write one line in README describing what would force a dynamic split.
Static site that outgrew static—or stayed static longer than expected? [email protected] — we like real upgrade stories.
Tell us what trigger finally moved you—or what kept you static past year one. Both outcomes teach.