<?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: hassanismailtech</title>
    <description>The latest articles on DEV Community by hassanismailtech (@hassanismailtech).</description>
    <link>https://dev.to/hassanismailtech</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%2F562903%2Fcb36d0bc-a3a4-4e87-8c71-a748e06987e2.jpg</url>
      <title>DEV Community: hassanismailtech</title>
      <link>https://dev.to/hassanismailtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hassanismailtech"/>
    <language>en</language>
    <item>
      <title>Ghost in the Machine: Building an Open-Source Privacy Boundary for AI Agents</title>
      <dc:creator>hassanismailtech</dc:creator>
      <pubDate>Sat, 31 Oct 2026 22:52:30 +0000</pubDate>
      <link>https://dev.to/hassanismailtech/ghost-in-the-machine-building-an-open-source-privacy-boundary-for-ai-agents-5gmm</link>
      <guid>https://dev.to/hassanismailtech/ghost-in-the-machine-building-an-open-source-privacy-boundary-for-ai-agents-5gmm</guid>
      <description>&lt;p&gt;AI agents are useful precisely where the stakes are high: customer support, financial operations, clinical workflows, and internal tooling.&lt;/p&gt;

&lt;p&gt;That is also where they can accidentally send the wrong thing to an external model.&lt;/p&gt;

&lt;p&gt;A bank-transfer agent may receive a customer’s name, phone number, account number, BVN, or NIN. A support agent may handle email addresses and sensitive tool results. Most AI integrations still treat the model request as the boundary: collect data, serialize it, send it upstream.&lt;/p&gt;

&lt;p&gt;I wanted to invert that assumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aegis is an open-source, inspectable data boundary for AI agents handling Nigerian identifiers.&lt;/strong&gt; It sits between an application and an AI provider. Before a request leaves the application, Aegis’s &lt;strong&gt;Scrubber&lt;/strong&gt; replaces detected sensitive values with session-stable &lt;strong&gt;Placeholders&lt;/strong&gt;. The external &lt;strong&gt;Upstream&lt;/strong&gt; sees only those Placeholders. When the response returns, the &lt;strong&gt;Reinjector&lt;/strong&gt; restores known values for the calling application.&lt;/p&gt;

&lt;p&gt;The goal is not to claim magic privacy or perfect detection. It is to reduce unnecessary data exposure while leaving evidence of what crossed the boundary.&lt;/p&gt;

&lt;p&gt;This is the first public open-source release of Aegis under Apache-2.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ghost I wanted to make visible
&lt;/h2&gt;

&lt;p&gt;The “Ghost in the Machine” theme made me think about the data that silently follows an AI agent through a workflow.&lt;/p&gt;

&lt;p&gt;An agent can look harmless on screen:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Please initiate a transfer for this customer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But that sentence may carry identity data in the message body, an assistant tool-call argument, and later a tool result. If the agent sends all of it directly to a model provider, the sensitive information becomes invisible infrastructure: present in the request, absent from the product story, and difficult to inspect afterward.&lt;/p&gt;

&lt;p&gt;Aegis makes that boundary visible.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent or application
        |
        v
     Aegis Proxy
        |
        +--&amp;gt; Scrubber --&amp;gt; Session Map
        |
        v
External Upstream receives Placeholders only
        |
        v
    Reinjector
        |
        v
Agent receives a usable response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical distinction is that Aegis is not an irreversible redaction tool. An agent may still need a name or account number to complete a local workflow. Instead, Aegis uses a short-lived &lt;strong&gt;Session Map&lt;/strong&gt; to preserve a controlled association between an original value and its Placeholder for the current conversation.&lt;/p&gt;

&lt;p&gt;For example, an external model can receive:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initiate a transfer to [[PERSON_1]] using [[ACCOUNT_NO_1]].
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The caller can still receive a coherent response after the Reinjector resolves known Placeholders. The external model never needs the original values to reason about the transfer flow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Nigerian identifiers need first-class support
&lt;/h2&gt;

&lt;p&gt;Generic PII tooling is useful, but production systems are contextual.&lt;/p&gt;

&lt;p&gt;Aegis starts with a detector pack for Nigerian data patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phone numbers, including common &lt;code&gt;+234&lt;/code&gt;, &lt;code&gt;234&lt;/code&gt;, and local forms&lt;/li&gt;
&lt;li&gt;BVNs&lt;/li&gt;
&lt;li&gt;NINs&lt;/li&gt;
&lt;li&gt;Account numbers&lt;/li&gt;
&lt;li&gt;Email addresses&lt;/li&gt;
&lt;li&gt;PERSON entities, using a Nigerian name gazetteer and local GLiNER detection&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The detector is deliberately layered:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pattern rules identify structured values.&lt;/li&gt;
&lt;li&gt;A gazetteer catches known Nigerian naming patterns.&lt;/li&gt;
&lt;li&gt;A local GLiNER model finds PERSON entities the earlier layers miss.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Overlapping matches are merged, with the longest match winning. A repeated original value receives the same Placeholder within a Session, which matters when an agent sees a customer in one turn and uses a tool in the next.&lt;/p&gt;

&lt;p&gt;The open-source AI component is central here, not decorative. GLiNER performs local entity detection inside the Scrubber before a request is sent to an external Upstream. Aegis uses open tooling to decide what must not leave the building in its original form.&lt;/p&gt;

