19 sites. 3 weeks. Zero burnout. Here's the playbook.
The Idea
Developer utility tools — Base64 decoders, IBAN generators, IMEI validators, JSON formatters — are the kind of thing you Google, use once, and close. But every existing option was either bloated with ads, painfully slow, or required a signup for no reason.
We thought: what if each tool was its own site, laser-focused on doing one thing perfectly?
The Stack Decision
We needed a stack that would let us ship fast without accumulating tech debt across 19 codebases.
What we picked:
- Symfony — battle-tested PHP framework. Not trendy, but rock-solid.
- FrankenPHP — modern PHP app server built on Caddy. No nginx configs, no php-fpm tuning.
- Twig — server-rendered templates. No SPA complexity for tools that don't need it.
- Vanilla JS — each tool has maybe 50-200 lines of JS. No React for a Base64 decoder.
Why not Next.js / Nuxt / etc.?
Because a UUID generator doesn't need hydration, client-side routing, or 300KB of JavaScript. Server-rendered HTML with a sprinkle of JS loads in under 1 second. That is the feature.
The Architecture
Every site follows the same pattern:
/src
/Controller → One controller per tool
/Service → Business logic (generation, validation)
/templates → Twig templates
/public
/css → Minimal, shared base styles
/js → Tool-specific scripts
Same structure, every time. New tool = copy the skeleton, write the service, style the page.
Shared Components
We extracted common patterns into a shared library:
- SEO meta tags (title, description, canonical, OG)
- Analytics snippet (Google Tag Manager)
- Responsive layout wrapper
- Footer with cross-links between tools
The Deployment Pipeline
All 19 sites run on a single VPS behind Cloudflare. FrankenPHP serves everything.
GitHub Push → GitHub Actions → Build → Deploy to VPS → Cloudflare Cache Purge
Total deployment time: ~45 seconds per site.
Domain Strategy
Exact-match domains wherever possible:
- namso.io — test credit card generator
- randomimei.com — IMEI generator
- randomiban.co — IBAN generator
- base64decode.co — Base64 encoder/decoder
Exact-match domains still carry SEO weight and build instant trust.
Speed as a Feature
Every tool follows the 3-second rule: from Google search to answer in under 3 seconds.
That means:
- Auto-focus on the primary input field
- Instant results (no "Generate" button where possible)
- No modals, popups, cookie banners, or newsletter prompts
- Page weight under 100KB
The 3-Week Timeline
| Week | What We Shipped |
|---|---|
| Week 1 | Core framework, first 5 tools, deployment pipeline |
| Week 2 | 8 more tools, SEO optimization, GTM setup |
| Week 3 | Final 6 tools, cross-linking, monitoring, launch |
The key was not designing in parallel. We built tool #1 end-to-end, then cloned the pattern. By tool #5, we could ship a new tool in under 2 hours.
What Actually Worked
- One tool per domain. SEO loves specificity. Users love simplicity.
- Server-side rendering. Fast, accessible, cacheable. No loading spinners.
- Boring tech stack. Symfony has been around for 20 years. It works. We didn't fight the framework.
- Cloudflare everything. CDN, DNS, DDoS protection, SSL — all free tier.
What We'd Do Differently
- Start content marketing earlier. We waited until all 19 were live. Should have started writing after tool #3.
- Build an API from day one. Some tools would benefit from programmatic access.
- Better monitoring upfront. We added uptime monitoring in week 3. Should have been week 1.
Results (First 3 Months)
- 19 tools live and indexed
- Organic traffic growing month-over-month
- Zero downtime (FrankenPHP is remarkably stable)
- Total server cost: one VPS
Try the Tools
All free. No signup. No API keys.
- namso.io — Test credit card numbers
- randomimei.com — Random IMEI generator
- randomiban.co — Random IBAN generator
- base64decode.co — Base64 encode/decode
Questions about the stack or deployment? Drop a comment — happy to go deeper on any part of this.
Top comments (0)