
Somewhere along the way we became the tollbooth between the business and their own data (well, ok, actually... this is how its always been. I still remember the platform i built in ~1997 to collect data for an insurance company... getting it to them how they needed, that was... . . . . hey look a shiny red ball! )
Someone wants to know signups today. Simple question. Thirty seconds in SQL. But they don't know SQL so now it's a Slack message, a Jira ticket, a prioritization conversation, a new dashboard item, and a delivery date. For a number. A single number.
We built the systems. We own the schema. We know where the data lives and how to get it. That knowledge became leverage we never asked for. The business can't see inside the box we built, so they wait in line while we context-switch away from actual product work to answer questions a motivated intern could handle with database access and ten minutes.
Dashboards were supposed to fix this. Self-serve analytics. Metabase (I LOVE METABASE), Looker, Databricks(Ehhhh its great but the Jira of complex capabilities). All powerful. All still requiring someone technical to build the thing, maintain the thing, explain the thing. The business gets a curated menu of acceptable curiosity. Anything off-menu goes back to us.
I spent real years building dynamic dashboards with ORM-generated queries doing joins and rollups that would make a DBA weep. Proud of it. Still am. (Thank you Percona and Baron Schwartz from 2011/2012). But the business never wanted a dashboard. They wanted an answer. The dashboard was just the only shape we knew how to give them.
Chortle is the heresy.
NL2SQL that lets someone text "how many signups today" and get a number back. No laptop. No login. No context switch. No engineer playing data concierge.
Building this with my son has been the best part. Teaching him that technology exists to solve real friction, not to demonstrate cleverness. Although there's been some cleverness. The NL2SQL layer doing multi-tenant schema introspection while generating safe parameterized queries isn't nothing. But the point was never the tech. The point was removing the tollbooth entirely.
Twenty-five years in and I'm still solving the same problem. Get data to humans faster. Everything else is theater.
Oh, and I'm working on getting this integrated at work too.
TECHSTACK
Preface: Why roll out monolith when you're just having fun exploring all the different things.
- Python
- Docker
- Node
- ChromaDB
- FastAPI
- Fastify
- LangGraph
- LangChain
8 Services
- API Gatway - Single entry point for auth/rate-limiting. Keeps security concerns separate. MY FAVORITE LAYER!
- Agent Orchestrator - Uses LangGraph to orchestrate the workflow:
- Fetch schema → Fetch examples → Generate SQL → Execute → Handle errors (retry up to 3x) - Schema Registry - The LLM needs to know table/column names to write SQL. This service formats schema metadata into prompts.
- Query Executor - Security isolation. Only allows SELECT, enforces timeouts and row limits. Never runs DELETE/UPDATE.
- LLM Provider - Swap LLM providers without changing other services.
- InHouse LLM Model Service
- Vector Store - RAG pattern. Stores example questions + their SQL so similar questions get better results
- Tenant MAnager - Store tenant databases, API keys, and query history and collects all interactions between services and stores them.