<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>kaimac.org</title>
        <link>https://kaimac.org</link>
        <image>
            <url>https://kaimac.org/me.gif</url>
            <title>kaimac.org</title>
            <link>https://kaimac.org</link>
        </image>
        <description>Recent pages on kaimac.org</description>
        <language>en-gb</language>
        <lastBuildDate>Mon, 25 May 2026 23:41:00 +0000</lastBuildDate>
        <atom:link href="https://kaimac.org/feed.xml" rel="self" type="application/rss+xml" />
<item>
    <title>The Weaver web browser</title>
    <link>https://kaimac.org/w/weaver</link>
    <guid>https://kaimac.org/w/weaver</guid>
    <pubDate>Mon, 25 May 2026 23:41:00 +0000</pubDate>
    <description>
&lt;p&gt;I think the world needs more web browsers, so I'm making one. It's an experiment - I want to see if you can take a really simple approach to rendering pages. To set your expectations, this is a browser for the "document-based" web - no javascript, and so no web apps.
&lt;p&gt;&lt;figure&gt; &lt;img style="border:1px solid black;" src="https://codeberg.org/kaimac/weaver/media/branch/main/doc/screenshot.png" tabindex=1&gt;&lt;figcaption&gt;Latest screenshot from codeberg&lt;/figcaption&gt; &lt;/figure&gt;&lt;h2&gt;The idea&lt;/h2&gt;
&lt;p&gt;We all know the web is in a bit of a state right now. As it has morphed into a web app delivery platform, its complexity has &lt;a href="https://drewdevault.com/blog/Reckless-limitless-scope/"&gt;ballooned&lt;/a&gt;. Pages have become &lt;a href="https://danluu.com/slow-device/"&gt;bloated&lt;/a&gt;. If you want to make a new browser that is capable of rendering the modern web as it is, it's an &lt;a href="https://github.com/LadybirdBrowser/ladybird"&gt;enormous undertaking&lt;/a&gt;. This is a bit of a shame for those of us who still see the promise of the web as a set of rich, interlinked documents.
&lt;p&gt;There are simple browsers out there, like &lt;a href="https://dillo-browser.org/"&gt;Dillo&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/NetSurf"&gt;netsurf&lt;/a&gt;. Dillo has been around since 1999 and development restarted a few years ago. It's great fun, but I find that I'm always having to toggle the embedded and remote CSS options to get the page in a usable state. It tries to render pages as best it can, but problems occur because its implementation of CSS is only partial. netsurf has a similar problem on many sites.
&lt;p&gt;Weaver will have more in common with text-based browsers like links. These feel like true "user agents" in the sense that they largely ignore the intent of the web designer when it comes to presentation, and instead render the page in a way that the user has asked for, i.e. just text. I want to see if we can take this idea and extend it to graphical browsers. We can have rich text and images and tables and forms, but they'll be laid out like a document. Maybe we can detect structures like a tree of comments on a discussion board, or a forum thread, or a list of news headlines, and show them in a nice way without having to worry about styling too much.&lt;h3&gt;Some more vague ideas&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;If you use Dillo or a text-based browser, on big sites like wikipedia or news sites, you'll first be met with a wall of navigation links at the top of the page. There might be a "skip to content" link for accessibility, but why not just move all of these links out into a navigation sidebar? This could also contain a table of contents for the page based on its structure.
&lt;li&gt;We can make pages a bit richer than they are in normal browsers. For example, tables should be sortable and filterable! Wikipedia implements sorting with javascript, but it should just be part of the browser. Image alt text should be viewable (not just the title attribute).
&lt;li&gt;Page metadata should be viewable by the user, such as links to RSS feeds, and Open Graph data. If it's in the HTML source, the user might want to know about it.
&lt;li&gt;We can support cookies for logins, but the user must have full visibility and control over this
&lt;li&gt;I want the browser to have as small a footprint as possible. I want to do this to help keep old hardware alive, but also new hardware that's not very powerful. In fact I'd love for this to be able to run on a (beefy) microcontroller, say an ESP32 with 8MB of RAM. (I like microcontrollers ok)
&lt;/ul&gt;
&lt;p&gt;Weaver is on &lt;a href="https://codeberg.org/kaimac/weaver"&gt;codeberg&lt;/a&gt;. It can't even follow links yet so don't get too excited.
&lt;p&gt;Do you have any comments or suggestions? Please get in touch via email or Mastodon! Or just let me know if you think this is interesting.</description>
</item>
<item>
    <title>Thinkpad</title>
    <link>https://kaimac.org/w/thinkpad</link>
    <guid>https://kaimac.org/w/thinkpad</guid>
    <pubDate>Sun, 10 May 2026 17:55:00 +0000</pubDate>
    <description>
