<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Billie M</title>
    <description>The latest articles on DEV Community by Billie M (@billiem).</description>
    <link>https://dev.to/billiem</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4026133%2F5dd55f62-43ed-45e3-b3bc-98692f37a24d.gif</url>
      <title>DEV Community: Billie M</title>
      <link>https://dev.to/billiem</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/billiem"/>
    <language>en</language>
    <item>
      <title>Put your side project on the map for free</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Tue, 20 Oct 2026 23:19:26 +0000</pubDate>
      <link>https://dev.to/billiem/put-your-side-project-on-the-map-for-free-efh</link>
      <guid>https://dev.to/billiem/put-your-side-project-on-the-map-for-free-efh</guid>
      <description>&lt;p&gt;A website locator can look like a small job: a map, three markers and a popup. Choosing a JavaScript library settles only part of it. The streets and labels must come from somewhere, your places need their own data, and the page needs a host. Someone also has to keep the places up to date.&lt;/p&gt;

&lt;p&gt;Those decisions lead to three useful free routes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;If the work is mainly…&lt;/th&gt;
&lt;th&gt;A complete starting route&lt;/th&gt;
&lt;th&gt;What remains yours to arrange&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Adding a locator to a website&lt;/td&gt;
&lt;td&gt;Leaflet + a suitable background tile service&lt;/td&gt;
&lt;td&gt;The page, data, interactions and website hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Styling geographic information and filtering layers&lt;/td&gt;
&lt;td&gt;MapLibre GL JS + OpenFreeMap&lt;/td&gt;
&lt;td&gt;The page, your data and layer code, and website hosting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintaining a collection through graphical controls&lt;/td&gt;
&lt;td&gt;uMap on a public community host&lt;/td&gt;
&lt;td&gt;The places, descriptions, permissions and a backup&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Here is what each route supplied in a small checked example, and which conditions change the choice. Documentation, service conditions and representative browser workflows were checked on &lt;strong&gt;20 October 2026&lt;/strong&gt;. The Leaflet and MapLibre examples ran locally; they were not publicly deployed. The uMap example was a private editor workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leaflet: when the map belongs inside your page
&lt;/h2&gt;

&lt;p&gt;For a page with a place list beside a map, &lt;a href="https://leafletjs.com/" rel="noopener noreferrer"&gt;Leaflet&lt;/a&gt; gives you markers, popups and the interactions between them. It does not supply a graphical place editor or a background service.&lt;/p&gt;

&lt;p&gt;The checked pairing was &lt;strong&gt;Leaflet 1.9.4 with OSMF's Standard raster tile service&lt;/strong&gt;. The service supplies finished background images; Leaflet draws the places over them. In the local example, a visitor could open a place from either a marker or the list.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr005j2s87c4tjlqoswt0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr005j2s87c4tjlqoswt0.jpg" alt="A local Leaflet page shows three markers over London streets, with the British Library's popup open." width="720" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Leaflet 1.9.4 supplies the markers and popup; OSMF's Standard raster service supplies the background. Local demonstration with map data © OpenStreetMap contributors, ODbL.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Map credit: &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;© OpenStreetMap contributors, ODbL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://leafletjs.com/examples/quick-start/" rel="noopener noreferrer"&gt;Leaflet quick start&lt;/a&gt; covers the CSS, JavaScript, a map container with a height, and a tile layer. Its &lt;a href="https://leafletjs.com/examples/geojson/" rel="noopener noreferrer"&gt;GeoJSON guide&lt;/a&gt; covers bringing feature properties into popups. The same format can carry a trail or boundary as well as points.&lt;/p&gt;

&lt;p&gt;For this route, your HTML, CSS, JavaScript and data belong together on your website. Develop over HTTP too: opening an HTML file directly is a poor check when the page fetches a separate data file. To change the places, edit that file or provide your own editing workflow.&lt;/p&gt;

&lt;p&gt;The background service has a separate contract. Under OSMF's &lt;a href="https://operations.osmfoundation.org/policies/tiles/" rel="noopener noreferrer"&gt;tile-use policy&lt;/a&gt;, ordinary interactive viewing needs visible attribution, normal browser identification and referrers, and proper caching. Keep browser defaults. Do not suppress referrers, bypass caching, bulk-download the tiles or add offline saving. This is a best-effort service that can block access, rather than a hosting guarantee.&lt;/p&gt;

&lt;p&gt;That pairing suits the modest example. If a project needs other traffic allowances or support, select a background provider that offers them, changing its URL and credits together. Keep a persistent link to &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;OpenStreetMap's contributors and data licence&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  MapLibre: when properties should change the drawing
&lt;/h2&gt;

&lt;p&gt;The next route earns its extra setup when styling and layers are part of the project. &lt;a href="https://maplibre.org/maplibre-gl-js/docs/" rel="noopener noreferrer"&gt;MapLibre GL JS&lt;/a&gt; draws vector backgrounds in the browser from geographic features and style rules. &lt;a href="https://openfreemap.org/quick_start/" rel="noopener noreferrer"&gt;OpenFreeMap&lt;/a&gt; supplies a background service to pair with it.&lt;/p&gt;

&lt;p&gt;The local example used &lt;strong&gt;MapLibre GL JS 6.15.0 and OpenFreeMap's Liberty style&lt;/strong&gt;. The places were a separate GeoJSON source and circle layer. A category property controlled their colours, while a filter selected which places remained visible.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl28lvq4yzi4f31zg3we2.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl28lvq4yzi4f31zg3we2.jpg" alt="The MapLibre example has Libraries selected and reports one place shown, with the British Library popup over the OpenFreeMap background." width="720" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The same collection, filtered to its Library category in MapLibre GL JS 6.15.0. Background: OpenFreeMap Liberty, © OpenMapTiles, data from OpenStreetMap. The filter is code in this local example.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Background credits: &lt;a href="https://openfreemap.org/" rel="noopener noreferrer"&gt;OpenFreeMap&lt;/a&gt;, &lt;a href="https://openmaptiles.org/" rel="noopener noreferrer"&gt;© OpenMapTiles&lt;/a&gt;, &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;data from OpenStreetMap&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The three places are the British Museum, British Library and Wellcome Collection. Selecting &lt;strong&gt;Libraries&lt;/strong&gt; leaves one point; &lt;strong&gt;Museums&lt;/strong&gt; leaves two. Wellcome Collection also has a library, but belongs to the museum category in this demonstration. Three points demonstrate that the styling and filtering work here; they establish nothing about large-data performance.&lt;/p&gt;

&lt;p&gt;The official &lt;a href="https://maplibre.org/maplibre-gl-js/docs/examples/draw-geojson-points/" rel="noopener noreferrer"&gt;GeoJSON point&lt;/a&gt; and &lt;a href="https://maplibre.org/maplibre-gl-js/docs/examples/filter-within-a-layer/" rel="noopener noreferrer"&gt;layer-filter&lt;/a&gt; examples explain the source/layer approach, which also supports geographic lines and polygons.&lt;/p&gt;

&lt;p&gt;Use the current &lt;a href="https://maplibre.org/maplibre-gl-js/docs/" rel="noopener noreferrer"&gt;installation documentation&lt;/a&gt; rather than an older global-script snippet: version 6 uses ES modules and workers, and 6.15.0 requires working WebGL2. Check the background URL when borrowing an example too. Some official examples use a different provider that needs a key.&lt;/p&gt;

&lt;p&gt;At the check date, OpenFreeMap offered its public service without an account or API key, including commercial use, and advertised no cap on ordinary map views or requests. It has &lt;strong&gt;no SLA&lt;/strong&gt;. Its &lt;a href="https://openfreemap.org/tos/" rel="noopener noreferrer"&gt;terms&lt;/a&gt; distinguish normal viewing from automated collection and offline downloads. Keep the supplied &lt;a href="https://github.com/hyperknot/openfreemap#attribution" rel="noopener noreferrer"&gt;OpenMapTiles and OpenStreetMap attribution&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;OpenFreeMap hosts the background. Your website still hosts the page and your places; neither service gives this route uMap's graphical editing controls.&lt;/p&gt;

&lt;h2&gt;
  
  
  uMap: when maintaining the collection is the main job
&lt;/h2&gt;

&lt;p&gt;Code is not necessary just to keep a places guide current. &lt;a href="https://umap.openstreetmap.fr/en/" rel="noopener noreferrer"&gt;uMap on OpenStreetMap France&lt;/a&gt; supplies a hosted editor with markers, descriptions, popups, layers and sharing settings. You can add places directly or import a file.&lt;/p&gt;

&lt;p&gt;The same three-place collection was imported as GeoJSON into an editable layer:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx0qs421wf5bz3tlodlvk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx0qs421wf5bz3tlodlvk.jpg" alt="uMap's expanded places layer lists British Library, British Museum and Wellcome Collection, with table, layer and feature editing controls." width="385" height="230"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Detail of the imported three-place layer in uMap France’s editor. Map data © OpenStreetMap contributors, ODbL. This is not a published visitor view.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Map credit: &lt;a href="https://www.openstreetmap.org/copyright" rel="noopener noreferrer"&gt;© OpenStreetMap contributors, ODbL&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Create a map, add or import the places, name the layer, check a popup and save. Separate layers can distinguish groups that visitors should browse independently. uMap supports &lt;a href="https://discover.umap-project.org/support/advanced/" rel="noopener noreferrer"&gt;CSV and several geographic formats&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;On this host, an anonymous map could be saved as &lt;strong&gt;Draft (private)&lt;/strong&gt; without an account. Its &lt;strong&gt;secret edit link&lt;/strong&gt; is the recovery dependency: keep it safe. The inspected anonymous viewing options were private draft or public. Broader software documentation does not establish unlisted anonymous sharing on every host.&lt;/p&gt;

&lt;p&gt;Check viewing permission and editing permission separately before publishing. The &lt;a href="https://discover.umap-project.org/fr/tutorials/7-publishing-and-permissions/" rel="noopener noreferrer"&gt;publishing guide&lt;/a&gt; covers public sharing and iframe embedding. With an embed, uMap hosts the map and your page contains it. Export a backup too: a full uMap backup preserves more of the project than a plain GeoJSON export of its features.&lt;/p&gt;

&lt;p&gt;“Free” remains specific to the host and the background. &lt;a href="https://www.openstreetmap.fr/usage/" rel="noopener noreferrer"&gt;OSM France's tile-service conditions&lt;/a&gt; require public, nonprofit use and moderate traffic, with limited tolerance for low-volume company sites. Those conditions govern background services; they are not a complete uMap hosting contract or a promise of unlimited storage and permanent hosting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the places portable, then publish the page
&lt;/h2&gt;

&lt;p&gt;All three examples used approximate venue points from Wikidata's records for the &lt;a href="https://www.wikidata.org/wiki/Q25575259" rel="noopener noreferrer"&gt;British Museum&lt;/a&gt;, &lt;a href="https://www.wikidata.org/wiki/Q23308" rel="noopener noreferrer"&gt;British Library&lt;/a&gt; and &lt;a href="https://www.wikidata.org/wiki/Q7981191" rel="noopener noreferrer"&gt;Wellcome Collection&lt;/a&gt;. They represent venues, rather than entrances or an itinerary. Wikidata's structured data is &lt;a href="https://www.wikidata.org/wiki/Wikidata:Licensing" rel="noopener noreferrer"&gt;CC0&lt;/a&gt;; the background has its own credits.&lt;/p&gt;

&lt;p&gt;Keep that information in a separate source file. CSV can hold a small list of names and coordinates. GeoJSON adds points, lines, polygons and properties, with &lt;strong&gt;longitude, latitude&lt;/strong&gt; coordinate order. Direct Leaflet marker calls take &lt;strong&gt;latitude, longitude&lt;/strong&gt;, so copying a pair between them needs a check.&lt;/p&gt;

&lt;p&gt;An address column does not become a map point automatically. Supply coordinates, place markers yourself, or check a separate geocoding step. uMap's &lt;a href="https://discover.umap-project.org/fr/tutorials/9-map-from-spreadsheet/" rel="noopener noreferrer"&gt;spreadsheet tutorial&lt;/a&gt; explains the distinction; its complete version is currently in French. Background maps also do not supply directions or live information. The &lt;a href="https://billiem.uk/posts/free-apis-for-side-projects/" rel="noopener noreferrer"&gt;free-APIs guide&lt;/a&gt; covers possible data and service ingredients, including postcode coordinates and route calculation.&lt;/p&gt;

&lt;p&gt;For the two code routes, an existing static website can host the page and data. Another option is &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/what-is-github-pages" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;, free from a &lt;strong&gt;public repository on GitHub Free&lt;/strong&gt;. It needs a GitHub account, makes the page and published data public, and provides a &lt;code&gt;github.io&lt;/code&gt; address without buying a domain.&lt;/p&gt;

&lt;p&gt;Keep &lt;code&gt;index.html&lt;/code&gt;, CSS, JavaScript and GeoJSON together with their relative paths intact. In &lt;strong&gt;Settings → Pages&lt;/strong&gt;, &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site" rel="noopener noreferrer"&gt;choose “Deploy from a branch”&lt;/a&gt; and select the branch and root folder containing the page. The &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/creating-a-github-pages-site" rel="noopener noreferrer"&gt;creation guide&lt;/a&gt; gives the full flow. This publishing route was documentation-checked, not deployed for these examples.&lt;/p&gt;

