Inspiration

The Clean Houston! brief says Houston's 311 dumping and litter hotspots are scattered across the city and "nobody has a simple way to see them all in one place." The City publishes the records, but reading them still means downloads, spreadsheets and guesswork. I had already built Tiersel, a voice-first assistant that builds the interface while you speak, and wanted to see whether it could make a million civic records as easy to question as the weather.

What it does

Tiersel Houston answers plain-language questions about City of Houston 311 service requests: about 1.21 million requests from 2024 onward plus older cases still open, updated every 15 minutes from the City's own 311 data. You speak or type a question such as "illegal dumping in Fifth Ward this year". The count appears first, then a layout of charts arranges around it, then Tiersel reads the answer aloud.

Answers draw from 18 block types, including a map of reported locations, a neighborhood choropleth, trends, stacked trends, a calendar of every day, scatter, funnel, small multiples, histograms and tables. Tapping a bar, region, point or row asks about that slice, and follow-up questions keep the scope. Every chart has a Data button that shows the exact records it draws. A diagnostics panel shows each step's timing, where every number came from (the source, the filters and the exact lookup), and a count cross-check.

It covers one side of Clean Houston!: seeing where requests are. It does not handle claims, crews or photos. Counts are service requests, not incidents or unique residents.

How I built it

Houston is a dataset mode of Tiersel, a Next.js and TypeScript app. Speech comes from the browser's speech recognition or a text box, and both feed the same engine. Fixed rules, not a model, turn the words into filters, time windows and measures in about a millisecond and report any words they did not use. The server looks up the records in a read-only copy of the City's 311 data, using daily totals where they give the same answer and exact medians otherwise. Nothing is computed in the browser.

Jev, TypeSafe AI's model, then chooses which views lead. It works under a 1.8-second deadline, and if it is late or unavailable a standard layout ships instead. No model writes a number. Spoken answers come from a Kokoro voice synthesized on the server. The mascot, Vane, is rendered in three.js. The app is deployed with Docker behind Caddy on a single VPS, with health monitoring.

Challenges I ran into

  • Speed without shortcuts. I wanted the first numbers on screen in about a fifth of a second, which rules out a model on the critical path. The answer is computed and painted first, and the model-chosen layout follows.
  • Honest scope. Questions like "is it getting worse" or "not potholes" are easy to answer wrongly. Tiersel names the words it could not use, and exclusions are refused rather than guessed. Per-capita rates are unavailable because there are no population denominators.
  • Proving the numbers. Live data changes while you check it. The check freezes one copy of the records and runs both Tiersel and an independent recalculation against that same copy.

Accomplishments that I'm proud of

  • Checked against the live records: every one of more than 130 test questions matches, each answer recomputed independently from the base records in one shared copy of the data.
  • Two runs of 30 fresh questions against the live site: median 180–194 ms to the first numbers, 403–422 ms to the full layout, and 0.83–0.89 s to the first spoken word. These were measured from one desktop client, and some answers were slower.
  • Follow any number back to the records it came from, from the spoken sentence to the exact records behind it.

What I learned

Letting a model choose the layout while plain code computes the numbers keeps answers fast and checkable. Showing where each number came from builds more trust than a confident sentence. Saying what the data cannot answer is part of the product.

What's next

A realistic next step is four weeks with one civic club or council office: collect the questions they actually ask, answer them here, and keep what they use. Beyond that, possible directions are saved weekly questions, Spanish questions and answers, and other public datasets on the same engine. None of these is built yet.

Try it

Counts are service requests, not incidents or residents. Speed figures come from one client on 27 Sep 2026. Accuracy is proven for the published test questions, not for every possible question.

Film music: "Digital Lemonade" by Kevin MacLeod (incompetech.com), licensed under CC BY 4.0.

Built With

Share this project:

Updates