<?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: Isaiah Peter</title>
    <description>The latest articles on DEV Community by Isaiah Peter (@isaiahpeter).</description>
    <link>https://dev.to/isaiahpeter</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%2F1108261%2F81c184d5-c783-4a3f-a4e8-47e3832eb1f4.jpeg</url>
      <title>DEV Community: Isaiah Peter</title>
      <link>https://dev.to/isaiahpeter</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/isaiahpeter"/>
    <language>en</language>
    <item>
      <title>Student proposal: can stolen money be traced across banks in seconds without sharing customer data? Please break this</title>
      <dc:creator>Isaiah Peter</dc:creator>
      <pubDate>Thu, 01 Oct 2026 05:05:59 +0000</pubDate>
      <link>https://dev.to/isaiahpeter/student-proposal-can-stolen-money-be-traced-across-banks-in-seconds-without-sharing-customer-data-170c</link>
      <guid>https://dev.to/isaiahpeter/student-proposal-can-stolen-money-be-traced-across-banks-in-seconds-without-sharing-customer-data-170c</guid>
      <description>&lt;p&gt;I'm a 300-level Computer Science student at NOUN in Lagos. I have no professional experience in fraud or banking, so this post is me asking for correction from people who do.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem as I understand it
&lt;/h2&gt;

&lt;p&gt;When online fraud happens, the money often moves through several mule accounts and gets cashed out within minutes. Victims usually report hours later. Each bank or wallet only sees its own part of the trail, and privacy and banking secrecy rules (rightly) stop them from freely sharing customer data. So by the time anyone connects the dots, the money is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea
&lt;/h2&gt;

&lt;p&gt;Transactions are naturally a graph: accounts are nodes, transfers are edges with a timestamp and amount. My question was why money isn't traced like one across institutions. After reading around, I now understand the main reasons: each institution only holds its own edges, ledgers need strict consistency, and sharing data raises legal and competitive problems.&lt;/p&gt;

&lt;p&gt;So my proposal is a &lt;strong&gt;federated, privacy-preserving transaction graph&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each institution keeps its raw ledger and runs a local node.&lt;/li&gt;
&lt;li&gt;There is no central database of everyone's transactions.&lt;/li&gt;
&lt;li&gt;When fraud is flagged, a machine-readable alert follows the money from node to node. Bank A tells Bank B, "funds from case X arrived in one of your accounts." Bank B checks its own ledger, places a temporary hold, and forwards the alert to wherever the money went next.&lt;/li&gt;
&lt;li&gt;The graph is never assembled in one place. It exists as a chain of handoffs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The machine-only boundary
&lt;/h2&gt;

&lt;p&gt;Only fixed-schema messages cross between institutions, with no free text and no names:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"case_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"c_8f21..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"account_token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HMAC(consortium_key, account_no)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"amount_bucket"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"100k-500k"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"ts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1767225600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"HOLD_REQUEST"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sender_sig"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Messages would be signed, sent over mutual TLS, rate-limited, and fully audit-logged. The receiving node can recognize its own accounts from the token but learns nothing about unrelated customers. Anything beyond match, hold and forward would require a legal process with a human involved.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prior work
&lt;/h2&gt;

