<?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: Shannon Dev</title>
    <description>The latest articles on DEV Community by Shannon Dev (@shannondev).</description>
    <link>https://dev.to/shannondev</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4143739%2Fca5defd1-7914-4fc8-b49f-ef05367f1e9e.png</url>
      <title>DEV Community: Shannon Dev</title>
      <link>https://dev.to/shannondev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shannondev"/>
    <language>en</language>
    <item>
      <title>BooleOS: building a bare-metal x86 OS without writing a single line of it myself</title>
      <dc:creator>Shannon Dev</dc:creator>
      <pubDate>Sat, 26 Sep 2026 03:38:04 +0000</pubDate>
      <link>https://dev.to/shannondev/booleos-building-a-bare-metal-x86-os-without-writing-a-single-line-of-it-myself-11g</link>
      <guid>https://dev.to/shannondev/booleos-building-a-bare-metal-x86-os-without-writing-a-single-line-of-it-myself-11g</guid>
      <description>&lt;p&gt;BooleOS is a hobby operating system for x86 (32-bit), written in C99&lt;br&gt;
and NASM, no Linux or BSD underneath, no libc. It boots via&lt;br&gt;
Multiboot2, has its own heap manager (no raw malloc), a FAT16/VFS&lt;br&gt;
layer, and a cooperative scheduler so far. Repo:&lt;br&gt;
&lt;a href="https://github.com/BooleSystems/BooleOS" rel="noopener noreferrer"&gt;https://github.com/BooleSystems/BooleOS&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual premise
&lt;/h2&gt;

&lt;p&gt;I don't write the code. I direct Claude Code, review every diff, and&lt;br&gt;
decide what gets built next, but the implementation, every commit, is&lt;br&gt;
AI-generated. This isn't a detail I'm downplaying, it's written into&lt;br&gt;
the project's own CONTRIBUTING.md: contributions have to be&lt;br&gt;
AI-generated too, with a verifiable co-author trailer in the commit,&lt;br&gt;
or they get closed on sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why bare-metal is a harder test for this than a web app
&lt;/h2&gt;

&lt;p&gt;Most "I built this with AI" posts are about apps with a framework,&lt;br&gt;
a runtime, a garbage collector, and years of guardrails baked in.&lt;br&gt;
Bare-metal has none of that. There's no libc to catch a bad pointer,&lt;br&gt;
no OS underneath to kill a runaway process, and the debugger you'd&lt;br&gt;
normally reach for doesn't exist yet because you're the one building&lt;br&gt;
the platform it would run on.&lt;/p&gt;

&lt;p&gt;That changes what "reviewing AI output" actually means here. A few&lt;br&gt;
constraints I hold non-negotiable, written into the project's own&lt;br&gt;
CLAUDE.md so every session (including future me) doesn't have to&lt;br&gt;
relearn them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;32-bit is the real target, not a formality.&lt;/strong&gt; The project is
meant to run on real hardware eventually, and 32-bit vs 64-bit
behavior has to be identical, never diverging with an #ifdef. If
something only breaks in the 32-bit build, that's the bug to fix,
not a build to skip.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No &lt;code&gt;sizeof(void*) == 8&lt;/code&gt; assumptions, ever.&lt;/strong&gt; Anything serialized
(save format, config) uses fixed-width types from &lt;code&gt;&amp;lt;stdint.h&amp;gt;&lt;/code&gt;,
never &lt;code&gt;size_t&lt;/code&gt; or &lt;code&gt;long&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No raw malloc, no real threads.&lt;/strong&gt; Everything goes through a heap
wrapper that mimics the actual constraints of a hobby kernel heap
manager (which has had real corruption bugs historically, so
"allocation is cheap and infinite" is not an assumption this
project gets to make). No pthread either, even though it's right
there on Linux, because it would hide concurrency bugs that only
show up once this ports to the project's real, cooperative
scheduling model.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The two mistakes an AI agent keeps drifting toward, if I don't stay&lt;br&gt;
strict about it: reaching for &lt;code&gt;pthread&lt;/code&gt; and &lt;code&gt;malloc&lt;/code&gt; because they're&lt;br&gt;
convenient on Linux, and treating the 64-bit dev build as the one&lt;br&gt;
that matters because that's where the debugger runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the workflow actually looks like
&lt;/h2&gt;

&lt;p&gt;I don't hand off a feature request and walk away. For anything that&lt;br&gt;
touches the kernel, I write out the constraint set in the prompt&lt;br&gt;
explicitly (32-bit gate, fixed-width types, no libc), it implements,&lt;br&gt;
I boot it in QEMU myself, read the serial output myself, and only&lt;br&gt;
then decide the next step. Testing is never delegated, ever.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it's at
&lt;/h2&gt;

&lt;p&gt;Pre-release, not a 1.0, but with ~20 tagged versions and real&lt;br&gt;
changelogs behind each one. Currently at about USB HID input work,&lt;br&gt;
heading toward a custom graphics API (Cathode) and eventually a&lt;br&gt;
minimal GUI on top of it.&lt;/p&gt;

&lt;p&gt;Happy to go deeper on any part of this, the constraint-writing&lt;br&gt;
process, the heap wrapper design, or what a "cooperative scheduler&lt;br&gt;
now, real SMP model later" migration path looks like when none of&lt;br&gt;
the code was hand-typed to begin with.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>os</category>
      <category>showdev</category>
      <category>c</category>
    </item>
  </channel>
</rss>