&lt;p&gt;Pages has &lt;a href="https://docs.github.com/en/pages/getting-started-with-github-pages/github-pages-limits" rel="noopener noreferrer"&gt;usage limits&lt;/a&gt;, including a 1 GB published-site limit, and is not offered to run an online business, e-commerce site or commercial SaaS. A business locator may belong on its existing business host. Later backend needs such as functions, VMs and databases are covered in the &lt;a href="https://billiem.uk/free-compute/" rel="noopener noreferrer"&gt;Free Compute guide&lt;/a&gt;; serving your page remains a different job from serving the world's background tiles.&lt;/p&gt;

&lt;p&gt;For a small collection, the maintenance choice is quite concrete: edit through uMap's browser controls, keep a Leaflet locator in your website code, or use MapLibre layers when properties should drive appearance and filtering. Keep the source file, check each place, and preserve the credits whichever route you take.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/free-maps/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>opensource</category>
      <category>maps</category>
    </item>
    <item>
      <title>Free datasets worth building something around</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Tue, 20 Oct 2026 23:19:09 +0000</pubDate>
      <link>https://dev.to/billiem/free-datasets-worth-building-something-around-m7d</link>
      <guid>https://dev.to/billiem/free-datasets-worth-building-something-around-m7d</guid>
      <description>&lt;p&gt;Cricsheet’s women’s Hundred download was 716 kB when checked. Extracting it produced 188 match files, totalling 13.39 MB of JSON. One inspected match was about 75 kB.&lt;/p&gt;

&lt;p&gt;For a match replay, those are useful distinctions: the competition archive supplies the material, but one match can be the first thing someone opens. A small index could offer the choice without loading every delivery at once.&lt;/p&gt;

&lt;p&gt;Other collections suggest different first versions. A railway explorer starts with a station row spread across financial years. A place-name finder needs to distinguish two Newports. A property-price browser needs to keep a sale record separate from the idea of a permanent property record.&lt;/p&gt;

&lt;p&gt;Here are four downloadable sources with those decisions attached. Publisher documentation and representative files were checked on &lt;strong&gt;20 October 2026&lt;/strong&gt;. The projects are suggestions, not completed applications; file inspection establishes neither browser performance nor the correctness of an eventual chart or replay. All sizes below describe the checked files and use decimal kB and MB.&lt;/p&gt;

&lt;h2&gt;
  
  
  A cricket replay: load a match, then understand its deliveries
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://cricsheet.org/downloads/" rel="noopener noreferrer"&gt;Cricsheet&lt;/a&gt; supplies match metadata, innings and deliveries. Its checked &lt;a href="https://cricsheet.org/downloads/hnd_female_json.zip" rel="noopener noreferrer"&gt;women’s Hundred JSON bundle&lt;/a&gt; contained &lt;strong&gt;188 matches from 2021–2026&lt;/strong&gt;. That gives a season archive a possible match list, and a replay a smaller first payload.&lt;/p&gt;

&lt;p&gt;The interesting interface could step through an innings, showing the batter, bowler and changing score. Getting the file into memory is only the beginning of that work.&lt;/p&gt;

&lt;p&gt;Read the &lt;a href="https://cricsheet.org/format/json/" rel="noopener noreferrer"&gt;JSON format documentation&lt;/a&gt; before deciding how to walk the nested delivery records. Keep the data version, use the supplied player IDs when connecting matches, and read &lt;code&gt;balls_per_over&lt;/code&gt; from the file. This Hundred sample uses &lt;strong&gt;five-ball groups&lt;/strong&gt;. Extras and delivery ordering matter to score calculations too: a JSON parser accepting a file says nothing about whether the replay has cricket scoring right.&lt;/p&gt;

&lt;p&gt;There are two other boundaries worth keeping with the match selector. Cricsheet’s &lt;a href="https://cricsheet.org/coverage/" rel="noopener noreferrer"&gt;coverage pages&lt;/a&gt; describe gaps and withheld matches, so the downloaded collection is not a promise of complete coverage. Files can also be revised; keep their version and revision with the retrieval date.&lt;/p&gt;

&lt;p&gt;For reuse, consult the &lt;a href="https://cricsheet.org/licensing/" rel="noopener noreferrer"&gt;licensing page&lt;/a&gt; for the format actually downloaded. The main JSON data uses &lt;strong&gt;Open Data Commons Attribution&lt;/strong&gt;; the XML match data uses &lt;strong&gt;CC BY 4.0&lt;/strong&gt;. Preserve the archive’s notices and give the required source and licence credit.&lt;/p&gt;

&lt;h2&gt;
  
  
  A station history: keep the year labels and the gaps
&lt;/h2&gt;

&lt;p&gt;For a railway-station explorer, start with the &lt;a href="https://dataportal.orr.gov.uk/media/1908/table-1415-time-series-of-passenger-entries-and-exits-and-interchanges-by-station.ods" rel="noopener noreferrer"&gt;Office of Rail and Road’s Table 1415 historical ODS workbook&lt;/a&gt;. The checked &lt;strong&gt;1.52 MB&lt;/strong&gt; file has &lt;strong&gt;28 financial-year columns, from 1997/98 to 2024/25&lt;/strong&gt;, for &lt;strong&gt;Great Britain&lt;/strong&gt;. Entries/exits and interchanges occupy separate sheets.&lt;/p&gt;

&lt;p&gt;That is a different starting point from Table 1410’s latest-year CSV. One station row from Table 1415 can supply a history view, with the financial-year labels doing visible work in the interface.&lt;/p&gt;

&lt;p&gt;Keep the workbook’s &lt;code&gt;Cover_sheet&lt;/code&gt; close during extraction. It explains station names, three-letter codes, National Location Codes and geographic fields. Codes need to remain text, and historical rows can have absent identifiers. A checked filter for the workbook’s current Wales region produced 223 rows in each sheet, but left out old records with unavailable region information. A regional filter is a slice with that limitation, not an assurance of a complete regional history.&lt;/p&gt;

&lt;p&gt;The values also need more than a numeric conversion. &lt;strong&gt;&lt;code&gt;[x]&lt;/code&gt; means unavailable; &lt;code&gt;[z]&lt;/code&gt; means inapplicable.&lt;/strong&gt; Preserve those as gaps. The collection estimates station use, mainly from ticketing data: repeated journeys count, and the figures do not deduplicate people. Methodology changes can break comparisons between years. Put the workbook notes and the quality report linked from the &lt;a href="https://dataportal.orr.gov.uk/statistics/usage/estimates-of-station-usage/" rel="noopener noreferrer"&gt;collection page&lt;/a&gt; within reach of any chart.&lt;/p&gt;

&lt;p&gt;This is annual historical data, so display the covered year. ORR’s &lt;a href="https://www.orr.gov.uk/terms-and-conditions" rel="noopener noreferrer"&gt;reuse terms&lt;/a&gt; apply OGL with exceptions for identified third-party material and logos; the checked workbook had no separate internal licence notice. Keep the credit and definitions with the extracted table.&lt;/p&gt;

&lt;h2&gt;
  
  
  A place-name finder: the label is not the key
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.geonames.org/export/" rel="noopener noreferrer"&gt;GeoNames&lt;/a&gt; gives a place-search project coordinates, names, feature types and administrative codes. The smaller &lt;a href="https://download.geonames.org/export/dump/cities15000.zip" rel="noopener noreferrer"&gt;&lt;code&gt;cities15000.zip&lt;/code&gt;&lt;/a&gt; is a useful first download: &lt;strong&gt;3.36 MB compressed&lt;/strong&gt;, containing &lt;strong&gt;8.54 MB of headerless, tab-delimited UTF-8 text&lt;/strong&gt;. The &lt;a href="https://download.geonames.org/export/dump/readme.txt" rel="noopener noreferrer"&gt;README&lt;/a&gt; supplies its 19-column order.&lt;/p&gt;

&lt;p&gt;The filename needs a little explanation in a project's scope note. The extract includes capitals below its population threshold; it is a selected populated-place collection, not every village.&lt;/p&gt;

&lt;p&gt;A checked &lt;code&gt;GB&lt;/code&gt; filter, joined to region display names from &lt;a href="https://download.geonames.org/export/dump/admin1CodesASCII.txt" rel="noopener noreferrer"&gt;&lt;code&gt;admin1CodesASCII.txt&lt;/code&gt;&lt;/a&gt;, produced &lt;strong&gt;866 records in 187 kB of JSON&lt;/strong&gt;. There is more than one Newport and Bangor in the sample. Use &lt;code&gt;geonameid&lt;/code&gt; for identity and display the region with the name, so a search result has enough context to be selectable.&lt;/p&gt;

&lt;p&gt;Latitude, longitude and time zone can fill out a place card. Population can help select a quiz pool, with one important qualification: a record’s modification date does not establish when its population was measured. The basic alternate-names field is comma-separated; language-aware name handling needs a separate table if that field is insufficient.&lt;/p&gt;

&lt;p&gt;The main gazetteer uses &lt;strong&gt;CC BY 4.0&lt;/strong&gt;. Credit GeoNames, link the licence, describe the filtering or other changes, and preserve supplied source notices. Dumps regenerate daily. For a small static finder, replacing the chosen slice is one option before taking on the separate modification and deletion feeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  A local sale browser: import the export you actually requested
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.gov.uk/government/statistical-data-sets/price-paid-data-downloads" rel="noopener noreferrer"&gt;HM Land Registry Price Paid Data&lt;/a&gt; covers recorded transactions in &lt;strong&gt;England and Wales&lt;/strong&gt;, with standard-category history from 1995. A small interface could offer year and property-type filters, price sorting and address inspection.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://landregistry.data.gov.uk/app/ppd/" rel="noopener noreferrer"&gt;official report builder&lt;/a&gt; gives that project a convenient first slice. Choose a postcode prefix and completion-date range, request &lt;strong&gt;all results&lt;/strong&gt;, and download &lt;strong&gt;CSV with headers&lt;/strong&gt;. A checked &lt;strong&gt;PL20, calendar-2024&lt;/strong&gt; export contained &lt;strong&gt;169 transactions in 44 kB&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Parse this file by its supplied headers, including &lt;code&gt;price_paid&lt;/code&gt;, &lt;code&gt;deed_date&lt;/code&gt;, &lt;code&gt;property_type&lt;/code&gt; and address components. Its column order differs from the bulk CSV files. The &lt;a href="https://www.gov.uk/guidance/about-the-price-paid-data" rel="noopener noreferrer"&gt;bulk field guidance&lt;/a&gt; is useful when expanding the project, but a national annual split can still be tens of megabytes.&lt;/p&gt;

&lt;p&gt;Keep the record’s meaning visible in the application. The transaction ID identifies a sale, not a permanent property key for connecting successive sales. Recent registrations are incomplete, records can be corrected, historical addresses can differ, and some transfers are excluded. A result list should remain a view of recorded transactions rather than a claim to show every sale.&lt;/p&gt;

&lt;p&gt;The reuse decision affects the project too. HMLR uses &lt;strong&gt;OGL v3.0&lt;/strong&gt;, with attribution specified on its download page, but embedded address fields have additional Royal Mail and Ordnance Survey conditions. The notice expressly permits display for residential property-price information services; other address uses may need separate permission.&lt;/p&gt;

&lt;p&gt;One match, one station, a country-filtered place list or a postcode-and-year export gives each of these interfaces a manageable first subject. Keep the identifiers, gaps, source dates and credits alongside that slice when preparing it locally.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://billiem.uk/posts/free-datasets-for-side-projects/" rel="noopener noreferrer"&gt;full guide on billiem.uk&lt;/a&gt; also covers OurAirports and Natural Earth, including a small airport-record specimen and generalized map geometry. For wider collection browsing, &lt;a href="https://publicdatasets.dev/" rel="noopener noreferrer"&gt;Public Datasets&lt;/a&gt;, &lt;a href="https://github.com/awesomedata/awesome-public-datasets" rel="noopener noreferrer"&gt;Awesome Public Datasets&lt;/a&gt; and &lt;a href="https://petergpt.github.io/100-datasets/" rel="noopener noreferrer"&gt;100 Datasets&lt;/a&gt; already offer substantial discovery routes.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/free-datasets-for-side-projects/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>sideprojects</category>
      <category>opendata</category>
    </item>
    <item>
      <title>Three ideas, nine builds: GPT-6.1 Sol, Claude Opus 5.5 and Gemini Argon 4</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Tue, 20 Oct 2026 14:31:09 +0000</pubDate>
      <link>https://dev.to/billiem/three-ideas-nine-builds-gpt-61-sol-claude-opus-55-and-gemini-argon-4-13a4</link>
      <guid>https://dev.to/billiem/three-ideas-nine-builds-gpt-61-sol-claude-opus-55-and-gemini-argon-4-13a4</guid>
      <description>&lt;p&gt;The bell-ringing prototype I preferred was not the technical reviewer’s winner. Claude’s cascading timing challenge felt nicer to me; the review favoured Sol’s more reliable connection between the blows entered and the feedback returned.&lt;/p&gt;

&lt;p&gt;That disagreement is a useful way into these nine builds. GPT-6.1 Sol, Claude Opus 5.5 and Gemini 4 Argon each implemented the same three browser briefs: a gift sleeve, a bell-ringing practice room and a colour-context experiment. The differences are visible, but the most convincing interface is only one part of the result.&lt;/p&gt;

&lt;p&gt;All nine are public comparison prototypes. The &lt;a href="https://billiem.uk/posts/nine-choice-builds-three-ai-models/" rel="noopener noreferrer"&gt;original comparison on billiem.uk&lt;/a&gt; contains the fuller idea round and method; the links here open the working versions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ring: the preferred movement, the more reliable account
&lt;/h2&gt;

