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.
A live map showing every Metra train in Chicago on a clean schematic diagram, with real GPS positions, service alerts, routes, light and dark modes, and mobile‑friendly design. Provided as a single HTML file plus a Cloudflare Worker.
AI translation
Live map of every Metra train in Chicago on a clean schematic diagram. Real GPS positions, service alerts, trails, light/dark mode, mobile-friendly. One HTML file + a Cloudflare Worker.
LifestyleHTML · JavaScriptGitHub @evan-dawkinsOnlineOwner 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.
MetraBot is a live map of every Metra train in Chicagoland, moving in real time on a clean diagram of the whole system.
It's built to sit on a second monitor like an aquarium: calm, quiet, and fun to glance at. It works just as well on your phone.
Screenshots on this page use sample data.Read the full README ↗MetraBot is a live map of every Metra train in Chicagoland, moving in real time on a clean diagram of the whole system.
It's built to sit on a second monitor like an aquarium: calm, quiet, and fun to glance at. It works just as well on your phone.
Open it: https://evan-dawkins.github.io/metrabot/
Screenshots on this page use sample data.
New here? Click ? next to the title any time for a quick guide.
| To do this | On a computer | On a phone |
|---|---|---|
| Move the map | Drag | Drag with one finger |
| Zoom | Scroll, or + / − | Pinch |
| See the whole network | ⛶ button, or 0 | ⛶ button |
| Visit CTABot | Point at ‹ by the zoom buttons | Tap ‹ by the zoom buttons |
| Show just one line | Click it in the bottom bar | Tap it in the bottom bar |
| Fold the line bar | Click All lines | Tap All lines |
| Close a card | Esc, or click the map | Tap the map |
Keyboard shortcuts:
Click a train to see:
Press Follow to ride along behind it. The map turns so the train points up and tilts back in 3D. Close the card to glide back to the whole network.
Click a station to see the next trains To Chicago and Away from Chicago, with minutes until they arrive. Both directions always show, even when one has nothing coming yet.
Tap ☆ to pin the station to your board on the right. On a phone, your stations sit in a strip at the bottom.
Ogilvie, Union Station, LaSalle St and Millennium show a departure board instead: every train leaving in the next 3 hours, with a countdown, even before the train has shown up.
Each departure has a status:
A line of text drifts slowly across the top bar, describing what's happening on the rails right now. It reads the live map and compares it with Metra's timetable, so it can tell more than the time of day:
It shows a new line every 10 minutes, or right away when something changes. If the live data drops, it falls back to lines based on the time of day.
The bar-chart button next to the title opens today's report card: the share of trains that finished on time, line by line, plus the latest train of the day.
A train counts as on time if it reaches its last stop within 6 minutes of the timetable, Metra's own rule. The card keeps counting all day, even when nobody has the page open, and starts fresh at 3 AM.
If live data was missing for a while, the card says so, and trains timed by GPS instead are noted.
Leave the page alone for 2 minutes (20 seconds on a phone) and it turns into a screensaver:
It keeps going until you close the train's card with ×. Moving the mouse, scrolling or pressing keys won't stop it. On phones the map turns but doesn't tilt. If your device is set to reduce motion, the screensaver stays off.
Like a weather stream checking in on a live camera, the voice checks in three times per ride:
| When | What it says |
|---|---|
| The ride starts | Which line and direction, how it's running, and the next stop. "Checking in on an inbound Union Pacific North train. It's running about two minutes behind. Next up, Ravenswood, in about three minutes." |
| Halfway | Where it just was and where it ends up. "Just passed Rogers Park. The last stop is Ogilvie, in about fifteen minutes." |
| The ride ends | A short sign-off. "That's the check-in. Back out to the full map." |
The voice is free: every phrase was recorded once ahead of time with Kokoro, an open-source voice, and the page stitches the pieces together.
Click the speaker next to the title to pick one:
| Sound | What it is |
|---|---|
| Brown noise | A soft, steady hush. |
| Water | Soft bubbles over a quiet, low murmur of water. |
| Sonar | A deep underwater rumble. A radar sweeps the map once every 30 seconds and gives a soft, low ping when fresh train data arrives. |
| Off | Silence. |
| Train check-ins | A separate on/off switch at the bottom of the menu for the voice that checks in during train of the moment. See above. |
The page remembers your pick. Sound starts after your first click, because browsers don't allow it before that. On iPhone and iPad, the silent switch mutes it.
Click the train button next to the title, or press C, to swap the arrows for little trains. They look like model trains seen from above, in their line's color, and sway gently while they're moving.
Open the same link on your phone. Everything works there, sized for one hand:
Turn your phone sideways and cards move to the left side, so the map stays open on the right.
Tip: add it to your home screen (Safari: Share → Add to Home Screen; Chrome: ⋮ → Add to Home screen) and it opens like an app.
Click the sun button, or press T.
CTABot is the same kind of live map for the CTA 'L'.
A small ‹ beside the zoom buttons links to it. Point at it and "Like this? Try CTABot →" slides out; move away and it folds back. On a phone, tap it.
Yes. Train positions, times, alerts and cancellations come straight from Metra's live feeds, and scheduled times come from Metra's published timetable. Nothing is guessed.
If Metra doesn't have a time for something, the map says so instead of inventing one. If the live data can't load, you can choose to watch pretend trains, and they're clearly labeled "Simulated".
worker.js) fetches it, turns it into something readable, and keeps the Metra key secret. Visitors share its answers, so Metra is only asked about every 25 seconds no matter how many people are watching.index.html) asks that program for fresh data every 30 seconds and draws the map.schedule.json). The departure boards, the report card and the ticker all use it.There's nothing to install and no build step.
| File | What it is |
|---|---|
index.html | The whole map, in one file |
worker.js | The Cloudflare program that fetches Metra's data. This is a backup copy; Cloudflare runs the real one |
schedule.json | Metra's timetable, trimmed down to what the map needs. Updated nightly, automatically |
tools/build_schedule.py | Builds schedule.json from Metra's timetable |
.github/workflows/timetable.yml | Tells GitHub to run that every night |
voice/ | The recorded check-in voice, packed into a few audio files |
tools/build_voice.py | Records the check-in voice (only needed if you change what it says) |
docs/ | The screenshots on this page |
README.md | This page |
worker.js, and click Deploy.METRA_API_TOKEN and paste your key. It stays in Cloudflare and never goes in this repo.index.html, change WORKER_URL to your Worker's address.main branch and / (root), and save.REPORT. Then add a Cron Trigger of */2 * * * * (every 2 minutes). If this is your own copy, change SCHEDULE_URL in worker.js to your site's address.Push a new index.html to the main branch, or upload it on GitHub. The site updates in about a minute. If you still see the old version, refresh with Ctrl + Shift + R (Mac: Cmd + Shift + R).
Changes to worker.js need to be pasted into Cloudflare too, since GitHub only holds a backup copy.