<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/rss-beautiful.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title><![CDATA[My name is Olek. I write what matters to me.]]></title><description><![CDATA[Hi 👋🏼 I'm Olek. Here I write about what matters to me. I'm a co-founder of 2 kids 👨‍👩, married happily 💍, and 🍕 lover.]]></description><link>https://olekwrites.com/</link><atom:link href="https://olekwrites.com/rss" rel="self" type="application/rss+xml" /><item><title><![CDATA[100 Days of Code, as a Tiny Experiment]]></title><link>https://olekwrites.com/100-days-of-code/</link><guid>https://olekwrites.com/100-days-of-code/</guid><description><![CDATA[<p><img src="https://ghchart.rshah.org/jaal" alt="My GitHub contribution chart — one green square for every day I show up"></p>
<h1 id="100-days-of-code-as-a-tiny-experiment">100 Days of Code, as a Tiny Experiment</h1>
<blockquote>
<p><em>&quot;A PACT is a commitment to a specific action for a set period of time. Purposeful. Actionable. Continuous. Trackable.&quot;</em> — Anne-Laure Le Cunff, <em>Tiny Experiments</em>[^1]</p>
</blockquote>
<p>I&#39;ve been reading <em>Tiny Experiments</em>, and one idea stuck.</p>
<p>Most of us set goals like &quot;get good at X&quot; or &quot;build a habit.&quot; Then we fail, and we decide the problem is us. Le Cunff says the problem is usually the frame. Instead of a goal — a far-off finish line you either hit or miss — you make a <strong>PACT</strong>: a small, repeatable action you do every day for a set number of days, just to see what happens.</p>
<p>Not &quot;become a better developer.&quot; Just: <em>do the small thing, every day, and see what I learn.</em></p>
<p>So here&#39;s mine.</p>
<h2 id="the-pact">The PACT</h2>
<blockquote>
<p><strong>I will commit code to my repo every day for 100 days.</strong></p>
</blockquote>
<p>Let&#39;s hold it up against the four letters:</p>
<ol>
<li><strong>Purposeful.</strong> I want writing code — with <a href="https://claude.com/claude-code">Claude Code</a> doing most of the typing — to be a daily reflex, not a when-I-feel-like-it thing.</li>
<li><strong>Actionable.</strong> I can do it today. No gear to buy, no course to finish first. Open the laptop, ship something small.</li>
<li><strong>Continuous.</strong> Every day. Small counts. One honest commit beats a heroic weekend and then nothing.</li>
<li><strong>Trackable.</strong> This is the part I love. There&#39;s already a perfect tracker built for it, and I don&#39;t have to maintain it by hand.</li>
</ol>
<h2 id="the-tracker-maintains-itself">The tracker maintains itself</h2>
<p>That green grid at the top of this post is my <a href="https://ghchart.rshah.org/jaal">GitHub contribution chart</a>, rendered live. Every day I commit, a square lights up. Miss a day, and there&#39;s a grey gap staring back at me.</p>
<p>I didn&#39;t build it. I don&#39;t update it. It just tells the truth — which, if you&#39;ve read my post on <a href="/todo-list-nobody-maintains/">the TODO list nobody maintains</a>, you&#39;ll know is exactly the kind of tracking I trust: the kind that runs without me.</p>
<p>That&#39;s the whole appeal of a PACT. It&#39;s not about willpower. It&#39;s about making the work visible and letting the chart do the nagging.</p>
<h2 id="why-not-a-goal">Why not a goal?</h2>
<p>Because I&#39;ve set the goal &quot;code more&quot; a dozen times and it means nothing. There&#39;s no day where I&#39;ve <em>done</em> it. There&#39;s no square to fill.</p>
<p>A PACT is different. It doesn&#39;t ask <em>did you succeed?</em> It asks <em>did you show up today?</em> — a question I can answer with a yes or a no, every single day. And at the end of 100 days I won&#39;t have &quot;become a better developer&quot; (whatever that means). I&#39;ll have 100 squares, or I won&#39;t, and either way I&#39;ll have learned something about how I actually work.</p>
<p>That&#39;s the experiment. Not <em>will I win</em> — but <em>what will I find out.</em></p>
<h2 id="the-book-one-lesson-at-a-time">The book, one lesson at a time</h2>
<p>I didn&#39;t just read <em>Tiny Experiments</em> once and shelve it. I loaded it into <a href="/building-marrowminded/">MarrowMinded</a>, an app I built that sends me one lesson a day from books I&#39;ve already read.</p>
<p>So now the book itself is a daily habit feeding a daily habit. Each morning I get one idea from it. Each day I make one commit. If you want to dig into the ideas in the book, that&#39;s where I keep them — one small piece at a time, instead of a 300-page block I&#39;ll forget in a week.</p>
<!-- DRAFT — the log section, to write later. Uncomment when ready.

## The log

I'm keeping the whole thing in this one post. New day, new note — I add it to the top of the log below and bump the date. No new post each time, no thread to chase. Just scroll down to watch it fill up (or fall apart).

NEW ENTRIES GO AT THE TOP. Copy the template, fill in the date and day number, bump `updated:` in the frontmatter above.

### Day N — YYYY-MM-DD

What I shipped, what I skipped, what I noticed.

### Day 1 — 2026-07-08

Committing to it, publicly, is day one. The square for today is the first one that counts.

I'll report back — the good days and the grey gaps both.

-->

<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>Swap the goal for a PACT.</strong> Not &quot;get good at X&quot; but &quot;do X, daily, for N days.&quot; A question you can answer every day beats a finish line you keep missing.</li>
<li><strong>Make it trackable by something that isn&#39;t you.</strong> The best tracker is the one you never have to maintain. Mine is a chart that updates itself.</li>
<li><strong>Small counts.</strong> One honest commit keeps the streak alive. The point is showing up, not the size of the day.</li>
<li><strong>Run it to learn, not to win.</strong> A tiny experiment doesn&#39;t ask <em>did you succeed</em> — it asks <em>what did you find out.</em></li>
</ul>
<hr>
<p><strong>Running your own tiny experiment?</strong> I&#39;d love to hear what your PACT is — and whether the chart nags you as much as mine nags me.</p>
<p>[^1]: Anne-Laure Le Cunff, <em><a href="https://nesslabs.com/tiny-experiments">Tiny Experiments</a></em> (2025). The PACT framework comes from her work at <a href="https://nesslabs.com/">Ness Labs</a>.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20100%20Days%20of%20Code%2C%20as%20a%20Tiny%20Experiment">me an email</a>.</p>
      ]]></description><pubDate>Wed, 08 Jul 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category></item><item><title><![CDATA[The Feature That Found a Bug]]></title><link>https://olekwrites.com/feature-that-found-a-bug/</link><guid>https://olekwrites.com/feature-that-found-a-bug/</guid><description><![CDATA[<p><img src="/images/feature-that-found-a-bug.png" alt="Pixel art of a world map on a retro screen, a glowing crosshair over the Arctic revealing a small hidden bug icon"></p>
<h1 id="the-feature-that-found-a-bug">The Feature That Found a Bug</h1>
<blockquote>
<p><em>Part of <strong><a href="/i-built-a-weather-app/">Building GribGrab</a></strong> — a series on what I learn building a weather app with Claude Code.</em></p>
</blockquote>
<p>GribGrab had four ways to pick a place: type a city, paste coordinates, tap GPS, or reuse a saved one. All of them are text. None let you just <em>point</em>.</p>
<p>So I added a map. Drag it around, and the forecast loads for whatever sits under the crosshair. That&#39;s the whole feature.</p>
<p>The interesting part came after.</p>
<h2 id="i-couldve-used-a-library">I could&#39;ve used a library</h2>
<p>There&#39;s a library for this — Leaflet. Drop it in, done in an hour. I didn&#39;t. I wrote the map myself, about two hundred lines.</p>
<p>Why? GribGrab runs on one rule: no code from anyone else&#39;s server. It keeps the app light and private, and I&#39;m the only one who can break it. The cost is real — I now own every pinch-zoom quirk Leaflet would have handled. But it&#39;s a cost I can see.</p>
<p>That&#39;s the trade with a library. It doesn&#39;t remove the work. It hides it, and hands you the bill later.</p>
<h2 id="then-i-tapped-the-arctic">Then I tapped the Arctic</h2>
<p>The moment the map worked, I could tap <em>anywhere</em>. So I tapped the North Pole. The chart went completely gray.</p>
<p>The app shades the night-time hours grey. Up there it had shaded the whole week.</p>
<p>The reason is nice. At the poles in summer the sun never sets. My weather source says so honestly: sunrise at midnight, sunset at midnight the <em>next day</em> — 24 hours apart. My old code read both as &quot;00:00,&quot; called the whole day night, and greyed everything out.</p>
<p>That bug had been live for months. Nobody hit it, because reaching the Arctic meant <em>typing</em> its coordinates, and who does that? The bug wasn&#39;t new. The map just built a one-tap road to it.</p>
<h2 id="a-new-feature-is-a-flashlight">A new feature is a flashlight</h2>
<p>This is the part I keep relearning. You think a new feature adds a room. It doesn&#39;t — it adds a <em>door</em>, onto rooms that were always there in the dark. This one literally: the room I walked into was a chart greyed out into permanent night.</p>
<p>The map didn&#39;t create the polar bug. It created the first easy path to it. Same as a search box surfaces the query nobody typed.</p>
<p>So shipping something new is also my cheapest bug finder. Every door shows you a room you never checked.</p>
<h2 id="the-quiet-cost">The quiet cost</h2>
<p>The map isn&#39;t free — not in privacy. A map is a grid of little numbered image tiles, and to draw your view the browser has to ask OpenStreetMap&#39;s servers for the exact tiles you&#39;re looking at. Each of those requests carries your IP address and which squares of the world you asked for. That&#39;s how they&#39;d know — not from anything I send them, but from your own browser fetching the picture. Pan to your house and you&#39;ve told them roughly where you are.</p>
<p>Fair trade for a map you can point at. But it&#39;s a trade, so it goes in the privacy policy in plain words. A feature that phones a third party always has a bill. The least I can do is print it.</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>Ship it, then poke the corners.</strong> Tap the ocean, the poles, the empty box — the edges you&#39;d never reach the slow way.</li>
<li><strong>A library moves the work, it doesn&#39;t delete it.</strong> Fine sometimes. Just know you&#39;re choosing where the bill lands.</li>
<li><strong>New paths surface old bugs.</strong> Make something <em>easy</em> that was only <em>possible</em>, and expect it to walk into code nobody had run.</li>
<li><strong>Say the privacy cost out loud.</strong> If a feature phones a third party, tell users. &quot;Free&quot; usually means someone else pays in data.</li>
</ul>
<p>New doors, old rooms. Go open one. → <a href="https://gribgrab.com">gribgrab.com</a></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20The%20Feature%20That%20Found%20a%20Bug">me an email</a>.</p>
      ]]></description><pubDate>Sat, 04 Jul 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[gribgrab]]></category></item><item><title><![CDATA[A Skill Is Just You, Written Down]]></title><link>https://olekwrites.com/skill-is-you-written-down/</link><guid>https://olekwrites.com/skill-is-you-written-down/</guid><description><![CDATA[<p><img src="/images/skill-is-you-written-down.png" alt="Pixel art of an open toolbox on a retro screen, five glowing labeled cards floating out of it like tools"></p>
