<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
    <title>~cartwright's Minimalist Blog</title>
    <link>https://tilde.club/~cartwright/blog/</link>
    <description>Built with Perl 5.8</description>
        <item>
            <title>Rolling My Own: Leaving Bashblog for Perl 5.8</title>
            <link>https://tilde.club/~cartwright/blog/2026/06/26/rolling-my-own-leaving-bashblog-for-perl-5-8.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/06/26/rolling-my-own-leaving-bashblog-for-perl-5-8.html</guid>
            <description>&lt;p&gt;For a while, bashblog did exactly what I needed it to do. It was a single script, it didn&apos;t require a database, and it kept things out of the corporate cloud. But eventually, the cracks started to show. The moment you want to fix the markdown formatting issues, change how files are structured, tweak the layout logic, or manage index compilation without losing your mind, hacking away at a massive shell script feels less like minimalism and more like fighting a tool that wasn&apos;t built for your specific workflow.&lt;/p&gt;

&lt;p&gt;So, I did what anyone would do: I went looking for an alternative.&lt;/p&gt;

&lt;p&gt;The state of modern web software is excessively bloated. I spent a couple of hours digging through the current landscape of &quot;lightweight&quot; blogging engines and static site generators. Most of what I found was bloated beyond belief—engines wrapped in heavy JavaScript frameworks, massive Python dependency trees, used overly complex PHP (not that I have anything against PHP on its own) or tools that require pulling down hundreds of megabytes of packages just to compile a few plain text files into HTML. Even the self-proclaimed minimalist options still felt over-engineered for what should be a simple text-processing pipeline.&lt;/p&gt;

&lt;p&gt;Nothing was even close. If you want something done cleanly without the extra weight, you usually have to write it yourself.&lt;/p&gt;

&lt;p&gt;The final spark came when I was looking through &lt;a href=&quot;https://lovie.dev&quot;&gt;Levi&apos;s&lt;/a&gt; website repository and saw their &lt;a href=&quot;https://git.lovie.dev/levi/website/src/branch/master/newpost.sh&quot;&gt;newpost.sh&lt;/a&gt; script. It’s a beautifully simple, no-nonsense shell utility designed to stream-line making a new entry. It reminded me how straightforward the process should be. But instead of sticking strictly to a shell script pipeline for the entire compiler backend, I wanted a dedicated language built from the ground up for heavy text manipulation.&lt;/p&gt;

&lt;p&gt;I decided to roll my own static site compiler in Perl 5.8.&lt;/p&gt;

&lt;p&gt;Yes, Perl 5.8. It’s a tool from a different era, but it is absolutely unbeatable. It is blazingly fast, runs natively on virtually any Unix-like box you throw it at, handles regular expressions like second nature, and has zero external runtime dependencies.&lt;/p&gt;

&lt;p&gt;My new setup reads basic text files with custom metadata headers, runs them through a simple template block, and compiles the entire site—including the master index and an RSS feed—in just a few milliseconds. No Node modules, no complex database configurations, and no overhead. Just raw text, strict logic, and clean HTML.&lt;/p&gt;

&lt;p&gt;It feels good to finally have a setup where I know exactly what every single line of code is doing.&lt;/p&gt;</description>
            <pubDate>Jun 26, 2026</pubDate>
        </item>
        <item>
            <title>Architectural Analysis: CMR vs. SMR Hard Drive Technologies (I know this is not written in the blog tone)</title>
            <link>https://tilde.club/~cartwright/blog/2026/06/25/cmr_vs_smr_comprehensive_analysis.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/06/25/cmr_vs_smr_comprehensive_analysis.html</guid>
            <description>&lt;style&gt;
        body {
            font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Helvetica, Arial, sans-serif;
            line-height: 1.6;
            color: #333333;
            max-width: 850px;
            margin: 40px auto;
            padding: 0 24px;
            background-color: #ffffff;
        }
        header {
            border-bottom: 2px solid #eaedf0;
            padding-bottom: 20px;
            margin-bottom: 32px;
        }
        h1 {
            font-size: 22pt;
            color: #1a202c;
            margin-bottom: 8px;
            line-height: 1.2;
        }
        .subtitle {
            font-size: 13pt;
            color: #4a5568;
            margin-top: 0;
            margin-bottom: 16px;
            font-weight: 400;
        }
        .meta {
            font-size: 10pt;
            color: #718096;
            display: block;
        }
        h2 {
            font-size: 15pt;
            color: #2d3748;
            margin-top: 36px;
            margin-bottom: 16px;
            border-left: 4px solid #4a5568;
            padding-left: 12px;
        }
        h3 {
            font-size: 12pt;
            color: #2d3748;
            margin-top: 24px;
            margin-bottom: 12px;
            font-weight: 600;
        }
        p {
            font-size: 11pt;
            margin-top: 0;
            margin-bottom: 16px;
            text-align: justify;
        }
        ul, ol {
            margin-top: 0;
            margin-bottom: 16px;
            padding-left: 24px;
        }
        li {
            font-size: 11pt;
            margin-bottom: 8px;
            text-align: justify;
        }
        table {
            width: 100%;
            border-collapse: collapse;
            margin: 28px 0;
            font-size: 10.5pt;
        }
        th, td {
            border: 1px solid #cbd5e0;
            padding: 12px;
            text-align: left;
            vertical-align: top;
        }
        th {
            background-color: #edf2f7;
            color: #2d3748;
            font-weight: 600;
        }
        tr:nth-child(even) td {
            background-color: #f7fafc;
        }
        .callout {
            background-color: #fff5f5;
            border-left: 4px solid #e53e3e;
            padding: 16px;
            margin: 24px 0;
            border-radius: 0 4px 4px 0;
        }
        .callout-title {
            font-weight: 700;
            color: #c53030;
            margin-bottom: 6px;
            font-size: 11pt;
        }
        .callout p {
            margin-bottom: 0;
            color: #9b2c2c;
        }
        strong {
            color: #1a202c;
        }
    &lt;/style&gt;
        &lt;div class=&quot;subtitle&quot;&gt;A Comprehensive Study on Data Corruption, Power Failures, Copy-on-Write Filesystem Incompatibilities, and the Contemporary Market Landscape&lt;/div&gt;
    &lt;!--     &lt;div class=&quot;meta&quot;&gt; --&gt;
    &lt;!--         &lt;strong&gt;Author:&lt;/strong&gt; Benjamin D. &amp;nbsp;|&amp;nbsp; &lt;strong&gt;Date:&lt;/strong&gt; June 2026 &amp;nbsp;|&amp;nbsp; &lt;strong&gt;Tags:&lt;/strong&gt; storage, cmr, smr, hdd, zfs --&gt;
    &lt;!--     &lt;/div&gt; --&gt;
    &lt;!-- &lt;/header&gt; --&gt;

