<rss version="2.0">
  <channel>
    <title>Vibelog  on Leon Mika</title>
    <link>https://lmika.org/categories/vibelog-/</link>
    <description></description>
    
    <language>en</language>
    
    <lastBuildDate>Wed, 15 Jul 2026 22:30:02 +1000</lastBuildDate>
    
    <item>
      <title>Vibelog: Well Read - A Fable Moment</title>
      <link>https://lmika.org/2026/07/15/vibelog-well-read-a-fable.html</link>
      <pubDate>Wed, 15 Jul 2026 22:30:02 +1000</pubDate>
      
      <guid>http://lmika.micro.blog/2026/07/15/vibelog-well-read-a-fable.html</guid>
      <description>&lt;p&gt;Today, I had what I could probably describe as a true &amp;ldquo;Fable&amp;rdquo; moment. I was asking Claude Code to make some changes to Well Read (yes, I&amp;rsquo;m still using it) when I considered throwing it a problem that Opus was unable to solve. This Flutter app renders a post within an embedded WebView, and since day one, this WebView had some pretty janky scrolling. For small pages it was fine, but as it grew, or when more images were present, the refresh rate will drop like a stone.&lt;/p&gt;
&lt;p&gt;I had Opus take a look at this a while ago. It suggested a few minor things like adjusting the styling, but none of these seemed to helped.
I have had Fable &lt;a href=&#34;https://lmika.org/2026/07/04/vibelog-weatherpatch-ui-improvement.html&#34;&gt;look at tasks that Opus did poorly in the past&lt;/a&gt;, I have heard others say that Fable was capable of solving problems that prior models had trouble with. It seemed to work for them, and since I had Fable open doing other things, I wondered if it could work for me. And besides, this scrolling jank was really bugging me. If Fable couldn&amp;rsquo;t solve it, ah well, I&amp;rsquo;m left with what I have. But if it could…&lt;/p&gt;
&lt;p&gt;So here was my prompt to Fable:&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;I&amp;rsquo;m experiencing issues when browsing pages within the web-viewer. Scrolling is particularly choppy when there are images or when the article is too long. It would be nice if the scrolling was smoother. Is there some way in which this could be improved?&lt;/p&gt;

  &lt;/blockquote&gt;
&lt;p&gt;Short and sweet. Here was its response:&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Fable&amp;rsquo;s diagnosis of the issue&lt;/summary&gt;
  
  &lt;blockquote&gt;
    &lt;p&gt;Good question — and I can point at some likely culprits in the reader&amp;rsquo;s code itself. This is an assessment; nothing&amp;rsquo;s changed yet. The honest caveat up front: scroll jank can only truly be diagnosed on the device (I can&amp;rsquo;t reproduce it in this VM), so these are ranked by likelihood based on reading post_reader_screen.dart, not by measurement.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The content-visibility CSS in the injected HTML is doing nothing useful and possibly harm. The article body is wrapped in a single &amp;lt;div class=&amp;ldquo;content&amp;rdquo;&amp;gt; styled with content-visibility: auto; contain-intrinsic-size: 0 2000px; (post_reader_screen.dart:179-182). That CSS feature only helps when applied to many small sections so the engine can skip rendering the off-screen ones — on one wrapper div it renders everything the moment any part is visible, and the 2000px size guess can cause layout jumps and scrollbar weirdness on long articles. Removing it (or applying it to the article&amp;rsquo;s child elements instead) is a two-line change.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Images have no lazy loading, so every image in the article loads and decodes eagerly. Feed HTML arrives without loading=&amp;ldquo;lazy&amp;rdquo; or decoding=&amp;ldquo;async&amp;rdquo; attributes, and JavaScript is disabled in the WebView so nothing adds them. Decoding several large images while you scroll is a classic source of exactly the choppiness you describe. Since the app already assembles the HTML string, it could rewrite &amp;lt;img tags to add those attributes before loading — both work in the Android WebView engine even with JS disabled. Images also arrive without dimensions, so the page reflows as each one loads; that&amp;rsquo;s harder to fix fully, but lazy loading confines it to the part you&amp;rsquo;re actually reading.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The platform-view rendering mode. The WebView renders through Flutter&amp;rsquo;s platform-view compositing, and Android has two modes with very different scroll-performance profiles (texture-layer vs. hybrid composition). The app currently uses the default. Toggling displayWithHybridComposition in the WebViewWidget creation params is a small experiment that sometimes transforms scroll smoothness on particular devices — worth trying if 1 and 2 aren&amp;rsquo;t enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The bigger option: drop the WebView for native rendering with something like flutter_widget_from_html. Scrolling becomes a native Flutter list — generally the smoothest outcome and it would also fix the WebView&amp;rsquo;s other quirks — but it&amp;rsquo;s a real feature change with its own rendering trade-offs (complex embeds, tables, code blocks may render differently), so I&amp;rsquo;d only go there if the cheap fixes disappoint.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My recommendation: try 1 + 2 first — they&amp;rsquo;re small, low-risk, and directly target &amp;ldquo;choppy with images&amp;rdquo; and &amp;ldquo;choppy when long&amp;rdquo;. Then evaluate on your device, and escalate to 3 or 4 only if needed. Want me to design and implement those first two?&lt;/p&gt;

  &lt;/blockquote&gt;
