All projects
completeHTML5CSS3FastAPIJSON-LD

MoneyMate Web

Hand-written product site and Google Play legal pages for the MoneyMate app, served by its FastAPI API.

MoneyMate Web

About the project

MoneyMate Web — product site and legal surface

The product site for MoneyMate — a hand-written landing page plus the four legal and support pages that Google Play requires an app to have. It is not a template and not a framework build: the landing page is one hand-authored HTML file with inline CSS, inline SVG artwork and no JavaScript library of any kind, served straight off disk by the same FastAPI service that runs the MoneyMate API, so the marketing site and the product API share one domain, one deploy and one TLS certificate. Five pages cover the landing page, a privacy policy written to be readable rather than legally defensive, terms of service, support and troubleshooting, and an account and data deletion request flow. The illustration in the hero is not a screenshot — it is a phone mock built from live HTML and CSS, down to the status bar, balance card, budget bar and transaction rows, so it restyles itself for light and dark mode and stays sharp at any pixel density. Themes follow the OS preference and persist in localStorage, JSON-LD resolves the app entity to the Play listing and makes the FAQ eligible for rich results, social previews run from Open Graph through to Microsoft tiles, keywords cover both English and Bengali, and Google Analytics sits behind a Consent Mode v2 banner with advertising signals denied outright.

What was built

The deletion page spells out the scope and the 30-day window up front, and submissions feed an operator queue in the admin console where a human can act on them. The privacy policy is written around what each storage mode actually transmits, table by table, including the awkward parts: that uninstalling the app destroys a local-only database, and that widget data is cached by the platform outside the app's control. The shared stylesheet is versioned by query string and the version is bumped in the same commit as the CSS, or the new markup renders against an old stylesheet. The hero mock bug was caught by rendering the page in a forced light theme, and the mock now sets its own colour instead of inheriting one. Deploys are selected by tag rather than by push: CI runs on a semver tag, a webhook tells the VPS to check out the highest tag it can find, and the workflow polls the live /version endpoint until the running commit matches — a strict pipeline, because the server always resolves to the greatest version, not the newest push.

Result

Live at moneymate.texion.tech, carrying the Play Store listing, the legal surface the app store requires, and the deletion flow — shipped from the same deployment as the API it documents. Responsive from 1440px down to 390px with no horizontal scroll.

By the numbers

  • 5 pages, every one hand-written HTML
  • 0 JS frameworks, and no build step
  • 1 deploy ships the site and the API together
  • 390px narrowest layout, with no horizontal scroll

Links

Key features

  • Landing page hand-written as one HTML file with inline CSS and SVG, and no JavaScript framework or build step
  • Served by the same FastAPI service as the MoneyMate API: one domain, one deploy, one TLS certificate
  • Privacy policy, terms, support, and a web account-deletion request flow for Google Play
  • Hero phone mock built in live HTML and CSS, so it adapts to light and dark mode
  • JSON-LD for the app and FAQ rich results, Open Graph previews, and English and Bengali keywords
  • Google Analytics behind a Consent Mode v2 banner, with advertising signals denied
  • Responsive from 1440px down to 390px with no horizontal scroll

Challenges & solutions

  • Google Play requires an account-deletion route a user can complete on the web, without installing or reinstalling the app. That is more than a form: the page has to explain exactly what is erased and what is kept, what happens to data that only ever existed on the device, and the 30-day completion window. The app's other selling point is a negative claim — local-only mode never uploads a thing — and a privacy policy has to make that credible without sounding evasive. The mechanics carried their own traps: the four legal and support pages share one stylesheet served with a seven-day max-age, so any change to a shared rule is invisible to returning visitors until the cache expires; and the CSS-built phone mock in the hero set its own background but inherited its text colour from the hero, which is white — correct in dark mode, invisible white-on-white in light mode, and invisible to a developer whose desktop is always dark.