<?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: Christopher Mburu</title>
    <description>The latest articles on DEV Community by Christopher Mburu (@christopher_mburu_7b7e0ba).</description>
    <link>https://dev.to/christopher_mburu_7b7e0ba</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%2F3853372%2F0427138c-df58-4c18-bd2a-dbd6a07824c1.jpg</url>
      <title>DEV Community: Christopher Mburu</title>
      <link>https://dev.to/christopher_mburu_7b7e0ba</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/christopher_mburu_7b7e0ba"/>
    <language>en</language>
    <item>
      <title>From Hidden Data Loss to Reliable Bookings: Finishing Demic Ride with GitHub Copilot</title>
      <dc:creator>Christopher Mburu</dc:creator>
      <pubDate>Fri, 05 Jun 2026 12:33:35 +0000</pubDate>
      <link>https://dev.to/christopher_mburu_7b7e0ba/from-hidden-data-loss-to-reliable-bookings-finishing-demic-ride-with-github-copilot-2li3</link>
      <guid>https://dev.to/christopher_mburu_7b7e0ba/from-hidden-data-loss-to-reliable-bookings-finishing-demic-ride-with-github-copilot-2li3</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-05-21"&gt;GitHub Finish-Up-A-Thon Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Demic Ride is a corporate taxi dispatch and ride-hailing platform for Demic Tours Africa, built on Next.js, Supabase, and Tailwind, deployed on Render at &lt;a href="https://ride.demicafrica.com" rel="noopener noreferrer"&gt;ride.demicafrica.com&lt;/a&gt;. It handles passenger booking, automatic driver dispatch, live GPS tracking, and a pay-after-ride flow.&lt;/p&gt;

&lt;p&gt;The MVP was already live — but "live" hid a problem. A booking form that looked finished was silently throwing away data on every submission. Finishing this project meant catching the bug that nobody had noticed because it never produced an error.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Live:&lt;/strong&gt; &lt;a href="https://ride.demicafrica.com" rel="noopener noreferrer"&gt;ride.demicafrica.com&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Repo (challenge branch):&lt;/strong&gt; &lt;a href="https://github.com/Demic-Africa/demic-ride/tree/finish-up-athon" rel="noopener noreferrer"&gt;Demic-Africa/demic-ride @ finish-up-athon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfmnq60dg7jdlghkrctf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfmnq60dg7jdlghkrctf.png" alt="Demic Ride booking form on the live site showing a failed submission with the error " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zankjwe6ucywe8sccwv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8zankjwe6ucywe8sccwv.png" alt="Booking success screen reading " width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv4hztbin90mottpm1iw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqv4hztbin90mottpm1iw.png" alt="Supabase bookings table showing a row with scheduled_date, scheduled_time, and notes columns now populated" width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7at1qd6l8rzvshmpuzze.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7at1qd6l8rzvshmpuzze.png" alt="Demic Ride Fleet Analytics dashboard showing four metric cards: Today's Bookings (0), Total Drivers (6), Weekly Bookings (1), and a status breakdown for Pending, Assigned, and Completed bookings. The dashboard renders live data from Supabase and was generated entirely by GitHub Copilot." width="800" height="406"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Comeback Story
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Before vs After
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Schedule data was collected but not stored&lt;/li&gt;
&lt;li&gt;Missing database columns&lt;/li&gt;
&lt;li&gt;Weak validation around booking schedules&lt;/li&gt;
&lt;li&gt;Dispatch failures were not handled gracefully&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  After
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Schedule data persists correctly&lt;/li&gt;
&lt;li&gt;Database migrations are version controlled&lt;/li&gt;
&lt;li&gt;Validation prevents incomplete bookings&lt;/li&gt;
&lt;li&gt;Dispatch failures no longer break the booking workflow&lt;/li&gt;
&lt;li&gt;Analytics dashboard provides operational visibility&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I changed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Added the missing columns&lt;/strong&gt; via a version-controlled migration (&lt;code&gt;scheduled_date&lt;/code&gt;, &lt;code&gt;scheduled_time&lt;/code&gt;, &lt;code&gt;notes&lt;/code&gt;). The schema had only ever lived in the Supabase dashboard, so this also put it into git for the first time.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Added real validation&lt;/strong&gt; for date/time, with an inline error instead of a native &lt;code&gt;alert()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrapped dispatch in try/catch&lt;/strong&gt; so a failure now saves the booking and shows an honest "driver will be assigned shortly" state instead of a fake success.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;One honest note: the booking failure I first screenshotted turned out to be the Supabase project auto-pausing on the free tier, not a code bug — resuming it restored bookings. The real, code-level issue was the silent data loss above. I kept that distinction clear in my &lt;a href="https://github.com/Demic-Africa/demic-ride/blob/finish-up-athon/docs/FINISH_UP_ATHON.md" rel="noopener noreferrer"&gt;project journal&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  My Experience with GitHub Copilot
&lt;/h2&gt;