&lt;p&gt;In the ringing brief, six synthesised bells play in rows. You tap one bell’s part, follow a visible path, then try to manage without the guide. That leaves quite different things for a builder to emphasise: the timing interaction, the teaching or the record of what you actually struck.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-ring-opus/outputs/" rel="noopener noreferrer"&gt;Claude’s Ring&lt;/a&gt; had the movement I liked. The pattern cascades down the screen into a timing challenge. Claude’s interfaces and animations felt the cleanest in this batch, and this was a particularly clear example of the feel I preferred. The still below shows a real running stage; judging its movement needs the live version.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlxdu7ps0i984gn52sg6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmlxdu7ps0i984gn52sg6.png" alt="A vertical ladder of bell rows with a blue path, red missed marks, a place counter and a large Handstroke rope button." width="720" height="1706"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude’s Plain Hunt stage during an automated capture run with no rope taps. The missed marks are genuine; this still shows the cascading layout, not successful playing or a timing assessment.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-ring-sol/outputs/" rel="noopener noreferrer"&gt;Sol implementation&lt;/a&gt; is a smaller practice room. Its advantage in the Codex review was accounting: entered blows, fading assistance and final feedback stayed connected. Claude could react to extra pulls during play and then omit them from the final account. A pleasing challenge and an honest result are separate things to check.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4j385xt3jl6zy00m8u8t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4j385xt3jl6zy00m8u8t.png" alt="Bell 2 selected above pace and guide controls, a horizontal blue-line chart and a large Ring bell 2 button." width="720" height="1836"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sol’s Plain Hunt practice room before starting: setup, the full blue-line path and the strike button share one panel.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-ring-argon/outputs/" rel="noopener noreferrer"&gt;Gemini’s Ring&lt;/a&gt; takes the broader-console route. I found Gemini’s interfaces incredibly noisy, but the review’s objections went further: reversed dodge-direction teaching labels and an idealised blue line presented as the visitor’s performance, even after misses. Those are correctness problems, not a preference for one palette over another.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8g8ln39eii8qg6lfab8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8g8ln39eii8qg6lfab8.png" alt="Plain Hunt rows with red treble and blue method lines, a 100% look-ahead guide, legend and rolling-line view controls." width="720" height="1222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gemini’s ready-state method diagram layers notation, view choices, a guide meter and two labelled bell paths. No attempt has started.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-ring-sol/public/study-review" rel="noopener noreferrer"&gt;mapped Ring review&lt;/a&gt; explains those findings. Its browser and synthetic-performance checks do not establish that a person learned to ring, or that the sound is good. My reaction here concerns the interface and timing feel.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fold: the animation carries a personal reveal
&lt;/h2&gt;

&lt;p&gt;For the gift sleeve, the relationship between flat paper and finished shape matters. The brief also includes a message revealed on opening. A folding animation can show the object taking shape and make that reveal part of the experience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-fold-opus/outputs/" rel="noopener noreferrer"&gt;Claude’s Fold&lt;/a&gt; was far ahead for me. It wasn’t close. The review also preferred its connection between object dimensions, net, opening box and readable lid message. Here, the design preference and implementation review agreed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3acidznooacwmu2je7nb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3acidznooacwmu2je7nb.png" alt="An open brown box with Happy birthday! Open me gently printed inside its raised lid, above Unfold and Close it controls." width="720" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude’s box after moving the fold slider to the end and choosing Open it. The default message is visible inside the lid; this is the browser preview, not a made paper box.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-fold-sol/outputs/" rel="noopener noreferrer"&gt;Sol’s Fold&lt;/a&gt; is an approachable paper workshop, but its animation omits the message and actual slot insertion. It communicates the sleeve more fully than the personal opening moment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz9g3mvkripk827y4wx43.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz9g3mvkripk827y4wx43.png" alt="A pale green closed sleeve above a fold slider, approximate inside dimensions and a Print your pattern button." width="720" height="1051"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sol’s preview keeps the sleeve, fold control and print step together. Shown with the default dimensions; the digital view does not establish physical fit.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-fold-argon/outputs/" rel="noopener noreferrer"&gt;Gemini’s Fold&lt;/a&gt; offers linked geometric views, dimensions and plenty of controls. There is real material to inspect; it also gives the simple gift-wrapping activity a much noisier surface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2fklay382sm31l55oz3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm2fklay382sm31l55oz3.png" alt="A labelled 3D folding preview with red cut edges and blue fold lines above a flat sheet dieline and calibration markings." width="720" height="1681"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gemini’s default preview pairs the labelled folding geometry with its sheet dieline. The small print is shown for layout context, not as a usable print template.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-fold-sol/public/study-review" rel="noopener noreferrer"&gt;Fold review&lt;/a&gt; found practical defects in every version: stale browser printing in Claude, tiny accepted message text in Sol, and calibration or margin faults affecting Gemini’s pattern. No paper was printed and folded in that review. The best box experience is still not a physically proven box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blue: the interface can work while the payoff fails
&lt;/h2&gt;

&lt;p&gt;Blue Without Blue proposed a vivid blue-looking cloak that would reveal neutral grey through a pinhole. None of the three made the grey patch look blue to me.&lt;/p&gt;

&lt;p&gt;I probably preferred &lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-blue-sol/outputs/" rel="noopener noreferrer"&gt;Sol’s Blue&lt;/a&gt;, but only slightly. The picture, pinhole and paint activities are clear. It also adds unnecessary text and explanation. That is a tendency I have noticed with GPT models when given free rein beyond this batch too; it remains my reported impression, not a finding measured across models here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzwcplbbbwkvyocoid1m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffzwcplbbbwkvyocoid1m.png" alt="A candlelit portrait above pinhole controls, a grey sample labelled RGB 115, 115, 115 and a note that vivid blue is not guaranteed." width="720" height="1294"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Sol’s default portrait study and pinhole controls, with its explicit limit on the promised colour shift. The capture records the interface, not the viewer’s perception.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-blue-opus/outputs/" rel="noopener noreferrer"&gt;Claude’s Blue&lt;/a&gt; felt tighter and cleaner to me. Preferring Sol overall was a close choice, with pros and cons. The technical review found useful exploration in Claude’s workbench, alongside overconfident claims about greys and effects that would read as blue.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93baktbaqua0atch06ob.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93baktbaqua0atch06ob.png" alt="A candlelit portrait on a dark background, a dashed sampling circle, Keep card down and Hole controls, and an RGB 86, 86, 86 readout." width="720" height="1418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Claude’s default viewing-card workbench, with the portrait, isolation controls and sampled RGB values. The card is raised; the readout does not measure a viewer’s experience.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-blue-argon/outputs/" rel="noopener noreferrer"&gt;Gemini’s Blue&lt;/a&gt; was unpleasant and noisy to look at. Its instrument-style presentation also surrounds the picture with asserted perception values. The &lt;a href="https://billiem.uk/choice/experiments/2026-10-19-cross-blue-sol/public/study-review" rel="noopener noreferrer"&gt;Blue review&lt;/a&gt; found no observer measurements or calibrated appearance model supporting its cortical-perception colours and induction score. The displayed 100/100 is the interface’s claim.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8aghhemhzjo9es2pkr0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8aghhemhzjo9es2pkr0d.png" alt="A portrait with aperture and hotspot controls above grey and blue swatches and a claimed perceived-blue induction index of 100 out of 100." width="720" height="2271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Gemini’s default portrait and instrument-style readouts. The blue swatch and 100/100 induction index are claims made by the interface, not measured human perception.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Sol was the review’s preferred illustrative studio. That did not make its grey look blue for me. Working controls, preserved pixels and a preferred layout leave the subjective payoff unresolved.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pitches had differences too
&lt;/h2&gt;

&lt;p&gt;Before implementation, each model proposed five ideas. These sets were broader than a neat “tools versus games versus science” division:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sol:&lt;/strong&gt; the gift sleeve, a looping instrument made from everyday sound, a neighbourhood water simulation, fiction about siblings dividing kitchen objects, and a scheduling tool for one person’s hands.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude:&lt;/strong&gt; ringing patterns, navigation by night lights, historical lighting costs while reading, paragraph line-breaking, and room/rent allocation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini:&lt;/strong&gt; a printable windowsill sundial, historical tuning, a fictional 1814 wreck inquiry, a wildfire counterfire simulation, and the colour-context studio.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sol nominated its water simulation; I chose Fold instead. Claude’s Ring and Gemini’s Blue nominations matched my selections. Then all three built each selected idea. Fiction, physical making and learnable systems overlap between the sets; fifteen pitches do not establish permanent model personalities. Their scientific and historical promises are proposals, not verified outcomes.&lt;/p&gt;

&lt;p&gt;The implementations came from nine isolated fresh chats at High, using native Sol and authenticated subscription CLIs for Claude and Gemini. They shared each topic’s brief and one ordinary attempt without a fixed duration, while tools, harnesses, system instructions and compute differed. Quota interruptions, same-conversation recovery, missing packaging supplied by Sol and small hosting compatibility edits are documented in the original. Known scoring, printing and scientific faults were retained. Seven versions received private or unfinished recommendations from the anonymous Sol reviewers; all nine were published as comparison prototypes.&lt;/p&gt;

&lt;p&gt;Claude’s box remains the decisive one for me. Ring leaves a useful disagreement about feel and reliable feedback. Blue leaves three interpretations of a promised effect I did not see.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/nine-choice-builds-three-ai-models/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>ux</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Turning my voice into matter with Codex and a 3D printer</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Mon, 19 Oct 2026 22:38:42 +0000</pubDate>
      <link>https://dev.to/billiem/turning-my-voice-into-matter-with-codex-and-a-3d-printer-h66</link>
      <guid>https://dev.to/billiem/turning-my-voice-into-matter-with-codex-and-a-3d-printer-h66</guid>
      <description>&lt;p&gt;I got the round meter into my first test print, then couldn't get it out without risking damage to the plastic. A more complicated cradle followed. This time the meter just spun round.&lt;/p&gt;

&lt;p&gt;Technically, it fit. I wanted the simpler design back.&lt;/p&gt;

&lt;p&gt;I've been using Wispr Flow to dictate designs and changes to Codex, then printing them. This particular conversation was about interchangeable meter inserts for my &lt;a href="https://makerworld.com/en/models/3464778-crowdlox-4l-cereal-box-filament-spool-holder" rel="noopener noreferrer"&gt;CrowdLox 4L cereal-box filament spool holder&lt;/a&gt;. The holder has a removable desiccant tray and inserts for square, round and rectangular meters.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4sqp38qhzmn6pd6qqc5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw4sqp38qhzmn6pd6qqc5.png" alt="Filament spool standing on a white printed cradle, with a square meter at the front and translucent tray underneath." width="720" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A printed version of the cereal-box spool holder, assembled with its tray and square meter.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;These are photographs of my real prints, with AI used to clean up the backgrounds.&lt;/p&gt;

&lt;p&gt;The round and rectangular meters both had retaining clips that made removal awkward. Getting a body through a hole was only part of what I needed. After trying the prints, I could explain the change:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'd rather make something more akin to the first one, but just with slots for the bits that grip to be able to pull in and out.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I also wanted the frames deeper. That simpler slotted frame worked beautifully for the round meter. The rectangle needed another adjustment: one version was too loose; the tighter one held nicely, but there was too much friction when taking it out.&lt;/p&gt;

&lt;p&gt;I asked for halfway between the two and moved on to printing the complete round and rectangular inserts. Both held securely and came out comfortably. Those are the sorts of specifications I can now work towards by talking, printing and trying the actual object.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fklmv1mggp0k9rs1m4rx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fklmv1mggp0k9rs1m4rx7.png" alt="White printed spool cradle with a rectangular black-framed meter at the front and a translucent slotted tray between the curved supports." width="720" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The rectangular-meter version, with the tray visible between the spool supports. The photos show the printed predecessors of the later simplified mount.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;There is another change after these prints: I asked to remove the awkward front pedestal because cleaning up its supports was annoying. That mounting revision has been checked digitally, but I haven't printed it yet.&lt;/p&gt;

&lt;p&gt;I'd never done CAD modelling before any of this. I could learn it, and still could. Making the models with AI was a natural choice for me because I'm so AI-forward, and the results are more than good enough for the kinds of modelling I'm trying to do.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://makerworld.com/en/models/3464782-minirig-3-speaker-holder-for-ikea-skadis" rel="noopener noreferrer"&gt;Minirig 3 holder&lt;/a&gt; is another result I have around me now: an adjustable cradle on my IKEA SKÅDIS board, with a cable channel and real bolts and nuts. It's printed, installed and holding my speaker.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11e447nm45zamxhcpjoo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F11e447nm45zamxhcpjoo.png" alt="Blue Minirig speaker seated in a black printed cradle mounted on SKÅDIS, with knobs on either side." width="720" height="540"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The printed Minirig holder installed on my SKÅDIS board.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I can also change something that already exists. My &lt;a href="https://makerworld.com/en/models/3462024-customizable-gridfinity-resistor-organizer" rel="noopener noreferrer"&gt;Gridfinity resistor organiser&lt;/a&gt; is a taller, customisable 6U remix of &lt;a href="https://makerworld.com/en/models/2259302" rel="noopener noreferrer"&gt;dmc_faLl's CC0 original&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I became a software engineer because I wanted to make things. Roughly three months ago, I didn't even have a 3D printer. Now I have the printer, Wispr Flow and models capable enough to get physical objects made to my specification. I'm not just a vibe coder anymore.&lt;/p&gt;