<h1 id="a-skill-is-just-you-written-down">A Skill Is Just You, Written Down</h1>
<p>I keep telling people: if you can describe what you want, you can build it now. I build my apps that way. I talk, <a href="https://claude.com/claude-code">Claude Code</a> types.</p>
<p>This week I built something different. Not an app — a set of small tools for Claude Code itself. And there&#39;s no code in any of them.</p>
<p>They&#39;re all in one public repo: <a href="https://github.com/jaal/claude-code-skills">claude-code-skills</a>.</p>
<blockquote>
<p><strong>Update · 4 July 2026</strong> — Two more since I hit publish: <strong>translate-en-to-pl</strong> and <strong>translate-pl-to-en</strong>. They don&#39;t just translate — they confirm what I meant first, then hand me three versions with the register and the reason for each one spelled out. Which quietly breaks my &quot;they&#39;re all thinking tools&quot; line below. Fine by me: a skill turns out to be just as good at <em>doing</em> a thing as thinking one through. Still only me, written down.</p>
</blockquote>
<blockquote>
<p><strong>Update · 5 July 2026</strong> — Added <strong>clarify-doc</strong>, the one I&#39;ll use most. Give it something you&#39;ve written and it checks whether a reader can actually follow it — same word for the same thing throughout, each sentence leading to the next, each paragraph to the next — then rewrites it plain. It leaves its notes as invisible comments right on the lines they&#39;re about, so the rendered page stays clean. This whole update log got a pass from it before I hit save.</p>
</blockquote>
<h2 id="what-a-skill-is">What a skill is</h2>
<p>A skill is a folder with one file inside: <code>SKILL.md</code>. The top says what it is and when to use it. The rest is plain instructions, like a note to a helpful colleague.</p>
<p>No code. No install. You drop the folder in, and Claude decides on its own when to use it.</p>
<p>That&#39;s the hard part. A good skill fires at the right moment and stays quiet the rest of the time. The trick isn&#39;t what it does. It&#39;s teaching the tool when to use it.</p>
<h2 id="my-favourite-cruciable">My favourite: cruciable</h2>
<p>I wanted to test an idea before committing to it. Not a yes-man. A real argument.</p>
<p>So I described it, and by the afternoon it existed. You give it a claim — &quot;I should do X.&quot; It runs a three-round debate: one side for, one side against. The rules: answer each other first, then add something new. No repeating. Examples welcome. At the end it hands you the strongest point on each side, and the one question it all comes down to.</p>
<p>Then it lets me decide.</p>
<p>I&#39;ve used it on real decisions since. It&#39;s good to watch both sides of your own head argue it out, in order, instead of going in circles.</p>
<h2 id="the-other-four">The other four</h2>
<p>All thinking tools, it turns out:</p>
<ul>
<li><strong>mental-models</strong> — walks me through a hard choice using Naval Ravikant&#39;s frameworks, one question at a time.</li>
<li><strong>thinking-partner</strong> — a ten-minute session that ends with one clear next step.</li>
<li><strong>stoic-mentor</strong> — a Stoic mentor that asks instead of tells. I keep it in English and Polish.</li>
</ul>
<p>None of them are clever. That&#39;s the point.</p>
<h2 id="the-twist">The twist</h2>
<p>A skill isn&#39;t code. It&#39;s taste.</p>
<p><code>mental-models</code> is how I like to break down a choice. <code>stoic-mentor</code> is the questions I want asked when I&#39;m stuck. <code>write-post</code> wrote the first draft of this post.</p>
<p>I didn&#39;t teach Claude a task. I wrote down how I think, and handed it over.</p>
<h2 id="why-share-them">Why share them</h2>
<p>The most honest thing you can show isn&#39;t a polished demo. It&#39;s what you actually use on a normal Tuesday.</p>
<p>Sharing them cost me nothing — a README, a licence, one push. But these are the tools I use when no one&#39;s watching. That&#39;s building in the open: don&#39;t tell people what you can do. Hand them the thing you made.</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>A skill is instructions, not code.</strong> If you can write a good note, you can write one.</li>
<li><strong>The hard part is the trigger.</strong> When it fires matters more than what it does.</li>
<li><strong>Write down how you think.</strong> The best tools aren&#39;t clever. They&#39;re yours.</li>
<li><strong>Share what you actually use.</strong> Real proof is the daily tool, not the demo.</li>
</ul>
<p>Take any of them → <a href="https://github.com/jaal/claude-code-skills">github.com/jaal/claude-code-skills</a></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20A%20Skill%20Is%20Just%20You%2C%20Written%20Down">me an email</a>.</p>
      ]]></description><pubDate>Sat, 04 Jul 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category></item><item><title><![CDATA[Now It's Apps' Turn to Get Cheap]]></title><link>https://olekwrites.com/apps-turn-to-get-cheap/</link><guid>https://olekwrites.com/apps-turn-to-get-cheap/</guid><description><![CDATA[<p><img src="/images/apps-turn-to-get-cheap.png" alt="Pixel-art price tags falling across a blog, a music note, a film reel, and a phone app"></p>
<h1 id="now-its-apps-turn-to-get-cheap">Now It&#39;s Apps&#39; Turn to Get Cheap</h1>
<blockquote>
<p><em>Once the foundational tools are good enough, technique and training outperform hardware.</em>
— <a href="https://seths.blog/2026/06/you-dont-need-a-better-camera/">Seth Godin, &quot;You don&#39;t need a better camera&quot;</a></p>
</blockquote>
<p>Seth wrote that about cameras this week. The gist: past a certain point, a better one won&#39;t make you better. New snow tires beat a new car for winter driving.</p>
<p>It got me thinking about something bigger. The tools don&#39;t just get <em>good</em> enough — they get <em>cheap</em> enough, over and over, until the only expensive thing left is the idea.</p>
<p>Take blogs. In 1995, having one was a project. A server, or money for hosting. Some HTML, maybe a web server to configure. And even then you were shouting into an empty room — no feed, no algorithm to find you. Real money, real knowledge, real time.</p>
<p>Ten years later, none of that was true. You signed up for Blogger, picked a theme, and wrote. Free. Today you can stand up a blog on your own domain in the time it takes to make coffee.</p>
<p>I keep noticing this pattern. The cost of <em>making a kind of thing</em> starts impossibly high, then collapses.</p>
<h2 id="the-same-arc-over-and-over">The same arc, over and over</h2>
<ul>
<li><strong>Words.</strong> A blog went from servers-and-HTML to a free signup in about a decade. Now anyone can publish under their own domain in seconds, for almost nothing.</li>
<li><strong>Music.</strong> Recording once meant a studio and a label. Then a laptop and a cheap interface made a bedroom good enough.</li>
<li><strong>Video.</strong> Cameras, editing suites, broadcast deals — then YouTube and a phone in your pocket.</li>
<li><strong>Graphics, then video again — this time with AI.</strong> What used to need a designer, or a film crew, now needs a prompt.</li>
</ul>
<p>Each time, the same thing happens. The expensive parts — the gear, the skill, the distribution — fall away one by one. What&#39;s left is <em>taste</em> and <em>the idea</em>: knowing which thing is worth making, and being the one to think of it. Those don&#39;t get cheaper. When everyone can make the thing, the only edge left is picking the right thing and making it well.</p>
<p>And each time, a wave of people who could never have made that thing before suddenly can. With something like Claude Code, the distance from &quot;I wish this existed&quot; to a thing that runs is an afternoon — you describe it in plain words, it writes the code.</p>
<h2 id="the-other-half-getting-found">The other half: getting found</h2>
<p>But making was only ever half of it. The other half is getting someone to look.</p>
<p>Before social media, that was pure word of mouth. Seth tells a story from the days before a Share button existed: people would <em>print out</em> his posts and leave them on a colleague&#39;s desk with a note — &quot;you have to read this.&quot; They faxed them between offices. They forwarded the email to the whole team. Not to promote Seth — to look smart themselves. A good idea was a thing you passed along, because passing it along made <em>you</em> look sharp.</p>
<p>And he still works that way. Seth doesn&#39;t really <em>promote</em> the blog. He just shows up — every single day, for years — and writes something that might be useful to someone else. The showing up is the whole strategy.</p>
<h2 id="apps-are-next">Apps are next</h2>
<p>Software was the holdout — two costs in one: writing the code, and running it. Both are caving now, just not in step. Running went first; cloud platforms ate most of that pain over the last decade. Writing&#39;s going now, with AI doing the typing. And this week I felt the running side fall even further.</p>
<p>The making I&#39;ve written about before: I build my apps with <a href="https://claude.com/claude-code">Claude Code</a> and barely touch the code by hand. What got me this week was the running. So I ran an experiment — moved two apps, <a href="https://gribgrab.com">GribGrab</a> and <a href="https://olekwrites.com/marrowminded">MarrowMinded</a>, from Render to Railway, just to feel how it goes now.</p>
<p>I didn&#39;t really do it. I told Claude Code to, and it did — figured out the build, the start command, wired up the database. One command, a couple of minutes, a live URL. Turbo fast.</p>
<p>Not all smooth. The first deploy landed <em>on top of</em> my database and wiped it, because the tool defaults to whatever service you touched last. One flag fixes it. Every platform has an edge like that; the trick is finding it before it finds you.</p>
<p>Money? Roughly a wash — a few dollars either way. </p>
<p>So price didn&#39;t decide it. Time did. The gap between &quot;works on my laptop&quot; and &quot;live on the internet&quot; used to be a chore. Now it&#39;s one prompt. And when shipping is that cheap, you ship more — even the small things you&#39;d never have bothered with.</p>
<h2 id="what-this-is-really-about">What this is really about</h2>
<p>So it&#39;s not the tools. It&#39;s the direction. Shipping an app used to be a wall. Now it&#39;s a button — same as blogging, music, video, images before it. The expensive parts fall away, and you&#39;re left with the only two questions that ever mattered: do you have something worth making, and can you get anyone to see it?</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>Let an AI agent write the code.</strong> You keep the taste and the decisions; it handles the typing.</li>
<li><strong>Pick a platform that ships in one command.</strong> I tried both Render and Railway and I&#39;m happy with each — the point isn&#39;t which one, it&#39;s that the hop from &quot;works locally&quot; to &quot;it&#39;s live&quot; is now a single step.</li>
<li><strong>Every tool has one sharp edge — find it early.</strong> Mine was Railway deploying on top of my database and wiping it. Trip over it once, write it down, move on.</li>
<li><strong>Ship the small thing.</strong> When deploying is free and instant, build the tiny app you&#39;d never have set up a server for. The point isn&#39;t the app. It&#39;s that you finally can.</li>
</ul>
<hr>
<p><strong>What have you been sitting on because shipping it felt like too much?</strong> The wall&#39;s gone — go make something. → <a href="https://gribgrab.com">gribgrab.com</a></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Now%20It's%20Apps'%20Turn%20to%20Get%20Cheap">me an email</a>.</p>
      ]]></description><pubDate>Sat, 27 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[I Lost My Setup Once. Now It Lives in a Repo.]]></title><link>https://olekwrites.com/claude-config-as-a-repo/</link><guid>https://olekwrites.com/claude-config-as-a-repo/</guid><description><![CDATA[<p><img src="/images/claude-config-as-a-repo.png" alt="A pixel-art floppy disk saving a tiny house into the cloud"></p>