&lt;p&gt;I used Copilot in two distinct ways, and I want to be precise about which was which.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As a reviewer&lt;/strong&gt; for the fixes above. I'd written the migration, validation, and error handling, then ran them past Copilot with my repo as context to check my work and confirm root cause. In one session I asked it to update the date/time validation — and it correctly told me the validation was already right, pointed at the exact line, and suggested a more granular per-field error pattern instead. In another it walked the booking-failure root cause and explained exactly why the missing columns caused silent data loss. Having an AI confirm or push back on a fix you've already made is underrated: it caught nothing catastrophic, but it tightened my reasoning and my dispatch error-handling pattern.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;As an author&lt;/strong&gt; for net-new code: the fleet analytics dashboard. This one Copilot built. I gave it my real &lt;code&gt;bookings&lt;/code&gt; and &lt;code&gt;drivers&lt;/code&gt; columns and asked for an admin analytics component using the app's existing styles. It generated the component; I corrected the one thing it guessed wrong (the driver-status query column), wired it into an &lt;code&gt;/admin/dashboard&lt;/code&gt; route, and it rendered live data on the first build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example: Database Migration
&lt;/h3&gt;

&lt;p&gt;Prompt:&lt;/p&gt;

&lt;p&gt;"Generate a Supabase migration to add scheduled_date, scheduled_time, and notes columns using IF NOT EXISTS."&lt;/p&gt;

&lt;p&gt;Copilot Output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generated migration structure&lt;/li&gt;
&lt;li&gt;Suggested safe ALTER TABLE statements&lt;/li&gt;
&lt;li&gt;Explained rollback considerations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Outcome:&lt;/p&gt;

&lt;p&gt;The missing fields were added and booking schedule data now persists correctly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;Repository:&lt;br&gt;
&lt;a href="https://github.com/Demic-Africa/demic-ride/tree/finish-up-athon" rel="noopener noreferrer"&gt;https://github.com/Demic-Africa/demic-ride/tree/finish-up-athon&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Live Demo:&lt;br&gt;
&lt;a href="https://ride.demicafrica.com" rel="noopener noreferrer"&gt;https://ride.demicafrica.com&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>githubcopilot</category>
      <category>nextjs</category>
    </item>
    <item>
      <title>Hermes TravelOps: An Agent That Learns From Every Trip</title>
      <dc:creator>Christopher Mburu</dc:creator>
      <pubDate>Sun, 31 May 2026 17:13:27 +0000</pubDate>
      <link>https://dev.to/christopher_mburu_7b7e0ba/hermes-travelops-an-agent-that-learns-from-every-trip-5805</link>
      <guid>https://dev.to/christopher_mburu_7b7e0ba/hermes-travelops-an-agent-that-learns-from-every-trip-5805</guid>
      <description>&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hermes TravelOps Agent&lt;/strong&gt; — an autonomous travel operations manager built natively on Hermes Agent. It remembers each traveler's preferences without prompting, researches flights and hotels via web search, flags risks, and runs a post-trip debrief that rewrites its own memory so the &lt;em&gt;next&lt;/em&gt; trip plan is automatically different. No external backend: memory, skills, and scheduling are all Hermes's own.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;Travel coordinators repeat the same operational loop for every trip: research flights and hotels against a traveler's quirks, check visas, assemble an itinerary, monitor for disruptions, and — the part every tool ignores — &lt;em&gt;learn&lt;/em&gt; from how the trip actually went. Most AI travel tools answer a question and forget you. I wanted one that operates and remembers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture: Hermes IS the Stack
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~/.hermes/
├── skills/
│   ├── travel-plan-request/SKILL.md   ← Multi-step planning
│   └── post-trip-debrief/SKILL.md     ← Learning loop
├── context/
│   └── TRAVEL_OPS_CONTEXT.md          ← Domain knowledge
├── memories/
│   └── MEMORY.md                      ← Persistent memory (FTS5)
└── SOUL.md                            ← Agent persona
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Hermes handles memory, web search, skill execution, and scheduling natively. It's model-agnostic — this demo runs on &lt;code&gt;gemini-3-flash-preview&lt;/code&gt; through Hermes's provider layer, and nothing in the project depends on which model sits underneath.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Demo data is seeded.&lt;/strong&gt; I loaded two traveler profiles and one prior-trip record into memory before recording, so the learning loop has history to work against. Trip dates are fixture data, not live calendar events. What the agent &lt;em&gt;does&lt;/em&gt; — recall, research, debrief, re-plan — is real and unscripted.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  The Demo
&lt;/h2&gt;


