Skip to content

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.md
  • Terms of Service

    https://yourapp.lanpage.co/termshttps://yourapp.lanpage.co/terms.md
  • Support

    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.md
const 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

Publish once, read it anywhere