&lt;p&gt;That's what excites me: how much more I can make across software, physical objects, hardware and their crossover with microcontrollers. The conversation can now end with something I can pick up and use. It's crazy. It feels like the future.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/voice-into-matter/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>3dprinting</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>24 free APIs for your next side project</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Mon, 19 Oct 2026 19:08:08 +0000</pubDate>
      <link>https://dev.to/billiem/24-free-apis-for-your-next-side-project-2b41</link>
      <guid>https://dev.to/billiem/24-free-apis-for-your-next-side-project-2b41</guid>
      <description>&lt;p&gt;Choose the interaction before choosing the API. Does the user already have a barcode or DOI? Are they checking a changing value, browsing a collection, or asking for a route calculation? Those lead to different small projects, even when every response arrives as structured data.&lt;/p&gt;

&lt;p&gt;These 24 free API resources are grouped by that design decision. A first version could be a pantry lookup, a periodically refreshed desk display, an author explorer or a dependency graph. Each group explains what comes back and the conditions that would change the project.&lt;/p&gt;

&lt;p&gt;The source documentation and selected public read responses were checked on &lt;strong&gt;19 October 2026&lt;/strong&gt;. Some resources were assessed through documentation only. These were modest checks, not complete integrations, browser-runtime tests or a reliability comparison.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start with an identifier the user already has
&lt;/h2&gt;

&lt;p&gt;A lookup tool has a useful boundary: someone supplies one identifier, the service returns a record, and the interface helps them use it. The main design question is what that identifier actually identifies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A barcode can populate a pantry catalogue.&lt;/strong&gt; &lt;a href="https://openfoodfacts.github.io/openfoodfacts-server/api/" rel="noopener noreferrer"&gt;Open Food Facts&lt;/a&gt; provides product names, ingredients and nutrition fields, with category and nutrition searches available too. Community records may have missing or incorrect fields, so the catalogue needs room for corrections. Ingredient and allergen data cannot become a safety guarantee.&lt;/p&gt;

&lt;p&gt;Public reads need no account or key. The documentation requests an API-usage form and identifying client, with checked limits of 15 product lookups and 10 searches a minute per IP. Cache product records and use exports for larger collections. Database reuse carries ODbL attribution and share-alike conditions; product images have separate CC BY-SA and possible packaging rights.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A DOI can populate a reading list.&lt;/strong&gt; &lt;a href="https://www.crossref.org/documentation/retrieve-metadata/rest-api/" rel="noopener noreferrer"&gt;Crossref&lt;/a&gt; returns bibliographic JSON, including titles, authors, publication information and identifiers deposited by members and trusted sources. A DOI importer could let the reader inspect a match before saving the reference.&lt;/p&gt;

&lt;p&gt;No signup is required for public REST access. Supply a &lt;code&gt;mailto&lt;/code&gt; contact for the polite pool and follow current rate and concurrency headers. Almost all metadata can be used for any purpose, but abstracts may retain copyright. A record about a paper does not grant permission to redistribute the paper itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A postcode can locate a local-information page.&lt;/strong&gt; &lt;a href="https://postcodes.io/docs/overview/" rel="noopener noreferrer"&gt;Postcodes.io&lt;/a&gt; returns coordinates and administrative geography, including councils and parliamentary constituencies. Lookups require neither an account nor a key. The result describes a UK postcode, however, rather than a particular property or delivery address. A postcode's representative point can sit across a boundary from an individual address.&lt;/p&gt;

&lt;p&gt;Keep that distinction visible in a council finder. Also check the &lt;a href="https://postcodes.io/docs/licences/" rel="noopener noreferrer"&gt;data licences&lt;/a&gt;: commercial reuse of the Northern Ireland data requires a separate LPS licence, unlike the Great Britain data's arrangements.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An artist name can lead to stable music identifiers.&lt;/strong&gt; &lt;a href="https://musicbrainz.org/doc/MusicBrainz_API" rel="noopener noreferrer"&gt;MusicBrainz&lt;/a&gt; supports searching and following relationships among artists, works, recordings and releases. An album-edition explorer can preserve those different entities rather than treating a matching title as a unique album.&lt;/p&gt;

&lt;p&gt;Public metadata needs no key, but free hosted access is &lt;strong&gt;non-commercial&lt;/strong&gt;, requires an identifying User-Agent and allows at most one call a second per client. The database has &lt;a href="https://musicbrainz.org/doc/About/Data_License" rel="noopener noreferrer"&gt;CC0 core data and CC BY-NC-SA 3.0 supplementary data&lt;/a&gt;. Core-data permissions do not make commercial hosted-service access free. No audio or cover art comes with the dataset.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build a panel that changes over time
&lt;/h2&gt;

&lt;p&gt;A changing number needs more context than a label and a refresh button. These sources illustrate different meanings of “current”: a model forecast, an observation, a prediction, a revised event or a reference rate.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;th&gt;What a small project could show&lt;/th&gt;
&lt;th&gt;Context to keep with it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://open-meteo.com/en/docs" rel="noopener noreferrer"&gt;Open-Meteo&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Rain and wind through an afternoon&lt;/td&gt;
&lt;td&gt;Forecast time, units and modelled-data context&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://api.tfl.gov.uk/" rel="noopener noreferrer"&gt;TfL Unified API&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A favourite line's status or bus-stop departures&lt;/td&gt;
&lt;td&gt;London coverage and refresh time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://environment.data.gov.uk/flood-monitoring/doc/reference" rel="noopener noreferrer"&gt;Environment Agency&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A local river station's latest level or flow&lt;/td&gt;
&lt;td&gt;Units and observation time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://carbon-intensity.github.io/api-definitions/" rel="noopener noreferrer"&gt;NESO Carbon Intensity&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Current and upcoming GB electricity intensity&lt;/td&gt;
&lt;td&gt;Half-hour interval and estimate/forecast distinction&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://earthquake.usgs.gov/earthquakes/feed/v1.0/geojson.php" rel="noopener noreferrer"&gt;USGS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Recent earthquakes on a map&lt;/td&gt;
&lt;td&gt;Event time, update information and source link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://frankfurter.dev/" rel="noopener noreferrer"&gt;Frankfurter&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A travel budget converted across dates&lt;/td&gt;
&lt;td&gt;Reference-rate observation date&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.gov.uk/bank-holidays.json" rel="noopener noreferrer"&gt;GOV.UK Bank Holidays&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;The next bank holiday&lt;/td&gt;
&lt;td&gt;The selected UK division&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://info.arxiv.org/help/api/user-manual.html" rel="noopener noreferrer"&gt;arXiv&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;A periodically refreshed research-paper digest&lt;/td&gt;
&lt;td&gt;Authors, categories and abstract-page links&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The request policies and reuse terms help determine how each panel can work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-Meteo&lt;/strong&gt; accepts coordinates without signup or a key and returns current modelled conditions plus hourly and daily forecasts. A personal outdoor-plan or garden dashboard fits the offer. Its &lt;a href="https://open-meteo.com/en/terms" rel="noopener noreferrer"&gt;hosted free service is non-commercial&lt;/a&gt;, including a restriction on ad-supported and subscription projects. Returned data is separately &lt;a href="https://open-meteo.com/en/licence" rel="noopener noreferrer"&gt;CC BY 4.0&lt;/a&gt;, requiring credit. That licence does not remove the service restriction, and modelled conditions are not necessarily measurements at the chosen location.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TfL&lt;/strong&gt; supplies status, arrivals, disruptions and journey information for London transport. The current &lt;a href="https://api-portal.tfl.gov.uk/products" rel="noopener noreferrer"&gt;products page&lt;/a&gt; allows 50 anonymous requests a minute, or registration for the 500-a-minute product. Follow the &lt;a href="https://tfl.gov.uk/corporate/terms-and-conditions/transport-data-service" rel="noopener noreferrer"&gt;transport-data licence and acknowledgements&lt;/a&gt;, and account for predictions becoming stale or missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Environment Agency&lt;/strong&gt; offers registration-free station, level, flow and warning data, principally for England, under the Open Government Licence with its requested acknowledgement. The documented measurement interval does not guarantee equally prompt delivery. This is explicitly unsuitable for safety-critical reliance: a warning display should link to official warning channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NESO&lt;/strong&gt; supplies half-hourly estimates and forecasts for &lt;strong&gt;Great Britain&lt;/strong&gt;, excluding Northern Ireland. Its public JSON endpoints need no key, and data is &lt;a href="https://github.com/carbon-intensity/terms/" rel="noopener noreferrer"&gt;CC BY 4.0 under provider terms&lt;/a&gt;. The field called &lt;code&gt;actual&lt;/code&gt; is still an estimate. An intensity display does not measure the user's savings or show electricity prices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;USGS&lt;/strong&gt; has ready-to-map GeoJSON feeds for rolling windows of recent earthquakes. Use those for a changing display; the &lt;a href="https://earthquake.usgs.gov/fdsnws/event/1/" rel="noopener noreferrer"&gt;catalogue&lt;/a&gt; serves date, magnitude and geographic queries. Public feeds need no key. Estimates can change, and &lt;a href="https://www.usgs.gov/information-policies-and-instructions/copyrights-and-credits" rel="noopener noreferrer"&gt;USGS-produced data is in the US public domain&lt;/a&gt;, with separate rights possible for contributor material. An exploratory map is not a warning system.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Frankfurter&lt;/strong&gt; needs no key and supplies daily reference rates, historical values and time series. Default blended rates may be used commercially under the documented terms; &lt;a href="https://frankfurter.dev/license/" rel="noopener noreferrer"&gt;institution-specific sources retain provider conditions&lt;/a&gt;. A displayed conversion is neither a live tradable price nor the rate a bank will charge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://www.api.gov.uk/gds/bank-holidays/" rel="noopener noreferrer"&gt;GOV.UK Bank Holidays&lt;/a&gt;&lt;/strong&gt; is a small public JSON feed with titles, dates and notes. Choose England and Wales together, Scotland, or Northern Ireland, and refresh the cached calendar. Reuse follows &lt;a href="https://www.gov.uk/help/terms-conditions" rel="noopener noreferrer"&gt;GOV.UK's general OGL conditions&lt;/a&gt;. A bank holiday does not establish a particular workplace's, shop's or school's opening hours.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;arXiv's legacy query API&lt;/strong&gt; returns Atom XML, with titles, authors, summaries, categories and links, rather than JSON. Its &lt;a href="https://info.arxiv.org/help/api/tou.html" rel="noopener noreferrer"&gt;terms&lt;/a&gt; make descriptive metadata, including abstracts, CC0; paper files retain submission-specific rights. Allow at most one request every three seconds, with one connection at a time across all machines under your control. A scheduled topic digest fits that policy better than querying on every keystroke. Inclusion on arXiv does not establish peer review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A proposed weekend panel could combine the postcode lookup above with Open-Meteo and the appropriate holiday calendar. Each supplies a different piece: location, forecast and dates. The weather service's non-commercial condition would still apply to the combined project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let the user follow a record into a collection
&lt;/h2&gt;

&lt;p&gt;Browsing introduces another question: what can the next click mean? It might move from a work to an edition, from a writer to a related entity, or from a species name to historical observations.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://openlibrary.org/dev/docs/api/search" rel="noopener noreferrer"&gt;Open Library&lt;/a&gt; searches normally return &lt;strong&gt;works&lt;/strong&gt;, with edition information available separately. A personal reading-list tool could use title and author lookup without requiring the reader to type every bibliographic field. Its &lt;a href="https://openlibrary.org/developers/api" rel="noopener noreferrer"&gt;public APIs&lt;/a&gt; are intended for human-facing, mission-aligned use. Identify the application, register its use case as requested and cache results. Bulk work belongs with the monthly dumps; the API is not a high-traffic commercial backend. Catalogue availability supplies neither full-text access nor permission for every cover, and the &lt;a href="https://openlibrary.org/developers/licensing" rel="noopener noreferrer"&gt;licensing statement&lt;/a&gt; is not a blanket CC0 grant for all contributions.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.wikidata.org/wiki/Wikidata:Data_access" rel="noopener noreferrer"&gt;Wikidata&lt;/a&gt; can supply relationships and identifiers across collections. Entity JSON includes labels, descriptions, aliases, statements and links; narrow SPARQL queries can answer relational questions for an author explorer or timeline. Structured data is &lt;a href="https://www.wikidata.org/wiki/Wikidata:Licensing" rel="noopener noreferrer"&gt;CC0&lt;/a&gt;, while linked media and Wikipedia prose have separate terms. Inspect references and statement ranks, identify the client under the &lt;a href="https://www.mediawiki.org/wiki/Wikimedia_APIs/Access_policy" rel="noopener noreferrer"&gt;access policy&lt;/a&gt;, and use dumps for bulk exports.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.mediawiki.org/wiki/API:REST_API/Get_started" rel="noopener noreferrer"&gt;Wikipedia's MediaWiki REST API&lt;/a&gt; serves a different part of a reading companion: page search and content, with revision and licence information. Language editions can be explored independently; they are not guaranteed translations. Public reads need no key, but redisplayed text generally has &lt;a href="https://foundation.wikimedia.org/wiki/Terms_of_Use" rel="noopener noreferrer"&gt;CC BY-SA 4.0 attribution and ShareAlike conditions, with exceptions&lt;/a&gt;. Preserve revision context, check images individually and follow &lt;a href="https://www.mediawiki.org/wiki/Wikimedia_APIs/Rate_limits" rel="noopener noreferrer"&gt;current client limits&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://techdocs.gbif.org/en/openapi/" rel="noopener noreferrer"&gt;GBIF&lt;/a&gt; connects species-name matching to published biodiversity occurrence records. A species explorer could resolve synonyms, then map records from selected datasets. Public searches require no key; &lt;a href="https://techdocs.gbif.org/en/data-use/api-downloads" rel="noopener noreferrer"&gt;bulk occurrence downloads&lt;/a&gt; require an account. Select licences compatible with the project: datasets can be CC0, CC BY or CC BY-NC, and associated media needs separate checks. An observation's date and dataset matter because a record does not establish current presence or absence.&lt;/p&gt;

