<?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>I Skipped the Custom Backend: Why n8n + Supabase Won for Our Safari Operation</title>
      <dc:creator>Christopher Mburu</dc:creator>
      <pubDate>Sat, 08 Aug 2026 09:01:58 +0000</pubDate>
      <link>https://dev.to/christopher_mburu_7b7e0ba/i-skipped-the-custom-backend-why-n8n-supabase-won-for-our-safari-operation-2n7e</link>
      <guid>https://dev.to/christopher_mburu_7b7e0ba/i-skipped-the-custom-backend-why-n8n-supabase-won-for-our-safari-operation-2n7e</guid>
      <description>&lt;p&gt;Six months ago, if you'd asked me how Demic Africa — a luxury safari and ground transport company operating out of Nairobi — handled booking logistics, I would have pointed at a spreadsheet and a WhatsApp inbox held together by muscle memory. It worked, in the way that things work right up until the moment a $90 Executive SUV transfer and a $45 Standard Transfer both need to be at the airport at the same time and nobody flagged the conflict.&lt;/p&gt;

&lt;p&gt;At some point "it works" stops being good enough, but "we need a full custom stack" is also the wrong answer for a business our size. This is the story of the middle path I picked — n8n for orchestration, Supabase for data and why I think it's the right call for where we are right now, not necessarily where we're headed.&lt;/p&gt;

&lt;p&gt;The problem: too big for spreadsheets, too small for a custom stack&lt;/p&gt;

&lt;p&gt;Demic Africa runs a handful of interlocking workflows: inbound leads from Meta and Google ad campaigns, ground transport dispatch across two tiers of vehicles, multilingual guest communication (English, Arabic, French, Turkish) over WhatsApp and Instagram DM, and safari booking coordination across partner camps in Kenya, Tanzania, and Uganda.&lt;/p&gt;

&lt;p&gt;None of that is exotic. None of it needs a distributed systems architecture. But all of it needs to be reliable — a lead can't sit unanswered for six hours because I was on a call, a driver assignment can't get overwritten by a copy-paste error, and a guest confirmation can't silently fail to send.&lt;/p&gt;

&lt;p&gt;The honest failure mode of a small operator isn't "our system can't scale." It's "our system depends on a person remembering to do a manual step at 11pm." Spreadsheets don't fix that. Neither does hiring a developer to write bespoke integration code for every new channel we plug in, which is where I started leaning before I talked myself out of it.&lt;/p&gt;

&lt;p&gt;Why n8n won over custom integration code&lt;/p&gt;

&lt;p&gt;I write Python regularly, so "just build it" was a real option, not a cop-out. I decided against it for a few concrete reasons that are specific to this stage of the business rather than automation orthodoxy:&lt;/p&gt;

&lt;p&gt;The bottleneck isn't logic, it's plumbing. Most of what needs to happen — new lead comes in, check vehicle availability, notify the right driver, send a WhatsApp confirmation, log it to the booking register — is a sequence of API calls between services I don't control (Meta, WhatsApp, Google Sheets/Supabase, email). Custom code for that is mostly writing and maintaining auth handling and error retries for other people's APIs. n8n already does that part well, and it does it visually enough that I can hand off a workflow explanation to someone who isn't a developer.&lt;/p&gt;

&lt;p&gt;As the only engineer, and I'm not always the one debugging. When something breaks in a bash script at 6am Nairobi time before a guest transfer, I need to see where it broke without SSHing into a server and reading logs. n8n's execution history gives me that for free — I can look at a failed run, see the exact node and payload that failed, and fix it from my phone if I have to.&lt;/p&gt;

&lt;p&gt;Iteration speed matters more than architectural purity right now. Every week I'm adjusting something — adding TikTok as a lead channel, changing how child pricing (ages 4–12, under 4 free) gets applied in a quote, tweaking the multilingual reply logic. In custom code, each of those is a deploy. In n8n, most of them are a node change and a save.&lt;/p&gt;

&lt;p&gt;The trade-off is real: n8n workflows get messy at scale, version control is awkward compared to a git repo, and there's a ceiling on how much genuinely custom business logic I want to cram into Function nodes before it's fighting the tool. I'm not pretending otherwise. But for the current transaction volume, the plumbing-vs-logic ratio strongly favors n8n.&lt;/p&gt;

&lt;p&gt;Why Supabase over a heavier managed database&lt;/p&gt;

&lt;p&gt;For data, I didn't seriously consider running my own Postgres instance, and I didn't want a heavier managed platform either. Supabase hit the right point for a lean team for a few reasons:&lt;/p&gt;