&lt;h2&gt;
  
  
  The hard part: agents do more than chat
&lt;/h2&gt;

&lt;p&gt;A text-only demo would have been easy to make look convincing. Real agents made the problem more interesting.&lt;/p&gt;

&lt;p&gt;Aegis scrubs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Message text&lt;/li&gt;
&lt;li&gt;Assistant tool-call arguments&lt;/li&gt;
&lt;li&gt;Tool-result content&lt;/li&gt;
&lt;li&gt;OpenAI-compatible streaming responses&lt;/li&gt;
&lt;li&gt;Anthropic Messages API content and tool inputs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That means the boundary follows data through the places where agents actually move it.&lt;/p&gt;

&lt;p&gt;A normal client integration remains intentionally small:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;openai&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;OpenAI&lt;/span&gt;

&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;OpenAI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;base_url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;http://127.0.0.1:8000/v1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;your-upstream-key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application points its client at Aegis. Aegis forwards a scrubbed request to the configured Upstream and returns a reinjected response where possible.&lt;/p&gt;

&lt;p&gt;The same principle applies to streaming. Placeholders can be split across chunks, so Aegis uses a bounded hold-back buffer before reinjecting stream content. It does not assume that one network chunk contains one complete Placeholder.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I chose not to promise
&lt;/h2&gt;

&lt;p&gt;Privacy software earns trust by being explicit about its failure modes.&lt;/p&gt;

&lt;p&gt;Aegis does &lt;strong&gt;not&lt;/strong&gt; guarantee that every sensitive value will be detected. It does &lt;strong&gt;not&lt;/strong&gt; make a data transfer lawful by itself. It does &lt;strong&gt;not&lt;/strong&gt; claim “zero retention,” “zero knowledge,” or perfect recall.&lt;/p&gt;

&lt;p&gt;Instead, it follows two conservative rules:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If the Scrubber or Session Map fails before an Upstream request, the request is blocked.&lt;/li&gt;
&lt;li&gt;If reinjection cannot recover a Placeholder because the Session Map has expired or Redis has restarted, the response keeps the unresolved Placeholder rather than guessing a value.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That second choice can be inconvenient for an agent. It is also safer than manufacturing identity data.&lt;/p&gt;

&lt;p&gt;The Session Map is intentionally ephemeral: Redis persistence and volumes are disabled in the supplied local stack, and its default sliding TTL is 300 seconds. That does not control an Upstream provider’s own retention policy; it simply prevents Aegis from turning temporary mapping state into a permanent database.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the boundary inspectable
&lt;/h2&gt;

&lt;p&gt;A privacy boundary should be testable, not merely asserted.&lt;/p&gt;

&lt;p&gt;Aegis provides a &lt;strong&gt;Wire Tap&lt;/strong&gt; that records what the Upstream received after scrubbing. It never exposes pre-scrub request text or Session Map contents. Safe telemetry records counts, types, timings, IDs, and request status without recording sensitive bodies.&lt;/p&gt;

&lt;p&gt;The included dashboard can show:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detected-entity totals by type&lt;/li&gt;
&lt;li&gt;Proxy overhead&lt;/li&gt;
&lt;li&gt;Live safe telemetry&lt;/li&gt;
&lt;li&gt;A selected Wire View of the post-scrub request sent Upstream&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The demo uses synthetic data and a local mock Upstream. It is designed to make the contrast visible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AGENT SAW:
  synthetic customer details

UPSTREAM SAW:
  [[PERSON_1]], [[BVN_1]], [[PHONE_1]], ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the moment I wanted the project to create: the agent remains useful, but the “ghost” of raw identity data is no longer silently travelling across the network boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  Evidence, not a victory lap
&lt;/h2&gt;

&lt;p&gt;I measured Aegis on a project-authored, held-out synthetic evaluation set of 220 sentences and 500 labelled entities.&lt;/p&gt;

&lt;p&gt;Here are the results:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Measure&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;Total recall&lt;/td&gt;
&lt;td&gt;98.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total precision&lt;/td&gt;
&lt;td&gt;80.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PERSON recall&lt;/td&gt;
&lt;td&gt;96.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PERSON precision&lt;/td&gt;
&lt;td&gt;61.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured entity recall in this synthetic set&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Leak-test result&lt;/td&gt;
&lt;td&gt;0 of 35 planted entities reached the mock Upstream&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Those numbers need context.&lt;/p&gt;

&lt;p&gt;The evaluation set is synthetic and project-authored, not an independent audit. PERSON precision is intentionally lower because Aegis prefers over-redaction to silently passing a likely sensitive name onward. The leak test uses the project’s own prompts, not adversarial third-party penetration testing.&lt;/p&gt;

&lt;p&gt;Performance also depends on the path taken. On the development laptop, the pattern layer’s 60-word p50 was about 0.15–0.22 ms. Cold local model detection was much more expensive roughly 350–440 ms p50 on a 60-word prompt and long text can exceed the default two-second model timeout, which blocks the request rather than sending unscreened text Upstream. Cached and skipped model calls were far faster, around 0.4 ms p50.&lt;/p&gt;

&lt;p&gt;That trade-off is the project’s real engineering tension: protect first, measure honestly, and fail closed when the protection layer cannot make a safe decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open innovation matters here
&lt;/h2&gt;