&lt;p&gt;For a different kind of catalogue, &lt;a href="https://www.tvmaze.com/api" rel="noopener noreferrer"&gt;TVmaze&lt;/a&gt; provides shows, episodes, cast and country-filtered schedules. A cast explorer could connect an actor to other shows, or the same data could support a next-episode calendar. The public API needs no key and explicitly documents browser CORS support. Its data is CC BY-SA, requiring attribution and ShareAlike. Metadata is not streaming permission, and accessible images are not necessarily public-domain images.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://api.radio-browser.info/" rel="noopener noreferrer"&gt;Radio Browser&lt;/a&gt; exposes station metadata and stream links filtered by language, country or tags. A language-practice directory could browse stations before handing a chosen stream to a player. The free API allows free and non-free software, with server-discovery and rotation expectations rather than a production app pinned to a sample host. Directory-data permissions do not grant broadcast or logo rights. Playback can also fail because a stream is offline, geo-blocked or incompatible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask the service to calculate or match something
&lt;/h2&gt;

&lt;p&gt;Three resources offer more than retrieving a catalogue record. Their results also carry assumptions worth preserving in the interface.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://giscience.github.io/openrouteservice/api-reference/" rel="noopener noreferrer"&gt;openrouteservice&lt;/a&gt; calculates routes, distances, durations and areas reachable within a travel time. A walking-versus-cycling comparison could use route geometry; a reachable-area display could use an isochrone. The &lt;a href="https://account.heigit.org/info/plans" rel="noopener noreferrer"&gt;€0 Standard plan&lt;/a&gt; needs a HeiGIT account and API key, with operation-specific quotas. Results carry &lt;a href="https://account.heigit.org/info/tos" rel="noopener noreferrer"&gt;CC BY-SA 4.0 and attribution conditions&lt;/a&gt;, including openrouteservice/HeiGIT and OpenStreetMap credit. Mapped-network and profile choices affect the result; a computed route is not confirmation of safe or accessible passage.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.deps.dev/api/v3/" rel="noopener noreferrer"&gt;deps.dev v3&lt;/a&gt; provides package metadata and computed dependency graphs, with graph resolution for npm, Cargo, Maven and PyPI. An explorer could compare two versions or follow the packages bringing in a dependency. Access is free and unauthenticated. The result resembles a clean generic 64-bit Linux resolution, rather than the reader's exact installation, and can contain resolution errors. Generated data is CC BY 4.0, upstream data retains its conditions, and licence fields need independent verification.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://google.github.io/osv.dev/api/" rel="noopener noreferrer"&gt;OSV&lt;/a&gt; matches package/version or commit queries to known vulnerability records, including affected ranges, timestamps and references. Package queries use read-only POST; individual records can be retrieved by GET, with no credentials in the public examples. A dependency advisory explorer could combine those records with the deps.dev graph. Preserve errors and original advisory links: missing results cannot establish safety. OSV aggregates &lt;a href="https://google.github.io/osv.dev/data/" rel="noopener noreferrer"&gt;source databases&lt;/a&gt;, whose terms matter when redistributing records; the service software's licence is not a blanket returned-data licence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Treat the asset as another retrieval step
&lt;/h2&gt;

&lt;p&gt;For a gallery or visual quiz, the record and the media are separate ingredients. Artist, title, date and medium can explain an answer, while an image URL or identifier tells the project where to request the picture.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://metmuseum.github.io/" rel="noopener noreferrer"&gt;The Met Collection API&lt;/a&gt;&lt;/strong&gt; returns artwork metadata, image URLs and &lt;code&gt;isPublicDomain&lt;/code&gt;, without an API account or key. Its &lt;a href="https://www.metmuseum.org/hubs/open-access" rel="noopener noreferrer"&gt;Open Access release&lt;/a&gt; covers selected collection data and public-domain images under CC0. A themed art quiz should check the flag and available image fields; a copyrighted work's metadata does not free its image. Use current examples: the docs introduce paginated &lt;code&gt;/v1.1/search&lt;/code&gt; and schedule the old search route for retirement on 1 October 2026. Object details remain under &lt;code&gt;/v1/objects/{id}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://api.artic.edu/docs/" rel="noopener noreferrer"&gt;The Art Institute of Chicago API&lt;/a&gt;&lt;/strong&gt; supplies artwork records and image identifiers for separate IIIF URLs. Its documentation explains image sizes and a 60-request-a-minute anonymous limit per IP; no authentication is required. Filter &lt;code&gt;is_public_domain&lt;/code&gt; and inspect object rights for a public-domain gallery, because IIIF can also serve copyrighted images. Artwork descriptions are CC BY 4.0; other artwork response data is CC0 under the documented conditions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://images.nasa.gov/docs/images.nasa.gov_api_docs.pdf" rel="noopener noreferrer"&gt;NASA's Image and Video Library API&lt;/a&gt;&lt;/strong&gt; searches descriptions and links to asset manifests for images, video and audio. A mission-history explorer could filter by year, NASA centre and media type. The checked public search needed no key; no numerical quota was located in the inspected guide. Check individual credits and &lt;a href="https://www.nasa.gov/nasa-brand-center/images-and-media/" rel="noopener noreferrer"&gt;NASA's media guidelines&lt;/a&gt;: NASA material is generally not copyright-protected in the US, but third-party content, people and logos can introduce other conditions. This service's access does not describe every NASA API.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Pick the first interaction you can keep small
&lt;/h2&gt;

&lt;p&gt;For a browser-only project, check CORS on the exact endpoint before settling the architecture. No-key access alone does not establish browser access. TVmaze documents it, while some of the other resources here have only documentation or server-side read checks behind them. Client-identification and request policies may also make a cached server-side fetch more suitable.&lt;/p&gt;

&lt;p&gt;A pantry lookup can begin with one barcode and editable missing fields. An author explorer can begin with one work, its editions and a source link. A river display can begin with one station, its unit and observation time. Those first screens expose the important data decisions before a project grows around them.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/free-apis-for-side-projects/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>api</category>
      <category>webdev</category>
      <category>sideprojects</category>
    </item>
    <item>
      <title>How to Make an AI Website Feel Like Someone Designed It</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Mon, 19 Oct 2026 12:21:46 +0000</pubDate>
      <link>https://dev.to/billiem/how-to-make-an-ai-website-feel-like-someone-designed-it-1kfl</link>
      <guid>https://dev.to/billiem/how-to-make-an-ai-website-feel-like-someone-designed-it-1kfl</guid>
      <description>&lt;p&gt;A bicycle cog mechanism worked and still had to go. Fixing its controls hadn't given a visitor any useful reason to operate it.&lt;/p&gt;

&lt;p&gt;That was one of the more useful design decisions in a set of four AI-built fictional business websites. The furniture site's controls survived: changing a desk's width and finish changes its drawing and specification. The nursery's plant choices survived because they change what someone can inspect.&lt;/p&gt;

&lt;p&gt;When reviewing an AI-built site, ask the agent to explain that relationship. What is the visitor choosing, what changes on screen, and what can they do with the result? Those questions give you more precise feedback than another request to make the page look better.&lt;/p&gt;

&lt;p&gt;You can &lt;a href="https://billiem.uk/experiments/frontend-design/2026-10-19/" rel="noopener noreferrer"&gt;open all four working examples&lt;/a&gt; while reading. They are fictional businesses with local notes and lists. None of the flows sends a message, books an appointment or places an order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow the control into the result
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/experiments/frontend-design/2026-10-19/commonset/" rel="noopener noreferrer"&gt;Commonset's furniture demo&lt;/a&gt; gives the width and finish controls something visible to affect. The furniture itself changes, alongside the specification. Keep the drawing and controls together and the visitor can inspect the choice they are making.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp2961yu6lgufdole9d7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvp2961yu6lgufdole9d7.png" alt="The narrow Line desk page places its drawing above legible width, finish and quantity controls." width="390" height="1285"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Commonset keeps the desk drawing, dimensions, finish and specification together. The controls change the drawing as well as the selected specification.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The same question applies to less conspicuous controls. In &lt;a href="https://billiem.uk/experiments/frontend-design/2026-10-19/morrowfield/" rel="noopener noreferrer"&gt;Morrowfield's nursery catalogue&lt;/a&gt;, growing conditions and mature size help narrow the plant selection. Quantities then belong in the garden or trade list. The useful interaction continues beyond the first change on screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F53sl8uhucv3ociqaxb2j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F53sl8uhucv3ociqaxb2j.png" alt="Morrowfield's catalogue filters form a compact two-column panel at a 390-pixel viewport, with controls for growing conditions and plant size." width="320" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Morrowfield's catalogue filters at a 390-pixel browser width. Inspect the working controls as well as the opening screen; this is a browser view, not a physical-phone usability test.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Follow a selection through that whole journey when reviewing the build. Change it, inspect the next screen, return and edit it. Does the site retain what you selected and any text you entered? Can you read and use the controls at a narrow width?&lt;/p&gt;

&lt;p&gt;The two service sites offer other versions of that inspection. In &lt;a href="https://billiem.uk/experiments/frontend-design/2026-10-19/second-spoke/" rel="noopener noreferrer"&gt;Second Spoke&lt;/a&gt;, read the repair scope and price, then prepare a repair note. In &lt;a href="https://billiem.uk/experiments/frontend-design/2026-10-19/moss-and-mile/" rel="noopener noreferrer"&gt;Moss &amp;amp; Mile&lt;/a&gt;, choose a walk, then review, edit and keep the walk note. Those local outcomes give the onward journey a purpose without pretending a booking happened.&lt;/p&gt;

&lt;p&gt;A revision request can name the broken relationship and protect the parts you want to keep. This is an &lt;strong&gt;edited example&lt;/strong&gt;, derived from the constraints used in the studies, rather than an exact tested prompt:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Preserve the chosen visual direction. Carry the selected service into the note, keep the visitor's entered text when they return to edit it, and make the service details help them compare their options. Review the complete flow at desktop and phone widths.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a more inspectable request than asking for extra interactivity. The bicycle cog had no equivalent job. The review called for removing it even after its controls had been corrected. Motion can still contribute to atmosphere and hierarchy without needing its own separate control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compare directions on the awkward content
&lt;/h2&gt;

&lt;p&gt;An opening screenshot tells you little about the catalogue, service details or next action. Ask to see how a direction handles those parts before choosing it.&lt;/p&gt;

&lt;p&gt;Moss &amp;amp; Mile pairs woodland dog photography with green and burgundy type and a looping lead shape. Its subject supplies material for the composition.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcj6kofwehfkfguw7f1t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flcj6kofwehfkfguw7f1t.png" alt="Moss &amp;amp; Mile pairs a large woodland dog photograph with green and burgundy type and a walk-selection action." width="720" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Moss &amp;amp; Mile combines outdoor photography, green and burgundy type, and a looping lead shape. Judge how the material and layout work together.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Second Spoke takes a different route with a drawn bicycle and bold lettering. Its repair information and note flow need to carry that direction too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fltsga9cmm5z2w2j5sllz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fltsga9cmm5z2w2j5sllz.png" alt="Second Spoke's repair-site opening combines bold black and coral lettering with a large bicycle drawing." width="720" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Second Spoke uses a bicycle illustration and bold lettering. Its repair details and note flow carry the same direction beyond this opening.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;To make that comparison useful, keep the business content consistent across the alternatives. Otherwise a stronger offer or shorter page can distract from what the design is doing. Here is another &lt;strong&gt;edited example&lt;/strong&gt;, not the historical wording that produced these screenshots:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Show two or three distinct directions using the same business content. Include the opening, a detailed service or product section, and the next action at desktop and phone widths. Explain how the imagery, type, composition and interaction fit the subject. Make the alternatives differ beyond their palettes.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You then have ordinary content to judge alongside the most flattering screen. Look at whether each section answers a different visitor question and whether the chosen identity continues through it.&lt;/p&gt;

&lt;p&gt;There are recurring habits to watch in these examples: Moss &amp;amp; Mile and Morrowfield both use warm backgrounds, large serif type and photography. If the next business calls for a different character, challenge those choices while the directions are still being compared.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the assignment before polishing it
&lt;/h2&gt;

&lt;p&gt;The earlier Causeway attempt became a carefully built folding landscape. The coordinating agent had turned a business-site brief into a digital exhibition. Passing technical checks could only confirm properties of the thing it had built; more polish would have continued the wrong assignment.&lt;/p&gt;

&lt;p&gt;Give the agent the offer, visitor and next decision before asking it to choose effects. A nursery visitor narrowing plants by growing conditions has a different information problem from someone checking a bicycle repair's scope and price. Supplied facts and assets belong in that brief, along with a request to identify missing information before inventing claims.&lt;/p&gt;

