[{"data":1,"prerenderedAt":88},["ShallowReactive",2],{"work-dialect-ai":3},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":7,"client":9,"year":10,"role":11,"summary":12,"result":13,"tech":14,"featured":21,"order":22,"cover":23,"body":24,"_type":82,"_id":83,"_source":84,"_file":85,"_stem":86,"_extension":87},"\u002Fwork\u002Fdialect-ai","work",false,"","A SQL studio that asks the schema, not the whole database","Dialect AI",2026,"Product — SQL studio + schema RAG","Engineers were pasting schemas into chatbots and watching the prompt explode. We built a workbench that prunes the right tables, then writes dialect-aware SQL.","NL2SQL that survives a real schema",[15,16,17,18,19,20],"Vue 3","Fastify","PostgreSQL","pgvector","Groq","Monaco",true,1,"dialect",{"type":25,"children":26,"toc":75},"root",[27,36,42,48,53,59,64,70],{"type":28,"tag":29,"props":30,"children":32},"element","h2",{"id":31},"the-problem",[33],{"type":34,"value":35},"text","The problem",{"type":28,"tag":37,"props":38,"children":39},"p",{},[40],{"type":34,"value":41},"Naive NL2SQL dumps the whole schema into the model. On a real database that is a 413 — token limit, not a clever answer. Desktop GUIs don’t help either: they run SQL, they don’t know which twelve tables the question actually needs. Teams behind a VPN often have a Prisma file and no live connection at all.",{"type":28,"tag":29,"props":43,"children":45},{"id":44},"the-approach",[46],{"type":34,"value":47},"The approach",{"type":28,"tag":37,"props":49,"children":50},{},[51],{"type":34,"value":52},"We treated the schema as a graph, not a blob. Every dialect — Postgres, MySQL, SQLite, plus CSV via DuckDB in the browser — normalises to one contract. Before the model sees anything, a local embedder ranks tables, walks one foreign-key hop, then clamps to a token budget. Offline import (Prisma, DDL, JSON) is a first-class mode, not a demo.",{"type":28,"tag":29,"props":54,"children":56},{"id":55},"the-solution",[57],{"type":34,"value":58},"The solution",{"type":28,"tag":37,"props":60,"children":61},{},[62],{"type":34,"value":63},"A Vue 3 studio (Monaco, results grid, ERD, copilot) talking to a Fastify API. Connections are per-user. Read-only guards sit on the same path as the AI. Groq writes, explains, and fixes SQL. Embeddings stay local so we don’t pay a second vendor for vectors. Writes don’t sneak through because someone phrased the prompt aggressively.",{"type":28,"tag":29,"props":65,"children":67},{"id":66},"the-result",[68],{"type":34,"value":69},"The result",{"type":28,"tag":37,"props":71,"children":72},{},[73],{"type":34,"value":74},"The studio runs against live databases: connect, prune, generate, explain, copy out. Large hub-and-spoke schemas no longer blow the prompt. You can import a shape with no live DB, get SQL, and take it back to the real engine. Public demo is still coming. The product already does the job.",{"title":7,"searchDepth":76,"depth":76,"links":77},2,[78,79,80,81],{"id":31,"depth":76,"text":35},{"id":44,"depth":76,"text":47},{"id":55,"depth":76,"text":58},{"id":66,"depth":76,"text":69},"markdown","content:work:dialect-ai.md","content","work\u002Fdialect-ai.md","work\u002Fdialect-ai","md",1789258141857]