{
  "version": 3,
  "sources": ["ssg:https://framerusercontent.com/modules/9O2c3tqZhpyXlm8kBuJb/pCrOMLiucxg5zXAHBAiY/tuRG1jt7F-3.js"],
  "sourcesContent": ["import{jsx as e,jsxs as t}from\"react/jsx-runtime\";import{ComponentPresetsConsumer as n,Link as a}from\"framer\";import{motion as r}from\"framer-motion\";import*as o from\"react\";import s from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js\";import i from\"https://framerusercontent.com/modules/pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js\";export const richText=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"I recently came across a podcast from NNG called \u201CDesigning AI Experiences,\u201D featuring Caleb Sponheim. At one point, they asked him what he\u2019d put on a billboard if every designer saw it driving to work in the morning.\"}),/*#__PURE__*/t(\"p\",{children:[\"His answer? \",/*#__PURE__*/e(\"strong\",{children:\"\u201CMaybe not?\u201D\"})]}),/*#__PURE__*/e(\"p\",{children:\"The man is clearly done with chatbots popping up in every app.\"}),/*#__PURE__*/e(\"blockquote\",{children:/*#__PURE__*/e(\"p\",{children:\"\u201CAI is not a silver bullet to solving any problem.\u201D  - Caleb says.\"})}),/*#__PURE__*/t(\"p\",{children:[\"And he\u2019s absolutely right. There are better ways to meet your users\u2019 needs. At least \",/*#__PURE__*/e(\"em\",{children:\"maybe not\"}),\" with yet another chatbot.\"]}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s exactly what we realized at Querio.\"}),/*#__PURE__*/e(\"p\",{children:\"We started as an AI chatbot for data. It was cool at first\u2014fast responses, natural language, all that stuff. But over time, we realized: this is just one piece of the puzzle. People working with data need way more than a chat bubble to make real decisions.\"}),/*#__PURE__*/t(\"p\",{children:[\"And let\u2019s be clear\u2014we\u2019re not anti-AI. When used thoughtfully, it can be \",/*#__PURE__*/e(\"em\",{children:\"chef\u2019s kiss\"}),\": faster workflows, amazing insights, saving people\u2019s time. But here\u2019s the thing:\"]}),/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Too many products are adding AI just because they can\u2014not because they should.\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"When AI Took Over Querio \uD83D\uDE2C\"}),/*#__PURE__*/t(\"p\",{children:[\"Like a lot of teams, we got a little too excited. We went all in on AI: chatbot, instant answers, AI chart builder, AI summary, AI everything\u2014you name it. It sounded impressive. It even \",/*#__PURE__*/e(\"em\",{children:\"looked\"}),\" impressive.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"392\",src:\"https://framerusercontent.com/images/QI5vUUVj51GO1uQKeJFe5RFw.png\",srcSet:\"https://framerusercontent.com/images/QI5vUUVj51GO1uQKeJFe5RFw.png?scale-down-to=512 512w,https://framerusercontent.com/images/QI5vUUVj51GO1uQKeJFe5RFw.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/QI5vUUVj51GO1uQKeJFe5RFw.png 1600w\",style:{aspectRatio:\"1600 / 784\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"But then\u2026 reality hit.\"}),/*#__PURE__*/e(\"p\",{children:\"Users were confused. Some were low-key overwhelmed. Others didn\u2019t trust the results because they couldn\u2019t see where the info was coming from.\"}),/*#__PURE__*/t(\"p\",{children:[\"We had to face it: AI wasn\u2019t making things better. It was just making things \",/*#__PURE__*/e(\"em\",{children:\"noisier\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"So we\u2026\uD83E\uDD41\u2026 started to \",/*#__PURE__*/e(\"strong\",{children:\"un-AI\"}),\" our product.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"What Does It Mean to Un-AI a Product?\"}),/*#__PURE__*/e(\"p\",{children:\"It means taking a breath and asking:\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"392\",src:\"https://framerusercontent.com/images/Ol6Tu14JABVB1tgUslgOJVifOmE.png\",srcSet:\"https://framerusercontent.com/images/Ol6Tu14JABVB1tgUslgOJVifOmE.png?scale-down-to=512 512w,https://framerusercontent.com/images/Ol6Tu14JABVB1tgUslgOJVifOmE.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Ol6Tu14JABVB1tgUslgOJVifOmE.png 1600w\",style:{aspectRatio:\"1600 / 784\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"We realized AI should \",/*#__PURE__*/e(\"strong\",{children:\"support\"}),\" the experience\u2014not be the main character.\"]}),/*#__PURE__*/e(\"p\",{children:\"So we made some changes:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/t(\"p\",{children:[\"We put aside the chatbot and focused on \",/*#__PURE__*/e(\"em\",{children:\"showing\"}),\" and \",/*#__PURE__*/e(\"em\",{children:\"editing\"}),\" the output.\"]})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"We started showing more of the logic behind the scenes, with editable steps.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"We added a Knowledge Base where users define their own context and data rules.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"We added Notebook with SQL and Python where users could write it all by hand or have Querio do the lift\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"Bottom line? We put the power back in our users' hands! But still keeping AI as an \",/*#__PURE__*/e(\"strong\",{children:\"option\"}),\".\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"The Un-AI Checklist\"}),/*#__PURE__*/e(\"p\",{children:\"Next time when designing an AI feature ask yourself:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Is AI solving a \"}),/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"real\"})}),/*#__PURE__*/e(\"strong\",{children:\" user problem?\"})]}),/*#__PURE__*/t(\"p\",{children:[\"Or are we just adding it because it sounds cool?\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})]})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Can users \"}),/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"understand and control\"})}),/*#__PURE__*/e(\"strong\",{children:\" what the AI is doing?\"})]}),/*#__PURE__*/t(\"p\",{children:[\"No mystery boxes. Give people visibility and control.\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})]})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Is the AI making things \"}),/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"faster\"})}),/*#__PURE__*/e(\"strong\",{children:\", or just \"}),/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"fancier\"})}),/*#__PURE__*/e(\"strong\",{children:\"?\"})]}),/*#__PURE__*/t(\"p\",{children:[\"A feature that looks cool but slows you down? Immediate red flag \uD83D\uDEA9.\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})]})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Is this feature helping users do what they want to do?\"})}),/*#__PURE__*/t(\"p\",{children:[\"Let users lead, AI follows.\",/*#__PURE__*/e(\"br\",{}),/*#__PURE__*/e(\"br\",{className:\"trailing-break\"})]})]}),/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"p\",children:[/*#__PURE__*/e(\"p\",{children:/*#__PURE__*/e(\"strong\",{children:\"Are users getting trust issues from AI?\"})}),/*#__PURE__*/e(\"p\",{children:\"Transparency always wins.\"})]})]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Finally\"}),/*#__PURE__*/t(\"p\",{children:[\"We\u2019re not saying AI is bad. We\u2019re saying \",/*#__PURE__*/e(\"em\",{children:\"maybe not\"}),\"\u2014not for every interaction, not in every corner of your product.\"]})]});export const richText1=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"h3\",{children:\"Today we\u2019re thrilled to introduce our biggest product launch to date: Explore. An entirely new way to work with data.\"}),/*#__PURE__*/e(\"p\",{children:\"For decades, interacting with data has been broken. Someone asks a data team a question, they write a query, that query asks the database, and the chain is reversed to you. We\u2019ve spent years building on top of this; data innovations the last 20 years have focused on making it easier to write queries, style the responses, and reduce time spent in each step. It was never assumed you can change how things are done.\"}),/*#__PURE__*/e(\"p\",{children:\"Then AI coding and text-to-sql arrived; a promised technology to end this terrible chain. You no longer have to be two degrees of separation from your data, or spend time writing repetitive SQL. Now, you text this chatbot, like you would a teammate in slack.\"}),/*#__PURE__*/e(\"p\",{children:\"In fact, when we launched Querio, we also thought this was the best way. It feels familiar, but is it actually the best way? You are still technically asking someone else over slack, that person is just an AI agent now. Why are we still \u201Casking\u201D? Why are we not creating?\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Explore: Reimagining how you work with your data.\"}),/*#__PURE__*/e(\"p\",{children:\"We decided to change how you interact with your data and created Explore - an open canvas that focuses on the answers you need, not the questions you're asking. Whether you're a great operator or a data guru, Explore is the best place for you to do your work. Let's dig into how Explore does that:\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"1495\",src:\"https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png\",srcSet:\"https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png?scale-down-to=512 512w,https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png?scale-down-to=4096 4096w,https://framerusercontent.com/images/bfs6kTa6juw43bTYliNZp3BoeTk.png 5360w\",style:{aspectRatio:\"5360 / 2991\"},width:\"2680\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Get Beautiful Answers Instantly\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"475\",src:\"https://framerusercontent.com/images/y2gEZpWeJrCbH55o7D5EQjgMdxs.gif\",srcSet:\"https://framerusercontent.com/images/y2gEZpWeJrCbH55o7D5EQjgMdxs.gif?scale-down-to=512 512w,https://framerusercontent.com/images/y2gEZpWeJrCbH55o7D5EQjgMdxs.gif?scale-down-to=1024 1024w,https://framerusercontent.com/images/y2gEZpWeJrCbH55o7D5EQjgMdxs.gif 1600w\",style:{aspectRatio:\"1600 / 950\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"No waiting for a chat reply or breaking your flow. Prompt in plain English\u2014Querio handles the rest. Clear visual outputs and data, instantly. \"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Iterate Freely with Full Transparency\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"602\",src:\"https://framerusercontent.com/images/R6BkKWJmfpRbvDyaoLuypEAZDM.gif\",srcSet:\"https://framerusercontent.com/images/R6BkKWJmfpRbvDyaoLuypEAZDM.gif?scale-down-to=512 512w,https://framerusercontent.com/images/R6BkKWJmfpRbvDyaoLuypEAZDM.gif?scale-down-to=1024 1024w,https://framerusercontent.com/images/R6BkKWJmfpRbvDyaoLuypEAZDM.gif 1600w\",style:{aspectRatio:\"1600 / 1204\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Mid-thought changes? No problem. Edit your prompts mid-flight and watch Querio update your answers in real time. You can even peek behind the scenes to see the SQL and Python that power your insights. (Don't worry, you can also edit them directly). \"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Drill Down and Understand Deeply\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"602\",src:\"https://framerusercontent.com/images/xZxfpxeEhMGAxBaBbzj8CZ96Y.gif\",srcSet:\"https://framerusercontent.com/images/xZxfpxeEhMGAxBaBbzj8CZ96Y.gif?scale-down-to=512 512w,https://framerusercontent.com/images/xZxfpxeEhMGAxBaBbzj8CZ96Y.gif?scale-down-to=1024 1024w,https://framerusercontent.com/images/xZxfpxeEhMGAxBaBbzj8CZ96Y.gif 1600w\",style:{aspectRatio:\"1600 / 1204\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Want to dig deeper? Drill into any detail, expand your questions, and see how the agent reasons through each step. Go down as many rabbit holes as you need. Exploring your data should feel intuitive.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Save to Dashboards, Stay on Track\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"540\",src:\"https://framerusercontent.com/images/WAVL1BQpUOiSM4r1XinSHEI.gif\",srcSet:\"https://framerusercontent.com/images/WAVL1BQpUOiSM4r1XinSHEI.gif?scale-down-to=512 512w,https://framerusercontent.com/images/WAVL1BQpUOiSM4r1XinSHEI.gif?scale-down-to=1024 1024w,https://framerusercontent.com/images/WAVL1BQpUOiSM4r1XinSHEI.gif 1434w\",style:{aspectRatio:\"1434 / 1080\"},width:\"717\"}),/*#__PURE__*/e(\"p\",{children:\"With one click, pin anything to a dashboard to keep an eye on what matters most. From question to report in a few minutes. Turn any answer into a saved insight.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Code as BI in our native Notebook\"}),/*#__PURE__*/e(\"p\",{children:\"Behind Explore is a flexible notebook with a powerful new agent engine\u2014designed to bring better reasoning, higher accuracy, and faster performance. More on that soon.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"1496\",src:\"https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png\",srcSet:\"https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png?scale-down-to=512 512w,https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png?scale-down-to=2048 2048w,https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png?scale-down-to=4096 4096w,https://framerusercontent.com/images/J9Ervi1YxEVYI5zhU18YnRX7Q.png 5360w\",style:{aspectRatio:\"5360 / 2992\"},width:\"2680\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"And much more\"}),/*#__PURE__*/e(\"p\",{children:\"We\u2019ve also added a few special things for the little details we know you care about:Querio now feels more like a creative space and less like a chatbot. That\u2019s the way data exploration should be.\"})]});export const richText2=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Hi, I\u2019m Gwion\u2014one of the newer faces here at Querio. I joined the engineering team not too long ago, and in typical first-blog-post fashion, I\u2019ve been asked to introduce myself and share a few thoughts. My background\u2019s a bit of a mix: I\u2019ve worked in green energy, finance, manufacturing, and even had a brief stint trying to teach machines how to spot tiny scratches on car paint.\"}),/*#__PURE__*/e(\"p\",{children:\"This is my first blog post here, so no deep technical dive today. Think of it more as an intro of sorts\u2014a bit of a reflection on the shift from working fully remote to being back in the office, and why, despite my best assumptions, I\u2019ve ended up really enjoying it. Somewhere between a diary entry and a quiet apology to past me, who was fairly convinced that anything before 9am was unreasonable.\"}),/*#__PURE__*/e(\"p\",{children:\"After a few years of working fully remote at a solar tech startup\u2014solid team, a respectable amount of Slack gifs\u2014I\u2019ve now joined Querio, where things are properly in-office again. Five(ish) days a week. Desks. Colleagues. Communal cutlery.\"}),/*#__PURE__*/t(\"h3\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Remote Had Its \"}),/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"Vantagens\"})})]}),/*#__PURE__*/e(\"p\",{children:\"There\u2019s a lot to appreciate about remote work. The flexibility, the quiet, the ability to shape your day without much friction. I found a rhythm that suited me, and having that trust to manage my own time was something I valued.\"}),/*#__PURE__*/e(\"p\",{children:\"During that period, I also spent a few months working remotely from Lisbon. The change of scenery was refreshing\u2014different pace, different surroundings, and the chance to step outside at the end of the day and actually feel like I\u2019d gone somewhere. It worked well, and it\u2019s an experience I\u2019m really glad I had.\"}),/*#__PURE__*/e(\"p\",{children:\"But looking back, I started to realise that while I was managing just fine, there were parts of the office\u2014routine, pace, a sense of shared focus\u2014that I hadn\u2019t fully appreciated until they were gone. Nothing dramatic, just a shift in what seems to work better for me now.\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"The Office\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"284\",src:\"https://framerusercontent.com/images/ak7EN7NDy4GSeOikPsD2vOacM8.png\",srcSet:\"https://framerusercontent.com/images/ak7EN7NDy4GSeOikPsD2vOacM8.png?scale-down-to=512 512w,https://framerusercontent.com/images/ak7EN7NDy4GSeOikPsD2vOacM8.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ak7EN7NDy4GSeOikPsD2vOacM8.png 1600w\",style:{aspectRatio:\"1600 / 568\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"When I joined Querio and found out it was fully office-based, I wasn\u2019t exactly buzzing. I\u2019d got used to remote work and genuinely liked it\u2014there was structure to my days, and I didn\u2019t feel like I was cutting corners. But I\u2019d quietly filed myself under \u201Cprobably not a morning person,\u201D so the thought of heading in five days a week felt like a bit of a push.\"}),/*#__PURE__*/e(\"p\",{children:\"It just so happened that cycling to work sliced the commute in half\u2014and weirdly, that\u2019s been one of the best parts of the shift. There\u2019s something about starting the day with a bit of movement that sets the tone. By the time I arrive, I\u2019m alert, I\u2019ve had some fresh air, and my brain\u2019s already doing useful things.\"}),/*#__PURE__*/e(\"p\",{children:\"Once I\u2019m in the office, I\u2019ve noticed the momentum tends to carry on. It\u2019s not about getting more done or being watched over\u2014it\u2019s just easier to get going and stay with the task. There\u2019s a sense of pace and shared focus that makes the day feel a bit more solid.\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"Still Not Romanticising It\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"315\",src:\"https://framerusercontent.com/images/WhNqTUVpoO2XqqgeC7spgGxbviQ.png\",srcSet:\"https://framerusercontent.com/images/WhNqTUVpoO2XqqgeC7spgGxbviQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/WhNqTUVpoO2XqqgeC7spgGxbviQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/WhNqTUVpoO2XqqgeC7spgGxbviQ.png 1600w\",style:{aspectRatio:\"1600 / 630\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Let\u2019s not pretend it\u2019s all inspiration and synergy. There are days when I\u2019d still rather be horizontal, headphones in, churning out tickets. And commuting when it\u2019s cold and raining and you\u2019ve forgotten your jacket is... well, still exactly as annoying as it always was.\"}),/*#__PURE__*/t(\"p\",{children:[\"The office doesn\u2019t magically make work easier, but for me, it makes \",/*#__PURE__*/e(\"em\",{children:\"starting\"}),\" work easier. Which is often half the battle.\"]}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"The Focus Thing\"})}),/*#__PURE__*/e(\"p\",{children:\"Not to wade too deep into the well-trodden ADHD discourse, but working remotely left me a bit scattered. Too many options, not enough nudges. The silence and freedom was nice until it wasn\u2019t. The office doesn\u2019t fix everything, but the movement, the people, the general background hum\u2014it all helps to keep things ticking along. Less doom-scrolling or staring into the fridge, more getting on with it.\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"Also, the People Are Ace\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"303\",src:\"https://framerusercontent.com/images/r0FbFE3cfyl5A9mvvKRFDLay0uA.png\",srcSet:\"https://framerusercontent.com/images/r0FbFE3cfyl5A9mvvKRFDLay0uA.png?scale-down-to=512 512w,https://framerusercontent.com/images/r0FbFE3cfyl5A9mvvKRFDLay0uA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/r0FbFE3cfyl5A9mvvKRFDLay0uA.png 1600w\",style:{aspectRatio:\"1600 / 606\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"One thing that\u2019s made the return to office life genuinely enjoyable is the team. My new colleagues at Querio are sharp, thoughtful, and from all over the place\u2014culturally, professionally, intellectually. It makes for a really energising environment to work in. Conversations jump easily between deep technical ideas, random cultural references, and whatever just popped off in the slack chat.\"}),/*#__PURE__*/e(\"p\",{children:\"There\u2019s a lot of curiosity here, and that\u2019s contagious. It pushes you to raise your game a bit, but without any weird competitiveness. Just people who want to build cool stuff, and want to do it well\u2014with a healthy dose of humour along the way.\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"So Yeah\u2026 Who Knew?\"})}),/*#__PURE__*/t(\"p\",{children:[\"I used to think office life was something to tolerate at best. Now I\u2019ve got a regular desk, a bike route I genuinely look forward to, and a working day that feels a bit more \",/*#__PURE__*/e(\"em\",{children:\"held together\"}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"Remote work gave me a lot, and I wouldn\u2019t trade those Lisbon months for anything. But for now, the rhythm of turning up somewhere, seeing familiar faces, and starting the day with a bit of purpose\u2014it works.\"}),/*#__PURE__*/e(\"p\",{children:\"It\u2019s not about choosing sides. Just noticing that sometimes, what you thought was a compromise turns out to be a better fit. And maybe even enjoying it a bit more than you\u2019re willing to admit out loud.\"})]});export const richText3=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Heyo, it's me again, Pedro, and today I want to talk about the technology of the year: Websockets\"}),/*#__PURE__*/e(\"p\",{children:\"Yes, I know websockets are older than me, but it's an incredible piece of technology that is completely underrated and not many people talk about it (at least not enough).\"}),/*#__PURE__*/e(\"p\",{children:\"So, this is not an introduction to websockets nor a tutorial on how to use it, I'm just going to share how we are using websockets to power our new Agent V7. But first, I need to explain at least why websockets.\"}),/*#__PURE__*/e(\"p\",{children:\"Networks are literally decades older than me, so of course people WAY SMARTER than me have already figured out the best way to communicate over networks, and basic Networks 101 tells us that we should use REST over HTTP, and I agree with that. Kind of.\"}),/*#__PURE__*/e(\"h3\",{children:\"The standard and boring way: HTTP\"}),/*#__PURE__*/e(\"p\",{children:\"Why should we use HTTP? 99% of the applications that we use every day are built using only HTTP, and for a good reason. It's simple, it's easy to understand, and it's a very good protocol for most cases. But it lacks a few things:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"It's a one-way protocol. You can only send data from the client to the server, and the server returns a response with the outcome of the request. The server can't send data to the client without the client asking for it.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"If the request takes a long time to complete, the client will just hang there waiting for the server to respond.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"So, imagine Querio using only HTTP requests: you ask a question, the agent takes 25 seconds to answer, and you keep staring at the loading wheel for 25 seconds waiting for the answer, without any feedback on what's happening. That's of course not a good experience, so how can we solve this?\"}),/*#__PURE__*/e(\"p\",{children:\"The second problem has a solution, and it's called Streaming. When you make an HTTP request, the server can stream responses to the client, and the client can subscribe to this stream and receive the data as soon as it's available. But this API is REALLY bad. For example, it's very hard to stream multiple structured objects, because the way streaming works, it's possible that you receive a partial object, and you need to keep track of this partial object until the server sends the next part of it. Then, the server can send the last part of the object, but at the same time send another partial object, and then you need to write a script that can handle this, and in the end it's a nightmare\u2014it's really, really, really bad.\"}),/*#__PURE__*/e(\"p\",{children:\"But then I started thinking: Bro, game developers are WAY AHEAD of us in this game, web dev is decades behind game dev in every single aspect, so let's look at some techniques that they implement in games that we can use to improve our product. Because at the end of the day, in a multiplayer game you send an action, and the server needs to send all of the information that changed back to the client, and it should also be able to send information from other players to the client, even if the client doesn't request it, with extremely low latency. So how do they do it?\"}),/*#__PURE__*/e(\"h3\",{children:\"Game Developers are way more intelligent than Web Developers: The UDP way\"}),/*#__PURE__*/e(\"p\",{children:\"Well, Game Developers use something called UDP, and this is a protocol that is way simpler and faster than HTTP. It works like this:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:'You \"connect\" to a UDP server. (There\\'s no handshake)'})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"You send a message to the server.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"The server sends N responses (packets) to the client.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"If your connection is bad, you can have packet loss, so the client loses this information.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"You can receive data in any order, so the client needs to be able to handle this.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"When we make an HTTP request, with every request we need to have a handshake to make sure it's connected to the server, and then we send the request. But in UDP we don't have any handshake, and we don't have, in fact, a connection, meaning that you can send and receive messages almost instantly. And this is very important for a multiplayer game; for example, CS:GO natively receives 64 packets per second, which means the server should be sending 1 packet every 15ms. When playing a tournament, this increases to 128 packets per second, which means the server should be sending 1 packet every 7.8ms. This is something that's just possible with this kind of connection\u2014you would NEVER be able to do this with HTTP.\"}),/*#__PURE__*/e(\"p\",{children:\"But the thing is, UDP is a protocol that is not reliable, and it's not designed to be used in modern web apps. It lacks some features that we need for a reliable web app, like:\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Ensuring that packets are received in order.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Error checking so that the packets are not corrupted.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Congestion control so that the server doesn't overload the client.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"So, if we want to use the speed and efficiency of UDP, make sure the server can talk to the client without being requested, and at the same time we want to have all of the features that HTTP provides, what can we do?\"}),/*#__PURE__*/e(\"p\",{children:\"Well, here's where TCP comes in handy.\"}),/*#__PURE__*/e(\"h3\",{children:\"TCP: The hero we wanted (and needed)\"}),/*#__PURE__*/e(\"p\",{children:\"TCP is basically UDP with a handshake, meaning that you need to create a connection to the server, and then you can send and receive messages. It also has all of the features that we mentioned before that UDP lacks, and while it's a little bit slower than UDP, it's still VERY fast\u2014and when I say very fast, I mean it. And to implement TCP in a web app, we can use something called WebSockets.\"}),/*#__PURE__*/e(\"p\",{children:\"I won't go into detail on how WebSockets work\u2014there are plenty of articles written by people WAY smarter than me online\u2014but I'll explain how we use it to power our new Agent V7.\"}),/*#__PURE__*/e(\"p\",{children:\"The new Agent V7 is way more complex than the previous version. While V6 was a single agent, V7 uses a multi-agent architecture, and each agent has a different purpose. One plans the actions, one writes SQL, one writes Python, one makes visualizations, and so on. Coordinating all of those agents and sending the data to the client would be a nightmare with HTTP, but with WebSockets it's 10x easier. Every agent happens in a step, and every step has a lot of data in it. All we need to do is, every time we update the state of the step, we send the state to the client in a structured way, and the client can just update the UI with the new data\u2014way more reliable than Streaming, making the development experience way better, and the UI way more responsive.\"}),/*#__PURE__*/e(\"p\",{children:\"But the WebSockets ecosystem sucks; it's not as popular as HTTP, so we don't have many developers spending time making a good ecosystem for it with good libraries and tools. So we need to do it ourselves, and that's what we did.\"}),/*#__PURE__*/e(\"p\",{children:\"I won't go into detail on how we implemented it, because I want to make an open source library for this that everyone can use, and when I develop it, I'll go into detail about it. But I'll give some of the highlights of the implementation, which is totally based on a router-based architecture.\"}),/*#__PURE__*/e(\"h4\",{children:\"Router-based websockets.\"}),/*#__PURE__*/e(\"p\",{children:\"In websockets you send events and receive events, and those events aren't related AT ALL to each other, meaning that you don't know if an event is related to a request or not. For that, I made routers.\"}),/*#__PURE__*/t(\"p\",{children:[\"A router is just an HTTP router. But instead of having a path, it has a typeName. In a shared library (to be used both on the server and the client) you can create a type for your route, specifying the typeName and the parameters it needs. Then, on the server you can create a handler for the events that, when identifying the typeName, can call the function that handles that route. On the front-end, you can implement a custom \",/*#__PURE__*/e(\"code\",{children:\"send\"}),\" function that has all the types, and then you can just call it with the parameters it needs.\"]}),/*#__PURE__*/t(\"p\",{children:[\"But this doesn't solve the problem of the events not being related to each other. For that I created a custom event system. If the route is called \",/*#__PURE__*/e(\"code\",{children:\"orchestrator/query\"}),\", for example, on the server we can define multiple responses for that route, like \",/*#__PURE__*/e(\"code\",{children:\"orchestrator/query:response\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"orchestrator/query:error\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"orchestrator/query:progress\"}),\", and so on. Then, the server can send N events to the client, making it really easy to understand where this event comes from.\"]}),/*#__PURE__*/e(\"p\",{children:\"There's another problem with WebSockets too, and it's the fact that you can send an event but you can't await a response. This means that if you want to simulate an HTTP request through websockets, you would need to send the event and then create a handler for the response. This is not good; it's not a good experience, and if it's not a good experience then I don't want to do it. So, how can we solve this?\"}),/*#__PURE__*/t(\"p\",{children:[\"I racked my brain a little, but I found a solution. I implemented a \",/*#__PURE__*/e(\"code\",{children:\"sendAsync\"}),\" event so that every time we send an event through it, it sends a promise, appends a messageId to the event, and finally creates a promise to be resolved later. Then, the server can send N events to the client with the messageId, and the messageId is appended to a list, and when the request ends, the server sends a typeName \",/*#__PURE__*/e(\"code\",{children:\"finish\"}),\" with the messageId. Once receiving the finish event, the client can resolve the promise with all of the messages that were sent to it.\"]}),/*#__PURE__*/e(\"p\",{children:\"Example usage:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'const metadataResponse = await sendAsync(\"ds/check-metadata\", {}).then((m) => m[0]); // Only a single response\\nif (metadataResponse.typeName === \"ds/check-metadata:waiting\") {\\n  connecting.current = false;\\n  connected.current = true;\\n  resolve(true);\\n  setDatasourceStatus(metadataResponse.response);\\n  return;\\n}',language:\"TypeScript\"})})}),/*#__PURE__*/e(\"p\",{children:\"This is a much nicer way to handle events, meaning that we receive the response as soon as it's available and we can wait for it, just like in HTTP. This is also completely type safe, because every response starts with the typeName and then the parameters, meaning that we can have a function signature like this:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/HTBsNkEMAb7TUGaO3DBy/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(s,{...t,code:'<T extends keyof AgentWsRouterInputs>(\\n  typeName: T,\\n  input: PartialPartial<z.infer<AgentWsRouterInputs[T]>, \"messageId\">,\\n): Promise<Extract<TypedAgentWsMessage, { typeName: `${T}:${string}` }>[]>',language:\"TypeScript\"})})}),/*#__PURE__*/t(\"p\",{children:[\"As you can see, it's going to return every single TypedAgentWsMessage that has the typeName \",/*#__PURE__*/e(\"code\",{children:\"${T}:${string}\"}),\", with T being the typeName of the event.\"]}),/*#__PURE__*/e(\"h4\",{children:\"Connection\"}),/*#__PURE__*/e(\"p\",{children:\"Here's another fun challenge websockets throw our way: keeping that connection alive!\"}),/*#__PURE__*/e(\"p\",{children:\"Think about it. If you're a developer working on Agent V6 with streaming, life is pretty chill. Server restarts? No problem! Since there's no persistent connection needed, you can just keep working on your questions without any problems. But with WebSockets? Every server restart means bye-bye to all your connections. Not great for development.\"}),/*#__PURE__*/e(\"p\",{children:'So how do we fix this? We need a solid reconnection system. And honestly, it\\'s not rocket science. We just re-use our connection function, but with a twist: when it\\'s a reconnection, we send the old agent state back to the server. And guess what? This elegant little solution actually kills three birds with one stone! We can use this same function to implement the \"continue chat from here\" feature AND the \"edit element\" feature. So by solving one problem, we get two more solutions for free. Pretty sweet deal.'}),/*#__PURE__*/e(\"h4\",{children:\"Downsides\"}),/*#__PURE__*/e(\"p\",{children:\"Let's be honest: there's a reason why we don't use websockets everywhere. Working with WebSockets is not all rainbows and unicorns. The asynchronous and event-driven nature of WebSockets creates some real debugging nightmares. You'll often find yourself piecing together confusing logs, trying to figure out what happened and when. Infrastructure challenges? Absolutely. Those persistent connections can be problematic, as we already saw with our reconnection issues. Every time the server restarts, boom, connections lost.\"}),/*#__PURE__*/e(\"p\",{children:\"And the learning curve is steep, my friends. Without the robust ecosystem of tools and libraries that HTTP enjoys, you're often left building custom solutions for everything, like reconnection logic, error handling, state management, you name it. This all adds up to significantly more development time and complexity. Buuuut with the structure that we are using right now, it's not much harder than using HTTP, you just need to do a little bit more work and be a little bit more careful.\"}),/*#__PURE__*/e(\"h3\",{children:\"Conclusion\"}),/*#__PURE__*/e(\"p\",{children:\"As you can see, there\u2019s no perfect solution, every protocol has their strengths and downsides, and Websockets are not an exception. But I believe we were able to overcome most of the problems with our implementation, and this structure is going to be used to power Querio for a looooong time.\"})]});export const richText4=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"Sometimes these blogs turn into a personal diary, I think this one is going that way. As a founder I am my own worst critic, I think many other founders can relate to this. Nothing is ever good enough, no effort can justify ending the day, and success is not a real thing - only the pursuit of it is. The times I judge myself hardest are when I\u2019m working on the 20% of the 80/20 rule.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"347\",src:\"https://framerusercontent.com/images/deljxMfd55YMoVuukUqMxRZzOlI.png\",srcSet:\"https://framerusercontent.com/images/deljxMfd55YMoVuukUqMxRZzOlI.png?scale-down-to=512 512w,https://framerusercontent.com/images/deljxMfd55YMoVuukUqMxRZzOlI.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/deljxMfd55YMoVuukUqMxRZzOlI.png 1600w\",style:{aspectRatio:\"1600 / 694\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"If you haven\u2019t heard of the 80/20 rule, it\u2019s this concept where 80% of the result comes from 20% of the effort, and the other 20% of the result takes 80% of the effort. Beginning a task is simple, getting most of the way there is manageable, but completing it is difficult. That\u2019s how I am. I struggle with long-term effort because the results don\u2019t appear quickly. You spend day after day on that last 20%, and nothing shows up to keep you motivated. Now the funny thing is, this is the entire definition of a startup. Most days are bleak.\"}),/*#__PURE__*/e(\"p\",{children:\"You start a company really motivated. You work long hours with your small team, to see almost no progress. You send sales email to the abyss, obsess over UI/UX with no customers using it, and watch your funding dwindle while it feels like you\u2019re making no incremental improvement forever. There\u2019s a name for this in startups: the valley of despair. It\u2019s not just me\u2014Querio has experienced it too.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"347\",src:\"https://framerusercontent.com/images/31HRErOP40jBLhLZ4mndvgoAI4.png\",srcSet:\"https://framerusercontent.com/images/31HRErOP40jBLhLZ4mndvgoAI4.png?scale-down-to=512 512w,https://framerusercontent.com/images/31HRErOP40jBLhLZ4mndvgoAI4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/31HRErOP40jBLhLZ4mndvgoAI4.png 1600w\",style:{aspectRatio:\"1600 / 694\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"This comes from the Dunning-Kruger effect. You begin without understanding the difficulty, thinking it\u2019s easy, even when you lack skills. Then you see how challenging it is and how unprepared you are, and you feel discouraged. Later, you gain abilities but think the task is harder than it is and doubt yourself. Querio has gone through these stages as a company and a product. I have too. Fundraising calls were simple to get at first, then closing a deal became extremely hard. Candidates agreed to interviews easily, but finding the right person was tough. Now, with good funding and the best team we\u2019ve had, I face a new challenge: learning to manage a tech company as a first-time CEO while making Querio the top AI agent.\"}),/*#__PURE__*/e(\"p\",{children:\"I have investors who trust us with their money, employees who depend on Querio for their jobs, and customers who rely on us to solve their issues. Sales began well again\u2014growth is double digits every month, no worries, anon investor\u2014but scaling it is getting complicated. My team knows more than I do in many areas, and it\u2019s humbling (yes, team, I\u2019m serious). Customers need an experience that delights them, which required Querio to push through its own valley.\"}),/*#__PURE__*/e(\"p\",{children:\"This is where the AI agent valley of death starts. Creating an AI MVP is very easy. Honestly. These tools generate perfect SQL and Python without effort. Coding feels fast! You can build web apps in minutes. It seems like production-grade AI workflows are close. They aren\u2019t. AI follows the 80/20 rule perfectly. Controlled demos are straightforward, but real-world databases are chaotic\u2014tables don\u2019t connect, fields are missing, data is outdated. The market doesn\u2019t fully see this yet, but Querio\u2019s team has worked hard to overcome it.\"}),/*#__PURE__*/e(\"p\",{children:\"We began with a SQL-only AI tool. Now Querio handles SQL and Python, offers manual notebooks for technical users, co-pilot mode for detailed work, and helps non-technical people get answers quickly. It manages large datasets, stays accurate, follows governance rules, and remains enjoyable to use. That took a lot of effort. AI is simple for the first 80%, but the last 20% is incredibly hard. Customers value that we don\u2019t exaggerate; we provide results. We\u2019re one of the few AI agents, and even fewer AI-native BI tools, used in production by real companies daily.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"269\",src:\"https://framerusercontent.com/images/EZWDDdmAi2Ee3gsOPNFbadfZvo.png\",srcSet:\"https://framerusercontent.com/images/EZWDDdmAi2Ee3gsOPNFbadfZvo.png?scale-down-to=512 512w,https://framerusercontent.com/images/EZWDDdmAi2Ee3gsOPNFbadfZvo.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/EZWDDdmAi2Ee3gsOPNFbadfZvo.png 1600w\",style:{aspectRatio:\"1600 / 538\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Querio has evolved from a SQL only AI call, to a complex agent that supports SQL and Python, that has manual and co-pilot notebooks for your deepest work, and the first line of defense for the non-technical side of the business to get all their data needs met. The effort it has taken to build a product that can handle full workflows, huge databases, stay reliable and accurate, allow governance, and deliver an amazing experience has largely been an exercise of pure grit. AI is easy for the 80, but it is SO hard for the 20 it\u2019s ridiculous. This has largely gained us respect with our customers, as we don\u2019t overpromise and we over deliver. We can proudly say we are one of a handful of AI agents, let alone AI native BI tools, that are used in production by real companies every day.\"}),/*#__PURE__*/t(\"p\",{children:[\"Writing this makes me think. Querio and I have already moved past so many valleys of despair. Maybe I\u2019m just doubting myself too much again. If your business is in its own valley, struggling with data or trying to use AI for real value, contact me. Book a demo on the website or email me at \",/*#__PURE__*/e(a,{href:\"mailto:rami@querio.ai\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"rami@querio.ai\"})}),\".\"]}),/*#__PURE__*/e(\"p\",{children:\"In fact, tell me you\u2019re in the valley of despair and i\u2019ll extend your pilot by 6 weeks so we can get you out of it before you commit.\"})]});export const richText5=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"p\",{children:\"At the time of writing we are doing a release tomorrow and it's 18 degrees in London. As a result I am going to do this even more livejournal 2006 style than last time.\"}),/*#__PURE__*/e(\"h2\",{children:\"money trees\"}),/*#__PURE__*/e(\"p\",{children:\"Now to the good news. Last time I promised to regale you with more tales of me using stuff wrong bending technology to my will. But I lied, I don't do that any more. I have this new intern working for me called Claude (weird name), you might have heard about him.\"}),/*#__PURE__*/e(\"p\",{children:\"After a month of heavy Claude Code use I have some impressions to share.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"226\",src:\"https://framerusercontent.com/images/4Is4xdcjSi7c9MnWWCJ3ko62VsQ.png\",srcSet:\"https://framerusercontent.com/images/4Is4xdcjSi7c9MnWWCJ3ko62VsQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/4Is4xdcjSi7c9MnWWCJ3ko62VsQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/4Is4xdcjSi7c9MnWWCJ3ko62VsQ.png 1600w\",style:{aspectRatio:\"1600 / 452\"},width:\"800\"}),/*#__PURE__*/e(\"h4\",{children:\"claude code is ok at flying around a codebase\"}),/*#__PURE__*/e(\"p\",{children:\"I was surprised at how effective Claude managed to orienteer around our often dizzyingly meandering codebase.\"}),/*#__PURE__*/t(\"p\",{children:[\"Anthropic just let it use \",/*#__PURE__*/e(\"code\",{children:\"grep\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"find\"}),\" and it's off to the races. Shoutout to all the no-syntax-highlighting vi-code-editing C USB driver developers for showing a machine how to navigate large codebases from the terminal.\"]}),/*#__PURE__*/e(\"h4\",{children:\"claude code is ok at following an established pattern\"}),/*#__PURE__*/t(\"p\",{children:[\"I have thrown it into some serious snake-pits crawling with generic typescript types and python statements indented 8 levels in. It manages to produce useful edits and I \",/*#__PURE__*/e(\"strong\",{children:\"love\"}),\" the way it always adds the closing curly-bracket at the end, it just gets me going.\"]}),/*#__PURE__*/e(\"h4\",{children:\"claude code edits are fine\"}),/*#__PURE__*/e(\"p\",{children:\"It rarely manages to suggest an edit I had in mind first try, but we can go back and forth and eventually get there. And don't get me wrong...\"}),/*#__PURE__*/t(\"p\",{children:[\"I \",/*#__PURE__*/e(\"em\",{children:\"like\"}),\" sticking into a few codebases and solving a problem. I enjoy my first thought in the morning being about how I can skim down the data-model. I do not mind not shaving for 10 days, not talking to anybody - hammering keystrokes until \",/*#__PURE__*/e(\"code\",{children:\"tsserver\"}),\" goes OOM or the control flow is etched on the inside of my eyelids - whichever comes first. And I will allow the occasional dream about an edge case that I haven't covered interrupt my precious REM sleep.\"]}),/*#__PURE__*/e(\"p\",{children:\"But, being real, I also enjoy just like eating a choc-chip cookie and drinking tea (milk, no sugar, c'mon England) while a pay-to-win API helps me out here and there. Don't hate me!\"}),/*#__PURE__*/e(\"h4\",{children:\"claude code is expensive\"}),/*#__PURE__*/t(\"p\",{children:[\"Alas, I cannot (yet) turn to cookies and tea full-time. Claude Code is expensive! I think it's \",/*#__PURE__*/e(\"em\",{children:\"value bro\"}),\" and I praise the heavens that my CEO thinks the same. Also sometimes Claude Code is bad. Well, not bad, just hopeless.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h2\",{children:\"sql trees\"}),/*#__PURE__*/e(\"p\",{children:\"17 minutes left. To type, not to read - don't worry. Unless you're in like 2nd grade. In which case: well done! Keep it up, little vibe coder!\"}),/*#__PURE__*/e(\"p\",{children:\"At the beating heart of Querio is an agent, not unlike Claude Code, which can write SQL and Python to help you do analytics, track metrics, la la la, all that stuff you love to do with your data. The agent has a set of tools to do that - it can run queries, execute Python code, create visualisations. It's as smart as the latest available API and it's great.\"}),/*#__PURE__*/e(\"p\",{children:\"Yawn! I'm not here to do cool agents over web-socket, I am here to build :star: boring enterprise features :star: and an occasional less-boring feature like this next one.\"}),/*#__PURE__*/t(\"p\",{children:[\"So imagine you got a response from Querio - it's usually a three-tuple of \",/*#__PURE__*/e(\"code\",{children:\"(sql, some_python, some_visualisation)\"}),\". Well actually, more like a singly-linked list but you get the idea. You like the answer but you want to tweak a few things: like maybe the date range you were asking over (agent inferred this from your conversation) or other conditions (that the agent set from your prompts).\"]}),/*#__PURE__*/t(\"p\",{children:[\"You \",/*#__PURE__*/e(\"em\",{children:\"could\"}),\" carry on chatting. But you like your result so much that you're like: \\\"no I don't want a new result, I want this result just \",/*#__PURE__*/e(\"em\",{children:\"slightly\"}),' different!\"']}),/*#__PURE__*/e(\"p\",{children:\"This is where I come in.\"}),/*#__PURE__*/e(\"h4\",{children:\"erm, what is sql again?\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"326\",src:\"https://framerusercontent.com/images/DF1wI0vv129F7jnnDGjuQa4RWGs.png\",srcSet:\"https://framerusercontent.com/images/DF1wI0vv129F7jnnDGjuQa4RWGs.png?scale-down-to=512 512w,https://framerusercontent.com/images/DF1wI0vv129F7jnnDGjuQa4RWGs.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/DF1wI0vv129F7jnnDGjuQa4RWGs.png 1600w\",style:{aspectRatio:\"1600 / 652\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"SQL is a collection of tokens - a language. Tokens arranged in a special order give rise to meaning. tokens -> meaning. Great! Class dismissed!\"}),/*#__PURE__*/e(\"p\",{children:\"Not so fast. If I want to skip all the steps from tokens to meaning I have to shell out like $600 for OpenAI o1 Pro Max with Face Unblur! And after all that it might still sample your answer on the wrong end of the distribution and spit back something useless. Nah.\"}),/*#__PURE__*/e(\"p\",{children:\"I just want a good-ol compooter system! Fine, then we have to\"}),/*#__PURE__*/t(\"ol\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"tokenize 1.1. (maybe) lex (not the podcast host)\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"parse\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"interpret\"})})]}),/*#__PURE__*/t(\"p\",{children:[\"Why are we talking about this? You wanted to change your Querio output \",/*#__PURE__*/e(\"em\",{children:\"just a little bit\"}),\" didn't you? Remember your answer bundle: \",/*#__PURE__*/e(\"code\",{children:\"(sql, python, visualisation)\"}),\" - it all hinges on the SQL. He who controls the SQL controls the Universe!\"]}),/*#__PURE__*/e(\"p\",{children:\"Let's go step by step: tokenize, lex, parse - boring, boring, boring - let's leave it to the clever people and give me the juicy stuff - the SQL AST. Abstract syntax tree (AST) is what happens when computer says \u201Cheh\u201D, throws away all the carefully placed indentation, casing and other non-semantic garbage to produce an object in memory a computer can understand.\"}),/*#__PURE__*/e(\"p\",{children:\"Now I have an AST I can adorn it with useful context Querio already has, like metadata about the columns, column types, other stuff.\"}),/*#__PURE__*/t(\"p\",{children:[\"Take the labeled AST and \",/*#__PURE__*/e(\"em\",{children:\"traverse\"}),\" that baby. As you hop over the tree-nodes - collect any intermediate representation that you want - crunch some nodes, ignore others, flatten these, invert those. Whoosh! We just got a new \",/*#__PURE__*/e(\"em\",{children:\"interpretation\"}),\" of the SQL! The great thing is that the new interpretation is just SQL with glasses and a moustache!\"]}),/*#__PURE__*/t(\"p\",{children:[\"But here's where it gets interesting. This new interpretation isn't more SQL code - it's a collection of form fields, dropdowns, checkboxes, date pickers - you know what passes for a UI in 2025. Each \",/*#__PURE__*/e(\"code\",{children:\"WHERE\"}),\" clause becomes a toggle, each date range becomes a calendar picker, each \",/*#__PURE__*/e(\"code\",{children:\"JOIN\"}),\" condition becomes a dropdown menu (roughly speaking).\"]}),/*#__PURE__*/t(\"p\",{children:[\"Think about it - when the agent gives you a SQL query with \",/*#__PURE__*/e(\"code\",{children:\"WHERE created_at BETWEEN '2023-01-01' AND '2023-01-31'\"}),\". What does that even mean? I don't know, but it sure ain't the King's English! Wrap this into an HTML form and do it fast before I scratch my own eyes out! Ahhhh, a 300MB date picker with custom styles! Says \\\"Jan 1, 2023 - Jan 31, 2023\\\" and lets me drag the endpoints around!\"]}),/*#__PURE__*/e(\"p\",{children:\"Remember: the program is the data is the interface. You plug the HTML forms, we translate them back to SQL and update your answer bundle (sql', python', visualization'). I glossed over this bit but you imagine how, naturally, all analysis depends on the data - when we change the SQL, the, erm, data changes, the analysis changes. But only a little bit! That is what we wanted! Slightly different output without sticking your hand in the Schr\\xf6dinger's bag where the right AI-generated answer might or might not be.\"}),/*#__PURE__*/e(\"h2\",{children:\"regular trees\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"175\",src:\"https://framerusercontent.com/images/fhHEsRBS9W5MOH1CiPyGRu9fdd0.png\",srcSet:\"https://framerusercontent.com/images/fhHEsRBS9W5MOH1CiPyGRu9fdd0.png?scale-down-to=512 512w,https://framerusercontent.com/images/fhHEsRBS9W5MOH1CiPyGRu9fdd0.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/fhHEsRBS9W5MOH1CiPyGRu9fdd0.png 1600w\",style:{aspectRatio:\"1600 / 350\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"The birds are coming back. You know what that means - spring in the northern hemisphere baby!\"}),/*#__PURE__*/e(\"p\",{children:\"I've been thinking about regular trees lately. The ones with leaves and branches.\"}),/*#__PURE__*/e(\"p\",{children:\"There's a massive oak outside my window that I've been watching for the past few weeks. Happy to report it is not moving. It might have some buds. No leaves yet. I will keep you posted.\"}),/*#__PURE__*/e(\"p\",{children:\"Trees are good though. No maintenance, no updates, no CRON - same code runs every year, no runtime exceptions.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h2\",{children:\"thanks\"}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s it. Til next time, keep your functions pure! I'll know if you don't! Thanks to SQL for being so bad people would rather use HTML from than learn it.\"}),/*#__PURE__*/e(\"p\",{children:\"~ n\"})]});export const richText6=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"My brother Santiago doesn\u2019t work in tech. As fas as I know, he\u2019s never queried a database or built a piece of software. But he\u2019s a hell of an outdoorsman and, despite being as big as a bear, he\u2019s one of the most emotionally aware people I know. A couple years ago, the family and I visited him in Corvallis, Oregon, where he was at university \u2014 or as he calls it\u2026 \u201CCorvegas\u201D \uD83D\uDE02. We were there for a multi-day rafting trip down the \",/*#__PURE__*/e(a,{href:\"https://maps.app.goo.gl/6DAPDhAzy13Bip5J7\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"Deschutes River\"})}),\". I expected adventure, which I got, but I also learned something I\u2019ll never forget. I want to tell you about it and then apply it to some of the scenarios that I think make sense to the world of tech.\"]}),/*#__PURE__*/e(\"p\",{children:\"The Deschutes River winds through Oregon\u2019s high desert, carving a path between towering cliffs and dense forests. Throughout a rafting trip, you encounter other groups out in the wild, in a setting far removed from daily life. When you pass people on the busy city streets, they blur into the background like NPCs. But on the river, every encounter feels significant, and there\u2019s always that moment of hesitation before greeting a fellow adventurer.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"434\",src:\"https://framerusercontent.com/images/b5eydF15NdLzRipyXpyHvXkA.png\",srcSet:\"https://framerusercontent.com/images/b5eydF15NdLzRipyXpyHvXkA.png?scale-down-to=512 512w,https://framerusercontent.com/images/b5eydF15NdLzRipyXpyHvXkA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/b5eydF15NdLzRipyXpyHvXkA.png 1600w\",style:{aspectRatio:\"1600 / 868\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"While I was on the raft with Santiago, we spotted another group ahead at some point. He immediately raised his hand to wave, and noticed my slight hesitation. \u201CAlways be first to say hi,\u201D he said with that gentle giant smile of his. \u201CIt doesn\u2019t matter if it feels awkward or if they don\u2019t respond \u2014 you do what\u2019s right. It makes the river a better place.\u201D Simple words, but they resonated strongly with me out there on the water, where everything feels real and life has a chance to slow down. When I told my dad about this conversation, he added another layer that stuck with me. \u201CBeing confident enough in yourself to be the first one to say hi \u2014 that shows real strength,\u201D he said. And he\u2019s right.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"434\",src:\"https://framerusercontent.com/images/ZkZKpXtxwFN80frMGI9DkOHV0ls.png\",srcSet:\"https://framerusercontent.com/images/ZkZKpXtxwFN80frMGI9DkOHV0ls.png?scale-down-to=512 512w,https://framerusercontent.com/images/ZkZKpXtxwFN80frMGI9DkOHV0ls.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ZkZKpXtxwFN80frMGI9DkOHV0ls.png 1600w\",style:{aspectRatio:\"1600 / 868\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:'That moment of hesitation exists everywhere, from the river to the office. The universal human experience is one of wondering \"should I?\", \"what if they react badly?\" and \"will I feel uncomfortable?\". I face it constantly \u2014 during sales calls when I\u2019m showing what we\u2019ve built and face the possibility of rejection, in the office when sharing an unfinished idea, and even every time I step onto a tennis court, something I\u2019ve been doing all my life, uncertain of how I will play today. '}),/*#__PURE__*/e(\"p\",{children:\"Building Querio, I\u2019ve had to show unfinished products and ideas to investors, users and potential customers. Many times, it felt like being that awkward person on the river, wanting to wave but hesitating. I've gone as far as getting so nervous before a sales call that I catch myself hoping for a last-minute cancellation. Many of those didn\u2019t wave back \u2014 aka, they said no. But the ones who did? They became part of our journey, precisely because we were real and vulnerable with them, found the courage to say hi, and connected on our values and the depth of our ideas.\"}),/*#__PURE__*/e(\"p\",{children:\"In tech, we often hide behind fancy terms, pretend we know everything, or keep our ideas to ourselves. Teams from engineering, data, product, marketing, sales, design, you name it, often act like strangers on opposite riverbanks. Each speaking their own language, neither wanting to wave first. But most breakthroughs I've witnessed started with someone dropping their guard and reaching across that river: \\\"Let's figure this out together - you understand things I don't, and I might have insights that could help too.\u201D\"}),/*#__PURE__*/e(\"p\",{children:\"That\u2019s actually why we pour so much work into Querio \u2014 to make it okay to ask those \u201Cobvious\u201D questions, to explore without feeling stupid and to help people from all technical levels to better understand their business. Because at the end of the day, technology isn\u2019t about who knows the most complex data structure or who can hide behind the fanciest business proposal. It\u2019s about people helping people.\"}),/*#__PURE__*/e(\"p\",{children:\"So yeah, my brother might not know Python from JavaScript, but he taught me something more valuable: walls come down one \u201Chi\u201D at a time. Be kind, be vulnerable, it\u2019s the right thing to do. Whether you\u2019re on a river in Oregon or in an office in London, being the first to reach out or ask a question isn\u2019t weakness \u2014 it\u2019s courage. And nothing meaningful has even been built without courage.\"})]});export const richText7=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"h3\",{children:\"Hey there! \uD83D\uDC4B\"}),/*#__PURE__*/e(\"p\",{children:\"I\u2019m Mariia, Product Designer at Querio. I originally signed up as a UI/UX designer, but as it often happens in startups, I ended up wearing many hats. They even make me write blog articles now \uD83D\uDE42\"}),/*#__PURE__*/t(\"p\",{children:[\"I joined Querio right at the beginning, I was even the first one to join! Since the early days, our website and app design have changed sooo many times. From an outsider\u2019s perspective, it might\u2019ve looked like Querio\u2019s designer was having an identity crisis. Well... that was true. We were all trying to figure out what Querio was. Actually, we still \",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"are\"})}),\" and probably always will be.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Emojis, emojis, and more emojis\"}),/*#__PURE__*/t(\"p\",{children:[\"Let me take you back to the time when Querio was in its \",/*#__PURE__*/e(\"em\",{children:\"emoji era\"}),\".\"]}),/*#__PURE__*/t(\"p\",{children:[\"For context, I was a junior Gen Z designer, so naturally, using emojis felt like the obvious move. It was also a trend, many products were embracing those Apple smiley faces. Sometimes, though, it went \",/*#__PURE__*/e(\"em\",{children:\"too\"}),\" far. For example, in Ukraine (where I\u2019m from), a serious government app called \",/*#__PURE__*/e(\"em\",{children:\"DIIA\"}),\"\u2014which stores all your official documents would send notifications like: \",/*#__PURE__*/e(\"em\",{children:'\"You have to pay a fine\u261D\uFE0F\uD83D\uDCB8\"'}),\". Which to be honest doesn\u2019t make it any less painful to do\u2026 though I do love the app.\"]}),/*#__PURE__*/t(\"p\",{children:[\"With that in mind, I couldn\u2019t resist in sprinkling emojis all over Querio whenever I had the chance. Javier (our co-founder), on the other hand, \",/*#__PURE__*/e(\"em\",{children:\"hated\"}),\" \u201Cthose f***ing emojis.\u201D We had constant debates over whether they had a place in our app at all.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"327\",src:\"https://framerusercontent.com/images/Z3kdrAMk3XpqLBYkJCWm6U1p8ZY.png\",srcSet:\"https://framerusercontent.com/images/Z3kdrAMk3XpqLBYkJCWm6U1p8ZY.png?scale-down-to=512 512w,https://framerusercontent.com/images/Z3kdrAMk3XpqLBYkJCWm6U1p8ZY.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Z3kdrAMk3XpqLBYkJCWm6U1p8ZY.png 1600w\",style:{aspectRatio:\"1600 / 654\"},width:\"800\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Overused emojis: guilty as charged \uD83E\uDDD1\u200D\u2696\uFE0F\"}),/*#__PURE__*/t(\"p\",{children:[\"It took me a while to realize that the way we were using emojis made our designs look cheap rather than cool and friendly. The reason so many designers use emojis is simple: they\u2019re easy and familiar. This made it \",/*#__PURE__*/e(\"em\",{children:\"so tempting\"}),\" to drop them into every modal and took minutes to put together an illustration.\"]}),/*#__PURE__*/e(\"p\",{children:\"But here\u2019s the hard truth, unless you\u2019re Apple, emojis don\u2019t really add anything unique to your product.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"409\",src:\"https://framerusercontent.com/images/ev3AVV0IwQdojZj6T9NNxScwC0.png\",srcSet:\"https://framerusercontent.com/images/ev3AVV0IwQdojZj6T9NNxScwC0.png?scale-down-to=512 512w,https://framerusercontent.com/images/ev3AVV0IwQdojZj6T9NNxScwC0.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ev3AVV0IwQdojZj6T9NNxScwC0.png 1600w\",style:{aspectRatio:\"1600 / 818\"},width:\"800\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"What was the verdict?\"}),/*#__PURE__*/e(\"p\",{children:\"As with most things, the truth was somewhere in the middle.\"}),/*#__PURE__*/t(\"p\",{children:[\"Once I started seeing emojis as a \",/*#__PURE__*/e(\"em\",{children:\"tool\"}),\" rather than a free 3D illustration pack, it all suddenly made sense.\"]}),/*#__PURE__*/e(\"p\",{children:\"Do we still use emojis? Hell yeah. They\u2019re fun, colorful, and most importantly, they work great for differentiating elements. Sometimes, icons just aren\u2019t enough. If you have a long list of items, spotting a familiar emoji is much faster than scanning for a generic icon. Try it yourself below. What can you find first: green book emoji or green book icon?\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"250\",src:\"https://framerusercontent.com/images/9BThIS9v55aFbEGMgOUEgH2x90.png\",srcSet:\"https://framerusercontent.com/images/9BThIS9v55aFbEGMgOUEgH2x90.png?scale-down-to=512 512w,https://framerusercontent.com/images/9BThIS9v55aFbEGMgOUEgH2x90.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/9BThIS9v55aFbEGMgOUEgH2x90.png 1600w\",style:{aspectRatio:\"1600 / 500\"},width:\"800\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Where do we use them?\"}),/*#__PURE__*/e(\"p\",{children:\"We\u2019re currently working on a new version of our app (spoiler alert! \uD83E\uDD2B). In the new design, for example, users can select an emoji for their boards. This makes it much easier to find the right report, especially in the sidebar, where seeing full titles is a privilege.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"250\",src:\"https://framerusercontent.com/images/g0iev6MelQ7mn9iDceN4tT5kZqs.png\",srcSet:\"https://framerusercontent.com/images/g0iev6MelQ7mn9iDceN4tT5kZqs.png?scale-down-to=512 512w,https://framerusercontent.com/images/g0iev6MelQ7mn9iDceN4tT5kZqs.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/g0iev6MelQ7mn9iDceN4tT5kZqs.png 1600w\",style:{aspectRatio:\"1600 / 500\"},width:\"800\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"You don\u2019t need emoji to sound friendly\"}),/*#__PURE__*/e(\"p\",{children:\"You might think removing emojis would make your app look boring and lifeless, but that's not the case. Instead of emojis, we added colors. This wasn't just for the sake of aesthetic appeal, it actually improved the user experience. By giving each tab its own distinct color, we created a pattern that works great for these reasons:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Colors act as visual hints and makes navigating between different sections more intuitive\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:'It perfectly follows one of the main UX principles: \"recall over recognition.\" Users quickly find the Knowledge Base section by spotting the yellow icons, without having to read the label.'})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Makes the interface feel more structured and organized.\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"Helps guide user behavior, reducing errors.\"})})]}),/*#__PURE__*/e(\"p\",{children:\"Thanks to some sweet color combos and friendly writing, Querio keeps its fun vibe going while making it super easy for everyone to get around!\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"250\",src:\"https://framerusercontent.com/images/eA6izwikUenaLYiPLv8SUbWI00.png\",srcSet:\"https://framerusercontent.com/images/eA6izwikUenaLYiPLv8SUbWI00.png?scale-down-to=512 512w,https://framerusercontent.com/images/eA6izwikUenaLYiPLv8SUbWI00.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/eA6izwikUenaLYiPLv8SUbWI00.png 1584w\",style:{aspectRatio:\"1584 / 500\"},width:\"792\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"To sum up\"}),/*#__PURE__*/e(\"p\",{children:\"Yes, cool apps use emojis\u2014but they don't make it their whole personality. Emojis are a tool, not an accessory. And as for visual elements, there are many better options that can make the UI unique and the UX awesome.\"})]});export const richText8=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"There's a meme that's been on my mind lately as I build Querio. It's called the \\\"Midwit\\\". I know this sounds like a joke of a blog, but I have been thinking about this meme in a serious way, and how I've been the\\xa0\",/*#__PURE__*/e(\"em\",{children:\"midwit\"}),\"\\xa0while building Querio\"]}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"The Midwit's Deeper Meaning\"})}),/*#__PURE__*/e(\"p\",{children:\"You've probably seen the Midwit meme, that bell curve with simple statements on both ends and a convoluted explanation in the middle. It's funny because it's true. The novice and the master often reach similar conclusions, while those in the middle overcomplicate everything. I'm not here to talk about bell curves, but more about how this meme captures something profound about how we learn and grow.\"}),/*#__PURE__*/e(\"p\",{children:\"The left side represents instinctual simplicity. The beginner who sees solutions clearly because they don't know the complications. The right side represents true mastery.\\xa0 Where complexity has been processed and distilled back to elegant simplicity. But that middle peak? That's where most of us spend our time. It's where we overthink, over-engineer, and occasionally overcompensate.\"}),/*#__PURE__*/t(\"p\",{children:[\"I use to be very scared of the middle, of being a midwit. I maximized for serendipity, instinct, and actively avoided overthinking to not get stuck. But, as i've built Querio, I've learned that you can't skip the middle. In fact it's going through the middle,\\xa0\",/*#__PURE__*/e(\"em\",{children:\"the exercise of overthinking\"}),\", that is the most necessary.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:/*#__PURE__*/e(\"strong\",{children:\"How i've been a Midwit\"})}),/*#__PURE__*/e(\"p\",{children:\"Building Querio has been a constant navigation through this curve. I'm not claiming to have reached the far end; I'm still very much in the process, but I'm noticing patterns that bring clarity. When you arrive at simplicity naturally, after wrestling with complexity, there's a confidence and clarity that couldn't have come any other way. Here's real examples of how i've been a midwit in Sales, Product, and Fundraising\"}),/*#__PURE__*/t(\"h4\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Sales:\"}),\"\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"We started with raw, direct conversations: \\\"Here's what Querio does, here's how it helps you.\\\" Simple, instinctual, straightforward.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"499\",src:\"https://framerusercontent.com/images/Ia4lDwji20X5QZerwGjcdL6qQKQ.png\",srcSet:\"https://framerusercontent.com/images/Ia4lDwji20X5QZerwGjcdL6qQKQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/Ia4lDwji20X5QZerwGjcdL6qQKQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Ia4lDwji20X5QZerwGjcdL6qQKQ.png 1772w\",style:{aspectRatio:\"1772 / 998\"},width:\"886\"}),/*#__PURE__*/e(\"p\",{children:\"Then we entered the Midwit. We built complex GTM frameworks with multi-stage sequences. We created elaborate qualification processes with BANT criteria and Triple III frameworks. We analyzed every word of our outreach, tested countless email variations, and created intricate sales playbooks that would make enterprise SaaS veterans proud.\"}),/*#__PURE__*/e(\"p\",{children:\"Now we're finding our way back to simplicity \u2013 but an informed simplicity. Our messaging has become clearer and more powerful. Our process more refined but less complicated. We know what works because we've tested what doesn't. The confidence in our approach comes from having explored the complexity and found our way back.\"}),/*#__PURE__*/e(\"p\",{children:\"The simple message we've returned to isn't the same one we started with \u2013 it's been forged in the fire of complexity and emerged stronger.\"}),/*#__PURE__*/e(\"h4\",{children:/*#__PURE__*/e(\"strong\",{children:\"Product:\"})}),/*#__PURE__*/e(\"p\",{children:\"The same pattern emerged with our product vision. We began with a focused AI data agent, a product that helps people work with their data regardless of technical skill.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"499\",src:\"https://framerusercontent.com/images/kqm4B1Gsrz75BHhGm1HhEwxrEyQ.png\",srcSet:\"https://framerusercontent.com/images/kqm4B1Gsrz75BHhGm1HhEwxrEyQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/kqm4B1Gsrz75BHhGm1HhEwxrEyQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/kqm4B1Gsrz75BHhGm1HhEwxrEyQ.png 1772w\",style:{aspectRatio:\"1772 / 998\"},width:\"886\"}),/*#__PURE__*/e(\"p\",{children:\"Then we expanded \u2013 perhaps too far \u2013 into the infrastructure side. We built custom orchestrators, semantic knowledge graphs, and context preservation systems. We explored every technical avenue, considered every architecture decision, and built sophisticated systems that could handle any data scenario imaginable.\"}),/*#__PURE__*/e(\"p\",{children:\"Now we're returning to our core: an AI-powered analytics platform that makes data accessible to everyone while preserving critical context. But we're taking the fastest path there, informed by everything we learned in the complex middle.\"}),/*#__PURE__*/e(\"p\",{children:\"Mind you, our customers see the difference. One data team cut their request backlog by 80%. Business users now get answers in minutes instead of days. This didn't come from avoiding complexity \u2013 it came from working through it and finding the elegant solution on the other side.\"}),/*#__PURE__*/t(\"h4\",{children:[/*#__PURE__*/e(\"strong\",{children:\"Fundraising:\"}),\"\\xa0\"]}),/*#__PURE__*/e(\"p\",{children:\"Initially, we showed simple traction: people liked our product and wanted to pay for it.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"499\",src:\"https://framerusercontent.com/images/mhsBAZIL2bbSdRnLkoVrVNyySI.png\",srcSet:\"https://framerusercontent.com/images/mhsBAZIL2bbSdRnLkoVrVNyySI.png?scale-down-to=512 512w,https://framerusercontent.com/images/mhsBAZIL2bbSdRnLkoVrVNyySI.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/mhsBAZIL2bbSdRnLkoVrVNyySI.png 1772w\",style:{aspectRatio:\"1772 / 998\"},width:\"886\"}),/*#__PURE__*/t(\"p\",{children:[\"Then we built elaborate pitch decks with market sizing, competitive analyses, and multi-year projections. Our narrative became increasingly complex, with layers of industry analysis and technical differentiation. The peak of this insanity was when we tried to coin a new term\\xa0\",/*#__PURE__*/t(\"em\",{children:[/*#__PURE__*/e(\"strong\",{children:\"SLaaS\"}),\"(iykyk).\"]})]}),/*#__PURE__*/e(\"p\",{children:\"Then the conversation that closed our round returned to fundamentals, but with deeper understanding: \\\"Here's the problem we solve, here's our unique approach, here's our traction.\\\"\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h4\",{children:/*#__PURE__*/e(\"strong\",{children:\"The Value of Process\"})}),/*#__PURE__*/e(\"p\",{children:\"The lesson i've learned is that the process of moving through complexity, of maturing out of midwit puberty, builds a confidence and clarity that can't be skipped.\"}),/*#__PURE__*/t(\"p\",{children:[\"If you're building something meaningful, you'll likely find yourself in the Midwit phase at times. You might feel like you're overcomplicating things.\\xa0\",/*#__PURE__*/e(\"em\",{children:/*#__PURE__*/e(\"strong\",{children:\"You probably are.\"})}),\"\\xa0That's okay. Trust that working through this complexity, rather than trying to skip it , will lead to clarity. The confidence that comes from having tested and refined your approach is invaluable. It's a quiet certainty that comes from knowing you've considered the alternatives and found your way naturally to the right answer.\"]}),/*#__PURE__*/e(\"p\",{children:\"I'm still navigating this curve daily, finding moments of clarity amid the complexity. Each cycle through the Midwit Curve(TM) brings more confidence in our direction, more certainty in our approach, and more value for our customers.\"}),/*#__PURE__*/t(\"p\",{children:[\"With that all being said i'd love to help you, whether you're a data team or an amazing operator, in pushing through your own midwit moment with your data, and getting you to the elegance and simplicity of Querio.If you're interested in learning more about Querio or discussing your data challenges, email me directly at \",/*#__PURE__*/e(a,{href:\"mailto:rami@querio.ai\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"rami@querio.ai\"})}),\".\"]})]});export const richText9=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"h3\",{children:\"Heyo Querio Users\uD83D\uDC4B\"}),/*#__PURE__*/e(\"p\",{children:\"I\u2019m Pedro, the first engineer at Querio. I built the last six versions of the AI-powered Agent, the Code Execution Environment, and most of the front-end for our AI-driven data insights platform. I joined Querio after working with Javi for almost a year at another company, and when the opportunity arose, he asked me to join him and Rami on this new adventure.\"}),/*#__PURE__*/e(\"p\",{children:\"I\u2019ve been coding \u201Cfor real\u201D for almost six years now, but when I was a kid I loved developing games and modding Minecraft. So when I started coding professionally, it was really easy for me to get on track. I\u2019ve always enjoyed teaching friends; When I was a Tech Lead, I gave classes to our developers and always had a pupil to share everything I knew. I even got kind of big on Twitter (10k followers at its peak) by helping people, teaching about programming, and developing viral apps. My most notorious app was called Piggy, a PFM that got 70k likes on Twitter, but I also built smaller projects, like a bot in 2021 that got more than 20k followers.\"}),/*#__PURE__*/e(\"p\",{children:\"In general, I love building things and sharing what I know, and that\u2019s exactly what I\u2019m going to try to do with my blog posts.\"}),/*#__PURE__*/e(\"h3\",{children:\"So ok, let\u2019s stop yapping, let\u2019s get real\"}),/*#__PURE__*/e(\"p\",{children:'Every day at Querio, the first thing I do in the morning is ask \"How can I improve our AI-powered analytics platform today?\"'}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"296\",src:\"https://framerusercontent.com/images/iVsXKR7j7tu3KC9mGwG52E03Abc.png\",srcSet:\"https://framerusercontent.com/images/iVsXKR7j7tu3KC9mGwG52E03Abc.png?scale-down-to=512 512w,https://framerusercontent.com/images/iVsXKR7j7tu3KC9mGwG52E03Abc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/iVsXKR7j7tu3KC9mGwG52E03Abc.png 1600w\",style:{aspectRatio:\"1600 / 592\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"This question drives me to innovate and build new features. While our current Agent works well with our customers' data sources, there are many areas where we can make enhancements. In this blog post, we'll explore the challenges of the Code Execution Environment, review its current implementation, and discuss our plans to improve it, ensuring we deliver the best AI-driven product possible.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Code Execution Environment\"}),/*#__PURE__*/e(\"p\",{children:\"One of the core principles of our AI-powered Agent is that it can write code. That\u2019s the most trivial thing the Agent does\u2014it writes SQL and Python to answer users' questions using natural language. But even though this is a trivial part of the app, it\u2019s also one of the places where we can achieve the most wins. The current production implementation works, but it\u2019s rough around the edges. I didn\u2019t have the necessary experience to plan and deliver a state-of-the-art Code Execution Environment (CEE), so let\u2019s now make an autopsy to see why it died.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Current Notebook Llm implementation\"}),/*#__PURE__*/t(\"p\",{children:[\"We have a pretty bare-bones notebook implementation, and it works in a simple way: You create a conversationId and send code along with it. The application then opens the Jupyter Notebook, adds a new cell, and returns the response. However, since this was my first time working with \",/*#__PURE__*/e(\"code\",{children:\"nbformat\"}),\" and \",/*#__PURE__*/e(\"code\",{children:\"nbclient\"}),\", I missed some problems with this approach, including:\"]}),/*#__PURE__*/e(\"h4\",{children:\"1. Cold Starts and performance.\"}),/*#__PURE__*/e(\"p\",{children:\"Every time we send code, the Jupyter Kernel restarts. We have to wait around 2 to 3 seconds just for the kernel to start, and then we need to run every cell in the notebook before we can run the newest cell. If the agent writes five pieces of code, this can add up to 15 seconds of query execution time. As you can imagine, this has a significant impact on performance and real-time data exploration.\"}),/*#__PURE__*/e(\"h4\",{children:\"2. Output\"}),/*#__PURE__*/t(\"p\",{children:[\"Currently, every time a cell runs, we only return a single response. The problem is, if there\u2019s a warning triggered when the code runs, or if every \",/*#__PURE__*/e(\"code\",{children:\"print\"}),\" statement from the agent produces a new output, we end up with only one output per cell. This can cause us to lose a lot of context. If the agent uses multiple print statements, it won\u2019t see every output. Occasionally, the algorithm fails to capture the right output (rarely, less than 1% of the time). At the time, I thought this was the best decision, but only because I couldn\u2019t see the flaws.\"]}),/*#__PURE__*/e(\"h4\",{children:\"3. String Manipulation\"}),/*#__PURE__*/e(\"p\",{children:\"Every piece of code we receive is a string, and strings are inherently problematic. They\u2019re hard to manipulate, and a single point of failure can be exploited to create code injection. Of course, I thought a lot about code injection, and as of now, there hasn\u2019t been a single vulnerability on that front. But the worst part is that it\u2019s very hard to understand what the string is trying to do. For example, consider the following code:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'df = pd.DataFrame({\"name\": [\"Pedro\", \"Nik\"], \"age\": [23, 26]})\\ndf',language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"Looking at this code, it\u2019s clear that it creates a DataFrame and then displays it. However, to extract the DataFrame\u2019s value, we need to dump the results and access them outside the kernel. This requires analyzing the intent of the code; if it\u2019s displaying a DataFrame, we create a new string that performs \",/*#__PURE__*/e(\"code\",{children:\"df.to_dict()\"}),\". This can get very messy very fast, especially if the last line is a multi-line expression, because we don\u2019t know exactly when the expression starts or ends.\"]}),/*#__PURE__*/e(\"p\",{children:\"If we want to protect a variable, that\u2019s another challenge. The simplest approach is to check if the variable\u2019s name is in the string, but that isn\u2019t very safe.\"}),/*#__PURE__*/e(\"h4\",{children:\"4. Security\"}),/*#__PURE__*/e(\"p\",{children:\"We use RestrictedPython, so we know for sure that the code runs in a safe environment. However, RestrictedPython is another dependency we have to manage, and it gets complex very fast. That\u2019s yet another point of failure that often shoots us in the foot, because it\u2019s too strict but necessary for the current implementation.\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"New Notebook Implementation\"}),/*#__PURE__*/e(\"p\",{children:\"The new notebook llm implementation aims to fix all those problems. The biggest goals are performance and security. It needs to be very fast, the target is to run code in less than 100ms, and it needs to be secure. We can\u2019t afford to leak any client data; this is the most sensitive topic we\u2019re always guarding against. So, how are we going to do that?\"}),/*#__PURE__*/e(\"h4\",{children:\"1. Keep Kernel Alive\"}),/*#__PURE__*/e(\"p\",{children:\"Instead of cold starting for every new piece of code, we now keep the Jupyter Kernel alive. This means it does one cold start, taking from 1.5 to 3 seconds (usually not more than 2), and every subsequent code run avoids that extra delay. This change alone helped us hit our performance targets, with code being executed in less than 10ms. Now the agent\u2019s experience is nearly instantaneous, he writes the code and instantly gets the result. SQL calls still take time because they need to access the database and, if there's too much data, they can be slow. But normal Python code is instant.\"}),/*#__PURE__*/e(\"h4\",{children:\"2. AST\"}),/*#__PURE__*/e(\"p\",{children:\"String manipulation is hard, but we don\u2019t need to complicate our lives. Every piece of code is a string, but the language that runs the code doesn\u2019t understand strings, it understands tokens and converts them into binary for the CPU. How does it convert to binary? First, it extracts the Abstract Syntax Tree (AST) from the code. The AST is a structure that defines exactly what the code is doing and how it\u2019s working. Take a look at the following piece of code:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'import pandas as pd\\n\\ndf = pd.DataFrame({\"A\": [1, 2, 3], \"B\": [4, 5, 6]})\\ndf.head()',language:\"Python\"})})}),/*#__PURE__*/e(\"p\",{children:\"It first imports pandas as pd, then creates a DataFrame, and finally runs df.head() to return the first five rows of the DataFrame. Let\u2019s take a look at the AST of the code:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:\"Module(\\n    body=[\\n        Import(\\n            names=[\\n                alias(name='pandas', asname='pd')]),\\n        Assign(\\n            targets=[\\n                Name(id='df', ctx=Store())],\\n            value=Call(\\n                func=Attribute(\\n                    value=Name(id='pd', ctx=Load()),\\n                    attr='DataFrame',\\n                    ctx=Load()),\\n                args=[\\n                    Dict(\\n                        keys=[\\n                            Constant(value='A'),\\n                            Constant(value='B')],\\n                        values=[\\n                            List(\\n                                elts=[\\n                                    Constant(value=1),\\n                                    Constant(value=2),\\n                                    Constant(value=3)],\\n                                ctx=Load()),\\n                            List(\\n                                elts=[\\n                                    Constant(value=4),\\n                                    Constant(value=5),\\n                                    Constant(value=6)],\\n                                ctx=Load())])],\\n                keywords=[])),\\n        Expr(\\n            value=Call(\\n                func=Attribute(\\n                    value=Name(id='df', ctx=Load()),\\n                    attr='head',\\n                    ctx=Load()),\\n                args=[],\\n                keywords=[]))],\\n    type_ignores=[])\",language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"You can see that the body contains everything the code is doing: using \",/*#__PURE__*/e(\"code\",{children:\"Import\"}),\" to bring in pandas, \",/*#__PURE__*/e(\"code\",{children:\"Assign\"}),\" to define variables, and \",/*#__PURE__*/e(\"code\",{children:\"Expr\"}),\" to call \",/*#__PURE__*/e(\"code\",{children:\"df.head()\"}),\". With this, we can traverse the tree and extract details like all defined variables, dependencies, and the code\u2019s intent, even for multi-line expressions. This gives us much more control, allowing us to protect variables and detect their usage.\"]}),/*#__PURE__*/e(\"h4\",{children:\"3. New Cell Structure\"}),/*#__PURE__*/t(\"p\",{children:[\"A normal Jupyter Notebook contains only one type of cell: the code cell. For us, that\u2019s not enough, we need to let the user write SQL as well as Python code, but how do we make it feel natural? We introduced a few types of cells. Every cell inherits from the \",/*#__PURE__*/e(\"code\",{children:\"BaseCell\"}),\", which is defined as follows:\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'class BaseCell(BaseModel):\\n    model_config = ConfigDict(from_attributes=True)\\n    \\n    cell_id: str = Field(default_factory=cuid_generator)\\n    position: int\\n    state: Literal[\"stale\", \"updating\", \"pending\", \"running\", \"idle\", \"failed\", \"missing_dependencies\"] = \"stale\"\\n    result: Optional[CodeExecutionResponse] = None\\n    cell_type: Literal[\"code\", \"table\", \"sql\", \"visualization\"]',language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"As you can see, it stores the \",/*#__PURE__*/e(\"code\",{children:\"cell_id\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"position\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"state\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"result\"}),\" (the cell output), and \",/*#__PURE__*/e(\"code\",{children:\"cell_type\"}),\". From the \",/*#__PURE__*/e(\"code\",{children:\"cell_type\"}),\", we have four variations: \",/*#__PURE__*/e(\"code\",{children:\"CodeCell\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"TableCell\"}),\", \",/*#__PURE__*/e(\"code\",{children:\"SQLCell\"}),\", and \",/*#__PURE__*/e(\"code\",{children:\"VisualizationCell\"}),\". Let\u2019s take a deep dive into each of them.\"]}),/*#__PURE__*/e(\"ol\",{children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h6\",children:/*#__PURE__*/e(\"h6\",{children:\"Code Cell\"})})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"222\",src:\"https://framerusercontent.com/images/880BKBjrdwaFksBgX4IyZQY6Kgg.png\",srcSet:\"https://framerusercontent.com/images/880BKBjrdwaFksBgX4IyZQY6Kgg.png?scale-down-to=512 512w,https://framerusercontent.com/images/880BKBjrdwaFksBgX4IyZQY6Kgg.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/880BKBjrdwaFksBgX4IyZQY6Kgg.png 1600w\",style:{aspectRatio:\"1600 / 444\"},width:\"800\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'class CodeCell(BaseCell):\\n    cell_type: Literal[\"code\"] = \"code\"\\n    source: str\\n    definitions: List[Variable] = []\\n    dependencies: List[str] = []\\n    \\n    @property\\n    def variables(self) -> List[BaseDefinition]:\\n        return [var for var in self.definitions if var.type != \"function\" and var.type != \"import\"]\\n\\n    @property\\n    def functions(self) -> List[BaseDefinition]:\\n        return [var for var in self.definitions if var.type == \"function\"]\\n    \\n    @property\\n    def imports(self) -> List[Union[Import, ImportFrom]]:\\n        return [var for var in self.definitions if var.type in {\"import\", \"import_from\"}]',language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"As you can see, it has the source code, a list of definitions, and a list of dependencies. The definitions are just a list of Variables, which can be one of the following: \",/*#__PURE__*/e(\"code\",{children:'\"tbd\", \"int\", \"float\", \"str\", \"bool\", \"list\", \"dict\", \"tuple\", \"set\", \"function\", \"class\", \"series\", \"unknown\"'}),\". When we run this cell, we execute the source code unchanged, and we can return multiple outputs, not just one.\"]}),/*#__PURE__*/e(\"ol\",{start:\"2\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h6\",children:/*#__PURE__*/e(\"h6\",{children:\"Table cell\"})})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"189\",src:\"https://framerusercontent.com/images/QcgrMRqj3JqYaQCCKTAaIjHSM0.png\",srcSet:\"https://framerusercontent.com/images/QcgrMRqj3JqYaQCCKTAaIjHSM0.png?scale-down-to=512 512w,https://framerusercontent.com/images/QcgrMRqj3JqYaQCCKTAaIjHSM0.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/QcgrMRqj3JqYaQCCKTAaIjHSM0.png 1600w\",style:{aspectRatio:\"1600 / 378\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"This is the most controversial yet simplest cell type. When a user defines a DataFrame through a Python cell and returns it, we opted not to show the full DataFrame directly. Instead, we mimic a normal Jupyter Notebook by showing only the first and last five rows. This decision was made to reduce complexity and create a more authentic notebook experience. But how do we show full DataFrames? Through the Table Cell:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'class TableCell(BaseCell):\\n    cell_type: Literal[\"table\"] = \"table\"\\n    variable: Optional[DataFrameVariable] = None\\n    filter_state: Optional[FilterState] = None\\n    \\n    def __init__(self, variable_name: str = None, **kwargs):\\n        super().__init__(**kwargs)\\n        if variable_name and not self.variable:\\n            self.variable = DataFrameVariable(name=variable_name)\\n    \\n    @classmethod\\n    def mount_source(cls, variable_name: str) -> str:\\n        return f\"dump_dataframe({variable_name}, \\'{variable_name}\\')\"\\n    \\n    @property\\n    def source(self) -> Optional[str]:\\n        if self.variable:\\n            return self.mount_source(self.variable.name)\\n        return None',language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"It has a \",/*#__PURE__*/e(\"code\",{children:\"variable\"}),\" that must be a \",/*#__PURE__*/e(\"code\",{children:\"DataFrameVariable\"}),\", a \",/*#__PURE__*/e(\"code\",{children:\"filter_state\"}),\" (which currently does nothing but may be used for filtering in the future), and a computed \",/*#__PURE__*/e(\"code\",{children:\"source\"}),\". The \",/*#__PURE__*/e(\"code\",{children:\"source\"}),\" code calls the function \",/*#__PURE__*/e(\"code\",{children:\"dump_dataframe\"}),\" with the \",/*#__PURE__*/e(\"code\",{children:\"variable_name\"}),\", allowing us to access the data outside the kernel and send it to the front-end.\"]}),/*#__PURE__*/e(\"ol\",{start:\"3\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h6\",children:/*#__PURE__*/e(\"h6\",{children:\"SQL cell\"})})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"189\",src:\"https://framerusercontent.com/images/lmABDULMJULhCKgiFbRZ5jCQgEc.png\",srcSet:\"https://framerusercontent.com/images/lmABDULMJULhCKgiFbRZ5jCQgEc.png?scale-down-to=512 512w,https://framerusercontent.com/images/lmABDULMJULhCKgiFbRZ5jCQgEc.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/lmABDULMJULhCKgiFbRZ5jCQgEc.png 1600w\",style:{aspectRatio:\"1600 / 378\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"This is how we let the user write SQL. The SQL cell is defined as:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'class SqlCell(BaseCell):\\n    cell_type: Literal[\"sql\"] = \"sql\"\\n    query: str\\n    datasource_id: Optional[str] = None\\n    variable: Optional[DataFrameVariable] = None\\n    filter_state: Optional[FilterState] = None\\n    \\n    def __init__(self, variable_name: str = None, **kwargs):\\n        super().__init__(**kwargs)\\n        if variable_name and not self.variable:\\n            self.variable = DataFrameVariable(name=variable_name)\\n    \\n    @classmethod\\n    def mount_source(cls, datasource_id: str, query: str, variable_name: str) -> str:\\n        if not variable_name:\\n            raise ValueError(\"Variable name is required\")\\n        if not datasource_id:\\n            raise ValueError(\"Datasource ID is required\")\\n        if not query:\\n            raise ValueError(\"Query is required\")\\n\\n        return f\\'{variable_name} = sql(\"{datasource_id}\", \"\"\"\\\\\\\\n{query}\\\\\\\\n\"\"\")\\'\\n    \\n    @property\\n    def source(self) -> Optional[str]:\\n        if self.variable and self.datasource_id and self.query:\\n            return self.mount_source(self.datasource_id, self.query, self.variable.name)\\n        return None',language:\"Python\"})})}),/*#__PURE__*/t(\"p\",{children:[\"As you can see, it also includes a \",/*#__PURE__*/e(\"code\",{children:\"variable\"}),\", a SQL \",/*#__PURE__*/e(\"code\",{children:\"query\"}),\", a \",/*#__PURE__*/e(\"code\",{children:\"filter_state\"}),\", and the \",/*#__PURE__*/e(\"code\",{children:\"source\"}),\". The \",/*#__PURE__*/e(\"code\",{children:\"source\"}),\" defines the variable and queries the datasource, returning the full table. This SQLCell automatically shows its output without needing the TableCell.\"]}),/*#__PURE__*/e(\"ol\",{start:\"4\",children:/*#__PURE__*/t(\"li\",{\"data-preset-tag\":\"h6\",children:[/*#__PURE__*/e(\"h6\",{children:\"Visualization cell\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"263\",src:\"https://framerusercontent.com/images/k67wFAdj0HOEI9p5i7USyJxNIs.png\",srcSet:\"https://framerusercontent.com/images/k67wFAdj0HOEI9p5i7USyJxNIs.png?scale-down-to=512 512w,https://framerusercontent.com/images/k67wFAdj0HOEI9p5i7USyJxNIs.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/k67wFAdj0HOEI9p5i7USyJxNIs.png 1600w\",style:{aspectRatio:\"1600 / 526\"},width:\"800\"})]})}),/*#__PURE__*/t(\"p\",{children:[\"This cell is expected to be really complex. It will eventually allow the user to define what kind of visualization they want (bar chart, pie chart, etc.), choose the datasource, and select the columns for categories/values. For now, it works similarly to the \",/*#__PURE__*/e(\"code\",{children:\"TableCell\"}),\": you define a Plotly chart through a \",/*#__PURE__*/e(\"code\",{children:\"CodeCell\"}),\", and it displays via the \",/*#__PURE__*/e(\"code\",{children:\"VisualizationCell\"}),\".\"]}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'class VisualizationCell(BaseCell):\\n    cell_type: Literal[\"visualization\"] = \"visualization\"\\n    variable: Optional[FigureVariable] = None\\n    \\n    @classmethod\\n    def mount_source(cls, variable_name: str) -> str:\\n        if not variable_name:\\n            raise ValueError(\"Variable name is required\")\\n        return f\"visualize({variable_name})\"\\n    \\n    @property\\n    def source(self) -> Optional[str]:\\n        if self.variable:\\n            return self.mount_source(self.variable.name)\\n        return None',language:\"Python\"})})}),/*#__PURE__*/e(\"ol\",{start:\"4\",children:/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"h4\",children:/*#__PURE__*/e(\"h4\",{children:\"Security\"})})}),/*#__PURE__*/e(\"p\",{children:\"We improved security a lot with the AST, which blocks a lot of malicious code from the get-go. But at the end of the day, this is an RCE machine and the user can write whatever they want. So, we're adding measures to prevent users from accessing the file system, accessing someone else's data, making requests, creating a reverse shell, and so on. I\u2019m not going to go into details because every bit we share could help an attacker, but we\u2019re pretty sure the application is safe. If any of our clients don\u2019t trust us to handle security, they can self-host their own code execution engine to ensure all the data lives only on their machine.\"}),/*#__PURE__*/e(\"blockquote\",{children:/*#__PURE__*/e(\"p\",{children:\"By improving the Code Execution Environment, we\u2019re making Querio an even better AI-powered analytics platform, empowering users with seamless, real-time data insights. We\u2019re excited to keep pushing the boundaries and ensuring that the experience is as smooth and powerful as possible!\"})}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Next steps\"}),/*#__PURE__*/e(\"p\",{children:\"Now that we've built a robust notebook structure, how do we turn it into a product? The first step is to integrate the Notebook as a feature in our app, a plan we're definitely moving forward with. We\u2019ll allow power users, those who know how to write Python and SQL, to use these notebooks. For users who aren\u2019t as proficient, we\u2019re developing a Copilot that has full context of the datasource to help write Python and SQL. Also, there will be an agent in every notebook, where you can ask for help and it will do things for you. This feature is aimed at power users, but our final goal is for everyone to use it.\"}),/*#__PURE__*/e(\"p\",{children:\"Another big change is the complete overhaul of the current Explore Tab. We\u2019re working on an agent that understands how to use the notebook, which is exactly what we\u2019re cooking up at this moment. We\u2019re developing a new MultiAgent workflow that will improve the quality of the product by a ton. I\u2019d be glad to share more details about our new agent in my next blog post, scheduled to air next month.\"})]});export const richText10=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/t(\"p\",{children:[\"Hello Querio users (present and future)! My name\u2019s Nikolay. You might know me as a guy who spent the last 3 years writing portfolio management software in .NET or from that time my project supervisor at university \",/*#__PURE__*/e(a,{href:\"https://www.linkedin.com/in/nikolayalexandrov/\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"commented on my intelligence\"})}),\". I tricked Querio team into hiring me three short weeks ago. And look, I am not going to sit here and pretend like I have anything actually insightful to tell you. No, I am taking it all the way back to 2006 LiveJournal (I was 8 years old) and share with you my \",/*#__PURE__*/e(\"em\",{children:\"subjective\"}),\" experience of doing my new job.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"236\",src:\"https://framerusercontent.com/images/MsV6JQq3czjQk0x7rwOZo2S744.png\",srcSet:\"https://framerusercontent.com/images/MsV6JQq3czjQk0x7rwOZo2S744.png?scale-down-to=512 512w,https://framerusercontent.com/images/MsV6JQq3czjQk0x7rwOZo2S744.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/MsV6JQq3czjQk0x7rwOZo2S744.png 1600w\",style:{aspectRatio:\"1600 / 472\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Challenge accepted.\"}),/*#__PURE__*/e(\"p\",{children:\"You might think I'm making this up\u2014I'm not. And while you may question my intelligence (the jury's still out on that one), this is genuinely what happens when you leave the safe harbor of enterprise software, where everything is Properly Architected\u2122, and bellyflop into the world of early-stage startups.\"}),/*#__PURE__*/e(\"p\",{children:'Coming from enterprise, I can still feel new neural connections forming in previously untouched regions of my brain. Now here I am, witnessing the aftermath of Cursor\\'s \"AGI moments\" scattered throughout version control (and to be fair, some of them come close). After years of change requests breaking my soul, I wonder if moving fast and breaking things might just break me faster.'}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"hot take: js database tooling\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"259\",src:\"https://framerusercontent.com/images/FmBuBkna2ExhYJP9WxmeOAGcIA.png\",srcSet:\"https://framerusercontent.com/images/FmBuBkna2ExhYJP9WxmeOAGcIA.png?scale-down-to=512 512w,https://framerusercontent.com/images/FmBuBkna2ExhYJP9WxmeOAGcIA.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/FmBuBkna2ExhYJP9WxmeOAGcIA.png 1600w\",style:{aspectRatio:\"1600 / 518\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"I'd tell you to brace for controversy, but let's be honest - we're all thinking it.\"}),/*#__PURE__*/e(\"p\",{children:\"During the last platform shift something happened. Like many others, I joined the fold when JavaScript was becoming the universal runtime for full-stack development and cross-platform applications - browsers, servers, mobile apps, smart kettles,  you name it. I managed to get a job writing C# and watched from the sidelines as my peers any% speed-ran decades of architecture patterns, reinventing and reimagining them for this new stack.\"}),/*#__PURE__*/e(\"p\",{children:\"Supply has followed demand. Dev-tools companies raised millions of dollars and used it to put on a decade-long magic show with only ORMs on stage and all of us in attendance.\"}),/*#__PURE__*/e(\"p\",{children:'With a flourish of a handkerchief, each covered the unruly databases. \"Watch closely,\" they whispered, lifting the silk with practiced grace to reveal... ta-da! A pristine API with three or four meticulously documented endpoints. The audience gasped\u2014all those tables and joins had vanished, replaced by GET, POST, and DELETE operations. The N+1 queries giggled and slipped behind the curtain.'}),/*#__PURE__*/e(\"p\",{children:\"Somewhere along the way we collectively decided that writing SQL was pass\\xe9. I admit, SQL queries don't exactly fit in or around your JSX or anywhere inside the virtual DOM. Don\u2019t know about you, but I am already stuck in a messy relationship with JS, markup and Tailwind classes, and SQL is definitely not invited to that party.\"}),/*#__PURE__*/e(\"p\",{children:\"Imagine:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:\"<div className='flex flex-col p-4'>{SELECT * FROM users WHERE id = ?}</div>\",language:\"TypeScript\"})})}),/*#__PURE__*/e(\"p\",{children:\"\u2026hmmm doesen\u2019t look half bad!\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"the tale of two ORMs\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"259\",src:\"https://framerusercontent.com/images/uSFmd0quYWvK6zDUhm3ky1VVQ.png\",srcSet:\"https://framerusercontent.com/images/uSFmd0quYWvK6zDUhm3ky1VVQ.png?scale-down-to=512 512w,https://framerusercontent.com/images/uSFmd0quYWvK6zDUhm3ky1VVQ.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/uSFmd0quYWvK6zDUhm3ky1VVQ.png 1600w\",style:{aspectRatio:\"1600 / 518\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"Here's a sentence I never thought I'd write: we use \",/*#__PURE__*/e(a,{href:\"https://www.prisma.io/\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"Prisma\"})}),\" for writes and \",/*#__PURE__*/e(a,{href:\"https://orm.drizzle.team/\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"Drizzle\"})}),\" for reads (ish). I know what you're thinking - \\\"that's insane!\\\" And you're right! But here's the twist: it works.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Like any good JS library, both sit there like WWE heavyweight champions, demanding endless boilerplate tributes and infinite config file homages before releasing your data. Sure, Prisma's mutations are sweet, the type safety is solid, and the schema management is \",/*#__PURE__*/e(\"em\",{children:\"chef's kiss\"}),\". Thank you Prisma! But what's with the N+1 query for every relation unless explicitly included? Come on Prisma... And rolling back migrations? Hope you enjoy doing that by hand. Really, Prisma?\"]}),/*#__PURE__*/t(\"p\",{children:[\"But let's be real, if I really cared about redundant queries, I wouldn't have 14 Claude tabs open. We face different challenges. In our monorepo, we follow the workspace pattern. We've got a Node server running Express that periodically pokes your database for context, alongside a hefty Next.js app doing its thing. Now we want to share our lovely Prisma queries and mutations with our server\u2014but we can't! The \",/*#__PURE__*/e(\"code\",{children:\"prisma\"}),\" (generated) client must be lifted out of the Next app, repackaged, dropped at the top level, and reimported. Congratulations, you now get to juggle two different binary generations\u2014assuming you've managed to untangle the package mess.\"]}),/*#__PURE__*/e(\"p\",{children:'And I know what you\\'re thinking\u2014\"just put all the Prisma code in your Express server and call it a day.\" Good idea! Stay tuned for that.'}),/*#__PURE__*/e(\"p\",{children:\"Anyway. We couldn't share Prisma between our two apps. May be a skill issue. Enter: Drizzle. It's runtime agnostic - no binary engines, no platform-specific code generation, just TypeScript that runs anywhere. Want to share your database layer between workspaces? It's just code - bundle it, import it, done. The queries are just SQL wrapped in a type-safe builder, so there's no magic to break when you move between environments.\"}),/*#__PURE__*/e(\"p\",{children:\"The bundle size is tiny compared to Prisma's big chungus binaries. Not that this makes a difference for us today...\"}),/*#__PURE__*/e(\"p\",{children:\"But it\u2019s not all drizzle and rainbows (heh). The migrations story isn't exactly making me write home. The CLI tools are in perpetual beta, and don't get me started on trying to maintain separate migration paths for different environments.\"}),/*#__PURE__*/t(\"p\",{children:[\"But here's the kicker - Drizzle, or any other ORM promising smaller bundles, perfect type safety, and world peace all have one big flaw. They just ain\u2019t inside our app! And the effort of ripping Prisma out \",/*#__PURE__*/e(\"em\",{children:\"and\"}),\" putting another ORM in I\u2019d rather spend on the roadmap.\"]}),/*#__PURE__*/t(\"p\",{children:[\"And yes I have been drinking \",/*#__PURE__*/e(a,{href:\"https://www.youtube.com/watch?v=-cEn_83zRFw&ab_channel=RubyonRails\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"DHH Kool-Aid\"})}),\" and building all my own projects in Rails and \",/*#__PURE__*/e(\"code\",{children:\"ActiveRecord\"}),\". The ORM situation in our JS today feels like I traded in my good-ol Prius for a two-headed dragon - it's powerful, but really scary and don\u2019t talk to me about insurance premiums.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"me vs typescript type system\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"259\",src:\"https://framerusercontent.com/images/RJRtzAOhlwGFgavjPZEZeU1oN98.png\",srcSet:\"https://framerusercontent.com/images/RJRtzAOhlwGFgavjPZEZeU1oN98.png?scale-down-to=512 512w,https://framerusercontent.com/images/RJRtzAOhlwGFgavjPZEZeU1oN98.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/RJRtzAOhlwGFgavjPZEZeU1oN98.png 1600w\",style:{aspectRatio:\"1600 / 518\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"Querio takes in your natural language prompts and writes SQL and Python to wrangle and creates  data visualization  for you while you\u2019re scrolling TikTok Shop.\"}),/*#__PURE__*/t(\"p\",{children:[\"Users want to see the source data for their charts. What users don\u2019t know is that we send their charts back as Plotly objects over the wire and we have only a \",/*#__PURE__*/e(a,{href:\"https://www.npmjs.com/package/@types/plotly.js-basic-dist\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"modicum of an idea\"})}),\" of what the chart actually is until we render it. I needed to build a chart-to-table toggle (maybe my uni professor was onto something).\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"189\",src:\"https://framerusercontent.com/images/Vz2bU4NVIG36SNBj4gsx4Y4tSCw.png\",srcSet:\"https://framerusercontent.com/images/Vz2bU4NVIG36SNBj4gsx4Y4tSCw.png?scale-down-to=512 512w,https://framerusercontent.com/images/Vz2bU4NVIG36SNBj4gsx4Y4tSCw.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/Vz2bU4NVIG36SNBj4gsx4Y4tSCw.png 1600w\",style:{aspectRatio:\"1600 / 378\"},width:\"800\"}),/*#__PURE__*/e(\"p\",{children:\"There it is on the left!\"}),/*#__PURE__*/e(\"p\",{children:\"When I first heard my assignment my reptilian C# brain hissed: \u201Cpattern matching\u201D. I never made much use of higher brain function so what I did next led to the most bloody, gory and senselessly violent battle with TypeScript's type system in recorded history. I very narrowly escaped death but emerged victorious.\"}),/*#__PURE__*/e(\"p\",{children:\"In the technical spirit of this article, I will let the code do the talking. I was frustrated that I had to type discriminant string by hand instead of having them IntelliSensed into the function, so I wrote\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:\"// Using the @types/plotly to narrow the types of charts coming from the Code Exec Env (CEE). \\n// Simplifies handling different chart types.\\n// Avoids type guards (i dont like them)\\n// For usage see apps/app/modules/Plot/index.tsx\\n\\n// get the typescript\\nimport { Data, PlotData } from \\\"plotly.js\\\";\\n\\n// get all the partial types\\ntype ExtractPartialTypes<T> = T extends Partial<infer U> ? Partial<U> : never;\\ntype AllTypes = ExtractPartialTypes<Data>;\\n\\n// e.g 'scatter' | 'bar' | 'box' | 'sankey' | 'pie' | 'ohlc' | etc.\\ntype PlotTypeDiscriminator = NonNullable<AllTypes[\\\"type\\\"]>;\\n\\n// get the Partial type from the discriminator value, default to Partial<PlotData>, e.g 'pie' => Partial<PieData> and 'scatter' = Partial<PlotData>\\ntype ConcretePlotType<T> = Extract<Data, { type?: T }> extends never\\n  ? Partial<PlotData>\\n  : Extract<Data, { type?: T }>;\\n\\nfunction isMatchingType<K extends PlotTypeDiscriminator>(\\n  data: Data,\\n  type: K,\\n): data is ConcretePlotType<K> {\\n  return data.type === type;\\n}\\n\\n// this type holds handler definitions\\nexport type HandlerRecord<R> = Partial<Record<PlotTypeDiscriminator, (data: Data) => R>> & {\\n  default: (data: Data) => R;\\n};\\n\\n// takes a type descriminator and lets you mount a callback that takes the concrete plot type as an arugment\\nexport function createHandler<K extends PlotTypeDiscriminator, R>(\\n  type: K,\\n  handler: (data: ConcretePlotType<K>) => R,\\n): { [P in K]: (data: Data) => R } {\\n  return {\\n    [type]: (data: Data) => {\\n      if (!isMatchingType(data, type)) {\\n        throw new Error(`Cannot create handler. Invalid type: expected ${type}`);\\n      }\\n      return handler(data);\\n    },\\n  } as { [P in K]: (data: Data) => R };\\n}\\n\\nexport function ch<K extends PlotTypeDiscriminator, R>(\\n  type: K,\\n  handler: (data: ConcretePlotType<K>) => R,\\n) {\\n  return createHandler(type, handler);\\n}\\n\\nexport function mapHandlers<T>(data: Data, _handlers: HandlerRecord<T>): T | undefined {\\n  if (data.type) {\\n    const handler = _handlers[data.type] || _handlers.default;\\n    return handler(data);\\n  }\\n\\n  return undefined;\\n}\",language:\"TypeScript\"})})}),/*#__PURE__*/e(\"p\",{children:\"I thought to myself: \u201Cthere is a profound insight about type theory hiding in there\u201D. You could use my \u2018pattern matching\u2019 like this.\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'// the first argument to `ch` is a type-discriminant for the plotly types (see here )\\n// the second argument will be the strongly-typed chart\\n// `ch` is __total__ over all (plotly) Data types\\n// enjoy pattern matching!\\n\\n// this function will return a ChartColumn or undefined\\nconst chartDataHandlers: HandlerRecord<ChartColumn | undefined> = {\\n  ...ch(\"pie\", ({ labels, values }) => {\\n    if (!values) {\\n      return undefined;\\n    }\\n    return {\\n      labels: labels as string[],\\n      values,\\n      name: \"value\",\\n      orientation: \"v\",\\n    };\\n  }),\\n  ...ch(\"scatter\", (data) => {\\n    const labels = (data.orientation === \"v\" ? data.x : data.y) as string[];\\n    const values = (data.orientation === \"v\" ? data.y : data.x) as (string | number)[];\\n    return {\\n      labels,\\n      values,\\n      name: data.name || \"value\",\\n      orientation: data.orientation || \"v\",\\n    };\\n  }),\\n  ...ch(\"bar\", (data) => {\\n    const labels = (data.orientation === \"v\" ? data.x : data.y) as string[];\\n    const values = (data.orientation === \"v\" ? data.y : data.x) as (string | number)[];\\n    return {\\n      labels,\\n      values,\\n      name: data.name || \"value\",\\n      orientation: data.orientation || \"v\",\\n    };\\n  }),\\n  ...ch(\"box\", (data) => {\\n\t  // these are not supported\\n    console.log(data.boxpoints);\\n    return undefined;\\n  }),\\n  ...ch(\"sankey\", (data) => {\\n    console.log(data.hoverinfo);\\n    return undefined;\\n  }),\\n  ...ch(\"ohlc\", (data) => {\\n    console.log(data.hoverinfo);\\n    return undefined;\\n  }),\\n  default: (data: Data) => {\\n    console.log(data);\\n    return undefined;\\n  },\\n};\\n\\n// finally, map over the chart data\\nexport function plotlyDataToRows(data: Data[], layout?: Partial<Layout>): TableData {\\n  if (!layout) {\\n    //TODO: log we cant turn chart into a table because no layout\\n    return [];\\n  }\\n  const _chartDataHandlers = (d: Data) => mapHandlers(d, chartDataHandlers);\\n  const chartColumns = data\\n    .map(_chartDataHandlers)\\n    .filter((d): d is ChartColumn => d !== undefined);\\n\\n  return chartData2TableData(chartColumns, layout);\\n}',language:\"TypeScript\"})})}),/*#__PURE__*/e(\"p\",{children:\"Patent pending.\"}),/*#__PURE__*/e(\"p\",{children:\"I was done. I proudly wound my neck back inline with my spine, feeling fiercely intelligent. When I left the office at 22:34 on a Friday I texted my friend about my elegant extension to the language.\"}),/*#__PURE__*/e(\"p\",{children:\"When I got home I realised I could have written:\"}),/*#__PURE__*/e(\"div\",{className:\"framer-text-module\",style:{height:\"auto\",width:\"100%\"},children:/*#__PURE__*/e(n,{componentIdentifier:\"module:pVk4QsoHxASnVtUBp6jr/QVzZltTawVJTjmjAWG3C/CodeBlock.js:default\",children:t=>/*#__PURE__*/e(i,{...t,code:'function convertDataToChartColumn(data: Data): ChartColumn | undefined {\\n  // Use the type property as discriminant, duh\\n  switch (data.type) {\\n    case \"pie\":\\n      return handlePieChart(data);\\n    case \"scatter\":\\n      return handleXYChart(data);\\n    case \"bar\":\\n      return handleXYChart(data);\\n    default:\\n      console.log(data);\\n      return undefined;\\n  }\\n}\\n\\nfunction plotlyDataToRows(data: Data[], layout?: Partial<Layout>): TableData {\\n  if (!layout) return [];\\n\\n  const chartColumns = data\\n    .map(convertDataToChartColumn)\\n    .filter((d): d is ChartColumn => d !== undefined);\\n\\n  return chartData2TableData(chartColumns, layout);\\n}',language:\"TypeScript\"})})}),/*#__PURE__*/t(\"p\",{children:[\"...and gotten the exact same type safety without conjuring an eldritch horror of generic constraints. Sometimes you can move so fast that you build an entire type-safe pattern matching framework just to appreciate a \",/*#__PURE__*/e(\"code\",{children:\"switch\"}),\" statement.\"]}),/*#__PURE__*/e(\"p\",{children:\"Whew! Time flies when you\u2019re having fun! I am way over the word-limit and I haven\u2019t even talked about the new agent architecture or Pedro\u2019s new fully-websocketed Querio Explore Page that rips harder than Vector W8 Twin Turbo by Vector Aeromotive (1989-1993).\"}),/*#__PURE__*/e(\"p\",{children:\"For next month\u2019s issue of nik\u2019s devlog I can promise takes on:\"}),/*#__PURE__*/t(\"ul\",{children:[/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"deploying Javascript\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"gross ORM misuse\"})}),/*#__PURE__*/e(\"li\",{\"data-preset-tag\":\"p\",children:/*#__PURE__*/e(\"p\",{children:\"???\"})})]}),/*#__PURE__*/t(\"p\",{children:[/*#__PURE__*/e(a,{href:\"mailto:nik@querio.ai\",motionChild:!0,nodeId:\"tuRG1jt7F\",openInNewTab:!1,relValues:[],scopeId:\"contentManagement\",smoothScroll:!1,children:/*#__PURE__*/e(r.a,{children:\"nik@querio.ai\"})}),\" if you have any ideas about any of the above or just want to fight me about type-guards.\"]})]});export const richText11=/*#__PURE__*/t(o.Fragment,{children:[/*#__PURE__*/e(\"h3\",{children:\"Quality\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/DIAVIroutQO5pVpgXwtvrflx0w.png\",srcSet:\"https://framerusercontent.com/images/DIAVIroutQO5pVpgXwtvrflx0w.png?scale-down-to=512 512w,https://framerusercontent.com/images/DIAVIroutQO5pVpgXwtvrflx0w.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/DIAVIroutQO5pVpgXwtvrflx0w.png 1600w\",style:{aspectRatio:\"1600 / 600\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"There\u2019s a book I love; actually, it\u2019s a family favorite for us, the G\\xf3mez|Leidich|Bonilla. It\u2019s called \",/*#__PURE__*/e(\"em\",{children:\"Zen and the Art of Motorcycle Maintenance\"}),\" by Robert Pirsig. Not only does it narrate a beautiful story of adventure, but it also provides a deep and compelling philosophical argument that has greatly shaped my family and me. It follows the journey of four people, a father and son and an older couple, as they road trip the US on their motorcycles. The couple revels in the aesthetics of their motorcycle; they love the thunderous roar it makes, the sensation of the wind as it caresses their hair, and the rumbling under their legs. The father and son immerse themselves in the machine's inner workings; finding joy in the precise dance of pistons, the satisfying click of a perfectly timed valve adjustment, and the harmonious purr of an engine running at peak efficiency.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Through this contrast, Pirsig introduces us to a fundamental divide: the \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" understanding of the world\u2014focused on immediate aesthetic experience and emotional response\u2014and the \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" understanding\u2014centered on underlying forms, patterns, and rational analysis. But rather than arguing for the superiority of one over the other, he proposes something more profound. Both approaches are merely different ways of pursuing something more fundamental, something he calls Q\",/*#__PURE__*/e(\"em\",{children:\"uality\"}),\". \",/*#__PURE__*/e(\"em\",{children:\"Quality\"}),\", in Pirsig\u2019s framework, isn\u2019t just a characteristic or a measurement; it is the primary force that precedes both our subjective experience and our rational analysis. It\u2019s what we recognize when the motorcycle runs perfectly, whether we appreciate it for its sexy look or its well-tuned engine. It\u2019s the excellence that exists before we divide it into \u201Cbeautiful\u201D or \u201Cefficient.\u201D \",/*#__PURE__*/e(\"em\",{children:\"Quality\"}),\" is thus the point where subject and object, \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" and \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" understanding, meet and dissolve their apparent contradictions.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Software\"}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"300\",src:\"https://framerusercontent.com/images/PL4IuGzNc2E8uXZrtP9cMVeeQM.png\",srcSet:\"https://framerusercontent.com/images/PL4IuGzNc2E8uXZrtP9cMVeeQM.png?scale-down-to=512 512w,https://framerusercontent.com/images/PL4IuGzNc2E8uXZrtP9cMVeeQM.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/PL4IuGzNc2E8uXZrtP9cMVeeQM.png 1600w\",style:{aspectRatio:\"1600 / 600\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"By now you may be wondering what this has to do with \",/*#__PURE__*/e(\"em\",{children:\"software\"}),\" and \",/*#__PURE__*/e(\"em\",{children:\"Querio\"}),\". To understand that connection, we need to first look at how the same tension between \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" and \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" understanding plays out in software development. I'll use my brother, Emiliano, and me as an example. He is one of the smartest, most rational and talented people I know. He \u201Cloves solving hard engineering problems\u201D and has a deep appreciation and skill for the technical details. When he approaches a problem, it's all about the engineering elegance\u2014the perfect architecture, the most efficient algorithm, the cleanest code structure. He\u2019s been known to spend hours building plotting libraries from scratch instead of using an existing one because he sees an opportunity to make it more efficient, just as Pirsig and his son would lose themselves in the meditation of perfectly adjusting their motorcycle's valves.\"]}),/*#__PURE__*/t(\"p\",{children:[\"In contrast to my brother's \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" approach, I approach software with what Pirsig would call a more \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" perspective. I certainly respect the \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" foundations\u2014the architecture, the performance, the technical excellence. What truly drives me, though, is the elegance of the \",/*#__PURE__*/e(\"em\",{children:\"product\"}),\" itself, how seamlessly it fits into our users\u2019 world. I find the greatest satisfaction in solving a hard problem with an elegantly simple solution.\"]}),/*#__PURE__*/t(\"p\",{children:[\"Even though he is \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" and I am \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\", we're both founders and, above all, care about the \",/*#__PURE__*/e(\"em\",{children:\"quality\"}),\" of the software we ship. We know that both sides are equally crucial, and the future of our companies depends on it. A \",/*#__PURE__*/e(\"em\",{children:\"quality product\"}),\" can only be built if tech and product work in harmony\u2014if the architecture is solid but users can\u2019t understand it, you\u2019ve failed. If the interface is slick but riddled with bugs, you\u2019ve failed. Anyone who\u2019s created software knows this dance: the tension between shipping fast and building right, between user experience and system stability, between innovative features and maintainable code. The best software emerges when both mindsets are respected\u2014when the \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" attention to technical excellence meets the \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" pursuit of user value. Just as Pirsig\u2019s \",/*#__PURE__*/e(\"em\",{children:\"Quality\"}),\" transcends both approaches to motorcycle maintenance, true \",/*#__PURE__*/e(\"em\",{children:\"quality\"}),\" in software transcends the divide between engineering elegance and product impact.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"24\",src:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png\",srcSet:\"https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=512 512w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/JxmrIX5B4OpZnxyjlYDTW1yOdS4.png 1400w\",style:{aspectRatio:\"1400 / 48\"},width:\"700\"}),/*#__PURE__*/e(\"h3\",{children:\"Data\"}),/*#__PURE__*/t(\"p\",{children:[\"Still, what does this have to do with \",/*#__PURE__*/e(\"em\",{children:\"Querio\"}),\" and, for that matter, with data? Funnily enough, the world of data struggles with the same dichotomy, perhaps even more starkly than traditional software development. On one side, the data analyst, scientist, or engineer understand the business through the data structures, SQL queries, and stats models. On the other hand, the marketer, salesperson, or executive understands the business through customer interactions, market trends, and business intuition. They\u2019re both needed; you cannot \",/*#__PURE__*/e(\"em\",{children:\"measure\"}),\" progress without technical ability in data, but you cannot \",/*#__PURE__*/e(\"em\",{children:\"define\"}),\" progress without knowing a business and its customers.\"]}),/*#__PURE__*/e(\"img\",{alt:\"\",className:\"framer-image\",height:\"479\",src:\"https://framerusercontent.com/images/ceWMYZqgqpBUL7dsI7nGRBHsIk.png\",srcSet:\"https://framerusercontent.com/images/ceWMYZqgqpBUL7dsI7nGRBHsIk.png?scale-down-to=512 512w,https://framerusercontent.com/images/ceWMYZqgqpBUL7dsI7nGRBHsIk.png?scale-down-to=1024 1024w,https://framerusercontent.com/images/ceWMYZqgqpBUL7dsI7nGRBHsIk.png 1600w\",style:{aspectRatio:\"1600 / 958\"},width:\"800\"}),/*#__PURE__*/t(\"p\",{children:[\"That\u2019s how we build at \",/*#__PURE__*/e(\"em\",{children:\"Querio\"}),\". We care deeply about the \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" and the \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\", the engineering and the product, the data and the business. We obsess over accuracy, ontologies, and agent architectures while ensuring that our data platform meets everyone at their technical level. Building the future of data products is not about choosing between technical sophistication and business accessibility\u2014it\u2019s about marrying those two ideas as the only fundamental way to achieve \",/*#__PURE__*/e(\"em\",{children:\"quality.\"}),\" \"]}),/*#__PURE__*/t(\"p\",{children:[\"Just as Pirsig's \",/*#__PURE__*/e(\"em\",{children:\"Quality\"}),\" precedes the split between \",/*#__PURE__*/e(\"em\",{children:\"classical\"}),\" and \",/*#__PURE__*/e(\"em\",{children:\"romantic\"}),\" understanding, we believe the future of data products lies in unifying these perspectives. Like a well-maintained motorcycle that both purrs perfectly and turns heads, great data products must simultaneously satisfy both the engineer's need for precision and the user's desire for intuitive understanding.\"]})]});\nexport const __FramerMetadata__ = {\"exports\":{\"richText1\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText5\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText8\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText6\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText4\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText3\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText11\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText7\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText2\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText10\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"richText9\":{\"type\":\"variable\",\"annotations\":{\"framerContractVersion\":\"1\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}"],
  "mappings": "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",
  "names": ["init_ssg_sandbox_shims", "richText", "u", "x", "p", "richText1", "richText2", "richText3", "ComponentPresetsConsumer", "t", "CodeBlock_default", "richText4", "Link", "motion", "richText5", "richText6", "richText7", "richText8", "richText9", "richText10", "richText11", "__FramerMetadata__"]
}
