Underground 2 Revived
Play Need for Speed: Underground 2 (2004) in Chrome and Firefox with WebGPU graphics, Web Audio, up to 120 fps widescreen, controller support, free roam and Online races with friends. Fan project, not
Pokédex warszawskich autobusów i tramwajów na iPhone’a: skieruj aparat na pojazd, a TABOR odczyta numer taborowy i doda go do albumu jako naklejkę. Za darmo.
Translation pending
GamesSwift · PythonGitHub @TheFilipcom4607OnlineOwner 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
TABOR: a Pokédex for Warsaw's buses and trams. An iOS app that reads a vehicle's fleet number with on-device OCR, turns it into a die-cut sticker, and shows the ones you haven't caught on a live map, with Lock Screen tracking.
Translation pending
Taken from the repository README
Loading the full README. The saved excerpt is shown below.
A Pokédex for Warsaw's buses and trams. Point the camera at one, and its fleet number goes into your book as a die-cut sticker — the rarer the model, the louder it lands. Ursus City Smile #1996, one of only twelve in Warsaw, caught through a car's windscreen.Read the full README ↗
"Tabor" is Polish for rolling stock. Warsaw runs about 2 600 buses and trams in regular service, split across 44 models. Some models have hundreds of vehicles, and some have four. On top of that come 36 kinds of museum and club vehicles, Tramwaje Warszawskie's works cars, and the odd bus on trial. Every vehicle carries a fleet number, and ZTM's database says which model each number belongs to. So a photo of a bus is enough to know exactly what you've seen, and a list of every number is enough to know what you haven't.
TABOR does both halves. CATCH reads the fleet number off your photo, on the phone. BOOK files the vehicle under its model and batch. HUNT shows every vehicle you haven't caught yet, live, on a map, and follows one to your stop on the Lock Screen. ME keeps the score.
Get it on the App Store: apps.apple.com/app/tabor/id6816408610 (iPhone, iOS 18 or later, free). Bug reports and ideas go in issues, and questions in discussions. CONTRIBUTING.md says what makes a report or a pull request easy to act on.
Po polsku: opis i instalacja na thefilip.com/tabor.
Or build it yourself. Open the project in Xcode 27 and run it on your phone:
open Tabor.xcodeproj
Set your own team under Signing & Capabilities for the Tabor, TaborControls
and TaborShare targets.
The live map and the live-assisted number reading use Warsaw's open data. The
app doesn't carry a key: it asks TABOR's proxy (proxy/, a Cloudflare Worker
running in Warsaw), which holds the key, keeps each copy of the feed for 3
seconds so phones share one call to the city, gzips it, and allows each address
60 calls a minute. Builds from this repo use that proxy as they are. To go
direct instead, paste a free key from
dane.um.warszawa.pl into Settings › Live data. To
run your own proxy, change the domain in proxy/wrangler.toml and
TABOR_LIVE_PROXY in Config/Tabor.xcconfig, then:
cd proxy && npx wrangler secret put DANE_TOKEN && npx wrangler deploy
WX 2043F, WPI 12345), and plate digits that start with 0.
"Nr 1974" still counts, and so does a number with paint glued on.20:15, 3.14) are dropped.1O23, I974) is read as that digit, but
only when that makes a number in the fleet, and it ranks below a clean read.The photo develops while the vehicle is lifted off the background. That's the same subject-lifting model as the Photos app, running on the phone. The sticker is cut from the object the fleet number is painted on, so another bus or a car alongside doesn't steal it. People standing in front of the vehicle are erased, bike included, unless erasing them would bite into the vehicle. WRONG CUTOUT? on the reveal tries the next object in the photo.
It gets a thick white border that follows its outline, and the sticker slams down with a haptic pattern that gets longer the rarer the model is. A COMMON lands with one thunk. A LEGENDARY builds up in step with its glow, hits on the frame you see it land, and ends in sparks.
A line underneath says what the catch means for your book:
One more — 1987 — and the 2024 batch is done.
Hold the sticker to peel it off the backing and stick it in the book.
Every bus and tram you haven't caught, from Warsaw's live GPS feed. The feed is read every 10 seconds while the map is on screen, every 30 seconds elsewhere in the app (so trails are ready when you open the map), and never in the background.
Every model, with every vehicle ZTM lists, split into batches by operator, build year and depot:
2024 BATCH · R-1 WORONICZA · 1970—1987
Owned stickers come first, then the gaps. A batch turns green once you have the whole batch. Each model page has its length, drive, floor, air-con and how many people it carries, every drive it comes in, and SHOW ON MAP for the ones running now.
| Tier | What it takes |
|---|---|
| LEGENDARY | A model with 12 vehicles or fewer |
| GOLD | 48 or fewer |
| RARE | 80 or fewer |
| COMMON | Everything bigger |
| VINTAGE | Tourist and museum vehicles, only out on summer weekends and at events |
| ON TEST | Trial vehicles on loan to an operator, here for a few weeks |
| WORKS | Tramwaje Warszawskie's own works cars: measurement, transport and welding cars, out on no timetable |
Rarity is fleet size and nothing else. There's no guessing at how often a model runs. VINTAGE, ON TEST and WORKS are tiers of their own, whatever their size, and none counts toward the fleet percentage or the "complete a tier" badges. They aren't rare, they're seasonal, passing through, or not for passengers.
A vehicle's page has its age, when you first saw it, how many times you've seen it, any special livery, and every sighting: when, where (district and street), and which line it was on. A vehicle caught more than once shows the picture you pick. Swipe a sighting to fix its number, model or line, or delete it. A deleted sighting can be brought back with UNDO for a few seconds.
Tabor/Resources/fleet.json is built by scripts/fetch_fleet.py from two
sources: the ZTM vehicle database, and the city's open-data vehicle list, which
adds numbers ZTM hasn't listed yet and each model's specs. On top of that come
hand-kept lists for what neither has yet or has wrong: new deliveries already
running, buses on trial, club-owned vintage buses, Tramwaje Warszawskie's works
cars, retired vehicles still listed, vehicles filed under the wrong model,
coupled trams, and special liveries
(confirmed from photos, since the city's paint data misses repaints). The
script's header explains each list.
python3 scripts/fetch_fleet.py --offline
Rebuilds from the saved files in data/ in seconds. Leave out --offline to
fetch the city's list again, and add --scrape to scrape ZTM too, which takes a
while. ZTM blocks GitHub's runners, so the scrape runs from a home connection, not in CI.
Every night a GitHub Action fetches the city's list, rebuilds, runs the tests and
commits the result to main by itself. It asks for a human only when more than 20
vehicles would leave at once (a pull request) or the city lists a type no model has
yet (an issue). Corrections go into the script's lists, never into fleet.json by
hand: a check fails any commit whose fleet.json isn't what the script builds, so
the nightly rebuild can't undo a fix.
New buses don't need an app update. The app checks this repo's main for a
newer fleet.json once a day and uses it from the next launch. A downloaded
copy only wins while it's newer than the one built into the app, so an app update
with fresher data is never overridden by an old download. Settings can turn the
check off. When a model is split in two, catches move to the right one by
themselves.
Hand-added numbers come from a source (Warszawikia, TransInfo, the KMKM club, phototrans.eu) or were seen live on the feed. None are filled in from an order size. As soon as ZTM lists a number itself, ZTM's row wins and the hand-added one drops out. Every source is credited at the bottom of the book.
[!NOTE] The live feed and the database don't always agree. The feed keeps some vehicles' last positions for years, so anything older than three minutes is ignored. A vehicle the database doesn't know never shows on HUNT, because TABOR couldn't say which model it is.
It lives on the phone and nowhere else: there's no account, nothing of yours goes to a server, and no iCloud sync for now. What the app does send (the live feed, the weather, Lock Screen tracking) is listed in the privacy policy. Settings › Backup exports the whole book as a ZIP: every sighting, photo, sticker and hand-picked model. Importing a backup only adds what's missing, so importing the same file twice changes nothing.
The book keeps its own copy of each catch's photo at 1600 px, a few hundred KB as HEIC. The shot saved to Photos stays full size.
Location is only used while the app is on screen: it geotags a catch and tells HUNT and the camera what's nearby. There's no background location mode at all. Lock Screen tracking sends the proxy the vehicle's number, the stretch of its route up to your stop, and the token it pushes updates to. It's forgotten when tracking ends.
Debug mode (Settings) saves every shot to Files › On My iPhone › TABOR › Debug, including failed reads and retakes. Each shot is saved with the photo, the sticker and what the OCR, the live feed and the sticker cutter made of it. With debug mode on, long-pressing a caught sticker in the book deletes it.
The matching, OCR filtering, stats, badges, live feed parsing, routes and backup
logic in Tabor/Core doesn't depend on the iPhone. It also builds as a Swift
package, so it's tested on a Mac in about a second:
swift test
The proxy's tracking maths has its own:
node proxy/src/trackgeo.test.mjs
GitHub Actions runs the Swift tests on every push to main and every pull request that
touches Tabor/Core, the tests or fleet.json.
To everyone who tested the beta, and above all to @Szpieg0, @Pepe-PL and @flyingkonstal, whose issues found the bugs, named the vehicles and shaped a lot of what's here. Want to help too? Start with CONTRIBUTING.md.