&lt;p&gt;Aegis is open source because a privacy boundary should be inspectable by the people who depend on it.&lt;/p&gt;

&lt;p&gt;Users should be able to examine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What patterns are recognized&lt;/li&gt;
&lt;li&gt;Which data reaches the Upstream&lt;/li&gt;
&lt;li&gt;How Placeholders are created and restored&lt;/li&gt;
&lt;li&gt;How failures behave&lt;/li&gt;
&lt;li&gt;How measured recall and latency were produced&lt;/li&gt;
&lt;li&gt;What the project does not claim&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The system can run with a local mock Upstream for demonstration and testing, and its detection layer uses local open-source tooling. That makes it possible to inspect the actual boundary rather than accept a black-box promise about it.&lt;/p&gt;

&lt;p&gt;For organisations handling Nigerian identifiers, open innovation is not only about being able to modify source code. It is about being able to ask a precise question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“What exactly left our environment?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Aegis is my attempt to make that answer concrete.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it locally
&lt;/h2&gt;

&lt;p&gt;The repository includes a Docker Compose stack with Aegis, Redis, and a mock Upstream:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/hassanismailtech/Aegis.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Aegis
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env
docker compose up &lt;span class="nt"&gt;--build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then run the test suite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run &lt;span class="nt"&gt;--directory&lt;/span&gt; backend pytest &lt;span class="nt"&gt;-q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the held-out synthetic evaluation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run &lt;span class="nt"&gt;--directory&lt;/span&gt; backend python scripts/eval_heldout.py &lt;span class="nt"&gt;--floor&lt;/span&gt; 0.85
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And for the benchmark:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uv run &lt;span class="nt"&gt;--directory&lt;/span&gt; backend python scripts/bench_scrub.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please use synthetic data in local demos. Do not put real customer, banking, health, or identity data into a public test environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;Aegis is not finished, and that is part of why I am releasing it openly.&lt;/p&gt;

&lt;p&gt;The next useful work is not to make broader privacy claims. It is to improve the evidence:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent evaluation data and review&lt;/li&gt;
&lt;li&gt;More language and regional entity packs&lt;/li&gt;
&lt;li&gt;Better calibration for PERSON over-redaction&lt;/li&gt;
&lt;li&gt;Clear deployment guidance for in-country or customer-controlled environments&lt;/li&gt;
&lt;li&gt;More adversarial leak testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you build agent systems that touch sensitive data, I would value the most specific feedback possible: what data shape would your agent accidentally send, and how would you want the boundary to behave?&lt;/p&gt;

&lt;p&gt;Source code, tests, synthetic evaluation, and documentation are available in the &lt;a href="https://github.com/hassanismailtech/Aegis" rel="noopener noreferrer"&gt;Aegis repository&lt;/a&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  References and acknowledgement
&lt;/h3&gt;

&lt;p&gt;The wider community is actively exploring PII minimisation and privacy boundaries for AI systems. Two useful perspectives while building Aegis were:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;saaro, “&lt;a href="https://dev.to/saaro_net/presidio-2026-pii-detection-and-anonymization-for-gdpr-compliant-ai-pipelines-4441"&gt;Presidio 2026: PII Detection and Anonymization for GDPR-Compliant AI Pipelines&lt;/a&gt;”&lt;/li&gt;
&lt;li&gt;Teo Crispin, “&lt;a href="https://dev.to/trustboost/building-an-information-firewall-for-ai-agents-2gca"&gt;Building an Information Firewall for AI Agents&lt;/a&gt;”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aegis takes a different approach: Nigerian-aware detection, session-stable reversible Placeholders, coverage for tool calls and tool results, and a Wire Tap that makes the post-scrub Upstream boundary reviewable.&lt;/p&gt;

</description>
      <category>hf26challenge</category>
      <category>ai</category>
      <category>opensource</category>
      <category>privacy</category>
    </item>
    <item>
      <title>I built a campus notice-to-calendar workflow that refuses to pretend AI is the source of truth!</title>
      <dc:creator>hassanismailtech</dc:creator>
      <pubDate>Sat, 31 Oct 2026 22:10:06 +0000</pubDate>
      <link>https://dev.to/hassanismailtech/i-built-a-campus-notice-to-calendar-workflow-that-refuses-to-pretend-ai-is-the-source-of-truth-3267</link>
      <guid>https://dev.to/hassanismailtech/i-built-a-campus-notice-to-calendar-workflow-that-refuses-to-pretend-ai-is-the-source-of-truth-3267</guid>
      <description>&lt;p&gt;&lt;em&gt;CampusSync turns a user-supplied campus notice into a reviewable calendar action while keeping evidence, uncertainty, and verification honest.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I built a campus notice-to-calendar workflow that refuses to pretend AI is the source of truth
&lt;/h2&gt;

&lt;p&gt;At LASUCOM, an important academic update can arrive as a paragraph in a busy group chat, an image flyer, or a paper notice that someone photographs and forwards. That is normal. The problem is that a date buried in that flow is easy to miss—and turning it into a reliable calendar action is still manual work.&lt;/p&gt;

