USER: [email protected] PASS: test12345
Inspiration
Frame asked us to take data that exists today and turn it into something a busy person can act on. Every Irish company files an annual return with the CRO, and the CRO publishes the whole register as free open data. Accountants still track filing deadlines in spreadsheets and practice software, and nobody uses the register to spot companies that have already missed theirs. We wanted a partner in a practice to get an answer by asking a question, not by opening a CSV.
What it does
Dialed In answers two questions for accountancy practices, from the CRO's open company register:
- Prospects: "Which Cork hospitality companies are overdue on their annual return?" gives a ranked list of overdue companies: new-business leads, with days overdue and an estimated late penalty.
- Clients: "Who do I need to chase this week?" checks the practice's own client list against the register.
Each morning the Today screen shows which of your clients are overdue and which are due this week. On the phone, the prototype reads an answer aloud on a desk phone or a personal work mobile. In this version the spoken answer is pre-recorded from the same data; live voice questions are designed and are next.
Every web answer shows how it was made: the filter, the SQL, the row count and the date of the data. If the data is more than a week old, it says so.
How we built it
- Data: The CRO Company Records bulk file (CC BY 4.0), loaded into DuckDB. A freshness gate checks the newest registration date in the file instead of trusting the "daily" label.
- Rules in SQL: Filing deadline, days overdue, estimated penalty, Eircode routing key for areas, NACE sector labels. All computed in code from a fixed date.
- Plain English: Claude Haiku, through a forced tool call, turns the question into a JSON filter that must pass a Pydantic schema. Code turns the filter into parameterised SQL. The model never writes SQL, never computes a date, penalty or count, and never sees company rows. Answer sentences are templates filled from the result rows.
- Web: Flask API and React page, with sign-in so each practice's client list stays private.
- Phone: A hardware desk phone setup powered by Asterisk running on a Raspberry Pi, connected to a local SIP server and configured with custom audio pipelines to route audio directly to a Cisco IP phone and mobile extensions. The live design (Asterisk, speech to text, the same filter engine, Piper text to speech, a morning call) is written up in our docs and is the next step.
Challenges we ran into
- Cisco SIP Provisioning & Audio Rates: Getting a legacy Cisco IP desk phone to register against a local Asterisk instance on venue Wi-Fi was an adventure. Between overcoming venue network client isolation and bridging 8kHz telephony audio with 16kHz Whisper audio pipelines using SoX, we had to re-sample audio on the fly to prevent chipmunk-voiced responses on the receiver.
- CRO Data Quirks: The "daily" CRO bulk export had inconsistent date formatting across historical records and legacy NACE code definitions. We had to write robust normalization parsers on ingestion so DuckDB could perform deterministic date arithmetic without crashing.
- Deterministic AI Control: Balancing natural language flexibility with zero-hallucination guarantees required strict Pydantic schema enforcement. Preventing the LLM from attempting math or SQL generation took multiple prompt iterations and tight system constraints.
Accomplishments that we're proud of
- An AI feature you can audit: Every answer transparently shows the exact JSON filter parameters and generated SQL query that produced the result—complete with zero hidden model magic.
- Deterministic accuracy: 0% chance of hallucinated numbers or fake companies because the LLM is stripped of raw data access and arithmetic duties entirely.
- Zero-AI fast path: Example queries execute purely via pre-built SQL templates without making external LLM calls, explicitly indicating so in the built-in honesty panel for sub-millisecond responses.
- Hardware-to-Data Pipeline: Going all the way from raw public government records down to physical desk phone audio output during a fast-paced hackathon.
What we learned
- Schema is King: We realized early on that building a great "natural language" interface is 80% clear schema design and 20% LLM framing. Forcing typed JSON constraints yields infinitely more reliable software than letting a model construct SQL strings directly.
- The "Daily Export" Illusion: "Updated daily" public datasets often lag behind real-world filing dates; building a programmatic data freshness gate is essential before trusting open data in production applications.
- CRO Statutory Mechanics: Diving deep into Irish company law to accurately model annual return date calculations, late filing fee scaling, and lost audit exemption thresholds.
What's next
- Email and calendar alerts for client deadlines
- Importing client lists from practice software
- The CRO Financial Statements dataset, to flag clients at risk of losing their audit exemption
- Revenue deadlines
- Teams and WhatsApp voice
- The UK, using Companies House open data, then Cayman Islands and US filings
Built with
python, flask, duckdb, claude, anthropic-api, pydantic, react, typescript, vite, tailwind, bun, uv, asterisk, docker, raspberry-pi, cisco, piper, whisper-cpp, sox, dnsmasq, cro-open-data
Built With
- anthropic-api
- asterisk
- bun
- cisco
- claude
- dnsmasq
- docker
- duckdb
- flask
- piper
- pydantic
- python
- raspberry-pi
- react
- sox
- tailwind
- typescript
- uv
- vite
- whisper-cpp