&lt;p&gt;I know this isn't new. As I understand them, the BIS's Project Aurora, Singapore's COSMIC platform, FinCEN's 314(b) sharing and some federated learning pilots explore related ground. What I couldn't find is an open standard for the cross-institution alert protocol itself, which may mean the gap is real or that I'm missing something. Please tell me which.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I think it breaks (please attack these)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Re-identification:&lt;/strong&gt; if tokens are stable and edges carry timestamps and amounts, could patterns link pseudonyms back to people? Would token rotation, per-case tokens and amount bucketing be enough?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wrongful holds:&lt;/strong&gt; automated holds will freeze innocent people. Who is liable, and how should expiry and appeals work?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legal basis:&lt;/strong&gt; is the NDPA or banking secrecy law a hard blocker in Nigeria, or can a consortium model work?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption:&lt;/strong&gt; would a bank or fintech realistically adopt an open spec? Or is a shared blacklist enough and this is overengineered?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coverage gaps:&lt;/strong&gt; wallets, crypto exchanges and cash-out agents that don't join would leave dark spots in the trail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Taint rules:&lt;/strong&gt; when mixed funds move, FIFO, proportional and "poison" tracing give different answers. Which would a court accept?&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  What I'd build first
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A message spec&lt;/li&gt;
&lt;li&gt;A two-node simulator showing a hold propagating across two simulated institutions&lt;/li&gt;
&lt;li&gt;A threat model document covering re-identification and false positives&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything would be open source (Apache 2.0). Keys, detection thresholds and any live network would stay with whoever operates a deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm asking for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Engineers:&lt;/strong&gt; poke holes in the protocol, token design and failure modes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;People in fintech, banking, compliance or law enforcement:&lt;/strong&gt; tell me what fraud recovery really looks like today and where this wouldn't fit.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anyone:&lt;/strong&gt; point me to existing projects or papers I've missed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing here is validated. It's a design I want torn apart before I write code, so blunt, specific criticism is the most useful kind. Thanks for reading.&lt;/p&gt;

&lt;p&gt;No repo yet. I'd rather get your criticism first, then open one with the spec and a two-node simulator, and I'll link it in the comments once it exists.&lt;/p&gt;

</description>
      <category>fintech</category>
      <category>security</category>
      <category>architecture</category>
      <category>discuss</category>
    </item>
    <item>
      <title>A Tiny Nim Microservice, Three Real Bugs, and What They Taught Me About My Own Mummy Fork</title>
      <dc:creator>Isaiah Peter</dc:creator>
      <pubDate>Tue, 15 Sep 2026 00:12:26 +0000</pubDate>
      <link>https://dev.to/isaiahpeter/a-tiny-nim-microservice-three-real-bugs-and-what-they-taught-me-about-my-own-mummy-fork-2b51</link>
      <guid>https://dev.to/isaiahpeter/a-tiny-nim-microservice-three-real-bugs-and-what-they-taught-me-about-my-own-mummy-fork-2b51</guid>
      <description>&lt;h1&gt;
  
  
  A Tiny Nim Microservice, Three Real Bugs, and What They Taught Me About My Own Mummy Fork
&lt;/h1&gt;

&lt;p&gt;I recently needed something small: a &lt;code&gt;POST /api/contact&lt;/code&gt; endpoint for my portfolio site at &lt;code&gt;https://www.isaiah.name.ng&lt;/code&gt; that takes a name, email, and message, validates it, and emails it to me. The kind of thing you'd normally knock out without thinking twice.&lt;/p&gt;

&lt;p&gt;I decided to build it directly on my own &lt;a href="https://dev.to/isaiahpeter/adding-openapi-support-to-mummy-a-nim-http-framework-227m"&gt;Mummy fork&lt;/a&gt; — the one with OpenAPI schema generation, typed validation, and composable middleware — partly to actually dogfood it on something real, and partly because I assumed a single-endpoint service would be trivial. It mostly was. But three specific bugs along the way taught me more about the fork's internals than building the fork itself did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Shape of the Service
&lt;/h2&gt;

&lt;p&gt;Nothing exotic: a &lt;code&gt;ContactBody&lt;/code&gt; type with &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;email&lt;/code&gt;, and &lt;code&gt;message&lt;/code&gt;, all required strings. Validation happens in two layers — &lt;code&gt;parseValidatedBody[ContactBody]&lt;/code&gt; checks presence and type against the fork's &lt;code&gt;schemaOf&lt;/code&gt;-generated schema, and then explicit checks enforce non-empty fields, a 2000-character cap, and a hand-rolled email format check. Either layer raising the fork's &lt;code&gt;ValidationError&lt;/code&gt; gets mapped to a clean &lt;code&gt;400 {"error": ...}&lt;/code&gt; by &lt;code&gt;installDefaultErrorHandler&lt;/code&gt;. A send failure is logged server-side and answered with a generic &lt;code&gt;500&lt;/code&gt; — the caller never sees why an email failed to send, only that it did.&lt;/p&gt;

