<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shakiran Nannyombi</title>
    <description>The latest articles on DEV Community by Shakiran Nannyombi (@shakiran_nannyombi_b0bf41).</description>
    <link>https://dev.to/shakiran_nannyombi_b0bf41</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2877088%2F0ce2d56e-1da7-4984-8208-a8e49bdba656.jpg</url>
      <title>DEV Community: Shakiran Nannyombi</title>
      <link>https://dev.to/shakiran_nannyombi_b0bf41</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shakiran_nannyombi_b0bf41"/>
    <language>en</language>
    <item>
      <title>What I learned building a real talent funnel from SRS and Figma to QA, handover, and closing without a perfect ending.</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Tue, 04 Aug 2026 10:34:20 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/what-i-learned-building-a-real-talent-funnel-from-srs-and-figma-to-qa-handover-and-closing-35bf</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/what-i-learned-building-a-real-talent-funnel-from-srs-and-figma-to-qa-handover-and-closing-35bf</guid>
      <description>&lt;p&gt;Hey everyone,&lt;/p&gt;

&lt;p&gt;If you followed my weekly Hashnode series, you already know the short version: eight weeks, one real product, a lot of shipping, and a quieter finale than I expected.&lt;/p&gt;

&lt;p&gt;This post is the longer reflection on the whole arc in one place.&lt;/p&gt;

&lt;p&gt;Series link: &lt;a href="https://shakiran.hashnode.dev/series/my-software-engineering-internship" rel="noopener noreferrer"&gt;My Software Engineering Internship Journey&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it started
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 1&lt;/strong&gt; did not feel like “writing production code on day one.” It felt like orientation into a different kind of seriousness.&lt;/p&gt;

&lt;p&gt;We were not building toys. We were joining a live talent funnel product, the &lt;strong&gt;Talent Funnel&lt;/strong&gt;, where candidates move through discovery, onboarding, assessments, and interviews, while admins need tools they can trust.&lt;/p&gt;

&lt;p&gt;Before the flashy UI work, there was the quieter foundation work: requirements, diagrams, architecture conversations, and learning how classroom theory behaves once real stakeholders and real timelines enter the room.&lt;/p&gt;

&lt;p&gt;That first week taught me something I kept rediscovering: industry work is less about knowing everything, and more about becoming useful quickly without breaking what already exists.&lt;/p&gt;

&lt;h2&gt;
  
  
  The middle: building for real users
&lt;/h2&gt;

&lt;p&gt;Across the middle weeks, the work widened fast.&lt;/p&gt;

&lt;p&gt;We moved through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;requirements and data architecture&lt;/li&gt;
&lt;li&gt;monorepo structure and type-safe environments&lt;/li&gt;
&lt;li&gt;custom auth and onboarding flows&lt;/li&gt;
&lt;li&gt;candidate home hubs, assessment surfaces, and UI states&lt;/li&gt;
&lt;li&gt;landing pages, hierarchy polish, and painful but necessary rework&lt;/li&gt;
&lt;li&gt;admin portals, route hardening, and access control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some weeks felt like invention. Others felt like correction.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Week 5&lt;/strong&gt; especially stuck with me: being right about a UI direction did not always protect the work from being redone. Branch overlap, merge calls, and scope cleanup taught me more than the feature itself. That was uncomfortable. It was also one of the most useful lessons of the internship.&lt;/p&gt;

&lt;p&gt;By &lt;strong&gt;Weeks 6 and 7,&lt;/strong&gt; the focus shifted again from “can we build this?” to “can this survive without scaffolding?” We migrated out of temporary paths, cleaned legacy naming, unified branding, hardened staff access, improved analytics and candidate summaries, and started thinking about handover as part of engineering, not as an afterthought.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the work actually looked like
&lt;/h2&gt;

&lt;p&gt;If I had to name the through-line of my internship, it would be consistency.&lt;/p&gt;

&lt;p&gt;Not just visual consistency. Product consistency.&lt;/p&gt;

&lt;p&gt;Making routes make sense. Making emails point to real places. Making settings and permissions match how staff actually work. Making responsive layouts behave on phones, not only on laptops. Making localization expose every missing string before a user does. Shipping in related batches instead of one giant pile that nobody can review.&lt;/p&gt;

&lt;p&gt;Those details do not always look impressive in a weekly update. They are what make a product feel intentional.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it ended
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Week 8&lt;/strong&gt; was the finale: QA, test documentation, and project handover.&lt;/p&gt;