&lt;p&gt;I built &lt;strong&gt;CampusSync&lt;/strong&gt; at Hacktoberfest Hack Day Ikeja × Build54 &amp;amp; LASUCOM to make that one step easier:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A student supplies a campus notice. CampusSync turns it into a reviewable, calendar-ready action—without pretending that an AI model is the institution.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The project is open source under the MIT License: &lt;a href="https://github.com/hassanismailtech/campusync" rel="noopener noreferrer"&gt;github.com/hassanismailtech/campusync&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;It is also deployed with a real inference path. The primary route uses &lt;strong&gt;Gemma 4 inference hosted on DigitalOcean&lt;/strong&gt;, funded with MLH credits, and it falls back to &lt;strong&gt;OpenRouter&lt;/strong&gt; when the primary provider is unavailable. Both provider tokens live only in Vercel environment variables; the browser never receives them.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem was not “we need another feed”
&lt;/h2&gt;

&lt;p&gt;The obvious first idea is a better announcement feed. I think that misses the actual pain.&lt;/p&gt;

&lt;p&gt;Students are often already surrounded by notices. The failure happens between &lt;em&gt;seeing&lt;/em&gt; a message and &lt;em&gt;acting&lt;/em&gt; on it. An exam time, a dues deadline, a posting, or an association event may exist, but it lives in a format that is hard to search, filter, or put in a calendar.&lt;/p&gt;

&lt;p&gt;The other failure is trust. A plain AI summary can sound more certain than the original notice. For a deadline or an assessment, that is the wrong trade-off. A useful system has to make it easy to check what it relied on—and clear that it has not magically verified the notice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The design rule: the Mirror Principle
&lt;/h2&gt;

&lt;p&gt;CampusSync follows one constraint that shaped every implementation choice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;CampusSync does not create news. It mirrors a user-supplied notice and preserves the evidence needed to review it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Each action is designed to retain a source excerpt, an explicit unverified state, and enough context for a student to decide whether to add it to a calendar. “Locally verified” means the user checked it; it does &lt;strong&gt;not&lt;/strong&gt; mean LASUCOM, a department, or an association officially verified it.&lt;/p&gt;

&lt;p&gt;That sounds like copywriting, but it changes the architecture:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No WhatsApp scraping or automated group ingestion.&lt;/li&gt;
&lt;li&gt;No claims that the product is an official LASUCOM channel or partner.&lt;/li&gt;
&lt;li&gt;No server-side storage of raw notice content in this hackathon build.&lt;/li&gt;
&lt;li&gt;No fallback that quietly invents an extraction when the model is unavailable.&lt;/li&gt;
&lt;li&gt;Fictional/sample data is visibly labelled rather than presented as real notices.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The working local experience includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a Vite/JavaScript dashboard for notice capture, a feed, an exam tracker, and a searchable LASUCOM-focused directory;&lt;/li&gt;
&lt;li&gt;text capture with input validation and client-side flyer preview;&lt;/li&gt;
&lt;li&gt;browser-local drafts and local filtering;&lt;/li&gt;
&lt;li&gt;Google Calendar links and RFC 5545 &lt;code&gt;.ics&lt;/code&gt; export for &lt;code&gt;Africa/Lagos&lt;/code&gt;; and&lt;/li&gt;
&lt;li&gt;a serverless extraction route that is wired for Gemma-capable providers through server-only credentials.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The directory intentionally does not manufacture contact details: entries use &lt;strong&gt;“Contact information to be confirmed.”&lt;/strong&gt; That is a small choice, but it reflects the larger one: a credible information tool should be comfortable saying “I do not know.”&lt;br&gt;
&lt;/p&gt;

&lt;pre data-lang="mermaid"&gt;&lt;code&gt;flowchart LR
  A[User-supplied text or flyer] --&amp;gt; B[Validate and preview in browser]
  B --&amp;gt; C{Secure provider configured?}
  C --&amp;gt;|Yes| D[Server-side extraction request]
  C --&amp;gt;|No| E[Fail closed with a clear message]
  D --&amp;gt; F[Unverified local draft]
  F --&amp;gt; G[Evidence-aware review]
  G --&amp;gt; H[Google Calendar or .ics export]&lt;/code&gt;&lt;/pre&gt;



&lt;h2&gt;
  
  
  A real AI path, with a failure mode I can explain
&lt;/h2&gt;

&lt;p&gt;Messy flyers and informal campus language are not a rules-engine problem. CampusSync sends a user-supplied notice to a serverless Vercel route. The route calls &lt;strong&gt;DigitalOcean’s hosted Gemma 4 inference&lt;/strong&gt; first; if that request fails, it tries an &lt;strong&gt;OpenRouter Gemma&lt;/strong&gt; fallback. The response is constrained to a structured draft, not treated as a verified notice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
  → Vercel /api/extract
      → DigitalOcean Gemma 4 (primary)
      → OpenRouter Gemma (fallback)
  → unverified draft for human review
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The keys are Vercel server-side environment variables. They are not &lt;code&gt;VITE_&lt;/code&gt; variables, not bundled into the client, and not committed to Git. The route also has a deliberate failure mode: if neither provider succeeds, it returns an error stating that the notice has &lt;strong&gt;not&lt;/strong&gt; been analysed. It does not fabricate a result just to make a demo feel smooth.&lt;/p&gt;