&lt;p&gt;On top of that: CORS middleware that rejects disallowed origins with &lt;code&gt;403&lt;/code&gt; and answers preflight requests properly, an in-memory rate limiter capping submissions at 5 per IP per 10 minutes, and the fork's &lt;code&gt;loggingMiddleware&lt;/code&gt; as the outermost layer so every request logs method, path, and timing. The OpenAPI docs come free from the same schema the validator uses, served at &lt;code&gt;/docs&lt;/code&gt; with the spec at &lt;code&gt;/openapi.json&lt;/code&gt; — the whole reason I built the fork in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Pivot Nobody Plans For: SMTP → Resend
&lt;/h2&gt;

&lt;p&gt;The original plan was plain SMTP via &lt;code&gt;std/smtp&lt;/code&gt;. It compiled fine against the fork. Then I deployed to Render's free tier and every send just hung until timeout — Render blocks outbound SMTP ports (25/465/587) on that tier. Resend's REST API runs over HTTPS:443, which isn't blocked, and needs just one API key. As a bonus, its failures come back as ordinary HTTP errors the handler already catches and logs, instead of the occasional &lt;code&gt;AssertionDefect&lt;/code&gt; that a raw SMTP library can throw and potentially take a worker down with it.&lt;/p&gt;

&lt;p&gt;This is the kind of constraint you only discover by actually deploying, not by reading docs — worth remembering if you're building anything Render-hosted that needs to send mail.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three Bugs That Taught Me More Than the Feature Did
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Two &lt;code&gt;HttpHeaders&lt;/code&gt; types that look identical and aren't.&lt;/strong&gt;&lt;br&gt;
Mummy imports &lt;code&gt;std/httpcore&lt;/code&gt; aliased internally, and &lt;code&gt;Request.headers&lt;/code&gt; is typed against that aliased import. My module also did a plain &lt;code&gt;import std/httpcore&lt;/code&gt; for the Resend payload types — and suddenly every header operation threw a "type mismatch" between what looked like the same type. Nim's module system treats the two imports as distinct type identities even though they're structurally the same. The fix was narrow: &lt;code&gt;import std/httpcore except HttpHeaders&lt;/code&gt;, so my module only pulled in the pieces it needed for the Resend payload and left the header type alone. This was, by a wide margin, the buggiest hour of the whole build — and a good reminder that "same type, different import path" is a real failure mode in Nim, not a theoretical one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. &lt;code&gt;gcsafe&lt;/code&gt; doesn't care that your global never actually changes.&lt;/strong&gt;&lt;br&gt;
The fork's &lt;code&gt;Middleware&lt;/code&gt; and &lt;code&gt;RequestHandler&lt;/code&gt; types are marked &lt;code&gt;{.gcsafe.}&lt;/code&gt;, which means the compiler's data-race checker gets strict about any global state touched inside a handler — because Mummy dispatches requests across a worker-thread pool, not a single event loop. My CORS middleware read a &lt;code&gt;var&lt;/code&gt; global holding the allowed-origins list, set once at startup and never touched again — and the compiler didn't care that it was logically immutable after init. It only sees a mutable global read from a &lt;code&gt;gcsafe&lt;/code&gt; context. The fix was a &lt;code&gt;{.cast(gcsafe).}&lt;/code&gt; block around that specific read, while the genuinely-shared rate-limit table stayed behind a real &lt;code&gt;Lock&lt;/code&gt; — the same pattern the fork already uses internally for &lt;code&gt;bearerAuthMiddleware&lt;/code&gt;. It's a useful distinction to internalize on a threaded server: "never mutated after startup" and "thread-safe" are not the same claim, and the compiler will only ever check for the second one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. An unregistered route means your middleware never runs — including for the request that most needs it.&lt;/strong&gt;&lt;br&gt;
Browsers send an &lt;code&gt;OPTIONS&lt;/code&gt; preflight before certain cross-origin &lt;code&gt;POST&lt;/code&gt; requests. Mummy only runs its middleware chain for methods that have a registered route — so with no &lt;code&gt;OPTIONS /api/contact&lt;/code&gt; route, Mummy answered preflight with its own 405 before &lt;code&gt;corsMiddleware&lt;/code&gt; ever got a chance to run. The browser never saw the &lt;code&gt;Access-Control-Allow-Origin&lt;/code&gt; header it needed, so the real &lt;code&gt;POST&lt;/code&gt; was blocked client-side despite the server being otherwise correctly configured. The fix was almost comically small: register an &lt;code&gt;OPTIONS /api/contact&lt;/code&gt; route whose handler does nothing but exist, which is enough to route the request into the middleware chain where &lt;code&gt;corsMiddleware&lt;/code&gt; can actually answer it with a &lt;code&gt;204&lt;/code&gt;. Easy to fix once you know it — genuinely confusing the first time a working-looking CORS setup silently fails only on the preflight leg.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Actually Got Verified
&lt;/h2&gt;