&lt;/details&gt;

&lt;p&gt;Option 2 and 4 were no-gos, and option 1 is essentially undoing an attempted fix by Opus, which was amusing. But what looked interesting was option 3, which Opus never brought up. I ended up going with that and option 1, and it seemed to have done the job. Scrolling is… well, I wouldn&amp;rsquo;t say it&amp;rsquo;s buttery smooth, but it&amp;rsquo;s significantly improved. I&amp;rsquo;ve been trying it for a few hours and I&amp;rsquo;m no longer experiencing any jank.&lt;/p&gt;
&lt;p&gt;So the stories of Fable being a more capable model are definitely true.&lt;/p&gt;
&lt;p&gt;As for the rest of the tool, it&amp;rsquo;s coming along. I&amp;rsquo;ve asked Claude to clean up the handling of &amp;ldquo;Mark as Read&amp;rdquo; in the feed viewer. Prior to today, opening an item would start a 1 second timer before marking the item as read. Moving away prior to the timer timing-out would cancel this. This was functionality I requested, as it was a way of allowing me to quickly &amp;ldquo;peak&amp;rdquo; at an item without changing its read status. But this delay turned out to be more trouble than it&amp;rsquo;s worth though. If you time your actions right, you can actually hit the &amp;ldquo;Mark as Read&amp;rdquo; button at the same time the app tries to change the read status itself. This induces a conflict of some sort, and the screen goes blank, requiring a restart of the app. Now, items are marked to be read immediately.&lt;/p&gt;
&lt;p&gt;But the biggest change was adding a way to make a Micro.blog post about the item from within the app. This was lifted wholesale from Inkwell, and supports features like pre-populating the link with the page title, and including any selected text in the quote as a block quote. It&amp;rsquo;s also possible to set a prefix that&amp;rsquo;ll appear just before the link (I usually use the link emoji for this) and a post category. And despite some funky selection behaviour in the web-view, it works well enough.&lt;/p&gt;
&lt;figure&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260715-221242.png&#34; width=&#34;600&#34; height=&#34;383&#34; alt=&#34;Auto-generated description: Three smartphone screens show a note-taking app with a text about the EP-1320 Medieval, a post creation interface with typed text, and the app settings for posting to a blog.&#34;&gt;
&lt;figcaption&gt;From left to right: the &#34;New Post&#34; menu item, the post authoring screen, and the settings screen.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Oh, and I would say it&amp;rsquo;s still pretty amazing being able to vibe-code most of this directly from my phone. The agent does the work, then pushes it to Forejo as a PR, which kicks off a build of an APK, which I can download and install directly onto my phone. I&amp;rsquo;m not looking forward to Google&amp;rsquo;s locking down this form of side-loading in any capacity.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Vibelog: Weatherpatch - UI Improvement</title>
      <link>https://lmika.org/2026/07/04/vibelog-weatherpatch-ui-improvement.html</link>
      <pubDate>Sat, 04 Jul 2026 16:13:28 +1000</pubDate>
      
      <guid>http://lmika.micro.blog/2026/07/04/vibelog-weatherpatch-ui-improvement.html</guid>
      <description>&lt;p&gt;A few weeks ago, I vibe-coded a web-app called Weatherpatch. This is an app that is designed to receive email newsletters and produce them as an RSS feeds: basically what Feedbin does, but without needing to use Feedbin. The app was vibe-coded with Opus, and while functional, it is hardly an example of good design (unless you&amp;rsquo;re a fan of Cubism). To wit:&lt;/p&gt;