&lt;section&gt;
        &lt;h2&gt;1. Technological Foundations: CMR vs. SMR&lt;/h2&gt;
        &lt;p&gt;Hard disk drive (HDD) architectures rely on magnetic recording techniques to read and write data onto spinning platters. As physical storage demands surpassed theoretical areal density limits, manufacturers shifted from standard Perpendicular Magnetic Recording (PMR) variants to two primary operational models: Conventional Magnetic Recording (CMR) and Shingled Magnetic Recording (SMR).&lt;/p&gt;
        
        &lt;p&gt;&lt;strong&gt;Conventional Magnetic Recording (CMR):&lt;/strong&gt; In a CMR drive, physical data tracks are written parallel to one another across the disk surface without any overlap. The write head, which is physically wider than the read head, writes a track size that matches its footprint exactly. Read operations occur directly over the center of these distinct, separated tracks. This guarantees that writing to an individual sector has absolutely zero impact on adjacent blocks, allowing for predictable, sustained random write behaviors.&lt;/p&gt;
        
        &lt;p&gt;&lt;strong&gt;Shingled Magnetic Recording (SMR):&lt;/strong&gt; SMR modifies this physical layout to overcome the physical limits of track narrowing. Because read heads are substantially smaller than write heads, SMR overlappingly writes data tracks, mimicking shingles on a residential roof. Each new track partially covers a portion of the previously written track. While this drastically increases areal density (up to 25% or higher per platter), it introduces a critical structural limitation: a track cannot be overwritten individually without corrupting or destroying the data on the adjacent tracks that overlap it.&lt;/p&gt;