&lt;p&gt;During browser review, check keyboard access, visible focus, overflow, reduced-motion treatment and missing-media behaviour as well as the design. Automated checks help establish particular properties. They leave the visitor's task and the design judgement for you to inspect.&lt;/p&gt;

&lt;p&gt;These four fictional briefs support reusing a process of setting the purpose, comparing directions, selecting and revising. They do not establish a quality score, a speed gain or reliable results without human direction. The checks were digital, with no customer-preference study, physical-phone usability result or established assistive-technology usability. Real clients also bring fixed identities, content and integrations that these studies could avoid.&lt;/p&gt;

&lt;p&gt;For the next review, take one choice all the way to its outcome. That gives the agent a concrete relationship to fix, preserve or remove.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/ai-website-design-needed-direction/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>design</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Your CLAUDE.md is not magic</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Thu, 08 Oct 2026 21:12:20 +0000</pubDate>
      <link>https://dev.to/billiem/your-claudemd-is-not-magic-34n1</link>
      <guid>https://dev.to/billiem/your-claudemd-is-not-magic-34n1</guid>
      <description>&lt;p&gt;I have seen a Claude session review a change that another Claude session has already reviewed. A human still has to take responsibility for it. That is uncomfortable when you do not understand the change you are being asked to approve.&lt;/p&gt;

&lt;p&gt;In my experience, review has become more hurried as the amount of software we are expected to produce has increased. It has not disappeared, but the depth has struggled to keep up. “Hey, we've got to move. Can you take this?” is a different situation from having time to properly understand the work.&lt;/p&gt;

&lt;p&gt;I want checks that run independently of the agent writing the code. But that needs a distinction which is easy to lose: requiring a review to happen does not make its verdict reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the check and trusting the verdict
&lt;/h2&gt;

&lt;p&gt;Some acceptance conditions can be evaluated mechanically. Others require judgement about the change and the codebase. I want both kinds of checks to happen without depending on the coding agent remembering to run them.&lt;/p&gt;

&lt;p&gt;That makes the execution of a required model review more dependable. It does not make the model's conclusions deterministic. The reviewer can misunderstand a requirement, miss a problem, or respond differently after a model update. Another model saying the work looks good does not establish that it is good.&lt;/p&gt;

&lt;p&gt;This is why merely adding an automatic reviewer to a pull request does not answer the questions I care about. What is it checking? How closely are its criteria grounded in this particular codebase? What confidence should I put in its judgement?&lt;/p&gt;

&lt;p&gt;I am not trying to settle whether the increased pace of development is good or bad. I am encountering it, and I want the acceptance process to account for it. Asking everyone to review as thoroughly as before does not create the time to do that.&lt;/p&gt;

&lt;h2&gt;
  
  
  An instruction file cannot promise compliance
&lt;/h2&gt;

&lt;p&gt;A recent, much smaller annoyance brought this into focus. Claude was adding far more code comments than I wanted. I asked it to use fewer, and added the guidance to &lt;code&gt;CLAUDE.md&lt;/code&gt;. The code still had too many comments.&lt;/p&gt;

&lt;p&gt;That experience did not establish a new comments gate or a solution to excessive comments. It highlighted how weak an instruction can be as a mechanism for controlling output, even when the request seems simple.&lt;/p&gt;

&lt;p&gt;Anthropic describes &lt;a href="https://code.claude.com/docs/en/memory" rel="noopener noreferrer"&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; as context rather than enforced configuration&lt;/a&gt;. I find that a useful way to think about it. The file can explain what matters and help steer the model. Writing “always” inside it does not make the action inevitable.&lt;/p&gt;

&lt;p&gt;I have used AI for development since the early Copilot days, then early ChatGPT, followed by Claude Code and a lot of Codex in my own time. Trying different workflows has changed my opinions repeatedly. At this point I put more confidence in checking the completed work than in building an elaborate instruction sequence and hoping the model follows it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If a requirement matters enough to prevent accepting a change, its check should run whether or not the coding agent remembers it.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That still leaves plenty of useful work for instructions to do.&lt;/p&gt;

&lt;p&gt;While talking through the original article, I initially dismissed plugins as silly. That was too broad. I use skills and workflows myself, and &lt;a href="https://code.claude.com/docs/en/plugins" rel="noopener noreferrer"&gt;plugins can contain tools and hooks as well as instructions&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;There are absolute gold mines of human knowledge worth encoding: understanding the problem, knowing its constraints, and recognising what matters through experience. A model can help express that knowledge in a reusable document. It can save me repeating the important context every time.&lt;/p&gt;

&lt;p&gt;What I question is generating a large workflow document that contains nothing another person could produce by asking the same model. Producing text is cheap. The knowledge behind it is where I see the value, and the size of the document gives me little reason to trust it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put the friction around the criteria
&lt;/h2&gt;

&lt;p&gt;For a team, I would want qualified people to protect the codebase-specific acceptance criteria. More than one person should discuss changes and understand why each requirement belongs there. Almost a council, although that sounds grander than I mean.&lt;/p&gt;

&lt;p&gt;I recognise the habit of accepting a convincing model explanation as authority: “Oh, Claude said the thing. Now this is how the thing is done.” I want friction before that explanation becomes another rule.&lt;/p&gt;

&lt;p&gt;Without that discussion, criteria can grow endlessly. Every plausible suggestion gets added, and the review ends up carrying requirements nobody has properly defended. Keeping the set bounded is part of maintaining it.&lt;/p&gt;

&lt;p&gt;Independently run checks are increasingly part of my own practice, and for now they seem to be working better for me and giving me more confidence. The group protecting a shared review rubric is how I would like the idea to work in a team. It is a proposal, not an arrangement I am claiming to have solved.&lt;/p&gt;

&lt;p&gt;That proposal leaves room for developers to work differently. Someone might prefer Claude, someone else Codex. A detailed workflow can suit one person while a long conversation works better for another. Agreeing on the requirements and checking the result gives us less reason to prescribe every step.&lt;/p&gt;

&lt;p&gt;The diagram below separates those responsibilities. You can also &lt;a href="https://billiem.uk/posts/ai-development-shared-standards/interactives/shared-checks/" rel="noopener noreferrer"&gt;view the native HTML diagram on billiem.uk&lt;/a&gt;, with readable text and a separate branch showing the proposed human stewardship of model-review criteria.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7da6a7b9zw5ssd35osac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7da6a7b9zw5ssd35osac.png" alt="Personal workflows produce candidate changes, followed by required checks and a decision. A separate support branch shows qualified humans maintaining model-review criteria." width="375" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A static version of the proposed boundary. The checks run independently of the coding agent; model-review judgments remain fallible. Human stewardship of the criteria is a team proposal.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The context matters more than the prompt ritual
&lt;/h2&gt;

&lt;p&gt;My own preferred interface is voice-to-text. This article grew out of a conversation in which I dictated my thoughts, kept elaborating, and asked the model to interrogate me. Its questions helped me express more of what I meant, including correcting my blanket criticism of plugins.&lt;/p&gt;

&lt;p&gt;I read the replies rather than listening to the model talk back. I want to inspect what it has understood and decide what to correct. With enough context, the model can organise the material, prepare tasks for other sessions or delegate to agents.&lt;/p&gt;

&lt;p&gt;You should be using voice-to-text. I use &lt;a href="https://wisprflow.ai/" rel="noopener noreferrer"&gt;Wispr Flow&lt;/a&gt;. That is my enthusiastic recommendation, alongside my belief that people and tasks differ; talking is not the right interface for everything.&lt;/p&gt;

&lt;p&gt;When I say prompting matters less now, I mean the elaborate ritual around wording and structure. I still need to give the model substantive information and a clear direction. Being able to ramble, answer questions and refine that direction is useful to me. The model can help with organising it.&lt;/p&gt;

&lt;p&gt;I do not think anyone has found the optimal AI workflow. New models change what works. Instructions that helped one model may be unnecessary for the next, get in its way, or never have been followed consistently in the first place.&lt;/p&gt;

&lt;p&gt;When a new model arrives, I ask it to audit my existing instructions and Markdown files. I expect to keep doing that. I would rather leave room for that experimentation and spend the shared effort on defending the requirements against which the work is accepted. Model-based checks will still need attention too. Changing the way I generate the code should not mean relying on a new set of promises that the agent will remember to check it.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/ai-development-shared-standards/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
    </item>
    <item>
      <title>Codex, fix my home server. I want to watch a film.</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:30:50 +0000</pubDate>
      <link>https://dev.to/billiem/codex-fix-my-home-server-i-want-to-watch-a-film-1fo6</link>
      <guid>https://dev.to/billiem/codex-fix-my-home-server-i-want-to-watch-a-film-1fo6</guid>
      <description>&lt;p&gt;My home server had roughly 24 TB free and still could not import its downloads. The number for the whole storage pool looked reassuring. The branch those imports could actually use had about 99 GiB left, below its 100 GiB reserve.&lt;/p&gt;

&lt;p&gt;Codex diagnosed the mismatch. I could have dug through it myself, but I was trying to watch a film. I didn't want to fuck about with the storage just to use the thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  A placement change does not move existing files
&lt;/h2&gt;

&lt;p&gt;My drives are pooled with &lt;a href="https://trapexit.github.io/mergerfs/2.41.1/" rel="noopener noreferrer"&gt;mergerfs&lt;/a&gt;. The &lt;a href="https://trapexit.github.io/mergerfs/2.41.1/config/functions_categories_policies/" rel="noopener noreferrer"&gt;policy for placing new files&lt;/a&gt; was considering only branches that already contained the relevant directory. Two spare drives lacked that tree, so their free space did not give those imports a destination.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i7l70jnonsm887au8ew.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3i7l70jnonsm887au8ew.png" alt="The pool reports about 24 TB free, but the library branch is below its reserve and two spare branches lack the directory tree required by the old policy." width="720" height="810"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A schematic of the recorded September repair. Changing new-file placement and moving existing files were separate jobs; selecting a different policy did not rebalance the data by itself.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The repair needed two pieces of work. Codex corrected the placement of new files, then separately redistributed existing ones. That rebalance moved 24 older films. Each destination passed a checksum check before the original was removed, and the relocated files were read through the normal network-storage path afterward.&lt;/p&gt;

&lt;p&gt;Neither “copy started” nor an apparently large amount of free space was the finished result. The completion record covered the completed moves and reads.&lt;/p&gt;

&lt;p&gt;There were interruptions too. A disconnected storage mount needed controlled recovery, and its exact cause was not established. Later, the rebalance paused when the VM's control agent restarted. Codex checked the state before resuming. Those details belong in the account just as much as the eventual recovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping the editions I asked for
&lt;/h2&gt;

&lt;p&gt;A more recent request started with a USB SSD plugged into the physical server. I wanted its Star Wars editions copied into my 4K Radarr/Plex library, with usable subtitles.&lt;/p&gt;

&lt;p&gt;The editions were 4K77, 4K80 and 4K83. Codex verified the copies with checksums and selected the available English subtitle tracks. I asked about Radarr replacing them with a version it ranked more highly, so all three were left unmonitored to prevent automatic upgrades replacing those editions. The source SSD was unchanged and unmounted when the work finished.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyctcd847znwjt8owupd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyctcd847znwjt8owupd7.png" alt="Plex identifies A New Hope as 4K77 v1.4 and lists 4K HEVC video with English SRT External subtitles. The title, edition and media fields are shown in separate crops." width="690" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Three crops from the same current Plex item, captured on 6 October 2026. The edition label and English subtitle field show the resulting library entry at capture time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I went back to sit with my boyfriend while it worked. We waited, it got the films in, and we could watch the movie.&lt;/p&gt;

&lt;h2&gt;
  
  
  The commands still have to reach a real server
&lt;/h2&gt;

&lt;p&gt;Codex runs on my MacBook. It reaches the private server through SSH and APIs over the LAN or &lt;a href="https://tailscale.com/docs/concepts/what-is-tailscale" rel="noopener noreferrer"&gt;Tailscale&lt;/a&gt;. The local &lt;code&gt;home-infra&lt;/code&gt; repository supplies inventory, operating rules, runbooks and non-secret definitions. Stack work uses &lt;a href="https://komo.do/docs/intro" rel="noopener noreferrer"&gt;Komodo&lt;/a&gt; and &lt;a href="https://docs.docker.com/compose/" rel="noopener noreferrer"&gt;Compose&lt;/a&gt;; Proxmox and host operations use their own SSH/API path.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1fhsqwh0xsj1ltki6mr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fz1fhsqwh0xsj1ltki6mr.png" alt="Codex runs on the MacBook beside the home-infra repository and uses private SSH/API calls to reach Komodo, Compose and Proxmox." width="720" height="790"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The documented control path runs from my MacBook over the LAN or Tailscale. The local repository supplies the inventory, operating rules and non-secret definitions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;That arrangement also handles small maintenance requests. When an email said a Usenet provider had changed its domain, I used &lt;a href="https://wisprflow.ai/r?BILLIE67" rel="noopener noreferrer"&gt;Wispr Flow&lt;/a&gt; to &lt;a href="https://billiem.uk/posts/linear-idea-ledger/" rel="noopener noreferrer"&gt;dictate the request&lt;/a&gt;: find the change and update the server.&lt;/p&gt;

&lt;p&gt;Codex checked the announcement, changed the endpoint in &lt;a href="https://prowlarr.com/" rel="noopener noreferrer"&gt;Prowlarr&lt;/a&gt;, tested it with the existing key and confirmed synchronization to all four Sonarr/Radarr instances. There was no restart needed.&lt;/p&gt;