&lt;p&gt;Before calling it done, I ran it locally and checked the specific paths that tend to hide bugs rather than just the happy path: a disallowed origin (&lt;code&gt;403&lt;/code&gt;), a malformed email (&lt;code&gt;400&lt;/code&gt; with the exact field named), a name at the 2000-character boundary (passes) versus one character over (rejected), six rapid submissions from one IP (five succeed, the sixth comes back &lt;code&gt;429&lt;/code&gt; with &lt;code&gt;Retry-After&lt;/code&gt;), and that &lt;code&gt;/health&lt;/code&gt; and &lt;code&gt;OPTIONS&lt;/code&gt; both stay outside the rate limiter so Render's health checks and CORS preflight never get throttled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Was Worth Writing Up
&lt;/h2&gt;

&lt;p&gt;None of these three bugs were about the feature — a contact form endpoint is about as unglamorous as backend work gets. They were about the specific intersection of Nim's module aliasing, &lt;code&gt;gcsafe&lt;/code&gt;'s literal (not logical) read of what's safe, and Mummy's routing-before-middleware order. If you're building anything on Mummy — my fork or the original — that touches CORS, thread-shared state, or has more than one import path into &lt;code&gt;std/httpcore&lt;/code&gt;, these three are worth checking for before you hit them the hard way.&lt;/p&gt;

&lt;p&gt;The full service, Dockerfile, and a drop-in &lt;code&gt;script.js&lt;/code&gt; for wiring this into any static contact form are in the repo if you want to see the whole thing end to end.&lt;/p&gt;

</description>
      <category>backend</category>
      <category>microservices</category>
      <category>nim</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Adding OpenAPI Support to Mummy, a Nim HTTP Framework</title>
      <dc:creator>Isaiah Peter</dc:creator>
      <pubDate>Tue, 25 Aug 2026 21:45:31 +0000</pubDate>
      <link>https://dev.to/isaiahpeter/adding-openapi-support-to-mummy-a-nim-http-framework-227m</link>
      <guid>https://dev.to/isaiahpeter/adding-openapi-support-to-mummy-a-nim-http-framework-227m</guid>
      <description>&lt;p&gt;Nim doesn't have a lot of options for building HTTP APIs with the kind of&lt;br&gt;