&lt;p&gt;I got an x201 thinkpad off ebay. &lt;figure&gt;&lt;img src="/files/DSC_2251~2.JPG" alt="ThinkPad X201" title="ThinkPad X201" tabindex=1&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;/figure&gt;
&lt;p&gt;The specs are:
&lt;ul&gt;
&lt;li&gt;2010 vintage
&lt;li&gt;CPU: i5-520M dual core, 2.4 GHz
&lt;li&gt;RAM: 6 GB DDR3
&lt;li&gt;Disk: 128 GB SSD (I replaced the HDD)
&lt;li&gt;Display: 12 inch TFT, 1280x800
&lt;li&gt;Keyboard: excellent
&lt;li&gt;Nipple: present
&lt;/ul&gt;
&lt;p&gt;It came with a hard drive with Windows 10 on it, which was so slow it was completely unusable. I replaced it with an SSD with Arch (btw), and it's fast again. I've been using netsurf as a browser, and also the text-based &lt;a href="https://sr.ht/~bptato/chawan/"&gt;chawan&lt;/a&gt; which is pretty good.
&lt;p&gt;This thing is *so* nice to type on. I've been using it to do some distraction-free programming, using &lt;a href="https://github.com/mps-youtube/yewtube"&gt;yewtube&lt;/a&gt; to listen to music from the terminal. I find that a bitmap font (I'm using Terminus) works nicely on the display.
&lt;p&gt;The only issue I have is the battery. It's a 9-cell, 80 Wh, which should give 6-10 hours of usage (power draw is about 8 W normally, 14 W when playing music). But it cuts out when it gets down to about 75% so I'm only getting a quarter of that. Still not awful, but I'd like to re-cell the battery at some point. They are just standard 18650 cells in a reasonably easily-opened plastic case, but I might need to get a spot welder to put tabs on the cells.
&lt;p&gt;&lt;i&gt;Sent from my ThinkPad&lt;/i&gt; </description>
</item>
<item>
    <title>Websites on old hardware</title>
    <link>https://kaimac.org/w/websites-old-hw</link>
    <guid>https://kaimac.org/w/websites-old-hw</guid>
    <pubDate>Fri, 24 Apr 2026 13:34:00 +0000</pubDate>
    <description>
&lt;p&gt;I love the idea of repurposing old hardware, especially if it's something simple and low power. This site's running on an ESP32 badge. Here are some others:
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.ctms.me/posts/2024-08-29-running-this-blog-on-a-pixel-5/"&gt;Dom Corriveau's blog&lt;/a&gt; running on a recycled android phone
&lt;li&gt;&lt;a href="https://thedorkweb.bearblog.dev/my-openwrt-home-server/"&gt;Notes From The Dork Web&lt;/a&gt; - running on an openwrt router
&lt;li&gt;&lt;a href="https://compost.party/"&gt;compost.party&lt;/a&gt; - shared server running on a solar-powered repurposed smartphone
&lt;li&gt;&lt;a href="https://sometimes.digital/posts/solarpunk-web-server/"&gt;dominika's&lt;/a&gt; experiments in making a tiny solar-powered server
&lt;li&gt;see also &lt;a href="https://solar.lowtechmagazine.com/about"&gt;low tech magazine's&lt;/a&gt; solar powered website
&lt;/ul&gt;
&lt;p&gt;It's the tiniest of protests against "bigger" tech and overconsumption, but it feels good, so go and give it a go! And let me know about it so I can add it to this list. 
&lt;ul&gt;
&lt;li&gt;I completely forgot about &lt;a href="https://caolan.uk/links/servers/"&gt;Caolan's great list&lt;/a&gt; of "servers with personality", which features these and even more, so go and check that out
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://100r.co/site/permacomputing_101.html"&gt;salvage computing&lt;/a&gt;</description>
</item>
<item>
    <title>Earth's field NMR</title>
    <link>https://kaimac.org/w/projects/earth-field-nmr</link>
    <guid>https://kaimac.org/w/projects/earth-field-nmr</guid>
    <pubDate>Thu, 23 Apr 2026 0:27:00 +0000</pubDate>
    <description>
&lt;p&gt;I got quite interested in the technique of EFNMR (&lt;a href="https://en.wikipedia.org/wiki/Earth%27s_field_NMR"&gt;wikipedia&lt;/a&gt;). 
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLJ04J62_rG0AwQ57wb8Rxp7jb_aW_m9UG"&gt;NMR experiments by Analogplanet96 on youtube&lt;/a&gt;
&lt;li&gt;&lt;a href="https://spectrum.ieee.org/listen-to-protons-diy-magnetometer"&gt;IEEE Spectrum article&lt;/a&gt;
&lt;li&gt;&lt;a href="https://alexmumm.de/dat/ppm_alexmumm_educational_listener.pdf"&gt;schematic for another design&lt;/a&gt; (pdf)
&lt;li&gt;&lt;a href="https://physlab.org/wp-content/uploads/2021/04/NMR-1-compressed.pdf"&gt;writeup of another system&lt;/a&gt; (pdf)
&lt;li&gt;&lt;a href="https://sci-hub.ru/10.1088/0957-0233/21/10/105902"&gt;A low-cost spectrometer for NMR measurements in the Earth's magnetic field&lt;/a&gt; (scihub pdf)
</description>
</item>
<item>
    <title>Cellular automata</title>
    <link>https://kaimac.org/w/cellular-automata</link>
    <guid>https://kaimac.org/w/cellular-automata</guid>
    <pubDate>Tue, 12 Aug 2025 1:52:00 +0000</pubDate>
    <description>
