Dev Log: From Single-Page App to Multi-Page Site, to Be Found by Search Engines
2026-06-24
dev-logseoarchitecturebuilding-in-public
This is the fourth post in the LocalPapa Notes dev-log series. The first three were about what tools we built. This one is different — it's about an architectural pivot, and the key step that finally let all those earlier tools be found.
Slick, but nobody could find it
The earliest LocalPapa was a single-page application (SPA). Every tool lived under the same URL, with JavaScript swapping the view — smooth experience, nicely "modern" engineering.
The problem: search engines could barely see it.
To Google's crawler, the whole site was one URL, one title, one description. Whether merge-PDF, MP3 editing or image compression sat underneath didn't matter — in the index they simply "didn't exist," because that content was only generated by JS after a click.
The result: we'd built a pile of genuinely useful tools, and not one of them could be discovered through search. For a tool site trying to grow on organic traffic, that's fatal.
The core decision: split one page into many
The fix sounds simple but was a full refactor: go from SPA to a multi-page site, giving every single tool its own dedicated URL.
That's where the tools/ directory came from. We turned the 8 PDF tools once crammed into the SPA into individual HTML files — merge-pdf.html, split-pdf.html, rotate-pdf.html… each a real web page a crawler can read directly.
How to split without reinventing the wheel
The danger with dozens of separate pages is copy-pasting a navbar and styles into every one — change one thing later, edit it dozens of times. So as we split, we encapsulated the shared parts:
tools-common.css: shared styles across all tool pages for visual consistency.
tools-common.js: shared toolbar, dark theme, and language-switch logic.
Each tool page holds only its own unique content and references these two files for shared behaviour. That captures the SEO benefit of separate URLs without the nightmare of maintaining dozens of duplicated copies. (The blog you're reading uses the same tools-common — multi-page, static, shared foundation; same lineage.)
Making every page introduce itself
Separate URLs aren't enough; each page has to actively tell search engines "who I am." So every tool page's <head> gained:
- A dedicated
<title> and <meta description>, written for that tool's keywords.
- Schema.org structured data (JSON-LD), marked up as
SoftwareApplication, reinforcing to Google that "this is a free browser tool."
- And a
sitemap.xml so crawlers can fully traverse every page.
In other words, each tool was upgraded from "a tab hidden inside an SPA" into a self-introducing landing page.
The homepage's role changed too
The homepage stopped being "the tool itself" and became a village of tools — a grid of tool cards with hover micro-animations. Its new job is navigation and aggregation: routing visitors (and crawlers) out to each independent tool page.
What we learned
- Good UX ≠ findable. The SPA's smoothness was real, but if search engines can't see your content, even great tools are islands. Discoverability is itself a feature.
- SEO isn't tags bolted on afterwards — it's an architectural decision. What actually makes search engines see you isn't stuffing keywords; it's the structural choice that "every piece of content gets its own URL."
- Splitting must come with encapsulation. Multi-page brings SEO; shared files (
tools-common) preserve maintainability — you do both, or neither works.
- Long-tail keywords are a tool site's nutrition. Specific searches like "merge PDF no upload" or "online MP3 trimmer" each need a dedicated landing page to catch them.
The same question, the other half
The earlier posts asked "can this be done in the browser?" This one asks its second half: once it's built, how do the people who need it find it?
The answer: turn the architecture itself into a shape search engines can read.
In the next dev log, we reach the step that lets the site sustain itself — ad monetisation and compliance. Want to follow the series? Bookmark LocalPapa Notes.