&lt;p&gt;That matters to me more than a flashy “AI worked” screen. Gemma is not a decorative chatbot in this project: it is the component that converts messy language into a usable draft. Its open-weight model family also keeps the architecture replaceable and creates a credible future path for an institution to host inference under its own controls. But the model is only one part of the product. The practical value comes from the workflow around it: capture, evidence, review, local filtering, and calendar output.&lt;/p&gt;

&lt;h2&gt;
  
  
  The access-control foundation is already there
&lt;/h2&gt;

&lt;p&gt;CampusSync is currently useful without making every student create an account. When a person needs to contribute or manage content, Supabase provides the live authentication path: &lt;strong&gt;Google OAuth&lt;/strong&gt; and email magic links are wired into the client.&lt;/p&gt;

&lt;p&gt;The Supabase schema defines the building blocks for a responsible publishing workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;profiles&lt;/code&gt; for the user’s campus context;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;organizations&lt;/code&gt; for departments, associations, and other publishers;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;user_roles&lt;/code&gt; for &lt;code&gt;admin&lt;/code&gt;, &lt;code&gt;moderator&lt;/code&gt;, and &lt;code&gt;org_rep&lt;/code&gt; roles;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;announcements&lt;/code&gt; and &lt;code&gt;exam_schedules&lt;/code&gt; as separate data models; and&lt;/li&gt;
&lt;li&gt;Row Level Security policies that constrain who can read, create, update, or delete sensitive content.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;An organization representative, for example, is not meant to have universal publishing power. The authorization helpers check the authenticated user’s role and organization before allowing changes. This is the foundation for a future where publishing is accountable instead of simply “anyone with a login can post.”&lt;/p&gt;

&lt;p&gt;The important distinction is still the Mirror Principle: authentication controls &lt;em&gt;who may publish&lt;/em&gt;, but it does not turn an unverified AI draft into an official institutional fact.&lt;/p&gt;

&lt;h2&gt;
  
  
  A technical detail I did not want to get wrong: time zones
&lt;/h2&gt;

&lt;p&gt;Calendar bugs are quiet. A correctly extracted 9:00 AM exam can become a 10:00 AM appointment if an &lt;code&gt;.ics&lt;/code&gt; file is incorrectly treated as UTC.&lt;/p&gt;

&lt;p&gt;CampusSync emits local floating date-times and writes &lt;code&gt;X-WR-TIMEZONE:Africa/Lagos&lt;/code&gt; into its calendar output. Deadline-only records become all-day events. The test suite also checks that the generated &lt;code&gt;DTSTART&lt;/code&gt; is not silently suffixed with &lt;code&gt;Z&lt;/code&gt;, which would shift the time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;lines&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;BEGIN:VCALENDAR&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;VERSION:2.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;X-WR-TIMEZONE:Africa/Lagos&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is not the most glamorous part of the build, but it is the kind of correctness users notice exactly when it fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I tested the smallest claims I could make
&lt;/h2&gt;

&lt;p&gt;I kept the checks aligned with what the repository actually promises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;text-length validation;&lt;/li&gt;
&lt;li&gt;calendar generation for timed and deadline-only items;&lt;/li&gt;
&lt;li&gt;Africa/Lagos calendar links;&lt;/li&gt;
&lt;li&gt;the fail-closed behavior when provider configuration is absent;&lt;/li&gt;
&lt;li&gt;six directory categories and 60+ directory entries; and&lt;/li&gt;
&lt;li&gt;a guard against invented contact details.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is not a clinical accuracy study. It is a testable baseline for a live, review-first workflow and a guard against silently degrading to invented output.&lt;/p&gt;

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

&lt;p&gt;I started with “can we extract dates from campus notices?” and ended with a more useful question: &lt;strong&gt;what should a system do when it might be wrong?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For a high-stakes notice, a confident answer is not enough. The user needs to see the source words, understand what is uncertain, and stay in control of the final calendar action. In other words, the trust layer is not decoration around an AI feature, it is the product decision.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a campus tool to a customisable campus operating layer
&lt;/h2&gt;

&lt;p&gt;The grand ambition is larger than a notice reader. CampusSync could become a &lt;strong&gt;customisable campus operating layer&lt;/strong&gt;: an open-source core that each institution configures for its own faculties, organizations, academic calendar, verification practices, and channels.&lt;/p&gt;

&lt;p&gt;Moodle is a useful inspiration here not because CampusSync wants to replace an LMS, but because an extensible open-source core can be adapted to radically different local institutions. CampusSync’s equivalent would be much narrower and more action-oriented: transform fragmented information into accountable, personalised next steps.&lt;/p&gt;

&lt;p&gt;That future platform could support modules for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verified notice publishing and source-memo evidence;&lt;/li&gt;
&lt;li&gt;organization- and cohort-specific feeds;&lt;/li&gt;
&lt;li&gt;revision history when a date, venue, or deadline changes;&lt;/li&gt;
&lt;li&gt;calendar and reminder integrations;&lt;/li&gt;
&lt;li&gt;opportunity tracking for scholarships, grants, and hackathons; and&lt;/li&gt;
&lt;li&gt;approved connections to LMS or student-information systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The point is not to build all of that now. The point is to make today’s smallest useful workflow extensible without pretending it is already a campus-wide operating system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What comes next
&lt;/h2&gt;