&lt;h3&gt;Core Architecture Comparison&lt;/h3&gt;
        &lt;table&gt;
            &lt;thead&gt;
                &lt;tr&gt;
                    &lt;th&gt;Metric / Feature&lt;/th&gt;
                    &lt;th&gt;Conventional Magnetic Recording (CMR)&lt;/th&gt;
                    &lt;th&gt;Shingled Magnetic Recording (SMR)&lt;/th&gt;
                &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Track Structure&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;Isolated, parallel tracks with guard bands.&lt;/td&gt;
                    &lt;td&gt;Overlapping tracks resembling roof shingles.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Random Write Performance&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;High and predictable; direct sector overwrite.&lt;/td&gt;
                    &lt;td&gt;Extremely low under sustained loads; requires full zone rewrites.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Internal Architecture&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;Direct pass-through mapping from OS to physical sectors.&lt;/td&gt;
                    &lt;td&gt;Uses a complex Drive-Managed Translation Layer (similar to SSD FTL).&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Best Suited For&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;NAS, RAID arrays, Databases, Boot drives, High-write environments.&lt;/td&gt;
                    &lt;td&gt;Archival storage, sequential backups, cold data storage.&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;2. Operational Mechanics &amp;amp; Drive-Managed Architecture&lt;/h2&gt;
        &lt;p&gt;To make SMR drives backwards-compatible with standard computer architectures, manufacturers developed Drive-Managed SMR (DMSMR). The host operating system treats the device as a standard random-access sector block device, unaware of the physical shingling layout. To handle the overwrite limitation, the disk surface is segmented into &apos;Bands&apos; or &apos;Zones&apos; (typically 256 MB or higher in size), bounded by non-overlapping isolation guards.&lt;/p&gt;
        
        &lt;p&gt;When a single sector within an SMR zone must be modified, the drive cannot simply flip the magnetic orientation of that specific sector. Instead, it must read the entire zone into a cache, alter the targeted sector in volatile memory, and write back the entire zone sequentially from the beginning.&lt;/p&gt;
        
        &lt;p&gt;To mitigate the severe latency penalties of this process, DMSMR drives integrate a high-speed volatile RAM cache alongside a physical, non-shingled CMR &apos;landing zone&apos; on the outer edge of the platters. Incoming write operations are initially routed directly to this fast CMR cache. When the drive is idle, an internal garbage collection algorithm executes background migrations, reading data from the CMR cache, combining it, and writing it sequentially to the shingled zones.&lt;/p&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;3. Power Failure Vulnerabilities &amp;amp; Internal Data Corruption&lt;/h2&gt;
        &lt;p&gt;The illusion that an SMR drive behaves exactly like a CMR drive is maintained by an internal abstraction layer known as the Drive Translation Layer (DTL) or Device Managed Translation Layer. Similar to the Flash Translation Layer (FTL) in Solid State Drives (SSDs), the DTL translates logical block addresses (LBAs) requested by the operating system into physical addresses on the shingled platters. This architectural dependency creates acute vulnerabilities during sudden power loss events.&lt;/p&gt;
        
        &lt;h3&gt;Critical Risk: Drive Translation Layer Corruption&lt;/h3&gt;
        &lt;p&gt;A sudden loss of system power during active background garbage collection or zone allocation table flushes can cause a complete mismatch between the DTL lookup table and the physical sectors on the platters, effectively bricking or destroying data readability across healthy portions of the disk.&lt;/p&gt;
        
        &lt;p&gt;Specific corruption modes directly tied to SMR power failure profiles include:&lt;/p&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;Metadata and Allocation Table Desynchronization:&lt;/strong&gt; SMR drives maintain tracking metrics regarding active zones, clean zones, and CMR cache maps. If a power failure occurs while the drive is writing updated allocation tables from internal RAM to a persistent system track, the DTL can become corrupted. Upon reboot, the drive may fail to initialize, report a RAW filesystem, or register incorrect disk sizes (e.g., 0 bytes), requiring specialized hardware-level physical restoration.&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;In-Fight Zone Overwrite Destabilization:&lt;/strong&gt; If power is interrupted while the drive is executing a full-zone rewrite (shingling back modified data), the sequence will cut off mid-zone. Because the track write head partially covers adjacent tracks during operation, an incomplete write compromises not only the specific block intended for modification but also destroys valid downstream user data located in adjacent, overlapping tracks within the same zone.&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;Volatile Write-Cache Data Loss:&lt;/strong&gt; SMR drives acknowledge writes to the host operating system immediately upon reaching the volatile RAM cache or the CMR landing zone. In a power loss event where the OS has received a write verification, data that was still residing strictly in volatile RAM, or data queued for migration from the CMR cache to the shingled space, vanishes entirely. This leads to profound metadata inconsistency between the OS filesystem and the physical disk.&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;4. The Copy-on-Write (CoW) Conflict: ZFS / Btrfs / bcachefs and SMR Drives&lt;/h2&gt;
        &lt;p&gt;The deployment of Drive-Managed SMR drives within Copy-on-Write (CoW) filesystems, such as ZFS, Btrfs, or within software RAID architectures (like mdadm or TrueNAS Core/SCALE), represents a severe operational mismatch. ZFS was fundamentally designed with the assumption that the underlying physical storage medium is a deterministic, fast-response block device that handles random and sequential write commands predictably.&lt;/p&gt;
        
        &lt;p&gt;ZFS optimizes write pathways by gathering allocations and committing them via transaction groups (txgs) through a Copy-on-Write methodology. Instead of modifying blocks in-place, ZFS writes modified data to entirely new physical locations on the disk, subsequently modifying pointers up the metadata tree. This architectural design creates a highly destructive cascading performance cliff when paired with SMR technology.&lt;/p&gt;
        
        &lt;h3&gt;The Resilvering and Timeout Cascade Failure&lt;/h3&gt;
        &lt;p&gt;When a standard drive fails inside a ZFS VDEV (Virtual Device), a replacement drive is added, initiating a process known as resilvering. Resilvering scans the entire pool&apos;s metadata and writes the parity-constructed data back to the new drive. Because ZFS traverses metadata trees sequentially by object rather than physical sector order, the resulting write distribution looks highly randomized to the target drive.&lt;/p&gt;
        
        &lt;p&gt;When an SMR drive is introduced as a resilver target, the following failure sequence occurs:&lt;/p&gt;
        &lt;ol&gt;
            &lt;li&gt;Initial streams fill up the SMR drive&apos;s on-disk CMR landing zone cache almost instantly (typically within the first tens of gigabytes).&lt;/li&gt;
            &lt;li&gt;Once the CMR cache is fully saturated, the drive&apos;s firmware forces an immediate, non-interruptible garbage collection loop to clear space, trying to read-modify-write data out to shingled zones.&lt;/li&gt;
            &lt;li&gt;Because the incoming write stream is ongoing and highly fragmented, the drive must continuously execute zone rewrites. Data throughput collapses from ~150 MB/s to single-digit megabytes per second, or stalls completely.&lt;/li&gt;
            &lt;li&gt;The internal drive controller becomes so overwhelmed with background input/output operations that it ceases responding to external ATA command requests from the operating system host bus adapter (HBA).&lt;/li&gt;
            &lt;li&gt;The ZFS kernel module waits for a predetermined command timeout threshold (typically 30 seconds). When the SMR drive fails to respond within this window, ZFS assumes the drive has suffered a hardware failure or disconnected completely.&lt;/li&gt;
            &lt;li&gt;ZFS ejects the drive from the pool, marking it as &lt;strong&gt;FAULTED&lt;/strong&gt; or &lt;strong&gt;REMOVED&lt;/strong&gt;.&lt;/li&gt;
        &lt;/ol&gt;