&lt;p&gt;It's still just Postgres. I'm not locked into a proprietary query layer. If Demic Africa outgrows Supabase, the migration path is "move a Postgres database," not "rewrite a data layer."&lt;br&gt;
Auth, storage, and row-level security come bundled. I don't need a separate service to handle guest-facing auth for something like a booking portal, and I don't need to hand-roll access control between what a driver can see versus what an admin can see.&lt;br&gt;
n8n talks to it natively and cheaply. The Supabase node in n8n is a straightforward Postgres/REST bridge, so the orchestration and data layers don't fight each other. That matters more than people expect — a lot of "custom backend" pain is really integration friction between the pieces, not any one piece being hard on its own.&lt;br&gt;
The free/low tiers match our actual load. A heavier managed database is priced and provisioned for a transaction volume we don't have yet. Paying for headroom I'm not using is capital that should be going toward ads or ops instead.&lt;br&gt;
What I'd reconsider once volume grows&lt;/p&gt;

&lt;p&gt;This stack is a bet on the current stage of the business, not a permanent architectural stance, and I want to be specific about where it bends:&lt;/p&gt;

&lt;p&gt;Workflow sprawl in n8n. Past a certain number of interlocking workflows, visual orchestration becomes its own kind of technical debt — nodes referencing other workflows, shared logic duplicated instead of abstracted. I'd expect to peel off the most complex, highest-stakes logic (real-time dispatch conflict resolution, for instance) into dedicated services before that becomes unmanageable.&lt;br&gt;
Concurrency and queuing. n8n's execution model is fine for the request volume we have. It is not designed for high-throughput, low-latency dispatch decisions happening in parallel across many vehicles at once — if we're managing a much larger fleet with real-time conflicts, that logic needs to live somewhere built for concurrency, not a workflow canvas.&lt;br&gt;
Multi-region and compliance requirements. If Demic Africa expands into markets with stricter data residency requirements, Supabase's hosting model may need to change, or I may need more control over where data physically lives than a managed platform gives me by default.&lt;br&gt;
Cost curve inversion. Managed tools are cheap until they aren't. If usage-based pricing on either platform starts approaching what a dedicated engineer or self-hosted infrastructure would cost, that's the signal to revisit, not a fixed timeline.&lt;/p&gt;

&lt;p&gt;None of that is a reason to over-build now. It's a reason to keep the decision explicit and revisit it against real usage numbers instead of vibes.&lt;/p&gt;

&lt;p&gt;The actual lesson&lt;/p&gt;

&lt;p&gt;The interesting decision for a small operator usually isn't "no-code versus custom code" as a philosophy. It's matching the tool to the actual bottleneck at the actual stage you're at, and being willing to say out loud what will make you change your mind later. Right now, for Demic Africa, that bottleneck is reliable plumbing between services I don't control and n8n plus Supabase closes that gap without asking me to build and maintain a backend I don't need yet.&lt;/p&gt;

&lt;p&gt;If you're running a small ops-heavy business and weighing the same trade-off, I'd rather hear what broke for you than what worked — reply below or find me on X/LinkedIn.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>buildinpublic</category>
      <category>nocode</category>
      <category>startup</category>
    </item>
    <item>
      <title>From AI Chatbots to AI Operators: Why Travel Doesn't Need Another Assistant</title>
      <dc:creator>Christopher Mburu</dc:creator>
      <pubDate>Mon, 13 Jul 2026 08:55:07 +0000</pubDate>
      <link>https://dev.to/christopher_mburu_7b7e0ba/from-ai-chatbots-to-ai-operators-why-travel-doesnt-need-another-assistant-gf</link>
      <guid>https://dev.to/christopher_mburu_7b7e0ba/from-ai-chatbots-to-ai-operators-why-travel-doesnt-need-another-assistant-gf</guid>
      <description>&lt;p&gt;&lt;em&gt;Most AI tools in travel can answer questions. Very few can actually do the work.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A delayed flight.&lt;br&gt;
A missed airport transfer.&lt;br&gt;
A hotel overbooked at midnight.&lt;br&gt;
A client changes destinations while already in transit.&lt;br&gt;
These aren't customer support problems.&lt;/em&gt;&lt;br&gt;
They're &lt;strong&gt;operations problems.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yet much of today's AI conversation is still focused on building assistants that generate impressive responses instead of systems that execute reliable workflows.&lt;br&gt;
After spending the last several months building autonomous travel agents, I've become convinced that we're asking AI the wrong question.&lt;/p&gt;

&lt;p&gt;Instead of asking:&lt;br&gt;
&lt;em&gt;"Can AI answer this?"&lt;/em&gt;&lt;br&gt;
we should be asking:&lt;br&gt;
&lt;em&gt;"Can AI own this process from start to finish?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden Cost of Modern Travel Operations&lt;/strong&gt;&lt;br&gt;
Travel companies don't lose most of their time answering FAQs.&lt;br&gt;
They lose it managing fragmented information.&lt;/p&gt;

