Thoughts, ideas &
stories worth telling
A space to write, reflect, and share โ one post at a time. Crafted with intention.
Que Sera Sera
Whatever will be, will be. I put a lot of pressure on myself to have good labs. I know how that sounds. But if these last few months have taught me anything, it's that life is unpredictable and no amount of control changes that. Every time my numbers come back off, I go back through everything. Every product I used, every meal, every choice searching for what I did wrong. And when the numbers are good, I repeat the same steps like a ritual, as if precision can guarantee the outcome. It can't. So many things influence the body. And the remarkable thing is how it maintains balance through all of it all the stress, the uncertainty, the things we put it through. We only start to notice how miraculous the body is when it stops meeting our expectations. I watched a documentary recently about the body's ability to heal. A faith healer said something that stayed with me it's never really a question of whether the body can heal. The real question is what you're giving power to. Where are you placing your faith? In the illness? Or in something greater? I can obsess over every variable and make myself sick trying to control the uncontrollable. Or I can live fully, presently and trust in something bigger than my fear. I know which one brings peace. My numbers this morning weren't perfect. And I'm learning to let that be. I'm choosing faith over fear. Abundance over illness. Trust over control. I can't control life. I can only control where I set my gaze
Building a Lightweight SOC Dashboard from Scratch
Security teams at big companies have expensive SIEM tools that cost thousands of dollars a year. I decided to build my own โ a lightweight Security Operations Center (SOC) dashboard using Python and Flask. The project handles the core things a SOC analyst actually needs: ingesting and normalizing logs, running detection rules against them, managing alerts, and getting notified via email or Slack when something suspicious happens. I also added threat intelligence enrichment using AbuseIPDB, which lets you check whether an IP address has been flagged for malicious activity anywhere on the internet. The whole thing runs locally on port 5050 โ no cloud required, no subscriptions. You drop in your logs, the detection engine evaluates them against rules you define, and alerts get fired with full context. You can also plug in a local threat feed (a simple JSON or CSV file of known-bad IPs) if you want to go beyond the public API. What I learned building this is that the hardest part isn't the detection logic โ it's the normalization step. Logs come in wildly different formats depending on the source, and getting them into a consistent schema is where most of the real work lives. If you're studying for a cybersecurity cert or just want to understand how SIEMs actually work under the hood, building something like this yourself is 100x more valuable than reading about it. The full code is on my machine โ planning to push it to GitHub soon.
Project Lisa
While most people scroll job boards, I'm building an agent to do it for me. I call her Stacey. She's not public she works exclusively for me, and honestly she's earned that exclusivity. Here's her routine: ๐ Every 6 hours she scrapes Fuzu, BrighterMonday, JobWebKenya, MyJobMag, and LinkedIn. ๐ง Each job gets scored against my CV using Gemini 2.0 Flash. (I'd switch her to Claude or OpenAI if she misbehaves cuz she can get moody at times.) โ๏ธ Strong matches? She drafts a tailored cover letter. ๐ฑ Then she pings me on Telegram for me to confirm if she sends or skip. I stay in control (im still the boss ๐ ). She has to do the legwork. Basically my personal HR intern who never complains about overtime. ๐ฆ The stack: Python ยท Gemini 2.0 Flash ยท Telegram Bot API ยท Gmail SMTP ยท Linux The scars: She started life running Qwen 2.5:14b locally via Ollama a 9GB model timing out like a matatu stuck in traffic. Scoring one job took 2 minutes. I ripped it out and migrated everything to the Gemini API. Problem solved. Then OpenClaw locked me out at 2am with config files that refused to accept a Telegram channel for 32 straight hours. I came out the other side a changed man. First hunt: 14 jobs found. 6 strong matches. 6 cover letters drafted. The automation works. The job market is a numbers game. I just automated my side of it.
Know Your Worth
If you are the one in your family who built everything alone, who carried others while no one carried you, who made something out of what looked like nothing stop waiting for recognition that may never come. Give it to yourself. Price accordingly. Apply for the role that feels too big. Charge the rate that makes you nervous. Stop explaining yourself to people who benefited from underestimating you. The overlooked one often becomes the most capable one. Not despite the struggle but because of it.
A Community Center Website
A full community center website clean design, fast load, deployed on Vercel. Built from scratch the way I build everything: intentionally, with attention to every detail. Fun fact: Ctrl+C + Ctrl+V is not web development. It's just borrowing someone else's bugs. ๐ Someone copied my work issues and all deployed it before it was ready, then went quiet the moment things broke. No calls. No texts. Just silence. So I did what I always do. I built something better, shipped it, and moved on. That's the thing about original work it holds up. Copies don't. I'm not building to impress anyone. I'm building because it's the one thing that makes sense when everything else doesn't. If you've read my earlier posts you already know that. The brief for 2026 is simple: original work, for people who appreciate it. That's it. โ๏ธ
The Blog Behind the Blog
This blog didn't start polished. It started as an idea a place to document the work, the lessons, and the season I'm in. But building the container turned out to be its own story worth telling. And it took me a whole month. A whole freaking month. The blog is built on Next.js. Not a template, not a starter kit a real application with its own config, its own structure, and its own set of problems to solve. Early on I was using SQLAlchemy as the ORM layer. It made sense at the time familiar, flexible, and I'd used it in my Flask projects. But it introduced friction I didn't want. Abstraction on top of abstraction, and it started to feel like I was fighting the stack instead of building with it. So I made the call to switch directly to PostgreSQL. Raw, clean, and honest. No middleman. Yes, I could have just kept SQLAlchemy. No, I will not be taking questions. Hosting the database was the next decision. I went with Vercel Postgres keeping everything under one roof. The database, the deployment, the environment variables all in one place. That kind of cohesion matters when you're a solo developer managing multiple projects. It meant I could push a change and trust that everything would talk to each other the way it was supposed to. Simple in theory. Absolutely not in practice. The next.config.js file became the heartbeat of the project. Image domains, environment handling, build configuration it's where the decisions live. Getting it right took iteration. A lot of it. More than I'd like to admit on a public blog. But once it clicked, the whole app felt solid. What I built is simple on the surface. A home page. Posts. An about page. An admin login. But underneath it, there's a real database storing real data, a deployment pipeline that works, and a configuration I understand from top to bottom. Was it supposed to take a month? Probably not. But that's how it went and I'd do it again.
I Built My Portfolio From Scratch Here's Why It Matters
My portfolio isn't just a website. It's proof. Proof that I can take a design from zero to deployment. Proof that I understand frontend, backend, and everything in between. And proof that even in the middle of a difficult season, I kept building. The site portfolio ( nahumk.vercel.app ) is built on Flask, deployed on Vercel, with a custom design I wrote myself. Dark mode, responsive layout, a blog, a projects page, and a contact form that actually works. But more than the tech, I wanted it to represent who I am โ someone who takes craft seriously, pays attention to detail, and builds things that look and feel intentional. It's a living document. I'm updating it as I build, learn, and grow. If you're a recruiter or a developer have a look. And if something you see there is useful to you, let's talk.
I Built a School Management System in 20 Days Here's What I Learned
When I started this project I didn't set out to build anything fancy. I just wanted to solve a real problem Kenyan schools are still managing students, fees, and exams on paper or clunky spreadsheets. I wanted to change that. So I built SchoolApp. In roughly 20 days I put together a full school management system built on Flask and PostgreSQL, with three user roles Admin, Bursar, and Teacher each with their own dashboard and permissions. Students, fees, exams, timetables. All in one place. The part that challenged me most was the M-PESA integration via Daraja API. If you've worked with Daraja you know it's not plug and play โ OAuth tokens, STK push, payment callbacks. It pushed my understanding of APIs to a new level, and I'm still refining it. Is it perfect? No. But it's live, it's functional, and it solves a real problem for a real market. That's what I'm building toward โ software that actually means something where I come from. Live demo: schoolapp-if2k.onrender.com
When Everything Falls Apart and You Keep Building Anyway
There's a version of this post where I only talk about the projects I'm working on and the skills I'm sharpening. Clean. Professional. Safe. But that's not the whole truth. The truth is I resigned from my job. Not fired. I walked away, because I was financially drowning and mentally exhausted in ways I couldn't keep pretending weren't real. Around the same time, I went through a laminectomy, and the recovery wiped out most of what I had saved. We live in a society where men don't talk about these things. You're supposed to have it together or at least look like you do. So I carried it quietly. For a long time. And then the people I had poured into family I supported intensively, often at the cost of my own well-being pulled away the moment I stopped being useful. No income, no access. Just like that. I should have seen it coming. It had happened before. But I kept believing that if I gave enough, I'd finally earn what I'd always needed from them. I know now that's not how love works. You can't sacrifice your way into belonging. I'm a middle child. Maybe some of this was written into my story from the beginning. But I'm done shrinking to make others comfortable. What kept me going was building. Writing code. Creating things. Putting work out into the world even when the world felt indifferent. It's not glamorous. But it's mine. I'm not writing this for sympathy. I'm writing it because someone out there needs to hear that hard seasons don't disqualify you they clarify you. I'm still here. I'm still building. And I'm open to opportunities.