&lt;div class=&quot;callout&quot;&gt;
            &lt;div class=&quot;callout-title&quot;&gt;Systemic Pool Degradation Danger&lt;/div&gt;
            &lt;p&gt;If multiple SMR drives are present within a RAIDZ array, the intensive write activity of a single resilver can cause multiple drives to hit the latency timeout threshold simultaneously. This triggers a multi-drive drop out, leading to immediate pool destruction and total data loss.&lt;/p&gt;
        &lt;/div&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;5. Improper Drive Shutdown Timelines and Host Violations&lt;/h2&gt;
        &lt;p&gt;When a computer operating system initiates a shutdown or unmount sequence, it issues strict architectural commands to all connected storage media. This involves sending an ATA FLUSH CACHE command followed by standby or power-down directives. For a standard CMR drive, processing a flush command is simple: any write commands remaining in the volatile onboard RAM cache are instantly flushed to their permanent, non-overlapping track locations, and the drive heads park safely within milliseconds.&lt;/p&gt;
        
        &lt;p&gt;For a Device-Managed SMR drive, a FLUSH CACHE command behaves in a fundamentally different and non-deterministic manner. The drive&apos;s internal firmware considers data &apos;flushed&apos; when it has successfully cleared volatile RAM and moved it into the permanent, non-shingled CMR landing zone cache. It then reports success back to the operating system.&lt;/p&gt;
        
        &lt;p&gt;Crucially, the hard work of migrating data from the CMR landing zone into the shingled bands has not yet occurred. The drive firmware requires an extended period of system inactivity (frequently stretching into minutes or hours after data transfer stops) to perform background zone consolidation.&lt;/p&gt;
        
        &lt;p&gt;If an operational environment utilizes improper drive shutdown timelines—such as immediately cutting power to external drive enclosures, hard-resetting enterprise servers via IPMI commands, or pulling portable USB-powered drives right after a file copy indicator completes—the drive is abruptly de-powered while its background firmware is actively running. Over time, these interrupted states cumulatively degrade the efficiency of the internal allocation tables, leading to sector tracking errors, read latency anomalies, and progressive file structure degradation.&lt;/p&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;6. Historical Timeline of SMR Market Integration&lt;/h2&gt;
        &lt;p&gt;The introduction of SMR into the commercial market was characterized by an initial phase of transparent archival targeting, followed by a highly controversial period of unannounced integration into mainstream desktop and NAS product lines.&lt;/p&gt;
        &lt;ul&gt;
            &lt;li&gt;&lt;strong&gt;2013-2014: Initial Introduction&lt;/strong&gt; – Seagate introduces the first commercial SMR drives under the &apos;Archive HDD&apos; nomenclature. These drives were clearly designated for cold storage, data preservation, and sequential access profiles. They were explicitly marketed as inappropriate for random write, server, or RAID workloads.&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;2015-2018: Stealth Integration&lt;/strong&gt; – As manufacturers hit density limits on standard 1TB and 2TB per platter configurations, they quietly integrated Drive-Managed SMR into standard 2.5-inch mobile notebook drives and lower-tier 3.5-inch consumer desktop drives without explicitly documenting the change on spec sheets.&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;2018-2019: Expansion into Network Attached Storage (NAS)&lt;/strong&gt; – Western Digital began substituting CMR configurations with SMR designs inside its highly popular WD Red NAS line (specifically the 2TB through 6TB models, such as the WD40EFAX), completely undocumented.&lt;/li&gt;
            &lt;li&gt;&lt;strong&gt;2020: The Industry Transparency Scandal&lt;/strong&gt; – System administrators and home server enthusiasts worldwide began noticing catastrophic RAID degradation and resilvering failures when deploying newly purchased WD Red drives. Following intense public backlash, independent hardware investigations, and threatened class-action litigation, Western Digital, Seagate, and Toshiba were forced to publish complete, comprehensive disclosures detailing exactly which drives utilized SMR. Western Digital subsequently re-branded its product stack, keeping SMR in the baseline &apos;Red&apos; tier, while introducing the &apos;Red Plus&apos; and &apos;Red Pro&apos; lines to guarantee CMR availability.&lt;/li&gt;
        &lt;/ul&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;7. Contemporary Market Reference Guide&lt;/h2&gt;
        &lt;p&gt;The following guide highlights the architectural layout of the modern hard drive marketplace. Consumers and enterprise engineers must rigorously parse model numbers to ensure SMR models do not enter high-availability or CoW environments.&lt;/p&gt;
        
        &lt;table&gt;
            &lt;thead&gt;
                &lt;tr&gt;
                    &lt;th&gt;Manufacturer&lt;/th&gt;
                    &lt;th&gt;Product Line / Brand&lt;/th&gt;
                    &lt;th&gt;Recording Technology Type&lt;/th&gt;
                    &lt;th&gt;Capacity Thresholds &amp;amp; Notes&lt;/th&gt;
                &lt;/tr&gt;
            &lt;/thead&gt;
            &lt;tbody&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Western Digital&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;WD Blue (Desktop 3.5&quot;)&lt;/td&gt;
                    &lt;td&gt;SMR (Majority)&lt;br&gt;CMR (Select models)&lt;/td&gt;
                    &lt;td&gt;Most 2TB, 3TB, 4TB, and 6TB variants are SMR. High-capacity or specific 1TB models remain CMR.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Western Digital&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;WD Red (Standard NAS)&lt;/td&gt;
                    &lt;td&gt;SMR (All)&lt;/td&gt;
                    &lt;td&gt;Models from 2TB to 6TB (e.g., EFAX series) are strictly SMR. &lt;strong&gt;Banned for ZFS usage.&lt;/strong&gt;&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Western Digital&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;WD Red Plus / Red Pro&lt;/td&gt;
                    &lt;td&gt;CMR (All)&lt;/td&gt;
                    &lt;td&gt;Explicitly designated for RAID/NAS arrays. Guaranteed CMR across all capacities.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Western Digital&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;WD Black / WD Gold&lt;/td&gt;
                    &lt;td&gt;CMR (All)&lt;/td&gt;
                    &lt;td&gt;Performance and Enterprise lines; exclusively CMR across all capacities.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Seagate&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;BarraCuda (Compute 3.5&quot;)&lt;/td&gt;
                    &lt;td&gt;SMR (Majority)&lt;/td&gt;
                    &lt;td&gt;Mainstream desktop lines (2TB, 4TB, 8TB) are SMR. Explicitly designed for light compute only.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Seagate&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;IronWolf / IronWolf Pro&lt;/td&gt;
                    &lt;td&gt;CMR (All)&lt;/td&gt;
                    &lt;td&gt;NAS-focused product line. Seagate maintains a strict no-SMR policy for all IronWolf models.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Seagate&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;Exos (Enterprise)&lt;/td&gt;
                    &lt;td&gt;CMR / HM-SMR&lt;/td&gt;
                    &lt;td&gt;Standard Exos models are pure CMR. Select cloud hyperscale models use Host-Managed SMR (managed by server OS).&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Toshiba&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;P300 (Client Desktop)&lt;/td&gt;
                    &lt;td&gt;SMR / CMR Split&lt;/td&gt;
                    &lt;td&gt;Newer high-capacity iterations (e.g., 4TB, 6TB P300) are SMR. Older or lower capacity models remain CMR.&lt;/td&gt;
                &lt;/tr&gt;
                &lt;tr&gt;
                    &lt;td&gt;&lt;strong&gt;Toshiba&lt;/strong&gt;&lt;/td&gt;
                    &lt;td&gt;N300 / MG Series&lt;/td&gt;
                    &lt;td&gt;CMR (All)&lt;/td&gt;
                    &lt;td&gt;NAS and Enterprise Critical lines; exclusively CMR across all production models.&lt;/td&gt;
                &lt;/tr&gt;
            &lt;/tbody&gt;
        &lt;/table&gt;
    &lt;/section&gt;