&lt;p&gt;A typical booking touches multiple systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CRM&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;WhatsApp&lt;/li&gt;
&lt;li&gt;Supplier confirmations&lt;/li&gt;
&lt;li&gt;Flight updates&lt;/li&gt;
&lt;li&gt;Hotel vouchers&lt;/li&gt;
&lt;li&gt;Transfer schedules&lt;/li&gt;
&lt;li&gt;Customer preferences&lt;/li&gt;
&lt;li&gt;Internal spreadsheets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem isn't lack of data.&lt;br&gt;
It's that every piece of information lives somewhere different.&lt;br&gt;
Humans become the integration layer.&lt;br&gt;
That doesn't scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Shift: From AI Assistants to AI Operators&lt;/strong&gt;&lt;br&gt;
Most AI assistants work like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Question
        ↓
Large Language Model
        ↓
Answer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Useful?&lt;br&gt;
Absolutely.&lt;br&gt;
Finished?&lt;br&gt;
Not even close.&lt;br&gt;
An AI operator looks different:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Booking received
        ↓
Verify traveler profile
        ↓
Check supplier confirmations
        ↓
Monitor flights
        ↓
Detect risks
        ↓
Notify operations
        ↓
Rebook if required
        ↓
Update CRM
        ↓
Learn from outcome
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice something?&lt;br&gt;
The user may never even talk to the AI.&lt;br&gt;
The work simply gets done.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Memory Changes Everything&lt;/strong&gt;&lt;br&gt;
One capability I believe remains underrated is persistent operational memory.&lt;br&gt;
Most AI forgets everything after the conversation ends.&lt;br&gt;
Operations cannot.&lt;br&gt;
Imagine an agent remembering that a traveler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;always prefers aisle seats,&lt;/li&gt;
&lt;li&gt;avoids overnight layovers,&lt;/li&gt;
&lt;li&gt;celebrates anniversaries while travelling,&lt;/li&gt;
&lt;li&gt;requires vegetarian meals,&lt;/li&gt;
&lt;li&gt;usually books airport transfers after landing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now imagine it applying those preferences automatically across future bookings.&lt;br&gt;
No prompts.&lt;br&gt;
No repeated instructions.&lt;br&gt;
Just accumulated operational knowledge.&lt;br&gt;
That's where autonomous systems begin to create real value.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building Hermes TravelOps&lt;/strong&gt;&lt;br&gt;
This idea led me to build &lt;a href="https://github.com/tourswithchris/hermes-travel-ops-native" rel="noopener noreferrer"&gt;&lt;strong&gt;Hermes TravelOps&lt;/strong&gt;&lt;/a&gt;—an autonomous operations agent for travel businesses.&lt;br&gt;
The goal wasn't another chatbot.&lt;br&gt;
The goal was something that behaves more like an experienced operations coordinator.&lt;br&gt;
An ideal operational agent should be able to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;monitor bookings continuously,&lt;/li&gt;
&lt;li&gt;detect potential disruptions before customers notice,&lt;/li&gt;
&lt;li&gt;preserve organizational knowledge,&lt;/li&gt;
&lt;li&gt;coordinate multiple workflows,&lt;/li&gt;
&lt;li&gt;improve after every completed trip.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The interesting engineering challenge isn't generating text.&lt;br&gt;
It's designing systems that remember, observe, decide, and execute safely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hard Part Isn't AI&lt;/strong&gt;&lt;br&gt;
Ironically, the hardest part hasn't been prompting large language models.&lt;br&gt;
It's engineering everything around them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;state management,&lt;/li&gt;
&lt;li&gt;workflow orchestration,&lt;/li&gt;
&lt;li&gt;memory,&lt;/li&gt;
&lt;li&gt;event handling,&lt;/li&gt;
&lt;li&gt;recovery from failures,&lt;/li&gt;
&lt;li&gt;trust,&lt;/li&gt;
&lt;li&gt;human approval when needed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The intelligence isn't a single model.&lt;br&gt;
It's the architecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Where I Think Travel Tech Is Heading&lt;/strong&gt;&lt;br&gt;
Over the next few years, I expect travel companies to rely less on dashboards and more on autonomous operational systems.&lt;br&gt;
Instead of logging into ten different platforms every morning, operations teams may simply review:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Here's what happened overnight.&lt;br&gt;
Here are the issues already resolved.&lt;br&gt;
Here are the three decisions that still require human approval."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That changes the role of operations from reacting to supervising.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'm Curious What Others Think&lt;/strong&gt;&lt;br&gt;
If you're building with AI or working in travel operations, I'd love your perspective.&lt;br&gt;
A few questions to start the discussion:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Where do you see the biggest operational bottleneck today?&lt;br&gt;
Would you trust an autonomous agent to handle customer bookings if every action were fully auditable?&lt;br&gt;
What's the biggest challenge you've encountered when moving from AI demos to production systems?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I'm especially interested in hearing from engineers, travel operators, and founders building systems that go beyond chat.&lt;br&gt;
The next generation of AI may not be the one that talks the best.&lt;br&gt;
It may be the one that quietly gets the work done.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
      <category>productivity</category>
      <category>agents</category>
    </item>
    <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>
