DEV Community

David
David

Posted on

How We Built 19 Developer Tools in 3 Weeks

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Total deployment time: ~45 seconds per site.

Domain Strategy

Exact-match domains wherever possible:

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

  1. One tool per domain. SEO loves specificity. Users love simplicity.
  2. Server-side rendering. Fast, accessible, cacheable. No loading spinners.
  3. Boring tech stack. Symfony has been around for 20 years. It works. We didn't fight the framework.
  4. 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.


Questions about the stack or deployment? Drop a comment — happy to go deeper on any part of this.

Top comments (0)