<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Bart Antonelli</title>
    <link>https://bartantonelli.com</link>
    <description>Personal blog and projects</description>
    <atom:link href="https://bartantonelli.com/feed.xml" rel="self" type="application/rss+xml"/>
    <image>
      <url>https://bartantonelli.com/favicon.png</url>
      <title>Bart Antonelli</title>
      <link>https://bartantonelli.com</link>
    </image>
    <item>
      <title>Baking Burnt Bread in Public: The Asymmetric Bet of Starting a Blog</title>
      <link>https://bartantonelli.com/2026-04-08-baking-burnt-bread-in-public/</link>
      <guid>https://bartantonelli.com/2026-04-08-baking-burnt-bread-in-public/</guid>
      <description>I&apos;m a perfectionist who isn&apos;t ready to write. So I&apos;m putting my ego aside and shipping anyway.</description>
      <pubDate>Wed, 08 Apr 2026 00:00:00 GMT</pubDate>
      <dc:creator>Bart Antonelli</dc:creator>
      <category>writing</category>
      <category>personal</category>
      <category>meta</category>
      <content:encoded><![CDATA[<p>There&#39;s a picture of a billboard I keep coming back to. It says: &quot;Your first anything will be bad. But you can&#39;t make your 100th without making your first. So put your ego aside, and start.&quot;</p>
<p><img src="images/billboard.jpg" alt="Billboard: your first anything will be bad" loading="lazy" decoding="async"></p>
<p>I am a perfectionist. I don&#39;t feel ready to write this, and I know my skills as a writer aren&#39;t exactly where I want them to be yet. But I want to be able to write things in an engaging way. If I wait until I&#39;m &quot;ready,&quot; I&#39;ll never ship anything. So, I am putting my ego aside.</p>
<p>Why start a blog? Especially when the overwhelming majority of blogs don&#39;t get read by anyone?</p>
<p>Fundamentally, I look at it as an asymmetric bet.</p>
<p>The costs are practically zero. I&#39;m a software engineer, so hosting this myself on an AWS S3 bucket brings some interesting technical challenges, but it also means I&#39;m not at the whims of arbitrary account deletions or platforms trying to extract more money out of me. The downside is just my time. In the absolute worst-case scenario, no one reads this, and I&#39;ve just trained AI on my thought processes so it can better target ads towards me.</p>
<p>But the upside? The upside is massive leverage.</p>
<p>If you write something once, anyone with an internet connection and a device can read it. That is a massively powerful concept. But to get to the point where you actually have something worth reading, you have to upgrade your own brain first.</p>
<hr>
<p>To write is to think. Trying to express complicated ideas forces you to pull them out of your head and wrestle with them until you can articulate them clearly.</p>
<blockquote>
<p>&quot;Writing is thinking. To write well is to think clearly. That&#39;s why it&#39;s so hard.&quot; - David McCullough</p>
</blockquote>
<p>Somewhat ironically, writing this very post was a demonstration of the process. I had some vague reasons why I wanted to start a blog. I wrote them down. I did some research. I revised my thoughts. I grappled with it. Along the way I came across Shane Parrish&#39;s <a href="https://fs.blog/writing-to-think/">Writing to Think</a>, which is full of quotes that put this better than I can:</p>
<p>Mortimer Adler put it well: &quot;The person who says he knows what he thinks but cannot express it usually does not know what he thinks.&quot;</p>
<blockquote>
<p>&quot;A good writer doesn&#39;t just think, and then write down what he thought, as a sort of transcript. A good writer will almost always discover new things in the process of writing.&quot; - Paul Graham</p>
</blockquote>
<p><img src="images/lego-writing.jpg" alt="Before writing vs after writing - Lego blocks scattered vs assembled into a tower" loading="lazy" decoding="async"></p>
<p>I am the sort of person who likes to think a lot. This blog won&#39;t solve my overthinking, but it will change the target. I think it&#39;s much healthier to ruminate on ideas that could be shared publicly, ideas that could inspire, teach, or add value, rather than wasting brain cycles on the trifles and quibbles of daily life.</p>
<p>Plus, writing publicly forces accountability. Why would you want to go around with half-verified facts in your head? That doesn&#39;t seem like a good idea. Knowing someone might read this forces me to do a bit of analysis, rather than just firing off half-brained ideas. Better yet, if I write (and by extension think) something which is wrong, or could be seen from another angle, someone might actually call me out on it, and I will be able to learn.</p>
<hr>
<p>Which brings me to the elephant in the room: the audience.</p>
<p>Is it okay to want people to read it? Honestly, yes. I think of it almost like a business. You produce things of value, and people pay you with their attention. It&#39;s a great way to learn what the world actually finds valuable.</p>
<p>But trying to get an audience right now feels like putting the cart before the horse. You can&#39;t market something if it isn&#39;t actually good.</p>
<p>Right now, the baker just needs to go and bake some bread. You just have to make the damn recipe. I don&#39;t know how I&#39;m going to sell the bread if half the time it&#39;s coming out burnt or not crispy enough.</p>
<p>So, that is what this blog is. It&#39;s me practicing. It&#39;s me building the muscle so that when something of immense, world-class value comes along, I will be able to do it justice.</p>
<p>I&#39;m not going to let perfect be the enemy of good. For the next little while, my goal is just to write things that seem &quot;good enough&quot; and hit ship.</p>
<p>Consider this my first burnt loaf.</p>
]]></content:encoded>
    </item>
    <item>
      <title>How I built this site in an afternoon</title>
      <link>https://bartantonelli.com/2026-04-06-how-i-built-this/</link>
      <guid>https://bartantonelli.com/2026-04-06-how-i-built-this/</guid>
      <description>I wanted to start writing. So I vibe-coded a static site generator, pointed it at an S3 bucket, and shipped it.</description>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <dc:creator>Bart Antonelli</dc:creator>
      <category>meta</category>
      <category>building</category>
      <content:encoded><![CDATA[<p>There&#39;s a story from the book <em>Art &amp; Fear</em> about a ceramics class. The teacher splits the class in two: one half will be graded on <strong>quantity</strong> - just produce as many pots as you can. The other half will be graded on <strong>quality</strong> - produce one perfect pot. At the end of the semester, the best pots all came from the quantity group. While the quality group sat around theorising about perfection, the quantity group was learning from their mistakes, pot after pot.</p>
<p>I&#39;ve been thinking about starting a blog for a while. I kept not doing it because I didn&#39;t have the perfect setup, the perfect design, the perfect first post. So today I decided to just make pots.</p>
<h2>What I had to start with</h2>
<p>Not much, but enough:</p>
<ul>
<li>A domain name on Route 53 that I&#39;ve been renewing for ages</li>
<li>An S3 bucket</li>
<li>A GitHub account</li>
<li>An afternoon</li>
<li>Some ideas about stuff I wanted to write about</li>
</ul>
<h2>What I asked for</h2>
<p>I opened Claude and basically said: help me build a personal site where I can write blog posts in Markdown and have them turn into a website. I want it hosted on S3. I want it to be simple enough that I can just write a <code>.md</code> file and publish it. Here&#39;s roughly what I asked:</p>
<blockquote>
<p>I want to create a personal website flexible enough that I can write and index blog articles, but also do scrolling visual pages with text, images, and charts. I want to ship something today. The idea is I can just write blog posts. I plan to host on S3 - I&#39;ve currently got the domain set up on Route 53.</p>
</blockquote>
<p>That was it. No detailed requirements doc. No framework comparison. Just: here&#39;s what I want, let&#39;s go.</p>
<h2>What came out</h2>
<p>A custom static site generator in TypeScript. No framework - just a build script that reads Markdown files, runs them through a parser, wraps them in HTML templates, and writes the output to a folder. That folder gets synced to S3.</p>
<p>The whole thing is maybe 500 lines of actual code across a handful of files:</p>
<ul>
<li><strong>Markdown parsing</strong> with frontmatter (title, date, tags - the stuff at the top of each post)</li>
<li><strong>HTML posts</strong> for when I want to do something more visual</li>
<li><strong>An image pipeline</strong> that generates responsive sizes and formats</li>
<li><strong>RSS feed</strong> generation</li>
<li><strong>Syntax highlighting</strong> for code blocks</li>
<li><strong>Dark mode</strong> that respects your system preference</li>
</ul>
<p>To write a new post, I create a file like <code>2026-04-06-my-post.md</code>, put some metadata at the top, write the content, and push to GitHub. That&#39;s it.</p>
<h2>The deployment</h2>
<p>This was actually the most interesting part. The build runs in GitHub Actions - on every push to <code>main</code>, it installs dependencies, runs the build script, and syncs the output to S3.</p>
<p>The default suggestion was to store AWS access keys as GitHub secrets. I didn&#39;t love that - long-lived credentials sitting in a repo felt off. So instead I set it up with <strong>OIDC</strong> (OpenID Connect), which is genuinely a better approach and turned out to be simpler.</p>
<p>Here&#39;s how it works: instead of storing AWS credentials in GitHub, you create a trust relationship between GitHub and AWS. When the GitHub Action runs, it requests a short-lived token from GitHub&#39;s OIDC provider. That token proves &quot;I am a workflow running in <em>this specific repo</em>.&quot; AWS sees the token, checks it against the trust policy on an IAM role, and hands back temporary credentials that last just long enough to do the deployment.</p>
<p>No long-lived secrets. No keys to rotate. The credentials exist for a few minutes and then they&#39;re gone. The IAM role is scoped down to only what it needs - put objects in one S3 bucket, invalidate one CloudFront distribution. Nothing else.</p>
<p>The whole deployment takes about 16 seconds.</p>
<h2>The philosophy</h2>
<p>I&#39;m not pretending this is the best static site generator. It&#39;s not even close. There are incredible tools out there - Astro, Hugo, Next.js, Eleventy - that do far more than this. But I understand every single line of this one, and I can change anything without reading docs or fighting a framework.</p>
<p>More importantly: it exists. It&#39;s live. I&#39;m writing on it right now.</p>
<p>The quality group is still planning their perfect pot. I&#39;m just going to keep making pots.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Hello World</title>
      <link>https://bartantonelli.com/2026-04-06-hello-world/</link>
      <guid>https://bartantonelli.com/2026-04-06-hello-world/</guid>
      <description>Welcome to my corner of the internet - a place for writing, building, and thinking out loud.</description>
      <pubDate>Mon, 06 Apr 2026 00:00:00 GMT</pubDate>
      <dc:creator>Bart Antonelli</dc:creator>
      <category>thoughts</category>
      <category>personal</category>
      <content:encoded><![CDATA[<p>Welcome. I&#39;ve wanted a place like this for a while - somewhere to write without constraints, to share things I&#39;m building, and to think out loud about the things that interest me.</p>
<h2>What to expect</h2>
<p>I&#39;ll be writing about whatever I&#39;m curious about at the moment. That could be:</p>
<ul>
<li><strong>Technology and tools</strong> - the things I use, build, and break</li>
<li><strong>Data and visualization</strong> - making sense of the world through pictures</li>
<li><strong>Ideas</strong> - half-formed thoughts that need air</li>
</ul>
<p>Some posts will be traditional writing. Others might be more visual - scrollable, interactive pieces where the format is part of the point. This site supports both, which is kind of the whole idea.</p>
<hr>
<p>More soon. Thanks for reading.</p>
]]></content:encoded>
    </item>
    <item>
      <title>My $5 Transplant Surgery on a $20 Watch: A Manifesto</title>
      <link>https://bartantonelli.com/2025-08-10-casio-f91w-transplant/</link>
      <guid>https://bartantonelli.com/2025-08-10-casio-f91w-transplant/</guid>
      <description>In a world begging you to upgrade, sometimes the most satisfying thing you can do is find a way to keep the real thing going.</description>
      <pubDate>Sun, 10 Aug 2025 00:00:00 GMT</pubDate>
      <dc:creator>Bart Antonelli</dc:creator>
      <category>watches</category>
      <category>repair</category>
      <category>frugality</category>
      <content:encoded><![CDATA[<p>My Casio F91W isn&#39;t just a watch; it&#39;s an act of defiance. In a world relentlessly pushing smartwatches that want to track your sleep, read your emails, and vibrate with the crushing anxiety of a thousand daily notifications, the F91W just says &quot;no.&quot; It&#39;s a feather-light, unpretentious slab of 1980s technology that tells the time, has a backlight so perfectly dim you can check it at 3 AM without searing your retinas, and is water-resistant enough that you never have to take it off for a shower or a swim at the beach. It also possesses a stopwatch that I proudly used to time a 10k race last year. 52 minutes flat - no rollover required. My friend Justin saw me check it at the finish line and just shook his head, utterly bewildered.</p>
<p><img src="images/casio-f91w.jpg" alt="My Casio F91W, alive and well on my wrist" loading="lazy" decoding="async"></p>
<p>This watch is a philosophy you wear on your wrist. Its greatest feature is its profound lack of features. You forget it&#39;s there. It&#39;s not jewellery; it&#39;s infrastructure. And like all good infrastructure, it has a &quot;bomb-proof&quot; reputation. I&#39;m not just being figurative. According to declassified documents, possession of an F-91W was considered by US military analysts to be a &quot;sign of al-Qaeda,&quot; as its reliable timer was a favourite of bomb-makers in Afghanistan. For a time, wearing this $5 watch could earn you a one-way ticket to Guantanamo Bay. It&#39;s a watch with a rap sheet. How could you not love it?</p>
<p>My other friend Jason and I talk about watches a lot, but we speak different languages. He&#39;s the only friend I have who truly loves them, but our appreciations diverge. He, a man with impeccable taste and a collection of what can only be described as wearable art, speaks of movements, resale value, and aspirational pieces he wistfully admits he could afford if he knew for sure he wasn&#39;t going to have kids. I get it, I truly do. But when he suggests I &quot;upgrade&quot; to a metal-strapped cousin of the F-91W, I tell him no. The magic is in the plastic. A metal watch has weight; you feel it. This is more like a bracelet. You forget it&#39;s even there.</p>
<p>For me, at this stage of my life, the F91W is the upgrade. It&#39;s an upgrade in simplicity, in frugality, in blissful ignorance of how many emails I&#39;ve just received.</p>
<p>But even the most resilient icon has a weakness. For the F91W, it&#39;s always the strap. My last one suffered the same fate. For weeks, I&#39;d been sending Jason grim photo updates of the deepening resin cracks, like a doctor monitoring a terminal patient. Then one day, it finally gave up the ghost. I wasn&#39;t just going to throw the watch away; that would be a betrayal. This wasn&#39;t waste; this was a challenge.</p>
<p>The Optimizer in me immediately saw a problem that needed fixing. I scoured Amazon, eBay and Temu, but the knock-off straps weren&#39;t right - the buckle was a jarring silver instead of black, the texture was off. I had bought one of those before and didn&#39;t like it. A NATO strap felt like putting a racing spoiler on a Toyota Camry. It just didn&#39;t fit. I&#39;d almost given up and resigned myself to buying a whole new watch.</p>
<p>Then, while wandering through a Dubai mall on a different mission, I stumbled upon a tiny watch repair stall. To my surprise, the guy actually had loose straps. Hundreds of them. My first problem: I had no idea what size I needed. Out came the phone, a quick search for &quot;F91W strap size,&quot; and my answer appeared: 18 millimeters. Armed with data, I approached the counter.</p>
<p>The man behind it had headphones in, lost in his own world. Through a combination of broken English and vigorous pointing, our negotiation began. &quot;Eighteen millimeter, plastic,&quot; I said. He nodded, then proceeded to pull out a tray of supple leather straps.</p>
<p>&quot;No, no,&quot; I insisted, a little louder this time. &quot;Plastic. Cheap plastic.&quot; He just smiled and pulled out another tray of leather. And another. Realizing words were failing us, I switched to the universal language of JPEGs and showed him a picture of the watch on my phone.</p>
<p>&quot;Ah!&quot; A spark of recognition. I was already starting to turn away, defeated, but he put up a hand - a silent &quot;wait here&quot; - and motioned for me to come back. He ducked under his counter and emerged, triumphant, holding a brand-new F91W, complete with a little cotton string and a Casio tag.</p>
<p>He handed it over. It felt immediately wrong in my hand. The font was off, the colours too bright. But this was my chance. I&#39;d always wanted to try the legendary counterfeit test, the one where you hold down the right-hand button for three seconds until the screen displays &quot;CASIO.&quot; I held the button. The screen flickered and, sure enough, the magic word appeared. The internet was wrong. My own senses, however, were not. Despite passing the test, I could tell this thing was a piece of junk.</p>
<p>I handed it back, said a simple, &quot;No, thank you,&quot; and walked off, principles intact.</p>
<p>I was halfway back to my car when my Optimizer brain seized control from my purist heart. The penny dropped with the force of a dropped anvil. The moral objection wasn&#39;t about supporting counterfeiters; it was about not wanting to buy garbage. But I wasn&#39;t buying the garbage watch. I was buying the exact strap I needed, a part I couldn&#39;t find anywhere else, for the price of two coffees.</p>
<p>I turned back. He was with another customer. I waited, then said, &quot;Sure, I&#39;ll take it. Twenty dirhams.&quot;</p>
<p>I expected him to hand over the whole watch, a little trophy for my troubles. Nope. With the practiced ease of a surgeon, he popped the straps off the face and handed me just the two pieces of plastic. A deal&#39;s a deal.</p>
<p>The next day, between work calls, the transplant surgery began. I, a man without a proper watch tool, grabbed the first pointy object I could find: a sewing needle. I lined it up with the pin, took a deep breath, and pushed. The pin didn&#39;t budge. I pushed harder, banging it against my desk. The needle, with the structural integrity of a wet noodle, bent into a perfect 90-degree angle before snapping, firing its tiny, vengeful tip into an unknown corner of my apartment and leaving a constellation of tiny, pockmarked memorials on my marble desk.</p>
<p>Plan B. I rummaged through my cycling gear and found my Dynaplug - specifically, the sharp reaming tool designed to clear debris out of a tyre. It was the definition of using a sledgehammer to crack a nut, but it was effective. With a determined push, the pin was out.</p>
<p>I attached the new-old strap. It looked the part, but it felt stubborn, rigid, unlike the soft, pliable resin of the original. It had the uncooperative posture of a teenager being forced to a family dinner. But it works.</p>
<p>For $5 and a broken needle, my faithful watch is back on my wrist. It&#39;s a hybrid now, part authentic, part imposter, a testament to reuse and repair. And it reminds me that in a world begging you to upgrade, sometimes the most satisfying thing you can do is just find a way to keep the real thing going.</p>
<hr>
<p><strong>P.S. - September 15, 2025:</strong> The universe has a sense of humour. Within a month of the transplant, the little prong on the buckle - the tiny metal pin that slots into the hole to hold the strap closed - snapped clean off. The strap was fine. The watch was fine. But without that pin, the whole thing was just an expensive bracelet that told the time while sliding off my wrist.</p>
<p>The cruel irony is that the original buckle, with its perfectly intact prong, was already in landfill. I&#39;d thrown it out with the old cracked strap. Had I kept just that one small U-shaped clasp, I could have done another transplant and kept the saga going. But I didn&#39;t. Sometimes the Optimizer fails to optimise.</p>
<p>So I did the thing I&#39;d been resisting all along. I bought a brand new, genuine F91W on Amazon for 65 AED (~$17) shipping included. $17 for a fresh start and a strap that actually stays on my wrist. Maybe there&#39;s a lesson here about knowing when to stop tinkering and just let things be new. Or maybe the lesson is to never throw away spare parts. I&#39;m going with the second one.</p>
]]></content:encoded>
    </item>
  </channel>
</rss>