&lt;img src=&#34;https://cdn.uploads.micro.blog/25293/2026/out-20260704-155830.png&#34; width=&#34;600&#34; height=&#34;455&#34; alt=&#34;Auto-generated description: A user interface displays an inbound email address for subscribing to newsletters and options to manage feeds, including renaming, deleting, and merging them.&#34;&gt;
&lt;p&gt;Yeah, Opus just threw the feed management controls all over the place. And I tolerated it for a time. I was more interested in having something functional, rather than pretty. But the thing about a bad UI is that it makes using the app feel bad. Sure I&amp;rsquo;m not in there managing feeds, but I would like to go in there are copy-paste the email address when setting a new one up.&lt;/p&gt;
&lt;p&gt;Seeing that Fable is available again (thanks, US government, I guess?) and that I haven&amp;rsquo;t given it a proper shakedown test last time, I figured it was worth throwing it at the problem, and seeing if it could fix the design Opus threw together. I also wanted to try out the &lt;a href=&#34;https://www.skills.sh/anthropics/skills/frontend-design&#34;&gt;frontend-design&lt;/a&gt; plugin. Here&amp;rsquo;s the initial prompt:&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;The UI design of this webapp is quite primitive. While functional it doesn&amp;rsquo;t make it pleasant to use. Can you propose an improved design? Don&amp;rsquo;t change the underlying technology: just the UI and styling.&lt;/p&gt;

  &lt;/blockquote&gt;
&lt;p&gt;It took a while, but came up with the following diagnosis:&lt;/p&gt;

&lt;details&gt;
  &lt;summary&gt;Fable&amp;rsquo;s diagnosis of the issue&lt;/summary&gt;
  &lt;p&gt;What makes the current UI feel primitive&lt;/p&gt;
