[{"data":1,"prerenderedAt":229},["ShallowReactive",2],{"blog-/blog/lessons-shipping-nabuai":3},{"id":4,"title":5,"body":6,"date":219,"description":220,"extension":221,"image":222,"meta":223,"navigation":224,"path":225,"seo":226,"stem":227,"__hash__":228},"blog/blog/lessons-shipping-nabuai.md","Lessons from shipping NabuAI",{"type":7,"value":8,"toc":212},"minimark",[9,21,28,33,41,54,61,65,68,135,150,154,180,184,187,198,201,204],[10,11,12,13,20],"p",{},"We’ve been building ",[14,15,19],"a",{"href":16,"rel":17},"https://nabuai.me",[18],"nofollow","NabuAI"," – an AI-powered knowledge management tool for researchers and knowledge workers. Here are a few lessons from the first months.",[10,22,23],{},[24,25],"img",{"alt":26,"src":27},"Laptop and notes","https://images.unsplash.com/photo-1517694712202-14dd9538aa97?w=800&q=80",[29,30,32],"h2",{"id":31},"_1-rag-before-custom-models","1. RAG before custom models",[10,34,35,36,40],{},"We tried to get fancy with custom embeddings and fine-tuning early. It slowed us down and didn’t move the needle for our early users. Switching to a simple ",[37,38,39],"strong",{},"GraphRAG","-style pipeline (chunk → embed → retrieve → generate) gave us:",[42,43,44,48,51],"ul",{},[45,46,47],"li",{},"Faster iteration",[45,49,50],{},"Good enough quality for v1",[45,52,53],{},"Room to improve retrieval and prompts without changing the whole stack",[10,55,56,57,60],{},"So: ",[37,58,59],{},"get RAG right first",", then consider custom models only when you have clear, measurable gaps.",[29,62,64],{"id":63},"_2-where-time-actually-went","2. Where time actually went",[10,66,67],{},"Rough breakdown of where engineering time went in the first 3 months:",[69,70,71,87],"table",{},[72,73,74],"thead",{},[75,76,77,81,84],"tr",{},[78,79,80],"th",{},"Area",[78,82,83],{},"% of time",[78,85,86],{},"Note",[88,89,90,102,113,124],"tbody",{},[75,91,92,96,99],{},[93,94,95],"td",{},"Retrieval & RAG",[93,97,98],{},"~35%",[93,100,101],{},"Chunking, embeddings, ranking",[75,103,104,107,110],{},[93,105,106],{},"UI & workflows",[93,108,109],{},"~30%",[93,111,112],{},"Capture, organize, query",[75,114,115,118,121],{},[93,116,117],{},"Integrations",[93,119,120],{},"~20%",[93,122,123],{},"Chrome extension, APIs",[75,125,126,129,132],{},[93,127,128],{},"Infra & ops",[93,130,131],{},"~15%",[93,133,134],{},"Supabase, Postgres, deploy",[10,136,137,138,143,144,149],{},"Integrations and UI took more than we’d guessed; infra stayed manageable thanks to ",[14,139,142],{"href":140,"rel":141},"https://supabase.com",[18],"Supabase"," and ",[14,145,148],{"href":146,"rel":147},"https://vercel.com",[18],"Vercel",".",[29,151,153],{"id":152},"_3-links-we-leaned-on","3. Links we leaned on",[42,155,156,164,172],{},[45,157,158,163],{},[14,159,162],{"href":160,"rel":161},"https://docs.llamaindex.ai/",[18],"LlamaIndex docs"," – for RAG patterns and graph-based retrieval",[45,165,166,171],{},[14,167,170],{"href":168,"rel":169},"https://vuejs.org/",[18],"Vue 3 + TypeScript"," – for the frontend",[45,173,174,179],{},[14,175,178],{"href":176,"rel":177},"https://tailwindcss.com/",[18],"Tailwind CSS"," – for layout and theming",[29,181,183],{"id":182},"_4-one-code-decision-that-helped","4. One code decision that helped",[10,185,186],{},"We kept “sources” for every answer in a simple table and exposed them in the UI from day one:",[188,189,195],"pre",{"className":190,"code":192,"language":193,"meta":194},[191],"language-text","answer_sources: [ document_id, chunk_id, score ]\n","text","",[196,197,192],"code",{"__ignoreMap":194},[10,199,200],{},"That made it easy to show “from which note this came” and to debug bad answers. Small schema choice, big product and debugging win.",[202,203],"hr",{},[10,205,206,207,149],{},"More posts on GraphRAG, the Chrome extension, and our stack choices are planned. If you’re building something similar, ",[14,208,211],{"href":209,"rel":210},"https://twitter.com/coderuth",[18],"say hi",{"title":194,"searchDepth":213,"depth":213,"links":214},2,[215,216,217,218],{"id":31,"depth":213,"text":32},{"id":63,"depth":213,"text":64},{"id":152,"depth":213,"text":153},{"id":182,"depth":213,"text":183},"2025-01-22","What worked and what didn’t when building an AI-powered knowledge base.","md",null,{},true,"/blog/lessons-shipping-nabuai",{"title":5,"description":220},"blog/lessons-shipping-nabuai","83kaIj0d02ESv3stbEmArb8RMaYjkCCgJ0pyXC9c_uM",1775533848266]