<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  
  
  <channel>
    <title>chrisjrob: ai</title>
    <link>https://chrisjrob.com</link>
    <atom:link href="https://chrisjrob.com/tag/ai/feed/index.xml" rel="self" type="application/rss+xml" />
    <description>GNU Linux, Perl and FLOSS</description>
    <language>en-gb</language>
    <pubDate>Fri, 13 Feb 2026 17:22:31 +0000</pubDate>
    <lastBuildDate>Fri, 13 Feb 2026 17:22:31 +0000</lastBuildDate>
    
    <item>
      <title>Make My Year with Vibe Coding</title>
      <link>https://chrisjrob.com/2026/02/13/vibe-coding/</link>
      <pubDate>Fri, 13 Feb 2026 17:14:49 +0000</pubDate>
      <author>chrisjrob@gmail.com (Chris Roberts)</author>
      <guid>https://chrisjrob.com/2026/02/13/vibe-coding</guid>
      <description>
       <![CDATA[
         
           <img src="https://chrisjrob.com/assets/calendar-month-blue-400x283.jpg" align="right" alt="Featured Image">
         
         <p>Around Christmas each year, I produce printed PDF monthly calendars for my wife, incorporating our family’s anniversaries and other important dates.</p>

<!--more-->

<p>Originally this was done in a spreadsheet, but that was always a headache, especially when multiple events shared the same date.  One year, I gave up and replaced the spreadsheet with a Perl script using <code class="language-plaintext highlighter-rouge">PDF::API2</code> and this has worked well for a number of years.
But, being CLI-based, this remained on my annual to-do list.</p>

<p>The idea to create a web front-end through <em>Vibe Coding</em> came from an episode of the <a href="https://linuxmatters.sh/">Linux Matters Podcast</a>, in which the hosts discussed maintaining a living specification document and using AI to generate an application directly from that specification. The process they described was disciplined: refine the specification, regenerate the system, repeat - until the specification itself becomes the definitive source of truth.</p>

<h2 id="the-process">The process</h2>

<p>I started by asking ChatGPT whether my choice of Perl + Dancer would be suitable, or whether a different language and web framework would be likely to produce better results. Sadly, ChatGPT felt that Codex would be much more effective using a more popular combination and, of the choices suggested, I opted for Ruby with Sinatra. I had previously used Ruby on Rails, but had found it to be too difficult to maintain.  Sinatra is a more lightweight web framework that keeps structure simple and avoids unnecessary abstraction.  For the same reason, I chose Sequel for the database layer instead of ActiveRecord.</p>

<p>The project was broken into sections - creating the base website, adding authentication, etc.
At each major step, we worked on a structured specification, which I fed into Codex.
I tested the results and gave feedback to Codex.
Codex automatically adds unit tests, and uses them to give itself feedback - it is interesting to watch it attempting to fix its own mistakes, unprompted.</p>

<p>When problems occurred, I would often discuss these with ChatGPT before asking Codex to make changes.
For minor steps, I worked directly with Codex, with more of a simple trial and error approach.</p>

<p>The underlying PDF generation remains largely the original Perl script. The surrounding system - authentication, subscription handling, templating, validation and deployment - was almost entirely developed conversationally.</p>

<h2 id="the-frustrations">The frustrations</h2>

<p>There have been some frustrations.</p>

<p>At one point, what I thought was a simple change, resulted in a convoluted and entirely unjustified code change. This happened simply because I was not close enough to the JSON data being accessed, and Codex was trying to achieve something which normally I would have known was not possible.  I reverted the change, but not before it had used up my remaining Codex tokens.</p>

<p>Another issue was that, whilst complex changes were often completed quickly and efficiently, sometimes unbelievably trivial changes had us looping around in circles until I was forced to take control. Minor CSS positioning tweaks were a constant frustration.</p>

<p>We experienced a lot of ‘mission creep’ - it was just too tempting to extend the project, given that it wasn’t me doing the hard work.  We should support Internet Calendars! We should have a weekly calendar format! We should have a daily planner format!  Quick and easy to type the commands into Codex, but the ensuing trial and error, added much to the length of the project.</p>

<h2 id="conclusions">Conclusions</h2>

<p>After many iterations and ‘back to the drawing board’ moments, we finally reached the point where it received spouse-approval, especially when she realised that next year she will be able to simply login and print.</p>

<p>The result is <a href="https://makemyyear.com">MakeMyYear</a>, a small subscription service that allows users to generate personalised downloadable calendars for £4 per year, which hopefully will offset some of the Codex costs, as well as giving me invaluable experience with working with Stripe.</p>

<p>I do feel it will be very difficult to go back to traditional coding. The line by line coding which I had always found so engaging, now seems like far too much like hard work!</p>

<p>Have I just spent months of free time and hard-earned money, simply making it possible for my wife to print her own calendars? Why yes, yes I have.</p>

       ]]>
      </description>
    </item>
    
  </channel> 
</rss>
