<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Engineering Journal on Ikwuka Okoye</title><link>https://ikwukao.dev/journal/</link><description>Recent content in Engineering Journal on Ikwuka Okoye</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Tue, 11 Aug 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ikwukao.dev/journal/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a Concurrent TCP Server in Go: Connections, Deadlines, and Graceful Shutdown</title><link>https://ikwukao.dev/journal/concurrent-tcp-server-go/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/concurrent-tcp-server-go/</guid><description>&lt;h2 id="building-a-concurrent-tcp-server-in-go-connections-deadlines-and-graceful-shutdown"&gt;Building a Concurrent TCP Server in Go: Connections, Deadlines, and Graceful Shutdown&lt;/h2&gt;
&lt;p&gt;TCP makes it possible to build extremely simple network services.&lt;/p&gt;
&lt;p&gt;Open a listener. Accept a connection. Read bytes. Process them.&lt;/p&gt;
&lt;p&gt;The complexity appears when the server has to do this for many clients at the same time while remaining responsive when clients become slow, disappear unexpectedly, or send data indefinitely.&lt;/p&gt;
&lt;p&gt;That was one of the core engineering problems behind &lt;strong&gt;Strata-Log&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Building a High-Throughput TCP Server in Go</title><link>https://ikwukao.dev/journal/strata-log-tcp/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/strata-log-tcp/</guid><description>&lt;p&gt;When building a high-throughput backend service, it is easy to focus on the application protocol and overlook the network boundary underneath it.&lt;/p&gt;
&lt;p&gt;Strata-Log takes the opposite approach.&lt;/p&gt;
&lt;p&gt;The project uses raw TCP connections as its ingestion layer, making connection handling, timeouts, concurrency, and shutdown behavior explicit.&lt;/p&gt;
&lt;p&gt;That creates a useful engineering environment for understanding what actually happens between a client sending data and a backend processing it.&lt;/p&gt;
&lt;h2 id="why-raw-tcp"&gt;Why Raw TCP?&lt;/h2&gt;
&lt;p&gt;Higher-level protocols and frameworks are valuable because they provide useful abstractions.&lt;/p&gt;</description></item><item><title>Building Asteroids with Python and Pygame: From Game Idea to Playable System</title><link>https://ikwukao.dev/journal/building-asteroids-with-python-and-pygame/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-asteroids-with-python-and-pygame/</guid><description>&lt;h2 id="building-asteroids-with-python-and-pygame-from-game-idea-to-playable-system"&gt;Building Asteroids with Python and Pygame: From Game Idea to Playable System&lt;/h2&gt;
&lt;p&gt;Small games are deceptively useful engineering projects.&lt;/p&gt;
&lt;p&gt;They may contain only a few objects on screen, but those objects introduce many of the same problems found in larger software systems: state management, object lifecycles, input handling, timing, rendering, collision detection, and the need to keep individual components understandable as the codebase grows.&lt;/p&gt;
&lt;p&gt;The Asteroids project was built as an opportunity to explore those problems through a compact interactive system using Python and Pygame.&lt;/p&gt;</description></item><item><title>Building Platform-Infra: Using Terraform to Manage Local Kubernetes Infrastructure</title><link>https://ikwukao.dev/journal/platform-infra-terraform-kubernetes/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/platform-infra-terraform-kubernetes/</guid><description>&lt;h2 id="building-platform-infra-using-terraform-to-manage-local-kubernetes-infrastructure"&gt;Building Platform-Infra: Using Terraform to Manage Local Kubernetes Infrastructure&lt;/h2&gt;
&lt;p&gt;Infrastructure becomes difficult to reason about when environments are created through a collection of undocumented commands.&lt;/p&gt;
&lt;p&gt;That problem becomes even more noticeable when several services, containers, configuration files, namespaces, and deployment steps are involved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Platform-Infra&lt;/strong&gt; started from that observation.&lt;/p&gt;
&lt;p&gt;The project is a master orchestration repository designed to manage the infrastructure and deployment configuration surrounding my backend services using Infrastructure as Code principles.&lt;/p&gt;</description></item><item><title>From Markdown to HTML: Designing the Static Site Generator Pipeline</title><link>https://ikwukao.dev/journal/static-site-generator-markdown-to-html/</link><pubDate>Tue, 11 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/static-site-generator-markdown-to-html/</guid><description>&lt;h2 id="from-markdown-to-html-designing-the-static-site-generator-pipeline"&gt;From Markdown to HTML: Designing the Static Site Generator Pipeline&lt;/h2&gt;
&lt;p&gt;A static site generator is fundamentally a transformation system.&lt;/p&gt;
&lt;p&gt;It takes source content, processes that content through a series of stages, and produces files that can be served directly to users.&lt;/p&gt;
&lt;p&gt;For my static site generator, the core transformation looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Markdown
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Blocks
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Block Types
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Inline Text Nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTML Nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;HTML
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The value of this architecture is not simply that it works.&lt;/p&gt;</description></item><item><title>Building a Static Site Generator in Python: From Markdown to HTML</title><link>https://ikwukao.dev/journal/building-a-static-site-generator-in-python/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-a-static-site-generator-in-python/</guid><description>&lt;h2 id="building-a-static-site-generator-in-python-from-markdown-to-html"&gt;Building a Static Site Generator in Python: From Markdown to HTML&lt;/h2&gt;
&lt;p&gt;A static site generator looks simple from the outside.&lt;/p&gt;
&lt;p&gt;You write some Markdown, run a command, and HTML files appear in an output directory.&lt;/p&gt;
&lt;p&gt;The interesting engineering work happens between those two points.&lt;/p&gt;
&lt;p&gt;Building a static site generator from scratch is a useful exercise because it exposes several concepts that are normally hidden behind frameworks and libraries: parsing, intermediate representations, tree structures, rendering, filesystem operations, and deterministic builds.&lt;/p&gt;</description></item><item><title>Building Distributed Rate Limiting with Redis and Lua</title><link>https://ikwukao.dev/journal/redis-rate-limiting-with-lua/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/redis-rate-limiting-with-lua/</guid><description>&lt;h2 id="building-distributed-rate-limiting-with-redis-and-lua"&gt;Building Distributed Rate Limiting with Redis and Lua&lt;/h2&gt;
&lt;p&gt;Rate limiting sounds simple until an application runs on more than one machine.&lt;/p&gt;
&lt;p&gt;A single process can keep a counter in memory.&lt;/p&gt;
&lt;p&gt;A distributed gateway cannot rely on local state alone.&lt;/p&gt;
&lt;p&gt;While building Flux-Gateway, I used Redis and Lua scripts to explore how traffic control can remain atomic when multiple gateway instances are operating simultaneously.&lt;/p&gt;
&lt;h2 id="why-local-rate-limiting-is-not-enough"&gt;Why Local Rate Limiting Is Not Enough&lt;/h2&gt;
&lt;p&gt;Imagine two gateway instances:&lt;/p&gt;</description></item><item><title>Converting Markdown Blocks into Semantic HTML</title><link>https://ikwukao.dev/journal/converting-markdown-blocks-into-semantic-html/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/converting-markdown-blocks-into-semantic-html/</guid><description>&lt;h2 id="converting-markdown-blocks-into-semantic-html"&gt;Converting Markdown Blocks into Semantic HTML&lt;/h2&gt;
&lt;p&gt;Markdown documents are written as a continuous stream of text, but browsers consume structured HTML.&lt;/p&gt;
&lt;p&gt;Bridging those two representations requires more than replacing a few characters.&lt;/p&gt;
&lt;p&gt;A static site generator needs to understand the boundaries between blocks and determine what each block represents.&lt;/p&gt;
&lt;p&gt;That was one of the central problems in my Static Site Generator project.&lt;/p&gt;
&lt;h2 id="what-is-a-markdown-block"&gt;What Is a Markdown Block?&lt;/h2&gt;
&lt;p&gt;A block is a logical unit of Markdown content.&lt;/p&gt;</description></item><item><title>Designing a Fault-Tolerant API Gateway in Go</title><link>https://ikwukao.dev/journal/designing-a-fault-tolerant-api-gateway-in-go/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-a-fault-tolerant-api-gateway-in-go/</guid><description>&lt;h2 id="designing-a-fault-tolerant-api-gateway-in-go"&gt;Designing a Fault-Tolerant API Gateway in Go&lt;/h2&gt;
&lt;p&gt;An API gateway sits at an uncomfortable boundary.&lt;/p&gt;
&lt;p&gt;It receives traffic from clients, but the work is usually performed somewhere else. Every request that passes through the gateway eventually depends on downstream services, networks, databases, caches, or other infrastructure.&lt;/p&gt;
&lt;p&gt;That makes the gateway more than a reverse proxy.&lt;/p&gt;
&lt;p&gt;It becomes one of the places where reliability decisions have to be made.&lt;/p&gt;
&lt;p&gt;This is the problem I wanted to explore while building &lt;strong&gt;Flux-Gateway&lt;/strong&gt;, a high-performance API gateway and reverse proxy written in Go.&lt;/p&gt;</description></item><item><title>Designing OpsPilot: Building a Modular DevOps Operations Toolkit</title><link>https://ikwukao.dev/journal/designing-opspilot/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-opspilot/</guid><description>&lt;h2 id="designing-opspilot-building-a-modular-devops-operations-toolkit"&gt;Designing OpsPilot: Building a Modular DevOps Operations Toolkit&lt;/h2&gt;
&lt;p&gt;As backend systems become more complex, the operational work surrounding them becomes increasingly difficult to ignore.&lt;/p&gt;
&lt;p&gt;Running services, inspecting environments, managing containers, checking infrastructure, and performing repetitive maintenance tasks can quickly turn into a collection of shell commands, scripts, and undocumented procedures.&lt;/p&gt;
&lt;p&gt;That was the problem I wanted to explore with &lt;strong&gt;OpsPilot&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Rather than building another collection of unrelated scripts, I wanted to create a structured operations toolkit that could grow alongside the systems it manages.&lt;/p&gt;</description></item><item><title>Designing Strata-Log: Architecture for a High-Throughput Distributed Log Engine</title><link>https://ikwukao.dev/journal/strata-log-architecture/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/strata-log-architecture/</guid><description>&lt;p&gt;Building a log aggregation system looks deceptively simple at first.&lt;/p&gt;
&lt;p&gt;Accept a connection, read some data, and write it somewhere.&lt;/p&gt;
&lt;p&gt;The difficulty begins when the system has to do that thousands of times concurrently without allowing network traffic, memory allocation, disk I/O, or shutdown behavior to become bottlenecks.&lt;/p&gt;
&lt;p&gt;That problem became the foundation for &lt;strong&gt;Strata-Log&lt;/strong&gt;, an experimental high-throughput distributed log aggregation engine built in Go.&lt;/p&gt;
&lt;p&gt;The project is deliberately focused on the lower layers of the system: TCP connections, concurrency, memory reuse, buffering, disk writes, and graceful shutdown.&lt;/p&gt;</description></item><item><title>Parsing Markdown into an HTML Tree: Designing the Intermediate Representation</title><link>https://ikwukao.dev/journal/parsing-markdown-into-an-html-tree/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/parsing-markdown-into-an-html-tree/</guid><description>&lt;h2 id="parsing-markdown-into-an-html-tree-designing-the-intermediate-representation"&gt;Parsing Markdown into an HTML Tree: Designing the Intermediate Representation&lt;/h2&gt;
&lt;p&gt;One of the easiest mistakes to make when building a Markdown-to-HTML converter is to think of the problem as string replacement.&lt;/p&gt;
&lt;p&gt;Replace &lt;code&gt;**text**&lt;/code&gt; with &lt;code&gt;&amp;lt;strong&amp;gt;text&amp;lt;/strong&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Replace &lt;code&gt;*text*&lt;/code&gt; with &lt;code&gt;&amp;lt;em&amp;gt;text&amp;lt;/em&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Replace headings with &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;At first, this seems sufficient.&lt;/p&gt;
&lt;p&gt;It quickly becomes difficult once documents contain nested structures.&lt;/p&gt;
&lt;p&gt;A more robust approach is to introduce an intermediate representation between Markdown and HTML.&lt;/p&gt;</description></item><item><title>Testing a Static Site Generator: Small Contracts, Reliable Output</title><link>https://ikwukao.dev/journal/static-site-generator-testing/</link><pubDate>Mon, 10 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/static-site-generator-testing/</guid><description>&lt;h2 id="testing-a-static-site-generator-small-contracts-reliable-output"&gt;Testing a Static Site Generator: Small Contracts, Reliable Output&lt;/h2&gt;
&lt;p&gt;A static site generator is a good example of a system where small bugs can propagate through multiple layers.&lt;/p&gt;
&lt;p&gt;A mistake in Markdown parsing can eventually appear as malformed HTML.&lt;/p&gt;
&lt;p&gt;A malformed text node can produce incorrect links.&lt;/p&gt;
&lt;p&gt;A block-classification error can cause an entire section of a page to render incorrectly.&lt;/p&gt;
&lt;p&gt;That makes testing especially important.&lt;/p&gt;
&lt;p&gt;The solution is not necessarily hundreds of large end-to-end tests.&lt;/p&gt;</description></item><item><title>Building a Circuit Breaker in Go</title><link>https://ikwukao.dev/journal/building-a-circuit-breaker-in-go/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-a-circuit-breaker-in-go/</guid><description>&lt;h2 id="building-a-circuit-breaker-in-go"&gt;Building a Circuit Breaker in Go&lt;/h2&gt;
&lt;p&gt;A backend service does not operate in isolation.&lt;/p&gt;
&lt;p&gt;Even a relatively simple HTTP handler may depend on databases, caches, authentication services, payment providers, internal APIs, or other microservices.&lt;/p&gt;
&lt;p&gt;When one of those dependencies becomes unhealthy, repeatedly calling it can make the original problem much worse.&lt;/p&gt;
&lt;p&gt;This is where the &lt;strong&gt;circuit breaker pattern&lt;/strong&gt; becomes useful.&lt;/p&gt;
&lt;p&gt;While building Flux-Gateway, I implemented a circuit breaker in Go to explore how a gateway can detect repeated upstream failures and stop sending traffic to a dependency that is already known to be unhealthy.&lt;/p&gt;</description></item><item><title>Building a Reliable REST API Client in Go for PokedexCLI</title><link>https://ikwukao.dev/journal/pokedexcli-api-client/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-api-client/</guid><description>&lt;h2 id="building-a-reliable-rest-api-client-in-go-for-pokedexcli"&gt;Building a Reliable REST API Client in Go for PokedexCLI&lt;/h2&gt;
&lt;p&gt;A command-line application becomes considerably more interesting when it has to communicate with a remote service.&lt;/p&gt;
&lt;p&gt;PokedexCLI does not contain all of its data locally. Much of the information the application needs comes from the Pokémon API, which means the application has to deal with HTTP requests, JSON responses, network failures, pagination, and external service boundaries.&lt;/p&gt;
&lt;p&gt;Rather than allowing every command to construct its own HTTP requests, I treated API communication as a dedicated responsibility.&lt;/p&gt;</description></item><item><title>Building Reliable Tool Use into an AI Agent</title><link>https://ikwukao.dev/journal/ai-agent-tool-use/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-tool-use/</guid><description>&lt;h2 id="building-reliable-tool-use-into-an-ai-agent"&gt;Building Reliable Tool Use into an AI Agent&lt;/h2&gt;
&lt;p&gt;The moment an AI agent needs to interact with something outside the language model, tool use becomes central to its design.&lt;/p&gt;
&lt;p&gt;A model can explain how to query a database.&lt;/p&gt;
&lt;p&gt;It cannot query the database unless the surrounding application gives it a mechanism to do so.&lt;/p&gt;
&lt;p&gt;That mechanism is the tool.&lt;/p&gt;
&lt;h2 id="why-tools-matter"&gt;Why Tools Matter&lt;/h2&gt;
&lt;p&gt;A language model operates primarily through generated information.&lt;/p&gt;</description></item><item><title>Building Strata-Log: Designing a High-Throughput Distributed Log Aggregator in Go</title><link>https://ikwukao.dev/journal/building-strata-log/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-strata-log/</guid><description>&lt;h2 id="building-strata-log-designing-a-high-throughput-distributed-log-aggregator-in-go"&gt;Building Strata-Log: Designing a High-Throughput Distributed Log Aggregator in Go&lt;/h2&gt;
&lt;p&gt;Log aggregation looks simple until the volume increases.&lt;/p&gt;
&lt;p&gt;At low traffic levels, accepting a connection, reading log lines, and writing them to disk is straightforward. The problem changes when thousands of clients begin producing data concurrently and the system has to keep accepting connections without allowing slow storage operations to become a bottleneck.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Strata-Log&lt;/strong&gt; started from that problem.&lt;/p&gt;
&lt;p&gt;The goal was to build a high-throughput log aggregation engine in Go that could safely process large numbers of concurrent log streams over raw TCP while keeping memory usage predictable and the architecture understandable.&lt;/p&gt;</description></item><item><title>Caching API Responses in PokedexCLI: Reducing Network Work in Go</title><link>https://ikwukao.dev/journal/pokedexcli-caching/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-caching/</guid><description>&lt;h2 id="caching-api-responses-in-pokedexcli-reducing-network-work-in-go"&gt;Caching API Responses in PokedexCLI: Reducing Network Work in Go&lt;/h2&gt;
&lt;p&gt;One of the easiest performance problems to overlook in an API-driven application is repeated work.&lt;/p&gt;
&lt;p&gt;If an application repeatedly requests the same resource from a remote service, every request introduces network latency and another dependency on the availability of that service.&lt;/p&gt;
&lt;p&gt;PokedexCLI provides a useful environment for exploring this problem because the application repeatedly interacts with the Pokémon API while the user navigates locations and explores areas.&lt;/p&gt;</description></item><item><title>Designing a CLI Architecture for PokedexCLI in Go</title><link>https://ikwukao.dev/journal/pokedexcli-architecture/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-architecture/</guid><description>&lt;h2 id="designing-a-cli-architecture-for-pokedexcli-in-go"&gt;Designing a CLI Architecture for PokedexCLI in Go&lt;/h2&gt;
&lt;p&gt;Building a command-line application can look deceptively simple.&lt;/p&gt;
&lt;p&gt;At first, the requirements for PokedexCLI seem straightforward: accept a command, execute it, call the Pokémon API when necessary, and print the result.&lt;/p&gt;
&lt;p&gt;But even a small CLI becomes difficult to maintain when command handling, application state, networking, caching, and presentation logic are allowed to grow together.&lt;/p&gt;
&lt;p&gt;For PokedexCLI, I wanted to approach the problem as a real software-engineering exercise rather than simply building a collection of commands that happened to work.&lt;/p&gt;</description></item><item><title>Designing Fail-Fast Boundaries for Microservices</title><link>https://ikwukao.dev/journal/fail-fast-microservices/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/fail-fast-microservices/</guid><description>&lt;h2 id="designing-fail-fast-boundaries-for-microservices"&gt;Designing Fail-Fast Boundaries for Microservices&lt;/h2&gt;
&lt;p&gt;One of the easiest mistakes to make in distributed systems is assuming that a failed request is simply a request that returned an error.&lt;/p&gt;
&lt;p&gt;A timeout is more expensive.&lt;/p&gt;
&lt;p&gt;The system may have spent seconds holding connections, goroutines, memory, and other resources before discovering that the dependency could not respond.&lt;/p&gt;
&lt;p&gt;That is why fail-fast behavior is an important reliability mechanism.&lt;/p&gt;
&lt;h2 id="slow-failure-is-still-failure"&gt;Slow Failure Is Still Failure&lt;/h2&gt;
&lt;p&gt;Consider a request travelling through several services:&lt;/p&gt;</description></item><item><title>Designing the Architecture of an AI Agent</title><link>https://ikwukao.dev/journal/ai-agent-architecture/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-architecture/</guid><description>&lt;h2 id="designing-the-architecture-of-an-ai-agent"&gt;Designing the Architecture of an AI Agent&lt;/h2&gt;
&lt;p&gt;Building an AI agent is very different from building a simple application that sends a prompt to a language model and displays the response.&lt;/p&gt;
&lt;p&gt;A useful agent needs to do more than generate text. It needs to interpret a goal, decide what should happen next, use tools when necessary, maintain enough state to complete the task, observe the result, and recover when something goes wrong.&lt;/p&gt;</description></item><item><title>Making an AI Agent Reliable</title><link>https://ikwukao.dev/journal/ai-agent-reliability/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-reliability/</guid><description>&lt;h2 id="making-an-ai-agent-reliable"&gt;Making an AI Agent Reliable&lt;/h2&gt;
&lt;p&gt;The most impressive AI agent demo can still be a poor piece of software.&lt;/p&gt;
&lt;p&gt;A demonstration may work perfectly when the model responds as expected, every API is available, every tool succeeds, and the task is small.&lt;/p&gt;
&lt;p&gt;Real systems are not that forgiving.&lt;/p&gt;
&lt;p&gt;Models produce unexpected outputs.&lt;/p&gt;
&lt;p&gt;Networks fail.&lt;/p&gt;
&lt;p&gt;Tools time out.&lt;/p&gt;
&lt;p&gt;External APIs change.&lt;/p&gt;
&lt;p&gt;Users provide ambiguous instructions.&lt;/p&gt;
&lt;p&gt;An agent that cannot handle these conditions is not reliable.&lt;/p&gt;</description></item><item><title>Managing Memory and State in an AI Agent</title><link>https://ikwukao.dev/journal/ai-agent-memory-and-state/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-memory-and-state/</guid><description>&lt;h2 id="managing-memory-and-state-in-an-ai-agent"&gt;Managing Memory and State in an AI Agent&lt;/h2&gt;
&lt;p&gt;An AI agent becomes significantly more useful when it can maintain context across multiple steps.&lt;/p&gt;
&lt;p&gt;But &amp;ldquo;memory&amp;rdquo; is often used too loosely.&lt;/p&gt;
&lt;p&gt;For an engineer, it is more useful to distinguish between the different kinds of information an agent needs to retain.&lt;/p&gt;
&lt;p&gt;Some information belongs to the current execution.&lt;/p&gt;
&lt;p&gt;Some belongs to the conversation.&lt;/p&gt;
&lt;p&gt;Some may need to persist beyond the current session.&lt;/p&gt;</description></item><item><title>What Building an AI Agent Taught Me About Backend Engineering</title><link>https://ikwukao.dev/journal/ai-agent-lessons-learned/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/ai-agent-lessons-learned/</guid><description>&lt;h2 id="what-building-an-ai-agent-taught-me-about-backend-engineering"&gt;What Building an AI Agent Taught Me About Backend Engineering&lt;/h2&gt;
&lt;p&gt;Building an AI agent initially appears to be an exercise in working with language models.&lt;/p&gt;
&lt;p&gt;In practice, much of the work quickly becomes familiar backend engineering.&lt;/p&gt;
&lt;p&gt;Requests need validation.&lt;/p&gt;
&lt;p&gt;State needs to be managed.&lt;/p&gt;
&lt;p&gt;External services need timeouts.&lt;/p&gt;
&lt;p&gt;Failures need to be handled.&lt;/p&gt;
&lt;p&gt;Operations need to be observable.&lt;/p&gt;
&lt;p&gt;Components need clear boundaries.&lt;/p&gt;
&lt;p&gt;The language model adds a new dimension, but many of the underlying engineering principles remain the same.&lt;/p&gt;</description></item><item><title>What Building PokedexCLI Taught Me About Backend Engineering in Go</title><link>https://ikwukao.dev/journal/pokedexcli-command-lessons-learned/</link><pubDate>Sun, 09 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/pokedexcli-command-lessons-learned/</guid><description>&lt;h2 id="what-building-pokedexcli-taught-me-about-backend-engineering-in-go"&gt;What Building PokedexCLI Taught Me About Backend Engineering in Go&lt;/h2&gt;
&lt;p&gt;PokedexCLI began as a relatively small Go application.&lt;/p&gt;
&lt;p&gt;The premise is simple: interact with Pokémon data through a command-line interface.&lt;/p&gt;
&lt;p&gt;But projects do not remain simple merely because their initial requirements are simple.&lt;/p&gt;
&lt;p&gt;As functionality grows, the application has to deal with API communication, pagination, application state, caching, command dispatch, data modeling, errors, and testing.&lt;/p&gt;
&lt;p&gt;That made PokedexCLI valuable as more than a CLI exercise.&lt;/p&gt;</description></item><item><title>Designing This Portfolio as an Engineering Project</title><link>https://ikwukao.dev/journal/designing-this-project/</link><pubDate>Wed, 05 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/designing-this-project/</guid><description>&lt;p&gt;A technical portfolio should do more than list technologies.&lt;/p&gt;
&lt;p&gt;For an engineer working in backend systems, distributed systems, and platform engineering, the portfolio itself is an opportunity to demonstrate how problems are approached, how systems are designed, and how engineering decisions are communicated.&lt;/p&gt;
&lt;p&gt;That became the foundation for this project.&lt;/p&gt;
&lt;h2 id="more-than-a-portfolio"&gt;More Than a Portfolio&lt;/h2&gt;
&lt;p&gt;The intention behind this site is to present engineering work in a way that reflects the work itself.&lt;/p&gt;</description></item><item><title>Building OpsPilot: Why I Started a DevOps Platform</title><link>https://ikwukao.dev/journal/building-opspilot/</link><pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate><guid>https://ikwukao.dev/journal/building-opspilot/</guid><description>&lt;p&gt;OpsPilot started with a simple question: &lt;strong&gt;what would happen if I built the operational tooling I kept wishing I had?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;As I continued working across backend engineering, DevOps, and cloud-native infrastructure, I found myself repeatedly dealing with the same categories of operational work. Instead of treating those tasks as isolated scripts and commands, I wanted to explore what it would look like to bring them together into a coherent engineering platform.&lt;/p&gt;</description></item></channel></rss>