<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Taslim Okunola</title>
    <link>https://taslim.xyz</link>
    <description>Thoughts on product, strategy, marketing, and building with AI.</description>
    <language>en-us</language>
    <lastBuildDate>Wed, 08 Apr 2026 20:28:34 GMT</lastBuildDate>
    <atom:link href="https://taslim.xyz/rss.xml" rel="self" type="application/rss+xml" />
    <image>
      <url>https://taslim.xyz/og-image.jpg</url>
      <title>Taslim Okunola</title>
      <link>https://taslim.xyz</link>
    </image>
    <item>
      <title>The matters system for an AI agent</title>
      <link>https://taslim.xyz/blog/the-matters-system-for-an-ai-agent</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/the-matters-system-for-an-ai-agent</guid>
      <pubDate>Wed, 08 Apr 2026 20:26:28 GMT</pubDate>
      <category>ai</category><category>agents</category><category>nanoclaw</category><category>engineering</category>
      <description><![CDATA[A technical reference for the matters system — a SQLite-backed workstream tracking layer for AI agents. Covers data model, statuses, artifacts, context hygiene, authority hierarchy, and MCP tools.]]></description>
      <content:encoded><![CDATA[<p>I run a Nanoclaw agent as an executive assistant. With access to a filesystem, everything goes into a markdown file. But flat files are far from deterministic. With stale states and fragmented context, it's hard for the agent to reliably answer "what's true right now?". I realized it was often dropping the ball on some things or overindexing on others. This was supposed to be the unlock for me - the agent taking care of the scattered, moving parts of my life so I don't have to.</p>
<p>To address this, I created a matters system and decided to share the technical details below:</p>
<h2>Overview</h2>
<p>A <strong>matter</strong> is a persistent, database-backed record that tracks the current state of a workstream. It is the single source of truth for any ongoing task, project, or coordination effort. Email threads, calendar events, and conversations are inputs to a matter — the matter is where they converge.</p>
<p>Matters are stored in a SQLite database and accessed via MCP tools. They are not markdown files. Multiple agents and groups read and write to the same matter database simultaneously.</p>
<hr />
<h2>Data Model</h2>
<p>Each matter has the following fields:</p>
<table>
<thead>
<tr>
<th><strong>Field</strong></th>
<th><strong>Type</strong></th>
<th><strong>Description</strong></th>
</tr>
</thead>
<tbody><tr>
<td><code>id</code></td>
<td>Integer</td>
<td>Auto-incremented unique identifier</td>
</tr>
<tr>
<td><code>title</code></td>
<td>String</td>
<td>Short descriptive title</td>
</tr>
<tr>
<td><code>status</code></td>
<td>Enum</td>
<td>Current lifecycle status (see below)</td>
</tr>
<tr>
<td><code>context</code></td>
<td>Text</td>
<td>Living summary of current state (see below)</td>
</tr>
<tr>
<td><code>artifacts</code></td>
<td>Array</td>
<td>Linked external items (see below)</td>
</tr>
<tr>
<td><code>tracking_file</code></td>
<td>String</td>
<td>Optional filename in group <code>notes/</code> folder for supplementary detail</td>
</tr>
<tr>
<td><code>updated_at</code></td>
<td>Timestamp</td>
<td>Last updated datetime (UTC)</td>
</tr>
</tbody></table>
<hr />
<h2>Statuses</h2>
<table>
<thead>
<tr>
<th><strong>Status</strong></th>
<th><strong>Meaning</strong></th>
</tr>
</thead>
<tbody><tr>
<td><code>active</code></td>
<td>Work is in progress</td>
</tr>
<tr>
<td><code>waiting</code></td>
<td>Blocked on an external party or condition</td>
</tr>
<tr>
<td><code>escalated</code></td>
<td>Waiting on the principal's input or decision</td>
</tr>
<tr>
<td><code>paused</code></td>
<td>Intentionally on hold</td>
</tr>
<tr>
<td><code>resolved</code></td>
<td>Complete — no further action needed</td>
</tr>
</tbody></table>
<p>Default list view shows: active, waiting, escalated. To see paused and resolved, filter explicitly.</p>
<hr />
<h2>Artifacts</h2>
<p>Artifacts are external items linked to a matter. Each artifact has a <code>type</code> and an <code>id</code>.</p>
<table>
<thead>
<tr>
<th><strong>Type</strong></th>
<th><strong>ID Format</strong></th>
<th><strong>Example</strong></th>
</tr>
</thead>
<tbody><tr>
<td><code>email_thread</code></td>
<td>Gmail thread ID</td>
<td><code>abc1234def5678gh</code></td>
</tr>
<tr>
<td><code>calendar_event</code></td>
<td>Google Calendar event ID</td>
<td><code>calid_base_20260401T170000Z</code></td>
</tr>
<tr>
<td><code>task</code></td>
<td>NanoClaw task ID</td>
<td><code>task-1234567890123-abc123</code></td>
</tr>
<tr>
<td><code>doc</code></td>
<td>Google Drive document ID</td>
<td><code>1AbCdEfGhIjKlMnOpQrStUvWxYz123456789</code></td>
</tr>
</tbody></table>
<p>Artifacts are a full replacement list — when updating artifacts, the entire array is replaced.</p>
<hr />
<h2>The Context Field</h2>
<p>The context field answers one question: <strong>what is true right now about this workstream?</strong></p>
<p>It is a current-state snapshot, not a log. It is rewritten on each update — not appended to.</p>
<h3>What belongs in context</h3>
<ul>
<li>Current state of all key facts (location, timing, participants, decisions)</li>
<li>Source and time tag on every fact: <code>Location: TBD (principal, Mar 5)</code></li>
<li>Agent actions taken: <code>Emailed organizer with available slots (Soji, Mar 5 9am)</code></li>
<li>Open items and who owns them</li>
<li>Any directives from the principal</li>
</ul>
<h3>What does NOT belong in context</h3>
<ul>
<li>Historical log of every prior state</li>
<li>Duplicate entries for the same fact</li>
<li>Superseded information (remove it or mark <code>(superseded)</code>)</li>
<li>Analysis or interpretation</li>
</ul>
<h3>Format convention for facts</h3>
<pre><code>Fact description (source, date)
</code></pre>
<p>Examples:</p>
<ul>
<li><code>Location: TBD (principal, Mar 5)</code></li>
<li><code>Filing target: Q3 2026 (vendor, Jun 10)</code></li>
<li><code>Soji followed up on pending deliverable (Soji, Mar 8 9am)</code></li>
</ul>
<hr />
<h2>Information Authority Hierarchy</h2>
<p>When information conflicts across sources, resolution follows this order (highest to lowest):</p>
<ol>
<li><strong>Principal's word</strong> — anything said directly by the principal is final</li>
<li><strong>Current system state</strong> — what the API returns right now (live calendar event, live email thread)</li>
<li><strong>Matter context</strong> — prior decisions and facts stored in the matter (verify against #2 before relying on it)</li>
<li><strong>Third-party communication</strong> — emails, calendar invites, or messages from external parties</li>
</ol>
<p>Recency is not a reliable proxy for authority. A more recent calendar invite from a third party does not override an instruction from the principal.</p>
<p>When conflict is resolved, the matter context is updated to reflect the authoritative fact. The superseded fact is removed.</p>
<hr />
<h2>Before-Acting Protocol</h2>
<p>Before taking any action on a workstream that has a matter:</p>
<ol>
<li><strong>Read the matter</strong> — get prior context, decisions, and what actions have already been taken</li>
<li><strong>Fetch fresh source data</strong> — pull the live email thread, live calendar event, or other primary source from the API</li>
<li><strong>Compare and reconcile</strong> — if the live source contradicts the matter context, update the context using the authority hierarchy above</li>
<li><strong>Act</strong> — take the action</li>
<li><strong>Record</strong> — add a timestamped entry to the context field documenting what was done</li>
</ol>
<p>This protocol prevents two failure modes: acting on stale context (e.g., a meeting was moved but the matter wasn't updated), and duplicate actions (e.g., an email was already sent in a prior run but the matter doesn't reflect it).</p>
<hr />
<h2>When to Create a Matter</h2>
<p>Create a new matter when:</p>
<ul>
<li>The principal assigns a new workstream that will involve multiple steps or interactions over time</li>
<li>A coordination effort spans multiple external parties</li>
<li>Something needs to be tracked across multiple sessions or agent runs</li>
</ul>
<p>Do not create a new matter when:</p>
<ul>
<li>A new email arrives about an existing workstream — add the thread as an artifact on the existing matter</li>
<li>A calendar event is created for an ongoing project — link it as an artifact on the existing matter</li>
<li>The task is one-off and complete in a single action</li>
</ul>
<p>Before creating a new matter, check if one already exists via <code>find_matter</code> (by artifact ID) or <code>list_matters</code> (by scanning titles).</p>
<hr />
<h2>The Matter as Broadcast Channel</h2>
<p>Matters are the mechanism by which state changes propagate across agents and groups. When the principal gives an instruction that changes a workstream — a new location, a revised deadline, a dropped participant — the agent updates the matter context. Other agents or groups that subsequently read the matter will see the updated state.</p>
<p>There is no separate notification mechanism. The matter itself is the broadcast.</p>
<hr />
<h2>Tracking Files</h2>
<p>A matter can reference an optional tracking file stored in the group's <code>notes/</code> folder. Tracking files hold supplementary depth: research, timelines, detailed checklists, post-mortems, or context that doesn't fit in the matter's context field.</p>
<p>The matter is always authoritative. The tracking file supplements it. If they conflict, the matter wins.</p>
<p>Tracking files are referenced by filename only (e.g., <code>project-tracker.md</code>). They live at <code>/workspace/group/notes/{filename}</code>.</p>
<hr />
<h2>MCP Tools</h2>
<table>
<thead>
<tr>
<th><strong>Tool</strong></th>
<th><strong>Purpose</strong></th>
</tr>
</thead>
<tbody><tr>
<td><code>mcp__nanoclaw__list_matters</code></td>
<td>List matters by status. Default shows active, waiting, escalated. Pass <code>status: "all"</code> to include paused and resolved.</td>
</tr>
<tr>
<td><code>mcp__nanoclaw__get_matter</code></td>
<td>Get full details of a specific matter by ID, including context and artifacts.</td>
</tr>
<tr>
<td><code>mcp__nanoclaw__create_matter</code></td>
<td>Create a new matter with title, status, context, and optional artifacts.</td>
</tr>
<tr>
<td><code>mcp__nanoclaw__update_matter</code></td>
<td>Update any field. Only provided fields change — omitted fields stay the same. Context should be a full rewrite, not an append.</td>
</tr>
<tr>
<td><code>mcp__nanoclaw__find_matter</code></td>
<td>Find a matter by linked artifact. Pass <code>artifact_type</code> and <code>artifact_id</code>. Useful for checking if an email thread or calendar event is already tracked.</td>
</tr>
</tbody></table>
<hr />
<h2>Context Hygiene Rules (Summary)</h2>
<ul>
<li><strong>Reconcile, don't append.</strong> New information replaces what it supersedes.</li>
<li><strong>Tag every fact.</strong> <code>Fact (source, date)</code> — so any agent can assess authority and recency.</li>
<li><strong>Record actions.</strong> Document what was done and when, to prevent duplicate actions.</li>
<li><strong>Prune stale facts.</strong> Remove superseded information. Stale facts cause wrong conclusions.</li>
<li><strong>Rewrite on update.</strong> Pass the full updated context string — not a delta.</li>
</ul>
]]></content:encoded>
    </item><item>
      <title>The agent that knows you vs. the agent army</title>
      <link>https://taslim.xyz/blog/the-agent-that-knows-you-vs-the-agent-army</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/the-agent-that-knows-you-vs-the-agent-army</guid>
      <pubDate>Tue, 31 Mar 2026 00:53:32 GMT</pubDate>
      <category>ai</category><category>agents</category><category>future of work</category>
      <description><![CDATA[Most thinking about personal AI agents splits into two camps: agents as extensions of yourself, or agents as employees you manage. I have a strong lean toward the first — and here's why I think the extension model creates more value, compounds differently, and might even solve the institutional knowledge problem.]]></description>
      <content:encoded><![CDATA[<p>Since OpenClaw went viral in November 2025, I've been sitting with a question I keep circling back to. I've been running NanoClaw as my executive assistant for a while now, and the more I use it, the more I wonder: are we building tools, or are we building extensions of ourselves? The answer is probably both.</p>
<p>The way I see it, most of the thinking on personal AI agents has split into two directions, and they feel genuinely different from each other.</p>
<p>One direction is agents as extensions of the person. Your agent truly knows you, thinks like you, amplifies what you'd do if you had more hours in the day. It's personal. The other direction is agents as employees. You spin up five, ten, twenty specialized agents, each running a distinct function: marketing, operations, research. You become more like a CEO of a tiny AI org.</p>
<p>Both will exist. Both are already happening. However, my philosophical lean is toward the first one, and here's my thinking on that.</p>
<p>Dan from Every introduced a framing that I genuinely can't get out of my head: the shadow org chart. Picture your company, but every single person in it has their own agent, one built around how that specific person works. You suddenly have a parallel organization running alongside the real one, a second layer of context-rich partners for every human in the building. Now compare that to the company-wide AI tool model. The shared tool can only respond to you. You go to it, it answers, you leave. It has no stake in your work. Your personal agent is different because it can act on your behalf. A colleague messages you with a question while you're deep in something else? Your agent can handle it. It knows your position, your context, your usual reasoning. The shared tool is still fundamentally a tool, just a sharper one. The personal agent is closer to a proxy. The possibilities there is incredible.</p>
<p>That said, the agent-as-employee model has a genuine case worth sitting with.</p>
<p>If you can run ten specialized agents where you'd otherwise need ten employees, something economically interesting happens. Startups will try this. Some will pull it off. But there's a diminishing returns problem buried in that model that doesn't get enough air time. When you use an agent to 10x a single person's output, the human stays in the loop, making judgment calls, following threads that go sideways in useful ways, catching things that surprise them. The agent augments a person who is still actively thinking. Push further down that curve, toward full replacement, and the thing you start to lose is harder to name: creative friction, the random insight from someone who's been staring at a problem for three years, the judgment that only accumulates through lived experience. At some point on that curve, you're not amplifying anymore. You're just hoping the agents don't miss what a person would have caught.</p>
<p>Here's what pulls me back to the extension model every time, though. Imagine every employee has an agent that is genuinely expert in what they are expert in, a specialized partner that grew into the role alongside the person who lives it. You get amplified output with very little quality drop, because the agent earned its context rather than being dropped in cold. The productivity gains work differently that way. You're multiplying human judgment, not replacing it.</p>
<p>And then there's an angle on this that I think is wildly underrated: onboarding.</p>
<p>When someone leaves a company, they carry a lot out the door with them. Institutional knowledge, context, the informal understanding of how things actually work. Documentation helps, knowledge transfer sessions help, but anyone who's been through it knows there's still a gap. In the extension model, that gap shrinks considerably. The agent is tied to the role, so a successor inherits something that already knows the job deeply: the decisions that were made, the patterns that worked, the context that took years to accumulate. That knowledge stays in the building.</p>
<p>We're early enough that most companies haven't figured out which model they're building toward. Both will get tried. But the one I'm most looking forward to watching? The agents that actually extend the humans, not replace them.</p>
]]></content:encoded>
    </item><item>
      <title>I used NanoClaw as my executive assistant for a month</title>
      <link>https://taslim.xyz/blog/i-used-nanoclaw-as-my-executive-assistant-for-a-month</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/i-used-nanoclaw-as-my-executive-assistant-for-a-month</guid>
      <pubDate>Sun, 29 Mar 2026 03:53:16 GMT</pubDate>
      <category>AI</category><category>productivity</category><category>NanoClaw</category>
      <description><![CDATA[A month of running an AI agent as my executive assistant — what worked, what didn't, and what it actually takes to get value from it.]]></description>
      <content:encoded><![CDATA[<p>A few weeks ago, I got a calendar invite for date night. Restaurant already in there, address and everything. I figured my wife had taken care of it.</p>
<p>She hadn't. NanoClaw had.</p>
<p>We went. Great spot, one we'd somehow never discovered despite living five minutes away. But that moment, realising an AI had made the booking and my wife hadn't batted an eye, is the most accurate preview I can give you of what this tool actually feels like to use. It starts acting inside your real life, and the handoff is seamless enough that nobody notices.</p>
<p>I ran NanoClaw for about a month: its own Google Workspace account, shared calendars, added to email threads, a structured system for tracking everything it was supposed to own. The setup alone tells you something about what it actually takes to run an AI at this level. Here's what I learned.</p>
<h2>What worked and what didn't</h2>
<p>Follow-ups were where it pulled its weight. At any point I had a handful of conversations sitting in a half-finished state: someone I needed to nudge on a decision, a call that needed rescheduling, a document I'd been waiting on for too long. That stuff tends to pile up quietly until it becomes a problem. NanoClaw tracked it and acted on it without me having to hold any of it in my head. The stronger move, though, was when it picked up something I'd let slip completely. Executing what you remember is useful. Catching what you forgot is the part that actually changes things.</p>
<p>It also caught calendar conflicts before they landed on me. Moved things around, looped in the right people, handled the coordination. That's the kind of task that isn't hard, it just requires attention at the exact wrong moment. Having that covered made a real difference.</p>
<p>Where it fell short was subtler. The real problem isn't that you forget to update it — it's that the system has no reliable sense of what should persist and what shouldn't. A standing priority, an ongoing relationship, a decision you made three weeks ago: all of that lives in the same flat layer as a one-off instruction from yesterday. NanoClaw can't tell the difference, so it either holds onto things too long or drops them at the wrong moment. I ended up building a separate "matters" system to track context somewhat deterministically across sessions (still a work in progress), which tells you something about how unsolved this problem actually is.</p>
<p>Then there's the proactivity dial, which I'm still calibrating. Early on it over-flagged: surfacing things for my attention that didn't need it, checking in when it should have just acted. I fixed that by updating its instruction files to push it toward doing more without asking. That helped, but it introduced a new problem. Duplicate follow-ups to the same person. Tasks showing up twice with slightly different wording. Actions it took that I would've caught if it had just checked in first. You move the dial too far one way and you're drowning in noise; too far the other and it's running ahead of you. The right setting exists somewhere in the middle, and finding it is ongoing.</p>
<h2>In closing</h2>
<p>Would I keep using it? Yes. But the tool is a work in progress, and so is my setup. The underlying model will improve, the SDK will improve, and I'll keep refining how I run it. The version I'm using in six months won't be the same as the one I started with.</p>
<p>It works in proportion to how much you trust it with. Give it too little and it's just an expensive reminder system. Give it too much and you're cleaning up after it. The interesting zone is somewhere in between, and getting there takes more active management than the demos might suggest.</p>
<p>If you want to try the setup I've been running, it's open source: <a href="https://github.com/taslim/nanoclaw-gws-ea">taslim/nanoclaw-gws-ea</a>. It's a <a href="https://github.com/qwibitai/nanoclaw">NanoClaw</a> flavour built specifically for Google Workspace — Google Chat, Gmail triage, calendar management, Docs, all running in isolated containers. The instruction files and the matters system are in there too. It's a starting point, not a finished product.</p>
]]></content:encoded>
    </item><item>
      <title>Stay Curious</title>
      <link>https://taslim.xyz/blog/stay-curious</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/stay-curious</guid>
      <pubDate>Sat, 10 Jan 2026 02:10:31 GMT</pubDate>
      <category>career</category><category>growth</category><category>curiosity</category><category>reflection</category>
      <description><![CDATA[Stay curious. Let it guide you toward passion and impact.]]></description>
      <content:encoded><![CDATA[<p>I had two interviews today and a random conversation with a colleague - yes, I
go into the office on a Friday. Across all three conversations, I found myself
repeating the same thing: stay curious.</p>
<p>The first time was in response to a question about the principle that has guided
my career moves and growth.</p>
<p>Curiosity is a simple, yet powerful thing.</p>
<p>It’s simply about asking questions and being genuinely interested. When I was a
Product Marketing Manager, my focus was on user insights. This meant countless
interviews and analysis to deeply understand what users wanted. Sometimes, we
would propose changes backed by solid insights and still get a “no”. I became
curious about why that is. I asked myself, <em>how do business leaders think
through these kinds of decisions? What other factors are they looking at?</em> This
was what drew me to Strategy and Operations. I was just interested in
understanding the business side of things.</p>
<p>It’s powerful because of what it can become. Curiosity births passion, and
passion births outsized impact. When you’re deeply curious about something, you
don’t stop at surface-level answers. You go deeper. You get a little obsessed.
This is the bedrock of innovation. Even breakthroughs in AI came about because
some people were curious and obsessed enough about it to keep pushing.</p>
<p>Stay curious. Let it guide you.</p>
]]></content:encoded>
    </item><item>
      <title>Sharing My USPS Mail Alerts Apps Script</title>
      <link>https://taslim.xyz/blog/sharing-my-usps-mail-alerts-apps-script</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/sharing-my-usps-mail-alerts-apps-script</guid>
      <pubDate>Sun, 23 Mar 2025 00:00:00 GMT</pubDate>
      <category>building</category><category>automation</category><category>google-apps-script</category><category>open-source</category>
      <description><![CDATA[Discover how I automated USPS Mail Alerts with a simple Google Apps Script. From scanning emails to creating Google Task reminders, I built a system that optimizes my mailbox-checking routine. Check it out and contribute to making mail-checking effortless!]]></description>
      <content:encoded><![CDATA[<blockquote>
<p><em>tl;dr – USPS Mail Alerts
(<a href="https://github.com/taslim/usps-mail-alerts">GitHub repo here</a>) is a Google
Apps Script that automatically creates Google Tasks reminders based on USPS
Informed Delivery emails.</em></p>
</blockquote>
<p>I remember the first time I stumbled across Google Apps Script in college, my
mind was blown to pieces. The sheer possibilities of extending the capabilities
of your Google apps was inviting, even though I couldn't write a lick of code
back then <em>(I still can't write now. I just understand it better)</em>. Fast-forward
to today, and the itch to build cool stuff never left me. The twist is that LLMs
can now write code for you. I started by conjuring complex Google Sheets
formulas with AI chatbots, then quickly graduated to building Apps Scripts. It's
been a wild journey. And today, I'd love to share one of those projects with
you—my USPS Mail Alerts Apps Script.</p>
<h2>The Idea</h2>
<p>It all started in the summer of 2023. I had just moved to the United States six
months prior and signed up for a free USPS service called
<a href="https://www.usps.com/manage/informed-delivery.htm">Informed Delivery</a>. They
basically send you an email in the morning if you have any physical mail heading
your way that day. Being the diligent mailbox checker that I am, this was a
lifesaver because it saved me from frequent trips to a disappointingly empty
mailbox.</p>
<p>But then, I thought, what if I could make this process even smoother? That's
when the LLM craze hit, and I decided to build something nifty to make my
mail-checking experience better.</p>
<h2>v1 – Check email and create task</h2>
<p>My initial idea was simple: build an Apps Script to scan those Informed Delivery
emails and create a task in Google Tasks if a new email showed up. Here's the
flow I came up with:</p>
<ul>
<li>I created a Gmail filter to move the USPS emails to a specific label.</li>
<li>The script scanned that label for new emails and added a task to Google Tasks
if it found one.</li>
</ul>
<p>See the code snippet for v1:</p>
<pre><code>function createTaskForNewEmails() {
  var labelName = "a--notify/2-informed delivery";
  var taskTitle = "Pick up mails";

  var label = GmailApp.getUserLabelByName(labelName);
  if (label === null) {
    console.log("Label not found.");
    return;
  }

  var threads = label.getThreads();

  for (var i = 0; i &lt; threads.length; i++) {
    var today = new Date();

    var thread = threads[i];
    var messages = thread.getMessages();
    var lastMessage = messages[messages.length - 1];

    var messageDate = lastMessage.getDate();

    // Create a new task
    var task = Tasks.newTask();
    task.title = taskTitle;
    task.due = dueDate.toISOString();

    // Save the task
    var taskListId = "taskID"; // Replace with your task list ID
    Tasks.Tasks.insert(task, taskListId);

    break; // Exit the loop after creating a task for the first new email
  }
}
</code></pre>
<p>You can already tell some of the problems with v1:</p>
<ul>
<li>If USPS changed their email formatting and it breaks my filter, I wouldn't
receive the emails under the label, which meant no reminders.</li>
<li>If I didn't clear the reminder after picking up even one piece of mail, my
Google Tasks would get clogged.</li>
<li>Picking up mail one piece at a time was ridiculously inefficient.</li>
</ul>
<h2>v2 – Make it better!</h2>
<p>In just one year, the models got incredibly better. Everyone was experimenting
with more complex apps including me. I even built a
<a href="https://fortune.nownow.ai/">fortune cookie app</a> but I digress. Inspired by how
far AI-assisted coding had come, I redesigned my mail alert apps script and
fired up my AI chatbots to help code it.</p>
<p>What I improved:</p>
<ul>
<li>Instead of relying on labels, the script now scans the inbox directly for USPS
Informed Delivery emails.</li>
<li>It identifies how many mail pieces are expected and includes that number in
the task description so I don't rush to the mailbox if it's just one letter.</li>
<li>It checks if a task already exists for the day and updates it rather than
creating a new one. It even accumulates the total count of mail pieces, so I
only check the mailbox when it's worth the trip.</li>
<li>Introduced an ad-checker to detect if the email is just an ad. Because why
waste a trip if it's all spammy promos and no physical mail at all?</li>
</ul>
<p>Today, I'm open-sourcing v2 of this script so we can all improve our
mailbox-checking experience and optimize our laziness <em>(I mean efficiency 😂)</em>
together.
<a href="https://github.com/taslim/usps-mail-alerts/">See the GitHub repo here</a>. You can
also find the
<a href="https://github.com/taslim/usps-mail-alerts/?tab=readme-ov-file#usps-mail-alerts">README</a>
in the GitHub repo, with straightforward instructions even for folks who don't
code.</p>
<p>Let me know what you think! And if you have any suggestions or improvements,
feel free to contribute.</p>
<p>Stay building! 🚀</p>
<p><strong><a href="https://news.ycombinator.com/item?id=43456355">Comment on Hacker News</a></strong></p>
]]></content:encoded>
    </item><item>
      <title>2025: Year of AI Copilots</title>
      <link>https://taslim.xyz/blog/2025-year-of-ai-copilots</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/2025-year-of-ai-copilots</guid>
      <pubDate>Thu, 09 Jan 2025 00:00:00 GMT</pubDate>
      <category>building</category><category>ai</category><category>artificial-intelligence</category><category>copilots</category><category>gpts</category>
      <description><![CDATA[I started 2025 by building AI copilots to make life easier and more fun. From trip planning to half marathon training, Custom GPTs and Gems are my new sidekicks. Sharing my journey to inspire you to experiment with AI in your own life.]]></description>
      <content:encoded><![CDATA[<p>My wife and I started the new year with a relaxing trip to the Central Coast of
California—exploring the historic sites of San Luis Obispo and the stunning
views at Pismo Beach. Before the trip, I decided to build a custom Gem to serve
as our sidekick through it all. If you're unfamiliar,
<a href="https://support.google.com/gemini/answer/15146780?hl=en">Gems</a> allow you to
reuse prompts for your Google Gemini chats. You can also include files in a
Gem's knowledge base to better ground the chatbot. They're similar to ChatGPT's
<a href="https://help.openai.com/en/articles/8554397-creating-a-gpt">Custom GPTs</a>.</p>
<p>The idea for the Gem was simple:</p>
<ul>
<li>Help plan a trip, either from scratch or by leveraging an existing guide.</li>
<li>Serve as an on-demand resource throughout the trip, making recommendations and
retrieving information with ease.</li>
</ul>
<figure><img src="https://taslim.xyz/images/blog/2025-year-of-ai-copilots/view_from_mission_san_luis_obispo.jpg" alt="View from Mission San Luis Obispo de Tolosa" /><figcaption>Nice view from Mission San Luis Obispo de Tolosa by Taslim Okunola</figcaption></figure>

<p>I turned to a good friend of mine who runs a
<a href="https://samefootprints.com/">travel blog</a>. She's a pro at crafting
<a href="https://samefootprints.com/same-footprints-guide/">custom travel guides</a>, and
her sample guide for the Central Coast was the perfect foundation. She had
previously created a tailored Miami guide for me in 2023 that I absolutely
loved. With her Central Coast guide in hand, Gemini and I collaborated on an
itinerary. It became my daily ritual to check in with Gemini for everything from
activity reminders to menu suggestions. When I got to a restaurant on our list,
I would ask it, <em>"what's the recommended dish to get here?"</em> Each time, the Gem
would pull directly from the guide, seamlessly blending my friend's expertise
with AI's ability to synthesize and retrieve information instantly. It felt like
the best of both worlds—human expertise paired with AI superpowers.</p>
<p>From this experience, I've developed a framework that will guide how I think
about and approach consumer AI this year:</p>
<ul>
<li><p><strong>Simplicity beats complexity</strong>. With AI advancing at breakneck speed, it's
tempting to get caught up in the race and feel left behind. I get it. People
are already talking about agents. Sam Altman says OpenAI will achieve AGI this
year. But maybe it's time we take a step back. Let's return to the basics and
explore what we can still accomplish with existing, commercial-grade LLM
chatbots. As Anthropic aptly states in their
<a href="https://www.anthropic.com/research/building-effective-agents">blog on <em>building effective agents</em></a>,
<em>"When building applications with LLMs, we recommend finding the simplest
solution possible, and only increasing complexity when needed. This might mean
not building agentic systems at all."</em></p>
</li>
<li><p><strong>AI copilots can truly 10x your life.</strong> <em>Travel With Me</em>, as I named the Gem
I built for the Central Coast trip, is just the beginning. I deliberately
designed it to be open-ended, so I can reuse it for other trips this year.
Beyond <em>Travel With Me</em>, I've already created <em>FitCoach</em> to support my half
marathon training and <em>Blog SideKick</em>, my personal editor-in-chief for this
blog. Building these tools isn't just for tech enthusiasts or developers;
anyone can do it. There's room for all of us to create copilots that make life
easier and more fulfilling.</p>
</li>
<li><p><strong>Human expertise remains essential</strong>. While there's a rush in the AI industry
to automate everything, I'm not here to optimize my life solely for the
efficiency of it. Quality still matters to me. There's little value in
retrieving information quickly if it's wrong or lacks depth. My trip was made
extraordinary because of my friend's guide. Likewise, my half marathon
training is built on tailored advice from another friend who truly understands
my goals and challenges. AI may be fast, but the depth and nuance of human
input are still essential. This may change tomorrow but that is the case
today.</p>
</li>
</ul>
<p>I am a naturally curious person and there is so much more I want to explore with
this technology. Gems and Custom GPTs are only one part of the equation. I hope
sharing my experience inspires you to think about small pockets of your life
experiences that could be made better with a touch of LLM magic—and that it
encourages you to experiment boldly.</p>
<p>The potential is enormous, and as I refine these systems, I look forward to
sharing my journey and maybe even releasing some of my Custom GPTs and Gemini
Gems publicly.</p>
<p>Here's to building in 2025!</p>
<p><em><strong>Thanks to</strong> Chisom Okpala and my Custom GPT for reviewing drafts of this.</em></p>
]]></content:encoded>
    </item><item>
      <title>An Ode to Uninterrupted Speech: A Writer&apos;s Reawakening</title>
      <link>https://taslim.xyz/blog/writers-reawakening</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/writers-reawakening</guid>
      <pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate>
      <category>musing</category><category>procrastination</category><category>unapologetically-you</category><category>writers-block</category><category>writing</category>
      <description><![CDATA[Reclaiming my voice through writing: a reflection on overcoming procrastination, perfectionism, and rediscovering the beauty of uninterrupted thought.]]></description>
      <content:encoded><![CDATA[<p>Every blue moon, I dust off my blog with fresh thoughts, fueled by a renewed
determination to write more. By the time I return, the moon has not only turned
blue again but has probably completed a few laps around the galaxy. I'm here
<em>(again)</em> to say, "not again"! Classic me, right? This time, I'm determined to
break free from the cycle—and as a start, let's talk about writing and what I
have learned about myself.</p>
<h2>The Beauty of Uninterrupted Speech</h2>
<figure><img src="https://taslim.xyz/images/blog/writers-reawakening/city_lights_bookstore.jpg" alt="City Lights Bookstore in San Francisco" /><figcaption>Photo by [Taslim Okunola](https://unsplash.com/@taslimo) on [Unsplash](https://unsplash.com/photos/tBKC9yrzC7o), December 2024</figcaption></figure>

<p>A few days after Christmas, my wife and I wandered into the iconic
<a href="https://citylights.com/">City Lights Bookstore</a> in Chinatown. The place was
buzzing, packed with people browsing endless shelves of books. Despite the
crowd, the space felt like home—warm, welcoming, and overflowing with stories. I
don't even read big books that much, but I was captivated by the sheer essence
of it all.</p>
<p>As I scanned the titles, I realized what makes books so unique: they offer
uninterrupted speech. In everyday life, especially at work, my ideas are often
interrupted by questions or comments before I've had a chance to fully express
them. But books? They let the author lay out their entire thought process
without interruption, a gift to both the writer and the reader.</p>
<p>It wasn't just the books themselves, but the sense of unspoken permission to
create that struck me. That space, filled with voices from countless authors,
reminded me that every thought deserves its time and place, uninterrupted. That
realization hit me hard. I miss writing long-form content—picking a topic of
interest, researching it thoroughly, and laying down my thought process bare.
Sure, your readers can disagree—and you can even respond to such
disagreements—but in that initial act of writing, it's all yours. That's the
beauty of it.</p>
<h2>Why I Stopped Writing</h2>
<p>So why did I stop? Back in college, I had blogs and even a physical newsletter
where I shared unfiltered thoughts with the world. Somewhere along the way, that
stopped. Looking back, here's what I see as the biggest culprits:</p>
<ul>
<li><strong>Procrastination:</strong> My Trello board is a graveyard of great ideas I haven't
acted on.</li>
<li><strong>Perfectionism:</strong> I edit as I write, chasing perfection until I abandon the
work entirely.</li>
<li><strong>Political Correctness:</strong> In today's divisive world, fear of potential
backlash has often silenced me.</li>
</ul>
<p>But above all, I stopped writing for myself. I began writing for an imaginary
audience, asking, "What do people want to hear?" even before I put pen to paper,
hand to keyboard, or Apple Pencil to iPad <em>(choose one)</em>. Visiting City Lights
reminded me of something vital: writing is about sharing your ideas. It is not
your job to take the world's ideas and repackage them. Writing is about
reclaiming that space of uninterrupted thought and expression where you can be
unapologetically yourself.</p>
<h2>Declaring a New Beginning</h2>
<p>Today, I'm declaring an end to my writing hiatus.</p>
<p>From now on, I'll write for the love of it, for the joy of sharing unfiltered
thoughts and experiences. I'll let go of overthinking and second-guessing. I'll
seek to reclaim that sacred space of uninterrupted speech I've missed so much.</p>
<p>If you're reading this, ask yourself: what's stopping you from reclaiming the
things you love? Feel free to send them to me over
<a href="https://taslim.xyz/contact/">email</a>.</p>
<p>Let's see where this journey takes me—and maybe, where it takes us.</p>
<p><em><strong>Thanks to</strong> Sandra Israel-Ovirih and my Custom GPT for reviewing drafts of
  this.</em></p>
]]></content:encoded>
    </item><item>
      <title>Navigating Ambiguity in Decision-Making</title>
      <link>https://taslim.xyz/blog/navigating-ambiguity-in-decision-making</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/navigating-ambiguity-in-decision-making</guid>
      <pubDate>Tue, 03 Sep 2024 00:00:00 GMT</pubDate>
      <category>career</category><category>growth</category><category>new beginnings</category><category>adaptability</category>
      <description><![CDATA[Exploring how to navigate ambiguity in business decision-making by framing decisions within organizational goals, balancing data with intuition, and focusing on execution to move past indecision.]]></description>
      <content:encoded><![CDATA[<blockquote>
<p>“It’s hard to recommend between A and B without sounding biased. They can both
be great options; the devil’s in the details. I will not recommend C,
however”.</p>
</blockquote>
<p>This was an actual conclusion I shared in a recent scenario planning exercise as
part of my job. This happens more often than not when we’re trying to make tough
business decisions. The answer is often unclear, and it’s not an easy
“black-or-white” choice. Instead, you’re left with two seemingly acceptable
options. Neither is perfect, so it’s unclear which is definitively better. You
do know what not to do; that part is often straightforward. The struggle is in
what to do.</p>
<p>In business, we often crave certainty, but more often than not, decisions come
down to trade-offs. A will offer certain benefits, but B might mitigate risks
that A doesn’t. Each path has its own sets of variables that impact outcomes in
unpredictable ways. That’s where the difficulty lies—not in seeing the clear
failure paths but in evaluating the shades of gray between two plausible
solutions.</p>
<h3>What do you do when faced with this ambiguity?</h3>
<p>In my experience, the key is to frame the decision in the broader context of
your organization’s goals. What are you ultimately trying to achieve? What
metrics matter most? You also need to recognize that while data can guide you,
it won’t always give you the full picture. Gut instincts, cross-functional
discussions, and even willingness to experiment with calculated risks can fill
in the gaps.</p>
<p>At the end of the day, decision-making is as much about managing uncertainty as
it is about optimizing outcomes. Sometimes the best course of action is to
acknowledge that both options could work, depending on how they are executed. By
focusing on execution, you shift the conversation from “which option is better”
to “how can we make the chosen option succeed?”</p>
<p>Embracing this mindset of operational flexibility and clarity around execution
priorities is how you make peace with the decisions that aren’t as clear-cut.
After all, the true enemy of progress isn’t uncertainty—it’s indecision.</p>
<p><em>Credit: This post was co-authored with AI.</em></p>
]]></content:encoded>
    </item><item>
      <title>Zero to Fun: Embracing New Beginnings at G</title>
      <link>https://taslim.xyz/blog/zero-to-fun-embracing-new-beginnings-at-g</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/zero-to-fun-embracing-new-beginnings-at-g</guid>
      <pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate>
      <category>career</category><category>growth</category><category>strategy</category><category>personal-development</category>
      <description><![CDATA[Reflecting on personal growth across roles and embracing a new organizational challenge. Starting fresh as a Strategy and Operations Manager in a new team.]]></description>
      <content:encoded><![CDATA[<p>I am not one to shy away from starting afresh, reinventing myself, or diving
into entirely new spaces. Over the past few years, I have worked in sales,
program management, product marketing, product management, and strategy and
operations. When I started my product management rotation two years ago, I
didn’t understand most of the technical jargon in the first two months. That
didn’t faze me at all. Or maybe it did a little. I studied hard and took time to
learn about the product and the users. I quickly became a subject matter expert
and ended up landing fixes and features that drove tremendous impact for our
users and the business.</p>
<p>Now, I’m doing this—becoming a newbie—again. I have decided to join a new
organization at work that will create something entirely new out of our existing
family of products. It’s the same role but with a different team. I’m joining a
small but mighty team of Strategy and Operations professionals to help set the
tone for how we will figure out the right path to pursue. It’s so scintillating
to even think about.</p>
<p>Reflecting on my past experiences, I often say that I am more of a 1-100 person
than a 0-1 person. This is partly because I have spent my entire professional
life at Google, and when people say 0-1, they often mean helping a pre-PMF
startup find PMF. However, upon deeper reflection, I realize I don’t fit into
either of the conventional 0-1 or 1-100 boxes. I have always thrived in a small
and nimble team within a big and often slow organization. I take all the
ambiguity and help make sense of it so that the team can thrive and grow.</p>
<p>All this is to say that I am excited to be a newbie again—exploring uncharted
waters. Cheers to moving the proverbial needle 🥂</p>
]]></content:encoded>
    </item><item>
      <title>The Cowrywise Billboard of Contention</title>
      <link>https://taslim.xyz/blog/the-cowrywise-billboard-of-contention</link>
      <guid isPermaLink="true">https://taslim.xyz/blog/the-cowrywise-billboard-of-contention</guid>
      <pubDate>Sun, 18 Feb 2024 00:00:00 GMT</pubDate>
      <category>marketing</category><category>advertising</category><category>analysis</category><category>ooh</category>
      <description><![CDATA[Dissection OOH advertising and how it fits in the marketing funnel. My take on the Cowrywise billboard saga that played out on Twitter.]]></description>
      <content:encoded><![CDATA[<p>I woke up to an uproar on Twitter. The Nigerian Twitter was in chaos. Cowrywise,
a prominent savings app, has committed a grievous offense. What was this
offense? They ran a billboard ad without a CTA! I know it's cliché to say this –
but this was not on my bingo card for 2024. I don't even have a bingo card, but
that's not the point. It was unexpected that such a harmless ad would cause a
controversy.</p>
<p>Cue the evidence – Exhibit 001:</p>
<blockquote>
<p>📱 <strong>Tweet:</strong> <a href="https://twitter.com/victorfatanmi/status/1758815222859481102">View on X/Twitter</a></p>
</blockquote>
<p>Let's dial it back and get into the bone of contention, shall we? When you look
at the backlash surrounding this straightforward ad, they mostly fall into two
key questions that I will seek to address in this blog:</p>
<ol>
<li>Is the copy a CTA?</li>
<li>If not, why does it not have one?</li>
</ol>
<h2>Is cowrywise.com a CTA?</h2>
<p>To answer this, let's break down what a CTA is. I asked
<a href="https://gemini.google.com/">Gemini Advanced</a> and ensured it didn't hallucinate
this answer: <em>"A Call to Action (CTA) is a directive statement designed to
elicit an immediate response from your target audience."</em></p>
<p>A CTA is typically a direction. Marketers often say customers don't know what to
do, so you must guide them. Common examples of CTAs include Buy Now, Read More,
etc. They can be a button on a banner ad or a short sentence on a text ad. One
constant thing is that they typically include an action word – because they are
supposed to evoke an action on the user's part.</p>
<p>We can all agree that a website link on a billboard ad is not a CTA.</p>
<p>Yes, you can argue that seeing something like that will get curious minds to
check out what the URL is about. That doesn't make it a CTA. It's like seeing
the picture of a Nike shoe that looks so beautiful on a billboard and walking
into the store to feel it because I'm a shoe nerd. The shoe caught my attention,
but that picture is not a CTA.</p>
<h2>Why does it not have a CTA?</h2>
<p>Another group argued that the billboard is a waste of marketing naira because it
doesn't have a CTA. That's just flat-out wrong. Remember the
<a href="https://sproutsocial.com/glossary/marketing-funnel/">marketing funnel</a>? There's
a reason we have that. There are stages to the customer journey, and our job as
marketers is to think through how we connect with them through these stages.
When was the last time you saw a CTA on the billboard and immediately bought the
product?</p>
<figure><img src="https://taslim.xyz/images/blog/the-cowrywise-billboard-of-contention/apple-billboard-ad.jpg" alt="Apple's Messi billboard ad" /><figcaption>Apple’s billboard ad to celebrate Lionel Messi. Credits: Adage</figcaption></figure>

<p>Billboards are part of a type of marketing called Out-of-Home (OOH). For OOH
ads, the goal is typically top of the funnel – to drive awareness and/or
consideration. When marketers run ads like this, they don't expect you to take
action immediately. They just want you to be aware of the brand/product.
Sometimes, they also want the ad to spark conversation. That's the job of
creating demand for the product.</p>
<p>Direct Response (DR), on the other hand, is the marketing tactic employed to
capture the demand. This is primarily online advertising, and it's typically
targeted with a clear call-to-action (CTA). You run the DR some time after the
OOH campaign for some campaigns. For others, especially for established brands,
you can run them in parallel.</p>
<h2>In conclusion</h2>
<p>I'll be honest here. I probably would not have approved that ad if I was
Cowrywise's Head of Marketing, as it goes against many best practices in the
marketing world. It's possible that someone would've been able to convince me
otherwise. That's why you hire talented people on your team. To listen to them
and sometimes do something you are not 100% comfortable with. This is what some
call "disagree and commit."</p>
<p>It's also important to acknowledge that the campaign seems to have landed well.
The goal is most likely to drive awareness. One way to measure that is "share of
voice." And here we are talking about it. That's a win.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>