Which UK GP practices actually do shared care, bridging prescriptions and blood tests for trans patients. Dated, moderated reports from trans people. No accounts, no tracking, no adverts.
This repository also contains four independent static projects, published together by the included GitHub Pages workflow (enable Pages with source “GitHub Actions” in the repo settings): Update Everywhere, a private UK name and gender-marker change tracker; Fertility Funding Check, a postcode lookup of each English ICB’s NHS fertility rules for same-sex couples; Private Gender Clinic Compare, UK private gender services side by side on regulation, fees and shared-care prospects; and Legal Parent Check, who the law treats as a donor-conceived child’s legal parents.
pages-index.htmlis the landing page. Each has its own README.
NHS gender services have multi-year waiting lists. Most trans adults on hormones are therefore treated by a clinic far from home (NHS or private) and depend on their local GP practice to prescribe and monitor under a shared care arrangement, to issue a bridging prescription while they wait, or at minimum to do blood tests. Practices can and frequently do refuse. The answer differs practice by practice and GP by GP, and changes over time. The question “does anyone know a GP near X that does shared care?” is asked in r/transgenderUK and local groups constantly (2024, 2025 and 2026 threads all ask it), and the only lists that exist are:
None answers the specific question. This site does: practice + what was asked + which clinic + outcome + month, checked by a moderator before publishing, searchable by postcode.
/admin (HTTP Basic auth): read, redact, publish or reject. Manual by design.prefers-color-scheme, reduced-motion safe, phone-width layout.Requires Node.js 22.13 or newer (uses the built-in node:sqlite; no native modules).
npm install
ADMIN_PASSWORD=changeme node server.js
Then open http://localhost:3000 and http://localhost:3000/admin (user admin, password as set).
On Windows PowerShell: $env:ADMIN_PASSWORD='changeme'; node server.js
The practice list is committed in data/practices.json and imported into data/app.db on first start.
To refresh it from NHS open data (takes 2–4 minutes): npm run seed.
Smoke test against a running server: ADMIN_PASSWORD=changeme npm run smoke.
Seed with sourced reports so the first visitors see something: npm run seed-reports publishes 66
attributed entries for 27 practices, taken from the practices’ own published policy pages (20
practices, marked “Practice confirmed” with the source) and a private clinic’s public list. Every entry says in its
moderator note where it came from and that it is not a patient report. Edit
scripts/make-seed-reports.js to add more; the import is idempotent.
Open data feed: every published report is available at /api/reports.json (CORS enabled, CC BY 4.0)
so charities and other tools can reuse it. /sitemap.xml lists every practice page with reports.
See .env.example. Only ADMIN_PASSWORD is required (without it the moderation page is disabled and
reports pile up unpublished). Set CONTACT_EMAIL so practices and reporters can reach you.
The app is a single Node process with a SQLite file. It needs one persistent disk. Any of these work:
Fly.io (recommended, free tier is enough):
fly launch --no-deploy # keep the included fly.toml
fly volumes create data --size 1 --region lhr
fly secrets set ADMIN_PASSWORD='...' CONTACT_EMAIL='...'
fly deploy
Railway / Render: deploy from the GitHub repo with the Dockerfile, attach a volume mounted at /data,
set DATA_DIR=/data, TRUST_PROXY=1, ADMIN_PASSWORD, CONTACT_EMAIL.
A VPS: node server.js behind nginx/Caddy with HTTPS. Back up data/app.db (it is the whole site).
Custom domain: point an A/AAAA or CNAME record at the host, per the host’s instructions. Nothing in the app depends on the domain.
/admin every day or two. Publish, redact or reject. Reject anything about under-18 care.
Set NOTIFY_URL (an ntfy.sh topic such as https://ntfy.sh/your-secret-topic, or a Slack or Discord
webhook) to get a phone notification the moment a report is submitted, so nothing waits unseen.data/app.db regularly (sqlite3 data/app.db ".backup backup.db" or just copy the file).src/pages.js (guide, about) and src/html.js (labels, clinic list).server.js routes
src/db.js SQLite schema + queries (node:sqlite)
src/geo.js postcodes.io lookups, distance maths
src/html.js layout, forms, cards, label dictionaries
src/pages.js long-form content (GP said no?, About)
public/style.css the only stylesheet
scripts/seed-practices.js rebuild data/practices.json from NHS open data
scripts/smoke.js end-to-end check
data/practices.json 7,832 practices (committed); data/app.db is created at runtime (ignored)
MIT.