&lt;p&gt;A MacBook and an AI desktop app suit how I work now. I can leave the server jobs with Codex, see what happened, and move on. For that endpoint change, moving on was exactly what I wanted.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/codex-home-server-infrastructure/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>selfhosting</category>
      <category>devops</category>
      <category>ai</category>
      <category>codex</category>
    </item>
    <item>
      <title>My desktop became a Proxmox home server</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Tue, 06 Oct 2026 16:25:45 +0000</pubDate>
      <link>https://dev.to/billiem/my-desktop-became-a-proxmox-home-server-91o</link>
      <guid>https://dev.to/billiem/my-desktop-became-a-proxmox-home-server-91o</guid>
      <description>&lt;p&gt;The desktop I wasn't using now runs storage, container services, a deployment manager and a Windows environment. &lt;a href="https://www.proxmox.com/en/products/proxmox-virtual-environment/features" rel="noopener noreferrer"&gt;Proxmox&lt;/a&gt; gives those jobs separate virtual machines on the same physical computer. My MacBook had already taken over everyday use, leaving the desktop available to become a more capable server.&lt;/p&gt;

&lt;p&gt;That is the useful change for me: more compute to run things, while the laptop remains the computer I sit down with. Getting there was annoying, and the separate VMs still share some important dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  Separate guests, shared hardware
&lt;/h2&gt;

&lt;p&gt;The primary machine is an i7-9700K. Around 40 TB is available through &lt;a href="https://docs.openmediavault.org/en/stable/" rel="noopener noreferrer"&gt;OpenMediaVault&lt;/a&gt;, and October's usable-memory reading is consistent with the 64 GB specification recorded in July. Those checks describe the current machine, not exactly what was attached during the move.&lt;/p&gt;

&lt;p&gt;OpenMediaVault has its own VM. A &lt;a href="https://docs.docker.com/get-started/docker-overview/" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; guest runs services including Plex and Home Assistant, while &lt;a href="https://komo.do/docs/intro" rel="noopener noreferrer"&gt;Komodo&lt;/a&gt; runs in a separate guest to manage container deployments. Windows has another VM. A second Proxmox host runs a Docker guest with the alternate &lt;a href="https://docs.pi-hole.net/" rel="noopener noreferrer"&gt;Pi-hole&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fysdv1a6vml2pvrjbclb5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fysdv1a6vml2pvrjbclb5.png" alt="The primary Proxmox host contains separate OpenMediaVault, Docker, Komodo and Windows guests. A second host contains a Docker guest running the alternate Pi-hole." width="768" height="862"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Current layout, checked on 6 October 2026. The boxes are separate VMs; the four guests in the upper group still share one physical host.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The grouping matters. Four guests on the primary host still depend on that physical machine. The media services also depend on the storage OpenMediaVault supplies. Splitting the jobs into VMs does not remove those shared dependencies.&lt;/p&gt;

&lt;h2&gt;
  
  
  The move still broke things
&lt;/h2&gt;

&lt;p&gt;My &lt;a href="https://billiem.uk/posts/you-need-a-home-server/" rel="noopener noreferrer"&gt;earlier server&lt;/a&gt; was an old i5 running OpenMediaVault, and I used it all the time. Transferring its role to the spare desktop took a day or two. Services went down, DNS broke, and I had to move things across slowly.&lt;/p&gt;

&lt;p&gt;There was a configuration I hadn't saved properly before wiping a drive. I cannot remember which one, so I can't give that mistake a more useful name now. I had to recreate it manually. “Ah damn it, lost that.” It was a huge pain, but it wasn't the end of the world and it ended up fine.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Windows VM alongside the server
&lt;/h2&gt;

&lt;p&gt;I spun up a Windows VM at one point to do something, which was nice. It gave me a Windows environment without turning the whole physical computer into my Windows desktop.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx2k0uqng9kdo9mhyzbsb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx2k0uqng9kdo9mhyzbsb.png" alt="The Proxmox resource tree lists four running guests on gluesoup-0: OpenMediaVault, Komodo, Docker and Windows." width="600" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The primary host’s actual Proxmox resource tree, captured on 6 October 2026. This shows the setup now, not during the migration.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The extra compute has been nice, and things feel quicker in use. My everyday setup is still the two MacBooks: one for work and one personal. Upstairs I have two monitors; downstairs I have one. At either desk, a couple of cables handle charging, the displays and the peripherals I need.&lt;/p&gt;

&lt;p&gt;I don't miss having a dedicated Linux machine either. I've moved away from the terminal and use AI heavily now, including &lt;a href="https://billiem.uk/posts/codex-home-server-infrastructure/" rel="noopener noreferrer"&gt;Codex for server operations&lt;/a&gt;. A MacBook, AI and an AI desktop app is my ideal workflow.&lt;/p&gt;

&lt;p&gt;Occasionally I think it would be nice to play a game and no longer have that desktop available. It isn't enough to make me go back or buy a dedicated gaming computer for such little use. The machine is useful to me as a server, and the laptop arrangement suits me.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/why-i-moved-my-desktop-into-proxmox/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>proxmox</category>
      <category>selfhosting</category>
      <category>homelab</category>
      <category>linux</category>
    </item>
    <item>
      <title>What GPT-6.1 Sol chose to build</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Thu, 01 Oct 2026 12:38:32 +0000</pubDate>
      <link>https://dev.to/billiem/what-gpt-61-sol-chose-to-build-495a</link>
      <guid>https://dev.to/billiem/what-gpt-61-sol-chose-to-build-495a</guid>
      <description>&lt;p&gt;A cutting layout can look convincing while leaving its cut order ambiguous. A document comparison can work while putting its navigation offscreen. A traffic solver can return the right numbers without making them understandable.&lt;/p&gt;

&lt;p&gt;Those were concrete review problems in three autonomous GPT-6.1 Sol experiments. The subjects were freely chosen: sheet cutting, the editing of an official record, and congestion. What changed during review was how someone could inspect and use the result.&lt;/p&gt;

&lt;p&gt;I wanted to continue the &lt;a href="https://billiem.uk/posts/llm-choice-as-an-idea-engine/" rel="noopener noreferrer"&gt;Choice exercise&lt;/a&gt;: let a new model choose what to build, then examine its outputs and style. This batch ran at Extra High reasoning. The coordinating agent assigned compact, substantial and flagship ambition levels. One fresh builder chose all three topics and implemented the first two; a second fresh Sol builder took the flagship before public code existed.&lt;/p&gt;

&lt;h2&gt;
  
  
  A packing diagram needs a cutting sequence
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-01-sol61-xhigh-substantial/outputs/offcut" rel="noopener noreferrer"&gt;Try Offcut&lt;/a&gt; with sheet dimensions, part quantities, grain constraints and blade width. It produces a layout and a sequence of full cuts through the remaining rectangles. Playback shows when a piece is actually released, rather than merely showing where it ends up.&lt;/p&gt;

&lt;p&gt;The supplied job places nine parts on a 1,220 × 610 mm sheet. The blade's lost material changes feasibility: two 50 × 100 mm parts fit a 100 × 100 mm sheet with zero blade width, but only one fits with a 3 mm blade.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgroqspk0z7xh1jarfcj6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fgroqspk0z7xh1jarfcj6.png" alt="A 1,220 by 610 mm sheet contains three labelled shelves, two sides, smaller pieces and hatched remainder areas, with grain running horizontally." width="768" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Offcut's supplied nine-part layout. The diagram accounts for blade loss and grain; no physical cutting was tested.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The review problem was in the CSV cut order. Two physical copies of identically named stock were indistinguishable. Stable physical sheet IDs now distinguish them. Mobile feedback also changed because solving could leave the result offscreen.&lt;/p&gt;

&lt;p&gt;The outputs include a dimensioned SVG, CSV instructions, editable JSON and remaining-stock inventory. Their usefulness still depends on the model's bounds: axis-aligned rectangular parts and full guillotine cuts. Damaged edges, trimming allowance, clamping and tool clearance are excluded, and no physical cutting was tested. An unplaced part is not proof that every possible arrangement fails; this is a bounded search.&lt;/p&gt;

&lt;h2&gt;
  
  
  A text comparison needs a way back to its source
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-01-sol61-xhigh-jewel/outputs/minutes" rel="noopener noreferrer"&gt;Explore The Minutes&lt;/a&gt; by selecting sentences across six authored versions of a fictional exhibition incident. It exposes earlier wording and lets you recover facts omitted from the current record.&lt;/p&gt;

&lt;p&gt;“The issue was managed promptly” traces back to a request to isolate the power, refused because the display lighting had to stay on. The final reassurance is not established by that first account. The sequence also contains a useful correction: an uncertain pump-stoppage time becomes a time supported by the controller log. Editing is not uniformly treated as concealment.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8i6wfqkti7xvtgjaq58z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8i6wfqkti7xvtgjaq58z.png" alt="The earlier isolation request and refusal are struck through above the introduced reassurance, ‘The issue was managed promptly.’" width="349" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The final record compared with the first account in The Minutes. This ancestry belongs to an explicitly authored fictional incident.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The initial navigation began below the visible page. Review moved it above the document; on mobile, selecting a sentence brings its provenance into view and supplies a return to the sentence. The explanation distinguishes removed facts from introduced assurances. The corpus and its ancestry are authored, so this is an inspectable argument, not a dishonesty detector for uploaded documents.&lt;/p&gt;

&lt;h2&gt;
  
  
  A solver needs more than its raw output
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-10-01-sol61-xhigh-flagship/outputs/shortcut" rel="noopener noreferrer"&gt;Change the network in The Shortcut Tax&lt;/a&gt;. At the default west demand of six flow units, average travel is 80 minutes without the shortcut and 100 with it under individual route choice. No driver can save time by switching routes alone.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4my4f2krrtgbs689rpmp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F4my4f2krrtgbs689rpmp.png" alt="The open shortcut carries four flow units, and average travel is 100 minutes beside an 80-minute outer-roads comparison. Individual route choice is selected." width="388" height="930"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The default six-unit demand with the shortcut open. These are results of the teaching network, not measured traffic times.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Coordinated routing restores the 80-minute average. Pricing each driver's imposed delay can reproduce it too, with tolls expressed in equivalent minutes. Changing demand can make the same shortcut helpful, harmful or unused.&lt;/p&gt;

&lt;p&gt;The prototype initially exposed calculations as raw JSON. Review asked for a legible network, road and route costs, a demand sweep and a toll ledger. A second origin makes the shared bottleneck's effects inspectable by neighbourhood. These are teaching results under fixed demand, instantaneous equilibrium and simple congestion costs, not measured traffic or a forecast with queues.&lt;/p&gt;

&lt;p&gt;The published surfaces still resemble &lt;a href="https://billiem.uk/posts/gpt-6-astra-choice/" rel="noopener noreferrer"&gt;September's Astra batch&lt;/a&gt; in their warm paper, serif headings and muted colours. The working conditions differ: Astra used three separately assigned builders at Max, with different subjects and a different brief. These portfolios cannot establish a model's taste or superiority.&lt;/p&gt;

&lt;p&gt;The concrete comparison is between the prototype and what a visitor can now do. Follow a sentence back, distinguish physical sheets in a kept cut order, or inspect why the network's travel time changes. Review altered those routes into the underlying work, not just its finish.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/gpt-6-1-sol-choice/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Free compute in October 2026: new backends and temporary VMs</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Thu, 01 Oct 2026 11:42:01 +0000</pubDate>
      <link>https://dev.to/billiem/free-compute-in-october-2026-new-backends-and-temporary-vms-2mil</link>
      <guid>https://dev.to/billiem/free-compute-in-october-2026-new-backends-and-temporary-vms-2mil</guid>
      <description>&lt;p&gt;Two of October’s useful development routes let you postpone signup: a temporary Postgres project and a Linux machine reached over SSH. The database lasts three days; the machine gives you an hour to build. The claim links and account handoffs have their own limits.&lt;/p&gt;

&lt;p&gt;This is the &lt;strong&gt;1 October 2026&lt;/strong&gt; check, based on official pricing and documentation. No accounts or workloads were created for it. The &lt;a href="https://billiem.uk/free-compute/" rel="noopener noreferrer"&gt;maintained free-compute guide&lt;/a&gt; carries the broader shortlist, and the &lt;a href="https://billiem.uk/posts/free-compute-september-2026/" rel="noopener noreferrer"&gt;September edition&lt;/a&gt; is the previous snapshot. The focus here is getting a prototype started, then keeping its expiry and credit conditions attached to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A database before its owner signs up
&lt;/h2&gt;

&lt;p&gt;An agent can create a &lt;a href="https://neon.com/docs/reference/claimable-neon" rel="noopener noreferrer"&gt;Claimable Neon&lt;/a&gt; Postgres project before a human has an account. Neon &lt;a href="https://neon.com/docs/changelog#2026-09-11" rel="noopener noreferrer"&gt;announced that route on 11 September&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The unclaimed project gets &lt;strong&gt;100 MB storage and 1 GB transfer&lt;/strong&gt;. There are two deadlines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The project expires after &lt;strong&gt;72 hours&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Its claim code expires after &lt;strong&gt;15 minutes&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A database can still exist after its original claim code has expired. Treating those clocks as one deadline would miss the shorter one.&lt;/p&gt;