&lt;p&gt;The next step is not to claim that CampusSync is an official campus system. It is to test a small, consent-based pilot with students and class representatives.&lt;/p&gt;

&lt;p&gt;Before an institutional rollout, the project still needs a named owner, an approved publishing workflow, a privacy review, and clear operating responsibility. The technical foundation, live inference, authentication, roles, and RLS reduces the distance to that pilot; it does not replace institutional approval.&lt;/p&gt;

&lt;p&gt;The metric I want to earn is simple: &lt;strong&gt;how many campus notices become real calendar actions each week?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every campus runs on messages. CampusSync is an attempt to turn those messages into actions students can review and trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Source code: &lt;a href="https://github.com/hassanismailtech/campusync" rel="noopener noreferrer"&gt;github.com/hassanismailtech/campusync&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Local setup and project boundaries: &lt;a href="https://github.com/hassanismailtech/campusync#readme" rel="noopener noreferrer"&gt;README&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;License: MIT&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Further reading
&lt;/h2&gt;

&lt;p&gt;The build sits in a wider conversation about provenance and review in AI-enabled systems. These DEV posts helped sharpen the framing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/meaartist/building-trustworthy-ai-powered-digital-archives-why-human-review-and-data-portability-matter-1gil"&gt;Building Trustworthy AI-Powered Digital Archives: Why Human Review and Data Portability Matter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/p0rt/trust-isnt-a-scalar-typed-provenance-for-agent-chains-229p"&gt;Trust Isn't a Scalar: Typed Provenance for Agent Chains&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you have built for a context where a wrong AI answer can hurt someone, I would love to hear how you designed the human review step.&lt;/p&gt;

</description>
      <category>mlhacks</category>
      <category>devchallenge</category>
      <category>hackathon</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building My First Creao AI Agent: Notes from a Curious Med Student</title>
      <dc:creator>hassanismailtech</dc:creator>
      <pubDate>Thu, 05 Mar 2026 02:37:16 +0000</pubDate>
      <link>https://dev.to/hassanismailtech/building-my-first-creao-ai-agent-notes-from-a-curious-med-student-347</link>
      <guid>https://dev.to/hassanismailtech/building-my-first-creao-ai-agent-notes-from-a-curious-med-student-347</guid>
      <description>&lt;p&gt;I was intrigued when someone in a WhatsApp group said, "We're going to build AI agents this weekend. "My honest first reaction was: cool, I have always been curious to build this, so why not.&lt;/p&gt;

&lt;p&gt;And it turned out to be very much more than I thought. Here's what I learned and why I think the AI agent era is more important than most people realise.&lt;/p&gt;




&lt;h2&gt;
  
  
  First, a Quick History Lesson (Bear With Me)
&lt;/h2&gt;

&lt;p&gt;We've had "AI" in our pockets for years. Siri. Alexa. Google Assistant. They were impressive the first time you asked one what the weather was or to set a reminder. Then you realised they couldn't do much beyond that without breaking down.&lt;/p&gt;

&lt;p&gt;Then came workflow automation, tools like Zapier, Make, and n8n. The idea was beautiful: if X happens, automatically do Y. No code needed. This genuinely multiplied productivity for a lot of people. But it was brittle. Change one thing in the pipeline and the whole thing collapses. Automation is obedient, not intelligent.&lt;/p&gt;

&lt;p&gt;Then Large Language Models arrived, and everything shifted.&lt;/p&gt;

&lt;p&gt;Not because they're smarter than humans (that debate can wait). But because for the first time, the gap between "having an idea" and "having a working thing" became tiny. You don't need to know how to code an API call. You describe what you want, and the model figures out the execution.&lt;/p&gt;

&lt;p&gt;That's the setup. Now here's where it got real for me.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Agent I Built (And What It Actually Does)
&lt;/h2&gt;

&lt;p&gt;During the community training session run by a trainer on Creao AI, the lesson was to build a Telegram bot that automatically finds news and sends it to a chat, no manual searching, no copying and pasting, no formatting.&lt;/p&gt;

&lt;p&gt;I followed the steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Created a Telegram bot via BotFather, got my API token&lt;/li&gt;
&lt;li&gt;Got my Chat ID from a user ID bot&lt;/li&gt;
&lt;li&gt;Pasted a structured prompt into Creao.AI with my token, chat ID, and topic filled in&lt;/li&gt;
&lt;li&gt;Ran it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It worked. The agent searched Google News, pulled two fresh stories, summarised them in plain English, formatted everything neatly, and posted directly to my Telegram on its own.&lt;/p&gt;

&lt;p&gt;But here's what I actually did with that knowledge:&lt;/p&gt;

&lt;p&gt;I adapted it into the Webibyte ByteTips Bot.&lt;/p&gt;

&lt;p&gt;Instead of generic news, my bot finds fresh bite-sized tech tips relevant to my startup's audience, developers, digital marketers, and small business owners in Nigeria and delivers them to a Telegram channel automatically. It's branded. It's useful. It runs while I'm doing personal studies.&lt;/p&gt;

&lt;p&gt;That's the part that still gets me. A workflow that would have taken me 2–3 hours of manual research, writing, and posting &lt;em&gt;runs itself.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  I Also Automated Gmail to WhatsApp
&lt;/h2&gt;