&lt;section&gt;
        &lt;h2&gt;Summary Recommendation for Storage Engineering&lt;/h2&gt;
        &lt;p&gt;For any deployments involving ZFS, RAID configurations, high-frequency database logging, or critical infrastructure, it is absolutely essential to mandate the purchase of drives explicitly validated as CMR (such as WD Red Plus, Seagate IronWolf, or Enterprise lines). SMR drives must remain strictly quarantined to sequential cold-archival write streams or disconnected single-drive consumer backup tasks.&lt;/p&gt;
    &lt;/section&gt;</description>
            <pubDate>Jun 25, 2026</pubDate>
        </item>
        <item>
            <title>From Claude Code to Micro-Agent: The Rabbit Hole of AI Coding Agents on Vintage Hardware</title>
            <link>https://tilde.club/~cartwright/blog/2026/06/23/from-claude-code-to-micro-agent-the-rabbit-hole-of-ai-coding-agents-on-vintage-hardware.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/06/23/from-claude-code-to-micro-agent-the-rabbit-hole-of-ai-coding-agents-on-vintage-hardware.html</guid>
            <description>&lt;p&gt;Every developer knows the feeling. You see a shiny new tool, your brain sparks with possibilities, and you immediately try to run it on hardware that has no business hosting it(well maybe only me).&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;This is the story of how a simple desire to try &lt;b&gt;Claude Code&lt;/b&gt; led me down a rabbit hole of instruction set failures, API translation layer frustration, context-window blowouts, and ultimately, writing my own lightweight AI coding agent in Ruby.&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;---&lt;/p&gt;

&lt;h2&gt;The Catalyst: Fighting with Claude Code&lt;/h2&gt;

&lt;p&gt;It started innocently enough. I wanted to see what Claude Code could do.&lt;/p&gt;&lt;/p&gt;

&lt;p&gt;My weapon of choice? An old, trusty &lt;b&gt;Dell laptop&lt;/b&gt; powered by an &lt;b&gt;Intel Core 2 Duo P8700&lt;/b&gt; processor. I kicked off the installation, only to watch it pull down a massive package over &lt;b&gt;280MB&lt;/b&gt; in size. For a CLI tool, that felt extremely bloated.&lt;/p&gt;

&lt;p&gt;But the real kicker came when I tried to run it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
Illegal Instruction
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The harsh reality of legacy hardware hit home. Claude Code (or its underlying Node binaries) compiled down to modern instruction sets requiring &lt;b&gt;AVX and AVX2&lt;/b&gt;, extensions that my Core 2 Duo completely lacks. 280MB of bandwidth, gone.&lt;/p&gt;

&lt;h2&gt;The Pubnix &amp; Proxy Detour&lt;/h2&gt;

&lt;p&gt;Refusing to give up, I shifted tactics and moved to a &lt;b&gt;pubnix&lt;/b&gt; (a public UNIX server). Of course, running an AI agent on a shared public server comes with an obvious caveat: &lt;i&gt;someone could easily sniff your process arguments or environment variables and steal your API key.&lt;/i&gt; Worse yet, I didn&apos;t actually have a dedicated Anthropic API key on hand. I wondered: &lt;i&gt;How hard could it be to use an Anthropic-to-OpenAI API translator?&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;I found two translation projects via a quick web search. What followed was a classic developer nightmare: Python version conflicts, NPM dependency hell, and incompatible environments. Frustrated, I sat down and wrote my own custom API translator from scratch.&lt;/p&gt;