batteries-included developer experience you get in frameworks like FastAPI or&lt;br&gt;
Express with Swagger middleware. &lt;a href="https://github.com/guzba/mummy" rel="noopener noreferrer"&gt;mummy&lt;/a&gt; is a&lt;br&gt;
fast, solid HTTP/WebSocket server library for Nim (my fork with the&lt;br&gt;
additions below is at&lt;br&gt;
&lt;a href="https://github.com/isaiahpeter/mummy" rel="noopener noreferrer"&gt;github.com/isaiahpeter/mummy&lt;/a&gt;) — but out of the box, it&lt;br&gt;
doesn't generate OpenAPI specs, validate request bodies, or give you typed&lt;br&gt;
path parameters. So I forked it and added those.&lt;/p&gt;

&lt;p&gt;This post walks through what I built, why, and what I learned extending an&lt;br&gt;
existing Nim library instead of starting from scratch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why mummy, and why OpenAPI
&lt;/h2&gt;

&lt;p&gt;I wanted a Nim backend for a few projects (a contact-form API, a todo API&lt;br&gt;
demo) and kept missing three things I'd take for granted in other&lt;br&gt;
ecosystems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-generated API docs&lt;/strong&gt; — a &lt;code&gt;/docs&lt;/code&gt; endpoint you can actually hand to
someone, generated from your routes instead of hand-written.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Typed path parameters&lt;/strong&gt; — pulling &lt;code&gt;id&lt;/code&gt; out of &lt;code&gt;/users/{id}&lt;/code&gt; as an &lt;code&gt;int&lt;/code&gt;
without manual parsing and error handling in every handler.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Request validation&lt;/strong&gt; — rejecting a bad JSON body before it reaches your
handler logic, with a schema to back it up.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;mummy is fast and minimal by design, which is exactly why it was worth&lt;br&gt;
extending rather than replacing.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;OpenAPI spec generation.&lt;/strong&gt; I added &lt;code&gt;openapi_schema.nim&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;openapi_router.nim&lt;/code&gt;, which let you wrap routes in an &lt;code&gt;OpenApiRouter&lt;/code&gt; and&lt;br&gt;
attach a summary, tags, and a response schema via &lt;code&gt;schemaOf&lt;/code&gt;. The router&lt;br&gt;
serves both &lt;code&gt;/openapi.json&lt;/code&gt; and a browsable &lt;code&gt;/docs&lt;/code&gt; page generated from your&lt;br&gt;
actual route definitions — so the docs can't drift out of sync with the code&lt;br&gt;
the way hand-written API docs do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Typed path parameters.&lt;/strong&gt; &lt;code&gt;pathParam[T](request, "id")&lt;/code&gt; pulls a path&lt;br&gt;
segment and parses it as the type you ask for, with a clean 400 response if&lt;br&gt;
parsing fails. One gotcha worth flagging if you try this yourself: in this&lt;br&gt;
Nim version, the generic dot-call form (&lt;code&gt;request.pathParam[int]("id")&lt;/code&gt;)&lt;br&gt;
doesn't parse — you have to call it as &lt;code&gt;pathParam[int](request, "id")&lt;/code&gt;&lt;br&gt;
instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Request body validation.&lt;/strong&gt; &lt;code&gt;parseValidatedBody[T]&lt;/code&gt; checks an incoming JSON&lt;br&gt;
body against the schema generated by &lt;code&gt;schemaOf&lt;/code&gt;, and returns a 400 with a&lt;br&gt;
clear error message on mismatch, instead of letting a malformed body reach&lt;br&gt;
your handler and fail in some less obvious way further down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Composable middleware.&lt;/strong&gt; A &lt;code&gt;Middleware&lt;/code&gt; type and a &lt;code&gt;use()&lt;/code&gt; method on&lt;br&gt;
&lt;code&gt;OpenApiRouter&lt;/code&gt;, plus a couple of built-ins — &lt;code&gt;loggingMiddleware&lt;/code&gt; and&lt;br&gt;
&lt;code&gt;bearerAuthMiddleware&lt;/code&gt; — so cross-cutting concerns don't have to be copy-pasted&lt;br&gt;
into every handler.&lt;/p&gt;