&lt;p&gt;&lt;center&gt;&lt;canvas id="grid" style="image-rendering: pixelated; width:100%; max-width:512px;"&gt;&lt;/canvas&gt;&lt;/center&gt; &lt;script&gt; var importObject = {     env: {         consoleLog: (arg) =&gt; console.log(arg),     }, }; WebAssembly.instantiateStreaming(fetch("/files/cells.wasm"), importObject).then((result) =&gt; {     const wasm = result.instance.exports;     console.log(wasm);     const canvas = document.getElementById("grid");     canvas.width = wasm.img_xsize();     canvas.height = wasm.img_ysize();     const context = canvas.getContext("2d");     const imageData = context.createImageData(canvas.width, canvas.height);     var mouseX, mouseY;     var mouseDown = false;     var mouseDownEvent = false;     wasm.init();     canvas.addEventListener('mousemove', function(event) {         const rect = canvas.getBoundingClientRect();         var widthScale = canvas.width / rect.width;         var heightScale = canvas.height / rect.height;                 mouseX = parseInt((event.clientX - rect.left) * widthScale);         mouseY = parseInt((event.clientY - rect.top) * heightScale);     });     canvas.addEventListener('touchmove', function(event) {         const rect = canvas.getBoundingClientRect();         var widthScale = canvas.width / rect.width;         var heightScale = canvas.height / rect.height;                 mouseX = parseInt((event.changedTouches[0].clientX - rect.left) * widthScale);         mouseY = parseInt((event.changedTouches[0].clientY - rect.top) * heightScale);         console.log(mouseX, mouseY);     });     canvas.addEventListener('mousedown', function(event) {         mouseDown = true;         mouseDownEvent = true; // catch short clicks that occur within a frame     });     canvas.addEventListener('mouseup', function(event) {         mouseDown = false;     });         const draw = () =&gt; {         wasm.tick(mouseX, mouseY, mouseDown || mouseDownEvent);         mouseDownEvent = false;         imageData.data.set(new Uint8Array(wasm.memory.buffer,wasm.img_data,canvas.width*canvas.height*4));         context.putImageData(imageData, 0, 0);     };     draw();     setInterval(() =&gt; {         draw();     }, 50); }); &lt;/script&gt;
&lt;p&gt;A &lt;a href="https://en.wikipedia.org/wiki/Life-like_cellular_automaton"&gt;grid of cells&lt;/a&gt; that obey two rules. Every cell has 8 neighbours - up, down, left, right and diagonals. A dead cell becomes alive if the number of its living neighbours is one of the numbers in the birth rule, and a living cell stays alive if the number of its living neighbours is one of the numbers in the survival rule (otherwise it dies).
&lt;p&gt;You can click on the numbers to change the rules. If you find something interesting, you can use this kind of notation and search for it: B5678/S45678. By searching that I learned that this particular one is called the Vote rule. Conway's Game of Life has the rule B3/S23.
&lt;p&gt;This was a little experiment with Zig and WebAssembly. The font is from &lt;a href="https://damieng.com/typography/zx-origins/"&gt;damieng&lt;/a&gt;, who has made loads of great bitmap fonts.
&lt;p&gt;&lt;a href="/files/cells.zig"&gt;source code&lt;/a&gt;</description>
</item>
<item>
    <title>Site update</title>
    <link>https://kaimac.org/w/site-update</link>
    <guid>https://kaimac.org/w/site-update</guid>
    <pubDate>Sun, 10 Aug 2025 14:24:00 +0000</pubDate>
    <description>
&lt;p&gt;Hello! I've made some changes to the site. Inspired by &lt;a href="https://alexschroeder.ch"&gt;Alex Schroeder's site&lt;/a&gt;, it's now a (very) simple "wiki", although I don't know if you can call it that if it's just me editing it. It's a "wiki of one". The main change is that I can edit pages in the browser, which is very nice. It means I can add things from my phone for example. And I think that viewing it as a wiki rather than a blog will allow me to post things more readily, without having to worry about writing a good "Blog Post".
&lt;p&gt;The software is so simple, just a few hundred lines of Python, there's not much to say about it. Flat files, HTML forms and HTTP basic auth get you a long way. I'll save the details for another page. </description>
</item>

    </channel>
</rss>