Easy-to-manage touch screens
Free, open-source touch screens. Guided USB setup, a drag-and-drop editor and local control. Made for Home Assistant.
Enter your commute destination, salary and lifestyle to find the best London neighbourhoods for you.
LifestyleTypeScript · JavaScriptGitHub @zachhaggar15-coderOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Loading the full README. The saved excerpt is shown below.
A neighbourhood decision engine for people moving to London. CommuteTimeMap shows where you can get to in N minutes — this app tells you which neighbourhoods inside that area you should consider living in.
Read STRATEGY.md first — it explains the product framing, architecture, and staged roadmap. This README only covers running the code.Read the full README ↗A neighbourhood decision engine for people moving to London. CommuteTimeMap shows where you can get to in N minutes — this app tells you which neighbourhoods inside that area you should consider living in.
Read
STRATEGY.mdfirst — it explains the product framing, architecture, and staged roadmap. This README only covers running the code.
A working Next.js + TypeScript + MapLibre app with:
The default commute provider uses a reviewed static matrix plus clearly labelled distance estimates, so the public site stays fast and does not overwhelm TfL's Journey Planner. TfL routing remains an opt-in deployment setting. Rent values are static neighbourhood-level estimates reviewed for discovery use, with room values derived from listing-sample regional averages and the same base rent model.
# 1. Install dependencies
npm install
# 2. (Optional) Get a MapTiler API key for nicer map tiles
# Sign up free at https://www.maptiler.com/cloud/
# Then:
cp .env.local.example .env.local
# Edit .env.local and paste your key into NEXT_PUBLIC_MAPTILER_KEY.
# You CAN skip this — the app falls back to a no-key demo style.
# 3. Run the dev server
npm run dev
# 4. Open http://localhost:3000
[User inputs] ─┐
▼
lib/store.ts (Zustand)
│
├──▶ ControlPanel (left)
├──▶ NeighbourhoodList (left)
├──▶ Map (right)
└──▶ DetailDrawer (bottom)
lib/data/neighbourhoods.ts ──┐
lib/data/destinations.ts ────┤
▼
lib/scoring.ts
lib/commute.ts (RoutingProvider)
lib/affordability.ts
For the full architecture rationale, see STRATEGY.md §3.
This app is public-transport-first. Driving estimates are intentionally not supported.
By default, /api/commute uses the reviewed static matrix and a distance-based estimate so every neighbourhood receives a fast result with a visible source. Set ROUTING_PROVIDER=tfl to opt into live Journey Planner calls; individual failures still fall back to the same estimate model. Route summaries distinguish access, public transport, interchange and final walk, and do not invent exact line-by-line instructions where the system lacks reliable route legs. The sampled isochrone combines neighbourhood results with a network-free grid, which keeps the visual shape aligned with the ranking without creating hundreds of public API requests per visit.
For an isolated local preview, npm run dev:static starts Next on port 3001 with the same network-free routing provider.
The map renders official London borough boundaries from ONS Local Authority Districts May 2024 ultra-generalised clipped boundaries. Borough search highlights the selected borough boundary on the satellite map.
Neighbourhoods use launch footprints from lib/data/polygons.ts. If a neighbourhood later gets a hand-drawn or LSOA-derived Neighbourhood.polygon, the map will use that explicit geometry first.
Rent assumptions are centralised in lib/data/rent-market.ts, with the review workflow in docs/rent-data-maintenance.md.
The optional GA4 product funnel and the human-reviewed shortlist request flow
are both disabled by default. Their environment variables, privacy constraints,
event names, test procedure, launch gate, and weekly checks are documented in
docs/measurement-and-shortlist-experiment.md.
The shortlist flow intentionally has no checkout or payment collection. Do not
enable it until a private receiver is configured and the production hosting
plan permits commercial use. Referral providers in lib/monetisation.ts also
remain inactive until a provider and disclosure have been approved.
npm install convexnpx convex dev — it prints a deployment URL.NEXT_PUBLIC_CONVEX_URL in .env.local.convex/schema.ts. See convex/README.md for next steps.app/ Next.js App Router pages and API routes
components/ React components (Map, ControlPanel, etc.)
lib/ Domain logic — types, data, scoring, commute, affordability
lib/data/ Source-backed launch data (neighbourhoods, destinations)
convex/ Inactive until Stage 4
STRATEGY.md Product spec, architecture, roadmap. READ FIRST.
The cleanest path is Vercel:
AdSense has rejected this site three times for "Low value content", each time because of pages generated from one template. Before ticking "I confirm I have fixed the issues":
npm run build, then npx next start -p 3210), and run npm run audit:content -- http://localhost:3210. It must exit cleanly: no sitemap cluster over 60% shared text, no page under 200 words of its own, no internal link that redirects or 404s.lib/published-city-sections.json until their pages carry writing of their own.This project is structured to be readable end-to-end. If a file is confusing, search for it in STRATEGY.md — most architectural choices are explained there with their rationale. When in doubt, start at app/page.tsx and follow the imports.