&lt;div class="ltag_asciinema"&gt;
  
&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Command 1 — Plan a trip:&lt;/strong&gt; &lt;code&gt;Plan a trip for Sarah to Dubai next week&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Hermes loaded the planning skill, fired three web searches, and returned one recommendation with every stored preference already applied — without me restating any of them: Emirates EK720, window seat (enforced), vegetarian (matched), non-stop, Marriott Palm Jumeirah, WiFi 5/5, visa valid to 2027-03-15, ~$850, ending at "pending approval."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command 2 — Visa check:&lt;/strong&gt; &lt;code&gt;Check visa for Sarah going to UAE&lt;/code&gt; → Valid, multi-entry, expiry 2027-03-15, no action required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command 3 — Post-trip debrief:&lt;/strong&gt; &lt;code&gt;Sarah is back from Dubai. Emirates was 4/5 but the layover in DXB was 6 hours and she was frustrated.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This triggered the &lt;code&gt;post-trip-debrief&lt;/code&gt; skill. The memory tool fires repeatedly in the recording — including failed lookups before the write lands, which is what a real agent retrying looks like. It marked the 6hr layover "strictly unacceptable," added a directive to enforce direct Emirates flights for NBO-DXB, and wrote the lesson to memory.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command 4 — Prove the memory changed:&lt;/strong&gt; &lt;code&gt;cat ~/.hermes/memories/MEMORY.md | grep -A2 "Sarah Chen"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The file now reads &lt;code&gt;max 3hr layover&lt;/code&gt; and carries the dated lesson. It changed because the agent rewrote it — no update script, no external database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Command 5 — Re-plan, watch it apply what it learned:&lt;/strong&gt; &lt;code&gt;Plan another trip for Sarah to Dubai next month&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;With zero prompting, the new plan enforced the constraint the debrief created: non-stop only, "EK720 selected explicitly to avoid the 6-hour layover friction reported in June," and Marriott Palm Jumeirah prioritized over Business Bay on a previously-logged WiFi rating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Uses Hermes Properly
&lt;/h2&gt;

&lt;p&gt;Build criterion #1 is "effective use of Hermes Agent's agentic capabilities." I used Hermes native memory (FTS5 + MEMORY.md) instead of a database, Hermes skills instead of custom orchestration, Hermes built-in web search instead of a bolted-on service, and a skill-driven post-trip loop that writes back to memory and changes future behavior. A handful of files, no infrastructure, model-swappable underneath.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It Yourself
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tourswithchris/hermes-travel-ops-native.git
&lt;span class="nb"&gt;cd &lt;/span&gt;hermes-travel-ops-native
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; skills/&lt;span class="k"&gt;*&lt;/span&gt; ~/.hermes/skills/
&lt;span class="nb"&gt;cp &lt;/span&gt;context/TRAVEL_OPS_CONTEXT.md ~/.hermes/context/
&lt;span class="nb"&gt;cp &lt;/span&gt;memories/&lt;span class="k"&gt;*&lt;/span&gt; ~/.hermes/memories/
&lt;span class="nb"&gt;cp &lt;/span&gt;SOUL.md ~/.hermes/
hermes chat
&lt;span class="c"&gt;# Then: Plan a trip for Sarah to Dubai next week&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Repo: &lt;a href="https://github.com/tourswithchris/hermes-travel-ops-native" rel="noopener noreferrer"&gt;https://github.com/tourswithchris/hermes-travel-ops-native&lt;/a&gt;&lt;/p&gt;




</description>
      <category>hermesagentchallenge</category>
      <category>devchallenge</category>
      <category>agents</category>
      <category>travel</category>
    </item>
  </channel>
</rss>