&lt;p&gt;It finally ran! I hooked up Claude Code to my translator, typed a command, and... absolute silence.&lt;/p&gt;

&lt;p&gt;Only the basic &lt;code&gt;/btw&lt;/code&gt; command functioned. The moment Claude Code tried to do anything involving actual file editing, it failed completely. As it turns out, Claude Code passes a &lt;b&gt;gargantuan list of tools and system instructions&lt;/b&gt; out of the box. This massive payload instantly saturated the OpenAI-compatible endpoint&apos;s context limit.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;All that work, and the context window choked before the model could even think.&lt;br&gt;&lt;/p&gt;

&lt;p&gt;---&lt;/p&gt;

&lt;h2&gt;The Birth of &lt;code&gt;Micro Agent&lt;/code&gt;&lt;/h2&gt;

&lt;p&gt;If you can&apos;t use a heavy tool, you build a precise one. I abandoned the bloated frameworks and wrote a lean, custom AI coding agent called &lt;b&gt;Micro Agent&lt;/b&gt;, implemented as a lightweight Ruby CLI.&lt;/p&gt;

&lt;p&gt;Micro-Agent features a flexible architecture allowing it to pivot between different LLM backends using profile commands. To test it, I decided to give it a classic litmus test: &lt;b&gt;Write a simple program to output &quot;Hello, World!&quot; in amd64 NASM assembly for Linux, along with a Makefile to compile it&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;I hooked it up to a local, smaller model profile (&lt;code&gt;gemma4:e2b&lt;/code&gt;) to see how an optimized, smaller intelligence would handle low-level engineering tasks. What followed was a glorious, looping comedy of errors.&lt;/p&gt;

&lt;p&gt;---&lt;/p&gt;

&lt;h2&gt;The Battle of the Assembly Code: A Log Summary&lt;/h2&gt;

&lt;p&gt;While Micro-Agent successfully integrated with system tools, the smaller model architecture struggled immensely with syntax, build systems, and execution guardrails. It took far more prompts and manual intervention to get a &quot;Hello, World&quot; binary compiled than it ever would have taken to write it by hand.&lt;/p&gt;

&lt;p&gt;Here is the condensed, sanitized screen dump showing the agent trying to complete the task:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
ben@box5:~/Projects/micro-agent/a$ ../micro-agent.rb
💻 Welcome to MicroAgent CLI
micro-agent &gt; /api use 0
🎯 Switched active profile targeting to Context ID Engine Node: [0: gemma4:e2b]

&lt;p&gt;micro-agent &gt; make a simple program to say &quot;Hello, World!&quot; in amd64 NASM for linux, and make a makefile for it
🤖 Thinking... Writing hello.asm and initial Makefile...
... [15+ Security Gate Permission Prompts Condensed] ...&lt;/p&gt;

&lt;p&gt;❌ FAILURE 1: The model generates a flawed Makefile with invalid space indentation.
&apos;make&apos; throws a &quot;missing separator&quot; syntax error.
🤖 Thinking... Correcting Makefile syntax...&lt;/p&gt;

&lt;p&gt;❌ FAILURE 2: The model rewrites the Makefile but ruins the dependency logic, 
blindly repeating strings and breaking standard GNU Make patterns.
🤖 Thinking... Attempting to execute &apos;make&apos; again... Target fails.&lt;/p&gt;

&lt;p&gt;❌ FAILURE 3: The model decides to bypass &apos;make&apos; entirely and chain commands via the shell:
🛠️  Executing: execute with args: {&quot;command&quot;=&gt;&quot;nasm -f elf64 hello.asm -o hello.o &amp;&amp; ld hello.o -o hello&quot;}
⚠️  Execution blocked! The micro-agent core engine explicitly bans command chaining (&amp;&amp;) for security.&lt;/p&gt;

&lt;p&gt;❌ FAILURE 4: The model attempts a raw NASM compilation but fails because it used Python/C shell style &apos;#&apos; characters for comments inside hello.asm.
micro-agent &gt; nasm does not support using &apos;#&apos; for comments, use &apos;;;&apos; instead.&lt;/p&gt;

&lt;p&gt;🤖 Thinking... Rewriting hello.asm with proper &apos;;;&apos; comment syntax...
... [More Permission Prompts] ...&lt;/p&gt;

&lt;p&gt;micro-agent &gt; run the make command
❌ FAILURE 5: The model panics, completely loses track of the directory state, 
deletes/overwrites the Makefile with broken targets, and accidentally purges hello.asm.
When it tries to recreate hello.asm, the user manually rejects the file write out of sheer exhaustion.&lt;/p&gt;

&lt;p&gt;⚠️  [Security Gate] Grant agent permission to &apos;write_file&apos; on &apos;hello.asm&apos;? (y/n): n
✅ Objective reached or agent stopped.
&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;h2&gt;Taking Back Control&lt;/h2&gt;

&lt;p&gt;At this point, the agent hit an environmental wall, forcing me to temporarily suspend the process (&lt;code&gt;^Z&lt;/code&gt;) and inspect the damage.&lt;/p&gt;