&lt;p&gt;The Data API and Auth can be requested at creation. Functions, Object Storage and AI Gateway require claiming first. That leaves a useful temporary route for generating and testing a database-backed prototype, with a clear boundary around which backend products are available before onboarding. It does not replace the permanent Free plan or a backup.&lt;/p&gt;

&lt;h2&gt;
  
  
  A shell for the development session
&lt;/h2&gt;

&lt;p&gt;Railway’s equivalent entry point is a command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh railway.new
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;a href="https://railway.com/changelog/2026-09-25-free-vms-without-an-account" rel="noopener noreferrer"&gt;25 September announcement&lt;/a&gt; describes a Linux VM with &lt;strong&gt;2 vCPU and 2 GB RAM&lt;/strong&gt;, coding agents already installed, and a private preview URL. It needs neither an account nor a payment card.&lt;/p&gt;

&lt;p&gt;Here the active development window is &lt;strong&gt;60 minutes&lt;/strong&gt;, followed by &lt;strong&gt;24 hours to claim the VM&lt;/strong&gt;. Claiming transfers the machine, files and URL into an account and makes the preview shareable. Unclaimed machines and files are deleted. Save or claim work before the clock runs out.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://docs.railway.com/pricing/free-trial" rel="noopener noreferrer"&gt;trial documentation&lt;/a&gt; adds three anonymous boxes per IP address per day and regional capacity restrictions. Claiming also changes the billing context: the workload moves into the account’s ordinary credits and billing. The separate signup trial is $5 for 30 days, followed by $1 of recurring monthly Free credit. An anonymous hour and an account’s monthly allowance are different offers.&lt;/p&gt;

&lt;h2&gt;
  
  
  After claiming, read the backend meters separately
&lt;/h2&gt;

&lt;p&gt;Neon’s &lt;a href="https://neon.com/docs/changelog#2026-09-18" rel="noopener noreferrer"&gt;backend became generally available on 18 September&lt;/a&gt;. Functions and Object Storage are available in Ohio, Northern Virginia, Frankfurt and Singapore, replacing September’s Ohio-only beta description with published Free allowances.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://neon.com/pricing" rel="noopener noreferrer"&gt;Free pricing page&lt;/a&gt; lists up to 100 Postgres projects, each with &lt;strong&gt;100 CU-hours per month and 0.5 GB database storage&lt;/strong&gt;. Object Storage gets &lt;strong&gt;5 GB per project&lt;/strong&gt;. Functions get &lt;strong&gt;10 active Capacity-Hours, 400 waiting Capacity-Hours and one million monthly invocations&lt;/strong&gt;; Auth includes &lt;strong&gt;60,000 monthly active users&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those figures cannot all be multiplied by 100. The &lt;a href="https://neon.com/docs/introduction/plans#functions" rel="noopener noreferrer"&gt;plan documentation&lt;/a&gt; applies the Functions limits across the account as well as independently per project. A project’s &lt;strong&gt;5 GB network allowance is shared&lt;/strong&gt; by Postgres, Object Storage and Functions.&lt;/p&gt;

&lt;p&gt;Active Capacity-Hours measure CPU work; waiting Capacity-Hours measure time waiting on I/O. Adding them together does not produce 410 hours of an arbitrary always-on server. AI Gateway also uses purchased prepaid credits, so the backend launch does not supply free model inference.&lt;/p&gt;

&lt;h2&gt;
  
  
  A compute credit may exclude the API you call
&lt;/h2&gt;

&lt;p&gt;For a GPU or model experiment, the product covered by the credit matters as much as its size.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modal’s $30 is recurring compute credit.&lt;/strong&gt; Its &lt;a href="https://modal.com/pricing" rel="noopener noreferrer"&gt;current pricing FAQ&lt;/a&gt; covers CPU, GPU and memory usage in Functions, Sandboxes and Notebooks. Shared Endpoints tokens are excluded and billed from the first request, effective &lt;strong&gt;1 September 2026&lt;/strong&gt;. The &lt;a href="https://modal.com/docs/guide/budgets" rel="noopener noreferrer"&gt;Workspace spend limit&lt;/a&gt; is the cash cap; a usage budget measures usage before credits. A payment method is required, and extra compute can charge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lightning’s GPU credits are a starter balance.&lt;/strong&gt; The &lt;a href="https://lightning.ai/pricing" rel="noopener noreferrer"&gt;current offer&lt;/a&gt; gives five credits on registration and 25 more after adding a payment card. Unused credits expire after &lt;strong&gt;12 months&lt;/strong&gt;. GPU work spends that balance. One CPU Studio can remain free with a restart every four hours. September’s claim of 15 recurring monthly credits is not supported by today’s offer; no dated announcement was found to establish when it changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mistral publishes a monthly API allowance.&lt;/strong&gt; Its &lt;a href="https://mistral.ai/pricing/" rel="noopener noreferrer"&gt;Free pricing&lt;/a&gt; now specifies &lt;strong&gt;$10 per month in API credits&lt;/strong&gt;. The &lt;a href="https://docs.mistral.ai/admin/billing-usage/subscriptions" rel="noopener noreferrer"&gt;subscription documentation&lt;/a&gt; shares usage across Studio, API and Vibe Code. With pay-as-you-go disabled, exhausted usage can stop until renewal; enabling it allows additional tokens to bill. Model access and rate limits still need checking for the account. This is a current pricing observation, with no established launch date.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batch work can wait; VM promotions can end
&lt;/h2&gt;

&lt;p&gt;A prototype’s non-urgent processing has another dated option. Cloud Run added &lt;a href="https://docs.cloud.google.com/run/docs/release-notes" rel="noopener noreferrer"&gt;delayed job execution in Preview on 8 September&lt;/a&gt;: provisioning can wait up to &lt;strong&gt;12 hours&lt;/strong&gt; for a lower price, and execution can then run for up to 12 hours.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://cloud.google.com/run/pricing" rel="noopener noreferrer"&gt;pricing table&lt;/a&gt; gives a monthly free equivalent of &lt;strong&gt;342,857 vCPU-seconds and 642,857 GiB-seconds&lt;/strong&gt; at Tier 1 pricing. Google applies the free tier as a spending discount aggregated by billing account. The delayed-job, ordinary-job and request-based rows are not independent grants to add together. A billing-enabled account is involved, and builds, stored images, networking and excess usage can charge. The &lt;a href="https://docs.cloud.google.com/run/docs/delayed-jobs" rel="noopener noreferrer"&gt;scheduling documentation&lt;/a&gt; carries the execution limits.&lt;/p&gt;

&lt;p&gt;For a longer-running ARM VM, the &lt;a href="https://aws.amazon.com/ec2/instance-types/t4/" rel="noopener noreferrer"&gt;AWS T4g promotion&lt;/a&gt; still provides &lt;strong&gt;750 aggregate t4g.small hours per month&lt;/strong&gt;, ending &lt;strong&gt;31 December 2026&lt;/strong&gt;. Disks, public IPv4 and surplus CPU can charge. Its end date needs to travel with the instance-hours figure.&lt;/p&gt;

&lt;p&gt;The temporary database and SSH machine give a prototype somewhere to start. Their short claim windows remain relevant even while the resources still exist. Once work moves into an account, the covered product, shared meters and billing settings determine what the headline allowance actually buys.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/free-compute-october-2026/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>webdev</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>What GPT-6 Astra chose to build</title>
      <dc:creator>Billie M</dc:creator>
      <pubDate>Sun, 13 Sep 2026 21:44:20 +0000</pubDate>
      <link>https://dev.to/billiem/what-gpt-6-astra-chose-to-build-5e9a</link>
      <guid>https://dev.to/billiem/what-gpt-6-astra-chose-to-build-5e9a</guid>
      <description>&lt;p&gt;The first prototype of Loose End had a string, three pegs and four bells. It also had arrow-key controls that ignored short presses. A coordinating agent found the input problem and sent it back to the builder before the game was finished.&lt;/p&gt;

&lt;p&gt;That repair is part of GPT-6 Astra's first &lt;a href="https://billiem.uk/choice/" rel="noopener noreferrer"&gt;Choice batch&lt;/a&gt;. I asked for three independent experiments with room to choose their subjects. Three Astra agents ran at max reasoning, assigned something to play, explore or use. They produced a string puzzle, a supply-chain model and a tool for making a printed booklet, published on 4 September.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://billiem.uk/posts/gpt-5-6-needed-a-more-ambitious-prompt/" rel="noopener noreferrer"&gt;existing brief&lt;/a&gt; required prototype review before polish. The &lt;a href="https://github.com/BillieM/billiemuk/tree/7c4dd81dcffaf70557d90ef45f5f5be756a5469d/surfaces/choice/batches/2026-09-04-astra" rel="noopener noreferrer"&gt;batch's curation record&lt;/a&gt; shows what the reviewer asked the builders to change. These were separate projects with corrections, not matched trials against another model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Short key taps did nothing
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://billiem.uk/choice/experiments/2026-09-04-astra-play/outputs/loose-end" rel="noopener noreferrer"&gt;Loose End&lt;/a&gt;, you move the brass end of a finite string around the board. It catches around pegs, so a route that reaches a bell can leave less string available for the next one. Ringing all four bells is not enough: the string has to come home too.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbhzfcdx0146bs756n9z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbbhzfcdx0146bs756n9z.png" alt="Bell I is marked as reached, and a red string bends around a peg between home and the brass end." width="768" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A played position in Loose End. The route taken around the pegs changes how much string remains; this capture does not show a completed game.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The input fix made brief keypresses work. The later checks went further than reaching one bell: they exercised two winning strategies and retraced a long move sequence back to its starting point. Those checks concern the game's route rules and unwinding. They do not turn its planar taut-string model into a simulation of friction or elastic rope. It remains one authored course.&lt;/p&gt;

&lt;h2&gt;
  
  
  Put both order histories on the same scale
&lt;/h2&gt;

&lt;p&gt;The review request for &lt;a href="https://billiem.uk/choice/experiments/2026-09-04-astra-explore/outputs/the-order-echo" rel="noopener noreferrer"&gt;The Order Echo&lt;/a&gt; concerned how to see a comparison. Its shop, wholesaler, depot and factory could react to the same demand under different ordering rules, but the reviewer wanted their traces visible on a shared scale, with the ingredients of each order exposed.&lt;/p&gt;

&lt;p&gt;The finished interface lets you select a week and stage to inspect its arithmetic. One busy shopping week, twelve crates instead of four, drives the starting chain's factory orders to a peak of 76.8 crates in week twelve.&lt;/p&gt;

&lt;p&gt;Counting outstanding orders changes that result. The shop initially orders more, 14.5 rather than 12.5 crates: the higher demand forecast raises its desired amount on order, and the gap to that target adds a correction. As the simulation continues, the policy counts orders awaiting delivery, including supplier backlog. The factory peak drops to 38.1 in week nine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9denbn29hvptvatxonb1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9denbn29hvptvatxonb1.png" alt="The Order Echo compares a factory peak of 38.1 in week 9 with 76.8 in week 12, with both chains on the same scale." width="768" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Discovery 02 counts crates already ordered. The dotted traces retain the starting policy; these values are results of this teaching model.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The dotted starting-policy traces remain beside the changed run. The result and its timing can be compared directly. All of these quantities belong to the model's chosen rules, continuous crate quantities and 48-week window, with unlimited production upstream of the factory. They are not business forecasts.&lt;/p&gt;

&lt;h2&gt;
  
  
  The saved file and the visible sheet
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://billiem.uk/choice/experiments/2026-09-04-astra-use/outputs/pocket-press" rel="noopener noreferrer"&gt;Pocket Press&lt;/a&gt; takes a cover, manuscript and back cover and arranges an eight-page booklet on one A4 or US Letter sheet. It keeps a reading view alongside the print arrangement and can save printable output, an SVG sheet and editable source.&lt;/p&gt;

&lt;p&gt;The reviewer asked for discoverable save actions, folding instructions and a way to reopen that source. The recorded browser checks downloaded the actual files, read back their geometry and text, and restored the manuscript from its saved source. Overflow blocks printable exports while leaving source saving available.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx2o1byntr4sl0d48r3zb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fx2o1byntr4sl0d48r3zb.png" alt="Pocket Press shows the sample manuscript beside an A4 sheet with pages 5, 4, 3, 2 upside down above pages 6, 7, 8, 1." width="768" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The supplied sample in Pocket Press's print-sheet view at a 900-pixel browser width. The unusual page order is for folding a single sheet into an eight-page book.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The print arrangement is deliberately unfamiliar: pages 5, 4, 3 and 2 upside down above 6, 7, 8 and 1. It is meant to become a book after cutting the central slit and folding the sheet.&lt;/p&gt;

&lt;p&gt;Capturing the article's images found a different problem. At a 1,280-pixel browser width on 9 September, the print sheet extended beyond its preview area and was cropped at the top and bottom. The 900-pixel view shown here fits. Reading back a correctly arranged export had not tested that wider preview.&lt;/p&gt;

&lt;p&gt;The paper result is still untested. All the checks described here were performed by agents or automation; no physical printer or fold was tried. Pocket Press supplies a numbered test sheet, ready for the part of the experiment that needs a sheet of paper.&lt;/p&gt;




&lt;p&gt;Want to talk about something I’ve written or built? &lt;a href="https://billiem.uk/contact/" rel="noopener noreferrer"&gt;Get in touch&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This article was adapted with AI assistance from &lt;a href="https://billiem.uk/posts/gpt-6-astra-choice/" rel="noopener noreferrer"&gt;an original article on billiem.uk&lt;/a&gt;. The original article was reviewed before publication.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>testing</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