<h1 id="i-lost-my-setup-once-now-it-lives-in-a-repo">I Lost My Setup Once. Now It Lives in a Repo.</h1>
<p>This week I switched to a new laptop. Nothing dramatic — nothing lost or stolen. Just the old one out, a new one in.</p>
<p>Almost everything moved over on its own. Documents, apps, settings — all saved in the cloud, all there when I logged in. Everything except one folder: my Claude Code config, plus a small file that lists my projects. That stuff was never saved anywhere. So it was just gone, and now I have to set it all up again from memory.</p>
<p>I&#39;d been here before. You don&#39;t notice these things until they&#39;re missing — the shortcuts, the small tweaks, the settings you build up over months and never write down. Then you spend days trying to remember a setup you can&#39;t quite picture.</p>
<p>No use crying over spilt milk. So this time I decided to do it right.</p>
<h2 id="the-quiet-risk">The Quiet Risk</h2>
<p>I use <a href="https://claude.com/claude-code">Claude Code</a> in my terminal every day. Over time it had become <em>mine</em> — custom hooks, a start-up routine, project settings, a few skills I&#39;d written.</p>
<p>All of it lived in one folder on one laptop: <code>~/.claude</code>.</p>
<p>The day I moved machines, none of it came with me. Same mistake as last time, just a different folder.</p>
<h2 id="the-fix-my-config-is-a-git-repo-now">The Fix: My Config Is a Git Repo Now</h2>
<p>The answer was obvious once I said it out loud. If my writing lives in a Git repo, why not my setup?</p>
<p>So I turned <code>~/.claude</code> into a private repo on GitHub. But config folders are messy. They hold old history, cached files, and the odd password. I didn&#39;t want any of that going to the cloud.</p>
<p>The trick was to flip the usual rule. Instead of listing the files to skip, I skip everything, then add back only the safe ones:</p>
<pre><code class="language-gitignore">/*
!/settings.json
!/hooks/
!/skills/
</code></pre>
<p>Now I can&#39;t upload my history or a password by accident. The repo can only ever hold the few files I picked.</p>
<h2 id="the-part-i-like-it-backs-itself-up">The Part I Like: It Backs Itself Up</h2>
<p>A backup you have to remember isn&#39;t really a backup. So I made it automatic.</p>
<p>Claude Code can run a small script each time it finishes a task. Mine checks if anything in the config changed. If it did, it saves and uploads the change on its own, quietly in the background:</p>
<ul>
<li>Nothing changed? It does nothing.</li>
<li>Something changed? It saves it with a timestamp and uploads it to the private repo.</li>
</ul>
<p>I don&#39;t think about it. I change a setting, keep working, and by the time I look up it&#39;s already safe in the cloud.</p>
<h2 id="what-this-actually-buys-me">What This Actually Buys Me</h2>
<ul>
<li><strong>A new laptop is one command away.</strong> Not days of building things back from memory.</li>
<li><strong>A history of my own tools.</strong> I can see how my setup changed over time, and undo a change I regret.</li>
<li><strong>No passwords in the cloud.</strong> The setup makes sure of it.</li>
</ul>
<h2 id="the-lesson-again">The Lesson, Again</h2>
<p>I keep learning the same thing: the work is safe, but the setup around the work is easy to lose. Your shortcuts, your small tweaks, your little bits of automation — they&#39;re worth saving too.</p>
<p>If a tool lets you save its settings as plain files, put those files in a repo. Make the backup automatic, so you&#39;re never the one who has to remember.</p>
<p>Future you, staring at a blank new laptop, will be glad you did.</p>
<p>Back up your setup, not just your files.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20I%20Lost%20My%20Setup%20Once.%20Now%20It%20Lives%20in%20a%20Repo.">me an email</a>.</p>
      ]]></description><pubDate>Wed, 24 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[The Analytics Were Mostly Me]]></title><link>https://olekwrites.com/analytics-were-mostly-me/</link><guid>https://olekwrites.com/analytics-were-mostly-me/</guid><description><![CDATA[<p><img src="/images/analytics-were-mostly-me.png" alt="Pixel art of a retro analytics dashboard with a rising line chart, and a small developer figure secretly pushing the bars up from behind"></p>
<h1 id="the-analytics-were-mostly-me">The Analytics Were Mostly Me</h1>
<blockquote>
<p><em>Part of <strong><a href="/i-built-a-weather-app/">Building GribGrab</a></strong> — a series on what I learn building a weather app with Claude Code.</em></p>
</blockquote>
<p>I added analytics to my weather app and felt great about it. The daily-users line mostly went up. Real people, checking real weather.</p>
<p>Then I looked at who they actually were.</p>
<h2 id="the-day-that-gave-it-away">The day that gave it away</h2>
<p>One day stood out. Lots of &quot;active users,&quot; a nice tall bar. Then I removed my own visits — and nearly two-thirds of that day was one person. Me. On one device, reloading the app while testing a change to the chart.</p>
<p><strong>63% of a &quot;great&quot; day was just me debugging.</strong></p>
<p>It wasn&#39;t a one-off. Over two weeks, my own testing was padding the average by roughly 18% — but unevenly. Almost nothing on a quiet day; a third or more on days I was deep in the code. That&#39;s the trap: the noise is loudest on the days you work hardest, which are exactly the days you want the chart to mean something.</p>
<p>The numbers weren&#39;t lying. I was just standing in them.</p>
<h2 id="how-i-found-this-out-posthog--claude-code">How I found this out: PostHog + Claude Code</h2>
<p>Here&#39;s the part I like. I didn&#39;t click around a dashboard tool to work any of this out.</p>
<p>I use <a href="https://posthog.com">PostHog</a> for analytics, and it has an MCP server — basically a way for Claude Code to talk to PostHog directly. So I stayed in my normal coding session and just described what I wanted, in plain English, and Claude Code did it for me:</p>
<ul>
<li>&quot;Build me a dashboard for active users and retention.&quot; → it created the dashboard.</li>
<li>&quot;Break daily users down by person and show me who loads the most.&quot; → it ran the queries and showed me the data.</li>
<li>&quot;That top user is me. Add a filter that excludes my traffic from every chart.&quot; → it built the exclusion and applied it everywhere.</li>
</ul>
<p>No tab-switching, no learning a query language, no hunting through menus. I talked to my data like a coworker. Finding myself in the numbers, and then taking myself out, was a five-minute conversation in the terminal.</p>
<h2 id="why-youre-worse-than-bots">Why you&#39;re worse than bots</h2>
<p>Everyone knows to filter out bots, and analytics tools do it for you. But <em>you</em> — the person building the thing — are the heaviest user by far in the early days, and nothing flags you.</p>
<p>You load the app more than anyone. You reload after every deploy. You open it on your phone to check the mobile view. You leave a tab running that refreshes on its own. Every one of those gets counted. To the dashboard, you look like your most loyal fan.</p>
<p>One of my &quot;users&quot; had loaded a city <strong>125 times in a single week</strong> from one device. That&#39;s not a superfan. That&#39;s me.</p>
<p>When you only have a handful of real users, one busy developer doesn&#39;t bend the numbers. He <em>is</em> the numbers.</p>
<h2 id="i-thought-id-fixed-this-on-day-one">I thought I&#39;d fixed this on day one</h2>
<p>I wasn&#39;t careless about it. From the very start I added a secret switch: open the site with <code>?internal</code> in the address and it would turn analytics off for me.</p>
<p>It didn&#39;t work the way I assumed. It muted exactly one page — the one I landed on. Click through to another city, or come back the next day, and it had already forgotten. It started counting me again the moment I did anything.</p>
<p>So for weeks I believed I was excluded, while I was quietly polluting my own data the whole time. A fix that half-works is worse than no fix, because it stops you from checking.</p>
<h2 id="finding-myself-for-real">Finding myself for real</h2>
<p>There&#39;s no &quot;this is the founder&quot; flag, so I had to teach the system to recognise my own footprints. Three gave me away:</p>
<p><strong>My own subdomain.</strong> I&#39;d set up a separate web address — a sandbox — just for my own testing, so I can try things before they go live. That turned out to be the cleanest signal of all: anything coming from that address is me, full stop. No real user ever goes there.</p>
<p><strong>My city and browser.</strong> My laptop shows up in my home city, on a browser almost nobody else in my numbers uses. That combination is basically always me.</p>
<p><strong>The version I first showed up on.</strong> I was the only person using the app in its earliest builds — before I&#39;d shown it to a single other person. So &quot;first seen on a pre-launch version&quot; is a clean tag for my own devices, including my phone, which the first two signals missed.</p>
<p>I handed those three rules to Claude Code, it turned them into an &quot;internal traffic&quot; group in PostHog, and pulled that group out of every chart. The growth lines barely moved. But the engagement lines — my &quot;power users,&quot; my regulars — shrank hard once I was gone. That&#39;s the part that stung.</p>
<h2 id="the-real-fix-dont-record-it-at-all">The real fix: don&#39;t record it at all</h2>
<p>A filter cleans up the dashboard, but the junk is still in the database, and I&#39;d have to keep that filter current forever. Better to never collect it.</p>
<p>So now the app simply refuses to count me when it&#39;s obviously me:</p>
<pre><code class="language-js">// Don&#39;t track my own testing.
if (
  location.hostname === &#39;localhost&#39; ||
  location.host.includes(&#39;sandbox&#39;) ||
  localStorage.getItem(&#39;internal&#39;) === &#39;1&#39;
) {
  analytics.optOut();
}
</code></pre>
<p>My own computer and my sandbox subdomain opt out on their own. And for the live site, I visit once with <code>?internal</code> — but this time the choice is <em>remembered</em> on that device, for good, instead of lasting a single page.</p>
<p>Two layers: the filter cleans up the past, the opt-out stops me being recorded in the future. One is mopping; the other is not spilling.</p>
<h2 id="what-changed">What changed</h2>
<p>My dashboard finally shows strangers. I keep two versions of the users line side by side — with me and without me — so the gap between them is the first thing I see. When the two drift apart, I know I&#39;ve just been busy, not popular.</p>
<p>The uncomfortable lesson: early analytics flatter you by default, because the person reading the numbers is the same person making most of them. You have to deliberately take yourself out to see anything true. Until you do, you&#39;re not measuring your product. You&#39;re measuring your own enthusiasm.</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>In a young project, you — not bots — are the biggest source of fake data.</strong> Remove yourself before you trust a single number.</li>
<li><strong>Your traffic spikes on the days you work hardest,</strong> exactly the days you want to read as growth.</li>
<li><strong>A half-working fix is dangerous.</strong> My day-one <code>?internal</code> switch only muted one page, so I felt safe while polluting everything. Make sure your fix holds across a whole session, not one click.</li>
<li><strong>Give yourself an obvious tell.</strong> A separate subdomain for your own testing makes &quot;is this me?&quot; trivial to answer.</li>
<li><strong>Two layers beat one:</strong> a filter to clean the history, an opt-out to stop recording yourself going forward.</li>
<li><strong>If your tools have an MCP server, use it.</strong> I built the dashboard, found myself, and applied the filter by talking to PostHog through Claude Code — no UI, just plain English.</li>
</ul>
<hr>
<p><strong>How much of your product&#39;s &quot;engagement&quot; is really just you, hitting refresh?</strong> I didn&#39;t know until I subtracted myself — and most of a good day disappeared. → <a href="https://gribgrab.com">gribgrab.com</a></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20The%20Analytics%20Were%20Mostly%20Me">me an email</a>.</p>
      ]]></description><pubDate>Sun, 21 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[ai]]></category><category><![CDATA[gribgrab]]></category></item><item><title><![CDATA[The TODO List Nobody Maintains]]></title><link>https://olekwrites.com/todo-list-nobody-maintains/</link><guid>https://olekwrites.com/todo-list-nobody-maintains/</guid><description><![CDATA[<p><img src="/images/todo-list-nobody-maintains.png" alt="Pixel art of a checklist on a retro screen, items auto-checking themselves with a small robot hand"></p>
<h1 id="the-todo-list-nobody-maintains">The TODO List Nobody Maintains</h1>
<blockquote>
<p><em>Part of <strong><a href="/i-built-a-weather-app/">Building GribGrab</a></strong> — a series on what I learn building a weather app with Claude Code.</em></p>
</blockquote>
<p>While building my weather app, I did the thing everyone does: I started a <code>TODO.md</code>.</p>
<p>It was great for a week. Then I stopped using it.</p>
<h2 id="three-reasons-it-stopped-working">Three reasons it stopped working</h2>
<p><strong>1. My new ideas were better than the old ones.</strong> Every time I sat down to work, I had a fresh idea. It was usually more interesting than anything already on the list. So I&#39;d chase the new thing, and the old items just sat there getting older.</p>
<p><strong>2. The list never showed up.</strong> It was a file in a folder. To see it, I had to remember it existed and go open it. I never did. Out of sight, out of mind — so when I started working, the list wasn&#39;t in my head at all.</p>
<p><strong>3. Keeping it updated took time.</strong> Checking off done items, adding new ones, cleaning out stale ones — that&#39;s work. Work with no payoff. So I skipped it, and after a while the list didn&#39;t match reality anymore.</p>
<p>Once a list stops matching reality, you stop trusting it. Once you stop trusting it, it&#39;s dead.</p>
<h2 id="the-fix-let-the-assistant-do-it">The fix: let the assistant do it</h2>
<p>I work inside Claude Code all day. It already has everything it needs to keep the list honest: <strong>my commits</strong> (what I actually did), <strong>my TODO file</strong> (what I said I&#39;d do), and <strong>today&#39;s date</strong> (how long each item has been sitting there). Keeping the list honest is just comparing those — including each item&#39;s age against the clock.</p>
<p>That&#39;s a chore, not a decision. So I gave it away. No new habit, no discipline. I tied it to two moments that happen on their own anyway: <strong>opening the project</strong> and <strong>committing code.</strong></p>
<p>Here&#39;s how each of the three problems got solved.</p>
<h3 id="problem-2-first-make-the-list-show-up">Problem 2 first: make the list show up</h3>
<p>This was the big one. I made the list appear every single time I open the project — before I do anything else.</p>
<p>A hook in <code>.claude/settings.local.json</code> hands Claude the list, today&#39;s date, and my recent commits, and asks it to brief me:</p>
<pre><code class="language-json">{
  &quot;hooks&quot;: {
    &quot;SessionStart&quot;: [
      {
        &quot;matcher&quot;: &quot;startup|resume&quot;,
        &quot;hooks&quot;: [
          {
            &quot;type&quot;: &quot;command&quot;,
            &quot;command&quot;: &quot;echo &#39;Compare TODO.md against the recent commits, then tell me: what got done, what is stale (open more than 14 days, or marked ⏳), what is missing, and what to archive (done more than 30 days ago).&#39; &amp;&amp; echo &#39;--- today ---&#39; &amp;&amp; date +%Y-%m-%d &amp;&amp; echo &#39;--- TODO.md ---&#39; &amp;&amp; cat TODO.md &amp;&amp; echo &#39;--- last 15 commits ---&#39; &amp;&amp; git log -15 --pretty=format:&#39;%ad %s&#39; --date=short&quot;
          }
        ]
      }
    ]
  }
}
</code></pre>
<p>Now I can&#39;t miss it. Every session opens with: here&#39;s what shipped, here&#39;s the thing you&#39;ve been ignoring for three weeks, here&#39;s what you meant to do and never wrote down. The list is the first thing in my head, not a file I forget.</p>
<h3 id="problem-3-stop-spending-time-on-it">Problem 3: stop spending time on it</h3>
<p>The same hook does the cleanup. Claude moves finished items to Done, stamps the dates, and sweeps anything done more than 30 days ago into an archive file. I don&#39;t touch it.</p>
<p>A second hook keeps it current as I go. After every commit, it checks whether the commit finished anything on the list and updates it:</p>
<pre><code class="language-json">{
  &quot;PostToolUse&quot;: [
    {
      &quot;matcher&quot;: &quot;Bash&quot;,
      &quot;hooks&quot;: [
        {
          &quot;type&quot;: &quot;command&quot;,
          &quot;command&quot;: &quot;python3 -c \&quot;import sys,json; d=json.load(sys.stdin); cmd=(d.get(&#39;tool_input&#39;) or {}).get(&#39;command&#39;,&#39;&#39;) or &#39;&#39;; print(json.dumps({&#39;hookSpecificOutput&#39;:{&#39;hookEventName&#39;:&#39;PostToolUse&#39;,&#39;additionalContext&#39;:&#39;A git commit just landed. If it finished a TODO.md item, move it to Done (done: today), add any follow-ups (added: today), and flag stale items. Do nothing if none of this applies.&#39;}})) if &#39;git commit&#39; in cmd else None\&quot;&quot;
        }
      ]
    }
  ]
}
</code></pre>
<p>It runs after every command but stays silent unless the command was a <code>git commit</code>. Maintenance cost: basically zero.</p>
<h3 id="problem-1-catch-the-good-new-ideas">Problem 1: catch the good new ideas</h3>
<p>The new ideas were the whole reason I kept ignoring the list — so now I make sure they get caught instead of lost.</p>
<p>At my desk, a fresh idea goes straight into the list, stamped with today&#39;s date. Away from my desk it&#39;s harder, so I lean on two simple tools: a single note pinned in Notesnook for anything I can type, and AudioPen when my hands are busy — I just talk, and it transcribes. Later, those ideas get folded into the list too.</p>
<p>Either way, next time I open the project the new idea is right there in the briefing next to everything else, dated, so I can see what&#39;s fresh and what&#39;s been waiting.</p>
<p>The thing that used to kill the list now feeds it.</p>
<h2 id="what-makes-it-work-dates">What makes it work: dates</h2>
<p>The whole thing runs on one simple rule — every item has dates:</p>
<pre><code class="language-markdown">- [ ] Fix pressure bug — wrong at altitude (added: 2026-06-20)
- [ ] ⏳ Decide on the logo (added: 2026-06-04)
- [x] Indexable city pages (done: 2026-06-08)
</code></pre>
<p>Dates are what let a machine handle it. Claude doesn&#39;t have to guess whether something&#39;s old — it just subtracts two dates. &quot;Stale&quot; stops being a feeling and becomes math.</p>
<h2 id="what-changed">What changed</h2>
<p>The list went from a graveyard to a dashboard. I open the project and the first thing I see is the truth: what moved, what&#39;s stuck, what I&#39;m avoiding. I haven&#39;t checked off a box by hand in weeks.</p>
<p>The bigger lesson: <strong>if you have to remember to do the upkeep, you won&#39;t.</strong> Tie it to something that already happens, give it a format a machine can read, and let the machine do the boring part.</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>A list dies the moment it stops matching reality.</strong></li>
<li><strong>When trust goes, the list goes.</strong> Catch it lying once and you stop opening it — and a list you don&#39;t open is already dead.</li>
<li><strong>Don&#39;t rely on discipline. Tie upkeep to events you can&#39;t skip</strong> — opening the project, committing code.</li>
<li><strong>Make the list show up on its own.</strong> A file you have to remember is a file you&#39;ll forget.</li>
<li><strong>Use dates.</strong> They turn &quot;is this stale?&quot; into simple math a machine can do.</li>
</ul>
<hr>
<p><strong>When did you last trust your own TODO list?</strong> Mine I ignored for years — until I stopped being the one keeping it.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20The%20TODO%20List%20Nobody%20Maintains">me an email</a>.</p>
      ]]></description><pubDate>Sat, 20 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[gribgrab]]></category></item><item><title><![CDATA[I Gave Claude Code Google Docs-Style Comments]]></title><link>https://olekwrites.com/google-docs-comments-claude-code/</link><guid>https://olekwrites.com/google-docs-comments-claude-code/</guid><description><![CDATA[<p><img src="/images/google-docs-comments-claude-code.png" alt="Pixel art illustration of a markdown document with speech-bubble comments pinned to the text"></p>
<h1 id="i-gave-claude-code-google-docs-style-comments">I Gave Claude Code Google Docs-Style Comments</h1>
<blockquote>
<p><em>Part of <strong><a href="/i-built-a-weather-app/">Building GribGrab</a></strong> — a series on what I learn building a weather app with Claude Code.</em></p>
</blockquote>
<p>Google Docs has this collaboration system I love: you highlight a line, drop a comment, and bounce back and forth in the margin — suggestions, questions, replies. It&#39;s the back-and-forth that makes it work.</p>
<p>That&#39;s the one thing I missed when I moved most of my work into Claude Code. The drafts were good, but I had no clean way to say &quot;this part — fix <em>this</em>.&quot;</p>
<p>So I rebuilt the workflow.</p>
<h2 id="my-flow">My Flow</h2>
<p>It&#39;s simpler than it sounds:</p>
<ol>
<li>I use VSCode to structure my folders, work on files, and talk to Claude Code through the built-in terminal.</li>
<li>When I start a project, topic, or task, I create a Markdown file.</li>
<li>The structure is always the same: <strong>goal, resources, outcome.</strong></li>
<li>I ask Claude Code to work on that file and draft the outcome right there.</li>
<li>When I want to comment on something, I highlight the text and hit <strong>Cmd+Option+M</strong> — the same shortcut Google Docs uses for inserting a comment.</li>
<li>Then I tell Claude Code to act on the comments.</li>
<li>I iterate on the same file by repeating steps 5 and 6.</li>
</ol>
<p>The whole thing lives in one Markdown file. Goal at the top, the draft below, my comments inline. No context lost, no copy-pasting between a chat window and an editor.</p>
<h2 id="how-to-set-it-up">How to Set It Up</h2>
<p>This is the part that makes it click. There&#39;s no extension — it&#39;s a single VSCode keybinding that wraps whatever text I&#39;ve selected in an HTML comment addressed to Claude.</p>
<p>Open the Command Palette (<code>Cmd+Shift+P</code>), run <strong>&quot;Preferences: Open Keyboard Shortcuts (JSON)&quot;</strong>, and add this:</p>
<pre><code class="language-json">{
  &quot;key&quot;: &quot;alt+cmd+m&quot;,
  &quot;command&quot;: &quot;editor.action.insertSnippet&quot;,
  &quot;when&quot;: &quot;editorTextFocus&quot;,
  &quot;args&quot;: {
    &quot;snippet&quot;: &quot;&lt;!-- Claude, this is my comment on the quoted text. Quote: \&quot;${TM_SELECTED_TEXT}\&quot; | My comment: $0 --&gt;&quot;
  }
}
</code></pre>
<p>Now highlight any line, press <strong>Cmd+Option+M</strong>, and you get:</p>
<pre><code class="language-markdown">&lt;!-- Claude, this is my comment on the quoted text. Quote: &quot;the highlighted line&quot; | My comment: ▌ --&gt;
</code></pre>
<p>The cursor lands right where you type your note. Two things make this work:</p>
<ul>
<li><code>${TM_SELECTED_TEXT}</code> pulls in whatever you&#39;ve selected, so Claude knows exactly which line you mean.</li>
<li>It&#39;s an HTML comment (<code>&lt;!-- --&gt;</code>), so it stays invisible when the Markdown renders but Claude reads it fine.</li>
</ul>
<p>Write your comment, then tell Claude Code to go through the file and address them. It reads the quote, reads your note, and edits in place — just like resolving comments in a doc.</p>
<h2 id="why-it-works">Why It Works</h2>
<p>The magic isn&#39;t the keybinding. It&#39;s that comments turn a one-shot prompt into a conversation <em>anchored to the text.</em></p>
<p>Instead of describing which paragraph I mean in the terminal, I point at it directly. Instead of re-explaining context, the context is the file. The draft and the feedback live in the same place, and that place is version-controlled, searchable, and mine.</p>
<p>It&#39;s the Google Docs margin, minus Google Docs.</p>
<h2 id="takeaways">Takeaways</h2>
<ul>
<li><strong>Keep one file per task.</strong> Goal, resources, outcome — that&#39;s the whole structure.</li>
<li><strong>Comment inline, don&#39;t re-prompt.</strong> Anchoring feedback to specific lines beats describing them in the terminal.</li>
<li><strong>Steal the shortcut you already know.</strong> Mapping it to Cmd+Option+M means there&#39;s nothing new to remember.</li>
<li><strong>It&#39;s one keybinding.</strong> No extensions, no setup tax.</li>
</ul>
<hr>
<p><strong>How do you give feedback to your AI assistant?</strong> Still typing it all in the chat — or have you found a better margin?</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20I%20Gave%20Claude%20Code%20Google%20Docs-Style%20Comments">me an email</a>.</p>
      ]]></description><pubDate>Fri, 19 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[writing]]></category><category><![CDATA[gribgrab]]></category></item><item><title><![CDATA[I Built a Weather App]]></title><link>https://olekwrites.com/i-built-a-weather-app/</link><guid>https://olekwrites.com/i-built-a-weather-app/</guid><description><![CDATA[<p><img src="/images/i-built-a-weather-app.png" alt="Pixel art of a weather chart on a retro screen with rain clouds and a data grid in the background"></p>
<h1 id="i-built-a-weather-app-which-i-use-every-day">I Built a Weather App, which I use every day.</h1>
<blockquote>
<p><strong>This is the start of a series about what I learn while building <a href="https://gribgrab.com">GribGrab</a></strong> — a free hourly weather chart I made with Claude Code. Notes on the product, the process, and the tools along the way.</p>
<p><strong>The series so far</strong></p>
<ol>
<li><strong>I Built a Weather App</strong> — the origin story <em>(you&#39;re here)</em></li>
<li><a href="/todo-list-nobody-maintains/">The TODO List Nobody Maintains</a> — keeping a project list honest without touching it</li>
<li><a href="/google-docs-comments-claude-code/">I Gave Claude Code Google Docs-Style Comments</a> — editing drafts inline, like in a doc</li>
<li><a href="/analytics-were-mostly-me/">The Analytics Were Mostly Me</a> — finding and cutting your own traffic out of your own stats</li>
<li><a href="/feature-that-found-a-bug/">The Feature That Found a Bug</a> — how a new map picker uncovered a bug hiding at the poles</li>
</ol>
</blockquote>
<p>I got tired of weather apps that just say &quot;partly cloudy.&quot;</p>
<p>So I built <a href="https://gribgrab.com">GribGrab</a> — a simple page that shows you a full hourly chart for the next 7 days. Temperature, rain, wind, pressure, all in one view. No account, no app. Just search a city and see what&#39;s coming hour by hour.</p>
<h2 id="why">Why</h2>
<p>I commute by bike. I travel. I plan outdoor activities. I want to know <em>when exactly</em> it&#39;s going to rain on Thursday — not just &quot;Thursday: showers.&quot;</p>
<p>Most of weather app I tried wrapped that in so much UX that the actual data was buried.</p>
<p>So I built the thing I wanted.</p>
<h2 id="the-reddit-moment">The Reddit Moment</h2>
<p>I posted GribGrab on r/weather. Someone replied — not with &quot;nice job&quot; — but with a detailed explanation of why raw numerical model output shouldn&#39;t really be called a forecast.</p>
<p>The short version: global weather models run on grids of roughly 10–25 km per cell. Your city and the hills 5 km away share the same cell. Local effects — coastal fog, mountain valleys, urban heat islands — are invisible to the model. Real forecasts apply statistical corrections trained on years of local observation data. GribGrab does none of that.</p>
<p>He was right.</p>
<h2 id="what-i-did-with-that">What I Did With That</h2>
<p>First, I updated the app&#39;s language. &quot;Model output&quot; instead of &quot;forecast.&quot; A small disclaimer. Honest framing.</p>
<p>Then I realised this is actually a feature for the right audience. Hikers, people outdooring a lot — people who understand weather — often prefer raw model data. They want to interpret it themselves, not get a smoothed-over summary.</p>
<h2 id="where-it-is-now">Where It Is Now</h2>
<p>About 20–30 people use it daily, mostly from Reddit posts. I&#39;ve added city pages for SEO — early days, but a long-term bet.</p>
<p>No monetization yet. Growth first.</p>
<h2 id="what-i-learned">What I Learned</h2>
<p>Build the thing that scratches your own itch. Post it publicly as soon as it&#39;s embarrassing enough. The criticism you get will teach you a lot.</p>
<hr>
<p><strong>Have you checked what the weather looked like the last time your hike got rained out?</strong> → <a href="https://gribgrab.com">gribgrab.com</a></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20I%20Built%20a%20Weather%20App">me an email</a>.</p>
      ]]></description><pubDate>Sat, 13 Jun 2026 06:00:00 GMT</pubDate><category><![CDATA[en]]></category><category><![CDATA[projects]]></category><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[gribgrab]]></category></item><item><title><![CDATA[Are You Sure About That? The Prompt That Changed How I Use AI]]></title><link>https://olekwrites.com/are-you-sure-about-that/</link><guid>https://olekwrites.com/are-you-sure-about-that/</guid><description><![CDATA[<p><img src="/images/are-you-sure-about-that.png" alt="Pixel art illustration of a skeptical character questioning a glowing AI screen"></p>
<h1 id="are-you-sure-about-that-the-prompt-that-changed-how-i-use-ai">Are You Sure About That? The Prompt That Changed How I Use AI</h1>
<p>&quot;Are you sure about that?&quot;</p>
<p>This should have been the first thing I said to AI after every initial answer. Why? It gives better responses when I doubt it from the start. I&#39;ve tried it on several prompts — and the difference is real.</p>
<h2 id="why-skepticism-works">Why Skepticism Works</h2>
<p>AI models are trained to be helpful. That sometimes means they confidently fill gaps with plausible-sounding information. When you challenge an answer, you force the model to reconsider — to flag what it actually knows versus what it&#39;s guessing.</p>
<h2 id="the-prompt-i-use">The Prompt I Use</h2>
<p>I&#39;ve found two versions useful, depending on how much control I want.</p>
<h3 id="short-version">Short version</h3>
<blockquote>
<p>Always flag uncertain or speculative claims with [uncertain] or phrases like &quot;I&#39;m not sure about this.&quot; State well-established facts directly. Don&#39;t inflate responses with loosely supported points.</p>
</blockquote>
<h3 id="long-version">Long version</h3>
<blockquote>
<p>When answering questions, clearly distinguish between what you know with confidence and what is uncertain. For well-established facts, state them directly. For anything speculative, poorly documented, or based on indirect reasoning, flag it explicitly using phrases like &quot;I&#39;m not certain&quot;, &quot;this is speculative&quot;, or a marker like [uncertain]. Do not pad responses with loosely related points just to seem thorough. If you don&#39;t know something, say so plainly.</p>
</blockquote>
<p>Both versions do the same job. The short one fits in a system prompt easily. The long one leaves no ambiguity.</p>
<h2 id="what-changes">What Changes</h2>
<p>Once you add this to your setup, you start seeing [uncertain] markers appear. You notice the model hedging more. You trust what&#39;s left unhedged a little more.</p>
<p>It&#39;s not that the AI suddenly becomes smarter. It&#39;s that it stops pretending to be more confident than it is.</p>
<hr>
<p><strong>What&#39;s your experience?</strong> Try it yourself and see what changes.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Are%20You%20Sure%20About%20That%3F%20The%20Prompt%20That%20Changed%20How%20I%20Use%20AI">me an email</a>.</p>
      ]]></description><pubDate>Mon, 04 May 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[I Read a Lot. I Remember Almost Nothing. So I Built This.]]></title><link>https://olekwrites.com/building-marrowminded/</link><guid>https://olekwrites.com/building-marrowminded/</guid><description><![CDATA[<p><img src="/images/marrowminded.png" alt="Pixel art illustration of a book opening with a single glowing idea floating out"></p>
<h1 id="i-read-a-lot-i-remember-almost-nothing-so-i-built-this">I Read a Lot. I Remember Almost Nothing. So I Built This.</h1>
<p>I finish a book. I feel good about it. Two weeks later, I can barely recall what it was about.</p>
<p>That&#39;s the problem. And it&#39;s not a lack of effort — I read consistently. The problem is the format. You read a book once, in big chunks, and then... nothing. The ideas don&#39;t stick.</p>
<p>I&#39;d read about the Ebbinghaus forgetting curve before — the idea that we forget roughly 70% of what we learn within 24 hours. I knew about it. I just didn&#39;t do anything about it.</p>
<p>So I built MarrowMinded. The name comes from the idea of extracting marrow — the most nutritious part of the bone. Books have marrow too. Most of what surrounds it is just filler.</p>
<h2 id="what-it-does">What It Does</h2>
<p>MarrowMinded gives me one lesson per day from a book I&#39;ve already chosen. Not a summary. Not a chapter. One concept, structured into seven sections:</p>
<ul>
<li>A short quote from the text</li>
<li>The key thesis in one sentence</li>
<li>The idea explained in depth</li>
<li>A specific example from the book</li>
<li>How it applies to my life today</li>
<li>A concrete task for the day (5–30 minutes)</li>
<li>A reflection question</li>
</ul>
<p>That&#39;s it. One lesson. Every day.</p>
<h1 id="how-does-it-look">How does it look?</h1>
<p><img src="/images/marrowminded-in-action.png" alt="MarrowMinded in action"></p>
<h2 id="why-one-lesson">Why One Lesson?</h2>
<p>Business books are mostly padding. An author has 40 pages of insight and writes 300 pages of anecdotes around them. The anecdotes make it readable. They also make it forgettable.</p>
<p>The insight from <em>Effortless</em> or <em>Naval&#39;s Almanack</em> is there. The signal is real. But the format — read it once, all at once — is broken.</p>
<p>One focused concept a day, repeated over months, beats a 3-hour reading binge I won&#39;t repeat or remember. Drip beats flood.</p>
<h2 id="how-i-built-it">How I Built It</h2>
<p>The stack is deliberately minimal. One Python file (FastAPI + SQLite), one HTML file with vanilla JavaScript. No framework, no build step. Books are plain <code>.txt</code> files. Lessons are generated once by AI and cached as JSON — so on day one of any book, there&#39;s no API cost at all.</p>
<p>Multi-provider AI support under the hood (Claude, GPT, Gemini, Groq), but Claude is the default. The prebuilt lessons cost me around $50 in tokens total. The whole thing took 10–12 hours to build, mostly evenings.</p>
<p>It runs on Render&#39;s free tier.</p>
<h2 id="the-part-that-surprised-me">The Part That Surprised Me</h2>
<p>I use it every morning. That&#39;s the metric I actually care about.</p>
<p>Building something you genuinely use changes everything about how you build it. You cut the features you don&#39;t need because you&#39;d notice if they were wrong. You keep it simple because complexity would slow you down before breakfast.</p>
<p>I have eight books loaded in right now — a mix of English and Polish titles. Every morning, one lesson, one task. That&#39;s the whole thing.</p>
<hr>
<p><strong>Do you have a reading habit? And more importantly — do you actually remember what you read?</strong></p>
<p>If you&#39;re curious how it works, have questions about the stack, or want to build something similar — ask. And if you&#39;d like to take a look at the repo, just say so.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20I%20Read%20a%20Lot.%20I%20Remember%20Almost%20Nothing.%20So%20I%20Built%20This.">me an email</a>.</p>
      ]]></description><pubDate>Fri, 01 May 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[projects]]></category><category><![CDATA[ai]]></category></item><item><title><![CDATA[Siri Feels Like 2014—And Apple Doesn't Seem to Care]]></title><link>https://olekwrites.com/siri-feels-like-2014/</link><guid>https://olekwrites.com/siri-feels-like-2014/</guid><description><![CDATA[<p><img src="/images/siri-feels-like-2014.png" alt="Pixel art illustration of outdated AI assistant vs modern AI"></p>
<h1 id="siri-feels-like-2014and-apple-doesnt-seem-to-care">Siri Feels Like 2014—And Apple Doesn&#39;t Seem to Care</h1>
<p>I&#39;ve been using Opera Neon on my laptop. Together with Claude Code and Claude, I can do a lot. Research, writing, coding, data analysis—you name it. The AI works so well that I forget it&#39;s even AI.</p>
<p>Then I ask Siri to do something.</p>
<p>&quot;I can&#39;t do that.&quot;</p>
<p>The contrast is jarring.</p>
<h2 id="what-siri-can-actually-do">What Siri Can Actually Do</h2>
<p>Don&#39;t get me wrong—Siri is useful for the basics:</p>
<ul>
<li>&quot;Open app X&quot;</li>
<li>&quot;Set a timer for 10 minutes&quot;</li>
<li>&quot;Volume up&quot;</li>
<li>&quot;Call John&quot;</li>
</ul>
<p>These work fine. Siri handles simple commands without friction.</p>
<p>But the moment you ask for anything more complex? It falls apart.</p>
<h2 id="where-siri-breaks-down">Where Siri Breaks Down</h2>
<p>Last week, I asked Siri to create a card in Trello.</p>
<p>&quot;I can&#39;t do that.&quot;</p>
<p>Fine. How about creating a reminder with a specific note attached?</p>
<p>&quot;I can&#39;t do that.&quot;</p>
<p>These aren&#39;t edge cases. These are basic productivity tasks. Things I do daily with other AI tools without even thinking about it.</p>
<h2 id="the-dissonance-is-real">The Dissonance Is Real</h2>
<p>Here&#39;s the thing: I&#39;ve had voice conversations with Perplexity. It feels like watching &quot;Her&quot; v0.1. Not perfect, but you can see where it&#39;s going. It responds naturally. It understands context. It adapts.</p>
<p>Having a conversation with Siri feels like talking to a primitive chatbot from 10 years ago. More frustrating than helpful.</p>
<p>And that dissonance—the gap between what top-tier AI can do and what Siri offers—shows just how far behind Apple and Google really are.</p>
<h2 id="what-this-means">What This Means</h2>
<p>I&#39;m not saying Siri needs to match Claude&#39;s reasoning capabilities overnight. But the difference isn&#39;t just about features. It&#39;s about expectations.</p>
<p>When you use Claude, Opera Neon, or even ChatGPT daily, you start expecting AI to understand you. To adapt. To work with context and nuance.</p>
<p>Siri doesn&#39;t do that. It&#39;s still a list of hardcoded commands wrapped in a voice interface.</p>
<h2 id="imagine-the-alternative">Imagine the Alternative</h2>
<p>Think about how good Apple&#39;s OS could be if their AI were even close to Claude&#39;s level.</p>
<p>Not as good. Just close.</p>
<p>Imagine asking your phone a complex question and getting a thoughtful, contextual answer instead of &quot;Here&#39;s what I found on the web.&quot;</p>
<p>Imagine voice assistants that actually assist instead of just executing preset commands.</p>
<p>We&#39;re not there yet. But some of us are getting close.</p>
<p>Just not Apple.</p>
<hr>
<p><strong>What&#39;s your experience?</strong> Do you still use Siri regularly? Or have you noticed the same gap I have? I&#39;d love to hear your take.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Siri%20Feels%20Like%202014%E2%80%94And%20Apple%20Doesn't%20Seem%20to%20Care">me an email</a>.</p>
      ]]></description><pubDate>Fri, 06 Mar 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[In Ten Years, Everyone Can Be a Developer]]></title><link>https://olekwrites.com/everyone-can-be-a-developer/</link><guid>https://olekwrites.com/everyone-can-be-a-developer/</guid><description><![CDATA[<p><img src="/images/everyone-can-be-a-developer.png" alt="Pixel art illustration of person building software with AI"></p>
<h1 id="in-ten-years-everyone-can-be-a-developer">In Ten Years, Everyone Can Be a Developer</h1>
<p>In ten years, everyone can create their own app. Hell, even a browser!</p>
<p>How many times have I written on this blog the magic sentence &quot;mark my words&quot;? I believe a certain number of times. Maybe even too many.</p>
<p>But here&#39;s another one: <strong>mark my words</strong>.</p>
<p>I&#39;m a product manager. I don&#39;t have developer skills. Probably won&#39;t learn any soon, at an acceptable level.</p>
<p>But hey, I don&#39;t have to anymore.</p>
<h2 id="the-new-execution-model">The New Execution Model</h2>
<p>I&#39;m certain—in ten years, everyone can be a developer. You have an idea, and the execution is a matter of how well you operate with AI. And how stubborn and resilient you are.</p>
<p>That&#39;s it. Idea + AI fluency + persistence = shipped product.</p>
<h2 id="a-gorillaz-browser-anyone">A Gorillaz Browser, Anyone?</h2>
<p>Let&#39;s say I&#39;m a die-hard Gorillaz fan. I want to create a browser with their leitmotif. Here&#39;s what Claude suggests when I ask for 5 unique selling points:</p>
<p><strong>Me:</strong> Let&#39;s say I want to create a desktop browser for the Gorillaz band fandom. What would be 5 USPs?</p>
<p><strong>Claude:</strong></p>
<blockquote>
<p><strong>Phase-shifting UI</strong> — The browser&#39;s visual theme dynamically transforms to match the current &quot;Phase&quot; era of Gorillaz (Phase 1&#39;s raw comic aesthetic, Phase 4&#39;s psychedelic neon, etc.), making the browsing experience feel like living inside the band&#39;s evolving universe.</p>
</blockquote>
<blockquote>
<p><strong>Murdoc&#39;s Dark Web Radar</strong> — A built-in privacy/tracker blocker styled as Murdoc&#39;s suspicious paranoia meter, showing blocked trackers with lore-accurate commentary and insults from the characters.</p>
</blockquote>
<blockquote>
<p><strong>Kong Studios New Tab</strong> — Every new tab opens as an interactive Kong Studios hub—your bookmarks, speed dial, and widgets are embedded into the animated studio environment with the four characters present.</p>
</blockquote>
<blockquote>
<p><strong>Noodle&#39;s Translation Engine</strong> — A built-in multilingual page translator with a personality layer, framed as Noodle&#39;s polyglot skills, with optional character voice narration for selected text (using the band&#39;s iconic audio aesthetic).</p>
</blockquote>
<blockquote>
<p><strong>2D&#39;s Playlist Sidebar</strong> — A persistent music sidebar that surfaces Gorillaz tracks, remixes, and fan-curated playlists synced with Spotify or YouTube, styled around 2D&#39;s melancholic but dreamy personality—with mood-based recommendations tied to your browsing context.</p>
</blockquote>
<p>Not bad for 30 seconds of work.</p>
<h2 id="how-this-actually-gets-built">How This Actually Gets Built</h2>
<p>Then I &quot;hire&quot; AI code assistants. When I have enough resources (AKA $$$), I &quot;hire&quot; ten AI agents, and I have my browser within a month.</p>
<p>When I see how fast the AI environment changes—and it looks like exponential growth—I&#39;m certain it&#39;s possible.</p>
<h2 id="what-this-means">What This Means</h2>
<p>The barrier to building software isn&#39;t technical knowledge anymore. It&#39;s vision. Persistence. The ability to communicate what you want clearly enough that AI can help you build it.</p>
<p>That&#39;s a completely different skill set. And it&#39;s one that more people have access to.</p>
<p>The question isn&#39;t whether you can code. The question is whether you can imagine, iterate, and stick with it long enough to ship.</p>
<hr>
<p><strong>What would you build?</strong> If you could create any app or tool without needing to write code yourself, what would it be? I&#39;d love to hear your ideas.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20In%20Ten%20Years%2C%20Everyone%20Can%20Be%20a%20Developer">me an email</a>.</p>
      ]]></description><pubDate>Sat, 28 Feb 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[future]]></category></item><item><title><![CDATA[Managers Aren't Getting Younger—The Data Proves Me Wrong]]></title><link>https://olekwrites.com/managers-arent-getting-younger/</link><guid>https://olekwrites.com/managers-arent-getting-younger/</guid><description><![CDATA[<p><img src="/images/managers-arent-getting-younger.png" alt="Pixel art illustration of a football manager with data charts"></p>
<h1 id="managers-arent-getting-youngerthe-data-proves-me-wrong">Managers Aren&#39;t Getting Younger—The Data Proves Me Wrong</h1>
<p>I&#39;m a big football fan—or soccer, if you&#39;re in the US. I love the history, the data, the statistics. Recently, I had a friendly argument with a fellow football enthusiast. My claim: young managers are taking over elite football. His claim: not at all.</p>
<p>Here&#39;s the thing about the Internet: you can&#39;t just let people be wrong.</p>
<h2 id="the-hypothesis">The Hypothesis</h2>
<p>I wanted to test my theory quickly and effortlessly. My hypothesis: the average age of trophy-winning managers has been decreasing over time. In other words, managers are younger when they win major trophies now than they were in the past.</p>
<p>To test this, I used Opera Neon. Here were my three prompts:</p>
<blockquote>
<p>Analyze Champions League teams from 1992 until 2025. See who was the manager when winning the trophy. Check their age. Calculate the average age of all managers and the 5-year moving average.</p>
</blockquote>
<blockquote>
<p>Analyze UEFA Cup/Europa League winner teams from 1992 until 2025. See who was the manager when winning the trophy. Check their age. Calculate the average age of all managers and the 5-year moving average.</p>
</blockquote>
<blockquote>
<p>Analyze Premier League teams from 1992 until 2025. See who was the manager when winning the trophy. Check their age. Calculate the average age of all managers and the 5-year moving average.</p>
</blockquote>
<h2 id="the-results">The Results</h2>
<p>Plot twist: <strong>managers aren&#39;t getting younger</strong>. My gut feeling was completely wrong.</p>
<p><img src="/images/managers-combined-comparison.png" alt="Comparison of manager ages across three competitions"></p>
<p>The chart above shows the 5-year moving average for all three competitions. The trend is clear: manager ages have been increasing, not decreasing.</p>
<h3 id="champions-league-1992-2025">Champions League (1992-2025)</h3>
<ul>
<li><strong>Overall average age</strong>: 47.79 years</li>
<li><strong>Youngest winner</strong>: Pep Guardiola (38, Barcelona, 2009)</li>
<li><strong>Oldest winner</strong>: Raymond Goethals (71, Marseille, 1993)</li>
<li><strong>Recent trend</strong>: The 5-year moving average increased from 43.8 in 2007 to 56.2 in 2024-2025</li>
</ul>
<p><img src="/images/managers-champions-league.png" alt="Champions League manager ages"></p>
<h3 id="uefa-cupeuropa-league-1992-2025">UEFA Cup/Europa League (1992-2025)</h3>
<ul>
<li><strong>Overall average age</strong>: 48.35 years</li>
<li><strong>Youngest winner</strong>: André Villas-Boas (33, Porto, 2011)</li>
<li><strong>Oldest winner</strong>: Gian Piero Gasperini (66, Atalanta, 2024)</li>
<li><strong>Recent trend</strong>: Moving average rose from 42.6 in 2014 to 56.6 in 2025</li>
</ul>
<p><img src="/images/managers-europa-league.png" alt="Europa League manager ages"></p>
<h3 id="premier-league-1992-2025">Premier League (1992-2025)</h3>
<ul>
<li><strong>Overall average age</strong>: 51.61 years</li>
<li><strong>Youngest winner</strong>: José Mourinho (42, Chelsea, 2004-05)</li>
<li><strong>Oldest winner</strong>: Alex Ferguson (71, Manchester United, 2012-13)</li>
<li><strong>Recent trend</strong>: Moving average peaked at 63.4 in 2010-11 (Ferguson&#39;s dominance), then dropped to around 50 in recent years</li>
</ul>
<p><img src="/images/managers-premier-league.png" alt="Premier League manager ages"></p>
<h2 id="the-power-of-ai-research">The Power of AI Research</h2>
<p>Here&#39;s what made this effortless: I spent less than a minute writing three prompts. Opera Neon handled all the research in the background, pinged me with updates, and delivered complete analysis. No Wikipedia rabbit holes. No manual spreadsheets. Just pure, automated research.</p>
<p>The data reveals experienced managers—particularly Carlo Ancelotti and Pep Guardiola in recent years—have actually driven the average age upward, not downward.</p>
<h2 id="whats-next">What&#39;s Next?</h2>
<p>To get a fuller picture, I could analyze the top 4 finishers instead of just trophy winners. That would reveal whether younger managers are breaking into elite football at the highest level, even if they haven&#39;t lifted trophies yet.</p>
<h2 id="what-i-learned">What I Learned</h2>
<p>Data beats gut feeling. Every time.</p>
<p>I was convinced young managers were taking over. The numbers show the opposite. The 5-year moving averages are trending upward across all three competitions, proving that experience still dominates elite football.</p>
<p>And AI made hypothesis-testing absurdly easy. One minute of prompts. Zero manual research. Complete analysis delivered on a silver platter.</p>
<hr>
<p><strong>What&#39;s your take?</strong> Do you think younger managers will start dominating in the next decade, or will experience always have the edge? Let me know what you think.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Managers%20Aren't%20Getting%20Younger%E2%80%94The%20Data%20Proves%20Me%20Wrong">me an email</a>.</p>
      ]]></description><pubDate>Tue, 10 Feb 2026 06:00:00 GMT</pubDate><category><![CDATA[data]]></category><category><![CDATA[reflection]]></category><category><![CDATA[football]]></category></item><item><title><![CDATA[Not Good at It? Or Just Not Honest About It?]]></title><link>https://olekwrites.com/not-good-at-it/</link><guid>https://olekwrites.com/not-good-at-it/</guid><description><![CDATA[<p><img src="/images/not-good-at-it.png" alt="Pixel art illustration of someone making excuses"></p>
<h1 id="not-good-at-it-or-just-not-honest-about-it">Not Good at It? Or Just Not Honest About It?</h1>
<p>&quot;I&#39;m not good at sports. Languages. Mathematics. You name it.&quot;</p>
<p>When I hear myself—or someone else—say those words, I get a glitch.</p>
<p>Is this true? Is this something I actually believe? Or is this just an excuse I tell myself?</p>
<h2 id="the-real-question">The Real Question</h2>
<p>Is this really about not being good at something? Or is it about not being honest with myself?</p>
<p>Am I too afraid to admit I haven&#39;t thought it through? Too scared to say I have other priorities right now?</p>
<h2 id="the-trick-we-play-on-ourselves">The Trick We Play on Ourselves</h2>
<p>It&#39;s hard for me to believe I can&#39;t reach a decent level at anything.</p>
<p>So instead of admitting this to myself, I pull a trick. I figure out yet another plausible explanation. I construct a narrative that sounds reasonable but dodges the real issue.</p>
<p>&quot;I&#39;m not good at languages&quot; sounds better than &quot;I haven&#39;t prioritized learning a language.&quot;</p>
<p>&quot;I&#39;m just not a math person&quot; feels safer than &quot;I chose to focus my energy elsewhere.&quot;</p>
<h2 id="why-honesty-matters">Why Honesty Matters</h2>
<p>Facing reality—acknowledging where we actually are—is the first step toward change.</p>
<p>Without honesty, it&#39;s hard to even start.</p>
<p>When I say &quot;I&#39;m not good at this,&quot; I&#39;m closing a door. I&#39;m telling myself the story&#39;s already written.</p>
<p>But when I say &quot;I haven&#39;t prioritized this,&quot; I&#39;m acknowledging a choice. And choices can always change.</p>
<h2 id="what-i-learned">What I Learned</h2>
<p>The language we use with ourselves matters.</p>
<p>&quot;Not good at it&quot; suggests something fixed. Permanent. Beyond our control.</p>
<p>&quot;Haven&#39;t prioritized it&quot; acknowledges agency. It admits we&#39;re making trade-offs, whether we realize it or not.</p>
<p>Both might describe the same current reality. But only one leaves room for change.</p>
<hr>
<p><strong>What about you?</strong> Is there something you tell yourself you&#39;re &quot;not good at&quot;? What happens when you reframe it as a choice about priorities instead?</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Not%20Good%20at%20It%3F%20Or%20Just%20Not%20Honest%20About%20It%3F">me an email</a>.</p>
      ]]></description><pubDate>Mon, 09 Feb 2026 06:00:00 GMT</pubDate><category><![CDATA[reflection]]></category><category><![CDATA[life-lessons]]></category></item><item><title><![CDATA[AI Ain't Funny: Testing Which AI Tells the Best Jokes]]></title><link>https://olekwrites.com/ai-aint-funny/</link><guid>https://olekwrites.com/ai-aint-funny/</guid><description><![CDATA[<p><img src="/images/ai-aint-funny.png" alt="Pixel art illustration of AI trying to tell jokes"></p>
<h1 id="ai-aint-funny-testing-which-ai-tells-the-best-jokes">AI Ain&#39;t Funny: Testing Which AI Tells the Best Jokes</h1>
<p>I&#39;ve had this nagging impression: AI is good at many things, but not at telling jokes, being funny, or creating witty punchlines. Every time I ask an AI to be funny, I get dad jokes. Or should I say &quot;dAId jokes&quot;? ;-)</p>
<p>Then I read <a href="https://www.nytimes.com/athletic/7024688/2026/02/05/ski-jump-penis-enhancement-wada/">this article from The Athletic</a> about ski jumpers. Let&#39;s just say it was begging for a punchline, meme, or literally any kind of reaction.</p>
<p>The story? Ski jumping&#39;s latest &quot;marginal gains&quot; rumor: athletes may be injecting hyaluronic acid into their penises—not for vanity, but to &quot;measure bigger,&quot; get looser suits, and catch more air like a sail. No one&#39;s named, but WADA says it&#39;ll investigate if evidence appears.</p>
<p>Instantly, several punchlines and retorts came to mind in my native tongue. They were witty, if I do say so myself :-D</p>
<p>But then I wondered: how would AI handle this? I&#39;d been suspecting AI wasn&#39;t funny, and I wanted to test that theory once and for all. This article was perfect—easy material for anyone with a sense of humor.</p>
<h2 id="the-experiment">The Experiment</h2>
<p>I asked several AI providers to create funny punchlines, taglines, and retorts. The goal was simple: compare them and subjectively decide which one was actually funny—and which one won the dAId jokes competition.</p>
<p>Here&#39;s the prompt I used:</p>
<blockquote>
<p>Here&#39;s the article: <a href="https://www.nytimes.com/athletic/7024688/2026/02/05/ski-jump-penis-enhancement-wada/">https://www.nytimes.com/athletic/7024688/2026/02/05/ski-jump-penis-enhancement-wada/</a> Read it carefully. Prepare 3 witty punchlines (up to 200 characters) I can use to create a meme for that article.</p>
</blockquote>
<h2 id="the-results">The Results</h2>
<h3 id="gemini">Gemini</h3>
<blockquote>
<p>When they said &#39;every inch counts&#39; in the Winter Olympics, I don&#39;t think this is what they meant.</p>
</blockquote>
<blockquote>
<p>Forget the V-style—apparently, the new way to get more lift is the &#39;D-style.&#39;</p>
</blockquote>
<blockquote>
<p>WADA: &#39;Is it doping?&#39; FIS: &#39;It&#39;s a sail.&#39; The rest of us: &#39;It&#39;s a bit much for 5 extra meters.&#39;</p>
</blockquote>
<h3 id="chatgpt">ChatGPT</h3>
<blockquote>
<p>When they said &#39;go big or go home,&#39; ski jumpers took it personally.</p>
</blockquote>
<blockquote>
<p>WADA checking ski jumping… now scanning everything FROM THE GROUND UP.</p>
</blockquote>
<blockquote>
<p>Olympics 2026: Breaking records and bending… rules?</p>
</blockquote>
<h3 id="claude">Claude</h3>
<blockquote>
<p>WADA investigating &#39;Penisgate.&#39; No hard evidence yet, but officials promise to rise to the occasion.</p>
</blockquote>
<blockquote>
<p>Scientists confirm every centimeter counts. Ski jumpers taking notes. Norway already caught &#39;adjusting&#39; their suits.</p>
</blockquote>
<blockquote>
<p>Athletes willing to inject acid into their junk for 2.8 extra meters of flight. That&#39;s Olympic-level commitment, folks.</p>
</blockquote>
<h3 id="neon">Neon</h3>
<blockquote>
<p>When you said &quot;enhance your performance,&quot; I didn&#39;t think you meant at the tailor. Ski jumpers: redefining suit measurements, one bulge at a time.</p>
</blockquote>
<blockquote>
<p>WADA officials: &quot;We&#39;ll investigate.&quot; Also WADA officials: Googling &#39;can you really ski jump with that?&#39;</p>
</blockquote>
<blockquote>
<p>Other sports: blood doping. Ski jumpers: bulge doping. Aerodynamics just got a lot more... interesting.</p>
</blockquote>
<h3 id="perplexity">Perplexity</h3>
<blockquote>
<p>When the ski jump goes from gravity to groin-gravity in one leap.</p>
</blockquote>
<blockquote>
<p>Took off like a champ, landed like science class—strictly no physics allowed.</p>
</blockquote>
<blockquote>
<p>Peak performance, zero chill: physics says &quot;drop&quot; and so does the ground.</p>
</blockquote>
<h2 id="my-subjective-ranking">My Subjective Ranking</h2>
<ol>
<li><strong>Claude, option 1</strong> - &quot;Penisgate&quot; with the &quot;rise to the occasion&quot; pun? Chef&#39;s kiss.</li>
<li><strong>Claude, option 2</strong> - The Norway callback was specific and landed well.</li>
<li><strong>Neon, option 3</strong> - &quot;Bulge doping&quot; is genuinely clever.</li>
</ol>
<h2 id="what-i-learned">What I Learned</h2>
<p>Here&#39;s the thing: AI isn&#39;t terrible at humor. But it&#39;s safe. Too safe.</p>
<p>The best human jokes walk a line. They&#39;re specific. They reference real things. They take risks. AI models are trained to be helpful and harmless, which means they naturally pull their punches.</p>
<p>Notice how Claude&#39;s responses were edgier than the others? Interesting. But even then, they felt calculated. Like someone trying to be funny rather than actually being funny.</p>
<p>The dAId joke theory holds up.</p>
<hr>
<p><strong>Which one made you laugh?</strong> Or better yet—what punchline would you have written? I&#39;d love to hear what you came up with.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20AI%20Ain't%20Funny%3A%20Testing%20Which%20AI%20Tells%20the%20Best%20Jokes">me an email</a>.</p>
      ]]></description><pubDate>Sun, 08 Feb 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[ai]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[Markdown Will Be the New Doc Format. Screenshot This.]]></title><link>https://olekwrites.com/markdown-new-doc-format/</link><guid>https://olekwrites.com/markdown-new-doc-format/</guid><description><![CDATA[<p><img src="/images/markdown-new-doc-format.png" alt="Pixel art illustration of markdown syntax transforming into documents"></p>
<h1 id="markdown-will-be-the-new-doc-format-screenshot-this">Markdown Will Be the New Doc Format. Screenshot This.</h1>
<p>Take a screenshot of this prediction. Come back in a few years and prove me wrong: Markdown will be the new doc format.</p>
<p>I&#39;ve spent the last few months conducting product analysis with Claude Code, examining user behaviors in our product. That means hours in the Terminal. Prompting, prompting, and more prompting.</p>
<p>And something interesting happened.</p>
<h2 id="the-accidental-shift">The Accidental Shift</h2>
<p>Since most of my analysis happens locally, I stopped using Google Docs. Stopped using Google Spreadsheets. I create summaries, notes, and instructions locally via Claude Code.</p>
<p>Claude uses <code>.md</code>. Markdown.</p>
<p>And you know what? It works absolutely fine. I have everything I need in a clean, nice, minimalistic format. No formatting bloat. No compatibility issues. No waiting for documents to load.</p>
<p>Just text. Structured text.</p>
<h2 id="why-this-matters">Why This Matters</h2>
<p>Here&#39;s the thing most people haven&#39;t noticed: AI coding assistants are changing how we create documentation.</p>
<p>Not intentionally. Not because someone decided &quot;Markdown should be the standard.&quot; But because when you&#39;re working with an AI, Markdown is the path of least resistance.</p>
<p>It&#39;s already there. It&#39;s fast. It&#39;s readable.</p>
<h2 id="the-network-effect-nobody-saw-coming">The Network Effect Nobody Saw Coming</h2>
<p>How will this affect Markdown adoption? I suspect significantly.</p>
<p>First, it&#39;s happening quietly. Most people outside the developer community don&#39;t even realize this shift is occurring.</p>
<p>But people using AI on daily basis are creating more documentation than ever before. They&#39;re doing analysis. Writing specifications. Creating knowledge bases. And increasingly, they&#39;re doing it in Markdown through AI assistants.</p>
<p>That&#39;s a massive behavior change happening under the radar.</p>
<h2 id="what-happens-next">What Happens Next</h2>
<p>When developers document in Markdown by default, their teams start reading Markdown. Then those team members start writing in Markdown. The format spreads.</p>
<p>Add to that: more people are using AI assistants. More of those assistants default to Markdown. More people get comfortable with the format without realizing they&#39;re learning it.</p>
<p>It&#39;s not replacing Word documents for corporate reports. Not yet, anyway.</p>
<p>And let&#39;s be clear: Google Docs and Microsoft Word aren&#39;t going anywhere for collaborative work. Real-time collaboration with comments, suggestions, and tracked changes? Word and Google Docs still dominate. When you need multiple stakeholders reviewing a document simultaneously, seeing exactly who changed what, and managing permissions across an organization, those tools are irreplaceable.</p>
<p>Markdown has version control through Git, sure. But that&#39;s a developer workflow. Most people aren&#39;t going to learn Git just to collaborate on a document.</p>
<p>But for individual knowledge work, technical documentation, analysis, and internal communication? Markdown is quietly winning.</p>
<h2 id="why-im-confident">Why I&#39;m Confident</h2>
<p>I&#39;m making this prediction because I&#39;ve watched it happen to myself. I didn&#39;t decide to switch to Markdown. I didn&#39;t evaluate alternatives. I didn&#39;t plan a migration.</p>
<p>I just started working differently. And Markdown became my default because it was there, it worked, and I had no reason to leave.</p>
<p>If that&#39;s happening to me, it&#39;s happening to thousands of others.</p>
<p>Screenshot this. We&#39;ll see.</p>
<hr>
<p><strong>Do you use Markdown?</strong> Did you choose it deliberately, or did you just... end up there?</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Markdown%20Will%20Be%20the%20New%20Doc%20Format.%20Screenshot%20This.">me an email</a>.</p>
      ]]></description><pubDate>Wed, 21 Jan 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[writing]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[What Would You Do If You Weren't Afraid?]]></title><link>https://olekwrites.com/what-would-you-do-if-not-afraid/</link><guid>https://olekwrites.com/what-would-you-do-if-not-afraid/</guid><description><![CDATA[<p><img src="/images/what-would-you-do-if-not-afraid.png" alt="Pixel art illustration of overcoming fear and pursuing dreams"></p>
<h1 id="what-would-you-do-if-you-werent-afraid">What Would You Do If You Weren&#39;t Afraid?</h1>
<p>Once upon a time, I walked down an alley and there was a litter bin. Gray, dirty, ugly, and a bit dented. Nothing to see there.</p>
<p>But it was a special bin.</p>
<p>It had a label on it that said: <strong>&quot;What would you do, if you weren&#39;t afraid?&quot;</strong></p>
<p>It caught my attention. I&#39;d never heard that before.</p>
<h2 id="the-ultimate-stopper">The Ultimate Stopper</h2>
<p>What a powerful question.</p>
<p>I started wondering. Indeed, fear is the ultimate stopper for me. What if I did a thought experiment where I eliminated that factor? What if I could do everything, knowing there wouldn&#39;t be any fear?</p>
<p>Excellent question.</p>
<h2 id="when-to-use-it">When to Use It</h2>
<p>Once in a while, I ask myself this question, especially when I get stuck.</p>
<p>Not every day. Not as a mantra. Just when I notice resistance. When I&#39;m avoiding something. When I&#39;m making excuses. When I know what I should do but can&#39;t seem to start.</p>
<p>That&#39;s when this question cuts through everything else.</p>
<h2 id="try-it-yourself">Try It Yourself</h2>
<p>Ask yourself this question. See where it will get you.</p>
<p>You might be surprised by what comes up. Not because the answer is revolutionary, but because you already knew it. You just needed permission to admit it.</p>
<hr>
<p><strong>PS:</strong> Here was my answer back then. If I weren&#39;t afraid, I would open a pizza food truck for surfers on Canary Island.</p>
<p><strong>What&#39;s yours?</strong></p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20What%20Would%20You%20Do%20If%20You%20Weren't%20Afraid%3F">me an email</a>.</p>
      ]]></description><pubDate>Fri, 16 Jan 2026 06:00:00 GMT</pubDate><category><![CDATA[reflection]]></category><category><![CDATA[life]]></category></item><item><title><![CDATA[I Stopped Using Stack Overflow. So Did Everyone Else.]]></title><link>https://olekwrites.com/stopped-using-stackoverflow/</link><guid>https://olekwrites.com/stopped-using-stackoverflow/</guid><description><![CDATA[<p><img src="/images/stackoverflow-decline.png" alt="Pixel art illustration of declining Stack Overflow activity with AI rising"></p>
<h1 id="i-stopped-using-stack-overflow-so-did-everyone-else">I Stopped Using Stack Overflow. So Did Everyone Else.</h1>
<p>I stopped using Stack Overflow. I recently noticed this. Before that, it was my primary point of contact. When I had a question about developing, and Google returned Stack Overflow in the results, I automatically headed there.</p>
<p>And then I stopped. I don&#39;t know when exactly. Probably when I discovered AI could answer my questions and the quality was at least good enough.</p>
<p>Was I the only one? I decided to check that.</p>
<p>Here&#39;s what I found.</p>
<h2 id="the-data-tells-a-story">The Data Tells a Story</h2>
<p>I queried the Stack Overflow API for every month from August 2008 to December 2025. That&#39;s 18 years of data, covering the entire history of Stack Overflow.</p>
<p>The numbers tell a dramatic story.</p>
<p><img src="/images/stackoverflow_18year_history.png" alt="Stack Overflow 18-Year Complete History"></p>
<p><strong>Peak (March 2014):</strong> 207,258 questions per month
<strong>December 2025:</strong> 4,470 questions per month</p>
<p>That&#39;s a 98% decline from the peak. But the decline didn&#39;t start immediately. Stack Overflow grew exponentially from 2008 until it peaked in 2016 at 2.1 million questions per year. Then it started declining.</p>
<p>Here&#39;s the complete history:</p>
<p><strong>The Growth Years (2008-2016):</strong></p>
<ul>
<li><strong>2008:</strong> 57,159 questions (4 months of operation)</li>
<li><strong>2009:</strong> 340,305 questions (+495%)</li>
<li><strong>2010:</strong> 688,587 questions (+102%)</li>
<li><strong>2011:</strong> 1,180,358 questions (+71%)</li>
<li><strong>2012:</strong> 1,613,093 questions (+37%)</li>
<li><strong>2013:</strong> 2,018,896 questions (+25%)</li>
<li><strong>2014:</strong> 2,117,461 questions (+5%)</li>
<li><strong>2015:</strong> 2,179,745 questions (+3%)</li>
<li><strong>2016:</strong> 2,187,227 questions (+0.3%) ← <strong>Peak year</strong></li>
</ul>
<p><strong>The Plateau and Early Decline (2017-2022):</strong></p>
<ul>
<li><strong>2017:</strong> 2,101,316 questions (-3.9%)</li>
<li><strong>2018:</strong> 1,878,739 questions (-10.6%)</li>
<li><strong>2019:</strong> 1,756,920 questions (-6.5%)</li>
<li><strong>2020:</strong> 1,856,838 questions (+5.7%)</li>
<li><strong>2021:</strong> 1,536,518 questions (-17.2%)</li>
<li><strong>2022:</strong> 1,340,557 questions (-12.8%)</li>
</ul>
<p><strong>The Collapse (2023-2025):</strong></p>
<ul>
<li><strong>2023:</strong> 792,293 questions (-40.9%)</li>
<li><strong>2024:</strong> 401,603 questions (-49.3%)</li>
<li><strong>2025:</strong> 130,099 questions (-67.6%)</li>
</ul>
<h2 id="when-it-changed">When It Changed</h2>
<p>Look at those year-over-year changes. Notice anything?</p>
<p><img src="/images/stackoverflow_era_analysis.png" alt="Stack Overflow Era Analysis"></p>
<p>From 2009 to 2013, Stack Overflow grew by double digits every single year. Sometimes triple digits. It was unstoppable.</p>
<p>Then growth slowed. By 2017, it started declining modestly. 2020 even saw a brief uptick (+5.7%), possibly from pandemic-driven coding activity.</p>
<p>But 2020 to 2021: -17% decline. 2021 to 2022: -13% decline. People were still asking questions, just fewer.</p>
<p>Then 2023 hits. A 40.9% drop in a single year. Followed by 49.3% in 2024. Then 67.6% in 2025.</p>
<p>What happened in late 2022 that would cause this? ChatGPT launched on November 30, 2022.</p>
<p>The timing isn&#39;t a coincidence.</p>
<p>Looking at the full 18-year history, you can see four distinct eras:</p>
<ul>
<li><strong>Growth Era (2008-2014):</strong> Average of 95,426 questions/month</li>
<li><strong>Peak Era (2015-2018):</strong> Average of 173,896 questions/month</li>
<li><strong>Decline Era (2019-2022):</strong> Average of 135,225 questions/month</li>
<li><strong>Collapse Era (2023-2025):</strong> Average of 36,777 questions/month</li>
</ul>
<p>The most dramatic shift happened between the Decline and Collapse eras. Right when AI assistants became widely available.</p>
<h2 id="what-this-actually-means">What This Actually Means</h2>
<p>Stack Overflow didn&#39;t become worse. The questions didn&#39;t disappear because developers stopped coding. They disappeared because developers stopped needing to ask them publicly.</p>
<p>When I hit a coding problem now, I don&#39;t:</p>
<ol>
<li>Search Google</li>
<li>Click through to Stack Overflow</li>
<li>Read five different answers</li>
<li>Try them all until one works</li>
</ol>
<p>I just ask Claude or ChatGPT. I get an answer immediately. It&#39;s specific to my exact problem. It explains why it works. And I can ask follow-up questions.</p>
<p>Why would I go back to Stack Overflow?</p>
<h2 id="the-methodology-question">The Methodology Question</h2>
<p>Before you ask: yes, I validated this data. I analyzed 24.1 million questions across 216 months (August 2008 - December 2025). I checked the API responses, tested multiple endpoints, and documented every limitation of this approach.</p>
<p>The Stack Overflow API&#39;s <code>total</code> field might not be perfectly accurate. It could be off by thousands. But it can&#39;t be off by millions. The trend is real.</p>
<p>If you want the full methodology breakdown with all the caveats about deleted questions, timezone handling, API limitations, and validation queries you can run yourself, <a href="/assets/blog/stackoverflow_methodology.md">I documented everything here</a>.</p>
<hr>
<p><strong>What about you?</strong> When&#39;s the last time you asked a question on Stack Overflow? And if you stopped—did you notice when?</p>
<hr>
<h2 id="data--methodology">Data &amp; Methodology</h2>
<p>This analysis is based on 24,177,714 questions collected via the Stack Exchange API v2.3, covering 216 months from August 2008 through December 2025.</p>
<p><strong>Key Findings:</strong></p>
<ul>
<li>Peak month: March 2014 (207,258 questions)</li>
<li>Peak year: 2016 (2,187,227 questions)</li>
<li>Decline from peak to December 2025: 98%</li>
<li>Most dramatic drop: 2023 (-40.9% year-over-year)</li>
</ul>
<p>For complete methodology, data validation queries, limitations, and reproducibility details, see the <a href="/assets/blog/stackoverflow_methodology.md">full methodology document</a>.</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20I%20Stopped%20Using%20Stack%20Overflow.%20So%20Did%20Everyone%20Else.">me an email</a>.</p>
      ]]></description><pubDate>Tue, 13 Jan 2026 06:00:00 GMT</pubDate><category><![CDATA[technology]]></category><category><![CDATA[reflection]]></category></item><item><title><![CDATA[Don't Make Me Think About Your Email]]></title><link>https://olekwrites.com/dont-make-me-think-email/</link><guid>https://olekwrites.com/dont-make-me-think-email/</guid><description><![CDATA[<p><img src="/images/email-marketing-checklist.png" alt="Pixel art illustration of email marketing principles with checkboxes and simplicity symbols"></p>
<h1 id="dont-make-me-think-about-your-email">Don&#39;t Make Me Think About Your Email</h1>
<p>Here&#39;s the message I got in my Imbox this morning. (I use &quot;Imbox&quot; since I use Hey as my email provider—<a href="https://hey.com">more on that here</a>).</p>
<p>What does it say? To be honest, nothing actionable or informative to me.</p>
<h2 id="heres-what-happened">Here&#39;s What Happened</h2>
<ol>
<li>There&#39;s a fitness club chain called Zdrofit</li>
<li>I visited one of their locations a couple of times</li>
<li>I received this email:</li>
</ol>
<blockquote>
<p><strong>Hey!</strong>
With the start of the new year, we&#39;re sharing good news—starting January 7, we&#39;ve extended opening hours at selected Zdrofit clubs! 🏋️‍♀️</p>
<p><strong>New hours:</strong>
📅 Mon. – Fri.: 6:00 – 23:00
📅 Sat. – Sun.: 7:00 – 22:00</p>
<p>Not sure if this change applies to your club? Check the website or ask on-site. 📍</p>
</blockquote>
<p>Well. It&#39;s not useful to me.</p>
<h2 id="what-theyre-really-saying">What They&#39;re Really Saying</h2>
<p>&quot;We&#39;re too lazy to check if this information is useful to you, so we&#39;re sending it anyway. You figure out if it&#39;s relevant. By the way, we don&#39;t care if you actually wanted this email or not.&quot;</p>
<p>That&#39;s not how you build trust. That&#39;s how you train people to ignore you.</p>
<h2 id="the-three-item-checklist-they-ignored">The Three-Item Checklist They Ignored</h2>
<p>Before you send any marketing email, check these three boxes:</p>
<h3 id="1-ask-for-permission">1. Ask for Permission</h3>
<p>First of all, I didn&#39;t give permission. I visited this gym occasionally, maybe three times total. When they set up an account for me, they didn&#39;t ask if they could stay in touch. All I wanted was to pay for a day pass and use their equipment.</p>
<p>Now they think they have the right to send me &quot;informative&quot; emails.</p>
<p>They don&#39;t.</p>
<p><strong>No permission = No email.</strong></p>
<h3 id="2-add-value">2. Add Value</h3>
<p>The email says: &quot;We have gyms in our chain. Some of them may or may not have changed their operating hours.&quot;</p>
<p>What&#39;s in it for me? Nothing. Absolutely nothing.</p>
<p>To make this useful, I&#39;d have to:</p>
<ul>
<li>Visit their website</li>
<li>Navigate to the club locator</li>
<li>Find the specific location I went to</li>
<li>Check if anything changed</li>
</ul>
<p>That&#39;s four steps. Four steps to discover information they already know and could have just told me.</p>
<p><strong>No value = No email.</strong></p>
<h3 id="3-dont-make-me-think">3. Don&#39;t Make Me Think</h3>
<p>This is the core problem. They sent information that requires me to investigate whether it&#39;s relevant.</p>
<p>That&#39;s backwards.</p>
<p>If you have my data—and you do, because I used your service—you should use it to make my life easier, not harder.</p>
<p><strong>No simplicity = No email.</strong></p>
<h2 id="my-response">My Response</h2>
<p>I opted out. Thanks to Hey&#39;s interface, it took one keyboard shortcut. Two clicks maximum.</p>
<p>Gone.</p>
<h2 id="how-it-could-have-been-done">How It Could Have Been Done</h2>
<p>If this email had followed the three rules, here&#39;s what it might have looked like:</p>
<blockquote>
<p><strong>Subject:</strong> Extended hours at Zdrofit [specific location name]</p>
<p>Hey [Name],</p>
<p>You&#39;ve visited our [specific club location] in the past, and we wanted to let you know we&#39;ve extended our hours starting January 7:</p>
<p><strong>New hours:</strong>
Mon. – Fri.: 6:00 – 23:00
Sat. – Sun.: 7:00 – 22:00
<em>(Previously: Mon-Fri 7:00-22:00, Sat-Sun 8:00-21:00)</em></p>
<p>This means more flexibility for early morning or late evening workouts.</p>
<p>If you&#39;d prefer not to receive updates like this, [click here to unsubscribe].</p>
<p>See you at the gym,
[Actual person&#39;s name]</p>
</blockquote>
<p>Notice what changed:</p>
<ul>
<li><strong>Specific club location</strong> (I know this applies to me)</li>
<li><strong>Before/after comparison</strong> (I understand what changed)</li>
<li><strong>Why it matters</strong> (I know how it benefits me)</li>
<li><strong>Easy opt-out</strong> (I control the relationship)</li>
<li><strong>Personal sign-off</strong> (There&#39;s a human behind this)</li>
</ul>
<p>That&#39;s an email worth reading.</p>
<h2 id="if-youre-responsible-for-email-marketing">If You&#39;re Responsible for Email Marketing</h2>
<p>Here&#39;s your checklist. Print it. Tape it to your desk. Use it before you hit send.</p>
<h3 id="before-you-send-any-email">Before You Send ANY Email:</h3>
<p><strong>1. Permission Check</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Did this person explicitly opt in to receive this type of message?</li>
<li><input disabled="" type="checkbox"> Can they easily opt out?</li>
<li><input disabled="" type="checkbox"> Would I be surprised to receive this if I were them?</li>
</ul>
<p><strong>2. Value Check</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Does this email solve a problem or provide useful information?</li>
<li><input disabled="" type="checkbox"> Is the information specific and actionable?</li>
<li><input disabled="" type="checkbox"> Would I personally find this worth reading?</li>
</ul>
<p><strong>3. Simplicity Check</strong></p>
<ul>
<li><input disabled="" type="checkbox"> Is everything they need to know in this email?</li>
<li><input disabled="" type="checkbox"> Does this require them to do extra work to understand?</li>
<li><input disabled="" type="checkbox"> Could this be clearer or more direct?</li>
</ul>
<p>If you can&#39;t check all three boxes, <strong>don&#39;t send the email.</strong></p>
<h2 id="the-books-that-explain-why-this-matters">The Books That Explain Why This Matters</h2>
<p>If you work in marketing and haven&#39;t read these, start here:</p>
<ul>
<li><strong>&quot;Don&#39;t Make Me Think&quot;</strong> by Steve Krug - About reducing cognitive load (applies to everything, not just websites)</li>
<li><strong>&quot;Permission Marketing&quot;</strong> by Seth Godin - About earning the right to communicate</li>
</ul>
<p>Both books teach the same fundamental idea: <strong>respect people&#39;s time and attention.</strong></p>
<p>When you fail to do that, they&#39;ll do exactly what I did.</p>
<p>They&#39;ll unsubscribe.</p>
<hr>
<p><strong>Have you received emails like this?</strong> What&#39;s your threshold for hitting &quot;unsubscribe&quot;?</p>

      <hr />
      <p>Thanks for reading this post via RSS! Let me know your thoughts by sending <a href="mailto:hi@olekwrites.com?subject=re%3A%20Don't%20Make%20Me%20Think%20About%20Your%20Email">me an email</a>.</p>
      ]]></description><pubDate>Fri, 09 Jan 2026 06:00:00 GMT</pubDate><category><![CDATA[reflection]]></category><category><![CDATA[writing]]></category></item></channel></rss>