&lt;p&gt;The trainer also walked us through connecting Gmail responses to WhatsApp. I ran that one as-is, without modification, and it worked exactly as described.&lt;/p&gt;

&lt;p&gt;Two agents. Two evenings. No code written.&lt;/p&gt;

&lt;p&gt;I want to be careful not to oversell this. I didn't build something from scratch. I followed a structured tutorial, filled in my credentials, and understood what each part was doing. But that's also kind of the point, the barrier is now low enough that understanding the concept IS enough to build something real.&lt;/p&gt;




&lt;h2&gt;
  
  
  So What Is an AI Agent, Actually?
&lt;/h2&gt;

&lt;p&gt;Here's the simplest, honest answer I can give:&lt;/p&gt;

&lt;p&gt;A standard AI interaction is a transaction. You ask → it answers. Done.&lt;/p&gt;

&lt;p&gt;An AI agent is a loop. You give it a goal → it plans → it uses tools → it acts → it evaluates → it adjusts. Over and over, without you approving each step.&lt;/p&gt;

&lt;p&gt;The components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A reasoning core&lt;/strong&gt; (the LLM doing the thinking)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tools&lt;/strong&gt; (APIs, browsers, databases, etc., whatever the agent can call)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory&lt;/strong&gt; (short-term for the current task, long-term for persistent context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action execution&lt;/strong&gt; (actually doing the thing in the world)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Feedback&lt;/strong&gt; (evaluating what happened and adapting)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What makes this different from automation is the reasoning layer. An automation fails when it hits something unexpected. An agent tries to work around it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters More
&lt;/h2&gt;

&lt;p&gt;In Nigeria, for instance, the physician-to-patient ratio is critical. Administrative burden on medical staff is enormous. A lot of knowledge work that could be automated is still done manually, not because people don't know better, but because the tools either didn't exist or required expertise that most people don't have.&lt;/p&gt;

&lt;p&gt;AI agents can change that math.&lt;/p&gt;

&lt;p&gt;As a medical student and web developer. I don't have the hours to manually curate and post content, monitor industry news, AND still do my personal study. Agents give me leverage I couldn't otherwise afford.&lt;/p&gt;

&lt;p&gt;And crucially, I believe the most powerful agents will not be built by the best engineers. They'll be built by people who most deeply understand the problem they're solving. A cardiologist building a clinical triage agent will out-build a generalist developer every time. My understanding of health communication in Nigeria is an asset in this space, not an afterthought.&lt;/p&gt;

&lt;p&gt;That's democratising in a way that feels real, not theoretical.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'm Watching Next
&lt;/h2&gt;

&lt;p&gt;A few developments I'm genuinely tracking:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-agent systems&lt;/strong&gt;: where specialised agents hand off tasks to each other. One agent researches, another writes, and another reviews. This is where things get interesting for complex knowledge work.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Persistent memory&lt;/strong&gt;: agents that remember context across sessions, accumulating knowledge about you, your preferences, and your ongoing projects. Right now, most agents are stateless. That's changing fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents in African healthcare&lt;/strong&gt;: structuring patient data, flagging anomalies, generating referrals, monitoring disease signals. The clinical and public health applications here are enormous and largely unbuilt.&lt;/p&gt;




&lt;h2&gt;
  
  
  One Honest Caveat
&lt;/h2&gt;

&lt;p&gt;Security matters more than people admit in beginner agent tutorials.&lt;/p&gt;

&lt;p&gt;Your bot token is a credential. Your Chat ID is sensitive. Any agent that authenticates with a third-party service needs those credentials to be kept private.&lt;/p&gt;

&lt;p&gt;This isn't advanced knowledge. It's foundational. Treat it that way from day one.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;AI agents aren't just smarter chatbots, they plan, act, and iterate toward a goal&lt;/li&gt;
&lt;li&gt;I built two as a learner: a custom &lt;strong&gt;Webibyte ByteTips Bot&lt;/strong&gt; for Telegram and an automated &lt;strong&gt;Gmail-to-WhatsApp&lt;/strong&gt; pipeline&lt;/li&gt;
&lt;li&gt;The real barrier now is understanding the problem you want to solve, not understanding the code&lt;/li&gt;
&lt;li&gt;Domain expertise, clinical, cultural, and contextual is the actual competitive edge in the agentic era&lt;/li&gt;
&lt;li&gt;For builders in Africa, this isn't just exciting. It's strategic.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I'm Hassan Ismail, a medical student, web developer, WEBIBYTE founder, and someone working at the intersection of health and technology in Africa. Find me at &lt;a href="https://linkedin.com/in/hassanismailtech" rel="noopener noreferrer"&gt;@hassanismailtech&lt;/a&gt; or drop a comment below.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>beginners</category>
      <category>hassanismailtech</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>hassanismailtech</dc:creator>
      <pubDate>Mon, 16 Feb 2026 08:56:54 +0000</pubDate>
      <link>https://dev.to/hassanismailtech/-122j</link>
      <guid>https://dev.to/hassanismailtech/-122j</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/hassanismailtech" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F562903%2Fcb36d0bc-a3a4-4e87-8c71-a748e06987e2.jpg" alt="hassanismailtech"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/hassanismailtech/biosecure-cli-building-a-medical-command-center-in-32-minutes-with-github-copilot-agents-5h40" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;BioSecure CLI: Building a Medical Command Center in 32 Minutes with GitHub Copilot Agents&lt;/h2&gt;
      &lt;h3&gt;hassanismailtech ・ Feb 16&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#githubchallenge&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#cli&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#githubcopilot&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>BioSecure CLI: Building a Medical Command Center in 32 Minutes with GitHub Copilot Agents</title>
      <dc:creator>hassanismailtech</dc:creator>
      <pubDate>Mon, 16 Feb 2026 07:16:36 +0000</pubDate>
      <link>https://dev.to/hassanismailtech/biosecure-cli-building-a-medical-command-center-in-32-minutes-with-github-copilot-agents-5h40</link>
      <guid>https://dev.to/hassanismailtech/biosecure-cli-building-a-medical-command-center-in-32-minutes-with-github-copilot-agents-5h40</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/github-2026-01-21"&gt;GitHub Copilot CLI Challenge&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;I built &lt;strong&gt;BioSecure CLI&lt;/strong&gt;, a terminal-based "Medical Command Center" designed to solve three critical failures in the Nigerian primary healthcare supply chain:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Messy Patient Data:&lt;/strong&gt; A validator that automatically cleans and formats Nigerian phone numbers (e.g., converting &lt;code&gt;080...&lt;/code&gt; to &lt;code&gt;+234...&lt;/code&gt;) using Regex.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Slow Triage:&lt;/strong&gt; A clinical decision support tool that calculates BMI and flags Hypertensive Crises based on vitals.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Drug Stockouts:&lt;/strong&gt; A logistics engine that tracks vaccine inventory and triggers "Critical Low" alerts to prevent expiry and shortages.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This isn't just a script; it's a prototype for a &lt;strong&gt;Closed-Loop Health Ecosystem&lt;/strong&gt; intended to reduce drug "leakage" and improve patient outcomes in rural Nigeria.&lt;/p&gt;

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

&lt;p&gt;Here is the entire development lifecycle, from empty folder to production-ready MVP, captured in real-time.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. The Planning Phase (The "Architect")
&lt;/h3&gt;

&lt;p&gt;I didn't start by writing code. I started by telling the Agent my vision. I asked for a 3-module system for Triage, Validation, and Logistics.&lt;br&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%2Fshqg7u78ds8498u99j25.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%2Fshqg7u78ds8498u99j25.png" alt="Showing the " width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The Execution (The "Builder")
&lt;/h3&gt;

&lt;p&gt;The CLI Agent autonomously created the project structure, set up the Python virtual environment, and installed dependencies (&lt;code&gt;rich&lt;/code&gt;, &lt;code&gt;pytest&lt;/code&gt;). I didn't type a single &lt;code&gt;mkdir&lt;/code&gt; command.&lt;br&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%2Ffqq7updfs5pfsuz5k3c5.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%2Ffqq7updfs5pfsuz5k3c5.png" alt="Showing " width="800" height="335"&gt;&lt;/a&gt;
"/&amp;gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The Logic Generation
&lt;/h3&gt;

&lt;p&gt;I tasked the agent with complex logic, such as a "Phone Number Validator" for Nigerian formats. It wrote the code &lt;em&gt;and&lt;/em&gt; the tests simultaneously.&lt;br&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%2Fao5svfzf4mmt34n7r2a7.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%2Fao5svfzf4mmt34n7r2a7.png" alt="Showing " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The Result (32 Minutes Later)
&lt;/h3&gt;

&lt;p&gt;In exactly &lt;strong&gt;32 minutes and 47 seconds&lt;/strong&gt;, the Agent delivered a fully tested, documented, and operational CLI tool.&lt;br&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%2Ftfzl9micv967mx9xwwki.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%2Ftfzl9micv967mx9xwwki.png" alt="Showing " width="800" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/hassanismailtech/BioSecure-CLI.git" rel="noopener noreferrer"&gt;Link to Source Code on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;As a medical student, I usually find terminal environments intimidating. My experience with the new &lt;strong&gt;Agentic Copilot CLI&lt;/strong&gt; was transformative because it shifted my role from "Coder" to "Director."&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Autonomy:&lt;/strong&gt; I didn't have to look up syntax for the &lt;code&gt;rich&lt;/code&gt; library or &lt;code&gt;pytest&lt;/code&gt;. The agent knew what to install and how to use it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test-Driven Development (TDD):&lt;/strong&gt; The agent automatically wrote tests for every module (Triage, Logistics, Validator) before I even asked. This ensured my medical logic was safe for patient use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation:&lt;/strong&gt; It auto-generated a &lt;code&gt;README.md&lt;/code&gt; and &lt;code&gt;QUICKSTART.md&lt;/code&gt; at the end, saving me hours of writing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This tool didn't just help me write code; it helped me build a &lt;strong&gt;product&lt;/strong&gt; before my morning lectures even started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;p&gt;This MVP is the foundation for a larger "BioSecure" ecosystem, including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phase 6:&lt;/strong&gt; Database persistence (SQLite), which the Agent already planned for me.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware Integration:&lt;/strong&gt; Connecting the Logistics module to IoT Smart Shelves for real-time vaccine tracking.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>githubchallenge</category>
      <category>cli</category>
      <category>githubcopilot</category>
    </item>
  </channel>
</rss>
