Inside your app too
Documents as Markdown
Every document you publish also answers as plain Markdown. Fetch it from your app and the Privacy or Terms screen shows what is published, at the moment it is opened.
On every plan, including Free.
Why this exists
You cannot ship an app update to fix a privacy policy. Review takes days, so text bundled into the binary starts ageing the moment a rule changes — and correcting a sentence costs a release. That is the same duplicate this product exists to remove everywhere else: one source, and nothing derived from it going stale on its own.
How it works
Take the address you already give the stores and add .md. Nothing to configure, no key to manage.
Privacy Policy
https://yourapp.lanpage.co/privacyhttps://yourapp.lanpage.co/privacy.mdTerms of Service
https://yourapp.lanpage.co/termshttps://yourapp.lanpage.co/terms.mdSupport
https://yourapp.lanpage.co/supporthttps://yourapp.lanpage.co/support.md
Additional languages keep their prefix, exactly as the page does. https://yourapp.lanpage.co/es/privacy.md
Reading it
It is a plain GET with no authentication: the document is public, and so is this. Render it with whatever Markdown view your platform already has.
curl https://yourapp.lanpage.co/privacy.mdconst response = await fetch('https://yourapp.lanpage.co/privacy.md')
const markdown = await response.text()
// Keep it for next time, and for the times there is no network.
await cache.write("privacy", markdown)What comes back
The Markdown source, served as text/markdown, with the details your app needs to decide whether anything changed.
- Last-Modified
- When this version was last written.
- X-Effective-Date
- The date shown on the published page, when one is set.
- Content-Language
- The language actually served, which may be your default if the one asked for has no translation.
- ETag
- Changes when this document is published again, and a request carrying it back gets a 304 with no body.
Raw HTML is removed before it is served. Everything we publish goes through an allowlist first, and you are the one rendering this — most likely in a web view — so the cleaning happens here rather than not at all.
What answers, and what does not
- Only published documents. A draft is not a public address, here or anywhere else.
- A document you hid stops answering in .md at the same moment it stops answering as a page.
- Only the languages your plan serves. Free serves your default language, so that is what .md returns.
- app-ads.txt has no .md: it is already plain text at its own address.
- Not indexed by search engines. It is the same content as the page, and it must not compete with it.
Cache it, and ship a fallback
Reading at runtime puts our availability in front of a screen your users open. Keep the last copy you fetched, and ship one in the binary for the very first launch. Then a network that is not there costs nothing, and the document still updates itself the next time it can.
Which plans
All of them, Free included. The same content is already public as a web page, so putting the Markdown behind a paywall would protect nothing and only charge the people who did not want to strip HTML tags themselves.
Compare every plan side by side