[{"data":1,"prerenderedAt":350},["ShallowReactive",2],{"latest-en":3,"projects-en":104},[4],{"id":5,"title":6,"body":7,"date":92,"description":93,"extension":94,"meta":95,"navigation":96,"path":97,"seo":98,"stem":99,"tags":100,"__hash__":103},"blog_en\u002Fen\u002Fblog\u002Fhola-kcode.md","Launching kcode, my development studio",{"type":8,"value":9,"toc":84},"minimark",[10,14,21,26,29,32,36,39,55,58,62,65,69,78,81],[11,12,13],"p",{},"For more than four years I've worked for companies building digital products. I started out writing code, took on more and more responsibility and, over time, ended up leading teams: coordinating people, setting priorities and making sure what we built solved a real problem.",[11,15,16,17],{},"That chapter taught me almost everything I know. Today I'm starting a new one: ",[18,19,20],"strong",{},"I'm launching kcode, my own development studio.",[22,23,25],"h2",{"id":24},"why-now","Why now",[11,27,28],{},"Leading teams showed me that the hardest part of a project is rarely the code. It's understanding what's actually needed, deciding what to build first and keeping everyone on the same page. I want to bring that way of working straight to the businesses that need it, with no layers in between.",[11,30,31],{},"Starting a business is also a personal challenge. It means selling, making decisions and owning every delivery. It's exactly the kind of challenge I was looking for.",[22,33,35],{"id":34},"what-kcode-does","What kcode does",[11,37,38],{},"I focus on two kinds of projects:",[40,41,42,49],"ul",{},[43,44,45,48],"li",{},[18,46,47],{},"MVPs",", to validate an idea with a real product in weeks, not months.",[43,50,51,54],{},[18,52,53],{},"Custom web apps",": internal tools, dashboards and admin panels that replace your spreadsheets.",[11,56,57],{},"The way I work is simple. We start with a call to understand your problem. Then I send you a proposal with scope, timeline and a fixed price. We work in weekly sprints with demos, so you see real progress every week. And at the end I deliver with deployment, documentation and 30 days of support. Throughout the whole process, you work directly with me, the person writing the code.",[22,59,61],{"id":60},"what-youll-find-on-this-blog","What you'll find on this blog",[11,63,64],{},"I'll write about what I build: technical decisions, mistakes, what worked and what didn't. Also about the less visible side of starting a studio from Guatemala.",[22,66,68],{"id":67},"lets-talk","Let's talk",[11,70,71,72,77],{},"If you have an idea or a process you want to automate, ",[73,74,76],"a",{"href":75},"\u002Fen#agendar","book a call",". It takes 30 minutes, no strings attached.",[11,79,80],{},"Thanks for reading the first post. This is just the beginning.",[11,82,83],{},"— Kevin",{"title":85,"searchDepth":86,"depth":86,"links":87},"",2,[88,89,90,91],{"id":24,"depth":86,"text":25},{"id":34,"depth":86,"text":35},{"id":60,"depth":86,"text":61},{"id":67,"depth":86,"text":68},"2026-10-12","After years of growing inside companies to the point of leading teams, I'm taking on a new challenge: building custom software with my own studio.","md",{},true,"\u002Fen\u002Fblog\u002Fhola-kcode",{"title":6,"description":93},"en\u002Fblog\u002Fhola-kcode",[101,102],"kcode","entrepreneurship","MQnmVdzv2ZvNAbw0RJCZ6TChXzK8_sm4Ea0iBbdKdXM",[105,201,281],{"id":106,"title":107,"backendRepo":108,"body":109,"cover":184,"demo":185,"description":85,"extension":94,"meta":186,"navigation":96,"order":187,"path":188,"repo":189,"seo":190,"stack":191,"stem":198,"summary":199,"__hash__":200},"projects_en\u002Fen\u002Fproyectos\u002Frevenew.md","Revenew","https:\u002F\u002Fgithub.com\u002FKevin-Curruchich\u002Fai-sales-assistant",{"type":8,"value":110,"toc":179},[111,115,118,122,125,172,176],[22,112,114],{"id":113},"the-problem","The problem",[11,116,117],{},"A business with recurring sales needs to know at a glance when each customer last bought, when they're likely to come back, and who to call this week. That information usually lives in spreadsheets that never warn you about anything.",[22,119,121],{"id":120},"the-solution","The solution",[11,123,124],{},"A React and TypeScript SPA backed by a custom API (FastAPI and PostgreSQL, with the agent built on LangGraph and Claude) that computes next-purchase estimates. Key decisions:",[40,126,127,133,139,145,156,162],{},[43,128,129,132],{},[18,130,131],{},"Feature-based modules"," (customers, products, purchases, sales, cash, follow-ups, calendar, dashboard and agent), each with its own domain, actions, hooks and pages.",[43,134,135,138],{},[18,136,137],{},"TanStack Query for server state:"," recording a sale changes stock and estimates, so products, customers, dashboard, follow-ups and calendar all refresh together.",[43,140,141,144],{},[18,142,143],{},"Filters, pagination and dates live in the URL",", so any view can be shared.",[43,146,147,150,151,155],{},[18,148,149],{},"AI sales agent:"," every change it proposes (sales, purchases, cash movements, payments) arrives as a card the user approves, edits or cancels before it runs. Responses stream over SSE (via ",[152,153,154],"code",{},"fetch",", since the request is a POST with a body), and the parser and chat state are pure functions with tests.",[43,157,158,161],{},[18,159,160],{},"Dates in the local time zone:"," converting to UTC pushed sales made after 6 p.m. in Guatemala into the next day.",[43,163,164,167,168,171],{},[18,165,166],{},"CI on every PR"," (lint, typecheck, tests) and automatic deploys to Firebase Hosting on merge to ",[152,169,170],{},"main",".",[22,173,175],{"id":174},"the-outcome","The outcome",[11,177,178],{},"In active development, with versioned releases and a CHANGELOG (v0.14.0). The full flow works: customers, inventory, multi-item sales, cash register, follow-ups with filters (7\u002F14\u002F30 days and overdue), calendar, dashboard and an agent with confirmations.",{"title":85,"searchDepth":86,"depth":86,"links":180},[181,182,183],{"id":113,"depth":86,"text":114},{"id":120,"depth":86,"text":121},{"id":174,"depth":86,"text":175},null,"https:\u002F\u002Frevenew-95e3a.web.app\u002F",{},1,"\u002Fen\u002Fproyectos\u002Frevenew","https:\u002F\u002Fgithub.com\u002FKevin-Curruchich\u002Frevenew",{"title":107,"description":85},[192,193,194,195,196,197],"React","TypeScript","TanStack Query","Tailwind CSS","Zod","Firebase","en\u002Fproyectos\u002Frevenew","A dashboard for businesses with recurring sales: it predicts when each customer will buy again and who to follow up with, no spreadsheets needed.","bGOeWMo71hlMyFHNgPVdzRSiQTBHIgNDa2BynrmmXdY",{"id":202,"title":203,"backendRepo":184,"body":204,"cover":184,"demo":266,"description":85,"extension":94,"meta":267,"navigation":96,"order":86,"path":268,"repo":269,"seo":270,"stack":271,"stem":278,"summary":279,"__hash__":280},"projects_en\u002Fen\u002Fproyectos\u002Fmapmytrip.md","MapMyTrip",{"type":8,"value":205,"toc":261},[206,208,211,213,224,256,258],[22,207,114],{"id":113},[11,209,210],{},"Planning a trip or a group outing means jumping between search engines, Google Maps and group chats. Everyone has a different budget and taste, and nobody knows whether a place will be open at the planned time or whether the distances make sense. Generic AI suggestions tend to invent places or build impossible schedules.",[22,212,121],{"id":120},[11,214,215,216,219,220,223],{},"Two flows: ",[18,217,218],{},"Trips"," builds a day-by-day itinerary from a prompt, and ",[18,221,222],{},"group plans"," let each participant join through a link without signing up, share their budget and preferences, and vote between 3 plans proposed by the AI. Key decisions:",[40,225,226,232,238,244,250],{},[43,227,228,231],{},[18,229,230],{},"Real places, not made-up ones:"," generation is a LangGraph graph that searches Google Places and feeds the model distances and opening hours. The code then checks the plan (places closed at that time, duplicates, too far apart or over budget), repairs it when possible and computes real travel times with the Routes API.",[43,233,234,237],{},[18,235,236],{},"Reproducible evals:"," fixed scenarios graded in code and by a larger model, traced in LangSmith. Prompt or model changes are compared with data, not gut feeling.",[43,239,240,243],{},[18,241,242],{},"Curated places:"," beyond Google, an admin panel for hand-picked places, with a partner badge for paying businesses.",[43,245,246,249],{},[18,247,248],{},"Architecture:"," Nuxt 4 with domain layers. The Places key never reaches the browser, inputs are validated with Zod, login uses Google OAuth and WhatsApp share images are generated on the server.",[43,251,252,255],{},[18,253,254],{},"Releases with release-please"," and Conventional Commits.",[22,257,175],{"id":174},[11,259,260],{},"In beta (v0.4.0). Itinerary generation, group plans with voting and closing, the places admin panel and the evals all work. In progress: a place panel with photos, reviews and hours, two columns on desktop and a bottom sheet on mobile.",{"title":85,"searchDepth":86,"depth":86,"links":262},[263,264,265],{"id":113,"depth":86,"text":114},{"id":120,"depth":86,"text":121},{"id":174,"depth":86,"text":175},"https:\u002F\u002Fmap-my-trip-296321264526.us-central1.run.app\u002F",{},"\u002Fen\u002Fproyectos\u002Fmapmytrip","https:\u002F\u002Fgithub.com\u002FKevin-Curruchich\u002Fmap-my-trip",{"title":203,"description":85},[272,273,274,275,276,277],"Nuxt 4","Nuxt UI","LangGraph","Google Maps Platform","Postgres","Cloud Run","en\u002Fproyectos\u002Fmapmytrip","AI-powered trip and group outing planning: itineraries with real places from Google Maps and plans the group votes on.","S59Zii2CgBZxyEpoE0VilsUAeKFGMtrTf84p-bAvXO4",{"id":282,"title":283,"backendRepo":184,"body":284,"cover":184,"demo":338,"description":85,"extension":94,"meta":339,"navigation":96,"order":340,"path":341,"repo":342,"seo":343,"stack":344,"stem":347,"summary":348,"__hash__":349},"projects_en\u002Fen\u002Fproyectos\u002Fpunto-de-equilibrio.md","Punto de Equilibrio",{"type":8,"value":285,"toc":333},[286,288,291,293,296,328,330],[22,287,114],{"id":113},[11,289,290],{},"The clinic needed a web presence to reach patients in its area: explain its services (sports rehab, manual therapy, functional recovery), build trust with testimonials and an FAQ, and let patients book without calling. Its app also required public terms-and-conditions and account-deletion pages.",[22,292,121],{"id":120},[11,294,295],{},"A React and Vite SPA organized by sections (hero, services, testimonials, FAQ and call to action). Key decisions:",[40,297,298,304,310,316,322],{},[43,299,300,303],{},[18,301,302],{},"Bookings without a backend:"," a Google Calendar booking page is embedded in a custom dialog, so no appointment system had to be built.",[43,305,306,309],{},[18,307,308],{},"Legal routes without a router:"," a simple switch on the URL, and each page sets its own title, description and canonical.",[43,311,312,315],{},[18,313,314],{},"Local SEO:"," Guatemala-specific metadata, Open Graph, schema.org structured data, sitemap and robots.",[43,317,318,321],{},[18,319,320],{},"Performance over effects:"," the map (Leaflet) was removed and animations were simplified. Lighter motion was added later, with custom reveal and parallax hooks that respect the reduced-motion preference.",[43,323,324,327],{},[18,325,326],{},"Continuous deployment:"," every merge ships to Firebase Hosting through GitHub Actions, and every PR gets a preview.",[22,329,175],{"id":174},[11,331,332],{},"Live on its own domain with continuous deployment.",{"title":85,"searchDepth":86,"depth":86,"links":334},[335,336,337],{"id":113,"depth":86,"text":114},{"id":120,"depth":86,"text":121},{"id":174,"depth":86,"text":175},"https:\u002F\u002Fpunto-de-equilibrio.com\u002F",{},3,"\u002Fen\u002Fproyectos\u002Fpunto-de-equilibrio","https:\u002F\u002Fgithub.com\u002FKevin-Curruchich\u002Fpunto-de-equilibrio-landing",{"title":283,"description":85},[192,193,345,195,197,346],"Vite","GitHub Actions","en\u002Fproyectos\u002Fpunto-de-equilibrio","Website for an in-home physical therapy clinic in Tecpán, Guatemala: it presents its services and lets patients book an assessment without leaving the page.","Jiz3aDL950OrNRu7JrdEfrrCNk_FoUPvVYEVgT9gp0w",1791866599944]