I've lived in four cities. Melbourne's parking signs still confused me.
Not long after arriving in Melbourne, I found myself standing in front of a parking sign for two minutes — reading every word, tracing every arrow — and still not confident. The sign wasn't illegible. It was a layered logic puzzle: directional arrows pointing different ways, time windows stacked on top of each other, prohibitive rules mixed with permissive ones.
I'd seen people come back to fines. Someone in a local group mentioned their car got towed. The anxiety felt disproportionate to what should be a simple question — and I realised it wasn't a reading problem. It was an interpretation problem. For new immigrants, international students, and anyone who just arrived in Victoria, that gap between reading and understanding costs real money.
NO STOPPING
↕ applies both sides
CLEARWAY Mon–Fri 7–9am, 4–7pm
← applies left
1P Mon–Fri 8am–6pm
Permit Zone 3 excepted
A real sign. Four boards. Multiple arrows. Time windows that overlap. Can I park here? Right now? On which side?
The goal wasn't to build a legal reference tool. It was to answer one question as reliably as possible: "Can I park here right now?"
Core product decision
Why not just ask ChatGPT?
The obvious question. You take a photo, send it to a generic AI, ask "can I park here?" — and you get an answer. The problem is what kind of answer.
A generic AI will read the sign text accurately. It might even translate the time windows correctly. But parking interpretation isn't a translation task — it's a rule evaluation task with a deterministic answer. When rules conflict, when arrows are ambiguous, when a Clearway and a 1P zone overlap — the right answer is either a precise "yes/no with conditions" or "I'm not sure." A language model left to its own devices will fill the gap with plausible-sounding reasoning that may be confidently wrong.
The core product decision: AI handles perception. A rule engine handles judgement.
Gemini Flash · Vision model
What does the sign say?
OCR — extract all text from the photo
Identify sign types (No Stopping, 1P, Clearway…)
Parse time windows and day ranges
Detect directional arrows and their scope
Flag payment indicators, special symbols
Output structured JSON — no free-text conclusions
Gemini explains. It does not decide.
boundary
Local Rule Engine · VIC parking logic
What does it mean right now?
Apply Victoria parking rule hierarchy
Evaluate prohibitive vs permissive precedence
Check user's side selection against arrow direction
Calculate move-by time using device clock
Resolve conflicts → output one definitive result
Return "I'm not sure" when certainty isn't possible
One answer. Can park / Cannot stop / Not sure.
System design · Rule hierarchy
Seven layers, one answer
Not all parking signs are equal. A No Stopping sign overrides everything. A 1P zone only applies after all prohibitive rules have been checked. The rule engine evaluates them in strict order — the first rule that fires wins.
1
Absolute prohibition
No Stopping — overrides everything. No exceptions except emergency vehicles.
Prohibitive
2
Timed prohibition
Clearway, No Parking — active during specific time windows. Checked against device clock.
Prohibitive
3
Special zone eligibility
Loading Zone, Taxi Zone, Bus Zone — only eligible vehicles may use. User prompted if detected.
Access gate
4
Permit exceptions
Permit Zone, Disability permit — overrides standard restrictions for eligible holders only.
Permit
5
Payment requirement
Ticket, Meter, PayStay — parking is allowed but must pay. Result shown as "Can park with payment."
Payment
6
Time-limited parking
1P, 2P, 4P — permitted with a time limit. Move-by time calculated and displayed prominently.
Permissive
7
Unrestricted
No active restriction matched — can park with environmental reminders (yellow lines, driveways).
Permissive
Product thinking · Key trade-offs
Every design decision is an argument
The decisions that shaped the product weren't about which technology to use — they were about where to draw the line between certainty and usability.
01
Direct answer first, reasoning second
Early versions showed too much reasoning. Users still didn't know if they could park — they had to read through to find the conclusion. Final design leads with a single verdict ("Can park now / Move by 3:00pm"), then explanation, then edge-case reminders.
Clarity over completeness
02
Special questions triggered by signs, not asked by default
Asking every user "do you have a disability permit?" or "are you loading?" creates friction for 95% of cases. Special eligibility questions are only shown when the relevant sign is detected — triggered by the system, not volunteered by the user.
Low friction over full coverage
03
"I'm not sure" as a first-class result
When the rule engine can't reach a deterministic answer — missing arrows, conflicting signs, low-confidence OCR — the product surfaces "I'm not sure" rather than guessing. Fake confidence on a parking question costs the user money and frustration.
Honesty over helpfulness
04
Environmental checks as reminder chips, not blockers
Yellow edge lines, driveways, and intersections can't be reliably detected from a sign photo alone. Rather than blocking the result or pretending certainty, these are surfaced as lightweight reminder chips at the bottom — honest about the limits of the system.
Transparency over false confidence
UX design · Mobile-first flow
Designed for one hand, on a street, under pressure
The product was built for a specific moment: standing next to your car, unsure if you'll get a fine, wanting an answer in under 15 seconds. Every screen decision came from that constraint.
Upload photo
Take or upload the sign photo. Tips available but not blocking.
Side selection
Left or Right only. No "not sure" — forces a clear input.
Checking state
1.5s animated status. Trust-building, not chain-of-thought.
Verdict
Can park / Cannot stop / Not sure — with move-by time if relevant.
Reminders
Environmental check chips. Disclaimer in small print below.
Bilingual support (English and 中文) was built from the start — not retrofitted. For new immigrants and students who arrived in Victoria recently, having the result in their first language reduces interpretation errors at exactly the moment when a misread costs money.
Reflection · What I learned
Three things this project clarified
1
AI and determinism aren't in competition — they have different jobs.
The temptation was to let Gemini do everything. The insight was that AI is excellent at extraction and terrible at arbitration. Separating perception from judgement made the system both more reliable and cheaper to run.
2
Uncertainty handling is a product decision, not a technical failure.
Deciding when to say "I'm not sure" — and making that feel like a trustworthy response rather than a broken one — was the hardest UX problem in the product. The temptation is always to guess. The right answer is to be honest about the limits of the system.
3
The best products start from a problem you personally couldn't solve.
I built this because I got a fine. The constraint of having lived the problem made every product decision sharper — I knew exactly which moment of confusion to resolve, and which complexity to hide.