Dev Log: How a Free, Privacy-First Site Pays for Itself
2026-06-24
dev-logmonetizationprivacycompliancebuilding-in-public
This is the fifth post in the LocalPapa Notes dev-log series. The first four were about technology — building tools, splitting architecture, doing SEO. This one is about something fewer people are willing to lay bare: money.
Building in public isn't honest if you only show the pretty parts. So this time, let's talk about how a free site pays for itself.
Free doesn't mean free of cost
LocalPapa is free for users, and promises your files never leave your device. But "free" is for you, not for us — domains cost money, hosting costs money, and the future sync database will too.
A tool site that runs at a loss long-term has only two exits: shut down, or start doing things to its users it shouldn't (selling data, slapping on paywalls). We wanted neither. Hence v1.4.0 — introducing ads as a source of sustainable operating funds, without shaking the core promise.
State the principles first
Ads are easy to turn into "anything goes if it makes money." So we set rules before starting:
- No retreat on the privacy promise. Ads are ads; tools are tools. Your files are still processed 100% locally in the browser — having ads doesn't mean anything gets uploaded.
- Don't slow the tools down. The toolbox's "instant open" is our signature; it can't be sacrificed for ads.
- Compliance isn't optional. If you're going to serve ads, do the legal homework all at once — not "ship first, deal with it later."
Three things you must get right
Wiring up Google AdSense isn't just pasting a script. Three pieces of foundation sit behind it:
1. ads.txt — proving "these ad slots are authorised by me" A root-level ads.txt declares, via the publisher ID and Google's certification, which ad sources we've authorised. This keeps ad traffic from being flagged as unauthorised or invalid — the standard anti-fraud practice in the ad ecosystem.
2. CSP — let ads run without breaking the security line This is the trickiest part. LocalPapa runs a strict Content Security Policy (CSP) to prevent XSS. But AdSense and DoubleClick inject third-party iframes and analytics code when loading ads, which our CSP blocks by default.
The fix is a precise allowlist: permit only Google's officially-authorised domains (googlesyndication.com, doubleclick.net, etc.) in script-src, frame-src and connect-src — rather than loosening the policy wholesale. Open only the necessary gaps in the security line; don't tear it down.
3. Async loading — ads are slow; tools mustn't be The ad script always loads async, so it doesn't fight the browser's main thread while parsing the page. Ads can take their time; tools still open instantly.
Don't forget the privacy policy itself
Ads use cookies for personalised delivery, which carries clear disclosure obligations under GDPR (EU) and CCPA (California). So we updated the multilingual privacy policy pages in step, spelling out the AdSense-related statements — so visitors in every region get complete, compliant disclosure.
A little ironic, and entirely fitting: a privacy-first site has to hold itself to a higher standard, not a lower one, when it comes to honestly disclosing how data is used.
What we learned
- Sustainability is itself a responsibility to users. Only a site that survives can keep guarding that privacy promise long-term. You can't dodge the money question; you can only face it.
- Monetisation and values aren't either/or. The key is drawing the line: ads touch the layout, never your files.
- Compliance is engineering, not legal prose.
ads.txt, CSP allowlists, async, privacy policy — each is concrete work that lands in code and config.
- Building in public means publishing the bills too. Talking only about features and never costs isn't real transparency.
The same question, made real
Earlier posts asked "can this be done in the browser?" and "how do people find it?" This one asks the most practical one of all: how does all of this last?
The answer: keep the site alive honestly, without selling out the people who use it.
In the next dev log, we head back to the tools themselves — real-time data streaming from phone sensors. Want to follow the series? Bookmark LocalPapa Notes.