&lt;p&gt;As a team, we closed the project. We did not get full client feedback before we wrapped. That is the honest part. Timelines move. Stakeholders are busy. Final reviews do not always land when you hope they will.&lt;/p&gt;

&lt;p&gt;Even so, we know they appreciated the work. That appreciation showed up in the collaboration, the trust, and the way the product kept moving forward with us. A long written review would have been nice. Knowing the work mattered still counts.&lt;/p&gt;

&lt;p&gt;Closing without a cinematic ending taught me something I did not expect to learn so clearly:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Finishing well is not the same as finishing loudly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Sometimes a good ending looks like regression checks, documented test cases, known issues written down honestly, and a handover package that lets the next engineers continue without reconstructing the story from commit messages alone.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take with me
&lt;/h2&gt;

&lt;p&gt;I leave with more than a portfolio of screens.&lt;/p&gt;

&lt;p&gt;I leave with better instincts around:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;shipping in related batches&lt;/li&gt;
&lt;li&gt;treating documentation as part of delivery&lt;/li&gt;
&lt;li&gt;seeing responsive UI, localization, and access control as product integrity, not polish&lt;/li&gt;
&lt;li&gt;treating merge conflicts, CI surprises, and overlapping branches as the work itself&lt;/li&gt;
&lt;li&gt;measuring progress not only by what I can build, but by whether someone else can continue after me&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Somewhere between Week 1 and Week 8, I stopped thinking of an internship as a sequence of tasks. I started seeing it as practice in becoming leaveable, leaving systems, decisions, and context in a state where the team can keep going.&lt;/p&gt;

&lt;h2&gt;
  
  
  If you are starting your own internship
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A few things I would tell my Week 1 self:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ask for context early. Why a decision exists matters as much as how to implement it.&lt;/li&gt;
&lt;li&gt;Expect rework. Being right once does not freeze the product forever.&lt;/li&gt;
&lt;li&gt;Write things down while they are still fresh. Future you and future teammates need that.&lt;/li&gt;
&lt;li&gt;Care about the unglamorous paths: empty states, mobile, permissions,
broken links.&lt;/li&gt;
&lt;li&gt;Learn to close. Shipping is not only starting features. It is also QA, honesty about risk, and handover.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;Internships end. Products keep going.&lt;/p&gt;

&lt;p&gt;I am proud of what we built, proud of how we closed, and grateful for the team, mentors, and trust that made the experience real.&lt;/p&gt;

&lt;p&gt;If you want the week-by-week story, start here:&lt;br&gt;
&lt;a href="https://shakiran.hashnode.dev/series/my-software-engineering-internship" rel="noopener noreferrer"&gt;My Software Engineering Internship Journey&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks for reading.&lt;/p&gt;

</description>
      <category>softwareengineering</category>
      <category>frontend</category>
      <category>career</category>
      <category>internship</category>
    </item>
    <item>
      <title>From Idea to Production: Building a Spider-Man Tic-Tac-Toe Game with Kiro</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Thu, 30 Jul 2026 06:31:50 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/from-idea-to-production-building-a-spider-man-tic-tac-toe-game-with-kiro-2iej</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/from-idea-to-production-building-a-spider-man-tic-tac-toe-game-with-kiro-2iej</guid>
      <description>&lt;p&gt;AI coding tools are changing how we build software, but I wanted to explore what it looks like to use AI as part of the &lt;strong&gt;software engineering process&lt;/strong&gt;, not just for generating code.&lt;/p&gt;

&lt;p&gt;In my latest article, I walk through building a &lt;strong&gt;Tic-Tac-Toe game with Kiro&lt;/strong&gt;, covering:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Spec-Driven Development&lt;/li&gt;
&lt;li&gt;Steering&lt;/li&gt;
&lt;li&gt;Hooks&lt;/li&gt;
&lt;li&gt;Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;Building the application step by step&lt;/li&gt;
&lt;li&gt;Lessons learned from using Kiro in a live student workshop&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I also share some honest reflections on the experience and a few areas where I think Kiro can continue to improve.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Read the article here:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://shakiran.hashnode.dev/building-tic-tac-toe-game-with-kiro" rel="noopener noreferrer"&gt;https://shakiran.hashnode.dev/building-tic-tac-toe-game-with-kiro&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts! Have you tried Kiro or another AI-powered IDE? What has your experience been like?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>softwareengineering</category>
      <category>documentation</category>
    </item>
    <item>
      <title>7 Weeks, 0 Sandboxes, and a Lot of Code</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Mon, 27 Jul 2026 08:13:29 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/7-weeks-0-sandboxes-and-a-lot-of-code-55j0</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/7-weeks-0-sandboxes-and-a-lot-of-code-55j0</guid>
      <description>&lt;h2&gt;
  
  
  Lessons From My Software Engineering Internship