&lt;h2&gt;
  
  
  Migrating the examples
&lt;/h2&gt;

&lt;p&gt;mummy ships with 12 example servers. I migrated all of them to the new&lt;br&gt;
&lt;code&gt;OpenApiRouter&lt;/code&gt; to sanity-check the additions against real, varied code&lt;br&gt;
instead of just a toy case. That surfaced a few real bugs I wouldn't have&lt;br&gt;
caught otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One example declared a &lt;code&gt;requestBody&lt;/code&gt; schema for a route whose handler
never actually read a JSON body — leftover from copy-pasting between
examples. Easy to miss, misleading if it ships in generated docs.&lt;/li&gt;
&lt;li&gt;The WebSocket example used a wildcard route (&lt;code&gt;/*&lt;/code&gt;) for channel names. I
converted it to a named path parameter (&lt;code&gt;@channel&lt;/code&gt;), which also fixed a
latent bug: the original handler read &lt;code&gt;request.uri&lt;/code&gt;, which can include a
&lt;code&gt;?query&lt;/code&gt; string, instead of the clean decoded path.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only one example actually declared response schemas, and those checked out&lt;br&gt;
correctly — the rest use the router's default 200 OK, which needed no&lt;br&gt;
changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'm using this fork to build a small todo API demo (deployed on Render) as a&lt;br&gt;
live, working example of the OpenAPI/validation/middleware features&lt;br&gt;
together, and a contact-form microservice for my own site. Both are useful&lt;br&gt;
proof that the additions hold up outside of the example suite they were&lt;br&gt;
tested against.&lt;/p&gt;

&lt;p&gt;If you're working in Nim and have hit the same "no OpenAPI docs, no request&lt;br&gt;
validation" gap with mummy or another minimal framework, I'd be curious to&lt;br&gt;
hear how you've worked around it — or if you want to look at the fork&lt;br&gt;
yourself, it's at &lt;a href="https://github.com/isaiahpeter/mummy" rel="noopener noreferrer"&gt;github.com/isaiahpeter/mummy&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>nim</category>
      <category>openapi</category>
      <category>backend</category>
      <category>api</category>
    </item>
    <item>
      <title>Things you need to know before learning django.</title>
      <dc:creator>Isaiah Peter</dc:creator>
      <pubDate>Mon, 11 Sep 2023 02:05:19 +0000</pubDate>
      <link>https://dev.to/isaiahpeter/things-you-need-to-know-before-learning-django-5039</link>
      <guid>https://dev.to/isaiahpeter/things-you-need-to-know-before-learning-django-5039</guid>
      <description>&lt;p&gt;The django framework is a web framework used to build web applications.It is also known as the framework for perfectionist with a deadline.The most trendy and popular python framework for web development.&lt;br&gt;
You might be wondering what are the topics or things you should know before learning django.&lt;br&gt;
First you must know the python programming language fundamentals.&lt;br&gt;
what are these fundamentals?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;variables&lt;/li&gt;
&lt;li&gt;list, tuples and dictionary&lt;/li&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;class especially how to inherit from another class properly&lt;/li&gt;
&lt;li&gt;Understand object oriented programming &lt;/li&gt;
&lt;li&gt;You should also have a basic understanding of html, css and javascript it will come handy when you are writing your models that will be translated to an html element.&lt;/li&gt;
&lt;li&gt;know the GET and POST request what they mean and when to use them.&lt;/li&gt;
&lt;li&gt;You also need to understand database and sql like foreignkeys, relationship between tables and how they map to your python model.&lt;/li&gt;
&lt;li&gt;what a virtual environment is.&lt;/li&gt;
&lt;li&gt;why django is called an MVT framework.&lt;/li&gt;
&lt;li&gt;learn to use git and the django documentation.&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>tutorial</category>
      <category>python</category>
    </item>
  </channel>
</rss>
