<rss version="2.0">
  <channel>
    <title>Vibelog  on Leon Mika</title>
    <link>https://lmika.org/categories/vibelog-/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Sun, 28 Jun 2026 11:36:12 +1000</lastBuildDate>
    
    <item>
      <title>Vibelog: Show As Table - A DSL In a Hurry</title>
      <link>https://lmika.org/2026/06/28/vibelog-show-as-table-a.html</link>
      <pubDate>Sun, 28 Jun 2026 11:36:12 +1000</pubDate>
      
      <guid>http://lmika.micro.blog/2026/06/28/vibelog-show-as-table-a.html</guid>
      <description>&lt;p&gt;I was asked to make a couple of diagrams for the purpose of showcasing a database design. These diagrams were mainly used to show the relationship between entities, so I chose to use TLDraw for this. But there was a need to add some example rows, which TLDraw does not make easy. Furthermore, there was a bit of a push to get this done quickly, as these were to be shown to various stakeholders the next day.&lt;/p&gt;
&lt;p&gt;Given all this, I thought it was worth asking Claude to make a tool to generate a table as an image from a DSL.&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;The initial prompt&lt;/summary&gt;
  &lt;p&gt;Please generate for me a Go application which takes a DSL of the following form:&lt;/p&gt;
&lt;p&gt;```&lt;br&gt;
Title&lt;/p&gt;
&lt;p&gt;Name Value&lt;br&gt;
&amp;ldquo;Name2&amp;rdquo; &amp;ldquo;Value2&amp;rdquo;&lt;br&gt;
```&lt;/p&gt;
&lt;p&gt;It is to render this as a &amp;ldquo;card&amp;rdquo; with Title appearing above a box which contains two columns: the left containing the name and the right containing the value. The columns are to be presented as two columns of a table that will rendered as this: [Image #1]&lt;/p&gt;
&lt;p&gt;The result should be a PNG that I can include in another diagram.&lt;/p&gt;
&lt;/details&gt;

&lt;p&gt;In short, I was to provide the data in the form of a table, and the tool Claude wrote is to generate it as an image, that I could import into TLDraw. Here&amp;rsquo;s an example:&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Key Value
First John
Last Smith
Address &amp;#34;123 Fake St.&amp;#34;
City Melbourne
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/show-as-table-1.png&#34; width=&#34;267&#34; height=&#34;237&#34; alt=&#34;Auto-generated description: A table displays a key-value pair list containing personal information with keys First, Last, Address, and City, and corresponding values John, Smith, 123 Fake St., and Melbourne.&#34;&gt;
&lt;p&gt;This was my first attempt at using the image upload for Claude Code, with the intent of producing something that that mimics it. I don&amp;rsquo;t have it handy with me but the image was of a table rendered in a GUI of a database client of some sort (I didn&amp;rsquo;t pick the table, someone else took a screenshot and said &amp;ldquo;make it look like this&amp;rdquo;). And Claude managed to get it looking pretty close. It originally chose to use the builtin Golang fonts, but switched Jetbrains Mono for the headers and Inter for the table cells, after I asked it to use a more &amp;ldquo;professional&amp;rdquo; font.&lt;/p&gt;
&lt;p&gt;From there, the DSL evolved as the needs of the task arise, without any grand vision of it&amp;rsquo;s design. The diagram title was dropped, comments in the form of lines beginning with hash were added, and a row could be highlighted by prefixing it with a &lt;code&gt;*&lt;/code&gt;. How Claude did this was up to it. It was given pretty-much free reign in many of details, including how to highlight a row (it chose to do so using a yellow background):&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Key Value
First John
# Middle None
Last Smith
Address &amp;#34;123 Fake St.&amp;#34;
City Melbourne
* Registered Yes
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/show-as-table-2.png&#34; width=&#34;291&#34; height=&#34;274&#34; alt=&#34;Auto-generated description: A table displays personal information with keys such as First, Last, Address, City, and Registered, paired with the values John, Smith, 123 Fake St., Melbourne, and Yes respectively.&#34;&gt;
&lt;p&gt;The DSL eventually extended to include tables with multiple columns.&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Prompt to add multiple columns and highlights&lt;/summary&gt;
  &lt;p&gt;Please also add support for multiple columns, i.e. more than 2. And any row that begins with a &lt;code&gt;*&lt;/code&gt; should be highlighted, e.g &lt;code&gt;*name value&lt;/code&gt; (do not include the leading star)&lt;/p&gt;
&lt;/details&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Key          &amp;#34;Person 1&amp;#34;      &amp;#34;Person 2&amp;#34;
First        John            Mary
Last         Smith           Smith
Address      &amp;#34;123 Fake St.&amp;#34;  &amp;#34;456 Fake Rd.&amp;#34;
City         Melbourne       Sydney
* Registered Yes             No
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/show-as-table-3.png&#34; width=&#34;300&#34; height=&#34;196&#34; alt=&#34;Auto-generated description: A table compares two people, John and Mary Smith, listing their last names, addresses, cities, and registration status.&#34;&gt;
&lt;p&gt;And multiple tables stacked vertically, with matching cell widths.&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Prompt to stack multiple tables&lt;/summary&gt;
  &lt;p&gt;Okay. I would also like you to support dividers between subsequent tables. When I have a line of the form &amp;ldquo;&amp;mdash;&amp;rdquo;, it will indicate that I want two tables, positioned vertically, with a transparent gap between the two of about 1.5 times [since updated to be 1/2 that] the row height. The column sizes of both tables should be the same, in that they should be wide enough to fit whatever the widest cell of both tables.&lt;/p&gt;
&lt;/details&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Key          &amp;#34;Person 1&amp;#34;
First        John
Last         Smith
Address      &amp;#34;123 Fake St.&amp;#34;
City         Melbourne
* Registered Yes
---
Key          &amp;#34;Person 2&amp;#34;
First        Mary
Last         Smith
Address      &amp;#34;456 North Fake Road, South&amp;#34;
City         Sydney
Registered   No
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/show-as-table-4.png&#34; width=&#34;300&#34; height=&#34;392&#34; alt=&#34;Auto-generated description: The image shows two tables listing personal information for John Smith from Melbourne, who is registered, and Mary Smith from Sydney, who is not registered.&#34;&gt;
&lt;p&gt;Finally, a dark-mode was added. The colours were taken from a fork of this where someone added a dark mode directly. I wanted the ability to invoke dark mode via a switch, and simply adopting the fork meant I would loose the multi-table features I asked Claude to add. So I copied their version of the source, and asked Claude to crib the colours from it:&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Prompt to add dark mode&lt;/summary&gt;
  &lt;p&gt;Okay. Someone has forked a version of this tool and implemented a dark version. They have shared with me the code located in @dark-version/main.go. Can you please adopt the colour scheme of this tool, and apply it when the flag &amp;ldquo;-dark&amp;rdquo; is present.&lt;/p&gt;
&lt;/details&gt;

&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;Key          &amp;#34;Person 1&amp;#34;
First        John
Last         Smith
Address      &amp;#34;123 Fake St.&amp;#34;
City         Melbourne
* Registered Yes
&amp;#34;Dark Mode&amp;#34;  Yes
&lt;/code&gt;&lt;/pre&gt;&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/show-as-table-5.png&#34; width=&#34;291&#34; height=&#34;311&#34; alt=&#34;Auto-generated description: A table presents personal details for John Smith including his address, city, and preferences with registered and dark mode set to yes.&#34;&gt;
&lt;p&gt;The results were decent, although you can guess that I didn&amp;rsquo;t actually run this tool in dark mode with a highlighted row.&lt;/p&gt;
&lt;p&gt;So, why do I write about this? Not that I need a reason, but I always find these badly designed, hacked together DSLs fascinating. You can learn a lot about using something that&amp;rsquo;s truly terrible. Using this particular DSL  for the task at hand is fine, but I can&amp;rsquo;t really see myself using it for anything else. Having the table cells defined as white-spaced table columns is not the easiest thing to maintain, let alone something easy to review when checked into Git. Yet it is obvious, and maybe with some better tooling it could be made to work better.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vibelog: Blogging Tools - Some Post Authoring Work</title>
      <link>https://lmika.org/2026/06/25/vibelog-blogging-tools-some-post.html</link>
      <pubDate>Thu, 25 Jun 2026 08:12:14 +1000</pubDate>
      
      <guid>http://lmika.micro.blog/2026/06/25/vibelog-blogging-tools-some-post.html</guid>
      <description>&lt;p&gt;I asked Claude to do some work on Blogging Tools.&lt;/p&gt;
&lt;p&gt;I wanted a way to schedule the publication of a post. Well, in a manner of speaking. The scheduled post retains it&amp;rsquo;s original publication date. It just won&amp;rsquo;t get published until a certain time in the future, nor would it be cross-posted to anything. It&amp;rsquo;s sort of my attempt at allowing me to &lt;a href=&#34;https://lmika.org/2026/06/18/i-kind-of-regret-not.html&#34;&gt;write about a topic&lt;/a&gt; without anyone else finding out about it. Yes, I know this sort of defeats the purpose of a blog, and that any bit of writing published here is theoretically world readable anyway. But there&amp;rsquo;s a sense of immediacy about certain topics that, with a bit of temporal distance between when it&amp;rsquo;s published and when it actually appears, does make it easier to write about. And as posts age, their reason for being changes. They become less about the &amp;ldquo;joining the conversation&amp;rdquo; and more a statement of record sitting in the archives. And in my experience, unless the piece gains some traction, very few readers venture into the archives. Or at least, few human readers do; the AI agents are all over there at the moment (hi, bots 👋).&lt;/p&gt;
&lt;p&gt;Anyway, this was a perfect enough small thing for Claude to work on unsupervised. I have enough confidence that Claude will find it&amp;rsquo;s way around the code base. I have a very basic &lt;code&gt;CLAUDE.md&lt;/code&gt; file which it tends to honour. So it had no immediate issues making the changes. But when I pushed it to the server, my immediate thought was that Claude can&amp;rsquo;t do UI design. I asked for a menu, and this is what it gave me:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260618-150824.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;Auto-generated description: A blog post draft interface is shown with options to save, import drafts, publish at various time intervals, and a post mentioning My Dinner With Skinner related to The Simpsons.&#34;&gt;
&lt;p&gt;That&amp;rsquo;s an unstyled disclosure HTML element acting as a menu, with the items being links within an unordered list. It turns out that it was a caching issue, as a day later, when I revisited the page, I got this:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260619-075613.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;Auto-generated description: A blog post management interface is shown with options to create new posts, import drafts, edit, publish, update, delete posts, and schedule publishing times.&#34;&gt;
&lt;p&gt;Which is an improvement but not a whole lot better. So I went in and adjusted the CSS to make it look more like a link. It now looks like this:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260625-081352.png&#34; width=&#34;600&#34; height=&#34;452&#34; alt=&#34;Auto-generated description: A webpage displays a blog post editor with a draft import section and an explanation of changes made to the UI design and post scheduling functionality.&#34;&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260625-081456.png&#34; width=&#34;600&#34; height=&#34;452&#34; alt=&#34;Auto-generated description: A blog post discussing improvements made to the UI design for importing draft posts, explaining the use of hidden classes in HTML and a new publishing schedule feature.&#34;&gt;
&lt;p&gt;Another request I had was to import a Micro.blog draft into Blogging Tools so I can use this new scheduling feature. This essentially calls Micro.blog&amp;rsquo;s MicroPub API to fetch the first 10 draft posts, and display them in a list. A pretty elemental feature, but I do have unfounded fears of missing something when I copy and paste things around.&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260619-081031.png&#34; width=&#34;600&#34; height=&#34;449&#34; alt=&#34;Auto-generated description: A draft blog post discussing Tim Cook&#39;s announcement about upcoming price increases on Apple products, including a critical commentary on Apple&#39;s financial strategy.&#34;&gt;
&lt;p&gt;Claude did a better job on the UI design here. I guess it had the existing post list to crib off of. Although each item does have this weird text area. It turns out Claude decided to surround each draft post in a form element which will submit it when the user clicks &amp;ldquo;Import&amp;rdquo;. The text area is essentially the draft post sent to the server. It&amp;rsquo;s a pretty old school way of doing it, but it works. They were simply showing up because Claude forgot to add the &lt;code&gt;class=&amp;quot;hidden&amp;quot;&lt;/code&gt; attribute, simply adding &lt;code&gt;hidden&lt;/code&gt; as the attribute itself. This was another thing I fixed by hand.&lt;/p&gt;
&lt;p&gt;So, a simple enough change. Now time for the more recent test. For you see, this post is a good example of the sort of posts I hope to use this scheduling tool for. I will publish it now, and hope to see it appear in four days time. That means it won&amp;rsquo;t actually be visible until the 29th. But it doesn&amp;rsquo;t take long for that time to fly by.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>