Welcome!
Creating new instance...Initializing components...
Shereen Lee
← Code
07

Cracked City

A photo of road damage becomes a prioritized City of Toronto 311 report, with every model running locally on DGX Spark.

Timeline
May 2026
Role
Data + Developer
Team
Nisten Talraj, Ben Zhou, Efrain Deulofeu
Tools
Qwen 27B, Nemotron, DINOv3, Parakeet, Playwright, DGX Spark
Cracked City hero
Overview

Cracked City turns a photo of road or sidewalk damage into a 311 report for the City of Toronto. A resident uploads a photo; the app finds the crack, estimates how severe it is, ranks it against other repairs, and fills in the 311 form. Image analysis, speech recognition and Nemotron all run locally on one DGX Spark box.

Cracked City won Best Use of Nemotron at NVIDIA Spark Hack Toronto, a weekend hackathon for agentic apps built on open models, Toronto open data and DGX Spark hardware.

Context

Toronto publishes about 500 open datasets, including live traffic and the feeds from its public CCTV cameras. The team asked two questions of that data: where the potholes are, and which ones the city should fill first.

The data changed the first answer the team expected. Potholes looked like a safety problem, but Toronto's records showed that roads with many potholes had fewer accidents on average, because drivers slowed down. The project shifted from crash prevention toward road maintenance and quality of life.

Ideation

The app works in two stages. First, CrackDINO, a crack segmentation model on a DINOv3 backbone, finds the crack in a CCTV frame or an uploaded photo and measures how much of the surface is cracked. Second, a ranking stage weighs that damage against local traffic and the schools, hospitals and other institutions nearby, and gives the dispatcher an ordered list. Nemotron writes a plain-language reason for each ranking, tied to the municipal data behind it.

Model choice came down to what the box could run at an acceptable speed. Whisper ran on the CPU and was slow, so speech recognition moved to Parakeet, which runs on the GPU and transcribes in about a second. Several vision models ran at about eight tokens per second; a 27B Qwen model in NVIDIA's 4-bit NVFP4 quantization, released during the hackathon, reached about 28, enough to fill a report.

Process
Role

Citizen

A resident reports damage from a phone and files it with the City. Every model reads the report before a person sends it.

01 / 07
Report a road problemFile a 311 requestRank the queueExplain each priorityPlan the crewsCheck before sending a crewChoose the models
01

Report a road problem

A resident adds a photo or video, or describes the damage out loud. CrackDINO draws the cracks in red and measures how much of the surface is cracked, the vision model describes the damage, and Parakeet transcribes the voice note. The app also lists City road-work permits within about 250 m, in case the damage is already being handled.

Role

Citizen

A resident reports damage from a phone and files it with the City. Every model reads the report before a person sends it.

Report a road problem
01

Report a road problem

A resident adds a photo or video, or describes the damage out loud. CrackDINO draws the cracks in red and measures how much of the surface is cracked, the vision model describes the damage, and Parakeet transcribes the voice note. The app also lists City road-work permits within about 250 m, in case the damage is already being handled.

File a 311 request
02

File a 311 request

An agent fills in the City's "Road Pothole / Road Damage" form live inside the app, with the address, severity and description. A person confirms the map pin, solves the reCAPTCHA and presses Submit; the agent never submits on its own.

Role

Dispatcher

The dispatcher sees every report ranked, with the cost of waiting and the evidence behind each rank.

Rank the queue
03

Rank the queue

The dispatcher queue ranks every report by priority, with its severity, cluster size and the institutions nearby, and estimates what a 30-day delay would cost.

Explain each priority
04

Explain each priority

Each incident breaks its rank into factors: age, economic exposure, cluster size, crack coverage, pavement condition on the ASTM index and a repair-cost penalty. The cost of delay adds vehicle damage and slowdown to a repair bill that grows 3% a day. It has no crash-cost term, because a regression on Toronto data found that worse road defects did not raise crashes.

Plan the crews
05

Plan the crews

The dispatch plan orders tickets by community impact and severity and splits them into crew routes. New reports wait as pending until they are ranked, and the queue exports as CSV or JSON.

Check before sending a crew
06

Check before sending a crew

Each incident shows the City road-work permits nearby and the nearest of Toronto's 336 live traffic cameras, so a dispatcher can check the site before sending a crew.

Role

Operator

The operator sets up the box: every model runs on one DGX Spark, each behind its own endpoint, and the vision model and speech model each have a fallback.

Choose the models
07

Choose the models

Each model sits behind its own endpoint: the vision model, with Nemotron 3 Super 120B on NVIDIA NIM as its fallback; CrackDINO; and Parakeet on the GPU, with distil-Whisper on the CPU as its fallback.

Outcomes

The app runs as a Hugging Face Space, and its code is MIT-licensed: a small server and a single index.js, with no packages to install. The crack segmentation model stays private because it was trained on data the team had no permission to share. The live 311 submission is switched off in the public version so that it cannot file unverified reports.

The next step is dash-camera footage. The vision model can read up to 30 minutes of video, and the open problem is placing each crack at the right location before it reaches the city.


← Back to Code