<?xml version="1.0" encoding="UTF-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><id>https://sebastiandedeyne.com/articles.xml</id><link href="https://information-overload.net/articles.xml" rel="self"/><title>Information Overload: Articles</title><subtitle>Thoughts &amp; references from an engineering manager in Belgium</subtitle><updated>2026-08-10T09:00:07+02:00</updated><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><entry><title>Amped up</title><link rel="alternate" href="https://information-overload.net/amped-up"/><id>https://sebastiandedeyne.com/amped-up</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-08-10T09:00:07+02:00</updated><content type="html"><![CDATA[<p>I&rsquo;ve switched to Amp full time for all of my build things needs. I used to swing between Claude Code, Codex, and Amp. Amp was always my favorite, but the usage pricing was too restricting to have it as my default.</p>
<p>I didn’t want to commit to one model/provider to get an understanding what their strengths and weaknesses are. Sure, there were some differences. I preferred Codex over Claude for UI tasks, and Claude over Codex for heavy thinking. But with the latest iterations of Opus &amp; GPT? The differences are fading away.</p>
<p>Quoting <a href="https://x.com/adamwathan/status/2085154641575100492">Adam Wathan</a>: <em>&ldquo;Feels like we&rsquo;re about 6 months away from a token is a token is a token. Just gas at the gas station.&rdquo;</em> Amp <a href="https://ampcode.com/news/who-cares-about-the-model">switched their default model from Opus to Sol overnight</a> without saying anything. No one complained. I’m at a point where I don’t care about which model I&rsquo;m using. I <em>do</em> care about the user experience, and Amp is way ahead the competition there.</p>
<p>I love Amp for it&rsquo;s clarity (both in output language and UI) and that it just works. I don&rsquo;t feel like I need to spend time configuring it too much to use it. Amp also got me into running agents in the cloud, because their Orbs setup make it seamless.</p>
<p>As of last month, you can use your <a href="https://ampcode.com/news/subscriptions">ChatGPT</a> subscription in Amp. This gets rid of most usage costs (you only pay when Amp decides to use a non-OpenAI model, which is rare).</p>
<p>My biggest gripe with Amp (although I’ve heard about this problem with LLMs in general) is the <em>obsession</em> with verification. When you&rsquo;re throwing a task at your agent this is a good thing. But when you&rsquo;re having a back-and-forth coding session it can be a nuisance. Do I have to wait on an end-to-end test suit and compiler check because I asked to change the emoji in the footer? I prefer fast feedback from the agent since 90% of the time the verification turns out to be all clear. And if it isn’t, CI stands ready as the last line of defense.</p>
<p>This seems to have improved since I&rsquo;ve set up my Amp-specific <code>AGENTS.md</code>:</p>
<blockquote>
<ul>
<li>Only run tests, typechecks, verifications, etc. when working on big chunks of work, not small tasks like updating display values.</li>
<li>Don&rsquo;t add unit tests for local presentational changes, like renaming a label in a specific form, or reordering table columns.</li>
</ul>
</blockquote>
<p>Amp is the first harnass to give me a coding experience in the new age that makes me <em>want</em> to be there. My next step? Drop the decade-old habit of defaulting to local developmen. Orbs, orbs, orbs.</p>
]]></content></entry><entry><title>Don't skip `else` with octane</title><link rel="alternate" href="https://information-overload.net/dont-skip-else-with-octane"/><id>https://sebastiandedeyne.com/dont-skip-else-with-octane</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-06-22T08:34:24+02:00</updated><content type="html"><![CDATA[<p>I came across a subtle Octane but last week. We needed to disable Inertia&rsquo;s history encryption in some places in the app. By default, it&rsquo;s enabled everywhere. So we added a route check to the middleware to turn it off.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#cf222e">class</span> <span style="color:#1f2328">HandleInertiaRequests</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#cf222e">public</span> <span style="color:#cf222e">function</span> <span style="color:#6639ba">handle</span><span style="color:#1f2328">(</span><span style="color:#1f2328">Request</span> <span style="color:#953800">$request</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">Closure</span> <span style="color:#953800">$next</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#cf222e">if</span> <span style="color:#1f2328">(</span><span style="color:#953800">$request</span><span style="color:#0550ae">-&gt;</span><span style="color:#1f2328">is</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;admin/*&#39;</span><span style="color:#1f2328">))</span> <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#1f2328">Inertia</span><span style="color:#0550ae">::</span><span style="color:#1f2328">encryptHistory</span><span style="color:#1f2328">(</span><span style="color:#cf222e">false</span><span style="color:#1f2328">);</span>
</span></span><span style="display:flex;"><span>        <span style="color:#1f2328">}</span>
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        <span style="color:#57606a">// …
</span></span></span><span style="display:flex;"><span>    <span style="color:#1f2328">}</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">}</span>
</span></span></code></pre></div><p>The problem is, if you&rsquo;re running Octane and make a request to an <code>admin/*</code> route, history encryption will be disabled, and there&rsquo;s nothing to re-enable it for the next request.</p>
<p>The fix is to make sure both sides of the statement are executed.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#cf222e">class</span> <span style="color:#1f2328">HandleInertiaRequests</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#cf222e">public</span> <span style="color:#cf222e">function</span> <span style="color:#6639ba">handle</span><span style="color:#1f2328">(</span><span style="color:#1f2328">Request</span> <span style="color:#953800">$request</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">Closure</span> <span style="color:#953800">$next</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#cf222e">if</span> <span style="color:#1f2328">(</span><span style="color:#953800">$request</span><span style="color:#0550ae">-&gt;</span><span style="color:#1f2328">is</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;admin/*&#39;</span><span style="color:#1f2328">))</span> <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#1f2328">Inertia</span><span style="color:#0550ae">::</span><span style="color:#1f2328">encryptHistory</span><span style="color:#1f2328">(</span><span style="color:#cf222e">false</span><span style="color:#1f2328">);</span>
</span></span><span style="display:flex;"><span>        <span style="color:#1f2328">}</span> <span style="color:#cf222e">else</span> <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>            <span style="color:#1f2328">Inertia</span><span style="color:#0550ae">::</span><span style="color:#1f2328">encryptHistory</span><span style="color:#1f2328">(</span><span style="color:#cf222e">true</span><span style="color:#1f2328">);</span>
</span></span><span style="display:flex;"><span>        <span style="color:#1f2328">}</span>
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>        <span style="color:#57606a">// …
</span></span></span><span style="display:flex;"><span>    <span style="color:#1f2328">}</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">}</span>
</span></span></code></pre></div><p>Or more succinct:</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#cf222e">class</span> <span style="color:#1f2328">HandleInertiaRequests</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>    <span style="color:#cf222e">public</span> <span style="color:#cf222e">function</span> <span style="color:#6639ba">handle</span><span style="color:#1f2328">(</span><span style="color:#1f2328">Request</span> <span style="color:#953800">$request</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">Closure</span> <span style="color:#953800">$next</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#1f2328">{</span>
</span></span><span style="display:flex;"><span>        <span style="color:#1f2328">Inertia</span><span style="color:#0550ae">::</span><span style="color:#1f2328">encryptHistory</span><span style="color:#1f2328">(</span><span style="color:#0550ae">!</span> <span style="color:#953800">$request</span><span style="color:#0550ae">-&gt;</span><span style="color:#1f2328">is</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;admin/*&#39;</span><span style="color:#1f2328">));</span>
</span></span><span style="display:flex;"><span> 
</span></span><span style="display:flex;"><span>        <span style="color:#57606a">// …
</span></span></span><span style="display:flex;"><span>    <span style="color:#1f2328">}</span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">}</span>
</span></span></code></pre></div>]]></content></entry><entry><title>Time for lower level languages?</title><link rel="alternate" href="https://information-overload.net/time-for-lower-level-languages"/><id>https://sebastiandedeyne.com/time-for-lower-level-languages</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-06-10T08:45:09+02:00</updated><content type="html"><![CDATA[<p>I&rsquo;ve always been intrigued by Go. It&rsquo;s powerful, fast (I really like fast), and simple. The tradeoff? It&rsquo;s simple. Coming from higher level languages like PHP &amp; JavaScript, Go can feel <em>crude</em>.</p>
<p>As I&rsquo;ve recently written, this blog went <a href="https://sebastiandedeyne.com/back-to-hugo/">back to Hugo</a>. Hugo is also fast and crude. But with LLMs, the crudeness of things doesn&rsquo;t hurt as much as before. I don&rsquo;t need to deal with writing it anymore, and crude is still readable.</p>
<p>From <a href="https://blainsmith.com/articles/just-fucking-use-go/">Just Fucking Use Go</a>:</p>
<blockquote>
<p>The boring choice is the right choice. It always was.</p>
</blockquote>
<p>I agree. More than ever, I have an urge to dabble into lower level languages. AI is a huge layer of complexity we&rsquo;re adding to our tooling. Let&rsquo;s use it to trim the fat from our outputs.</p>
]]></content></entry><entry><title>Introducing Piper: a pipe operator-first PHP utility library</title><link rel="alternate" href="https://information-overload.net/introducing-piper"/><id>https://sebastiandedeyne.com/introducing-piper</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-05-11T18:10:45+02:00</updated><content type="html"><![CDATA[<p>When I experimented with <a href="https://elixir-lang.org/">Elixir</a> a few years ago, I fell in love with the pipe operator <code>|&gt;</code>. Since then, I&rsquo;ve always dreamt of a similar tool in PHP.</p>
<p>Last year, we finally got it! Unfortunately, the standard array &amp; string manipulation functions in PHP aren&rsquo;t exactly known for their API consistency, which makes the pipe operator awkward to use.</p>
<p>I ported Laravel&rsquo;s excellent collection &amp; string helpers to a pipe operator-optimized API. <a href="https://github.com/spatie/piper">Piper</a> is an attempt to wrap the standard library to make it compatible with the pipe operator.</p>
<div class="highlight"><pre tabindex="0" style="background-color:#f7f7f7;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-php" data-lang="php"><span style="display:flex;"><span><span style="color:#cf222e">use</span> <span style="color:#cf222e">function</span> <span style="color:#6639ba">Spatie\Piper\Arr\</span><span style="color:#1f2328">{</span><span style="color:#1f2328">filter</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">join</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">map</span><span style="color:#1f2328">};</span>
</span></span><span style="display:flex;"><span><span style="color:#cf222e">use</span> <span style="color:#cf222e">function</span> <span style="color:#6639ba">Spatie\Piper\Str\</span><span style="color:#1f2328">{</span><span style="color:#1f2328">prefix</span><span style="color:#1f2328">,</span> <span style="color:#1f2328">suffix</span><span style="color:#1f2328">};</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#1f2328">[</span><span style="color:#0550ae">1</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">2</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">3</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">4</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">5</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">6</span><span style="color:#1f2328">]</span>
</span></span><span style="display:flex;"><span>    <span style="color:#0550ae">|&gt;</span> <span style="color:#1f2328">filter</span><span style="color:#1f2328">(</span><span style="color:#1f2328">fn</span> <span style="color:#1f2328">(</span><span style="color:#1f2328">int</span> <span style="color:#953800">$i</span><span style="color:#1f2328">)</span> <span style="color:#0550ae">=&gt;</span> <span style="color:#953800">$i</span> <span style="color:#0550ae">%</span> <span style="color:#0550ae">2</span> <span style="color:#0550ae">===</span> <span style="color:#0550ae">0</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#0550ae">|&gt;</span> <span style="color:#1f2328">map</span><span style="color:#1f2328">(</span><span style="color:#1f2328">fn</span> <span style="color:#1f2328">(</span><span style="color:#1f2328">int</span> <span style="color:#953800">$i</span><span style="color:#1f2328">)</span> <span style="color:#0550ae">=&gt;</span> <span style="color:#1f2328">pow</span><span style="color:#1f2328">(</span><span style="color:#953800">$i</span><span style="color:#1f2328">,</span> <span style="color:#0550ae">2</span><span style="color:#1f2328">))</span>
</span></span><span style="display:flex;"><span>    <span style="color:#0550ae">|&gt;</span> <span style="color:#1f2328">join</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;, &#39;</span><span style="color:#1f2328">,</span> <span style="color:#0a3069">&#39;, and &#39;</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#0550ae">|&gt;</span> <span style="color:#1f2328">prefix</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;The winning numbers are &#39;</span><span style="color:#1f2328">)</span>
</span></span><span style="display:flex;"><span>    <span style="color:#0550ae">|&gt;</span> <span style="color:#1f2328">suffix</span><span style="color:#1f2328">(</span><span style="color:#0a3069">&#39;.&#39;</span><span style="color:#1f2328">);</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#57606a">// &#34;The winning numbers are 4, 16, and 36.&#34;
</span></span></span></code></pre></div><p>I wrote a technical introduction to the package <a href="https://spatie.be/blog/introducing-piper">on the Spatie blog</a>. Documentation can be referenced <a href="https://spatie.be/docs/piper/v1/introduction">here</a>, and the repository is hosted on <a href="https://github.com/spatie/piper">GitHub</a>.</p>
<h2 id="the-sad-part-maybe">
  <a href="#the-sad-part-maybe" class="heading-permalink" aria-label="Permalink to The sad part (maybe?)"></a>
  The sad part (maybe?)
</h2>
<p>I&rsquo;ve <em>never</em> seen a coding agent return code using a pipe operator unless I&rsquo;ve explicitly asked it to. That makes sense: the models we use are trained on years of historical data, and the pipe operator is a fairly new feature.</p>
<p>I might never use this library. I might never use the pipe operator at all. Agentic coding is pushing syntax to a standstill. New programming APIs that bring benefits to execution will be pushed forward. But the whole fight for making code <em>look</em> good seems to have been extinguished as AI is slowly moving us to focus on outcomes more than line-by-line code cleanliness. That&rsquo;s not necessarily a bad thing, but part of our craft might get lost along the way.</p>
<p>Ironically, I convinced myself to actually write this <em>because</em> I have AI at my disposal. Manually porting 234 functions and a full test suite is <em>not</em> something I was looking forward to. Instead, the time spent building and refining this package is measurable in hours.</p>
<p>Either way, this is a fun experiment to conduct. And I look forward to tinkering further and giving it a shot in some real projects.</p>]]></content></entry><entry><title>Back to hugo</title><link rel="alternate" href="https://information-overload.net/back-to-hugo"/><id>https://sebastiandedeyne.com/back-to-hugo</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-05-06T08:01:18+02:00</updated><content type="html"><![CDATA[<p>This blog has gone through a few technical iterations. Most recently: from a Laravel app with <a href="https://github.com/spatie/sheets">Sheets</a>, to a static site with <a href="https://gohugo.io/">Hugo</a>, to a CMS-driven site with <a href="https://statamic.com/">Statamic</a>. And now, back to Hugo!</p>
<p>I love Hugo. It&rsquo;s purposefully built with the right abstractions, and <em>incredibly fast</em>. The kind of fast that makes you wonder why other software can be that fast. <a href="https://craigmod.com/essays/fast_software/">Fast software, the best software</a>. But the templating language… it might be an acquired taste, but I never acquired it. Updating my theme or adding a custom page was always a chore. I got tired of it. Coincidentally, I wanted to experiment with more dynamic workflows on here (posting to social media, more control over scheduling…) so I migrated to Statamic (a lovely CMS!)</p>
<p>Fast forward three years and a blogging hiatus, and I started to crave the simplicity of the good old static site. Having a dynamic system was fun, but it requires maintenance and having it made me realize I didn&rsquo;t need it. Add to that we&rsquo;ve commoditized robots building things for us, and switching back to Hugo was the right move. A single prompt and 15 minutes later, my entire blog was translated from Statamic to Hugo. The best part: I don&rsquo;t need to care about the templates anymore. Sure, I&rsquo;ll dive in occasionally for some surgical styling tweaks. But generally, changes are handled with a quick prompt.</p>
<p>GitHub pings my webserver to auto-deploy on push. Scheduling is solved by running the deploy script every hour. As a static site, everything&rsquo;s fast by default and there are almost no points of failure. Life is simple. All that remains is to write!</p>
]]></content></entry><entry><title>Ramble on</title><link rel="alternate" href="https://information-overload.net/ramble-on"/><id>https://sebastiandedeyne.com/ramble-on</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-05-05T13:25:23+02:00</updated><content type="html"><![CDATA[<p>I have a blank canvas problem. I&rsquo;m way better at staying in flow when I have something to work through, so these days, the first thing I do is ramble.</p>
<p>I open Codex or <a href="https://writewithspiral.com/">Spiral</a>, turn on <a href="https://www.monologue.to/">Monologue</a> (my preferred text-to-speech tool), and dump everything I can think of on the topic. Before Monologue, I never considered typing speed to be a bottleneck. My fingers move faster than the speed I shape ideas. But when I want to vomit a bunch of unstructured thoughts onto a canvas, they suddenly feel slow and error-prone.</p>
<p>Instead, I can start a task by talking through it to generate a transcript. Then I ask an agent to structure my ramblings (the other day, the agent responded with <em>&ldquo;Your brain dump is rich.&quot;</em>—probably the nicest compliment I&rsquo;ve ever gotten from a robot!). This gives me a great starting point to really dig into the problem. Before I know it, I will have rewritten all that rambling into coherent a string of thought.</p>
<p>I still can&rsquo;t shake the dystopian feeling of talking to my computer. But text-to-speech has made some tasks feel so natural, I almost can&rsquo;t imagine working without it anymore.</p>
]]></content></entry><entry><title>Leave the campsite better than you found it, and it will start cleaning itself up</title><link rel="alternate" href="https://information-overload.net/leave-the-campsite-better-than-you-found-it-and-it-will-start-cleaning-itself-up"/><id>https://sebastiandedeyne.com/leave-the-campsite-better-than-you-found-it-and-it-will-start-cleaning-itself-up</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-04-29T23:07:31+02:00</updated><content type="html"><![CDATA[<p>This thought came across my mind as I was reading Every&rsquo;s philosophy on <a href="https://every.to/guides/compound-engineering">compound engineering</a>:</p>
<blockquote>
<p>The first three steps (plan, work, review) produce a feature. The fourth step produces a system that builds features better each time. […]</p>
<ul>
<li><strong>Capture the solution.</strong> Ask yourself: What worked? What didn&rsquo;t? What&rsquo;s the reusable insight?</li>
<li><strong>Make it findable.</strong> Add YAML frontmatter to make sure it is tagged with the right metadata, tags, and categories for retrieval.</li>
<li><strong>Update the system.</strong> Add new patterns into CLAUDE.md, the file the agent reads at the start of every session. Create new agents when warranted.</li>
<li><strong>Verify the learning.</strong> Ask yourself: Would the system catch this automatically next time?</li>
</ul>
</blockquote>
<p>As virtuous developers we try to adhere to the boyscout rule: leave the campsite better than you found it. We do this so our codebase doesn&rsquo;t start rotting because we slowly let the trash take over.</p>
<p>When agents are writing our code, these effects are multiplied. Every time we make an explicit improvement to the system, agents can pick the pattern up and apply it to both old and new. The campsite will slowly but surely start cleaning <em>itself</em> up, and fresh trash will be thrown straight into the bin.</p>
]]></content></entry><entry><title>How I write feature specs</title><link rel="alternate" href="https://information-overload.net/how-i-write-feature-specs"/><id>https://sebastiandedeyne.com/how-i-write-feature-specs</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2026-04-10T11:31:29+02:00</updated><content type="html"><![CDATA[<p>I&rsquo;m not good at blank canvases. Unfortunately that&rsquo;s where feature specs always start. When I have a bunch of notes, transcripts, screenshots, and ideas to consolidate on an empty piece of paper, it can be hard to get going and stay in flow.</p>
<p>I write specs in three steps:</p>
<ol>
<li>Collect all input</li>
<li>Consolidate a cohesive list of requirements</li>
<li>Review &amp; edit</li>
</ol>
<p>Lately, I&rsquo;ve added a few tools to my workflow to guide me through the process.</p>
<h2 id="collecting-input">
  <a href="#collecting-input" class="heading-permalink" aria-label="Permalink to Collecting input"></a>
  Collecting input
</h2>
<p>First, I gather every piece of input I can find: my own notes, Slack threads, Linear tickets… One of my most useful resources is <a href="https://granola.ai">Granola</a>, which transcribes and summarizes every meeting I have. I organize projects into folders there, and before writing a spec, I&rsquo;ll ask Granola to pull together everything it knows about the topic.</p>
<p class="text-sm italic text-gray-500">(All snippets in this post are based on the output I had writing a spec yesterday. I can't share it since it's client work, but I've reworked the examples to revolve around an invoice builder feature.)</p>
<pre tabindex="0"><code class="language-output-wrap" data-lang="output-wrap">Give me a detailed list of specifications of everything you know of the invoice builder.
</code></pre><p>I also use <a href="https://monologueapp.com">Monologue</a>, a voice-to-text tool for Mac and iOS, to add extra ramblings.</p>
<h2 id="consolidating-everything-with-a-thinking-model">
  <a href="#consolidating-everything-with-a-thinking-model" class="heading-permalink" aria-label="Permalink to Consolidating everything with a thinking model"></a>
  Consolidating everything with a thinking model
</h2>
<p>Once I have everything in one place, I open my coding agent and attach everything. <em>(Currently defaulting to Codex GPT 5.4 High for these kinds of tasks.)</em></p>
<p>A few things I&rsquo;ve learned to always include in the prompt:</p>
<ul>
<li><strong>Be explicit about who the spec is for.</strong> A spec for a designer should focus on UI patterns and how the feature fits existing conventions in the app. A spec for a developer should go deeper on the data model, potential abstractions, and how this interacts with existing parts of the system.</li>
<li><strong>Ask to compare notes and surface discrepancies.</strong> Notes accumulated over months are full of contradictions. One meeting says to build it one way; another says something different. I ask the model to flag these and <a href="https://information-overload.net/grill-me">grill me</a> on them until the ambiguity is resolved.</li>
<li><strong>Ask to explicitly list what is in &amp; out of scope.</strong> As I read notes I often skim over things that are implicitly out of scope for the project. But what <em>I</em> consider out of scope, someone else might have assumed was part of the project. AI is good at being critical about these small details.</li>
<li><strong>Reference the codebase.</strong> Look at what already exists for patterns we could reuse, and identify potential pitfalls based on existing functionality.</li>
</ul>
<p>Some of these checks might seem obvious, but the more explicit you are towards the agent about your own process, the better your results.</p>
<p>If all goes well, you&rsquo;ll be slammed with a few rounds of questions by the agent to refine the requirements and generate a final specification document.</p>
<p>This was my prompt yesterday:</p>
<pre tabindex="0"><code class="language-output-wrap" data-lang="output-wrap">I want to write a specification document for our designer to determine the UI and UX of the invoice builder. I want you to read all three documents I gave you. Grill me about anything that is unclear about the features or things across the document or even in the same document that contradicts each other. Grill me about anything that seems related to invoicing that is listed in documents but might not be part of this feature so we can decide to leave them out of the specs for now. Let&#39;s build a specification document together. Also look through the existing codebase and interface to understand the way products are set up and research potential pitfalls we could have implementing this in the existing system.
</code></pre><p class="mt-0 text-sm italic text-gray-500">(text-to-speech, who needs newlines?)</p>
<p>Here&rsquo;s a snippet of the output:</p>
<pre tabindex="0"><code class="language-output" data-lang="output"># Invoice Builder UI/UX Spec

## Purpose

Define the UI and UX for configuring and reviewing invoice templates, line items, and tax calculations within the invoice builder.

This document covers three surfaces:

- Organization-level setup
- Invoice-level review and override
- Discrepancy review and bulk reapply

This document is intended for product, design, and engineering alignment. It describes the behavior the interface must support, not the technical implementation details.

## Scope

### In scope

- Organization-level setup of tax rules, line item defaults, and payment terms
- Invoice-level display of the itemized breakdown associated with an order
- Invoice-level snapshotting from the organization template
- Invoice-level manual editing after snapshotting
- Visibility rules for clients, bookkeepers, and admins
- Discrepancy review UI for tax rate and line item drift
- Batch reapply flow from the current organization template to selected invoices

### Out of scope

- Payment processing or reconciliation
- Refunds
- Revenue recognition timing or accrual logic
- Report-generation workflows beyond discrepancy review
- Currency-specific tax logic
- Arbitrary reusable custom pricing objects
- Auditing payment term discrepancies

## Core Concepts

### Tax Calculation

Tax calculation is the applicable tax percentage for an organization in a given region or jurisdiction scope.

- Tax calculation belongs on the organization as a template
- Tax calculation is copied to the invoice when the invoice is created
- After the invoice is created, the invoice tax calculation is managed independently
- Clients should always be able to see their own tax breakdown
- Seeing the tax details of others requires a specific permission, which in practice is reserved for bookkeepers and admins
…
</code></pre><p>The content looks good on first sight but I don&rsquo;t like the way it&rsquo;s structured &amp; formatted. Time to edit.</p>
<h2 id="reviewing--editing">
  <a href="#reviewing--editing" class="heading-permalink" aria-label="Permalink to Reviewing &amp; editing"></a>
  Reviewing &amp; editing
</h2>
<p>At this point, I take a break from the AI tooling and re-read and edit everything in <a href="https://ia.net/writer">iA Writer</a>. Most importantly, I ensure everything is correct &amp; complete. Then I ensure the document is generally structured the way I want it to flow, cut noise &amp; repetition, and ensure everything&rsquo;s as clear as can be.</p>
<p>Then I throw it in <a href="https://app.writewithspiral.com/">Spiral</a> for another edit. I like how Spiral lets you edit with AI without AI taking over your writing. Spiral allows you to define &ldquo;styles&rdquo;. I created a style based on previous specs I&rsquo;ve written in the past so the specs can be re-edited into something closer to my voice.</p>
<p>Depending on who or what I&rsquo;m writing the specs for, I sometimes prefer a &ldquo;document style&rdquo;, and sometimes a &ldquo;single indented list&rdquo; style. In Spiral, I have some predefined prompts to toggle between the two formats.</p>
<pre tabindex="0"><code class="language-output" data-lang="output">- In scope
    - Organization-level setup of tax rules, line item defaults, and payment terms
    - Invoice-level display of the itemized breakdown associated with an order
    - Invoice-level snapshotting from the organization template
    - Invoice-level manual editing after snapshotting
    - Visibility rules for clients, bookkeepers, and admins
    - Discrepancy review UI for tax rate and line item drift
    - Batch reapply flow from the current organization template to selected invoices
- Out of scope
    - Payment processing or reconciliation
    - Refunds
    - Revenue recognition timing or accrual logic
    - Report-generation workflows beyond discrepancy review
    - Currency-specific tax logic
    - Arbitrary reusable custom pricing objects
    - Auditing payment term discrepancies
- Core concepts
    - Tax Calculation
        - Applicable tax percentage for an organization in a given region or jurisdiction scope
        - Belongs on the organization as a template; copied to the invoice at creation
        - After creation, managed independently from the organization record
        - Clients can always see their own tax breakdown
        - Seeing another client&#39;s tax details requires a specific permission
…
</code></pre><p>When I&rsquo;m done editing, I do one final review in iA Writer and it&rsquo;s good to go.</p>
<h2 id="has-ai-made-my-output-better">
  <a href="#has-ai-made-my-output-better" class="heading-permalink" aria-label="Permalink to Has AI made my output better?"></a>
  Has AI made my output <em>better</em>?
</h2>
<p>Three or four months ago, without a model to consolidate &amp; guide me with questions, writing this spec probably would have taken 3–4 hours. It took me about an hour and a half yesterday.</p>
<p>But the quality of my output hasn&rsquo;t really changed much. AI models are good at surfacing small details that might otherwise be overlooked, but at that level of detail it makes things <em>slightly</em> better, not orders of magnitude.</p>
<p>What&rsquo;s changed is that I&rsquo;m never staring at a blank document. The tools give me structure to work reactively and keep working in flow.</p>]]></content></entry><entry><title>Optimize for optionality and build towards checkpoints</title><link rel="alternate" href="https://information-overload.net/optimize-for-optionality-and-build-towards-checkpoints"/><id>https://sebastiandedeyne.com/optimize-for-optionality-and-build-towards-checkpoints</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2024-09-11T21:48:00+02:00</updated><content type="html"><![CDATA[<p>In a project management-themed <a href="https://hackersincorporated.com/episodes/how-to-not-suck-at-project-management">Hackers Incorporated episode</a>, Adam Wathan introduced <em>derisking projects with save points</em>. The entire episode is definitely worth your time, but that specific piece of advice has changed the way I work as a developer and make decisions as a project manager.</p>
<p>In practice, it has taught me to optimize for optionality, not efficiency.</p>
<h2 id="the-monolithic-branch">
  <a href="#the-monolithic-branch" class="heading-permalink" aria-label="Permalink to The monolithic branch"></a>
  The monolithic branch
</h2>
<p>To illustrate what it means, we&rsquo;ll build a user account section as an example. The new account section will be shipped to users as one big launch. A user can…</p>
<ul>
<li>Update their basic profile information</li>
<li>Add their address with Google Maps autocomplete</li>
<li>Upload a profile picture</li>
<li>Connect social login accounts</li>
<li>Reset their password</li>
</ul>
<p>Let&rsquo;s make an estimate:</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left"><strong>Task</strong></th>
					<th style="text-align: right"><strong>Estimate</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">Basic information</td>
					<td style="text-align: right">6h</td>
			</tr>
			<tr>
					<td style="text-align: left">Address autocomplete</td>
					<td style="text-align: right">12h</td>
			</tr>
			<tr>
					<td style="text-align: left">Profile picture</td>
					<td style="text-align: right">4h</td>
			</tr>
			<tr>
					<td style="text-align: left">Social login</td>
					<td style="text-align: right">8h</td>
			</tr>
			<tr>
					<td style="text-align: left">Reset password</td>
					<td style="text-align: right">4h</td>
			</tr>
	</tbody>
</table>
<p>Summing up: <code>6 + 12 + 4 + 4 + 8 = 34</code>,  that&rsquo;s a 40-hour estimate. <em>(Gotta add that margin!)</em> We&rsquo;ll checkout a new <code>feature/user-account</code> branch, implement, and ship. The final logs in our time tracker:</p>
<table>
	<thead>
			<tr>
					<th style="text-align: left"><strong>Task</strong></th>
					<th style="text-align: right"><strong>Estimate</strong></th>
					<th style="text-align: right"><strong>Actual</strong></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td style="text-align: left">Basic information</td>
					<td style="text-align: right">6h</td>
					<td style="text-align: right">3h</td>
			</tr>
			<tr>
					<td style="text-align: left">Address autocomplete</td>
					<td style="text-align: right">12h</td>
					<td style="text-align: right">14h</td>
			</tr>
			<tr>
					<td style="text-align: left">Profile picture</td>
					<td style="text-align: right">4h</td>
					<td style="text-align: right">6h</td>
			</tr>
			<tr>
					<td style="text-align: left">Social login</td>
					<td style="text-align: right">8h</td>
					<td style="text-align: right">18h</td>
			</tr>
			<tr>
					<td style="text-align: left">Reset password</td>
					<td style="text-align: right">4h</td>
					<td style="text-align: right">2h</td>
			</tr>
	</tbody>
</table>
<p><code>3 + 14 + 6 + 18 + 2 = 43</code>. Not too far off of our (padded) estimate! Some tasks were easier to implement than expected, some took a lot longer. But we didn&rsquo;t ship 43 working hours later, it took 4 weeks to reach production. Why?</p>
<ul>
<li>We realized our application needed to be approved by our social login provider, that took a week. After that it took a lot longer than expected to implement.</li>
<li>When we started to implement the new reset password flow we found a few issues in the design, so the design team had to update the Figma file. The implementation went smoother than expected, but we had to wait for the changes.</li>
<li>Of course, the usual bugs and small feature requests that creep into our schedule pushed this project further down the road.</li>
</ul>
<p>That users had to wait longer than estimated for the new account feature isn&rsquo;t a problem. This post isn&rsquo;t a manifesto to ship incremental changes over big bang launches—I&rsquo;ll leave that decision to the product managers. Shoving everything into one branch is plain <em>easy</em>. Because we weren&rsquo;t going to ship anything individually, we were allowed to! What I care about, is how it affects everything <em>else</em>. Because meanwhile…</p>
<ul>
<li>Another developer needed an address autocompletion on the shipping page. Now we have two implementations and need to trash one.</li>
<li>Someone else refactored the user model and related code, causing a bunch of merge conflicts throughout the 4 weeks of development.</li>
<li>Another timeline-like feature design relies on profile pictures, but we wanted to wait until this branch was merged so we had access to the profile picture components that are already set up.</li>
</ul>
<h2 id="checkpoints">
  <a href="#checkpoints" class="heading-permalink" aria-label="Permalink to Checkpoints"></a>
  Checkpoints
</h2>
<p>Let&rsquo;s treat each task as an individual project. It will probably take longer—at least on our timesheet. We need to create a separate branch for every task and can&rsquo;t implement changes in bulk. Instead of one big <code>feature/user-account</code> merge, we created, reviewed, and merged a bunch of smaller branches over the weeks.</p>
<pre tabindex="0"><code>feature/user-basic-information-views
refactor/share-google-maps-api-credentials
feature/google-maps-autocomplete
feature/profile-picture
refactor/user-authentication-changes
feature/social-login
fix/profile-picture-upload-bug
feature/reset-password-update
feature/reset-password-update-2
</code></pre><p>But what have we gained from this approach?</p>
<ul>
<li>If the address autocompletion was merged earlier, we wouldn&rsquo;t have ended up with two implementations. Even if the first wasn&rsquo;t shipped to production yet, it would have been a usable component in the codebase.</li>
<li>We wouldn&rsquo;t have spent as much time on merge conflicts because frequent merges keep them small or non-existent.</li>
<li>We could have decided postpone social login if we knew it was such a big investment. We didn&rsquo;t because it was too entangled in the monolithic branch.</li>
</ul>
<p>Working towards mergeable chunks doesn&rsquo;t only give the developer more optionality, it makes the entire organization more flexible.</p>
<p>Hindsight is 20/20. It could have gone differently: maybe working in the dark for a prolonged time didn&rsquo;t affect anyone. But you never know this ahead of time. Priorities change, and you don&rsquo;t have control of the external factors that force them to. If you were halfway the monolithic user account branch and a critical bug or competitor forces your hand, all of your code is held hostage until you get back to it. Even if you don&rsquo;t release it to your users, it&rsquo;s more valuable to have in your main branch.</p>
<p>When code is in a feature branch it doesn&rsquo;t contribute to the rest of the codebase. This 40-hour project is an innocent example. We often fall into the same trap for 250-hour projects. That&rsquo;s a month or two of work—a month or two of work in progress code dilly-dallying. Code rots over time. Work in progress code rots significantly faster.</p>
<p>To paraphrase Eliyahu M. Goldratt (I&rsquo;m a sucker for the <a href="https://literal.club/book/the-goal-guyo5">theory of constraints</a>): large amounts of work in progress masks inefficiencies and bottlenecks in the production process. Reducing work in progress can improve cash flow. As work in progress is converted to finished goods and sold more quickly, it accelerates the cash conversion cycle. In our language: code only becomes an asset after it&rsquo;s merged.</p>
<h2 id="action-items">
  <a href="#action-items" class="heading-permalink" aria-label="Permalink to Action items"></a>
  Action items
</h2>
<p>To make this plea actionable: treat each chunk of work as something that should be merged by the end of the week. That doesn&rsquo;t mean it needs to be &ldquo;done&rdquo; or available to the end user, it needs to become a citizen of The Codebase.</p>
<p>The hard part is finding your checkpoints. <strong>Identify the critical path</strong>. What can you strip from a feature while keeping it useful? Do that last. <strong>take a step back every few hours</strong>, ask yourself what the least amount of work would be to make what you&rsquo;re doing mergeable. <strong>Have a bug-free staging environment</strong> from day one and keep it that way to ensure frequent merges don&rsquo;t affect quality (read about <a href="https://en.wikipedia.org/wiki/Broken_windows_theory">the broken window theory</a>).</p>
<p>It takes a while to get used to, and will feel uncomfortable at first. But do this enough, and you&rsquo;ll see checkpoints all over the place. Working in small chunks means individual tasks may take longer. But in the long term you and the team as a whole will see gains in flexibility, optionality, and efficiency. These benefits vastly outweigh the time you would win from a bulk discount.</p>
<p>Some <a href="https://www.goodreads.com/quotes/184098-arrakis-teaches-the-attitude-of-the-knife---chopping-off">desert wisdom</a> to close:</p>
<blockquote>
<p>Arrakis teaches the attitude of the knife—chopping off what&rsquo;s incomplete and saying: &ldquo;Now, it&rsquo;s complete because it&rsquo;s ended here.&rdquo;</p>
</blockquote>]]></content></entry><entry><title>How take notes + my Obsidian setup</title><link rel="alternate" href="https://information-overload.net/how-take-notes-my-obsidian-setup"/><id>https://sebastiandedeyne.com/how-take-notes-my-obsidian-setup</id><author><name>Sebastian De Deyne</name><email>sebastiandedeyne@gmail.com</email></author><updated>2024-09-02T11:57:00+02:00</updated><content type="html"><![CDATA[<p>For the past year, Obsidian has been my note-taking companion. I don&rsquo;t care about fancy features like backlinks, canvas… I like Obsidian because it&rsquo;s fast, minimal (up to you!), customizable, works with Markdown files, and has a good enough mobile app.</p>
<p>I&rsquo;ve slowly grown towards a more consistent way of taking and organizing notes. While I&rsquo;m using Obsidian, it&rsquo;s a system that can easily be ported to any other tool as long as you have something that resembles a filesystem.</p>
<img src="https://information-overload.net/media/obsidian-setup-2024-09-02.webp" alt="Screenshot of my Obsidian setup"><hr>
<p>My first attempt at Obsidian was years ago, but didn&rsquo;t last long. It was a clunky Electron app that looked out of place between polished native apps. A few years later, I was consistently drawn towards Kepano&rsquo;s <a href="https://stephango.com/writing">philosophy on apps and other things</a>. Kepano is Obsidian&rsquo;s CEO. How could I feel so aligned with the maker but not with the tool itself? I gave it another shot, and it turned out Obsidian had come a long way.</p>
<p>Despite having read a lot (too much) about second brains, I&rsquo;m not a second brain maximizer. I want a note taking tool to keep me on track in the moment. I don&rsquo;t need to remember what I ate on the second Thursday of last September. The most important takeaway from Tiago Forte&rsquo;s (the second brain guy) <a href="https://fortelabs.com/blog/para/">PARA</a> organization is to keep notes organized by agency, not category. That&rsquo;s why I use my <a href="https://sebastiandedeyne.com/how-i-take-notes-structure-with-now-next-notes">Now, Next, Notes</a> setup for organization.</p>
<p>Back to Obsidian. Text editing and performance are great. What sets Obsidian apart from other tools is extensibility. I don&rsquo;t want to bloat Obsidian with a bunch of plugins, its customizability allows me to subtract everything I don&rsquo;t need. I&rsquo;ve mainly used iA Writer in the past, and have dabbled with other writer/notes apps like Bear and Ulysses. iA has a lovely editing experience, but its library makes it difficult to have an overview of your notes. If iA had an option to display your files in a tree instead of one folder at a time, it would be a lot more useful to me. I want to easily move files between folders. (Apparently iA is working on <a href="https://mastodon.online/@ia/112638772192811598">a new file browser</a> that might improve this.) Now I treat iA Writer as an editing tool, after the ideas have emerged in Obsidian.</p>
<p>Obsidian isn&rsquo;t great on mobile, but I have no quarrel with that. My laptop is for work. I rarely need notes on my phone, as long as I can reference them when necessary.</p>
<h2 id="how-i-organize-files-in-obsidian">
  <a href="#how-i-organize-files-in-obsidian" class="heading-permalink" aria-label="Permalink to How I organize files in Obsidian"></a>
  How I organize files in Obsidian
</h2>
<p>I use Obsidian for notes, not tasks. My task manager (currently <a href="https://sebastiandedeyne.com/effective-task-management-with-things/">Things</a>) keeps me on track across my responsibilities. When I get to work in the morning, the first thing I do is check my task manager. It helps me decide <em>what</em> I should work on.</p>
<p>Once I get started, it&rsquo;s time to dig up my existing notes or create a new file. I have a file in Obsidian for most projects I&rsquo;m working on. A note could be broad if it&rsquo;s something I don&rsquo;t work on often (for example, <code>Flare.md</code> or <code>Mailcoach.md</code>) or more specific if it&rsquo;s worth tracking in its own scope (for example, <code>Spatie.be Guidelines Redesign.md</code>). Sometimes I&rsquo;ll create a note for a small task to clarify my thoughts and make it easy to refer back to in the future (for example, <code>TypeScript Transformer null undefined issue.md</code>).</p>
<p>My notes live in Now, Next, Notes folders. I&rsquo;ve <a href="https://sebastiandedeyne.com/how-i-take-notes-structure-with-now-next-notes">written about this</a> in detail, but tl;dr: once a week I review my task manager to determine what I&rsquo;ll likely be working on. Things I&rsquo;ll be working on go to Now, things I won&rsquo;t be working on go to Next. Now is like having a stack of files on my desk for quick access, while the rest is stored in a drawer. Notes contains non-actionably resources like <code>React performance tricks.md</code>—a separate file cabinet near the library.</p>
<p>Once I&rsquo;m done with a note, it gets moved to the Archive folder with a date. For example, <code>Archive/2024/08/240830 Spatie.be Guidelines Redesign.md</code>. Having a date in the filename ensures I don&rsquo;t have any duplicates, and having them in the system in a separate folder means they&rsquo;re still easily searchable.</p>
<p>Here&rsquo;s an slice of my notes in Obsidian. I prefix the folder names with numbers to keep them sorted by actionability.</p>
<pre tabindex="0"><code>01 Now/
    Flare Client JS.md
    Href 002.md
    Laravel Comments v2.md
02 Next/
    Flare.md
    Mailcoach.md
    Ray Redesign.md
    Svelte by Example.md
03 Notes/
    Asana.md
    Hiring.md
    Leads.md
    Quotes.md
04 Archive/
    2024/
        08/
            240812 Href.md
            240823 TypeScript Transformer Null Undefined.md
            240827 Beyond CRUD 4 Year Anniversary.md
    Attachments/
</code></pre><p>I have Obsidian configured to store any file attachments in <code>Archive/Attachments</code> to keep them out of view.</p>
<h2 id="anatomy-of-a-note">
  <a href="#anatomy-of-a-note" class="heading-permalink" aria-label="Permalink to Anatomy of a note"></a>
  Anatomy of a note
</h2>
<p>I take notes for multiple reasons: to aid my thinking process, to remember what was said during a meeting, to write down feedback when someone&rsquo;s running me through a demo or codebase, to have a log of what I worked on…</p>
<p>Most notes have two sections separated by a horizontal rule. The first section acts as a scratchpad and is in constant movement. The second section is a chronologically ordered log.</p>
<pre tabindex="0"><code># Ray Redesign

- Look for more components to memoize
- Add menu bar options for view

- Update React
- Consider Tauri

https://tauri.app
PR: https://github.com/spatie/ray-app/pull/…

## Goals
- Polish design
- Fix performance issues for large amounts of messages

---

## 240607 Performance fixes
- Replaced virtualization library
- Added `React.memo` to `Message` to avoid unnecessary rerendering

## 240605 Kickoff &amp; Tauri research
- Meeting notes
    - …
- Tauri pro&#39;s &amp; cons
    - …
</code></pre><p>Things that might go in the scratch pad:</p>
<ul>
<li>Reminders/todos: Things I come across while working on a project I don&rsquo;t want to forget about. Sometimes I split these into multiple lists to group them by priority</li>
<li>Notes/resources/…: Random notes or links to things of relevance</li>
<li>Goals: I like the occasional reminder of what the goals of a project are so I don&rsquo;t stray off track</li>
</ul>
<p>The scratch pad is a freeform section and can look different in every note.</p>
<p>The second part of the note is the log. The log contains sections per date (latest on top) with some brief keywords on the entry. Then a bulleted list on notes for that day. The log is often updated when I complete something from the scratchpad. For example, after I complete &ldquo;Add menu bar options for view&rdquo;, I&rsquo;ll move to the log and jot down some more notes. Meeting notes are also a prime candidate for the log, as they&rsquo;re bound to a date.</p>
<p>The log is especially useful in the short–mid term. For example, when I&rsquo;m working on a feature for a few days straight and want to open a pull request, the log is already a rough draft for the summary.</p>
<p>Having a log can serve as a motivation boost too. On days that feel like a rat race seemingly getting nothing done, you might have made a few log entries. Reviewing these at the end of the day can give clarity that you actually did get quite some things done.</p>
<p>In a way, my project notes use a very similar structure as Now, Next, Notes: sorting things by actionability and keeping the important bits floating on top.</p>
<h2 id="freeform-writing-with-daily-notes">
  <a href="#freeform-writing-with-daily-notes" class="heading-permalink" aria-label="Permalink to Freeform writing with daily notes"></a>
  Freeform writing with daily notes
</h2>
<p>Sometimes I just want to write for myself. Not with the intent to publish, unrelated to a project, as a way to clear my mind. I do freeform writing in daily notes—auto generated files using the current date as the filename—which live in <code>00 Journal.md</code>.</p>
<pre tabindex="0"><code>00 Journal/
    2024/
        08/
            240808.md
</code></pre><p>This is inspired by Peter Suhm&rsquo;s <a href="https://writinghabit.com">Writing Habit</a>. Most of what I write in the journal won&rsquo;t see the light of day, but that low bar is exactly what promotes more consistent writing. This is the only place I use tags, because the only metadata on daily notes is the date, I like to have a way to rediscover snippets in the future. When I decide to write a blog post on Obsidian, it can be useful to review my ramblings from the past month by filtering on an <code>#topic/obsidian</code> tag.</p>
<p>Here&rsquo;s an example daily note. If I write about multiple topics on the same day, I&rsquo;ll separate them with a horizontal rule.</p>
<pre tabindex="0"><code>Memorize the map #topic/programming  #idea/blog 

Since I&#39;ve started programming, the mantra I&#39;d often see passed around is memorization is a waste of time as we always have Google, documentation, and source code to refer to. What&#39;s the point of learning which methods are available on an a Laravel collection when we have a great reference is front of us.

…

---

Absolute values in Tailwind #topic/css #idea/blog 

While I like to keep my Tailwind configuration as vanilla as possible—besides colors—I&#39;ve recently started to overwrite a bunch of font-related settings. The default utility classes for font size and line height never really felt good. While a few named sizes would be managable (xs–xl), they don&#39;t provide enough variation for an application&#39;s font scale. And while extending the scale to something like 4xs–4xl is possible, choosing the right font size becomes a guessing game. The same applies to leading classes between tight and loose.

…
</code></pre><h2 id="my-obsidian-setup-themes-and-plugins">
  <a href="#my-obsidian-setup-themes-and-plugins" class="heading-permalink" aria-label="Permalink to My Obsidian setup: themes and plugins"></a>
  My Obsidian setup: themes and plugins
</h2>
<p>I use the minimal theme with SF Compact Display as my interface font, SF Pro Display for editing, and Berkely Mono for code blocks. I keep the UI as stripped down as possible with the Minimal Theme Settings and Hider plugins. Most of my custom CSS (I&rsquo;ll just dump it <a href="https://sebastiandedeyne.com/media/obsidian/sebdd.css">here</a>) is about hiding things and making things as visually uninteresting as possible.</p>
<p>I have most of the core plugins disabled to keep the UI footprint small and startup as fast as possible. Here are the ones I kept:</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Backlinks</strong></td>
					<td>I rarely use them, but nice to have at hand at times.</td>
			</tr>
			<tr>
					<td><strong>Command palette</strong></td>
					<td>Keyboard access to everything.</td>
			</tr>
			<tr>
					<td><strong>Daily notes</strong></td>
					<td>I use these for freeform writing.</td>
			</tr>
			<tr>
					<td><strong>File recovery</strong></td>
					<td>Safety first.</td>
			</tr>
			<tr>
					<td><strong>Files</strong></td>
					<td>Wouldn&rsquo;t be able to do much without.</td>
			</tr>
			<tr>
					<td><strong>Quick switcher</strong></td>
					<td>More keyboard access.</td>
			</tr>
			<tr>
					<td><strong>Search</strong></td>
					<td>To find things.</td>
			</tr>
			<tr>
					<td><strong>Sync</strong></td>
					<td>Synchronize across devices. I pay for Obsidian sync as iCloud wasn&rsquo;t always reliable.</td>
			</tr>
			<tr>
					<td><strong>Tags view</strong></td>
					<td>I only use tags in daily notes to bring topics to the surface.</td>
			</tr>
	</tbody>
</table>
<p>I also sparsely use community plugins. The ones I use are small quality of life improvements.</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th></th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td><strong>Better Word Count</strong></td>
					<td>When writing a draft I occasionally like to check the word or character count of what I&rsquo;ve selected.</td>
			</tr>
			<tr>
					<td><strong>Excalidraw</strong></td>
					<td>When I want to store a quick sketch in my vault.</td>
			</tr>
			<tr>
					<td><strong>Hider</strong></td>
					<td>Critical! Hide all unwanted bits of UI from Obsidian.</td>
			</tr>
			<tr>
					<td><strong>Minimal Theme Settings</strong></td>
					<td>Hide even more things from Obsidian.</td>
			</tr>
			<tr>
					<td><strong>Outlines</strong></td>
					<td>Useful to move around items in bulleted lists using keyboard shortcuts.</td>
			</tr>
			<tr>
					<td><strong>Sort &amp; Permute Lines</strong></td>
					<td>For occasionally sorting a list alphabetical, or randomizing a long list of ideas in search of inspiration.</td>
			</tr>
	</tbody>
</table>
<p>I often read posts of Obsidian scaring people off because of its complexity. I disagree: with a few tweaks, you can set up a beautiful, minimal note-taking environment.</p>
<hr>
<p>Other organization-related posts I&rsquo;ve written in the past:</p>
<ul>
<li><a href="https://sebastiandedeyne.com/how-i-take-notes-structure-with-now-next-notes">How I take notes: Structure with Now Next Notes</a></li>
<li><a href="https://sebastiandedeyne.com/effective-task-management-with-things">Effective task management with Things</a></li>
<li><a href="https://sebastiandedeyne.com/screenshots">Screenshots</a></li>
</ul>]]></content></entry></feed>