All work

Auticket

Municipal enforcement system

End-to-end municipal parking enforcement with an AI vision layer - five separate apps for the citizen, the officer, the authority and the administrator, from writing the ticket in the field to payment or appeal.

Role
Product · UX/UI · Full-stack
Type
GovTech · Municipal enforcement
Stack
Next.js · tRPC · FastAPI
Scope
5 apps · Hebrew RTL

What it is

Parking enforcement in Israel runs on a broken chain: the officer writes a ticket, the citizen receives paper, payment happens in another system, and appeals disappear into bureaucracy. Neither side ever sees the whole picture.

Auticket unifies the chain into one system - and adds a layer of vehicle and licence-plate recognition that turns cameras a city already owns into enforcement infrastructure.

The problem

  • A broken chain - Issuing, payment and appeals live in three systems
  • The citizen is blind - No idea what they got, why, or what the options are
  • The officer is on paper - No GPS, no photo, no digital signature
  • No BI for the authority - No picture of revenue, zones or officer performance

The solution

  • An app per role - Citizen, officer, authority, administrator
  • A complete digital ticket - Location, photo and signature in the field
  • Online payment and appeal - From the same screen that shows the ticket
  • AI on existing cameras - Vehicle and licence-plate recognition

Brand

The symbol is two tickets, slanted - a yellow one and a white one on a blue tile - the thing every part of the system handles, from the officer's scan to the citizen's payment. The colours carry the brand's logic: blue for the institution and its authority, yellow only for actions - the active tab, the primary button - so two colours make a clear hierarchy in four apps.

Auticket symbol
Auticket logotype
Auticket symbol, white
Auticket logotype, white
Auticket in colour
Auticket in colour

Symbol and logotype, in black, in white and in colour. The Hebrew logotype is the one citizens see on the street.

Authority blue#2E3192
The institution, the ground
Action yellow#FFDE17
Actions only
Blue hover#1E2470
Pressed
Yellow hover#E5C515
Pressed
White#FFFFFF
Surfaces

Yellow is never decoration: if it is yellow, it can be pressed.

auticketPoppinsThe brand sheet
דוחRubikThe authority app, and Hebrew
Aa 123InterThe officer's handheld app

Each app gets the face that suits its screen; the colours tie them together.

Auticket - The authority dashboard, the citizen app on a tablet and on a phone - real screens
The authority dashboard, the citizen app on a tablet and on a phone - real screens
Auticket - The officer's vest, the logo embroidered
The officer's vest, the logo embroidered
Auticket - The ticket, with a code to pay or appeal
The ticket, with a code to pay or appeal

How it's built

Frontend
Next.js
TypeScript · Tailwind
shadcn/ui · full RTL
API
tRPC + Fastify
JWT · Bcrypt
Audit trail · Rate limiting
Data
PostgreSQL
Prisma
12 related models
AI
Python FastAPI
YOLOv10 · vehicle detection
licence-plate reading

The screens

Positioning

The audience here is decision-makers at a municipality, not consumers - so the message leads by removing budget risk: pay only on success, no fixed costs. The brand blue #2E3192 signals institution and authority; the yellow #FFDE17 is reserved for points of action.

Auticket - Positioning

The authority's dashboard

Four KPIs with their trend and a sparkline, tickets per hour against the same day last week, the hot zones, recent tickets and each officer's progress toward the day's target - one screen answers "how is enforcement going today?"

Auticket - The authority's dashboard

Tables you can work in

Reports and officers are proper data tables: status tabs with counts, search, sortable sticky headers, status pills and row actions, with a totals line - and they fold into cards on a phone.

Auticket - Tables you can work in
Auticket - Tables you can work in

Paying, for the citizen

The home screen opens on what you owe and a single yellow action to pay it. A ticket page explains the offence with a sticky pay-or-appeal bar, and paying is three short steps in a sheet: summary, method, confirm.

Auticket - Paying, for the citizen
Auticket - Paying, for the citizen
Auticket - Paying, for the citizen

Appealing, without a lawyer

An appeal is three steps too - the reason, the details and evidence, a review - with the deadline in view the whole way. History has search, filters and views, so a citizen always knows where each ticket stands.

Auticket - Appealing, without a lawyer
Auticket - Appealing, without a lawyer
Auticket - Appealing, without a lawyer

The officer, one-handed

A big button to issue a ticket, today's numbers and the GPS location. The issue flow is large type tiles, a licence-plate input and a sticky issue · amount button; the camera puts the AI's detection boxes and the shutter within thumb reach.

Auticket - The officer, one-handed
Auticket - The officer, one-handed
Auticket - The officer, one-handed

Design decisions

01

  • One language, four roles - The same design system runs across every app. An officer who moves into a management role doesn't learn a new product - they get more permissions.

02

  • The appeal isn't hidden - In most enforcement systems the appeal is buried. Here it's an equal-status action to payment, which reduces frustration and call-centre volume.

03

  • Hebrew RTL by default - Not a translated Latin interface. Layout, icons and reading direction were built right-to-left from the start, including numbers and currency.

04

  • Yellow only for action - Blue carries institutional authority; yellow is reserved for the active tab and the primary button. Two colours produce an unambiguous hierarchy.

05

  • AI on existing infrastructure - Rather than requiring new hardware, the vision layer connects to cameras already installed in the city - shortening the sale and lowering the budget barrier.

06

  • Audit trail built in - Every ticket carries location, time, officer and signature. In a world where any ticket may reach a court, documentation isn't a feature - it's a precondition.
Next project
OnZero →
Get in touch