&lt;/h2&gt;




&lt;p&gt;When I started my software engineering internship, I thought most of my time would be spent writing straightforward UI components and fixing minor CSS bugs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I was wrong.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Over the last 7 weeks, I went from breaking down raw Software Requirements Specifications (SRS) to building custom authentication gates, hardening production routes, refactoring monorepo architectures, and managing localized multi-language state persistence.&lt;/p&gt;

&lt;p&gt;If you’re currently a student, a self-taught dev preparing for your first role, or just love reading about real-world engineering trade-offs, here are the biggest lessons I learned on the front lines—and why writing clean handovers matters just as much as writing clean code.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. "Working Code" Isn't Always "Good Code"
&lt;/h2&gt;

&lt;p&gt;In school or side projects, once the feature works on &lt;code&gt;localhost:3000&lt;/code&gt;, you ship it and call it a day. In production, that’s where the real work begins.&lt;/p&gt;

&lt;p&gt;During &lt;strong&gt;Week 5&lt;/strong&gt;, I built a functional feature that met every technical specification. But after a merge call and design review, we realized the user hierarchy was cluttered and lacked clear ownership boundaries. I had to tear down hours of working UI to rebuild a streamlined, single-contrast CTA layout.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Lesson:&lt;/strong&gt; Being technically right doesn't mean you're done. Engineering is about clarity, subtraction, and user flow—not just passing tests.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  2. Moving Out of the Sandbox (Role-Based Access &amp;amp; Route Guards)
&lt;/h2&gt;

&lt;p&gt;Moving code from a temporary &lt;code&gt;/v2&lt;/code&gt; sandbox folder into &lt;code&gt;/admin&lt;/code&gt; primary route directories requires serious security considerations. You can't just hide a button with &lt;code&gt;display: none&lt;/code&gt; and assume candidates won't find staff-only portals.&lt;/p&gt;

&lt;p&gt;Using tools like &lt;strong&gt;Clerk Auth&lt;/strong&gt;, I implemented strict Staff Access Route Guards to separate identity pools. Candidate roles attempting to access internal management paths hit instant, secure access-denied barriers.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. State Persistence is Harder Than It Looks
&lt;/h2&gt;

&lt;p&gt;We started by storing quick form inputs in browser &lt;code&gt;localStorage&lt;/code&gt;. It worked great for local testing, but scaling an admin console requires converting client-side drafts into live database synchronization.&lt;/p&gt;

&lt;p&gt;Handling state transitions, preventing data loss during multi-step onboarding forms, and ensuring seamless API roundtrips taught me more about frontend data flow than any textbook ever could.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Power of Clean Handover Architectures
&lt;/h2&gt;

