<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>Coder Legion - Recent posts tagged hackathon</title>
<link>https://coderlegion.com/tag/hackathon</link>
<description>Powered by Question2Answer</description>
<item>
<title>️ CymbalMart Shopping Agent: Intelligent Event Planning &amp; Budget Curation</title>
<link>https://coderlegion.com/27591/cymbalmart-shopping-agent-intelligent-event-planning-budget-curation</link>
<description>&lt;p&gt;This is a submission for the &lt;a rel=&quot;nofollow&quot; href=&quot;https://dev.to/mlh-hackathon&quot;&gt;MLH x DEV Writing Challenge&lt;/a&gt; ✨&lt;/p&gt;
&lt;hr&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;em&gt;&quot;Transforming chaotic party preparation into an effortless, intelligent, and real-time budgeting experience.&quot;&lt;/em&gt; &lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h3 id=&quot;introduction-amp-inspiration&quot;&gt;Introduction &amp;amp; Inspiration&lt;/h3&gt;
&lt;p&gt;Planning events can often feel stressful, chaotic, and hard to budget. Whether you are organizing a corporate team-building event, a children's birthday party, or an outdoor wedding, keeping track of guest counts, item inventories, and expenses usually ends up in a messy, overwhelming spreadsheet. ❌&lt;/p&gt;
&lt;h4 id=&quot;why-build-cymbalmart-&quot;&gt;Why Build CymbalMart?&lt;/h4&gt;
&lt;p&gt;Traditional event planners force users to manually hunt for items, calculate bulk quantities, and manually adjust expenses row-by-row when things change. I wanted to design an application that acts like a &lt;strong&gt;proactive co-pilot&lt;/strong&gt;—taking natural language prompts, instantly structuring inventories, mapping items to store aisles, and recalculating the total budget dynamically.&lt;/p&gt;
&lt;p&gt;To solve this, I built the &lt;strong&gt;CymbalMart Shopping Agent&lt;/strong&gt; ✨—an intelligent, interactive party planning and shopping assistant designed to convert event requirements into curated, budget-conscious shopping lists with real-time adjustments and voice integration. &lt;/p&gt;
&lt;h4 id=&quot;core-features-overview&quot;&gt;Core Features Overview&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Feature Name &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Description  &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Impact&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Smart Event Curation&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Instantly generates tailored shopping lists based on party type, theme, guest count, and budget constraints. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Eliminates manual planning guesswork and speeds up initial setup.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Interactive AI Assistant&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Features a built-in conversational chat interface (&lt;code&gt;CymbalMart Assistant&lt;/code&gt;) for on-the-fly modifications. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Allows natural, human-like adjustments during the planning phase.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Dynamic Budget Recalculation&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Automatically updates and recalculates total expenses and item quantities in real time. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Keeps event planners strictly within their target budget thresholds.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Hands-Free Voice Control&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Integrated voice command capabilities to navigate menus and add items without touching a keyboard. &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Offers accessibility and seamless multi-tasking while planning.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;demo-amp-application-showcase&quot;&gt;Demo &amp;amp; Application Showcase&lt;/h3&gt;
&lt;p&gt;Here is a visual walkthrough of how the application modules are structured, designed, and executed:&lt;/p&gt;
&lt;h4 id=&quot;1-cymbalmart-shopping-agent-dashboard&quot;&gt;1. CymbalMart Shopping Agent Dashboard&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;The central hub where users initiate event curation, theme configuration, and guest count parameters.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/728yne7c0c72iv0t3afd.png&quot; alt=&quot;CymbalMart Shopping Agent Dashboard&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-interactive-shopping-mart-views&quot;&gt;2. Interactive Shopping Mart Views&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Browse through curated store inventories and item selections tailored specifically to your event theme.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/jzd4z315gf88h507nxdi.png&quot; alt=&quot;Interactive Shopping Mart Views&quot;&gt;&lt;/p&gt;
&lt;p&gt;And&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/o54t535ypn4en65ucuqq.png&quot; alt=&quot;Interactive Shopping Mart Views&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;3-dynamic-shopping-lists-amp-budget-tracking&quot;&gt;3. Dynamic Shopping Lists &amp;amp; Budget Tracking&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Automatically updates expenses, quantities, and item availability in real time as modifications are made.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/ra1rciqnz3ic2ipnwz0f.png&quot; alt=&quot;Dynamic Shopping Lists &amp;amp; Budget Tracking&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;4-aisle-resources-amp-smart-navigation&quot;&gt;4. Aisle Resources &amp;amp; Smart Navigation&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Organizes items by store aisles and resource categories to make physical or online shopping seamless.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/knfpv18mwhujz2j8raxa.png&quot; alt=&quot;Aisle Resources &amp;amp; Smart Navigation&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;5-batch-recipes-amp-curation&quot;&gt;5. Batch Recipes &amp;amp; Curation&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Bundle recipes and ingredients efficiently for food and beverage planning.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/wqq1i0wt920e2ugehssk.png&quot; alt=&quot;Batch Recipes &amp;amp; Curation&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;6-hands-free-voice-control&quot;&gt;6. Hands-Free Voice Control&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Navigate menus, add items, and adjust parameters entirely hands-free using integrated voice commands.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/jy7xwpx5sdnvd38klyv6.png&quot; alt=&quot;Hands-Free Voice Control&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;7-event-planning-timeline&quot;&gt;7. Event Planning Timeline&lt;/h4&gt;
&lt;p&gt;&lt;em&gt;Keep track of milestone tasks leading up to the event date to ensure nothing gets missed.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/45svau5zvrc3wo1dvsq0.png&quot; alt=&quot;Event Planning Timeline&quot;&gt;&lt;/p&gt;
&lt;p&gt; &lt;strong&gt;Explore the Codebase:&lt;/strong&gt; You can check out the full source code, component architecture, and documentation directly on the &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/Hizba-cloud/cymbal-mart-shopping-agent&quot;&gt;Cymbal Shopping Agent&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-tech-stack-amp-architecture-deep-dive&quot;&gt;️ Tech Stack &amp;amp; Architecture Deep Dive&lt;/h3&gt;
&lt;p&gt;To build a fast, responsive, and intelligent agent interface, I utilized a modern, robust tech stack engineered for high performance and smooth client-side reactivity.&lt;/p&gt;
&lt;h4 id=&quot;-technology-stack-breakdown&quot;&gt;⚙️ Technology Stack Breakdown&lt;/h4&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Layer / Component &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Technology Used ️ &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Implementation Details ⚙️&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Frontend Architecture&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;&lt;code&gt;React&lt;/code&gt;, &lt;code&gt;TypeScript&lt;/code&gt;, &lt;code&gt;Tailwind CSS&lt;/code&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Ensures a modular, component-driven UI with responsive design systems and custom interactive modals.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;AI &amp;amp; Agent Integration&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;LLM Agent Frameworks, Natural Language Prompts &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Powers the conversational assistant to parse loose user text and map it to structured inventory arrays.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;State Management&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;React State hooks &amp;amp; TypeScript interfaces &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Handles asynchronous budget recalculations instantly whenever quantities shift or items are added.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;architectural-patterns-used&quot;&gt;Architectural Patterns Used&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Component-Driven Modular Design:&lt;/strong&gt; The app is broken down into clean, isolated components (&lt;code&gt;components/&lt;/code&gt; directory) handling specific concerns like modals, chat drawers, dynamic list grids, and timeline trackers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Deterministic State Derivation:&lt;/strong&gt; Instead of storing duplicate calculated values (like total aggregate costs), the state relies on immutable array reducers that compute subtotals, taxes, and quantity tiers on the fly.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Working with these technologies taught me a lot about synchronizing complex state management with natural language processing pipelines, ensuring that the user experience remains lightning-fast and error-free. ⚡&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;engineering-challenges-amp-solutions&quot;&gt;Engineering Challenges &amp;amp; Solutions&lt;/h3&gt;
&lt;p&gt;Building an agentic shopping assistant from scratch came with unique design hurdles. Here is how I tackled them:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Challenge Faced  &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Solution Implemented ️&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Real-Time Budget Sync&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Used deeply typed TypeScript state management to listen for quantity modifications and instantly trigger recalculation hooks without lag.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Natural Language Parsing&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Configured context-aware prompt templates that map unstructured user prompts into clean item and category objects.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Responsive UI Layouts&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Implemented Tailwind CSS grid systems to ensure clean presentation across mobile, tablet, and desktop viewports.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h4 id=&quot;overcoming-state-propagation-latency&quot;&gt;Overcoming State Propagation Latency&lt;/h4&gt;
&lt;p&gt;When users interact with the &lt;em&gt;CymbalMart Assistant&lt;/em&gt; to alter guest quantities (e.g., jumping from 20 to 50 guests), updating every dependent recipe ingredient and store aisle subtotal simultaneously could cause UI stutter. To fix this, I implemented optimized React state hooks that batch updates and memoize expensive lookup arrays using custom calculation helpers.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;future-enhancements-amp-roadmap&quot;&gt;Future Enhancements &amp;amp; Roadmap&lt;/h3&gt;
&lt;p&gt;To take the &lt;strong&gt;CymbalMart Shopping Agent&lt;/strong&gt; to the next level, here are a few exciting features planned for future updates:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th align=&quot;left&quot;&gt;Future Milestone  &lt;/th&gt;&lt;th align=&quot;left&quot;&gt;Objective &amp;amp; Description&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Multi-Store Price Comparison&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Integrate live retail APIs to compare item prices across different local supermarkets automatically.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Collaborative Shared Rooms&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Enable real-time multi-user editing so families or event planning teams can manage lists simultaneously via WebSockets.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td align=&quot;left&quot;&gt;&lt;strong&gt;Export to PDF &amp;amp; Calendar&lt;/strong&gt; &lt;/td&gt;&lt;td align=&quot;left&quot;&gt;Allow users to download formal itemized budget sheets and export milestone reminders straight to Google Calendar.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h3 id=&quot;hackathon-experience&quot;&gt;Hackathon Experience&lt;/h3&gt;
&lt;p&gt;Building the &lt;strong&gt;CymbalMart Shopping Agent&lt;/strong&gt; was an intense and deeply rewarding journey!  Bringing an agentic AI application from a rough concept into a fully functional, interactive web app pushed me to refine my skills in React state management and UI/UX design. &lt;/p&gt;
&lt;p&gt;The biggest highlight was successfully integrating the hands-free voice control and watching the dynamic budget recalculate instantly when interacting with the AI assistant. It really highlighted how powerful modern web technologies and AI agents can be when combined to solve everyday friction points. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Thanks for reading! If you have any feedback, questions, or want to collaborate on agentic web applications, drop a comment below. Don't forget to leave a ❤️ and share this post!&lt;/em&gt; ✨&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/27591/cymbalmart-shopping-agent-intelligent-event-planning-budget-curation</guid>
<pubDate>Fri, 18 Sep 2026 09:44:43 +0000</pubDate>
</item>
<item>
<title>Building KOS: A Journey Through Zero Dependencies (And the Bugs That Taught Me Everything)</title>
<link>https://coderlegion.com/26489/building-kos-a-journey-through-zero-dependencies-and-the-bugs-that-taught-me-everything</link>
<description>&lt;p&gt;I didn't set out to reject &lt;code&gt;go get&lt;/code&gt;. I just wanted to build something clean. But somewhere between the first snapshot corruption and the fourth complete rewrite, I realized: &lt;strong&gt;zero dependencies wasn't a constraint. It was a feature.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is the real story of KOS—what I built, what broke, why I fixed it the way I did, and how you can use it yourself.&lt;/p&gt;
&lt;h3 id=&quot;what-is-kos-&quot;&gt;What is KOS?&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/04l75tb068knzhkb54sp.jpg&quot; alt=&quot;Kos-front&quot;&gt;&lt;/p&gt;
&lt;p&gt;KOS is a portable, encrypted version control system. It's not trying to replace Git. It's trying to be something Git isn't:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Single file&lt;/strong&gt;: Everything lives in one &lt;code&gt;main.go&lt;/code&gt; (~2000 lines)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zero dependencies&lt;/strong&gt;: 100% Go standard library&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encrypted&lt;/strong&gt;: AES-256-CFB with HMAC-SHA256 integrity&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portable&lt;/strong&gt;: Runs from a USB stick, no installation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple&lt;/strong&gt;: &lt;code&gt;kos init&lt;/code&gt; → &lt;code&gt;kos save &quot;message&quot;&lt;/code&gt; → &lt;code&gt;kos view&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It stores your project snapshots in a global vault (&lt;code&gt;~/.kos-global/&lt;/code&gt;) indexed by UUID. No Git databases. No complex merge logic. Just snapshots and timelines.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/u81ozodhj2nk6737zxcw.jpg&quot; alt=&quot;Kos-ecosystem&quot;&gt;&lt;/p&gt;
&lt;h3 id=&quot;getting-started-how-to-use-kos&quot;&gt;Getting Started: How to Use KOS&lt;/h3&gt;
&lt;h4 id=&quot;installation&quot;&gt;Installation&lt;/h4&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/kosmoscpp/kos
cd kos
make install  # Linux/Mac
# or: build.bat  # Windows
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's it. One binary. No dependencies to install. You can even compile it on a machine without Go and ship the binary to another machine.&lt;/p&gt;
&lt;h4 id=&quot;basic-workflow&quot;&gt;Basic Workflow&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Initialize a project:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos init
# ✓ Initialized empty KOS repository in /home/user/.kos-global/abc123...
# Project UUID: abc123-def456-ghi789-...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Create snapshots:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos save &quot;Initial commit&quot;
kos save &quot;Added authentication&quot;
kos save &quot;Fixed bug in auth flow&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;View your timeline:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos view
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Output:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;╔══════════════════════════════════════════════════════════╗
║                     KOS TIMELINE                         ║
╚══════════════════════════════════════════════════════════╝

  ● abc1e2f1 ┃ Jan 08, 14:32 (just now) ┃ Fixed bug in auth flow
  │           ┃  42 files
  │
  ● a2d3f4b5 ┃ Jan 08, 14:15 (15 mins ago) ┃ Added authentication
  │           ┃  41 files
  │
  ● 8c7e9a0b ┃ Jan 08, 12:00 (2 hours ago) ┃ Initial commit
  │           ┃  40 files
  └── (End of history)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Compare snapshots:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos diff abc1e2f1 a2d3f4b5