&lt;p&gt;The agent had left behind an absolute mess in the build script (&lt;code&gt;build.sh&lt;/code&gt;). It had attempted to use &lt;code&gt;gcc&lt;/code&gt; to link a raw entry-point assembly file. When executed, the GNU linker threw a massive fit:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
&gt; /usr/bin/ld: hello.o: in function `_start&apos;:
&gt; hello.asm:(.text+0x0): multiple definition of `_start&apos;;
&gt; (.text+0x17): undefined reference to `main&apos;
&gt; collect2: error: ld returned 1 exit status
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Because &lt;code&gt;gcc&lt;/code&gt; automatically injects the standard C runtime (&lt;code&gt;crt1.o&lt;/code&gt;), it provides its own &lt;code&gt;_start&lt;/code&gt; symbol and looks for a developer-defined &lt;code&gt;main&lt;/code&gt; function. My assembly file explicitly defined &lt;code&gt;_start&lt;/code&gt; and lacked a &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To fix it, I manually bypassed the broken script and linked it directly using the raw linker:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;
ben@box5:~/Projects/micro-agent/a$ ld hello.o -o hello
ben@box5:~/Projects/micro-agent/a$ ./hello 
Hello, World!
Segmentation fault
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Success... followed immediately by a &lt;b&gt;Segmentation Fault&lt;/b&gt;. The agent&apos;s code printed the string via system calls but failed to clean up the stack or invoke the proper &lt;code&gt;sys_exit&lt;/code&gt; sequence. I had to manually jump into &lt;code&gt;emacs&lt;/code&gt; to fix the register placements and structural bugs inside &lt;code&gt;hello.asm&lt;/code&gt; myself until it finally executed cleanly.&lt;/p&gt;

&lt;p&gt;When I brought Micro-Agent back to the foreground (&lt;code&gt;fg&lt;/code&gt;) and asked it to review the modifications, it admitted its own execution blindness, noting that security restrictions prevented it from testing its own output.&lt;/p&gt;

&lt;p&gt;---&lt;/p&gt;

&lt;h2&gt;Lessons Learned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt; &lt;b&gt;Model Size Dictates Logical Rigor:&lt;/b&gt; Small local models like &lt;code&gt;gemma4:e2b&lt;/code&gt; are fantastic for text processing or basic scripts, but they break down when navigating multi-step compilation pipelines. They struggle to retain context over strict formatting rules (like Makefile tabs vs spaces) and will loop endlessly when a command fails.&lt;/li&gt;
&lt;li&gt; &lt;b&gt;Larger Contexts Shine:&lt;/b&gt; When switching Micro-Agent over to heavier, remote configurations—such as &lt;code&gt;openai/gpt-oss-120b&lt;/code&gt;—the loops disappear. Higher-parameter models anticipate linking requirements, comment rules, and runtime environments effortlessly.&lt;/li&gt;
&lt;li&gt; &lt;b&gt;The Irony of Automation:&lt;/b&gt; Sometimes, setting up an autonomous agent to automate a 10-line assembly script takes 10x more time, prompts, and debugging than just pulling up a text editor and typing the assembly code out yourself.&lt;/li&gt;
&lt;/ul&gt;
Yet, despite the hiccups, &lt;b&gt;Micro-Agent works&lt;/b&gt;. It&apos;s ultra-lightweight, it runs on virtually any machine, it doesn&apos;t suffer from modern instruction set bloat, and it keeps the developer firmly in control of the security gates. For vintage laptop enthusiasts and minimalist developers alike, building your own agent is a journey well worth taking.

&lt;p&gt;---&lt;/p&gt;</description>
            <pubDate>Jun 23, 2026</pubDate>
        </item>
        <item>
            <title>How I got started programming</title>
            <link>https://tilde.club/~cartwright/blog/2026/06/22/how-i-got-started-programming.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/06/22/how-i-got-started-programming.html</guid>
            <description>&lt;p&gt;I decided to write down a bit about how I originally got into computers and coding. It all started when I was 12 years old, when my dad taught me Perl. That was my first real introduction to writing scripts and getting things to run.&lt;/p&gt;

&lt;p&gt;After that, I just kept building on it. For the next 12 years, I spent my time diving into different systems and learning a bunch of languages.&lt;/p&gt;

&lt;h2&gt;The Toolkit&lt;/h2&gt;
During those 12 years, I heavily focused on learning C, C++, Java, ASM (x86), and Ruby. Working with x86 Assembly and C gave me a good understanding of low-level systems, while Ruby became a great tool for writing clean scripts.

&lt;p&gt;Along the way, I also picked up a little bit of Rust, Python, and Perl 6 (raku). To figure out how the web side of things worked, I learned javascript and some web design stuff, like html, css, and a little bit of xhtml.&lt;/p&gt;

&lt;h2&gt; Down to the Silicon&lt;/h2&gt;
As I got deeper into programming, I wanted to know exactly how everything worked under the hood. Over the years, I&apos;ve learned pretty much everything about computers from the chipset and bootloader level on up.

&lt;p&gt;Instead of treating operating systems like a black box, I&apos;ve spent hours exploring the NetBSD and Linux source code to see how they handle things at the core. To actually apply that, I&apos;ve built a simple bootloader from scratch, written my own kernel, and even patched BIOS images to manually unlock hardware virtualization features like VT-x.&lt;/p&gt;</description>
            <pubDate>Jun 22, 2026</pubDate>
        </item>
        <item>
            <title>New version of searchvista is out!</title>
            <link>https://tilde.club/~cartwright/blog/2026/05/14/new-version-of-searchvista-is-out.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/05/14/new-version-of-searchvista-is-out.html</guid>
            <description>&lt;p&gt;New version features better search results, and faster search times.
Next month (June 14th 2026), We will be trying out pagerank.&lt;/p&gt;

&lt;h2&gt;PageRank&lt;/h2&gt;
PageRank is an algorithm for measuring a webpage&apos;s relative importance or 
authority based on its link structure. It works by treating links as &quot;votes&quot; 
where votes from more authoritative pages count more.
So like if tilde.club is pointed to my 15 other sites, that means that tilde.club will have a higher score, and the score will be even better if the those 15 sites were pointed to by someone else, the more sites on the tree pointing torwards tilde.club the better score. Not all votes are equal because a site with many links dilutes its own power.</description>
            <pubDate>May 14, 2026</pubDate>
        </item>
        <item>
            <title>Switching to Window Maker from TWM</title>
            <link>https://tilde.club/~cartwright/blog/2026/04/30/switching-to-window-maker-from-twm.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/04/30/switching-to-window-maker-from-twm.html</guid>
            <description>&lt;p&gt;Much smoother than TWM for normal use.&lt;/p&gt;</description>
            <pubDate>April 30, 2026</pubDate>
        </item>
        <item>
            <title>Another post</title>
            <link>https://tilde.club/~cartwright/blog/2026/04/02/another-post.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/04/02/another-post.html</guid>
            <description>&lt;p&gt;Another post about nothing.&lt;/p&gt;</description>
            <pubDate>April 02, 2026</pubDate>
        </item>
        <item>
            <title>Switching to TWM from GNOME</title>
            <link>https://tilde.club/~cartwright/blog/2026/01/21/switching-to-twm-from-gnome.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/01/21/switching-to-twm-from-gnome.html</guid>
            <description>&lt;p&gt;Switched to TWM from GNOME, because gnome takes nearly 15% CPU while idle, and while playing video about 200% CPU usage.&lt;/p&gt;</description>
            <pubDate>January 21, 2026</pubDate>
        </item>
        <item>
            <title>SearchVista mirror systems upgrade</title>
            <link>https://tilde.club/~cartwright/blog/2026/01/11/searchvista-mirror-systems-upgrade.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/01/11/searchvista-mirror-systems-upgrade.html</guid>
            <description>&lt;p&gt;Upgrade went smooth and only 1 minute of down time!&lt;/p&gt;</description>
            <pubDate>January 11, 2026</pubDate>
        </item>
        <item>
            <title>SearchVista mirror systems software upgrades</title>
            <link>https://tilde.club/~cartwright/blog/2026/01/11/searchvista-mirror-systems-software-upgrades.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/01/11/searchvista-mirror-systems-software-upgrades.html</guid>
            <description>&lt;p&gt;Mirror #1 (https://xuser.publicvm.com) will be down for the max of 48 hours for system upgrades within the next 7 days.&lt;/p&gt;</description>
            <pubDate>January 11, 2026</pubDate>
        </item>
        <item>
            <title>SearchVista index</title>
            <link>https://tilde.club/~cartwright/blog/2026/01/09/searchvista-index.html</link>
            <guid>https://tilde.club/~cartwright/blog/2026/01/09/searchvista-index.html</guid>
            <description>&lt;p&gt;The index update has finished and all mirrors are updated.&lt;/p&gt;</description>
            <pubDate>January 09, 2026</pubDate>
        </item>
        <item>
            <title>SearchVista index update</title>
            <link>https://tilde.club/~cartwright/blog/2025/12/29/searchvista-index-update.html</link>
            <guid>https://tilde.club/~cartwright/blog/2025/12/29/searchvista-index-update.html</guid>
            <description>&lt;p&gt;The index will be updated starting from now, until jan-5-2025&lt;/p&gt;</description>
            <pubDate>December 29, 2025</pubDate>
        </item>
        <item>
            <title>Added add url link</title>
            <link>https://tilde.club/~cartwright/blog/2025/12/22/added-add-url-link.html</link>
            <guid>https://tilde.club/~cartwright/blog/2025/12/22/added-add-url-link.html</guid>
            <description>&lt;p&gt;Added a Add URL links so that regular people can now submit URLs to be indexed.
https://sv.tilde.one/add_url.html&lt;/p&gt;</description>
            <pubDate>December 22, 2025 </pubDate>
        </item>
        <item>
            <title>The testing of my search engine</title>
            <link>https://tilde.club/~cartwright/blog/2025/12/19/the-testing-of-my-search-engine.html</link>
            <guid>https://tilde.club/~cartwright/blog/2025/12/19/the-testing-of-my-search-engine.html</guid>
            <description>&lt;p&gt;Have been testing my search engine for the last 2 days, and the search engine gives some pretty good results, only %25-%50 of the results are relevant, but most of the relevant results are interesting.
Visit the search engine at: https://sv.tilde.one or mirror #1: https://xuser.publicvm.com&lt;/p&gt;</description>
            <pubDate>December 19, 2025</pubDate>
        </item>
        <item>
            <title>My first blog</title>
            <link>https://tilde.club/~cartwright/blog/2025/12/18/my-first-blog.html</link>
            <guid>https://tilde.club/~cartwright/blog/2025/12/18/my-first-blog.html</guid>
            <description>&lt;p&gt;Just doing some backups to today.&lt;/p&gt;</description>
            <pubDate>December 18, 2025</pubDate>
        </item>
</channel>
</rss>
