A proof-of-concept exposing weak validation in Belgrade's public transit ticketing system.
Been feeding the regression model more data by hand for months — bumped the degree to 3 at some point for a better fit, but CSV rows don’t write themselves. Finally wrote extract.py to pull ticket data directly out of screenshots instead, fed the model a proper batch of fresh data with it, and set up real APK signing so the release build isn’t just a debug artifact anymore.
This is the part that made the whole thing real instead of just a convincing-looking mockup. Wrote a Python script (CodePrediction/regress.py) that takes real ticket-code samples from a CSV and fits a polynomial regression to them, then feeds the resulting coefficients back into IDGenerator.kt — so the app doesn’t just display a plausible-looking fake ticket ID, it predicts what the real system would actually generate for a given ticket. And it worked well enough that it held up: the GitHub release page ended up with a couple hundred downloads, and I know for a fact a bunch of people around me actually rode on generated tickets. Cheated the city out of some fare money, which was, again, the entire point.
Timestamps went from raw dates to actual relative labels — “today,” “yesterday,” “before that” — much more like a real message history. Fixed text wrapping that was breaking for some users, and added light/dark theme support (the status bar was clashing with the app background before this). Also: issue #4 has been open since October 5th and is still open after this batch too — the on-screen keyboard just won’t show up when it’s supposed to, and I genuinely don’t know why yet. Noting that here because it’s true, not because I fixed it.
Fixed a batch of small stuff tracked as GitHub issues: the exit button that didn’t actually exit, message timestamps that weren’t computing correctly, a dropdown for changing which ticket type/number you’re simulating. Added a legal notice too, mostly covering myself rather than out of any real doubt about what this app was for.
Belgrade’s public transit switched to a ticketing system where your “ticket” is just a text message conversation with a specific number showing you bought one — nobody actually checks anything beyond “does this phone have that conversation in it.” So: built an app that fakes that exact conversation, convincingly. README says it plainly — “Besplatan prevoz u Beogradu.” Free transit in Belgrade. That was always the actual goal, not a hypothetical.
First few days: basic layout, then a chat-style screen where message timestamps for older messages decrease “randomly” backward from now, mimicking how a real ticket-purchase history would look. Called it v0.1 once the fake conversation actually looked believable.