WallpaperMachine
The wallpapers you love. A new home on your Mac.
Drive from A to B with live routes, voice directions and road reports from other drivers.
LifestyleJavaScript · CSSGitHub @thaqif0709OnlineOwner 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
Free, open source Waze-style navigation for Malaysia, in your browser
Taken from the repository README
Loading the full README.
Read the full README ↗Free, open source driving navigation for Malaysia, in your browser.
Search a place, pick a route, and get spoken turn-by-turn directions, with road reports from the drivers around you.
[!NOTE] A2B is a beta, built in public by one person with an AI coding assistant. It runs on free servers, so it takes 50 drivers at a time (accounts get priority). Feedback and bug reports are very welcome.
Open a2b-beta.pages.dev on your phone. To use it like an app:
Keep the screen on while you drive (A2B keeps it awake). Only use it when it's safe and legal.
| Feature | What it does |
|---|---|
| 🔎 Search | Places from OpenStreetMap plus shops from Overture Maps, searched near you. Landmarks come first, and paste coordinates (3.15, 101.71) to go anywhere. Search a kind of place in English or Malay ("petrol", "stesen minyak", "hospital", "klinik", "balai polis", "convenience store", "ev charger", "pengecas", "petrol near klcc") for the nearest ones. Places you pick are kept as your search history, on the phone without an account (Clear wipes it). Can't find a place, or it's in the wrong spot? With an account, add it or fix it by moving the map under a pin; once a tester approves it, every phone finds it (and the driver gets 10 points). |
| ⛽ On the map | Petrol stations, EV chargers, hospitals, clinics and convenience stores show on the map when zoomed in. Tap one, or any station (LRT, MRT, KTM, monorail), bus stop, car park or landmark the map shows, named or not, for routes there. |
| 🛣️ Routes | Up to three routes with drive time in live traffic (jams coloured on the line), arrival, tolls and reported traffic. Tap a route on the map to pick it; the chosen one starts by itself after 8 seconds. |
| ⚡ Faster route found | While you drive, A2B looks again now and then; when another way is clearly quicker (5+ minutes and 10%), it offers it on a card and says so. Switch or keep, or it goes away by itself. |
| 🏍️ Motorbike | Switch the route options to Motorbike for routes a motorcycle can take, with the same cameras, limits and reports, and no toll to pay at plazas that are free for motorcycles. While riding, your position shows as a motorbike and rider in your colour. |
| 🟩 Exit signs | Expressway exits show their overhead sign on the turn banner, green as on the road: the exit number, the road it leads onto and where it goes ("EXIT 218 · 241 · Seremban / Labu"), and the voice names them too. |
| 🚶 Walking | Switch the route options to Walk for footpaths and pedestrian crossings, with the same spoken directions. |
| 🚆 By train | Switch a route to Train for trips on the LRT, MRT, Monorail, BRT and KTM Komuter: the walk to the station, which line (in its colour) and which way, how often trains run, where to change and the walk at the end, drawn on the map. Live departure times open in Google Maps. |
| 🚇 Train guidance | Start a train trip to be guided through it: the walk to the station, which train, the next station as you go (estimated from the timetable underground, where GPS drops out), "Next stop: Masjid Jamek. Get off here." with a buzz, and where to change. A 3D train in the line's colour shows where you are on the line. Works while A2B is open on screen. |
| 🗣️ Turn by turn | Spoken directions, the next turn and the one after, lane guidance, roundabout exits, a turn arrow on the map, and rerouting when you go off route. |
| 🚇 Tunnel mode | When the GPS drops out in a tunnel (SMART Tunnel, Penchala Link, KL's underpasses) or anywhere while moving, the car keeps going along the route at its last speed, so the next turn still comes. "No GPS · Estimating" shows until the signal is back, for up to 90 s or 2.5 km. |
| 🏫 School zones | At school times (6:30–7:45, 12:30–2:30, 5:45–6:45 on school days, Sunday to Thursday in Kedah, Kelantan and Terengganu), "School zone ahead. Slow down to 30." about 300 m before each school on the route, with a "30 km/h zone" chip and a pin on the school until you're past. School holidays aren't known, so it still warns on those days. |
| 📸 Speed cameras | Fixed AES and AWAS cameras on your route, with a voice warning and the limit about 800 m before each. |
| 💰 Tolls | Toll plazas along the route, with the car price and ways to pay (Touch 'n Go, RFID, SmartTAG) where mapped. |
| ⛽ Fuel cost | Roughly what each route costs in petrol or diesel at this week's official pump price, for the fuel and car size set in Settings, next to its tolls. |
| ☕ R&R ahead | On long drives, the next R&R on your side of the road shows about 3 km before it; after two hours without a break, the next one is suggested out loud. Tap to stop there. |
| 🅿️ Parking | Car parks near your destination, paid or free, with type and spaces. Pick one and the drive reroutes there. Or search "parking", "parking klcc" or "letak kereta pavilion". |
| 🌦️ Weather and rest | Whether it may rain when you arrive or on the way, at the time you'll be there, with MET Malaysia's warnings and short tips (an umbrella or raincoat, darker clothes, a jacket for the highlands, light sleeves when it's humid). A tip to rest every 2 hours on long or night drives, a spoken reminder after each 2 hours at the wheel, and a voice heads-up a few km before possible heavy rain. |
| 🚧 Roadworks | Routes avoid roads that look to be still under construction, and roads drivers report as closed. |
| 🚓 Reports | Traffic, police, crashes, hazards, blocked lanes, closures and cameras, with voice alerts ahead and "still there?" checks after. |
| 🚗 Your car | A 3D chevron or car in the colour you like, a speedometer that turns red over the limit, and the road you've driven greyed out. |
| 🌙 Day and night | Map themes that switch automatically in the evening. |
| 🗺️ Offline maps | The map along your route is saved when a drive starts, so tunnels and dead spots show map, not blank. Rerouting still needs signal. |
| 📍 Share your drive | A link that shows your car, route and ETA live in any browser, no app or account needed. |
| ⭐ Accounts | Home, Work and saved places on every device, points for helpful reports, and a top drivers board. Browsing and driving work without one. |
You need Node.js 22.20 or newer. No accounts or API keys are needed.
npm install
npm run dev # http://localhost:8787, with its own local database
npm test # unit and API tests, no network needed
Browsers only share GPS with https:// or localhost pages, so to drive with it, deploy your own copy (below).
CONTRIBUTING.md covers the optional extras, such as demo drives and building the shop data.
npx wrangler login.npx wrangler d1 create a2b, and put the database_id it prints into wrangler.toml
in place of the one there.npm run deploy. You'll get a URL like https://a2b.<you>.workers.dev.The database tables are created on the first request (or run npm run db:migrate:remote). Other settings in
wrangler.toml:
MAX_ACTIVE and MAX_GUESTS: how many devices can use the app at once, and how many of those can be guests.WEATHERKIT_TEAM_ID (your Apple team id), WEATHERKIT_SERVICE_ID (a Services
ID with WeatherKit turned on), WEATHERKIT_KEY_ID and WEATHERKIT_KEY (the id and contents of a .p8 key with
WeatherKit enabled, from Certificates, Identifiers & Profiles). Set each with npx wrangler secret put. Without
them, the weather comes from MET Malaysia.TESTER_EMAILS (a secret: npx wrangler secret put TESTER_EMAILS): accounts that get the testing tools and the
usage dashboard.OCM_KEY (a secret, optional): an Open Charge Map API key, free, for
more EV chargers than OpenStreetMap has.To use your own domain, add it under Workers & Pages → a2b → Settings → Domains & Routes.
Updating MapLibre and three.js. The map library (MapLibre GL JS) and the 3D vehicle
library (three.js) are served from public/vendor/<name>-<version>/, not from a CDN, so a
network that blocks or stalls the CDN can't stop the app from opening. They don't update by themselves. To move to
a new version:
Download the new files from npm, which checks them against the registry's checksums:
npm pack maplibre-gl@<version> # and/or three@<version>
tar -xzf maplibre-gl-<version>.tgz
Copy them into a new folder named <name>-<version> (not <name>@<version>: Cloudflare redirects @ to %40,
an extra round trip for every file), with the licence, and delete the old folder:
package/dist/maplibre-gl.js, package/dist/maplibre-gl.css and package/LICENSE.txt into
public/vendor/maplibre-gl-<version>/package/build/three.module.js and package/LICENSE (as LICENSE.txt) into
public/vendor/three-<version>/Change the version in every place that names it:
<link> and <script> in public/index.html, and MAPLIBRE in public/sw.jsTHREE_URL in public/vehicle3d.js, and VENDOR in public/sw.jsBump CACHE in public/sw.js (e.g. a2b-v41 → a2b-v42), so phones pick up the new files and drop the old ones.
Check the release notes for breaking changes, run npm test, try the map, a route and a drive in a browser,
then deploy as usual.
Never point the app back at a CDN URL: the Content-Security-Policy in public/_headers only allows the app's own
scripts, so a CDN script is blocked.
Everything A2B uses is free and needs no key:
| What | Source | Notes |
|---|---|---|
| Map tiles | OpenFreeMap | Map looks are in public/map-themes.js. |
| Routing, speed limits, toll booths | Valhalla public server (ROUTING_URL) | Community-run, fair use. |
| Search | Photon (GEOCODER_URL) | Community-run, fair use. |
| Live traffic (optional) | TomTom Routing API (TOMTOM_KEY secret) | Times each route with today's traffic; free up to a monthly quota. Without a key, routes use typical speeds. Answers aren't stored. |
| House addresses (optional) | TomTom Geocoding API (same TOMTOM_KEY, with the Search API enabled) | Asked only for a search that looks like an address ("129, BK 5/6, Puchong") that Photon and the shop files don't have, at most ADDRESS_LOOKUPS_PER_DAY (600) a day. Answers aren't stored. |
| Weather (optional) | Apple WeatherKit REST API (WEATHERKIT_* secrets, below) | Hourly forecasts for the exact spot; included with an Apple Developer Program membership (500,000 calls a month). Each ~11 km square is fetched at most once an hour. |
| Weather | MET Malaysia open data | 7-day forecasts for ~420 towns and live warnings. Used without WeatherKit, or when it fails; fetched once an hour for the whole country. Town positions are in src/lib/met-towns.json (npm run met-towns). |
| Humidity at the destination | MET Norway Locationforecast |
The community servers ask for fair use, which is why the beta caps how many people use it at once. For more
traffic, point ROUTING_URL and GEOCODER_URL at your own Valhalla and
Photon servers, or a hosted provider such as Stadia Maps.
Overture publishes new data monthly (calendar). Rebuild with:
pip install duckdb
npm run places # shop search data (not kept in git)
npm run construction # roads under construction
npm run deploy
For the live app, a scheduled Claude Code session checks for a new release each month
(node scripts/overture-release.mjs) and updates the data.
A plain web app (no build step, ES modules) served by a Cloudflare Worker with a D1 (SQLite) database.
public/ the web app
index.html every screen
styles.css day and night themes, phone and desktop layouts
app.js map, search, routes, driving, reports, parking, shared drives
panels.js menu, sign in, settings, saved places, leaderboard, usage dashboard
core.js state, API client, settings, saved places
nav.js turn-by-turn engine: GPS snapping, next turn, ETA, voice cues, off route
motion.js smooth car movement between GPS fixes
vehicle3d.js the 3D chevron and car (three.js)
voice.js spoken directions in the Daniel voice (or the phone's best English one)
places.js, text.js shop search on the phone, and text matching
map-themes.js map colours for day and night
presence.js keeping a spot, and the waiting screen when it's full
welcome.js launch splash and first-visit welcome
i18n.js, i18n-*.js the app's languages: tr() looks a message up by its English; each language's words in its own file
update.js noticing a newer version: quiet refresh, or a small "New version ready" pill
follow.js watching a shared drive
sheet-drag.js bottom sheets that follow the finger
geo.js, icons.js maths, formatting, turn arrows and pins
report-types.js report types, lifetimes and points (shared with the server)
sw.js, manifest installable app, offline shell
vendor/ MapLibre GL JS and three.js, served from our own domain (see "Updating MapLibre and three.js")
src/
worker.js the API
lib/providers.js search (Photon) and routing (Valhalla), speed limits, reports along a route
lib/construction.js spotting roads that are probably still being built
lib/traffic.js live traffic for a route (TomTom)
lib/weather.js the weather along a route (WeatherKit, MET Malaysia, MET Norway)
lib/shared-cache.js outside services' answers shared by every driver (memory and D1)
lib/transit.js trips by train (LRT, MRT, Monorail, BRT, KTM Komuter)
lib/cameras.js fixed speed cameras along a route
lib/tolls.js toll plazas and their prices
lib/parking.js car parks near a destination
lib/reports.js reports, merging, votes, expiry, closures
lib/presence.js the cap on drivers at once
lib/usage.js usage numbers for the owner's dashboard
lib/auth.js password hashes and sessions
lib/schema.js database tables (kept in step with migrations/)
scripts/ building the Overture data, app icons
test/ node --test: the navigation engine and the whole API on an in-memory database
API
| Area | Endpoints |
|---|---|
| Accounts | POST /api/auth/signup, /login, /logout · GET, PATCH, DELETE /api/me |
| Saved places | GET, POST /api/places · PATCH, DELETE /api/places/:id · POST /api/places/import |
| Search and routes | GET /api/search · GET /api/reverse · POST /api/route · GET /api/parking |
| Reports | GET, POST /api/reports · POST /api/reports/:id/vote · GET /api/leaderboard |
| Shared drives | POST /api/trips · GET, PATCH /api/trips/:token |
| App | GET /api/health · POST /api/presence · GET /api/stats (testers only) |
Security
public/_headers.Ideas, bug reports and pull requests are welcome. CONTRIBUTING.md explains how to run A2B, test a change and send it in. Code contributions need the Contributor License Agreement: you keep your copyright, and A2B stays open source.
A2B was created by Thaqif Syarafuddin bin Roslan. Copyright © 2026 Thaqif Syarafuddin bin Roslan and the A2B contributors.
A2B is free software under the GNU Affero General Public License v3.0 or later, with the additional terms in NOTICE. You can use, study, change and share it. If you run a changed version for other people, over the internet included, you must offer them its source code under the same licence, and:
Map data © OpenStreetMap contributors (ODbL). Places and roads under
construction from the Overture Maps Foundation (see public/places/NOTICE.txt once built).
Map drawn with MapLibre GL JS (BSD 3-Clause) and the 3D vehicle with three.js
(MIT); their licences are in public/vendor/.
Map tiles by OpenFreeMap, routing by Valhalla,
search by Photon, live traffic and house addresses by TomTom. Train
timetables from Prasarana and KTMB through data.gov.my (CC BY 4.0). Weather
forecasts and warnings from MET Malaysia through data.gov.my (CC BY
4.0), humidity from MET Norway (CC BY 4.0), and from
Apple Weather when WeatherKit is set up.
Pick your final destination, then use Add a stop on the route preview or in Trip options while driving. Up to three intermediate stops can be added. Adding a stop asks the existing Valhalla routing service for the best road-based order, keeping the start and final destination fixed. Regular reroutes preserve that order. Each stop has its own Remove button; a failed addition keeps the previous route. Train trips do not support intermediate stops.
Each intermediate stop shows its remaining route distance and estimated arrival time. These values are calculated locally from the loaded route geometry, maneuver times, existing delay estimate and current navigation progress, with no additional API requests. They exclude time spent at intermediate stops. Long stop names use two lines; tap a name to view it in full.
| Free, also for commercial use, with credit. Only when the forecast has no humidity (MET Malaysia's doesn't), for what-to-wear tips. Each ~11 km square at most once an hour. |
| Rapid KL bus timetables | data.gov.my GTFS (Prasarana, CC BY 4.0) | Built with npm run transit:bus into src/lib/bus-transit-data.json. Ride journeys can combine buses and trains, with walks between stops and stations up to 400 m apart. The existing planner counts transfer walking, boarding time and timetable waits; real walking routes are checked within the shared three-request budget. Rebuild before the feed expires. |
| Train timetables (LRT, MRT, Monorail, BRT, KTM Komuter) | data.gov.my GTFS (Prasarana, KTMB) | Built with npm run transit into src/lib/transit-data.json, kept in git. Each feed runs to an end date the build prints; rebuild before then. Walks to and from stations use the routing server's walking routes. |
| Toll plaza and car park details | OpenStreetMap API | Looked up once and cached. |
| Shops and places | Overture Maps | Built into small files the phone searches (npm run places), by name and by street. |
| Places drivers added or fixed | A2B drivers, approved by a tester | Kept in the database; phones download what changed since they last asked. |
| Roads under construction | Overture Maps (OpenStreetMap roads) | Built with npm run construction, kept in git. |
| Fixed speed cameras (AES, AWAS) | OpenStreetMap, found through Photon | Built with npm run cameras into public/cameras.json, kept in git. |
| Pump prices | data.gov.my (weekly, CC BY 4.0) | Asked for a few times a day at most, for the fuel cost on routes. |
| R&Rs and lay-bys | OpenStreetMap, through the Overpass API | Built with npm run rest-stops into public/rest-stops.json, kept in git. |
| Schools | OpenStreetMap, through the Overpass API | Built with npm run schools into public/schools.json (kindergartens, tuition centres and colleges left out), kept in git. |
| EV chargers | OpenStreetMap (Overpass API), Open Charge Map (OCM_KEY secret, optional), Overture Maps | Kept in the database and refreshed weekly by the nightly job (the first list arrives with its first run after deploying). Open Charge Map's openly licensed chargers (CC BY-SA 4.0) are added when a free key is set (npx wrangler secret put OCM_KEY). |