&lt;p&gt;As my internship reached its final week, the focus shifted from building shiny new features to &lt;strong&gt;stabilization and documentation&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Purging Technical Debt:&lt;/strong&gt; Tracked down legacy file references, standardized component folders, and unified global design packages.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cleaning Git History:&lt;/strong&gt; Grouped commits into modular, scoped batches and configured strictly enforced &lt;code&gt;.gitignore&lt;/code&gt; parameters (e.g., locking down &lt;code&gt;uidemo/*&lt;/code&gt; mock folders).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documenting Edge Cases:&lt;/strong&gt; Cataloged setup sequences, API contracts, and known failure modes so the next developer could take over without missing a beat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Writing clean documentation gives your team absolute clarity and proves you operate with a senior engineering mindset.&lt;/p&gt;




&lt;h2&gt;
  
  
  Follow the Full Week-by-Week Breakdown!
&lt;/h2&gt;

&lt;p&gt;I’ve been documenting every single week of this journey—complete with technical diagrams, system architecture decisions, Figma workflows, and honest reflections on my personal blog.&lt;/p&gt;

&lt;p&gt;If you want to read the deep dives, check out the full series here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://shakiran.hashnode.dev/series/my-software-engineering-internship" rel="noopener noreferrer"&gt;My Software Engineering Internship Journey on Hashnode&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's a quick peek at what's inside the series:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Week 1:&lt;/strong&gt; Surviving Week 1: Classroom Theory to Real-World SRS &amp;amp; Use Cases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 2:&lt;/strong&gt; Data Architecture &amp;amp; Translating Requirements into Figma Design Systems&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 3:&lt;/strong&gt; Architecting a Monorepo, Custom Auth, and Type-Safe Dev Environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 4:&lt;/strong&gt; Engineering Frontend Funnels &amp;amp; LocalStorage Persistence&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 5:&lt;/strong&gt; When Being Right Still Means Redoing the Work (Hierarchy by Subtraction)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 6:&lt;/strong&gt; Beyond the Sandboxes: Hardening Routes, Admin Portals, &amp;amp; Server States&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Week 7:&lt;/strong&gt; The Final Polish: Purging Debt, Handover Architectures, &amp;amp; Closing the Loop&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Coming Up: The Final Reflections &amp;amp; Retrospective
&lt;/h2&gt;

&lt;p&gt;As this 7-week sprint comes to an end, I’m putting the finishing touches on a comprehensive retrospective post dropping soon on Hashnode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is a quick preview of what I’ll be covering in the series finale:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The Reality of Engineering Offboarding: What transferring codebase ownership to full-time engineering teams actually looks like in practice.&lt;/p&gt;

&lt;p&gt;Key Non-Technical Takeaways: Communication loops, managing scope creep, and navigating merge calls under pressure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advice for Future Interns:&lt;/strong&gt; The exact tools, mindsets, and workflows that made the biggest impact throughout the project.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Stay tuned—the final reflections drop next week!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To everyone wrapping up internships or preparing for junior developer roles: &lt;strong&gt;What is your go-to strategy for leaving behind clean code documentation?&lt;/strong&gt; Do you prefer inline commenting, detailed README files, or live loom walkthroughs?&lt;/p&gt;

&lt;p&gt;Drop your thoughts in the comments below! 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>internships</category>
      <category>programming</category>
      <category>documentation</category>
    </item>
    <item>
      <title>🚀 How We Organized the Build with the Gemma Hackathon at Makerere University</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Tue, 21 Jul 2026 09:08:23 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/how-we-organized-the-build-with-the-gemma-hackathon-at-makerere-university-c37</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/how-we-organized-the-build-with-the-gemma-hackathon-at-makerere-university-c37</guid>
      <description>&lt;p&gt;Over the past few weeks, our team at GDG on Campus Makerere planned and hosted the Build with Gemma Hackathon, bringing together students and developers to build AI-powered solutions using Google's open Gemma models.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The journey involved:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Getting our Kaggle competition approved&lt;br&gt;
Running a pre-hackathon workshop&lt;br&gt;
Securing partnerships and venue support&lt;br&gt;
Managing registrations and participant engagement&lt;br&gt;
Organizing judging and project submissions&lt;/p&gt;

&lt;p&gt;The event welcomed 30+ participants, produced 11 project submissions, and crowned 3 winning teams building solutions in education, healthcare, sustainability, and AI agents.&lt;/p&gt;

&lt;p&gt;I wrote a detailed reflection on everything we learned—from planning challenges to event-day execution and the lessons we'll carry into future community events.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📖 Read the full story:&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://shakiran.hashnode.dev/building-a-hackathon-from-the-ground-up" rel="noopener noreferrer"&gt;Building a Hackathon from the Ground Up&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear from other community organizers:&lt;br&gt;
What has been your biggest lesson from running a hackathon or developer event?&lt;/p&gt;

&lt;h1&gt;
  
  
  BuildWithGemma #GoogleAI #GDG #GDGOnCampus #Hackathon #CommunityBuilding #ArtificialIntelligence #Kaggle #MakerereUniversity #OpenSourceAI #DevCommunity
&lt;/h1&gt;

</description>
      <category>hackathon</category>
      <category>ai</category>
      <category>gemmachallenge</category>
      <category>gemma</category>
    </item>
    <item>
      <title>When Being Right Still Means Redoing the Work</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Mon, 13 Jul 2026 06:53:05 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/when-being-right-still-means-redoing-the-work-186m</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/when-being-right-still-means-redoing-the-work-186m</guid>
      <description>&lt;p&gt;&lt;strong&gt;Week 5 Internship Update&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As software engineers, we are often taught that code is a pure meritocracy. If your logic passes local compilation, it should ship, right? &lt;/p&gt;

&lt;p&gt;This week taught me that team dynamics, ownership boundaries, and deployment hygiene operate on a completely different set of rules. I had to face a massive branch overlap conflict where my feature code clashed with a parallel teammate's sprint. The fastest path to production? Redoing and rewriting my branch scope entirely. &lt;/p&gt;

&lt;p&gt;Beyond git refactors, this week I dived deep into structural UI refinement for our Talent Funnel platform:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redesigning high-impact landing viewports (subtracting fluff for visual hierarchy).&lt;/li&gt;
&lt;li&gt;Splitting dense forms into intuitive multi-step wizard layouts.&lt;/li&gt;
&lt;li&gt;Overhauling account security panels and fixing Next.js build-time API creation dependencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read about the balance between technical hierarchy and development humility in my latest article! 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shakiran.hashnode.dev/series/my-software-engineering-internship" rel="noopener noreferrer"&gt;My Software Engineering Internship Journey&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  SoftwareEngineering #WebDevelopment #Frontend #MaterialUI #NextJS #TechInternships #CareerGrowth
&lt;/h1&gt;

</description>
      <category>webdev</category>
      <category>teamwork</category>
      <category>programming</category>
      <category>ui</category>
    </item>
    <item>
      <title>From an Idea to a Hackathon: Lessons from Organizing Build with AI Makerere</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Mon, 29 Jun 2026 11:12:43 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/from-an-idea-to-a-hackathon-lessons-from-organizing-build-with-ai-makerere-j03</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/from-an-idea-to-a-hackathon-lessons-from-organizing-build-with-ai-makerere-j03</guid>
      <description>&lt;p&gt;After months of planning, countless emails, sponsor outreach, community workshops, and late nights, we successfully hosted the &lt;strong&gt;Build with AI Makerere Hackathon&lt;/strong&gt; in partnership with &lt;strong&gt;Google Build with AI&lt;/strong&gt; and &lt;strong&gt;Major League Hacking (MLH)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The event brought together student developers from universities across Uganda to build AI-powered solutions addressing real-world challenges using &lt;strong&gt;Gemini&lt;/strong&gt;, &lt;strong&gt;Google AI Studio&lt;/strong&gt;, and &lt;strong&gt;Google Cloud&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Along the way, I learned invaluable lessons about:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building partnerships and securing sponsorships&lt;/li&gt;
&lt;li&gt;Planning and organizing a hackathon from scratch&lt;/li&gt;
&lt;li&gt;Leading a growing developer community&lt;/li&gt;
&lt;li&gt;Navigating unexpected challenges&lt;/li&gt;
&lt;li&gt;💡 Creating an environment where students could innovate and learn&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This experience reminded me that community leadership isn't about having everything figured out—it's about learning, adapting, and bringing people together around a shared vision.&lt;/p&gt;

&lt;p&gt;I've written a detailed reflection covering the journey, the challenges, the impact, and the lessons I'll carry into future events.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;Read the full story here:&lt;/strong&gt; &lt;strong&gt;&lt;a href="https://shakiran.hashnode.dev/build-with-ai-makerere-hackathon" rel="noopener noreferrer"&gt;build-with-ai-makerere-hackathon&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts or learn about your own experiences organizing community events!&lt;/p&gt;

&lt;p&gt;BuildWithAI GoogleAI GDG &lt;a class="mentioned-user" href="https://dev.to/mlhacks"&gt;@mlhacks&lt;/a&gt; Hackathon DeveloperCommunity ArtificialIntelligence OpenSource CommunityBuilding Leadership&lt;/p&gt;

</description>
      <category>hackathon</category>
      <category>gemini</category>
      <category>ai</category>
      <category>mlh</category>
    </item>
    <item>
      <title>From Classroom to Real-World: Surviving Week 1 of My Software Engineering Internship</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Wed, 24 Jun 2026 14:56:53 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/from-classroom-to-real-world-surviving-week-1-of-my-software-engineering-internship-204e</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/from-classroom-to-real-world-surviving-week-1-of-my-software-engineering-internship-204e</guid>
      <description>&lt;h1&gt;
  
  
  Week 1 of My Software Engineering Internship
&lt;/h1&gt;

&lt;p&gt;This week gave me a reality check.&lt;/p&gt;

&lt;p&gt;I went from building side projects where I made all the decisions to working on a real team, attending client meetings, writing requirements documents, mapping use cases, and learning that software development starts long before the first line of code.&lt;/p&gt;

&lt;p&gt;A few things that surprised me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Having a classmate become my team lead 👀&lt;/li&gt;
&lt;li&gt;Discovering how much time goes into planning before coding&lt;/li&gt;
&lt;li&gt;Learning that understanding clients and constraints is just as important as understanding technology&lt;/li&gt;
&lt;li&gt;Realizing that teamwork is a skill you have to actively practice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I wrote about the challenges, lessons, and mindset shifts from my first week as an intern.&lt;/p&gt;

&lt;p&gt;Read the full story: &lt;a href="https://shakiran.hashnode.dev/series/my-software-engineering-internship" rel="noopener noreferrer"&gt;my-software-engineering-internship&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the first post in a series where I'll be sharing honest reflections from my internship journey—from requirements and architecture to design, development, and everything in between.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;What was the biggest surprise during your first internship or software engineering job?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>internship</category>
      <category>documentation</category>
      <category>teamwork</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>REST Brain vs Procedure Brain</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Wed, 24 Jun 2026 14:53:46 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/rest-brain-vs-procedure-brain-1oo6</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/rest-brain-vs-procedure-brain-1oo6</guid>
      <description>&lt;h1&gt;
  
  
  REST Brain vs Procedure Brain
&lt;/h1&gt;

&lt;p&gt;Today I had one of the most valuable architecture discussions I've been part of.&lt;/p&gt;

&lt;p&gt;I joined a monorepo expecting the usual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Frontend → API Server → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, I found an in-process procedural RPC layer with &lt;strong&gt;no separate API server&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My first reaction was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What even is this?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;After a real debate about tradeoffs, I finally understood the problem it was solving—and it challenged some assumptions I had about what a backend has to look like.&lt;/p&gt;

&lt;p&gt;I wrote about the experience, the tradeoffs, and the shift from &lt;strong&gt;REST brain&lt;/strong&gt; to &lt;strong&gt;procedure brain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Read here: &lt;a href="https://shakiran.hashnode.dev/rest-brain-vs-procedure-brain" rel="noopener noreferrer"&gt;rest-brain-vs-procedure-brain&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's an architecture pattern that felt wrong at first but made sense once you understood the problem it was solving?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>backend</category>
      <category>architecture</category>
      <category>programming</category>
    </item>
    <item>
      <title>A Developer’s Lesson on Feedback</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Tue, 21 Apr 2026 06:49:21 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/a-developers-lesson-on-feedback-2291</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/a-developers-lesson-on-feedback-2291</guid>
      <description>&lt;p&gt;I built my first React Native MVP for a startup pitch.&lt;/p&gt;

&lt;p&gt;I was proud of it… until the feedback started coming in.&lt;/p&gt;

&lt;p&gt;Instead of handling it, I passed it to a junior teammate.&lt;/p&gt;

&lt;p&gt;At the time, I told myself:&lt;br&gt;
“I just don’t like being told what to do.”&lt;/p&gt;

&lt;p&gt;But the truth?&lt;/p&gt;

&lt;p&gt;I was tired.&lt;br&gt;
I felt unappreciated.&lt;br&gt;
And I was too attached to my work.&lt;/p&gt;

&lt;p&gt;Later that day, I stepped away, came back, and realized something:&lt;/p&gt;

&lt;p&gt;The problem wasn’t the feedback.&lt;br&gt;
It was my &lt;em&gt;state when I received it.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As developers, we think we’re logical—but feedback hits your ego, your energy, and your identity.&lt;/p&gt;

&lt;p&gt;That’s why we react instead of process.&lt;/p&gt;

&lt;p&gt;This was a tough lesson for me, especially after realizing it’s a pattern that’s cost me opportunities before.&lt;/p&gt;

&lt;p&gt;I wrote a full breakdown on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why devs resist feedback&lt;/li&gt;
&lt;li&gt;how ego + burnout affect us&lt;/li&gt;
&lt;li&gt;and how to actually handle it better&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Read it here 👇&lt;br&gt;
&lt;a href="https://shakiran.hashnode.dev/the-code-wasn-t-the-problem-my-state-was" rel="noopener noreferrer"&gt;the-code-wasn-t-the-problem-my-state-was&lt;/a&gt;&lt;/p&gt;

</description>
      <category>softwaredevelopment</category>
      <category>career</category>
      <category>productivity</category>
      <category>programming</category>
    </item>
    <item>
      <title>Building Secure AI Agents with Auth0 Token Vault</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Tue, 14 Apr 2026 01:55:43 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/building-secure-ai-agents-with-auth0-token-vault-47l1</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/building-secure-ai-agents-with-auth0-token-vault-47l1</guid>
      <description>&lt;h2&gt;
  
  
  How I stopped storing sensitive tokens in my database and built a security-first AI system
&lt;/h2&gt;

&lt;p&gt;I built a multi-agent AI assistant that needed access to user data like Gmail, Google Calendar, and Notion.&lt;/p&gt;

&lt;p&gt;At first, I thought I had it figured out.&lt;/p&gt;

&lt;p&gt;I encrypted OAuth tokens myself and stored them in my database.&lt;/p&gt;

&lt;p&gt;It worked… but something didn’t feel right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem with “DIY security.”
&lt;/h2&gt;

&lt;p&gt;During the Auth0 “Authorized to Act: Auth0 for AI Agents” hackathon, I took a step back and reviewed my setup.&lt;/p&gt;

&lt;p&gt;My system (Londoolink AI) is built with FastAPI + LangGraph and generates personalized daily briefings using multiple agents:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📧 Gmail Agent
&lt;/li&gt;
&lt;li&gt;📅 Calendar Agent
&lt;/li&gt;
&lt;li&gt;📝 Notion Agent
&lt;/li&gt;
&lt;li&gt;📱 Social Agent
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To do that, it relies on OAuth tokens.&lt;/p&gt;

&lt;p&gt;And that’s where things got risky.&lt;/p&gt;

&lt;h3&gt;
  
  
  My original approach:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;AES-256 encryption for tokens
&lt;/li&gt;
&lt;li&gt;Tokens stored in my database
&lt;/li&gt;
&lt;li&gt;Custom refresh handling
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It worked… but it wasn’t scalable or truly secure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I realized
&lt;/h2&gt;

&lt;p&gt;I was responsible for things I shouldn’t be owning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔐 Encryption key management
&lt;/li&gt;
&lt;li&gt;🔄 Token refresh logic
&lt;/li&gt;
&lt;li&gt;📊 Audit trails (basically none)
&lt;/li&gt;
&lt;li&gt;👀 No visibility into token usage
&lt;/li&gt;
&lt;li&gt;⚠️ No proper control for sensitive actions
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In short:&lt;/p&gt;

&lt;p&gt;I was rebuilding a security system from scratch… badly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The switch: Auth0 Token Vault
&lt;/h2&gt;

&lt;p&gt;That’s when I found Auth0 Token Vault.&lt;/p&gt;

&lt;p&gt;And it changed everything.&lt;/p&gt;

&lt;p&gt;Instead of managing tokens myself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Auth0 handles token storage securely
&lt;/li&gt;
&lt;li&gt;Built-in token refresh just works
&lt;/li&gt;
&lt;li&gt;Full audit logs out of the box
&lt;/li&gt;
&lt;li&gt;Tokens never touch my database
&lt;/li&gt;
&lt;li&gt;Easy to enforce secure access patterns
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It basically turns token management into a secure API call.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;🔒 More secure by design
&lt;/li&gt;
&lt;li&gt;📈 Easier to scale
&lt;/li&gt;
&lt;li&gt;🧾 Fully auditable
&lt;/li&gt;
&lt;li&gt;🤝 Much more user trust
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most importantly:&lt;/p&gt;

&lt;p&gt;I stopped worrying about whether I was “doing security right” and started focusing on building features.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the project
&lt;/h2&gt;

&lt;p&gt;Londoolink AI is a multi-agent assistant that reduces information overload by generating personalized daily briefings from your connected tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  🙌 Shoutout
&lt;/h2&gt;

&lt;p&gt;Big shoutout to the Auth0 team for building tools that make secure AI development actually practical.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the full story
&lt;/h2&gt;

&lt;p&gt;If you want the deeper breakdown, architecture details, and implementation steps, read the full post here:&lt;br&gt;&lt;br&gt;
&lt;a href="https://shakiran.hashnode.dev/building-secure-ai-agents-with-auth0-token-vault" rel="noopener noreferrer"&gt;Shakiran.hashnode.dev&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Let’s talk
&lt;/h2&gt;

&lt;p&gt;Have you built AI agents before?&lt;/p&gt;

&lt;p&gt;How are you handling auth + token security?&lt;/p&gt;

&lt;p&gt;I’d love to hear your approach 👇&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>security</category>
      <category>agents</category>
    </item>
    <item>
      <title>My AI Was Smart… But Useless</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Tue, 14 Apr 2026 00:42:07 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/my-ai-was-smart-but-useless-e4n</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/my-ai-was-smart-but-useless-e4n</guid>
      <description>&lt;p&gt;I built an AI that generates daily briefings from emails, calendars, Notion, and social media.&lt;/p&gt;

&lt;p&gt;It worked. It was fast. It was accurate.&lt;/p&gt;

&lt;p&gt;But it had one fatal flaw:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It forgot everything.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every session = reset.&lt;br&gt;
Every user = stranger.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No memory. No context. No continuity.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I Fixed It
&lt;/h2&gt;

&lt;p&gt;I discovered &lt;strong&gt;Backboard.io&lt;/strong&gt; after an Auth0 Hackathon on Devpost, and later explored it deeper during MLH Global Hack Week: API Week 2026.&lt;/p&gt;

&lt;p&gt;That’s when it clicked:&lt;/p&gt;

&lt;p&gt;My AI didn’t need to be smarter. It needed memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Changed Instantly
&lt;/h3&gt;

&lt;p&gt;After adding memory:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My AI remembers user preferences&lt;/li&gt;
&lt;li&gt;Conversations actually continue&lt;/li&gt;
&lt;li&gt;Outputs feel personal, not generic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It stopped feeling like a chatbot and started feeling like an assistant.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Shift
&lt;/h2&gt;

&lt;p&gt;Most AI apps today are stateless. That’s the problem.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Without Memory&lt;/th&gt;
&lt;th&gt;With Memory&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;You repeat yourself&lt;/td&gt;
&lt;td&gt;Your AI learns&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Context is lost&lt;/td&gt;
&lt;td&gt;Your AI adapts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Personalization is fake&lt;/td&gt;
&lt;td&gt;Your AI improves over time&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I break down exactly how I built it here:&lt;br&gt;
👉 &lt;a href="https://shakiran.hashnode.dev/how-backboard-io-added-memory-to-my-ai-agent" rel="noopener noreferrer"&gt;https://shakiran.hashnode.dev/how-backboard-io-added-memory-to-my-ai-agent&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🙌 Shoutout
&lt;/h2&gt;

&lt;p&gt;Huge shoutout to @MLH Global API Hack Week for the sessions and community that made it easier to explore and build with tools like this in real time.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>api</category>
      <category>webdev</category>
      <category>beginners</category>
    </item>
    <item>
      <title>The Invisible Brains: 5 Surprising Realities of the Tiny Operating Systems Running Our World</title>
      <dc:creator>Shakiran Nannyombi</dc:creator>
      <pubDate>Wed, 01 Apr 2026 10:48:15 +0000</pubDate>
      <link>https://dev.to/shakiran_nannyombi_b0bf41/the-invisible-brains-5-surprising-realities-of-the-tiny-operating-systems-running-our-world-dnd</link>
      <guid>https://dev.to/shakiran_nannyombi_b0bf41/the-invisible-brains-5-surprising-realities-of-the-tiny-operating-systems-running-our-world-dnd</guid>
      <description>&lt;h3&gt;
  
  
  How tiny operating systems power billions of IoT devices with just kilobytes of memory.
&lt;/h3&gt;

&lt;p&gt;When we think about operating systems, we usually imagine powerful platforms like Microsoft Windows, macOS, or Linux, designed for laptops, servers, and smartphones, with gigabytes of RAM and multi-core processors.&lt;/p&gt;

&lt;p&gt;But the majority of computers on Earth don’t run those systems.&lt;/p&gt;

&lt;p&gt;Instead, they run tiny operating systems on microscopic hardware: microcontrollers with 10 KB of RAM, a 50 MHz processor, and batteries expected to last years.&lt;/p&gt;

&lt;p&gt;These “invisible” operating systems power:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;medical implants&lt;/li&gt;
&lt;li&gt;industrial sensors&lt;/li&gt;
&lt;li&gt;smart home devices&lt;/li&gt;
&lt;li&gt;vehicle controllers&lt;/li&gt;
&lt;li&gt;environmental monitoring systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Operating systems like &lt;strong&gt;Contiki&lt;/strong&gt;, &lt;strong&gt;TinyOS&lt;/strong&gt;, and &lt;strong&gt;Tock OS&lt;/strong&gt; redefine what an operating system can be.&lt;/p&gt;

&lt;h2&gt;
  
  
  Here are five surprising realities about how these systems actually work.
&lt;/h2&gt;

&lt;p&gt;Read more at &lt;a href="https://shakiran.hashnode.dev/embedded-operating-systems-realities" rel="noopener noreferrer"&gt;Where the wind meets me&lt;/a&gt;&lt;/p&gt;

</description>
      <category>iot</category>
      <category>os</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