&lt;p&gt;Looking at the templates, three things stand out:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;It&amp;rsquo;s stock Pico. Default palette, default type — it looks like every Pico demo, with no identity of its own.&lt;/li&gt;
&lt;li&gt;Every feed card shows its full management UI all the time. Each card carries a rename input, rename button, delete button, merge dropdown, and merge button — with ten feeds that&amp;rsquo;s fifty always-visible controls for actions you perform maybe once a month. The thing you actually want from a feed (its URL) is buried among them.&lt;/li&gt;
&lt;li&gt;Raw 60-character URLs dominate every card. The random slugs are unguessable by design, which means they&amp;rsquo;re also unreadable — printing them in full conveys nothing.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Proposed direction: &amp;ldquo;Synoptic chart&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The name weatherpatch is a gift — the app is essentially a weather station for newsletters, with feeds as stations reporting in. The direction leans into meteorological chart vernacular, kept quiet and instrument-like, since this is a tool you visit briefly, not a marketing page.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Palette — cool &amp;ldquo;chart paper&amp;rdquo; background (#F4F7F6), slate ink (#22303A), isobar blue for links (#33636F), and one accent: RSS orange (#D95B10). The orange is subject-grounded — the whole point of the app is producing RSS — and it&amp;rsquo;s used sparingly: the logo dot, the copy button, focus rings, the RSS chip.&lt;/li&gt;
&lt;li&gt;Type — IBM Plex Sans for UI, IBM Plex Mono for everything machine-ish: the inbound address, URLs, section labels. Monospace is load-bearing here, not decorative — the app&amp;rsquo;s most characteristic artifacts are random strings. (In production I&amp;rsquo;d embed the woff2 files in static/ alongside the CSS so the single-binary, no-CDN property holds; system-font fallbacks if you&amp;rsquo;d rather add zero bytes.)&lt;/li&gt;
&lt;li&gt;Signature element — the inbound address as a station call-sign: a hero panel at the top of the dashboard with the address in large mono type, one prominent &amp;ldquo;Copy address&amp;rdquo; button, and a faint set of isobar contour lines etched behind it (inline SVG, centre labelled &amp;ldquo;1013&amp;rdquo;). One place of boldness; everything else stays disciplined.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The UX changes (bigger win than the styling)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Progressive disclosure. Rename/merge/delete move behind a native &amp;lt;details&amp;gt; &amp;ldquo;Manage&amp;rdquo; disclosure per card — no JavaScript needed, and each card collapses to one line: title + two chips.&lt;/li&gt;
&lt;li&gt;URLs become copy chips. RSS and JSON chips copy the URL on click (your existing data-copy handler works unchanged — the chips just carry the attribute). The full URLs remain visible as plain links inside the Manage panel for the times you want to open or inspect them. Copying is the primary use of a feed URL, so it gets the primary affordance.&lt;/li&gt;
&lt;li&gt;A real empty state and a properly styled login card with a styled error alert (currently an inline style=&amp;ldquo;color:#b00020&amp;rdquo;).&lt;/li&gt;
&lt;li&gt;Microcopy tightened throughout: &amp;ldquo;Give this address to every newsletter you subscribe to. New senders show up below as feeds.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What stays and what changes&lt;/p&gt;
&lt;p&gt;Everything server-side stays as-is: Go templates, Fiber, embedded assets, POST-redirect-GET forms, app.js patterns. The change is replacing pico.min.css (~80 KB) with a hand-rolled weatherpatch.css (~8 KB) — same delivery mechanism, and at three pages the custom stylesheet is small enough to own outright. Template edits are modest (the &amp;lt;details&amp;gt; structure, chips, hero panel).&lt;/p&gt;
&lt;p&gt;Two optional extras that would touch Go code lightly (no technology change, just flagging since you said UI-only): per-feed item count and last-received date — the data is already in SQLite and would make the dashboard feel like stations actually reporting — and a favicon route using the RSS-arcs logo mark.&lt;/p&gt;
&lt;/details&gt;

&lt;p&gt;It also produced a mockup in a static HTML file, which was quite an improvement over what was there. I then went back and forth with it a couple of times, asking it to move command arguments to modals, and have it produce a mock with more than a handful of items:&lt;/p&gt;

  &lt;blockquote&gt;
    &lt;p&gt;Okay, that&amp;rsquo;s a good start. I do wonder if it&amp;rsquo;d be worth merging the actions onto a single line. Maybe have &amp;ldquo;Rename, Merge&amp;rdquo; on the left and &amp;ldquo;Delete&amp;rdquo; on the right. The Rename and Merge buttons will display modal dialogs prompting for the input: a text field rename, and a select list (not a drop-down) for the merge. Delete will be on the right, and show a confirmation dialog as a modal. Use HTML dialog elements for this. Add any JavaScript you need, but keep it vanilla JavaScript.&lt;/p&gt;
&lt;p&gt;[…]&lt;/p&gt;
&lt;p&gt;Can you demonstrate how this would look with 30 feeds? I just want to make sure the Merge feed can handle that many feed items in the modal. I&amp;rsquo;m think we need to make sure the list doesn&amp;rsquo;t grow too large.&lt;/p&gt;

  &lt;/blockquote&gt;
&lt;p&gt;I include in this gallery various screenshots in how the mocks evolved during this time.&lt;/p&gt;
&lt;div class=&#34;img-gallery&#34;&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160119.png&#34;
     
        alt=&#34;Auto-generated description: A dashboard interface for managing email subscription feeds, showing an inbound address, active feeds with options to manage, merge, rename, or delete them, and buttons to copy the address or view feed formats in RSS and JSON.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  First version of the mock which, while prettier, was quite similar to the old UI in that the controls were just present on each card.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160143.png&#34;
     
        alt=&#34;Auto-generated description: A dashboard interface displays an inbound email address with options to copy it and manage multiple newsletter feeds through RSS and JSON formats, including features to rename, merge, or delete them.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  The mock after I asked Claude to place input items in modals.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160151.png&#34;
     
        alt=&#34;Auto-generated description: A dashboard interface for weatherpatch shows an inbound email address and multiple newsletter feeds, with a pop-up window to rename the Money Stuff feed.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  The rename modal.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160204.png&#34;
     
        alt=&#34;Auto-generated description: A web interface shows a Merge feed popup window allowing the user to move everything from the Money Stuff feed to one of three other feeds: Golang Weekly, The Sizzle, or Hacker Newsletter, with options to cancel or merge.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  The merge feed modal.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160212.png&#34;
     
        alt=&#34;Auto-generated description: A dashboard interface is shown with an inbound address, multiple active feeds listed, and a confirmation popup for deleting the Money Stuff feed.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  The delete confirmation modal, which previously used the browser&amp;amp;#39;s &amp;amp;#39;confirm&amp;amp;#39; function.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;figure&gt;
&lt;img src=&#34;https://lmika.org/uploads/2026/out-20260704-160407.png&#34;
     
        alt=&#34;Auto-generated description: A user interface displays a feed merging option where the Money Stuff feed can be merged into another selected feed from a list.&#34; 
     
      /&gt;

  &lt;figcaption&gt;
  
  A modified merge feed modal after I asked Claude to consider a large number of feeds.
  &lt;/figcaption&gt;

&lt;/figure&gt;
&lt;/div&gt;
&lt;p&gt;After about half an hour of this, it was good enough to get Claude to implement it. I deployed the changes, and now the UI looks pretty decent.&lt;/p&gt;
&lt;p&gt;So all in all, I&amp;rsquo;m impressed. I would like to know how much of this was down to Fable, and how much of it was the frontend-design plugin. I don&amp;rsquo;t expect to be using Fable often, given how expensive it is. But for a large job like this, it did a good job.&lt;/p&gt;
</description>
    </item>
    
    <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>