# Shows: + Added (0), ~ Modified (2), - Deleted (0)

kos diff abc1e2f1 a2d3f4b5 auth.go
# Shows line-by-line diff for auth.go
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Tag releases:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos tag v1.0
kos tag stable abc1e2f1  # Tag a specific snapshot
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Restore your work:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos checkout abc1e2f1                    # Restore entire snapshot
kos checkout abc1e2f1 src/main.go        # Restore single file
kos checkout v1.0                        # Restore by tag
kos checkout HEAD~3                      # Go back 3 commits
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Encrypted snapshots:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/nbtfzj2enjn944oidxe2.jpg&quot; alt=&quot;Kos-Security&quot;&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos save --encrypt &quot;Secret credentials&quot;
# Password: ****
# Confirm: ****
# 🔐 Saved encrypted snapshot: Secret credentials (15 files)

kos share abc1e2f1  # Export as snap_abc1e2f1.tar.gz.enc
# Can email/USB/cloud this file. Recipient loads with:
kos load snap_abc1e2f1.tar.gz.enc
# Password: ****
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Project management:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos projects           # List all projects in global store
kos rename &quot;my-blog&quot;   # Rename current project
kos stats              # Show project statistics
kos search &quot;refactor&quot;  # Search commit messages
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-bugs-and-why-they-matter-&quot;&gt;The Bugs (And Why They Matter)&lt;/h3&gt;
&lt;p&gt;This is where it gets real. Because building from scratch means building through everything.&lt;/p&gt;
&lt;h4 id=&quot;bug-1-head-recognition-fails-the-identity-crisis-&quot;&gt;Bug #1: HEAD Recognition Fails (The Identity Crisis)&lt;/h4&gt;
&lt;p&gt;Early on, I implemented KOS to share and diff by snapshot ID. Simple, right?&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos share HEAD        # Error: Snapshot 'HEAD' not found
kos diff v1.0 v1.1   # Error: Snapshot 'v1.0' not found
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Only raw IDs like &lt;code&gt;18d03947&lt;/code&gt; worked. Tags and HEAD references were rejected.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The root cause:&lt;/strong&gt; I wrote separate lookup functions that did direct ID matching instead of using a reference resolver:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// WRONG: Direct lookup, doesn't handle special refs
func findSnapshot(id string) *Snapshot {
    for i := range manifest.Snapshots {
        if manifest.Snapshots[i].ID == id {
            return &amp;amp;manifest.Snapshots[i]
        }
    }
    return nil
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; I extracted reference resolution into a single function that handles all cases:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// CORRECT: Handles IDs, tags, HEAD, and HEAD~N
func resolveRef(ref string) *Snapshot {
    snaps := manifest.Snapshots
    if ref == &quot;HEAD&quot; {
        return &amp;amp;snaps[len(snaps)-1]
    }
    if strings.HasPrefix(ref, &quot;HEAD~&quot;) {
        parts := strings.Split(ref, &quot;~&quot;)
        var offset int
        fmt.Sscanf(parts[1], &quot;%d&quot;, &amp;amp;offset)
        idx := len(snaps) - 1 - offset
        if idx &amp;gt;= 0 &amp;amp;&amp;amp; idx &amp;lt; len(snaps) {
            return &amp;amp;snaps[idx]
        }
    }
    for i := range snaps {
        if snaps[i].ID == ref || snaps[i].Tag == ref {
            return &amp;amp;snaps[i]
        }
    }
    return nil
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now every command uses &lt;code&gt;resolveRef()&lt;/code&gt;. Git-like references work everywhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Centralize your logic. Don't repeat the same lookup in ten places. You'll catch edge cases faster and users won't hit weird state machines.&lt;/p&gt;
&lt;h4 id=&quot;bug-2-encryption-produces-garbage-the-defer-nightmare-&quot;&gt;Bug #2: Encryption Produces Garbage (The Defer Nightmare)&lt;/h4&gt;
&lt;p&gt;Encrypted snapshots were completely corrupted. Trying to load them:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-plaintext&quot;&gt;Error: unexpected EOF when trying to decrypt
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I was encrypting an incomplete file.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The root cause:&lt;/strong&gt; In &lt;code&gt;cmdSave()&lt;/code&gt;, I used &lt;code&gt;defer&lt;/code&gt; for everything:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// WRONG: Defer happens at function exit, but we encrypt before that!
file, err := os.Create(filepathTar)
defer file.Close()

gzw := gzip.NewWriter(file)
defer gzw.Close()

tw := tar.NewWriter(gzw)
defer tw.Close()

// ... add files to tar ...

if encrypt {
    encryptFile(filepathTar, encPath, password)  // File still open!
    // Defer hasn't run yet. File is incomplete. We're encrypting garbage.
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The file was still being written when I tried to encrypt it. The tar writer hadn't flushed. The gzip writer hadn't compressed. The file wasn't closed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Explicit close order before encryption:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// CORRECT: Close in dependency order before encryption
tw.Close()      // Tar closes first
gzw.Close()     // Gzip flushes compression
file.Close()    // File closes last

if encrypt {
    encryptFile(filepathTar, encPath, password)  // Now it's complete
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This was a painful lesson in writer layering. Each writer depends on the one below it. You have to close from the top down.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Don't let &lt;code&gt;defer&lt;/code&gt; fool you into false security. When you have layered resources (writer → compressor → file), you need explicit, ordered cleanup. &lt;code&gt;defer&lt;/code&gt; is great for simple cases. For complex ones, be explicit.&lt;/p&gt;
&lt;h4 id=&quot;bug-3-encrypted-load-shows-zero-commits-the-skip-logic-backfire-&quot;&gt;Bug #3: Encrypted Load Shows Zero Commits (The Skip Logic Backfire)&lt;/h4&gt;
&lt;p&gt;When loading encrypted snapshots:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;kos load snap_abc123.tar.gz.enc
# ✓ Loaded encrypted project successfully!
# Commits: 0  ← WRONG! Should be 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the commits disappeared.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The root cause:&lt;/strong&gt; The extract function had smart logic to skip &lt;code&gt;.kos/&lt;/code&gt; metadata when extracting:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// This is correct for normal use
if strings.HasPrefix(header.Name, &quot;.kos/&quot;) {
    continue  // Skip metadata files
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But the encrypted load code needed to read &lt;code&gt;.kos/manifest.json&lt;/code&gt; to show how many commits existed. Since it was being skipped, the manifest was empty.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Use a different extraction function for encrypted loads that doesn't skip:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// extractFileFromTar reads directly from tar without skip logic
manifestContent, err := extractFileFromTar(decryptedPath, &quot;.kos/manifest.json&quot;)
json.Unmarshal([]byte(manifestContent), &amp;amp;embeddedManifest)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Now encrypted snapshots preserve their full history.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; When you have branching logic (normal extract vs. encrypted load), they need different paths. Don't let one code path's assumptions break another's.&lt;/p&gt;
&lt;h4 id=&quot;bug-4-password-masking-without-x-term-the-syscall-journey-&quot;&gt;Bug #4: Password Masking Without x/term (The Syscall Journey)&lt;/h4&gt;
&lt;p&gt;I wanted masked password input (asterisks instead of plaintext). The easy way: &lt;code&gt;golang.org/x/term&lt;/code&gt;. But that breaks zero dependencies.&lt;/p&gt;
&lt;p&gt;So I went low-level. POSIX syscalls. &lt;code&gt;SYS_IOCTL&lt;/code&gt;. Terminal state manipulation.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;func readPassword() string {
    fd := int(os.Stdin.Fd())
    oldState, err := getTerminalState(fd)
    if err != nil {
        // Fallback if we can't control terminal
        var password string
        fmt.Scanln(&amp;amp;password)
        return password
    }
    
    newState := oldState
    newState.Lflag &amp;amp;^= syscall.ECHO  // Disable echo
    setTerminalState(fd, newState)
    defer setTerminalState(fd, oldState)
    
    var password []byte
    buf := make([]byte, 1)
    for {
        n, err := os.Stdin.Read(buf)
        if err != nil || n == 0 || buf[0] == '\n' {
            break
        }
        if buf[0] == 127 || buf[0] == 8 {  // Backspace
            if len(password) &amp;gt; 0 {
                password = password[:len(password)-1]
                fmt.Print(&quot;\b \b&quot;)  // Visual backspace
            }
        } else {
            password = append(password, buf[0])
            fmt.Print(&quot;*&quot;)
        }
    }
    return string(password)
}

func getTerminalState(fd int) (syscall.Termios, error) {
    var state syscall.Termios
    _, _, errno := syscall.Syscall6(
        syscall.SYS_IOCTL,
        uintptr(fd),
        uintptr(syscall.TCGETS),
        uintptr(unsafe.Pointer(&amp;amp;state)),
        0, 0, 0,
    )
    if errno != 0 {
        return state, errno
    }
    return state, nil
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The tricky part:&lt;/strong&gt; One wrong flag bit and users see their passwords on screen. The POSIX terminal model is finicky. This code works on Linux. Windows POSIX layer might have issues (but that's acceptable for a hackathon).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Sometimes the &quot;easy&quot; dependency exists for a reason. But understanding the low-level mechanism? That's worth more than convenience. Now I know how terminal echo works. I know what &lt;code&gt;TCGETS&lt;/code&gt; and &lt;code&gt;TCSETS&lt;/code&gt; do. I know the bitfield layout of &lt;code&gt;Termios&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id=&quot;bug-5-the-pbkdf2-myth-and-correcting-a-senior-engineer-&quot;&gt;Bug #5: The PBKDF2 Myth (And Correcting a Senior Engineer)&lt;/h4&gt;
&lt;p&gt;During review, someone asked: &quot;Why SHA256 for key derivation instead of PBKDF2?&quot;&lt;/p&gt;
&lt;p&gt;They said: &quot;It's in the standard library.&quot;&lt;/p&gt;
&lt;p&gt;It's not.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;crypto/pbkdf2&lt;/code&gt; doesn't exist in stdlib. It's in &lt;code&gt;golang.org/x/crypto&lt;/code&gt;, which is external. I had to correct them.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-go&quot;&gt;// This is what I use (stdlib)
func deriveKey(password string) []byte {
    hash := sha256.Sum256([]byte(password))
    return hash[:]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Felt weird correcting a senior engineer, but I was right. I triple-checked. &lt;code&gt;go doc crypto/pbkdf2&lt;/code&gt; returns nothing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The choice:&lt;/strong&gt; SHA256 is fast. PBKDF2 is slower (which is good for passwords—more resistant to brute force). But for a hackathon tool, the trade-off is acceptable. And it keeps zero dependencies.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Don't assume. Don't trust memory. Actually verify what's in the standard library. And sometimes you do know things that others don't.&lt;/p&gt;
&lt;h4 id=&quot;bug-6-ghost-projects-in-kos-global-the-cleanup-problem-&quot;&gt;Bug #6: Ghost Projects In ~/.kos-global/ (The Cleanup Problem)&lt;/h4&gt;
&lt;p&gt;After months of testing:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;ls ~/.kos-global/
abc123-def456-...
import-test-1
import-test-2
my-awesome-project-v1
my-awesome-project-v2
test-uuid-alpha
test-uuid-beta
... fifteen more orphaned directories
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Each test run created new UUIDs. Each UUID got added to &lt;code&gt;projects.json&lt;/code&gt;. But I never deleted old ones.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The root cause:&lt;/strong&gt; During testing, I created projects, then deleted them locally, but their entries in &lt;code&gt;projects.json&lt;/code&gt; remained. Then their directories stayed in the global store, orphaned and forgotten.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; Had to manually:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rm -rf ~/.kos-global/test-uuid-*
rm -rf ~/.kos-global/import-test-*
vim ~/.kos-global/projects.json  # Remove orphaned entries
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then rebuild the index.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What I learned:&lt;/strong&gt; Testing creates state. State accumulates. You need cleanup procedures or eventual garbage collection. In production, KOS should have a &lt;code&gt;kos gc&lt;/code&gt; (garbage collect) command to clean up orphaned projects.&lt;/p&gt;
&lt;h3 id=&quot;the-real-lessons&quot;&gt;The Real Lessons&lt;/h3&gt;
&lt;h4 id=&quot;1-writer-layering-matters&quot;&gt;1. &lt;strong&gt;Writer Layering Matters&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Gzip writes to a tar writer. The tar writer writes to a file. You have to close them in order: tar → gzip → file. Not all at once with defer.&lt;/p&gt;
&lt;h4 id=&quot;2-centralize-reference-resolution&quot;&gt;2. &lt;strong&gt;Centralize Reference Resolution&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Don't lookup snapshots in ten places. Do it in one place (resolveRef). Now HEAD works everywhere. Tags work everywhere. No weird edge cases.&lt;/p&gt;
&lt;h4 id=&quot;3-skip-logic-can-break-assumptions&quot;&gt;3. &lt;strong&gt;Skip Logic Can Break Assumptions&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Your extract function skips &lt;code&gt;.kos/&lt;/code&gt; files? That's correct for normal use. But encrypted loads need them. Different paths for different use cases.&lt;/p&gt;
&lt;h4 id=&quot;4-syscalls-teach-you-real-things&quot;&gt;4. &lt;strong&gt;Syscalls Teach You Real Things&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Using &lt;code&gt;golang.org/x/term&lt;/code&gt; is easy. Using &lt;code&gt;syscall.Syscall6&lt;/code&gt; with &lt;code&gt;TCGETS&lt;/code&gt; is harder. But now I understand terminal echo at the OS level. That knowledge sticks.&lt;/p&gt;
&lt;h4 id=&quot;5-test-state-accumulates&quot;&gt;5. &lt;strong&gt;Test State Accumulates&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;Build testing cleanup into your workflow. Delete projects between tests. Clean up &lt;code&gt;projects.json&lt;/code&gt;. Otherwise you end up with fifteen ghost projects.&lt;/p&gt;
&lt;h3 id=&quot;why-zero-dependencies-was-worth-it&quot;&gt;Why Zero Dependencies Was Worth It&lt;/h3&gt;
&lt;p&gt;I could have used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;github.com/urfave/cli&lt;/code&gt; for CLI parsing&lt;/li&gt;
&lt;li&gt;&lt;code&gt;golang.org/x/term&lt;/code&gt; for password masking&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/fatih/color&lt;/code&gt; for colors&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/google/uuid&lt;/code&gt; for UUIDs&lt;/li&gt;
&lt;li&gt;&lt;code&gt;github.com/sergi/go-diff&lt;/code&gt; for diffs&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Each would have saved time on that specific feature. But:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I wouldn't have understood how any of them work&lt;/li&gt;
&lt;li&gt;The binary would be much larger&lt;/li&gt;
&lt;li&gt;The attack surface (for a security tool!) would be huge&lt;/li&gt;
&lt;li&gt;I wouldn't have learned anything&lt;/li&gt;
&lt;li&gt;Deployment would be more complex&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead, I built a 4.2 MB binary that runs anywhere. I understand every line. I can audit it myself. I can deploy it to air-gapped networks. I can ship it on a USB stick.&lt;/p&gt;
&lt;h3 id=&quot;how-to-try-it&quot;&gt;How to Try It&lt;/h3&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# Clone and build
git clone https://github.com/kosmoscpp/kos
cd kos
go build -o kos .

# Initialize a project
mkdir my-project
cd my-project
../kos init

# Save some work
echo &quot;Hello, KOS&quot; &amp;gt; readme.md
../kos save &quot;Initial commit&quot;

# See the timeline
../kos view

# Make a change
echo &quot;Hello, KOS with updates!&quot; &amp;gt; readme.md
../kos save &quot;Updated readme&quot;

# View timeline again
../kos view

# Check what changed
../kos diff &amp;lt;snapshot-id-1&amp;gt; &amp;lt;snapshot-id-2&amp;gt;

# Restore a version
../kos checkout &amp;lt;snapshot-id&amp;gt;
cat readme.md  # Back to original
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;the-takeaway&quot;&gt;The Takeaway&lt;/h3&gt;
&lt;p&gt;Building KOS taught me that constraints aren't prison walls. They're focusing tools.&lt;/p&gt;
&lt;p&gt;When I couldn't reach for &lt;code&gt;go get&lt;/code&gt;, I had to understand my problems deeply. I had to learn about terminal I/O, writer layering, reference resolution, and encryption. I had to debug by understanding, not by reading someone else's code.&lt;/p&gt;
&lt;p&gt;The result isn't just a tool. It's a tool I completely understand. It's a tool that's portable and secure. It's a tool that can run where nothing else can run.&lt;/p&gt;
&lt;p&gt;That's worth the bugs. That's worth the deep dives. That's worth saying no to convenience.&lt;/p&gt;
&lt;p&gt;Try KOS. Use it. Break it (please report issues). Learn from it.&lt;/p&gt;
&lt;p&gt;And maybe, just maybe, build something with zero dependencies yourself. You'll be surprised what you learn when you can't &lt;code&gt;go get&lt;/code&gt; your way out.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/kosmoscpp/kos&quot;&gt;kosmoscpp/kos&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Quick Start:&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;git clone https://github.com/kosmoscpp/kos &amp;amp;&amp;amp; cd kos &amp;amp;&amp;amp; make install
kos init
kos save &quot;My first snapshot&quot;
kos view
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's it. No setup. No config. No dependencies. Just version control, zero friction.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26489/building-kos-a-journey-through-zero-dependencies-and-the-bugs-that-taught-me-everything</guid>
<pubDate>Tue, 08 Sep 2026 12:13:13 +0000</pubDate>
</item>
<item>
<title>Handles, Screen Names, and the Developer Identity</title>
<link>https://coderlegion.com/26436/handles-screen-names-and-the-developer-identity</link>
<description>&lt;p&gt;Before real‑name profiles and professional developer portfolios became standard, people chose usernames simply because they wanted something that sounded cool. Developers and aspiring hackers took this much more seriously. A handle was not just a login. It was a personal identifier that carried weight inside technical communities. Choosing the right name mattered, and many spent real time crafting something distinctive that reflected their style, their interests, or the image they wanted to project. In early coding and hacker culture, a handle became an essential part of one’s identity.&lt;/p&gt;
&lt;p&gt;Although usernames eventually became common in gaming, that culture was separate from the world of developers and early internet hackers. In technical communities, a handle carried meaning. It represented experience, reputation, and continuity across different platforms. It was not created for entertainment or casual play. It was chosen with intention, and it became part of how others recognized you.&lt;/p&gt;
&lt;h3 id=&quot;notable-handles-in-early-technical-culture&quot;&gt;Notable Handles in Early Technical Culture&lt;/h3&gt;
&lt;p&gt;Among the earliest online communities, certain handles became recognizable far beyond the forums and bulletin boards where they first appeared. These names were not chosen for entertainment. They represented identity, reputation, and continuity in spaces where real names were rarely used.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Captain Crunch&lt;/em&gt;&lt;br&gt;
John Draper adopted this handle after discovering that a toy whistle from a cereal box could manipulate telephone systems. His name became synonymous with early phreaking culture and remains one of the most widely recognized aliases from that era.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Phiber Optik&lt;/em&gt;&lt;br&gt;
Mark Abene used this handle during his involvement in the hacker group Masters of Deception. His name appeared frequently in discussions about security, intrusion, and the ethics of early hacking communities.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Mentor&lt;/em&gt;&lt;br&gt;
Known for writing “The Hacker Manifesto,” The Mentor became a symbolic figure in early digital culture. His handle represented a philosophical voice within a community that was still defining itself.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Eric Bloodaxe&lt;/em&gt;&lt;br&gt;
A prominent figure in the underground bulletin board scene, Eric Bloodaxe’s handle became associated with technical skill and leadership within early hacker networks.&lt;/p&gt;
&lt;p&gt;These names were not accidental. They were crafted identities that carried meaning inside communities where reputation was built through contribution, insight, and technical ability.&lt;/p&gt;
&lt;h3 id=&quot;handles-that-transitioned-into-professional-identity&quot;&gt;Handles That Transitioned Into Professional Identity&lt;/h3&gt;
&lt;p&gt;As the internet matured, some developers continued using their handles even as their work became public and professional. These names evolved from aliases into recognizable signatures within open source and software development.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;jwz&lt;/em&gt;&lt;br&gt;
Jamie Zawinski used this handle across mailing lists and early Netscape development. It became a shorthand for his contributions to software and open source culture.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;esr&lt;/em&gt;&lt;br&gt;
Eric S. Raymond’s handle appeared frequently in discussions about open source philosophy and software engineering. It became part of his professional identity and is still used in technical circles.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;geohot&lt;/em&gt;&lt;br&gt;
George Hotz adopted this handle during his early work in hardware modification and security research. It later became a widely recognized name in both hacking and artificial intelligence communities.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;moxie&lt;/em&gt;&lt;br&gt;
Moxie Marlinspike used this handle throughout his work in cryptography and secure communication. It became a respected identity associated with expertise in privacy and security.&lt;/p&gt;
&lt;p&gt;These names demonstrate how a handle can evolve from a simple alias into a lasting professional identity. In many cases, the handle became more recognizable than the person’s legal name.&lt;/p&gt;
&lt;h3 id=&quot;the-influence-of-fictional-handles&quot;&gt;The Influence of Fictional Handles&lt;/h3&gt;
&lt;p&gt;Although fictional handles introduced a dramatic and exaggerated version of hacker identity, they also helped shape how many people first imagined the idea of a digital persona. Real technical communities, however, built their identities through meaningful aliases that carried history, reputation and continuity. Whether a name came from early bulletin boards, open source mailing lists or professional development work, a handle often became a lasting part of a person’s presence in the technical world. &lt;/p&gt;
&lt;p&gt;With that in mind, it is worth asking a simple question. What was a handle that you used or one that you still remember from those early days of the internet?&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/26436/handles-screen-names-and-the-developer-identity</guid>
<pubDate>Mon, 07 Sep 2026 23:03:56 +0000</pubDate>
</item>
<item>
<title>From 4,000+ Applications to 250 Builders: Building a Multi-Agent Video Pipeline at the Google DeepMind Bangalore Hackathon</title>
<link>https://coderlegion.com/24893/applications-builders-building-multi-video-pipeline-google-deepmind-bangalore-hackathon</link>
<description>&lt;p&gt;&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/1yqnir43muj0sqsocy8o.jpg&quot; alt=&quot;Image description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/5829e5j7gczmzkzjzd0y.jpg&quot; alt=&quot;Image description&quot;&gt;&lt;br&gt;
&lt;img src=&quot;https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/fofaqonorxyyyij5rk51.jpg&quot; alt=&quot;Image description&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;tl-dr&quot;&gt;TL;DR&lt;/h3&gt;
&lt;p&gt;Got selected out of 4,000+ applicants for the Google DeepMind Bangalore Hackathon 2026 (250 builders made it in). My teammate  and I merged two hackathon tracks — &lt;strong&gt;Conversational Video &amp;amp; Motion with Omni Flash&lt;/strong&gt; and &lt;strong&gt;Local-First Agents with Gemma 4&lt;/strong&gt; — into one pipeline: a multi-turn conversational video orchestration agent that asks clarifying questions and iteratively refines its output, backed by on-device reasoning for state management. No trophy this time, but a working prototype and a lot of lessons. Here's the build.&lt;/p&gt;
&lt;h3 id=&quot;the-selection&quot;&gt;The selection&lt;/h3&gt;
&lt;p&gt;Google DeepMind and Cerebral Valley ran this hackathon in Bangalore, and the numbers alone made it feel different from the college-circuit events I'd been doing: &lt;strong&gt;4,000+ applications, 250 seats.&lt;/strong&gt; Getting the acceptance email didn't fully register until I was actually in the room — this wasn't a campus event anymore, it was a room full of people who build for a living.&lt;/p&gt;
&lt;h3 id=&quot;the-idea-merging-two-tracks-instead-of-picking-one&quot;&gt;The idea: merging two tracks instead of picking one&lt;/h3&gt;
&lt;p&gt;The hackathon offered several tracks. Two stood out to me and Rohan:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conversational Video &amp;amp; Motion with Omni Flash&lt;/strong&gt; — generate and iterate on video through natural conversation&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Local-First Agents with Gemma 4&lt;/strong&gt; — on-device reasoning and autonomous decision-making&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead of choosing one, we asked: what if the video generation system &lt;em&gt;was&lt;/em&gt; the agent? So we built a pipeline where:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Gemini Omni Flash + NB2 Lite&lt;/strong&gt; handle multi-turn conversational video orchestration — the system doesn't just take a prompt and spit out a video. It asks clarifying questions, holds context across turns, and iteratively refines the output based on what the user actually meant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gemma 4&lt;/strong&gt; runs on-device for state management and decision-making — tracking where the conversation is, what's already been generated, what still needs clarifying, and deciding the next action locally instead of round-tripping everything through a heavier model.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The result was an agent that blends reasoning, local intelligence, and multimodal generation into a single loop, rather than three separate systems bolted together.&lt;/p&gt;
&lt;h3 id=&quot;what-building-under-a-deadline-like-this-actually-felt-like&quot;&gt;What building under a deadline like this actually felt like&lt;/h3&gt;
&lt;p&gt;Tight deadlines are a hackathon constant, but the density of the room changes the pressure. Every table around us was shipping something legitimately interesting, which is equal parts motivating and intimidating. Having a partner who's good at both brainstorming &lt;em&gt;and&lt;/em&gt; debugging (thanks, Rohan) mattered more here than in any hackathon I'd done before — there wasn't time to context-switch between &quot;figuring out the architecture&quot; and &quot;fixing why the state manager is out of sync.&quot;&lt;/p&gt;
&lt;h3 id=&quot;the-outcome&quot;&gt;The outcome&lt;/h3&gt;
&lt;p&gt;We didn't place. No trophy this round. But we left with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A working end-to-end prototype of the conversational video + local agent pipeline&lt;/li&gt;
&lt;li&gt;Direct exposure to how a team like DeepMind's frames the &quot;agentic + multimodal&quot; problem space&lt;/li&gt;
&lt;li&gt;Genuinely useful conversations with other builders working on adjacent problems&lt;/li&gt;
&lt;li&gt;Insights from &lt;strong&gt;Amit Vadi&lt;/strong&gt; and &lt;strong&gt;Ray Del Vecchio&lt;/strong&gt;, who spoke at the event&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;why-i-m-writing-this-up&quot;&gt;Why I'm writing this up&lt;/h3&gt;
&lt;p&gt;Hackathons are noisy — you build for 24-48 hours, present, and the artifact usually dies in a GitHub repo somewhere. Writing it up is partly documentation for myself (what worked, what I'd do differently) and partly a way of tracking how the &lt;em&gt;kind&lt;/em&gt; of problems I'm choosing to work on has shifted — from single-model chatbots to multi-agent, multimodal, local-first systems.&lt;/p&gt;
&lt;p&gt;If you're building anything similar — conversational video generation, on-device agent state management, or just curious about how Omni Flash and Gemma 4 play together — I'd genuinely like to compare notes. Drop a comment or find me on GitHub.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;This is part of an ongoing hackathon log — you can find the earlier entries (including two first-place wins and a near-miss with a legal-aid kiosk built on a multi-agent swarm) on &lt;a rel=&quot;nofollow&quot; href=&quot;https://karthik-unni.github.io/blog.html&quot;&gt;my blog&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24893/applications-builders-building-multi-video-pipeline-google-deepmind-bangalore-hackathon</guid>
<pubDate>Wed, 19 Aug 2026 06:27:37 +0000</pubDate>
</item>
<item>
<title>🐾 Cat Guardian — Protect. Identify. Find.</title>
<link>https://coderlegion.com/24788/cat-guardian-protect-identify-find</link>
<description>&lt;p&gt;I live with seven cats: Kiara, Golia, Meias, Vaquinha, Tigrinha, Peluda, and Gamora.&lt;/p&gt;
&lt;p&gt;They all have different personalities, different appearances, and different routines.&lt;/p&gt;
&lt;p&gt;And, like many pet owners, there is one thing that has always worried me:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What if one of them gets lost?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That question became the starting point for Cat Guardian.&lt;/p&gt;
&lt;h3 id=&quot;what-i-built&quot;&gt;What I Built&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cat Guardian&lt;/strong&gt; is a privacy-first digital safety passport for cats.&lt;/p&gt;
&lt;p&gt;The idea is simple: give each cat a digital identity containing the information that could actually help if they ever go missing.&lt;/p&gt;
&lt;p&gt;The platform provides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;🐈 Digital identity for each cat&lt;/li&gt;
&lt;li&gt;🩺 Health records and vaccination tracking&lt;/li&gt;
&lt;li&gt;🧠 AI-assisted visual identification&lt;/li&gt;
&lt;li&gt;🏷️ Dynamic QR collar tags&lt;/li&gt;
&lt;li&gt;🚨 Lost Mode&lt;/li&gt;
&lt;li&gt;📱 Public rescue passport&lt;/li&gt;
&lt;li&gt;🔐 Privacy-preserving contact between finder and owner&lt;/li&gt;
&lt;li&gt;🌎 English and Brazilian Portuguese localization&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;the-problem&quot;&gt;The problem&lt;/h4&gt;
&lt;p&gt;When a pet goes missing, useful information is often scattered across photos, veterinary records, paper documents, and the owner's memory.&lt;/p&gt;
&lt;p&gt;Traditional collar tags can also expose personal information such as phone numbers or addresses.&lt;/p&gt;
&lt;p&gt;I wanted a different approach.&lt;/p&gt;
&lt;p&gt;The QR code attached to the collar doesn't expose the owner's contact information.&lt;/p&gt;
&lt;p&gt;Instead, when someone finds the cat, they can scan the QR code and access a public rescue profile.&lt;/p&gt;
&lt;p&gt;If the owner has activated &lt;strong&gt;Lost Mode&lt;/strong&gt;, the finder can submit a sighting.&lt;/p&gt;
&lt;p&gt;The owner is then notified through a secure backend relay.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Owner
  │
  ▼
Cat Guardian
  │
  ├── Digital Identity
  ├── Health Records
  ├── AI Profile
  └── QR Collar Tag
          │
          ▼
      Lost Mode
          │
          ▼
     Finder scans QR
          │
          ▼
    Public Rescue Card
          │
          ▼
     Submit Sighting
          │
          ▼
       Owner notified
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The goal isn't to replace GPS trackers or microchips.&lt;/p&gt;
&lt;p&gt;It is to make the information surrounding a lost pet &lt;strong&gt;available, structured, and safer to share&lt;/strong&gt;.&lt;/p&gt;
&lt;h4 id=&quot;why-ai-&quot;&gt;Why AI?&lt;/h4&gt;
&lt;p&gt;I didn't want to add AI simply because this was an AI-related challenge.&lt;/p&gt;
&lt;p&gt;I wanted to use it where it could provide practical value.&lt;/p&gt;
&lt;p&gt;Gemini is used to analyze visual characteristics such as coat patterns, eye color, and distinctive markings and generate a structured identification profile.&lt;/p&gt;
&lt;p&gt;The application also provides informational preventive wellness guidance, while explicitly keeping medical diagnosis and treatment outside its scope.&lt;/p&gt;
&lt;p&gt;AI-generated profiles are also localized according to the user's language.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;demo&quot;&gt;Demo&lt;/h3&gt;
&lt;p&gt;🌐 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cat-guardian-two.vercel.app/&quot;&gt;Open the Live Demo →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The application includes a &lt;strong&gt;Demo Mode&lt;/strong&gt;, so you can explore the main experience without creating an account.&lt;/p&gt;
&lt;p&gt;The demo contains my seven cats:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kiara · Golia · Meias · Vaquinha · Tigrinha · Peluda · Gamora&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Try the Lost &amp;amp; Found flow with the demo data and explore how a finder would interact with a cat's public rescue passport.&lt;/p&gt;
&lt;h4 id=&quot;key-flows&quot;&gt;Key flows&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;1. Register a cat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a digital identity and add health information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2. Generate a QR collar tag&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The QR code points to the cat's public safety passport.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Activate Lost Mode&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The owner can mark the cat as missing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4. Finder scans the QR code&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The finder sees the relevant rescue information without seeing the owner's private contact details.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5. Submit a sighting&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The finder can send information about where and when the cat was seen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;6. Owner receives the notification&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The backend relays the sighting to the owner through Resend.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;code&quot;&gt;Code&lt;/h3&gt;
&lt;p&gt;💻 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/lfrichter/cat-guardian&quot;&gt;GitHub Repository →&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The project is open source and built with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;React 19&lt;/li&gt;
&lt;li&gt;Vite 6&lt;/li&gt;
&lt;li&gt;TypeScript&lt;/li&gt;
&lt;li&gt;Supabase PostgreSQL&lt;/li&gt;
&lt;li&gt;Supabase Auth&lt;/li&gt;
&lt;li&gt;Row Level Security&lt;/li&gt;
&lt;li&gt;Gemini&lt;/li&gt;
&lt;li&gt;Ollama&lt;/li&gt;
&lt;li&gt;Mistral 7B&lt;/li&gt;
&lt;li&gt;OpenCoder 8B&lt;/li&gt;
&lt;li&gt;Resend&lt;/li&gt;
&lt;li&gt;i18next / react-i18next&lt;/li&gt;
&lt;li&gt;Vitest&lt;/li&gt;
&lt;li&gt;React Testing Library&lt;/li&gt;
&lt;li&gt;ESLint&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3 id=&quot;how-i-built-it&quot;&gt;How I Built It&lt;/h3&gt;
&lt;p&gt;This project was also an experiment in &lt;strong&gt;AI-assisted software engineering&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I used my own &lt;strong&gt;AI Software Engineering Framework 2.0&lt;/strong&gt; to orchestrate the development process.&lt;/p&gt;
&lt;p&gt;The goal was not simply to ask an LLM to generate the application.&lt;/p&gt;
&lt;p&gt;Instead, I treated AI agents as specialized members of an engineering workflow.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Human Supervisor
       │
       ▼
Chief of Staff
       │
       ▼
   Risk Router
    /   |   \
   ▼    ▼    ▼
Mistral OpenCoder Gemini
   \    |    /
    \   |   /
      Jidoka
         │
         ▼
   Human Approval
         │
         ▼
       Merge
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;risk-based-agent-routing&quot;&gt;Risk-based agent routing&lt;/h4&gt;
&lt;p&gt;Simple and low-risk tasks were delegated to local models running through Ollama.&lt;/p&gt;
&lt;p&gt;🟢 &lt;strong&gt;Mistral 7B&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for tasks such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documentation&lt;/li&gt;
&lt;li&gt;simple UI changes&lt;/li&gt;
&lt;li&gt;repetitive work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🟡 &lt;strong&gt;OpenCoder 8B&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CRUD&lt;/li&gt;
&lt;li&gt;forms&lt;/li&gt;
&lt;li&gt;implementation tasks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;🔴 &lt;strong&gt;Gemini&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Used for higher-risk tasks such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;authentication&lt;/li&gt;
&lt;li&gt;Row Level Security&lt;/li&gt;
&lt;li&gt;AI integrations&lt;/li&gt;
&lt;li&gt;architectural decisions&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This allowed me to keep the more capable model focused on tasks where it provided the most value.&lt;/p&gt;
&lt;h4 id=&quot;jidoka-quality-gate&quot;&gt;Jidoka Quality Gate&lt;/h4&gt;
&lt;p&gt;Every implementation had to pass a validation pipeline:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Lint
  ↓
Typecheck
  ↓
Tests
  ↓
Build
  ↓
Human Approval
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If a validation step failed, the workflow stopped instead of allowing the problem to propagate.&lt;/p&gt;
&lt;p&gt;This follows the &lt;strong&gt;Jidoka / Andon Cord&lt;/strong&gt; principle from my framework:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;When an anomaly is detected, stop the process and fix it before continuing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The final release candidate passed:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Gate             &lt;/th&gt;&lt;th&gt;Result&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ESLint           &lt;/td&gt;&lt;td&gt;✅ PASS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;TypeScript       &lt;/td&gt;&lt;td&gt;✅ PASS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Vitest           &lt;/td&gt;&lt;td&gt;✅ 21/21 PASS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Production Build &lt;/td&gt;&lt;td&gt;✅ PASS&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr&gt;
&lt;h4 id=&quot;privacy-first-architecture&quot;&gt;Privacy-first architecture&lt;/h4&gt;
&lt;p&gt;The public rescue passport deliberately does not expose:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;owner's email&lt;/li&gt;
&lt;li&gt;phone number&lt;/li&gt;
&lt;li&gt;physical address&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The finder communicates through a backend relay.&lt;/p&gt;
&lt;p&gt;Sightings are persisted in PostgreSQL and the owner is notified through the Resend API.&lt;/p&gt;
&lt;p&gt;This creates a simple separation:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;Finder
  │
  ▼
Public Rescue Passport
  │
  ▼
Sighting
  │
  ▼
Backend
  ├── PostgreSQL
  └── Resend
          │
          ▼
        Owner
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The finder can help without gaining direct access to the owner's private contact information.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;internationalization&quot;&gt;Internationalization&lt;/h4&gt;
&lt;p&gt;English is the default language, with Brazilian Portuguese as a secondary locale.&lt;/p&gt;
&lt;p&gt;I also wanted AI-generated information to respect localization.&lt;/p&gt;
&lt;p&gt;The localized AI profiles are stored in PostgreSQL using JSONB:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;en&quot;: {
    &quot;description&quot;: &quot;...&quot;,
    &quot;personality&quot;: &quot;...&quot;
  },
  &quot;pt-BR&quot;: {
    &quot;description&quot;: &quot;...&quot;,
    &quot;personality&quot;: &quot;...&quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This keeps the cat's identity data together while allowing the presentation to adapt to the user's language.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;design-system&quot;&gt;Design System&lt;/h4&gt;
&lt;p&gt;The application uses a custom &lt;strong&gt;Midnight Guardian&lt;/strong&gt; design system.&lt;/p&gt;
&lt;p&gt;The visual language combines:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Midnight Navy&lt;/li&gt;
&lt;li&gt;Lavender&lt;/li&gt;
&lt;li&gt;Emerald&lt;/li&gt;
&lt;li&gt;Amber&lt;/li&gt;
&lt;li&gt;Coral&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal was to make the application feel like a safety product rather than a generic pet CRUD application.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;-privacy-amp-safety&quot;&gt;🔐 Privacy &amp;amp; Safety&lt;/h4&gt;
&lt;p&gt;Privacy was treated as a product requirement rather than an afterthought.&lt;/p&gt;
&lt;p&gt;The public QR page is intentionally limited to information that can help identify and recover the cat.&lt;/p&gt;
&lt;p&gt;Owner PII is not rendered publicly.&lt;/p&gt;
&lt;p&gt;The system also does not attempt to provide veterinary diagnosis.&lt;/p&gt;
&lt;p&gt;Cat Guardian provides informational preventive wellness guidance and does not replace professional veterinary advice.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;-current-limitations&quot;&gt;🚧 Current Limitations&lt;/h4&gt;
&lt;p&gt;Cat Guardian is a hackathon prototype.&lt;/p&gt;
&lt;p&gt;It does &lt;strong&gt;not&lt;/strong&gt; currently provide:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;real-time GPS tracking;&lt;/li&gt;
&lt;li&gt;GPS collar hardware integration;&lt;/li&gt;
&lt;li&gt;veterinary diagnosis;&lt;/li&gt;
&lt;li&gt;guaranteed pet recovery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These could be explored in future versions.&lt;/p&gt;
&lt;p&gt;For this challenge, I intentionally focused on the digital identity, QR-based rescue flow, privacy-preserving communication, and AI-assisted identification.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;-what-i-learned&quot;&gt;🎯 What I Learned&lt;/h4&gt;
&lt;p&gt;The biggest challenge wasn't building the features.&lt;/p&gt;
&lt;p&gt;It was deciding &lt;strong&gt;what not to build&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;It would have been easy to add GPS, maps, mobile applications, IoT devices, blockchain, push notifications, and many other features.&lt;/p&gt;
&lt;p&gt;But the core idea was much simpler:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;Give a cat a digital identity that can help protect, identify, and reunite them with their owner.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Everything else had to support that idea.&lt;/p&gt;
&lt;p&gt;And the project became much stronger because of that constraint.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;-built-for-seven-cats&quot;&gt;🐾 Built for seven cats&lt;/h4&gt;
&lt;p&gt;Cat Guardian started with a very personal question:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What information would I want to have if one of my cats disappeared tomorrow?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I would want their photo.&lt;/p&gt;
&lt;p&gt;Their identifying characteristics.&lt;/p&gt;
&lt;p&gt;Their health information.&lt;/p&gt;
&lt;p&gt;Their vaccination history.&lt;/p&gt;
&lt;p&gt;Their microchip information.&lt;/p&gt;
&lt;p&gt;And, most importantly:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I would want the person who found them to have a safe way to contact me.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;That's Cat Guardian.&lt;/p&gt;
&lt;p&gt;Built for:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kiara · Golia · Meias · Vaquinha · Tigrinha · Peluda · Gamora&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;🐾&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;prize-categories&quot;&gt;Prize Categories&lt;/h3&gt;
&lt;p&gt;I'm submitting Cat Guardian for:&lt;/p&gt;
&lt;h4 id=&quot;-best-use-of-google-ai&quot;&gt;🏆 Best Use of Google AI&lt;/h4&gt;
&lt;p&gt;Gemini is used meaningfully in the application for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI-assisted visual identification profiles&lt;/li&gt;
&lt;li&gt;feline characteristic analysis&lt;/li&gt;
&lt;li&gt;preventive wellness assistance&lt;/li&gt;
&lt;li&gt;localized AI-generated content&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google AI is also used as the high-risk agent in the AI-assisted engineering workflow.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;-links&quot;&gt;🔗 Links&lt;/h3&gt;
&lt;p&gt;🌐 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://cat-guardian-two.vercel.app/&quot;&gt;Live Demo&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;💻 &lt;strong&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/lfrichter/cat-guardian&quot;&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/24788/cat-guardian-protect-identify-find</guid>
<pubDate>Mon, 17 Aug 2026 15:12:42 +0000</pubDate>
</item>
<item>
<title>My First Global Hackathon: What I Learned Building Moonsu Link</title>
<link>https://coderlegion.com/21863/my-first-global-hackathon-what-i-learned-building-moonsu-link</link>
<description>&lt;p&gt;This was my first global hackathon, with 500+ participants from around the world, and although I didn’t win, I’m honestly proud of how much I learned from the experience.&lt;/p&gt;
&lt;p&gt;I worked on &lt;strong&gt;Moonsu Link&lt;/strong&gt;, a project I care about deeply. It wasn’t just about building something technical. It was about trying to solve a real problem and pushing an unfinished idea all the way into something more complete, more usable, and more meaningful.&lt;/p&gt;
&lt;p&gt;Like many hackathon projects, Moonsu Link came with its own challenges. There were moments of uncertainty, moments where the product needed more structure, and moments where it would have been easy to slow down or stop. But I kept going because I believed the idea was worth finishing.&lt;/p&gt;
&lt;h3 id=&quot;the-power-of-collaboration-amp-community&quot;&gt;The Power of Collaboration &amp;amp; Community&lt;/h3&gt;
&lt;p&gt;What made this experience special was the teamwork. Building with others, sharing ideas, dividing responsibilities, and trying to keep the momentum alive taught me a lot about collaboration. A hackathon is not just about code. It is also about communication, trust, iteration, and resilience.@alchemycodes @yvesdylane &lt;/p&gt;
&lt;p&gt;I also learned that progress matters, even when the final result is not a win. Finishing something, improving it, and learning through the process can be just as valuable as a prize.&lt;/p&gt;
&lt;p&gt;One of the things I’m happy about is that I received a badge from the DEVPost community. That recognition means a lot to me because it reflects the effort, growth, and persistence behind the project.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;key-takeaways&quot;&gt;Key Takeaways&lt;/h3&gt;
&lt;p&gt;This hackathon reminded me that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;First attempts are still valuable&lt;/strong&gt; – Every expert was once a beginner. Starting is half the battle.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Teamwork makes a huge difference&lt;/strong&gt; – Bouncing ideas off others and distributing tasks accelerates growth.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Challenges are part of the process&lt;/strong&gt; – Friction and bugs are inevitable; navigating them builds engineering maturity.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Not winning does not mean losing&lt;/strong&gt; – The knowledge and connections gained are permanent assets.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Learning and finishing count&lt;/strong&gt; – Shipping a complete product cycle is a victory in itself.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;moving-forward&quot;&gt;Moving Forward&lt;/h3&gt;
&lt;p&gt;Moonsu Link may not have taken the top prize, but it gave me something important: experience, confidence, and a stronger mindset for the next challenge. &lt;/p&gt;
&lt;p&gt;I’m grateful for the opportunity, grateful for the people I worked with, and grateful that I chose not to give up. &lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;em&gt;Have you ever participated in a global hackathon? What was your biggest takeaway from your first dev challenge? Let's connect in the comments below!&lt;/em&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21863/my-first-global-hackathon-what-i-learned-building-moonsu-link</guid>
<pubDate>Sat, 04 Jul 2026 02:55:05 +0000</pubDate>
</item>
<item>
<title>What If Your Repository Could Explain Itself?</title>
<link>https://coderlegion.com/21143/what-if-your-repository-could-explain-itself</link>
<description>&lt;p&gt;🚀 Built: GitLab Knowledge Navigator&lt;/p&gt;
&lt;p&gt;Over the last week, I've been building GitLab Knowledge Navigator for the GitLab AI Hackathon 2026.&lt;/p&gt;
&lt;p&gt;The idea started from a common developer problem:&lt;/p&gt;
&lt;p&gt;You join a project, open an issue, and suddenly need to understand years of architecture decisions, merge requests, dependencies, ownership history, and code relationships.&lt;/p&gt;
&lt;p&gt;The information exists, but it's scattered everywhere.&lt;/p&gt;
&lt;p&gt;GitLab Knowledge Navigator transforms GitLab Orbit's knowledge graph into actionable repository intelligence.&lt;/p&gt;
&lt;p&gt;Demo Video:- &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/xLBaZ2sFMEI&quot;&gt;https://youtu.be/xLBaZ2sFMEI&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;🔍 What it can do:&lt;/p&gt;
&lt;p&gt;• New Contributor Onboarding&lt;br&gt;
• Architecture Memory&lt;br&gt;
• Decision Intelligence&lt;br&gt;
• Change Impact Analysis&lt;br&gt;
• Architecture Drift Detection&lt;br&gt;
• Repository Risk Alerts&lt;br&gt;
• Executive Engineering Reports&lt;br&gt;
• Knowledge Graph Visualization&lt;br&gt;
• Repository Intelligence Scoring&lt;/p&gt;
&lt;p&gt;One of the most interesting capabilities is the ability to answer questions such as:&lt;/p&gt;
&lt;p&gt;&quot;Why does this dependency exist?&quot;&lt;/p&gt;
&lt;p&gt;Instead of giving a generic AI answer, Navigator traces real repository history through GitLab Orbit and explains when a technology was introduced, why it was added, and which merge request introduced it.&lt;/p&gt;
&lt;p&gt;🏗 Technical Highlights&lt;/p&gt;
&lt;p&gt;• GitLab Orbit API&lt;br&gt;
• Orbit Local Graph (DuckDB)&lt;br&gt;
• Gemini 2.5 Flash&lt;br&gt;
• Python&lt;br&gt;
• Knowledge Graph Traversal&lt;br&gt;
• Multi-Repository Analysis&lt;br&gt;
• Interactive HTML Dashboards&lt;/p&gt;
&lt;p&gt;The project was validated not only on its own codebase but also on a fork of GitLab Runner containing:&lt;/p&gt;
&lt;p&gt;✅ 1,366 files&lt;br&gt;
✅ 9,314 definitions&lt;br&gt;
✅ 58,340 indexed relationships&lt;/p&gt;
&lt;p&gt;One of the biggest lessons from this project was that repository intelligence requires more than an LLM. The real value comes from combining AI with structured repository knowledge and software development lifecycle context.&lt;/p&gt;
&lt;p&gt;From Code → Context → Decisions.&lt;/p&gt;
&lt;h2 id=&quot;gitlab-gitlaborbit-gitlabaihackathon-developertools-softwareengineering-ai-knowledgegraph-python-opensource-devtools-generativeai&quot;&gt;GitLab #GitLabOrbit #GitLabAIHackathon #DeveloperTools #SoftwareEngineering #AI #KnowledgeGraph #Python #OpenSource #DevTools #GenerativeAI&lt;/h2&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/21143/what-if-your-repository-could-explain-itself</guid>
<pubDate>Mon, 22 Jun 2026 13:02:34 +0000</pubDate>
</item>
<item>
<title>🏗️ CasePilot — India's AI Legal Case Worker</title>
<link>https://coderlegion.com/19963/casepilot-indias-ai-legal-case-worker</link>
<description>&lt;p&gt;Most Indians facing landlord fraud, consumer scams, or workplace violations have no idea where to start. Legal fees cost more than the dispute is worth. CasePilot changes that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt;&lt;br&gt;
Describe your legal situation in plain language → 7 AI agents investigate your case → get a ready-to-send legal notice in minutes, for free.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The stack:&lt;/strong&gt;&lt;br&gt;
→ Google ADK — 7-agent pipeline (Intake → Law Research → Evidence → Strategy → Citation → Drafting → Memory)&lt;br&gt;
→ MongoDB Atlas Vector Search — 3,310 chunks across 13 Indian laws, semantic search at 3,072 dims&lt;br&gt;
→ MongoDB MCP Server — agents query Atlas via MCP protocol&lt;br&gt;
→ Gemini 3.1 Flash-Lite — reasoning across all agents&lt;br&gt;
→ Google Cloud Run — live public API&lt;br&gt;
→ gemini-embedding-2 — document + law corpus embeddings&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What makes it different from legal chatbots:&lt;/strong&gt;&lt;br&gt;
❌ Not: &quot;Here's what Section 108 says&quot;&lt;br&gt;
✅ Yes: &quot;Your landlord violated TPA S.108. Here's a pre-filled legal notice. Send it today. File consumer complaint in 15 days if no response.&quot;&lt;/p&gt;
&lt;p&gt;Evidence uploaded → Justice Score calculated → action timeline built → case persists across sessions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://casepilot-34309631370.us-central1.run.app&quot;&gt;https://casepilot-34309631370.us-central1.run.app&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Built solo for the Google Cloud Rapid Agent Hackathon — MongoDB track.&lt;/p&gt;
&lt;p&gt;GitHub: github.com/ssurekumar01111-hue/casepilot&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19963/casepilot-indias-ai-legal-case-worker</guid>
<pubDate>Mon, 08 Jun 2026 12:16:33 +0000</pubDate>
</item>
<item>
<title>Lessons from a Kaggle Playground Competition</title>
<link>https://coderlegion.com/19891/lessons-from-a-kaggle-playground-competition</link>
<description>&lt;p&gt;Just participated in this month's Kaggle Tabular Playground challenge focused on Stellar Classification &lt;/p&gt;
&lt;p&gt;The goal was to classify astronomical objects into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STAR&lt;/li&gt;
&lt;li&gt;GALAXY&lt;/li&gt;
&lt;li&gt;QSO (Quasar)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A few interesting findings from the exploration:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Redshift turned out to be one of the strongest predictive signals.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Color indices such as &lt;code&gt;u-g&lt;/code&gt;, &lt;code&gt;g-r&lt;/code&gt;, and &lt;code&gt;r-i&lt;/code&gt; were often more informative than raw photometric measurements.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A simple ensemble of LightGBM, XGBoost, and CatBoost performed surprisingly well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Despite a moderately imbalanced dataset (~65% Galaxy, ~20% QSO, ~14% Star), explicit class weighting actually reduced validation performance in my experiments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hyperparameter tuning with Optuna did not outperform a carefully engineered baseline model, reinforcing the importance of feature engineering and domain understanding.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To document the entire process, I created a beginner-friendly guided notebook covering:&lt;/p&gt;
&lt;p&gt;• Dataset understanding&lt;br&gt;
• Exploratory analysis&lt;br&gt;
• Feature engineering&lt;br&gt;
• Categorical encoding&lt;br&gt;
• Stratified K-Fold validation&lt;br&gt;
• LightGBM, XGBoost, and CatBoost&lt;br&gt;
• Model ensembling&lt;br&gt;
• Experimentation with class imbalance and hyperparameter tuning&lt;/p&gt;
&lt;p&gt;If you're learning machine learning, working on tabular data, or interested in astronomy-related datasets, feel free to take a look.&lt;/p&gt;
&lt;p&gt;I'm also happy to discuss alternative approaches, feature engineering ideas, or leaderboard strategies. Constructive feedback and questions are always welcome.&lt;/p&gt;
&lt;p&gt;Notebook Link: &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.kaggle.com/code/rahulmish/predicting-stellar-class-beginner-friendly&quot;&gt;Click Here&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19891/lessons-from-a-kaggle-playground-competition</guid>
<pubDate>Sun, 07 Jun 2026 08:44:50 +0000</pubDate>
</item>
<item>
<title>I Built an AI-Powered Agricultural Logistics Platform for Farmers Worldwide — Here's How</title>
<link>https://coderlegion.com/19388/i-built-an-ai-powered-agricultural-logistics-platform-for-farmers-worldwide-heres-how</link>
<description>&lt;p&gt;16% of agricultural produce globally is lost every year before it reaches the buyer. Not because the crops are bad. Because the supply chain is broken.&lt;br&gt;
Farmers have no digital way to list surplus crops. Buyers can't discover what's available nearby. Drivers get no coordination layer. Everyone loses.&lt;br&gt;
I built Micro-Harvest to fix all three — at the same time — using a single AI conversation.&lt;/p&gt;
&lt;p&gt;What Is Micro-Harvest?&lt;br&gt;
Micro-Harvest is a three-sided agricultural logistics platform built for the Google Cloud Rapid Agent Hackathon 2026 (Elastic Track). It connects:&lt;/p&gt;
&lt;p&gt; Farmers (Growers) — who list surplus crops via an AI chat agent&lt;br&gt;
 Buyers (Producers) — who discover listings through smart geo-search&lt;br&gt;
 Drivers (Transporters) — who get auto-assigned hauls and handle delivery&lt;/p&gt;
&lt;p&gt;One conversation from the farmer triggers the entire chain — AI reasoning, buyer matching, driver dispatch, and Stripe payment settlement. All automated.&lt;br&gt;
 Watch the full demo: &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/0ZdplkglDBo&quot;&gt;https://youtu.be/0ZdplkglDBo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The Core Idea: One Message Does Everything&lt;br&gt;
Here's what happens when a farmer speaks or types:&lt;/p&gt;
&lt;p&gt;&quot;I have 20 macro bins of Merlot ready to go today, asking $4000 per ton&quot;&lt;/p&gt;
&lt;p&gt;Under the hood, in under 30 seconds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Gemini 3.1 Flash extracts → crop type, quantity, price, urgency&lt;/li&gt;
&lt;li&gt;AI Reasoning Engine scores → urgency level, weather risk, vehicle recommendation&lt;/li&gt;
&lt;li&gt;Elastic MCP (24 tools) → geo-matches nearest available buyer + transporter&lt;/li&gt;
&lt;li&gt;FCM push notification → driver gets haul assignment&lt;/li&gt;
&lt;li&gt;Driver completes → Gate 1 pickup + Gate 2 delivery confirmation&lt;/li&gt;
&lt;li&gt;Stripe → 80% to farmer, 15% to driver, 5% platform fee. Same day.&lt;br&gt;
No phone calls. No middlemen. No 3-day delays.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The Tech Stack-&lt;br&gt;
AI Agent - Google Agent Platform, LLM - Gemini 3.1 Flash Lite Preview, Search - Elastic MCP — 24 tools, Backend - Firebase (Firestore, Auth, Cloud Functions) Payments - Stripe, Mobile - Flutter (3 Android apps) Admin - Flutter Web&lt;/p&gt;
&lt;p&gt;The Elastic MCP server is the heart of the matching layer. It exposes 24 tools covering semantic crop search, geo-distance queries, transporter availability matching, index health monitoring, and BigQuery analytics. Every search the buyer runs fires a real geo-distance query against the listings index in real time — you can watch it in the Elastic search profiler.&lt;/p&gt;
&lt;p&gt;The Feature I'm Most Proud Of: Offline-First Listing&lt;br&gt;
Farmers often operate in areas with poor connectivity. Someone out in a field with no signal shouldn't lose their listing.&lt;br&gt;
So I built the Harvest Agent to be offline-first:&lt;/p&gt;
&lt;p&gt;Farmer speaks or types their crop details — no internet detected&lt;br&gt;
App shows an offline badge and queues the message locally&lt;br&gt;
The moment connectivity returns — listing syncs and goes live automatically&lt;br&gt;
Zero farmer action needed&lt;/p&gt;
&lt;p&gt;This was the hardest part to get right. The local queue needed to survive app restarts, handle partial sync failures, and not create duplicate listings on reconnect. It took more debugging than the entire AI integration.&lt;/p&gt;
&lt;p&gt;Three Apps, One Platform&lt;br&gt;
All three apps are built in Flutter and share the same Firebase project:&lt;br&gt;
Farmer App (Grower)&lt;/p&gt;
&lt;p&gt;Voice + text AI listing creation&lt;br&gt;
Offline message queue with auto-sync&lt;br&gt;
Real-time listing status tracking&lt;br&gt;
Earnings dashboard&lt;/p&gt;
&lt;p&gt;Buyer App (Producer)&lt;/p&gt;
&lt;p&gt;Natural language surplus search&lt;br&gt;
Geo-filtered results with radius control&lt;br&gt;
Claim and reserve listings&lt;br&gt;
Live transport tracking&lt;/p&gt;
&lt;p&gt;Driver App (Transporter)&lt;/p&gt;
&lt;p&gt;FCM haul notifications&lt;br&gt;
GPS route guidance to farm&lt;br&gt;
Gate 1 + Gate 2 photo capture&lt;br&gt;
Instant payment on delivery confirmation&lt;/p&gt;
&lt;p&gt;You can download and install all three APKs from the GitHub release and walk through the complete end-to-end flow yourself. APK links are in the Links section at the bottom.&lt;br&gt;
(Enable &quot;Install from unknown sources&quot; in Android settings first)&lt;/p&gt;
&lt;p&gt;What I'd Build Next&lt;br&gt;
A few things I want to add after the hackathon:&lt;/p&gt;
&lt;p&gt;Price intelligence — Gemini currently recommends a price band but doesn't pull live commodity market rates; integrating real-time agri pricing APIs would make this genuinely powerful&lt;br&gt;
iOS builds — currently Android only; the Flutter code is cross-platform but Apple provisioning didn't make the deadline&lt;br&gt;
Multi-language AI agent — supporting regional languages so the Harvest Agent works natively for farmers regardless of where they are in the world&lt;/p&gt;
&lt;p&gt;Links&lt;br&gt;
 Demo Video&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/0ZdplkglDBo&quot;&gt;https://youtu.be/0ZdplkglDBo&lt;/a&gt;&lt;br&gt;
 Landing Page&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://micro-harvest-landing.web.app&quot;&gt;https://micro-harvest-landing.web.app&lt;/a&gt;&lt;br&gt;
️ Admin Panel&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://micro-harvest.web.app&quot;&gt;https://micro-harvest.web.app&lt;/a&gt;&lt;br&gt;
 GitHub&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ssurekumar01111-hue/micro-harvest&quot;&gt;https://github.com/ssurekumar01111-hue/micro-harvest&lt;/a&gt;&lt;br&gt;
 Farmer APK&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/grower-release.apk&quot;&gt;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/grower-release.apk&lt;/a&gt;&lt;br&gt;
 Buyer APK&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/producer-release.apk&quot;&gt;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/producer-release.apk&lt;/a&gt;&lt;br&gt;
 Driver APK&lt;br&gt;
&lt;a rel=&quot;nofollow&quot; href=&quot;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/transporter-release.apk&quot;&gt;https://github.com/ssurekumar01111-hue/micro-harvest/releases/download/v1.0.0/transporter-release.apk&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Building this solo in Flutter + Firebase was genuinely fun — the Google Agent Platform + Elastic MCP combination is seriously powerful for this kind of multi-party matching problem. Happy to answer questions about any part of the architecture in the comments.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/19388/i-built-an-ai-powered-agricultural-logistics-platform-for-farmers-worldwide-heres-how</guid>
<pubDate>Mon, 01 Jun 2026 06:04:51 +0000</pubDate>
</item>
<item>
<title>I Stopped Fixing Bugs Myself and Built an AI to Do It Instead</title>
<link>https://coderlegion.com/16510/i-stopped-fixing-bugs-myself-and-built-an-ai-to-do-it-instead</link>
<description>&lt;p&gt;Every developer knows this pain. A bug gets filed and suddenly someone has to drop everything, read the issue, search through the codebase, figure out what broke, write a fix, add tests, open a PR and report back. It’s all manual work that takes time away from things that actually need a human brain. I kept asking myself one simple question, how much of this work can an agent handle on its own? That’s how BugFixer came about.&lt;/p&gt;
&lt;p&gt;BugFixer is an AI agent that works inside GitLab using Claude. You file a bug report, assign BugFixer to the issue and walk away. The agent reads the issue, looks through the codebase, finds the problem, writes a fix with tests, opens a merge request and comments back explaining what it did. Nothing gets merged automatically, you still review and approve. BugFixer does the work, you make the final call.&lt;/p&gt;
&lt;p&gt;In my demo, I filed a bug about passwords being stored as plain text in an authentication file. After assigning BugFixer, it found three vulnerable functions, replaced the plaintext storage with bcrypt hashing, wrote security tests and opened a merge request. It also spotted a session token vulnerability that I never mentioned. It found that on its own just by reading the code.&lt;/p&gt;
&lt;p&gt;Building this wasn’t easy. The first problem was the YAML tool configuration. The documentation wasn’t clear, and small syntax changes caused confusing errors like “tool_name is missing” or “tool_name not expected.” I had to ask in the GitLab Discord community to figure it out. The second issue was permissions. Even with a Developer role, the agent could read files but couldn’t create commits or merge requests. Early runs were triggering but producing nothing, no commits, no MRs, no comments. Fixing that took days and was the biggest challenge.&lt;/p&gt;
&lt;p&gt;Learn about Medium’s values&lt;br&gt;
What I’m most proud of is that BugFixer fixed real bugs on its own. It worked on a Python calculator, a geospatial script I was working on at work and an authentication module with multiple security issues. Every run produced real fixes, real tests and real merge requests. But the best part was the session token issue it found on its own. I never asked for that. It just read the code and noticed the problem.&lt;/p&gt;
&lt;p&gt;This project taught me how to build an AI agent from scratch on a platform I had never used before, how to write prompts that give an LLM enough context to make decisions, and how to debug using only session logs. It also showed me that building on a beta platform means hitting walls with little or no documentation. You just have to keep testing until something works.&lt;/p&gt;
&lt;p&gt;Right now, BugFixer handles one bug at a time, but real teams deal with many issues at once. The next step is to run multiple agents in parallel and prioritize bugs by severity. I also want it to leave inline comments directly in the merge request not just a summary on the issue. Long term, the goal is for BugFixer to run the pipeline after fixing a bug, check if tests pass and only then open a merge request. The tools for that already exist, so it’s close.&lt;/p&gt;
&lt;p&gt;BugFixer isn’t about replacing developers. It’s about removing repetitive work so people can focus on what really matters. If an agent can read bugs, fix code, and write tests, then maybe our time is better spent reviewing, designing, and solving harder problems.&lt;/p&gt;
&lt;p&gt;Try it out: &lt;a rel=&quot;nofollow&quot; href=&quot;https://gitlab.com/gitlab-ai-hackathon/participants/34601039&quot;&gt;GitLab&lt;/a&gt;&lt;br&gt;
YouTube: &lt;a rel=&quot;nofollow&quot; href=&quot;https://youtu.be/w-suFgVKQeE?si=LcuO2v4aGUYbjpvR&quot;&gt;BugFixer - AI Agent that fixes bugs automatically in GitLab&lt;/a&gt;&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/16510/i-stopped-fixing-bugs-myself-and-built-an-ai-to-do-it-instead</guid>
<pubDate>Sun, 03 May 2026 10:48:06 +0000</pubDate>
</item>
<item>
<title>Building Anzen: What I Learned About Token Vault the Hard Way</title>
<link>https://coderlegion.com/16508/building-anzen-what-i-learned-about-token-vault-the-hard-way</link>
<description>&lt;p&gt;When I started building Anzen for the Authorised to Act hackathon, I thought Token Vault would be the easy part. I was wrong.&lt;/p&gt;
&lt;p&gt;The concept is simple and powerful: instead of your AI agent holding OAuth tokens for GitHub, Gmail, and Slack, Auth0 holds them in a secure vault. The agent requests a scoped token when it needs one, uses it, and the token is gone. No credentials stored in your app. No breach risk. No all-or-nothing access.&lt;/p&gt;
&lt;p&gt;The implementation is where it gets interesting. The first thing I discovered is that nextjs-auth0 v4 is a completely different SDK from v3. The familiar handleAuth function is gone. The middleware file convention changed. Environment variable names changed. Even the callback URL path changed from /api/auth/callback to /auth/callback. None of this was obvious from the documentation.&lt;/p&gt;
&lt;p&gt;The second discovery was about the token exchange flow itself. Calling getAccessToken() returns an Auth0 JWT — not the GitHub or Slack token you actually need. To get the provider token, you have to make a separate POST to the token endpoint using grant_type: urn:ietf:params:oauth:grant-type:token-exchange with specific subject and requested token type parameters. This is the Token Vault exchange, and getting those parameters exactly right took significant debugging.&lt;/p&gt;
&lt;p&gt;The third discovery was Groq compatibility. Zod schemas include a $schema meta-field in their JSON output that Groq's API rejects, causing silent &quot;Failed to call a function&quot; errors. The fix was switching from Zod to jsonSchema() from the AI SDK.&lt;/p&gt;
&lt;p&gt;Despite these challenges, the architecture we ended up with is exactly what AI agents should look like: zero credentials in the app, scoped access per action, and a user who stays in control at every step. That's the promise of Token Vault, and it's worth the difficulty of getting there.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/16508/building-anzen-what-i-learned-about-token-vault-the-hard-way</guid>
<pubDate>Sun, 03 May 2026 10:47:33 +0000</pubDate>
</item>
<item>
<title>How Backboard.io Transformed My Multi-Agent AI System</title>
<link>https://coderlegion.com/14786/how-backboard-io-transformed-my-multi-agent-ai-system</link>
<description>&lt;p&gt;I built &lt;strong&gt;Londoolink AI&lt;/strong&gt; to help users stay on top of their day by generating personalized briefings from emails, calendar events, Notion pages, and social media.&lt;/p&gt;
&lt;p&gt;It worked well and pulled together useful insights, but it had one major flaw.&lt;/p&gt;
&lt;p&gt;It forgot everything.&lt;/p&gt;
&lt;p&gt;Every time a user came back, it was like starting over. Preferences were lost, conversations had no context, and the experience felt repetitive. The system was smart, but it didn’t feel intelligent.&lt;/p&gt;
&lt;p&gt;That changed when I integrated &lt;strong&gt;Backboard.io&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;You can view the project here: &lt;a rel=&quot;nofollow&quot; href=&quot;https://londoolink-ai.vercel.app/&quot;&gt;https://londoolink-ai.vercel.app/&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;1-the-problem-no-memory&quot;&gt;1. The Problem: No Memory&lt;/h3&gt;
&lt;p&gt;Before the integration, users had to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Repeat their preferences every day&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Re-explain what mattered to them&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ask the same follow-up questions again&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even though the system could analyze data well, it didn’t learn from users over time.&lt;/p&gt;
&lt;h3 id=&quot;2-the-shift-to-a-stateful-system&quot;&gt;2. The Shift to a Stateful System&lt;/h3&gt;
&lt;p&gt;I first came across &lt;a rel=&quot;nofollow&quot; href=&quot;http://Backboard.io&quot;&gt;&lt;strong&gt;Backboard.io&lt;/strong&gt;&lt;/a&gt; &lt;strong&gt;through an email&lt;/strong&gt; after submitting my project to an &lt;strong&gt;Auth0 Hackathon on Devpost&lt;/strong&gt;. The team had reached out, sharing more about the platform and how it enables AI systems to become stateful through persistent memory, threads, and tool-calling.&lt;/p&gt;
&lt;p&gt;That sparked my curiosity, so I explored it further during &lt;strong&gt;MLH Global Hack Week: API&lt;/strong&gt;, where I got to understand more about how it actually works in practice.&lt;/p&gt;
&lt;p&gt;What stood out was simple but powerful:&lt;/p&gt;
&lt;p&gt;Instead of building memory from scratch, Backboard provides it out of the box.&lt;/p&gt;
&lt;hr&gt;
&lt;h3 id=&quot;3-what-changed&quot;&gt;3. What Changed&lt;/h3&gt;
&lt;h4 id=&quot;persistent-memory&quot;&gt;&lt;em&gt;Persistent Memory&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Now, users can store preferences like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Preferring meetings in the morning&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Prioritizing certain emails&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And the system remembers them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here’s a simplified version of how I store preferences:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This function saves a new piece of memory (like a user preference) for a specific assistant using Backboard’s API.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;class BackboardService:
    def add_memory(self, assistant_id, content):
        response = requests.post(
            f&quot;{self.base_url}/assistants/{assistant_id}/memories&quot;,
            headers=self.headers,
            json={&quot;content&quot;: content}
        )
        return response.json()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Retrieving preferences:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This function searches stored memories and returns anything related to user preferences so the assistant can personalize responses.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def get_preferences(self, assistant_id):
    response = requests.post(
        f&quot;{self.base_url}/assistants/{assistant_id}/memories/search&quot;,
        headers=self.headers,
        json={&quot;query&quot;: &quot;user preferences&quot;}
    )
    return response.json().get(&quot;memories&quot;, [])
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 id=&quot;better-document-retrieval&quot;&gt;&lt;em&gt;Better Document Retrieval&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;I moved from a local setup to a cloud-based system.&lt;/p&gt;
&lt;p&gt;This function uploads documents (like notes or data sources) to the cloud so they can be retrieved and used by the AI system later.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_document(self, content, metadata):
    return requests.post(
        f&quot;{self.base_url}/documents&quot;,
        headers=self.headers,
        json={
            &quot;content&quot;: content,
            &quot;metadata&quot;: metadata
        }
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;This improved both scalability and search quality.&lt;/p&gt;
&lt;h4 id=&quot;threaded-conversations&quot;&gt;&lt;em&gt;Threaded Conversations&lt;/em&gt;&lt;/h4&gt;
&lt;p&gt;Now users can ask follow-up questions with full context.&lt;/p&gt;
&lt;p&gt;This function creates a conversation thread tied to a specific user so all messages stay connected.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def create_thread(self, user_id):
    response = requests.post(
        f&quot;{self.base_url}/threads&quot;,
        headers=self.headers,
        json={&quot;metadata&quot;: {&quot;user_id&quot;: user_id}}
    )
    return response.json()[&quot;thread_id&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Adding messages to a thread:&lt;/p&gt;
&lt;p&gt;This appends a new message (from a user or an assistant) to an existing conversation thread to maintain context.&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def add_message(self, thread_id, role, content):
    requests.post(
        f&quot;{self.base_url}/threads/{thread_id}/messages&quot;,
        headers=self.headers,
        json={&quot;role&quot;: role, &quot;content&quot;: content}
    )
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;4-how-it-all-comes-together&quot;&gt;4. How It All Comes Together&lt;/h3&gt;
&lt;p&gt;In my main agent:&lt;/p&gt;
&lt;p&gt;This is the full flow:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Get or create an assistant&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fetch stored user preferences&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate a personalized briefing&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a conversation thread for follow-ups&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;def create_briefing(self, user_id):
    assistant_id = self.get_or_create_assistant(user_id)

    preferences = self.get_preferences(assistant_id)

    briefing = self.generate_briefing(
        data_sources,
        user_preferences=preferences
    )

    thread_id = self.create_thread(user_id)

    return {
        &quot;briefing&quot;: briefing,
        &quot;thread_id&quot;: thread_id
    }
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 id=&quot;5-challenges-along-the-way&quot;&gt;5. Challenges Along the Way&lt;/h3&gt;
&lt;p&gt;One issue I ran into was handling API responses.&lt;/p&gt;
&lt;p&gt;The API sometimes returned &lt;strong&gt;201 instead of 200&lt;/strong&gt;, so I updated my handler:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;if response.status_code in (200, 201):
    return response.json()
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;I also had to handle endpoint inconsistencies like &lt;code&gt;/memory&lt;/code&gt; vs &lt;code&gt;/memories&lt;/code&gt;, and made response parsing more flexible.&lt;/p&gt;
&lt;h3 id=&quot;6-the-impact&quot;&gt;6. The Impact&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;&lt;th&gt;Before Backboard &lt;/th&gt;&lt;th&gt;After Backboard&lt;/th&gt;&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;No memory &lt;/td&gt;&lt;td&gt;Remembers user preferences&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Generic outputs &lt;/td&gt;&lt;td&gt;Personalized results&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;No conversation continuity &lt;/td&gt;&lt;td&gt;Context-aware conversations&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&quot;7-key-takeaways&quot;&gt;7. Key Takeaways&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Memory makes AI feel like an assistant, not just a tool&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A simple service layer keeps integrations clean&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Small API details matter more than you think&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;8-shoutout&quot;&gt;8. Shoutout&lt;/h3&gt;
&lt;p&gt;I learned more about &lt;strong&gt;Backboard.io&lt;/strong&gt; during the ongoing &lt;strong&gt;MLH Global Hack Week: API Week 2026&lt;/strong&gt;, a week-long online hackathon by &lt;strong&gt;Major League Hacking (MLH)&lt;/strong&gt; focused on APIs, building, and learning through live sessions and community challenges.&lt;/p&gt;
&lt;p&gt;Big shoutout to the MLH community and organizers for creating an environment where developers can explore tools like this while building real-world projects and learning by doing.&lt;/p&gt;
&lt;h3 id=&quot;9-final-thoughts&quot;&gt;9. Final Thoughts&lt;/h3&gt;
&lt;p&gt;This integration changed my system from something that generates results into something that understands users over time.&lt;/p&gt;
&lt;p&gt;If you’re building AI applications, adding memory is one of the most impactful upgrades you can make.&lt;/p&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/14786/how-backboard-io-transformed-my-multi-agent-ai-system</guid>
<pubDate>Tue, 14 Apr 2026 12:56:36 +0000</pubDate>
</item>
<item>
<title>Hackathon Highlights: Building and Livestreaming an AI Travel Agent</title>
<link>https://coderlegion.com/9606/hackathon-highlights-building-and-livestreaming-an-ai-travel-agent</link>
<description>&lt;h5 id=&quot;in-this-week-s-article-we-dive-into-a-sponsored-hackathon-where-we-build-an-ai-powered-travel-agent-app-competing-collaborating-livestreaming-and-more-follow-along-to-learn-real-world-dev-skills-&quot;&gt;In this week's article, we dive into a sponsored hackathon where we build an AI-powered travel agent app—competing, collaborating, livestreaming, and more! Follow along to learn real-world dev skills!&lt;/h5&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/posts/2026/01-26/img/01-12-26/TN-TXG-151.png?raw=true&quot; alt=&quot;TN-TXG-151&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;hackathon-ai-agent-challenge&quot;&gt;Hackathon AI Agent Challenge&lt;/h4&gt;
&lt;p&gt;To kick off 2026 and continue my self-taught developer journey, I’m once again joining Shashi Lo’s Gridiron Survivor team—an apprenticeship program that gives devs hands-on, pro-level experience. This time, we're taking on a hackathon challenge to build an AI agent!&lt;/p&gt;
&lt;p&gt;The hackathon features two rival teams competing to develop an AI-powered travel agent app, sponsored by GitKraken, Frontend Mentor, and Zephyr Cloud. Up for grabs: a $1000 cash prize, one-year free memberships, and plenty of swag! This hackathon is underway now and will continue into February (and may extend if additional time is needed).  &lt;/p&gt;
&lt;p&gt;While it’s a contest, the real win for everyone is the shared learning experience, the sense of team camaraderie, and—my favorite—the chance to keep building an online presence.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;On a personal note, I’m especially excited for this hackathon because my nephew&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/david-terzano-b15657329?utm_source=share&amp;amp;utm_campaign=share_via&amp;amp;utm_content=profile&amp;amp;utm_medium=ios_app&quot;&gt;&lt;em&gt;David Terzano&lt;/em&gt;&lt;/a&gt;&lt;em&gt;—fresh out of college with a degree in computer science and a passion for game development—is joining my team! This event gives&lt;/em&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/david-terzano-b15657329?utm_source=share&amp;amp;utm_campaign=share_via&amp;amp;utm_content=profile&amp;amp;utm_medium=ios_app&quot;&gt;&lt;em&gt;David&lt;/em&gt;&lt;/a&gt; &lt;em&gt;and all participants real-world team experience to help close the gap that new devs face when seeking their first roles. I can’t wait to see him jump in, learn with us, and bring fresh ideas to the project!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;ai-agent-travel-agent&quot;&gt;AI Agent, Travel Agent&lt;/h4&gt;
&lt;p&gt;The challenge is to build a travel agent app powered by a specialized AI agent that serves as the core of our hackathon project. A successful AI travel agent should efficiently integrate with multiple APIs to provide accurate travel information, automatically suggest itineraries, and personalize travel plans based on user preferences. Our desired outcome includes robust handling of user queries and consistent performance under various use-case scenarios.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed:&lt;/strong&gt; Each team chooses its own tech stack, which enables efficient development and performance optimization to meet specific project demands.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Flexibility&lt;/strong&gt;: Micro front-end architecture enables modular development, making it easier to update sections of the app independently.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integration:&lt;/strong&gt; API integrations are key to the app pulling real-time travel data and resources, ensuring accurate, timely information.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Intelligence:&lt;/strong&gt; Custom AI models are used to analyze user data and preferences, providing personalized travel suggestions and enhancing the user’s experience.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;These features and more highlight the complexity and potential of our AI travel agent app!&lt;/em&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;iframe width=&quot;1090&quot; height=&quot;613&quot; src=&quot;https://www.youtube.com/embed/2EaYzossu7s&quot;&gt;&lt;/iframe&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;livestream-presentations&quot;&gt;Livestream Presentations&lt;/h4&gt;
&lt;p&gt;To truly level up like the pros, team members will be hosting live presentations. Taking the floor to present, demo, and field questions is a valuable skill in itself, especially when navigating inevitable technical difficulties.&lt;/p&gt;
&lt;p&gt;As a first step to engage with our journey, subscribe to the &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.youtube.com/@codingwithshashi&quot;&gt;Coding with Shashi&lt;/a&gt; YouTube channel and turn on notifications to stay updated on all events. This ensures you won't miss any opportunities to follow along, ask questions, and provide feedback live.&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;sharing-our-learnings&quot;&gt;Sharing Our Learnings&lt;/h4&gt;
&lt;p&gt;In upcoming articles, I’ll take you behind the scenes of this hackathon, sharing our process, challenges, and key takeaways. You’ll be able to follow our journey step by step—from the initial setup and development to our results and lessons learned. Beyond building an AI agent, there’s a lot happening under the hood, and I can’t wait to cover it all!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/Sponsors-GIS-2026.png?raw=true&quot; alt=&quot;Sponsors-GIS-2026&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;gridiron-survivor-sponsors&quot;&gt;&lt;strong&gt;Gridiron Survivor Sponsors&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;A very special thanks to our sponsors!&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.gitkraken.com/&quot;&gt;GitKraken&lt;/a&gt;: &lt;em&gt;A popular Git client that provides a graphical interface to manage Git repositories. It is known for its user-friendly design and features that simplify version control, making it easier for developers to collaborate and manage their code.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.frontendmentor.io/&quot;&gt;Frontend Mentor&lt;/a&gt;: &lt;em&gt;An online platform that offers front-end coding challenges. It helps developers improve their skills by providing real-world projects to work on and a supportive community for feedback and learning.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://zephyr-cloud.io/&quot;&gt;Zephyr Cloud&lt;/a&gt;: &lt;em&gt;A Module Federation platform that accelerates micro-frontend development by providing instant deployment, intelligent dependency resolution, and seamless version management—all while remaining cloud agnostic, framework agnostic, and bundler agnostic.&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h4 id=&quot;my-other-related-articles&quot;&gt;My Other Related Articles&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/blog-posts/bridging-the-skills-gap-empowering-junior-developers-through-apprenticeship-programs&quot;&gt;Bridging the Skills Gap: Empowering Junior Developers Through Apprenticeship Programs&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/04-25/gridiron-survivor's-elfgorithm-introduction-and-team-installation/&quot;&gt;Gridiron Survivor's Elfgorithm: Introduction and Team Installation&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/05-25/software-versioning-a-developers-guide-to-semantic-and-github-releases/&quot;&gt;Software Versioning: A Developer's Guide to Semantic and GitHub Releases&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/05-25/creating-cohesive-design-systems-with-atomic-design-principles/&quot;&gt;Creating Cohesive Design Systems with Atomic Design Principles&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/10-25/sprint-workflow-a-beginners-guide-to-agile-development/&quot;&gt;Sprint Workflow: A Beginner's Guide to Agile Development&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/HTML-ATT.png?raw=true&quot; alt=&quot;HTML-ATT&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;be-sure-to-listen-to-the-html-all-the-things-podcast-&quot;&gt;&lt;strong&gt;Be sure to listen to the HTML All The Things Podcast!&lt;/strong&gt;&lt;/h4&gt;
&lt;h5 id=&quot;i-also-write-articles-for-the-html-all-the-things-podcast-which-you-can-read-on-their-website-https-www-htmlallthethings-com-&quot;&gt;&lt;strong&gt;&lt;em&gt;I also write articles for the HTML All The Things Podcast, which you can read on their website:&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.htmlallthethings.com/&quot;&gt;&lt;strong&gt;https://www.htmlallthethings.com/&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/h5&gt;
&lt;h5 id=&quot;be-sure-to-check-out-html-all-the-things-on-socials-&quot;&gt;&lt;strong&gt;Be sure to check out HTML All The Things on socials!&lt;/strong&gt;&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/htmleverything&quot;&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/company/html-all-the-things/&quot;&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.tiktok.com/@htmlallthethings&quot;&gt;TikTok&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://www.instagram.com/htmlallthethings/&quot;&gt;Instagram&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/torc_ambassador-ML.png?raw=true&quot; alt=&quot;Torc&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;I’m excited to announce that I’m now a Torc Ambassador! As part of this global community, I’ll be sharing valuable insights from Torc’s virtual events, lessons from my own tech journey, and real-world perspectives on how teams are hiring and working today. I’ll be active in the Torc community through posts, events, Q&amp;amp;A sessions, and more—so stay tuned for updates and opportunities to connect. Whether you’re looking to advance your tech career or simply stay informed, I hope the insights I share will support and inspire you on your journey!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Torc is an AI-powered platform and vibrant global network that connects skilled professionals with top opportunities and forward-thinking companies. If you’re interested in joining, you can create a free profile using my referral link&lt;/em&gt;: &lt;a rel=&quot;nofollow&quot; href=&quot;https://platform.torc.dev/#/r/b5QZ7k5h/cp&quot;&gt;https://platform.torc.dev/#/r/b5QZ7k5h/cp&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id=&quot;affiliate-amp-discount-links-&quot;&gt;Affiliate &amp;amp; Discount Links!&lt;/h4&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/CodeMonkey-TryForFree.jpeg?raw=true&quot; alt=&quot;CodeMonkey&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;With CodeMonkey, learning can be all fun and games!&lt;/strong&gt; CodeMonkey transforms education into an engaging experience, enabling children to evolve from tech consumers to creators. Use CodeMonkey's &lt;strong&gt;FREE trial&lt;/strong&gt; to unlock the incredible potential of young tech creators!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;With a structured learning path tailored for various age groups, kids progress from block coding to more advanced topics like data science and artificial intelligence, using languages such as CoffeeScript and Python. The platform includes features for parents and teachers to track progress, making integrating coding into home and classroom settings easy.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Through fun games, hands-on projects, and community interaction, CodeMonkey helps young learners build teamwork skills and receive recognition for their achievements. It fosters a love for coding and prepares children for future career opportunities in an ever-evolving tech landscape.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;To learn more about CodeMonkey, you can read my detailed&lt;/em&gt;&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2025/02-25/inspiring-young-coders-how-codemonkey-turns-kids-into-tech-creators/&quot;&gt;review article&lt;/a&gt;&lt;strong&gt;&lt;em&gt;!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Affiliate Links:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919057/12259&quot;&gt;Sign Up for Parents&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a rel=&quot;nofollow&quot; href=&quot;https://codemonkey.sjv.io/c/5987452/919060/12259&quot;&gt;Sign Up for Teachers&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/Scrimba_Banner.png?raw=true&quot; alt=&quot;Scrimba_Banner&quot;&gt;&lt;/p&gt;
&lt;h4 id=&quot;advance-your-career-with-a-20-discount-on-scrimba-pro-using-this-affiliate-link-&quot;&gt;Advance your career with a 20% discount on Scrimba Pro using this &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;affiliate link&lt;/a&gt;!&lt;/h4&gt;
&lt;p&gt;Become a hireable developer with Scrimba Pro! Discover a world of coding knowledge with full access to all courses, hands-on projects, and a vibrant community. You can &lt;a rel=&quot;nofollow&quot; href=&quot;https://selftaughttxg.com/2021/06-21/06-07-21/&quot;&gt;read my article&lt;/a&gt; to learn more about my exceptional experiences with Scrimba and how it helps many become confident, well-prepared web developers!&lt;/p&gt;
&lt;h6 id=&quot;important-this-discount-is-for-new-accounts-only-if-a-higher-discount-is-currently-available-it-will-be-applied-automatically-&quot;&gt;&lt;strong&gt;&lt;em&gt;Important:&lt;/em&gt; &lt;em&gt;This discount is for new accounts only. If a higher discount is currently available, it will be applied automatically.&lt;/em&gt;&lt;/strong&gt;&lt;/h6&gt;
&lt;p&gt;&lt;strong&gt;How to Claim Your Discount:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click &lt;a rel=&quot;nofollow&quot; href=&quot;https://scrimba.com/?via=MichaelLarocca&quot;&gt;the link&lt;/a&gt; to explore the new Scrimba 2.0.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Upgrade to Pro; the 20% discount will automatically apply.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h6 id=&quot;disclosure-this-article-contains-affiliate-links-i-will-earn-a-commission-from-any-purchases-made-through-these-links-at-no-extra-cost-to-you-your-support-helps-me-continue-creating-valuable-content-thank-you-&quot;&gt;&lt;strong&gt;&lt;em&gt;Disclosure:&lt;/em&gt; &lt;em&gt;This article contains affiliate links. I will earn a commission from any purchases made through these links at no extra cost to you. Your support helps me continue creating valuable content. Thank you!&lt;/em&gt;&lt;/strong&gt;&lt;/h6&gt;
&lt;hr&gt;
&lt;h4 id=&quot;conclusion&quot;&gt;Conclusion&lt;/h4&gt;
&lt;p&gt;A hackathon is a fantastic way to learn web development and build real team experience. This challenge lets us work with cutting-edge technologies and showcase how an AI agent is built from the ground up. Whether you’re a participant or following along, you’ll see how competition, collaboration, and livestreaming all come together—plus pick up valuable, in-demand skills!&lt;/p&gt;
&lt;p&gt;We’ll take you behind the scenes as we choose our tech stack, tackle real-world problems, and share the tools and approaches we use. Watch our livestreams to see the action unfold, and join the conversation to connect, ask questions, and get involved. You’ll find inspiration, insights, and practical tips for your own projects.&lt;/p&gt;
&lt;p&gt;Curious how it all comes together in real time? Follow our journey for updates, lessons learned, and strategies you can put to use in your own projects—so you gain real value as we build and learn together!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;&lt;strong&gt;Let’s connect! I’m active on&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://www.linkedin.com/in/michaeljudelarocca/&quot;&gt;LinkedIn&lt;/a&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;a rel=&quot;nofollow&quot; href=&quot;https://twitter.com/MikeJudeLarocca&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://github.com/MichaelLarocca/blog-michael-jude-larocca/blob/main/src/images/Logo-White-Slogan.jpg?raw=true&quot; alt=&quot;Logo-White-Slogan&quot;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h6 id=&quot;are-you-excited-to-follow-our-hackathon-journey-and-learn-how-to-build-an-ai-agent-do-you-have-your-own-tips-or-stories-from-hackathons-please-share-the-article-and-comment-&quot;&gt;&lt;em&gt;Are you excited to follow our hackathon journey and learn how to build an AI agent? Do you have your own tips or stories from hackathons? Please share the article and comment!&lt;/em&gt;&lt;/h6&gt;
&lt;hr&gt;
</description>
<category>Articles</category>
<guid isPermaLink="true">https://coderlegion.com/9606/hackathon-highlights-building-and-livestreaming-an-ai-travel-agent</guid>
<pubDate>Mon, 12 Jan 2026 19:38:02 +0000</pubDate>
</item>
</channel>
</rss>