The donation page and the policy pages the app stores require. Plain static HTML: no build step, no framework, no dependencies. Upload the folder and it works.
| File | Served at | Why it exists |
|---|---|---|
index.html |
/ |
Donation page — QR, UPI ID, where the money goes |
privacy-policy.html |
/privacy-policy |
Required by both stores |
delete-account.html |
/delete-account |
Required by Google Play for any app with accounts |
support.html |
/support |
Required by Apple (Support URL in App Store Connect) |
terms.html |
/terms |
Terms of Service / EULA |
community-guidelines.html |
/community-guidelines |
Required in substance for user-generated content (Apple 1.2, Play UGC) |
child-safety.html |
/child-safety |
Required by Google Play Child Safety Standards, because the app has chat |
404.html |
any unknown path |
Plus robots.txt, sitemap.xml, and host config in netlify.toml /
vercel.json / _redirects.
This is the important one.
- The typed UPI ID, the Copy button and the Open UPI app button all
read from one place: the
PAYMENTobject near the top ofindex.html. It is currentlyonemessage@axl. - The QR image (
assets/upi-qr.png) is a separate file. Decoding it givesupi://pay?pa=9632716392@axl&pn=******6392.
So a donor who scans pays 9632716392@axl, and a donor who types pays
onemessage@axl. Fix one or the other before going live:
- If
onemessage@axlis correct, replaceassets/upi-qr.pngwith the QR for that account (export it from the app that issued the handle). - If the PhonePe QR is correct, change
upiIdinindex.htmlto9632716392@axl.
Then confirm with a ₹1 test payment both ways.
Everything assumes https://onemessage.app, because that is what the app
already links to:
frontend/src/app/(auth)/register.js → PRIVACY_POLICY_URL = 'https://onemessage.app/privacy-policy'
If you deploy somewhere else, update the domain in sitemap.xml, robots.txt
and the <link rel="canonical"> / og:url tags:
grep -rl "onemessage.app" . | xargs sed -i 's|https://onemessage.app|https://YOUR-DOMAIN|g'…and update PRIVACY_POLICY_URL in the app to match.
onemessagedev@gmail.com appears on the support, privacy, terms,
delete-account and child-safety pages. If you would rather publish a dedicated
address, change it everywhere at once:
grep -rl "onemessagedev@gmail.com" . | xargs sed -i 's|onemessagedev@gmail.com|support@onemessage.app|g'Whatever you choose must be an address someone actually reads — app reviewers do email it, and the child-safety page commits to prioritising reports sent there.
The app links to /privacy-policy with no .html. Netlify, Vercel,
Cloudflare Pages and GitHub Pages all serve privacy-policy.html at that path
automatically. If you use a plain nginx or Apache host, enable it yourself:
# nginx
location / { try_files $uri $uri.html $uri/ =404; }# Apache — .htaccess
RewriteEngine On
RewriteCond %{REQUEST_FILENAME}.html -f
RewriteRule ^(.*)$ $1.html [L]Internal links deliberately keep the .html suffix so you can open the folder
straight off disk to preview it. The <link rel="canonical"> on each page
points at the clean URL, which is what search engines index.
Netlify — drag the folder onto https://app.netlify.com/drop, or:
npx netlify-cli deploy --prod --dir .Vercel
npx vercel --prodCloudflare Pages — connect the repo, build command empty, output directory .
GitHub Pages — push to a repo, Settings → Pages → deploy from branch root.
.nojekyll is already there so the _redirects file is not swallowed.
Then point your domain at it and make sure HTTPS is on. Both stores reject a policy URL that is not reachable over HTTPS.
Google Play Console
- Policy → App content → Privacy policy:
https://onemessage.app/privacy-policy - Policy → App content → Data safety → deletion URL:
https://onemessage.app/delete-account - Policy → App content → Child safety standards:
https://onemessage.app/child-safety - Store listing → Contact details: the email above, plus
https://onemessage.app/support
App Store Connect
- App Privacy → Privacy Policy URL:
https://onemessage.app/privacy-policy - App Information → Support URL:
https://onemessage.app/support - App Information → Marketing URL (optional):
https://onemessage.app/ - App Information → License Agreement: Apple's standard EULA, or paste
terms.html
python -m http.server 8000Then open http://127.0.0.1:8000.
scripts/ is intentionally absent — there is nothing to build. But the site was
verified with a link/structure checker before shipping. To re-run that idea
quickly:
- every internal
hrefandsrcresolves to a real file - one
<h1>per page, tags balanced,langset - every page has title, description, viewport, canonical and favicon
- every page is linked from the footer and listed in
sitemap.xml