<?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: Divyanshu Sinha</title>
    <description>The latest articles on DEV Community by Divyanshu Sinha (@divyanshusinha136).</description>
    <link>https://dev.to/divyanshusinha136</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%2F2444956%2F061cd6da-2d10-4599-b948-898f0f254032.jpg</url>
      <title>DEV Community: Divyanshu Sinha</title>
      <link>https://dev.to/divyanshusinha136</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/divyanshusinha136"/>
    <language>en</language>
    <item>
      <title>🚀 Announcing Pythonaibrain-Warden (v0.1.1): Industrial-Grade, npm-Inspired Package &amp; Environment Manager for Python</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:59:58 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/announcing-pythonaibrain-warden-v010-industrial-grade-npm-inspired-package-environment-4o2c</link>
      <guid>https://dev.to/divyanshusinha136/announcing-pythonaibrain-warden-v010-industrial-grade-npm-inspired-package-environment-4o2c</guid>
      <description>&lt;p&gt;I am excited to announce the official release of &lt;strong&gt;&lt;code&gt;warden&lt;/code&gt;&lt;/strong&gt; (&lt;code&gt;pythonaibrain-warden&lt;/code&gt; v0.1.1)!&lt;/p&gt;

&lt;p&gt;Python package management often forces developers to choose between low-level speed and high-level reproducibility. I built &lt;code&gt;warden&lt;/code&gt; to bridge this gap by introducing an npm-inspired workflow centered on a deterministic lockfile architecture, native virtual environment isolation, and hard offline build guarantees.&lt;/p&gt;




&lt;h3&gt;
  
  
  🌟 Why I Built &lt;code&gt;warden&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;🔐 &lt;strong&gt;Deterministic Lockfile Enforcement (&lt;code&gt;warden.lock&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;warden&lt;/code&gt; locks exact artifact URLs and SHA-256 hashes. Every installation executes via &lt;code&gt;pip install &amp;lt;exact-artifact&amp;gt; --no-deps&lt;/code&gt;, preventing pip's resolver from silently substituting different package versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🔌 &lt;strong&gt;Thin CLI over Core API Architecture:&lt;/strong&gt; I designed every CLI subcommand as a light wrapper around &lt;code&gt;warden.core&lt;/code&gt;. Whether called from terminal scripts, unit tests, or programmatically via &lt;code&gt;import warden.core as core&lt;/code&gt;, execution behavior remains identical.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛠️ &lt;strong&gt;Warden-Native Environments &amp;amp; Absolute Paths:&lt;/strong&gt; &lt;code&gt;warden wenv&lt;/code&gt; constructs standard CPython virtual environments natively. Subprocess calls resolve executables to absolute paths inside the active environment (&lt;code&gt;resolve_executable&lt;/code&gt;), eliminating cross-platform &lt;code&gt;PATH&lt;/code&gt; resolution bugs on Windows.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🎯 &lt;strong&gt;Per-File Dependency Targets:&lt;/strong&gt; Need to run two files with mutually exclusive package requirements in the same repository? &lt;code&gt;warden target set&lt;/code&gt; provisions isolated sub-environments (&lt;code&gt;.warden/venvs/target-&amp;lt;slug&amp;gt;/&lt;/code&gt;) and dedicated lockfiles, allowing scripts like &lt;code&gt;numpy==1.24.0&lt;/code&gt; and &lt;code&gt;numpy==1.26.4&lt;/code&gt; to live side-by-side.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🏷️ &lt;strong&gt;Platform Wheel Selection:&lt;/strong&gt; Artifact resolution ranks PyPI binaries against &lt;code&gt;packaging.tags.sys_tags()&lt;/code&gt;, preventing platform mismatch errors on C-extension wheels.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🛑 &lt;strong&gt;&lt;code&gt;fix&lt;/code&gt; vs. &lt;code&gt;install&lt;/code&gt; Separation:&lt;/strong&gt; &lt;code&gt;warden fix&lt;/code&gt; repairs installed-vs-locked environment drift without ever modifying project requirements in &lt;code&gt;warden.toml&lt;/code&gt; or &lt;code&gt;warden.lock&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;📦 &lt;strong&gt;Self-Contained Offline Bundling (&lt;code&gt;.warden.wheel&lt;/code&gt;):&lt;/strong&gt; &lt;code&gt;warden build&lt;/code&gt; packages project source code, manifests, locked dependencies, and build-system tools (&lt;code&gt;setuptools&lt;/code&gt;/&lt;code&gt;wheel&lt;/code&gt;) into zero-network archives.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;🚦 &lt;strong&gt;CI Reproducibility Gate (&lt;code&gt;warden verify&lt;/code&gt;):&lt;/strong&gt; Runs deep validation across manifests, lockfile consistency, SHA-256 digests, and active environment states with stable non-zero exit codes on failure.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  ⚡ Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install warden from PyPI&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;pythonaibrain-warden&lt;span class="o"&gt;==&lt;/span&gt;0.1.1

&lt;span class="c"&gt;# Initialize a new project layout&lt;/span&gt;
warden init myapp
&lt;span class="nb"&gt;cd &lt;/span&gt;myapp

&lt;span class="c"&gt;# Add dependencies &amp;amp; sync active environment&lt;/span&gt;
warden &lt;span class="nb"&gt;install &lt;/span&gt;requests
warden &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="s2"&gt;"flask@3.0.0"&lt;/span&gt;

&lt;span class="c"&gt;# Execute project entry point or verify reproducibility&lt;/span&gt;
warden run
warden verify

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  📋 Command Summary
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Commands&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;install&lt;/code&gt; • &lt;code&gt;update&lt;/code&gt; • &lt;code&gt;uninstall&lt;/code&gt; • &lt;code&gt;lock&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Environments&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;wenv&lt;/code&gt; • &lt;code&gt;use&lt;/code&gt; • &lt;code&gt;fix&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Execution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;run&lt;/code&gt; • &lt;code&gt;run-file&lt;/code&gt; • &lt;code&gt;exec&lt;/code&gt; • &lt;code&gt;target&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Quality &amp;amp; Audit&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;verify&lt;/code&gt; • &lt;code&gt;show&lt;/code&gt; • &lt;code&gt;clean&lt;/code&gt; • &lt;code&gt;cache&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bundles &amp;amp; Deploy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;build&lt;/code&gt; • &lt;code&gt;install-wheel&lt;/code&gt; • &lt;code&gt;backup&lt;/code&gt; • &lt;code&gt;restore&lt;/code&gt; • &lt;code&gt;publish&lt;/code&gt;&lt;br&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h3&gt;
  
  
  🌐 Links &amp;amp; Resources
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PyPI Release:&lt;/strong&gt; &lt;a href="https://pypi.org/project/pythonaibrain-warden/0.1.1/" rel="noopener noreferrer"&gt;pythonaibrain-warden 0.1.1&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/" rel="noopener noreferrer"&gt;DivyanshuSinha136/Pythonaibrain-Warden&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cli</category>
      <category>python</category>
      <category>venv</category>
      <category>pypi</category>
    </item>
    <item>
      <title>I Built My Own Python Package Manager. Three Bugs Taught Us More Than the Design Did.</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Mon, 24 Aug 2026 07:36:04 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/i-built-my-own-python-package-manager-three-bugs-taught-us-more-than-the-design-did-4khk</link>
      <guid>https://dev.to/divyanshusinha136/i-built-my-own-python-package-manager-three-bugs-taught-us-more-than-the-design-did-4khk</guid>
      <description>&lt;p&gt;&lt;em&gt;A field report from building Pythonaibrain-Warden — an npm-inspired dependency and environment manager for Python with its own lock file, its own virtual environments, and a few opinions pip doesn't share.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  The itch
&lt;/h2&gt;

&lt;p&gt;Python's dependency story is not broken, exactly. It's &lt;em&gt;plural&lt;/em&gt;. &lt;code&gt;pip&lt;/code&gt; installs things. &lt;code&gt;venv&lt;/code&gt; isolates things. &lt;code&gt;pip-tools&lt;/code&gt; locks things. &lt;code&gt;poetry&lt;/code&gt; and &lt;code&gt;pdm&lt;/code&gt; try to do all three with opinions about how. If your project needs two different versions of the same library for two different scripts — a legacy report generator still pinned to &lt;code&gt;numpy==1.24&lt;/code&gt; sitting next to a new one that needs &lt;code&gt;numpy&amp;gt;=1.26&lt;/code&gt; — none of them have a clean answer. You get a second virtualenv, a README note nobody reads, and a slow drift toward "just don't touch that script."&lt;/p&gt;

&lt;p&gt;I wanted something narrower and more opinionated: own the whole vertical slice — manifest, lock file, environments, and the install step — well enough that I could make specific, sharp decisions instead of general, safe ones. That became &lt;strong&gt;Warden&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This isn't a pitch. It's a walkthrough of what I actually built, and — more usefully — three bugs I caught by actually running the thing, not by reading the code and nodding.&lt;/p&gt;




&lt;h2&gt;
  
  
  The one rule that kept the codebase sane
&lt;/h2&gt;

&lt;p&gt;Before any of the interesting stuff, one boring decision paid for itself repeatedly: &lt;strong&gt;the CLI layer is not allowed to think.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cli.py (argparse only)
   │
   ▼
core.py  ──────────────────────►  everything else
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every &lt;code&gt;warden&lt;/code&gt; subcommand is an &lt;code&gt;argparse&lt;/code&gt; definition plus a two-line function that parses arguments and calls a &lt;code&gt;core.*&lt;/code&gt; function. That's it. &lt;code&gt;core.install()&lt;/code&gt; doesn't know it was invoked from a terminal — it takes a &lt;code&gt;Manifest&lt;/code&gt;, a list of package names, a boolean, and returns an exit code. You can &lt;code&gt;import warden.core as core&lt;/code&gt; and call it directly, no subprocess, no argv.&lt;/p&gt;

&lt;p&gt;I didn't design this because it's a best practice I'd read about. I designed it because by the time Warden had grown past a dozen commands, I needed a reason to trust that "what does &lt;code&gt;install&lt;/code&gt; actually do" had exactly one answer, not one answer per code path that happened to call it. It also meant every new feature — and there were a lot — slotted into the same shape: write the logic once in &lt;code&gt;core.py&lt;/code&gt;, wire up a thin CLI wrapper, move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  I didn't use &lt;code&gt;venv.EnvBuilder&lt;/code&gt;. On purpose.
&lt;/h2&gt;

&lt;p&gt;Every Python environment tool eventually calls &lt;code&gt;venv.EnvBuilder&lt;/code&gt; or shells out to &lt;code&gt;python -m venv&lt;/code&gt;. Warden doesn't. It builds the environment by hand:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Find the real base interpreter (&lt;code&gt;sys._base_executable&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Create the directory layout itself.&lt;/li&gt;
&lt;li&gt;Symlink (or copy, on Windows) the interpreter in.&lt;/li&gt;
&lt;li&gt;Hand-write &lt;code&gt;pyvenv.cfg&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Bootstrap &lt;code&gt;pip&lt;/code&gt; via &lt;code&gt;ensurepip&lt;/code&gt; directly.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This wasn't rebellion for its own sake — it's the same algorithm &lt;code&gt;venv&lt;/code&gt; uses internally, just owned end to end instead of delegated to a stdlib module whose error messages and edge-case behavior I didn't control. It paid off almost immediately, because it's what led us straight into the first real bug.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bug #1: "python" doesn't mean what you think it means on Windows
&lt;/h3&gt;

&lt;p&gt;Early on, a Windows tester ran the most boring possible sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;warden init myapp
&lt;span class="nb"&gt;cd &lt;/span&gt;myapp
warden wenv default
warden &lt;span class="nb"&gt;install
&lt;/span&gt;warden run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And got:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;D:\Program Files\python.exe: Error while finding module specification for 'myapp.main'
(ModuleNotFoundError: No module named 'myapp')
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The venv existed. The package was installed &lt;em&gt;into&lt;/em&gt; it. &lt;code&gt;warden run&lt;/code&gt; even printed &lt;code&gt;Running in env 'default'&lt;/code&gt; right before failing. So why was it launching &lt;code&gt;D:\Program Files\python.exe&lt;/code&gt; — the &lt;em&gt;system&lt;/em&gt; interpreter — instead of the one sitting three directories below it?&lt;/p&gt;

&lt;p&gt;The answer is one of those platform facts that only bites you once you actually test on the platform: on Windows, &lt;code&gt;subprocess.Popen(['python', ...], env=custom_env)&lt;/code&gt; does &lt;strong&gt;not&lt;/strong&gt; use &lt;code&gt;custom_env['PATH']&lt;/code&gt; to resolve the bare name &lt;code&gt;python&lt;/code&gt;. &lt;code&gt;CreateProcess&lt;/code&gt; resolves the executable using the &lt;em&gt;calling&lt;/em&gt; process's own &lt;code&gt;PATH&lt;/code&gt;, before the child's environment ever comes into play. Prepending the venv's &lt;code&gt;Scripts\&lt;/code&gt; directory to a dict you're about to hand to &lt;code&gt;subprocess&lt;/code&gt; does exactly nothing on Windows. (On POSIX it works fine, which is precisely why this kind of bug survives testing on a Mac and ships broken to everyone else.)&lt;/p&gt;

&lt;p&gt;The fix wasn't a workaround bolted onto the Windows case — it was to stop relying on &lt;code&gt;PATH&lt;/code&gt; search at all:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;resolve_executable&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env_path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;python3&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;py&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;python_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;env_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;is_file&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="bp"&gt;...&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;  &lt;span class="c1"&gt;# fall back to PATH search only for things the env doesn't provide
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every command Warden spawns now resolves to an absolute path inside the target environment before it's ever launched. Correct on Windows because there's no PATH ambiguity left to exploit; correct on POSIX because it always was, and now it's explicit instead of accidental.&lt;/p&gt;




&lt;h2&gt;
  
  
  Different files, different dependency versions, same project
&lt;/h2&gt;

&lt;p&gt;Here's the feature I're most pleased with, and it's the direct answer to the "legacy script vs. new script" problem from the opening:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[targets]&lt;/span&gt;
&lt;span class="py"&gt;"scripts/legacy_report.py"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;numpy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"=&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.24&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="s"&gt;" }&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;span class="py"&gt;"scripts/new_report.py"&lt;/span&gt;    &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;numpy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="py"&gt;"=&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;1.26&lt;/span&gt;&lt;span class="err"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="s"&gt;" }&lt;/span&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;myproject/
 ├── scripts/legacy_report.py   → numpy==1.24.0
 └── scripts/new_report.py      → numpy==1.26.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important design choice here was resisting the urge to invent something clever. A "target" isn't a special sandboxed sub-concept — it's a completely ordinary Warden environment with an auto-generated name (&lt;code&gt;target-scripts-legacy-report-py&lt;/code&gt;), its own real lock file, and it shows up in &lt;code&gt;warden wenv list&lt;/code&gt; next to everything else. &lt;code&gt;warden run-file scripts/legacy_report.py&lt;/code&gt; just looks up whether that file has an override, and if it does, routes to that environment — auto-provisioning it on first use if it isn't set up yet.&lt;/p&gt;

&lt;p&gt;I tested this with two files pinned to two different &lt;code&gt;click&lt;/code&gt; versions in the same project, with the project's own default environment sitting on a &lt;em&gt;third&lt;/em&gt; version, just to make sure nothing was quietly sharing state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;warden run-file scripts/file1.py
&lt;span class="go"&gt;! WARN Target env 'target-scripts-file1-py' isn't set up yet -- provisioning it now.
&lt;/span&gt;&lt;span class="gp"&gt;==&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;Resolving target &lt;span class="s1"&gt;'scripts/file1.py'&lt;/span&gt; -&amp;gt; &lt;span class="nb"&gt;env&lt;/span&gt; &lt;span class="s1"&gt;'target-scripts-file1-py'&lt;/span&gt;
&lt;span class="go"&gt;✓ Locked 1 package(s)
✓ click==8.0.0 installed
file1.py running with click 8.0.0

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;warden run-file scripts/file2.py
&lt;span class="go"&gt;! WARN Target env 'target-scripts-file2-py' isn't set up yet -- provisioning it now.
✓ click==8.4.2 installed
file2.py running with click 8.4.2

&lt;/span&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;.warden/venvs/default/bin/python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import click; print(click.__version__)"&lt;/span&gt;
&lt;span class="go"&gt;8.1.7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three environments, three versions, one project, and nothing silently sharing site-packages with anything else.&lt;/p&gt;




&lt;h2&gt;
  
  
  The bug that only showed up completely offline
&lt;/h2&gt;

&lt;p&gt;This one's our favorite, because it's a genuine two-layer bug and neither layer looks like a bug from the surface.&lt;/p&gt;

&lt;p&gt;Warden can package a project into a &lt;code&gt;.warden.wheel&lt;/code&gt; — source, lock file, and (by default) every dependency's actual &lt;code&gt;.whl&lt;/code&gt; file bundled in, so the whole thing installs without touching the network. A tester built one, disconnected from the internet, and ran:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; warden install-wheel myapp-0.1.0.warden.wheel
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything vendored installed fine. Then, right at the end:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;==&amp;gt; Installing the project itself in editable mode
! WARN Could not editable-install the project itself: ...
error: subprocess-exited-with-error
pip subprocess to install build dependencies did not run successfully.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Followed, inevitably, by &lt;code&gt;warden run&lt;/code&gt; failing with &lt;code&gt;ModuleNotFoundError: No module named 'myapp'&lt;/code&gt; — because the package genuinely never got installed.&lt;/p&gt;

&lt;p&gt;Here's the thing: I'd vendored &lt;em&gt;every runtime dependency&lt;/em&gt;. So why did anything need the network at all?&lt;/p&gt;

&lt;p&gt;&lt;code&gt;pip install -e .&lt;/code&gt; doesn't just install your package. By default it uses PEP 517 build isolation — it spins up an ephemeral, throwaway environment and fetches &lt;code&gt;setuptools&lt;/code&gt; and &lt;code&gt;wheel&lt;/code&gt; into it from PyPI, every single time, to actually perform the build. Those two packages aren't runtime dependencies. They're not in &lt;code&gt;warden.lock&lt;/code&gt;. I had never even thought to vendor them.&lt;/p&gt;

&lt;p&gt;And the reason a freshly created environment couldn't just use its own copy: I checked.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;python3 &lt;span class="nt"&gt;-m&lt;/span&gt; venv fresh
&lt;span class="gp"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;fresh/bin/python &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"import setuptools"&lt;/span&gt;
&lt;span class="go"&gt;ModuleNotFoundError: No module named 'setuptools'
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Modern CPython's &lt;code&gt;ensurepip&lt;/code&gt; stopped bundling &lt;code&gt;setuptools&lt;/code&gt; and &lt;code&gt;wheel&lt;/code&gt;. It used to. It doesn't anymore. A brand-new venv today has exactly one thing in it: &lt;code&gt;pip&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The fix needed both ends:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At build time&lt;/strong&gt;, vendor the project's build-system requirements too — read &lt;code&gt;[build-system].requires&lt;/code&gt; out of &lt;code&gt;pyproject.toml&lt;/code&gt;, resolve and cache &lt;code&gt;setuptools&lt;/code&gt;/&lt;code&gt;wheel&lt;/code&gt; the same way I do runtime dependencies, and drop them in &lt;code&gt;vendor/&lt;/code&gt; alongside everything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;At install time&lt;/strong&gt;, before attempting the editable install, install those from the local vendor directory via &lt;code&gt;pip --no-index --find-links&lt;/code&gt;, then run the editable install with &lt;code&gt;--no-build-isolation&lt;/code&gt; — which tells pip "don't try to fetch anything, use what's already here."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;ensure_build_tools&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;python_exe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vendor_dir&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;run_cmd&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="n"&gt;python_exe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-c&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;import setuptools, wheel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
    &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;python_exe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;-m&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;pip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;install&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--disable-pip-version-check&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;vendor_dir&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--no-index&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;--find-links&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vendor_dir&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;run_cmd&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;setuptools&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;wheel&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]).&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I didn't trust this until I'd actually broken the network to test it — not "ran it with &lt;code&gt;--no-vendor&lt;/code&gt; unset and assumed," but literally monkeypatched &lt;code&gt;socket.getaddrinfo&lt;/code&gt; to raise for &lt;code&gt;pypi.org&lt;/code&gt; and &lt;code&gt;files.pythonhosted.org&lt;/code&gt; mid-run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;blocked_getaddrinfo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pypi.org&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;files.pythonhosted.org&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;gaierror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;simulated offline&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;_orig&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;kw&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getaddrinfo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;blocked_getaddrinfo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then ran &lt;code&gt;install-wheel&lt;/code&gt; and &lt;code&gt;run&lt;/code&gt; against it. Both succeeded. That's the difference between "should work offline" and "works offline" — one of them I'd have shipped confidently and been wrong.&lt;/p&gt;




&lt;h2&gt;
  
  
  A quieter bug: brackets are not decoration
&lt;/h2&gt;

&lt;p&gt;Adding progress bars and tables (via &lt;code&gt;rich&lt;/code&gt;) was mostly straightforward, except for one thing I almost missed entirely. &lt;code&gt;rich&lt;/code&gt; parses plain strings passed to &lt;code&gt;Table&lt;/code&gt; cells and &lt;code&gt;console.status()&lt;/code&gt; as &lt;em&gt;markup&lt;/em&gt; by default — &lt;code&gt;[green]text[/]&lt;/code&gt; becomes styled green text. Convenient, until you print something that legitimately contains square brackets for an unrelated reason:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;pkg[extra1,extra2]&amp;gt;=1.0&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;renders as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="err"&gt;pkg&amp;gt;=1.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The extras syntax — completely standard PEP 508 dependency specification — got silently eaten. In a package manager, silently corrupting a dependency specifier in &lt;em&gt;displayed output&lt;/em&gt; is merely embarrassing. It's the kind of bug that's obvious the second you see it and invisible until you specifically go looking, because the common case (&lt;code&gt;requests==2.31.0&lt;/code&gt;) never has a bracket in it.&lt;/p&gt;

&lt;p&gt;The fix was mechanical once I knew to look for it: never hand &lt;code&gt;rich&lt;/code&gt; a raw dynamic string. Always wrap it in &lt;code&gt;Text()&lt;/code&gt;, which bypasses markup parsing entirely.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# wrong: table.add_row(spec_string)
# right:
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;rich.text&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Text&lt;/span&gt;
&lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;spec_string&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I went back through every table, every status spinner, every place a package name or version spec touched &lt;code&gt;rich&lt;/code&gt; output, and fixed each one — then wrote a one-line regression test I now run whenever this code path changes: feed it &lt;code&gt;pkg[extra1,extra2]&amp;gt;=1.0&lt;/code&gt; and confirm the brackets survive.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I'd tell you if you're building something similar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Test the platform you're least likely to be sitting in front of.&lt;/strong&gt; The Windows &lt;code&gt;PATH&lt;/code&gt; bug and the "ensurepip doesn't bundle setuptools anymore" bug both share a shape: they're invisible if you only ever develop and test on the same machine, in the same network conditions, on the same OS. Neither was hard to fix once found. Both were completely invisible in code review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A library's convenience default is not automatically your correctness default.&lt;/strong&gt; &lt;code&gt;rich&lt;/code&gt;'s markup-everywhere behavior is genuinely nice for 95% of use cases. It's actively wrong for a tool whose entire job is displaying user-supplied strings verbatim. &lt;code&gt;pip&lt;/code&gt;'s build isolation is genuinely the right default for "run pip install on a random package." It's the wrong default when you've already made an explicit, hash-verified promise about what's installed and where it came from.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reuse the abstraction you already trust instead of inventing a parallel one.&lt;/strong&gt; Per-file dependency targets could have been a bespoke sandboxing feature. Instead it's "an environment, but the name is computed instead of typed" — which meant it inherited every bit of correctness work already put into environment creation, activation, and locking, instead of needing its own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;None of this is finished, and that's fine to say out loud.&lt;/strong&gt; Warden's resolver is deliberately greedy, not backtracking — a real diamond-dependency conflict gets reported clearly instead of resolved cleverly, which is a trade I're happy with but which I say plainly in the docs rather than let people discover. Per-target locks re-resolve independently rather than sharing work across targets. Being specific about what a tool &lt;em&gt;doesn't&lt;/em&gt; do is, I'd argue, more useful to the next person than a features list that implies it does everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Warden is npm-inspired, not npm-derived: its own manifest (&lt;code&gt;warden.toml&lt;/code&gt;), its own hash-pinned lock file (&lt;code&gt;warden.lock&lt;/code&gt;), and environments it builds and owns itself rather than delegating to &lt;code&gt;venv&lt;/code&gt;. Full command reference in &lt;code&gt;CLI-REFERENCE.md&lt;/code&gt;, internal design writeup in &lt;code&gt;ARCHITECTURE.md&lt;/code&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;PyPI&lt;/strong&gt;: &lt;a href="https://pypi.org/project/pythonaibrain-warden" rel="noopener noreferrer"&gt;https://pypi.org/project/pythonaibrain-warden&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: &lt;a href="https://github.com/DivyanshuSinha136/pythonaibrain-warden" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/pythonaibrain-warden&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Architecture&lt;/strong&gt;: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/blob/main/ARCHITECTURE.md" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/blob/main/ARCHITECTURE.md&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;CLI Reference&lt;/strong&gt;: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/blob/main/CLI-REFERENCE.md" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/blob/main/CLI-REFERENCE.md&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Issues&lt;/strong&gt;: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/issues" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-Warden/issues&lt;/a&gt;&lt;/p&gt;

</description>
      <category>dependencymanager</category>
      <category>packagemanager</category>
      <category>pypi</category>
      <category>cli</category>
    </item>
    <item>
      <title>Pythonaibrain-NLP 0.2.0 Is Now on PyPI — A Structured NLU/NLG Architecture for Python</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Fri, 21 Aug 2026 15:28:55 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/pythonaibrain-nlp-020-is-now-on-pypi-a-structured-nlunlg-architecture-for-python-45lh</link>
      <guid>https://dev.to/divyanshusinha136/pythonaibrain-nlp-020-is-now-on-pypi-a-structured-nlunlg-architecture-for-python-45lh</guid>
      <description>&lt;p&gt;Today I'm releasing &lt;strong&gt;Pythonaibrain-NLP 0.2.0&lt;/strong&gt;, the latest public release of my Python NLP framework.&lt;/p&gt;

&lt;p&gt;The package is now available on PyPI, and the complete source code, documentation, architecture notes, examples, and tests are available on GitHub.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PyPI:&lt;/strong&gt; &lt;a href="https://pypi.org/project/Pythonaibrain-NLP/" rel="noopener noreferrer"&gt;https://pypi.org/project/Pythonaibrain-NLP/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-NLP" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-NLP&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Install it with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pythonaibrain-nlp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why another NLP framework?
&lt;/h2&gt;

&lt;p&gt;Pythonaibrain-NLP was built around a different idea.&lt;/p&gt;

&lt;p&gt;Instead of making a transformer the center of everything, I wanted to build a more structured NLP system where &lt;strong&gt;understanding, dialogue state, retrieval, and generation are explicit components of the architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The current system combines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neural intent classification&lt;/li&gt;
&lt;li&gt;Slot filling&lt;/li&gt;
&lt;li&gt;Dialogue context&lt;/li&gt;
&lt;li&gt;Retrieval-augmented responses&lt;/li&gt;
&lt;li&gt;Neural language generation&lt;/li&gt;
&lt;li&gt;A controllable NLG architecture&lt;/li&gt;
&lt;li&gt;Standalone NLU and NLG APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal isn't to replace every modern NLP architecture.&lt;/p&gt;

&lt;p&gt;The goal is to provide a &lt;strong&gt;structured, understandable, trainable NLP pipeline&lt;/strong&gt; that can be integrated into Python applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;The core pipeline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 User Input
                     │
                     ▼
              ┌─────────────┐
              │     NLU     │
              │             │
              │ Intent      │
              │ + Slots     │
              └──────┬──────┘
                     │
                     ▼
            ┌─────────────────┐
            │ Dialogue State  │
            │   + Context     │
            └────────┬────────┘
                     │
             ┌───────┴────────┐
             ▼                ▼
        Function/API         RAG
        Dispatch             Retrieval
             │                │
             └───────┬────────┘
                     ▼
              ┌─────────────┐
              │     NLG     │
              │   SC-LSTM   │
              └──────┬──────┘
                     │
                     ▼
                 Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This separation makes each stage independently accessible and easier to experiment with.&lt;/p&gt;

&lt;h2&gt;
  
  
  NLU
&lt;/h2&gt;

&lt;p&gt;The NLU subsystem uses a joint neural architecture for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Intent classification + slot tagging&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The model is designed to understand both &lt;em&gt;what the user wants&lt;/em&gt; and &lt;em&gt;which pieces of information are present in the input&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;For example, a request such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Book a flight to Delhi tomorrow"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be represented through an intent together with structured slot information rather than treating the entire sentence as an opaque classification problem.&lt;/p&gt;

&lt;p&gt;This structured representation can then be passed to the dialogue and application layers.&lt;/p&gt;

&lt;h2&gt;
  
  
  NLG with SC-LSTM
&lt;/h2&gt;

&lt;p&gt;One of the central parts of Pythonaibrain-NLP is its &lt;strong&gt;Semantically-Controlled LSTM (SC-LSTM)&lt;/strong&gt; based NLG system.&lt;/p&gt;

&lt;p&gt;The idea is to condition generation on semantic information rather than simply generating text from an unconstrained language representation.&lt;/p&gt;

&lt;p&gt;That gives the application a much more explicit relationship between:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Semantic representation
        ↓
   NLG controller
        ↓
   Generated text
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is particularly useful for task-oriented dialogue systems where the generated response should correspond to a known semantic intent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dialogue context
&lt;/h2&gt;

&lt;p&gt;Pythonaibrain-NLP also maintains conversational information through:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Slot memory&lt;/li&gt;
&lt;li&gt;Turn history&lt;/li&gt;
&lt;li&gt;Dialogue context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows the system to work with multi-turn interactions rather than processing every sentence completely independently.&lt;/p&gt;

&lt;p&gt;A conversation can therefore evolve as structured state instead of being treated as a sequence of unrelated strings.&lt;/p&gt;

&lt;h2&gt;
  
  
  Retrieval
&lt;/h2&gt;

&lt;p&gt;The framework includes a lightweight retrieval component based on &lt;strong&gt;TF-IDF and cosine similarity&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This provides a simple way to retrieve relevant information when the system needs knowledge from a local corpus.&lt;/p&gt;

&lt;p&gt;The important part here is that retrieval doesn't have to replace the rest of the NLP pipeline.&lt;/p&gt;

&lt;p&gt;It can participate in the overall decision process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NLU
 ↓
Intent + Slots
 ↓
Application logic / Retrieval
 ↓
NLG
 ↓
Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  No transformer dependency
&lt;/h2&gt;

&lt;p&gt;Pythonaibrain-NLP does &lt;strong&gt;not require a transformer architecture&lt;/strong&gt; for its core NLP pipeline.&lt;/p&gt;

&lt;p&gt;Instead, it uses recurrent neural architectures and structured components.&lt;/p&gt;

&lt;p&gt;That makes the project interesting for situations where developers want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Explicit NLP components&lt;/li&gt;
&lt;li&gt;Smaller specialized models&lt;/li&gt;
&lt;li&gt;Trainable task-oriented systems&lt;/li&gt;
&lt;li&gt;Understandable architecture&lt;/li&gt;
&lt;li&gt;Local execution&lt;/li&gt;
&lt;li&gt;Greater control over the processing pipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't an argument that transformers are bad.&lt;/p&gt;

&lt;p&gt;It's simply a different engineering trade-off.&lt;/p&gt;

&lt;h2&gt;
  
  
  A complete NLP pipeline
&lt;/h2&gt;

&lt;p&gt;The interesting part of the project isn't one model by itself.&lt;/p&gt;

&lt;p&gt;It's the combination.&lt;/p&gt;

&lt;p&gt;Pythonaibrain-NLP brings together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌──────────────┐
                 │     NLU      │
                 └──────┬───────┘
                        │
                 Intent + Slots
                        │
                        ▼
              ┌──────────────────┐
              │ Dialogue Context │
              └────────┬─────────┘
                       │
                 ┌─────┴─────┐
                 │           │
                 ▼           ▼
             Retrieval    Application
                 │           │
                 └─────┬─────┘
                       │
                       ▼
                 ┌───────────┐
                 │    NLG    │
                 └─────┬─────┘
                       │
                       ▼
                    Response
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each layer has a defined responsibility.&lt;/p&gt;

&lt;p&gt;That structure is one of the main things I wanted from the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is included in 0.2.0?
&lt;/h2&gt;

&lt;p&gt;The repository includes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;NLU implementation&lt;/li&gt;
&lt;li&gt;NLG implementation&lt;/li&gt;
&lt;li&gt;SC-LSTM generation&lt;/li&gt;
&lt;li&gt;Intent classification&lt;/li&gt;
&lt;li&gt;Slot tagging&lt;/li&gt;
&lt;li&gt;Dialogue context&lt;/li&gt;
&lt;li&gt;TF-IDF/cosine retrieval&lt;/li&gt;
&lt;li&gt;Training utilities&lt;/li&gt;
&lt;li&gt;Evaluation functionality&lt;/li&gt;
&lt;li&gt;Examples&lt;/li&gt;
&lt;li&gt;Tests&lt;/li&gt;
&lt;li&gt;API reference&lt;/li&gt;
&lt;li&gt;Architecture documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The project also includes measured experiments and evaluation information in the repository rather than presenting the architecture only as a theoretical design.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pythonaibrain-nlp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the package from Python and use the APIs documented in the project.&lt;/p&gt;

&lt;p&gt;The repository contains examples for getting started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;The complete project is available on GitHub:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-NLP" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-NLP&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And the package is available on PyPI:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://pypi.org/project/Pythonaibrain-NLP/" rel="noopener noreferrer"&gt;https://pypi.org/project/Pythonaibrain-NLP/&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Version &lt;strong&gt;0.2.0&lt;/strong&gt; is now the public baseline.&lt;/p&gt;

&lt;p&gt;Future development can build on top of this foundation rather than changing the fundamental direction of the project.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in seeing what developers can build with the architecture and where the limitations become apparent when it is used outside my own experiments.&lt;/p&gt;

&lt;p&gt;That's one of the most useful parts of releasing a project publicly: the architecture stops being something that exists only on my machine.&lt;/p&gt;

&lt;p&gt;It becomes something other people can install, inspect, test, extend, and challenge.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pythonaibrain-NLP 0.2.0 is now public. 🚀&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in structured NLU/NLG systems, dialogue architectures, recurrent neural NLP, or building NLP systems directly in Python, I'd love to see what you do with it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Links
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📦 PyPI: &lt;a href="https://pypi.org/project/Pythonaibrain-NLP/" rel="noopener noreferrer"&gt;https://pypi.org/project/Pythonaibrain-NLP/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💻 GitHub: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-NLP" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-NLP&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;📚 API Reference: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-NLP/blob/main/API-REFERENCE.md" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-NLP/blob/main/API-REFERENCE.md&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🏗️ Architecture: &lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-NLP/blob/main/ARCHITECTURE.md" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Pythonaibrain-NLP/blob/main/ARCHITECTURE.md&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>python</category>
      <category>nlp</category>
      <category>machinelearning</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Beyond Tooling Hell: A New Way to Teach Operating System Development</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Wed, 29 Jul 2026 10:37:19 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/beyond-tooling-hell-a-new-way-to-teach-operating-system-development-273k</link>
      <guid>https://dev.to/divyanshusinha136/beyond-tooling-hell-a-new-way-to-teach-operating-system-development-273k</guid>
      <description>&lt;p&gt;Most people who try to learn &lt;strong&gt;Operating System development&lt;/strong&gt; give up before they even change a single pixel on the screen. They get stuck in "tooling hell"—wrestling with arcane linker scripts, complex assembler syntax, and brittle build systems.&lt;/p&gt;

&lt;p&gt;I wrote &lt;strong&gt;Operating System Development with Aetherix&lt;/strong&gt; (2nd Edition) to offer a different path. This book isn't just about a toolkit, it's a ground-up guide to the physical and logical reality of how a computer actually boots and runs code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s different about this book:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Minimal Prerequisites:&lt;/strong&gt; The only prerequisite is ordinary arithmetic. We start by manually converting binary and hexadecimal to understand how code physically becomes a voltage on a wire.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Language of Bytes:&lt;/strong&gt; Instead of teaching an assembler’s syntax, this book teaches x86 machine code as its own language. You’ll learn to read and write raw bytes, understanding the ModR/M and SIB fields that define CPU instructions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A "From-Scratch" Reference:&lt;/strong&gt; Many chapters function as standalone references for computer science fundamentals. We dive deep into logic gates, flip-flops, memory hierarchies (DRAM/SRAM), and even the physics of how NAND flash traps an electrical charge.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modern vs. Legacy Firmware:&lt;/strong&gt; The book provides an honest, separate look at both the 16-bit BIOS real-mode world and the modern 64-bit &lt;strong&gt;UEFI&lt;/strong&gt; long-mode environment, acknowledging that they share almost nothing at the byte level.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verification Culture:&lt;/strong&gt; We don't assume code works because it "looks right". Every concept is verified against independent tools like &lt;code&gt;objdump&lt;/code&gt; and the &lt;strong&gt;Unicorn Engine&lt;/strong&gt; CPU emulator to ensure absolute correctness.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This book is about &lt;strong&gt;transparency and honesty&lt;/strong&gt;. It documents real bugs caught during development to teach you the discipline required for low-level programming. Whether you're a student or a hobbyist, my goal is to show you exactly what is happening at the byte level, from power-on sequencing to network framing.&lt;/p&gt;

&lt;p&gt;The project is fully open-source under the &lt;strong&gt;GNU AGPL-3.0-or-later&lt;/strong&gt; license.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source:
&lt;/h2&gt;

&lt;p&gt;Book Link:&lt;br&gt;
&lt;a href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/book/Operating_System_with_Aetherix_ED2.pdf" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Aetherix/blob/main/book/Operating_System_with_Aetherix_ED2.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;GitHub Page:&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/DivyanshuSinha136" rel="noopener noreferrer"&gt;
        DivyanshuSinha136
      &lt;/a&gt; / &lt;a href="https://github.com/DivyanshuSinha136/Aetherix" rel="noopener noreferrer"&gt;
        Aetherix
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A Python-native operating system development framework for building bootable x86 and x86_64 systems. Aetherix supports both legacy BIOS and modern UEFI firmware, generates machine code directly through its own native encoder, and provides high-level APIs alongside low-level instruction control.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/logo.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2FDivyanshuSinha136%2FAetherix%2Fraw%2Fmain%2Flogo.png" alt="Aetherix"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Aetherix&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A Python-native operating system development framework for building bootable x86 and x86_64 systems. Aetherix supports both legacy BIOS and modern UEFI firmware, generates machine code directly through its own native encoder, and provides high-level APIs alongside low-level instruction control.&lt;/p&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;from&lt;/span&gt; &lt;span class="pl-s1"&gt;aetherix&lt;/span&gt; &lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-v"&gt;Project&lt;/span&gt;

&lt;span class="pl-k"&gt;with&lt;/span&gt; &lt;span class="pl-en"&gt;Project&lt;/span&gt;(&lt;span class="pl-s"&gt;"MyOS"&lt;/span&gt;) &lt;span class="pl-k"&gt;as&lt;/span&gt; &lt;span class="pl-s1"&gt;os&lt;/span&gt;:

    &lt;span class="pl-en"&gt;@&lt;span class="pl-s1"&gt;os&lt;/span&gt;.&lt;span class="pl-c1"&gt;kernel_entry&lt;/span&gt;&lt;/span&gt;
    &lt;span class="pl-k"&gt;def&lt;/span&gt; &lt;span class="pl-en"&gt;main&lt;/span&gt;(&lt;span class="pl-s1"&gt;prog&lt;/span&gt;, &lt;span class="pl-s1"&gt;drivers&lt;/span&gt;):
        &lt;span class="pl-s1"&gt;drivers&lt;/span&gt;.&lt;span class="pl-c1"&gt;vga&lt;/span&gt;.&lt;span class="pl-c1"&gt;clear&lt;/span&gt;(&lt;span class="pl-s1"&gt;prog&lt;/span&gt;)
        &lt;span class="pl-s1"&gt;drivers&lt;/span&gt;.&lt;span class="pl-c1"&gt;vga&lt;/span&gt;.&lt;span class="pl-c1"&gt;print_string&lt;/span&gt;(&lt;span class="pl-s1"&gt;prog&lt;/span&gt;, &lt;span class="pl-s"&gt;"Hello, world!"&lt;/span&gt;)
        &lt;span class="pl-s1"&gt;prog&lt;/span&gt;.&lt;span class="pl-c1"&gt;hlt&lt;/span&gt;()

    &lt;span class="pl-s1"&gt;os&lt;/span&gt;.&lt;span class="pl-c1"&gt;build&lt;/span&gt;(&lt;span class="pl-s"&gt;"myos.img"&lt;/span&gt;)&lt;/pre&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;qemu-system-i386 -drive file=myos.img,format=raw
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Or write it to a USB stick: &lt;code&gt;sudo dd if=myos.img of=/dev/sdX bs=4M status=progress&lt;/code&gt;
(VirtualBox/VMware also accept the raw &lt;code&gt;.img&lt;/code&gt;/&lt;code&gt;.bin&lt;/code&gt; directly as a virtual disk.)&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Install&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;pip install -e .
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Requires a C compiler (gcc/clang/MSVC) on the machine building the package
— the native encoder core is compiled once, either at install time or…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/DivyanshuSinha136/Aetherix" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;PyPI Page:&lt;/p&gt;


&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://pypi.org/project/aetherix/" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;pypi.org&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Preview
&lt;/h2&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%2Fvkr9i4u1nraj8hn0t538.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%2Fvkr9i4u1nraj8hn0t538.png" alt="Table Of Contant" width="800" height="452"&gt;&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%2Fhz401aouhdljusf1jaa9.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%2Fhz401aouhdljusf1jaa9.png" alt="Table Of Contant" width="800" height="452"&gt;&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%2F2bdc0ipv7yc5w3gt5obl.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%2F2bdc0ipv7yc5w3gt5obl.png" alt="Table Of Contant" width="800" height="452"&gt;&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%2Fxg337jb2nzr402iaksxi.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%2Fxg337jb2nzr402iaksxi.png" alt="Preview of Ch 3" width="800" height="452"&gt;&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%2Fpgvmytmidfwdghgtka9b.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%2Fpgvmytmidfwdghgtka9b.png" alt="Preview of Ch 55" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>computerscience</category>
      <category>osdev</category>
      <category>systemprogramming</category>
      <category>python</category>
    </item>
    <item>
      <title>Operating System with Aetherix book</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Mon, 20 Jul 2026 14:11:36 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/operating-system-with-aetherix-book-11f0</link>
      <guid>https://dev.to/divyanshusinha136/operating-system-with-aetherix-book-11f0</guid>
      <description>&lt;p&gt;To celebrate the framework's release, I have also published a complete textbook: &lt;code&gt;Operating System with Aetherix&lt;/code&gt; 📖.&lt;/p&gt;

&lt;p&gt;It is a from-scratch guide to x86 operating system and UEFI application development. It breaks down how Aetherix works under the hood and teaches low-level computer architecture without using intermediate assembly language.&lt;/p&gt;

&lt;p&gt;Inside the book:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No external tools: How Aetherix completely bypasses nasm, gcc, and ld.&lt;/li&gt;
&lt;li&gt;Deep x86 internals: Manipulating ModR/M byte layouts, reading raw machine code hexabytes, and addressing memory segments.&lt;/li&gt;
&lt;li&gt;Pure Python compilation: How a native C core handles binary machine-code encoding through standard-library ctypes bridges.&lt;/li&gt;
&lt;li&gt;Extensible Ecosystem: How to use the native Hardware Abstraction Layer (HAL) to write custom peripheral drivers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire framework is packed into a tiny, zero-dependency 204 KB footprint. The book is open-source.&lt;/p&gt;

&lt;p&gt;Read the full textbook directly on my GitHub repository:&lt;br&gt;
👉 &lt;a href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/Operating_System_with_Aetherix.pdf" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Aetherix/blob/main/Operating_System_with_Aetherix.pdf&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/Operating_System_with_Aetherix.pdf" rel="noopener noreferrer"&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%2F4vippkai6a1cx69plkqv.png" alt="Operating System with Aetherix" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>osdev</category>
      <category>aetherix</category>
      <category>x86</category>
    </item>
    <item>
      <title>Building an Interactive Shell in Python with Aetherix</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Sun, 19 Jul 2026 17:36:46 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/building-an-interactive-shell-in-python-with-aetherix-33d6</link>
      <guid>https://dev.to/divyanshusinha136/building-an-interactive-shell-in-python-with-aetherix-33d6</guid>
      <description>&lt;p&gt;One of the first milestones after printing text to the screen is creating an operating system that responds to user input.&lt;/p&gt;

&lt;p&gt;This example boots into a simple interactive shell built with Aetherix. Instead of displaying predefined text, it continuously reads keyboard input and updates the screen in real time.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/media/aether_shell_720p.mp4" rel="noopener noreferrer"&gt;Aether Shell Video &lt;em&gt;&lt;strong&gt;Click to view&lt;/strong&gt;&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What it demonstrates
&lt;/h2&gt;

&lt;p&gt;Despite being under 200 lines of Python, this example implements several core OS features:&lt;/p&gt;

&lt;p&gt;⌨️ Real-time keyboard input&lt;br&gt;
🔠 Shift-aware typing (uppercase and symbols)&lt;br&gt;
🖥️ Runtime VGA text terminal with a moving cursor&lt;br&gt;
⏎ Enter and Backspace support&lt;br&gt;
🔊 PC speaker beep (F1)&lt;br&gt;
🔄 Hardware reboot (F2)&lt;br&gt;
⏻ Power-off (F3, emulator dependent)&lt;br&gt;
🛑 Graceful halt on Escape&lt;/p&gt;

&lt;p&gt;Unlike a scripted demo, what appears on screen depends entirely on what the user types.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;
aether_shell -- a genuinely interactive example OS.

Unlike hello_os.py (which prints a few fixed, compile-time-known messages
and waits for one keypress), this boots into a live loop: it reads your
keyboard input in real time -- Shift and all -- and echoes it to the
screen using a runtime VGA cursor (aetherix.drivers.terminal) that
actually moves, wraps at the end of a row, and responds to
Enter/Backspace. There is no fixed script of what appears where; what
shows up on screen depends on what you type.

Controls:
    (letters, digits, punctuation, space)   echoed as typed
    Shift                                    uppercase letters, shifted symbols
    Enter                                    move to the next line
    Backspace                                erase the previous character
    F1                                        beep the PC speaker
    F2                                        reboot (hardware reset)
    F3                                        shutdown (QEMU/Bochs only --
                                               see aetherix.drivers.power)
    Esc                                       goodbye message, then halt

Run:
    python examples/aether_shell.py

Then boot the produced image in an emulator, e.g.:
    qemu-system-i386 -drive file=aether_shell.img,format=raw

Or verify it under CPU emulation without needing QEMU installed:
    pip install unicorn
    python tests/emulate.py build/aether_shell.img
&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regs&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AetherShell&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;boot_message&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AetherShell starting...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="nd"&gt;@os_.kernel_entry&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;
        &lt;span class="n"&gt;kb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keyboard&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;terminal&lt;/span&gt;
        &lt;span class="n"&gt;power&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;power&lt;/span&gt;

        &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# zero the Shift-state flag
&lt;/span&gt;        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AetherShell v0.2 -- a live Aetherix demo OS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GREEN_ON_BLACK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Type (Shift works!). Enter=newline  Backspace=erase&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;F1=beep  F2=reboot  F3=shutdown  Esc=halt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                          &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;start_row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;wait_key_scancode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# blocks; raw scancode (make OR break) ends up in AL
&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_ESCAPE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_halt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_ENTER&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_enter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_BACKSPACE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_backspace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_F1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_beep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_F2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_reboot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_F3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shutdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Shift press/release: update the flag keyboard.read_char also
&lt;/span&gt;        &lt;span class="c1"&gt;# uses, then go straight back to waiting -- Shift never prints.
&lt;/span&gt;        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_LSHIFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_RSHIFT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_LSHIFT&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BREAK_BIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_RSHIFT&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BREAK_BIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Any other break code (bit 7 set) -- ignore, don't echo on release.
&lt;/span&gt;        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;test_al&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BREAK_BIT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JNZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# Dispatch any other recognized key, Shift-aware: compare the
&lt;/span&gt;        &lt;span class="c1"&gt;# scancode against each known entry and, on a match, print
&lt;/span&gt;        &lt;span class="c1"&gt;# whichever of its two (compile-time-known) characters matches
&lt;/span&gt;        &lt;span class="c1"&gt;# the current runtime Shift state. Same technique
&lt;/span&gt;        &lt;span class="c1"&gt;# keyboard.read_char uses internally, inlined here because this
&lt;/span&gt;        &lt;span class="c1"&gt;# loop also needs to catch Enter/Backspace/F-keys in the same
&lt;/span&gt;        &lt;span class="c1"&gt;# pass, which read_char deliberately doesn't return for.
&lt;/span&gt;        &lt;span class="n"&gt;all_codes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_SET1_ASCII&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_SET1_SHIFTED&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;all_codes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;skip_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unique_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_skip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;use_shifted_label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;unique_label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;key_use_shifted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;unshifted_ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_SET1_ASCII&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_SET1_SHIFTED&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;shifted_ch&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SCANCODE_SET1_SHIFTED&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unshifted_ch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JNZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;skip_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHIFT_STATE_VAR&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;cmp8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;BL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jcc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JNZ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;use_shifted_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putchar_imm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unshifted_ch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;use_shifted_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;putchar_imm&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shifted_ch&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;skip_label&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# unrecognized key -- ignore and keep waiting
&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_on&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHIFT_STATE_VAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shift_off&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;store8&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;kb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHIFT_STATE_VAR&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_enter&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;newline&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_backspace&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;term&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;backspace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_beep&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;speaker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;beep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frequency_hz&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;880&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;duration_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1_500_000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;jmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_loop&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_reboot&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Rebooting...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YELLOW_ON_BLACK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;reboot&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_shutdown&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Shutting down...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YELLOW_ON_BLACK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;power&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;label&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;shell_halt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Goodbye! System halted.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;attr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;YELLOW_ON_BLACK&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hlt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;aether_shell.img&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Built: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kernel sectors: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;511&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Boot it with: qemu-system-i386 -drive file=aether_shell.img,format=raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qemu-system-i386 -drive file=aether_shell.img,format=raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why this example is interesting
&lt;/h2&gt;

&lt;p&gt;Traditional hobby OS tutorials often require writing hundreds of lines of C and Assembly before reaching this level of interactivity.&lt;/p&gt;

&lt;p&gt;With Aetherix, the example focuses on the shell's behavior:&lt;/p&gt;

&lt;p&gt;Wait for a key&lt;br&gt;
Decide what action to perform&lt;br&gt;
Update the terminal&lt;br&gt;
Repeat&lt;/p&gt;

&lt;p&gt;The framework provides the boot process, VGA output, keyboard driver, terminal driver, power management, and machine code generation, allowing the example to stay focused on the operating system logic.&lt;/p&gt;

</description>
      <category>python</category>
      <category>osdev</category>
      <category>aetherix</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From Python Code to a Bootable Graphics OS</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Sun, 19 Jul 2026 15:03:41 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/from-python-code-to-a-bootable-graphics-os-17hh</link>
      <guid>https://dev.to/divyanshusinha136/from-python-code-to-a-bootable-graphics-os-17hh</guid>
      <description>&lt;p&gt;One of the classic milestones in hobby operating system development is switching from text mode to graphics mode. In this example, Aetherix boots into VGA Mode 13h, plays a loading animation, renders a full-screen background, and composites a logo all from Python code that builds a bootable disk image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/DivyanshuSinha136/Aetherix/blob/main/media/graphics_demo_compressed.mp4" rel="noopener noreferrer"&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%2Fdfjru31sn0w1tb5runfz.PNG" alt="Watch the Graphics Demo" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Highlights
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🎞️ Loading animation&lt;/li&gt;
&lt;li&gt;🎨 VGA Mode 13h graphics&lt;/li&gt;
&lt;li&gt;🖼️ Full-screen background rendering&lt;/li&gt;
&lt;li&gt;🪟 Logo compositing&lt;/li&gt;
&lt;li&gt;💾 Bootable disk image generation&lt;/li&gt;
&lt;li&gt;🐍 Written in Python with Aetherix&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The example preprocesses images at build time, generating a shared VGA palette for the background and logo. When the system boots, the kernel simply renders the prepared pixel data, resulting in a fast graphical startup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;system&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pathlib&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Path&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;imaging&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix.drivers&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;

&lt;span class="n"&gt;ASSETS_DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;resolve&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;parent&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;assets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="c1"&gt;# -- Prepare assets at build time (resizing/quantizing happens here, not
#    at boot -- the kernel only ever handles already-prepared bytes) --
&lt;/span&gt;&lt;span class="n"&gt;loading_frames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;imaging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ASSETS_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;loading_&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="c1"&gt;# background and logo will be on screen AT THE SAME TIME, so they must
# share one 256-color palette -- VGA Mode 13h has a single palette for the
# whole screen, not one per image (see imaging.load_images_shared_palette).
&lt;/span&gt;&lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;imaging&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load_images_shared_palette&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ASSETS_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;background.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GFX_WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GFX_HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ASSETS_DIR&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;logo.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="n"&gt;LOGO_X&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GFX_WIDTH&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;LOGO_Y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GFX_HEIGHT&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GraphicsOS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;graphics_mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;MODE_13H&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="nd"&gt;@os_.kernel_entry&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="c1"&gt;# 1. Loading animation -- plays once, then falls through.
&lt;/span&gt;        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;play_frames&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loading_frames&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;delay_iterations&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3_000_000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;loop&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c1"&gt;# 2. Home screen -- background, then a logo composited on top.
&lt;/span&gt;        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;background&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;graphics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;show_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;logo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOGO_X&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;LOGO_Y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hlt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;graphics_os.img&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Built: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;out&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Kernel sectors: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os_&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;assemble&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;511&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Boot it with: qemu-system-i386 -drive file=graphics_os.img,format=raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nf"&gt;s&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;qemu-system-i386 -drive file=graphics_os.img,format=raw&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;Install Aetherix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aetherix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Resources
&lt;/h3&gt;

&lt;p&gt;PiPY: &lt;a href="https://pypi.org/project/aetherix/" rel="noopener noreferrer"&gt;https://pypi.org/project/aetherix/&lt;/a&gt;&lt;br&gt;
GitHub: &lt;a href="https://github.com/DivyanshuSinha136/Aetherix" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Aetherix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ If you find Aetherix interesting, consider giving the repository a star on GitHub. Feedback, ideas, and contributions are always welcome!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>osdev</category>
      <category>aetherix</category>
      <category>python</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building My First UEFI Application in Python with Aetherix</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Sun, 19 Jul 2026 14:23:54 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/building-my-first-uefi-application-in-python-with-aetherix-14fn</link>
      <guid>https://dev.to/divyanshusinha136/building-my-first-uefi-application-in-python-with-aetherix-14fn</guid>
      <description>&lt;p&gt;Building a bootable UEFI application entirely in Python — no NASM, no linker, and no C compiler for the EFI binary.&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%2Fdrac959hcq0pk1h8jtxs.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%2Fdrac959hcq0pk1h8jtxs.PNG" alt="UEFI Main Window" width="641" height="536"&gt;&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%2F7qkaog2oka30k5gzwcmx.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%2F7qkaog2oka30k5gzwcmx.PNG" alt="UEFI Terminal Window" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What makes this interesting is that the &lt;code&gt;.efi&lt;/code&gt; executable itself wasn't produced from C or assembly source. The program was written in Python using Aetherix, which emits the required machine code and packages it into a valid UEFI executable.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix.uefi.app&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;UefiApp&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix.uefi&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;diskimage&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;regs&lt;/span&gt;

&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;UefiApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nd"&gt;@app.entry&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear_screen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_cursor_position&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello from Aetherix UEFI!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;This machine code was generated entirely by aetherix.uefi --&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;no nasm, no ld, no C compiler toolchain for the .efi itself.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Press any key to continue...&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;keyboard&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_key&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;regs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;R13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_cursor_position&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Key received. Returning control to firmware.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys_table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;efi_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uefi_hello.efi&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Built: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;efi_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;efi_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img_path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;diskimage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_disk_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;efi_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read_bytes&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="nf"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;uefi_hello.img&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Built: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;img_path&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; (&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;img_path&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;st_size&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; bytes)&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Boot it with: qemu-system-x86_64 -drive if=pflash,format=raw,readonly=on,file=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;D:\Program Files\qemu\share\edk2-x86_64-code.fd&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt; -drive if=pflash,format=raw,file=.\vars.fd -drive file=uefi_hello.img,format=raw&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;aetherix
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  🔗 GitHub
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/DivyanshuSinha136/Aetherix" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Aetherix&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⭐ If you enjoyed this article, consider starring the repository.&lt;br&gt;
Feedback and contributions are always welcome!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>osdev</category>
      <category>uefi</category>
      <category>aetherix</category>
      <category>python</category>
    </item>
    <item>
      <title>Introducing Aetherix 0.1.0 – Build Operating Systems with Python</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Sun, 19 Jul 2026 10:18:02 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/introducing-aetherix-010-build-operating-systems-with-python-1g3o</link>
      <guid>https://dev.to/divyanshusinha136/introducing-aetherix-010-build-operating-systems-with-python-1g3o</guid>
      <description>&lt;p&gt;Today I'm excited to release Aetherix 0.1.0 on PyPI.&lt;/p&gt;

&lt;p&gt;Aetherix is an open-source Python framework for experimenting with operating system development. The goal is to make low-level OS concepts more approachable while still allowing developers to build real bootable projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current features include:
&lt;/h2&gt;

&lt;p&gt;BIOS boot support&lt;br&gt;
UEFI support&lt;br&gt;
x86 target&lt;br&gt;
VGA graphics support&lt;br&gt;
Bootloader generation&lt;br&gt;
Driver framework&lt;br&gt;
Python-first API for building OS components&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it with:
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;pip install aetherix&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick Start:
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;aetherix&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Project&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;Project&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MyOS&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="nd"&gt;@os.kernel_entry&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;drivers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;vga&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Hello, world!&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;prog&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hlt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;build&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;myos.img&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;qemu-system-i386 &lt;span class="nt"&gt;-drive&lt;/span&gt; &lt;span class="nv"&gt;file&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;myos.img,format&lt;span class="o"&gt;=&lt;/span&gt;raw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or write it to a USB stick: &lt;code&gt;sudo dd if=myos.img of=/dev/sdX bs=4M status=progress conv=fsync&lt;/code&gt;&lt;br&gt;
(VirtualBox and VMware also accept the raw &lt;code&gt;.img&lt;/code&gt;/&lt;code&gt;.bin&lt;/code&gt; directly as a virtual disk.)&lt;/p&gt;




&lt;p&gt;GitHub: &lt;a href="https://github.com/DivyanshuSinha136/Aetherix/" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/Aetherix/&lt;/a&gt;&lt;br&gt;
PyPI : &lt;a href="https://pypi.org/project/aetherix/" rel="noopener noreferrer"&gt;https://pypi.org/project/aetherix/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is just the first public release, and there is still a lot to improve. I'd really appreciate feedback, bug reports, feature requests, and contributions from the community.&lt;/p&gt;

&lt;p&gt;If you've ever wanted to explore OS development without starting entirely from C or Assembly, I'd love to hear what you think.&lt;/p&gt;

</description>
      <category>osdev</category>
      <category>x86</category>
      <category>bios</category>
      <category>uefi</category>
    </item>
    <item>
      <title>I Built VoxMark — A Declarative Language for Interactive Documents and Web Applications</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Fri, 03 Jul 2026 18:51:39 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/i-built-voxmark-a-declarative-language-for-interactive-documents-and-web-applications-7o5</link>
      <guid>https://dev.to/divyanshusinha136/i-built-voxmark-a-declarative-language-for-interactive-documents-and-web-applications-7o5</guid>
      <description>&lt;p&gt;Over the past several months, I've been working on VoxMark, a project that started as an idea to make writing interactive documents simpler.&lt;/p&gt;

&lt;p&gt;Today, I'm excited to share that VoxMark 1.0.0 is officially available on PyPI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is VoxMark?
&lt;/h2&gt;

&lt;p&gt;VoxMark is a declarative markup language built around VML (VoxMark Language). It extends familiar Markdown-style authoring with interactive widgets, layouts, and application-oriented components while compiling to static web assets.&lt;/p&gt;

&lt;p&gt;Instead of writing large amounts of HTML, CSS, and JavaScript, you describe your document using VML syntax.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;::alert[success]{
Your project has been built successfully.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;::card[Welcome]{
This content is inside an interactive card.
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;::icon[rocket|1.2em|#f59e0b]{} Launch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The compiler generates HTML, CSS, a lightweight JavaScript loader, and a WebAssembly module. The JavaScript's role is simply to bootstrap the page and load the compiled WebAssembly module, where the runtime logic resides.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;p&gt;Current features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive widgets&lt;/li&gt;
&lt;li&gt;Cards, alerts, tabs, timelines, progress bars, badges, collapsible sections, and more&lt;/li&gt;
&lt;li&gt;Built-in SVG icon library with 209 icons&lt;/li&gt;
&lt;li&gt;Syntax highlighting&lt;/li&gt;
&lt;li&gt;Variables and reusable components&lt;/li&gt;
&lt;li&gt;Include system for modular documents&lt;/li&gt;
&lt;li&gt;HTML generation&lt;/li&gt;
&lt;li&gt;WebAssembly modules&lt;/li&gt;
&lt;li&gt;Development server&lt;/li&gt;
&lt;li&gt;Project scaffolding&lt;/li&gt;
&lt;li&gt;Source formatter&lt;/li&gt;
&lt;li&gt;Linter&lt;/li&gt;
&lt;li&gt;AST viewer&lt;/li&gt;
&lt;li&gt;File watcher for automatic rebuilds&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Documentation Written in VoxMark
&lt;/h2&gt;

&lt;p&gt;One milestone I'm particularly happy about is that the official documentation is written entirely in VML.&lt;/p&gt;

&lt;p&gt;The documentation isn't written in Markdown and converted later—it is authored directly using the language itself and compiled with the VoxMark compiler.&lt;/p&gt;

&lt;p&gt;In other words, VoxMark is now dogfooding its own technology.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;

&lt;p&gt;Install directly from PyPI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;voxmark
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Show the available commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; voxmark &lt;span class="nt"&gt;--help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create Project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; voxmark init &amp;lt;project name&amp;gt;/

&lt;span class="nb"&gt;cd&lt;/span&gt; &amp;lt;project name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Edit generated *.vml file inside project directory.&lt;/p&gt;

&lt;p&gt;Compile a document:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; voxmark compiler &lt;span class="nt"&gt;--build&lt;/span&gt; &amp;lt;file name&amp;gt;.vml &lt;span class="nt"&gt;-o&lt;/span&gt; build/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Serve it locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; voxmark server build/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How VoxMark Looks After Compilation
&lt;/h2&gt;

&lt;p&gt;One of the goals of VoxMark is to let authors write declarative VML while generating polished, interactive web pages. Here are a few examples of the compiled output.&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Graph Widgets
&lt;/h3&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%2Fszh1n584h373xxem6p4a.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%2Fszh1n584h373xxem6p4a.PNG" alt="Graph 1" width="800" height="452"&gt;&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%2F3vbhotussen60rtyk4eb.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%2F3vbhotussen60rtyk4eb.PNG" alt="Graph 2" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📦 Embedded Content
&lt;/h3&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%2Fkwpfx0xijyeu3fydpurn.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%2Fkwpfx0xijyeu3fydpurn.PNG" alt="Embed" width="800" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🎨 Custom Styling
&lt;/h3&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%2F19jllk4fu8i9sei79k9r.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%2F19jllk4fu8i9sei79k9r.PNG" alt="Custom Style" width="800" height="194"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📈 Charts
&lt;/h3&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%2F0r2grquro2q20fi8bhv4.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%2F0r2grquro2q20fi8bhv4.PNG" alt="Chart" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Hero Sections
&lt;/h3&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%2Fgzi9lysc9195nff8jnp8.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%2Fgzi9lysc9195nff8jnp8.PNG" alt="Hero Section" width="799" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I Built It
&lt;/h2&gt;

&lt;p&gt;My goal wasn't to replace HTML.&lt;/p&gt;

&lt;p&gt;Instead, I wanted a language that lets authors focus on content and structure while still being capable of building interactive documentation and lightweight web applications.&lt;/p&gt;

&lt;p&gt;I also wanted the syntax to stay approachable for people already familiar with Markdown while providing richer capabilities through widgets.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next?
&lt;/h2&gt;

&lt;p&gt;This is only the beginning.&lt;/p&gt;

&lt;p&gt;Future work includes expanding the widget ecosystem, improving the compiler, enhancing the developer experience, and continuing to refine the language based on feedback from the community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;p&gt;📦 PyPI: &lt;a href="https://pypi.org/project/voxmark/" rel="noopener noreferrer"&gt;https://pypi.org/project/voxmark/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📖 Documentation: &lt;a href="https://divyanshusinha136.github.io/VoxMark-Language/" rel="noopener noreferrer"&gt;https://divyanshusinha136.github.io/VoxMark-Language/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 GitHub: &lt;a href="https://github.com/DivyanshuSinha136/VoxMark-Language/" rel="noopener noreferrer"&gt;https://github.com/DivyanshuSinha136/VoxMark-Language/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to hear your thoughts, suggestions, and ideas. Feedback from the developer community will help shape the next versions of VoxMark.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>voxmark</category>
      <category>documentation</category>
    </item>
    <item>
      <title>How I Generated a 100-Million-Pixel Julia Set on a 4 GB RAM PC Using Python</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Wed, 17 Jun 2026 19:52:22 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/how-i-generated-a-100-million-pixel-julia-set-on-a-4-gb-ram-pc-using-python-1e2j</link>
      <guid>https://dev.to/divyanshusinha136/how-i-generated-a-100-million-pixel-julia-set-on-a-4-gb-ram-pc-using-python-1e2j</guid>
      <description>&lt;p&gt;Fractals have fascinated programmers for decades.&lt;/p&gt;

&lt;p&gt;From the Mandelbrot Set to Julia Sets, these mathematical structures can generate breathtaking patterns from surprisingly simple equations.&lt;/p&gt;

&lt;p&gt;The challenge isn't generating a fractal.&lt;/p&gt;

&lt;p&gt;The challenge is generating one at &lt;strong&gt;extreme resolutions&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A 10,000 × 10,000 image contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100,000,000 pixels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's &lt;strong&gt;100 million pixels&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Many image-generation approaches attempt to store the entire image in memory before saving it to disk. At these resolutions, memory consumption can quickly become a problem.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;pyaitk.CLSE's StreamingWriter&lt;/strong&gt; becomes useful.&lt;/p&gt;

&lt;p&gt;Instead of building the entire image in RAM, rows are generated and written directly to disk.&lt;/p&gt;

&lt;p&gt;In this article, we'll create a &lt;strong&gt;10K Julia Set fractal&lt;/strong&gt; while keeping memory usage under control.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Code
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyaitk.CLSE&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StreamingWriter&lt;/span&gt;

&lt;span class="n"&gt;WIDTH&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;span class="n"&gt;HEIGHT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;

&lt;span class="n"&gt;MAX_ITER&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;

&lt;span class="n"&gt;C_REAL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;
&lt;span class="n"&gt;C_IMAG&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;0.27015&lt;/span&gt;

&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nc"&gt;StreamingWriter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;julia_10k.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;bpp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

        &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

        &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;

            &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;

            &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

            &lt;span class="nf"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
                &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;MAX_ITER&lt;/span&gt;
            &lt;span class="p"&gt;):&lt;/span&gt;

                &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;C_REAL&lt;/span&gt;
                &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2.0&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;C_IMAG&lt;/span&gt;
                &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;

                &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

            &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;MAX_ITER&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
                &lt;span class="p"&gt;(&lt;/span&gt;
                    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                    &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;
                &lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;sw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write_row&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is a massive Julia Set image containing intricate fractal structures across 100 million pixels.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Julia Sets?
&lt;/h2&gt;

&lt;p&gt;Julia Sets are generated by repeatedly applying a complex mathematical function.&lt;/p&gt;

&lt;p&gt;The equation used is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z = z² + c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;where:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;c = -0.7 + 0.27015i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each pixel becomes a point in the complex plane.&lt;/p&gt;

&lt;p&gt;The algorithm repeatedly evaluates the equation until either:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The point escapes&lt;/li&gt;
&lt;li&gt;The maximum iteration count is reached&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The number of iterations determines the pixel colour.&lt;/p&gt;

&lt;p&gt;This simple rule produces remarkably complex structures.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mapping Pixels to Mathematics
&lt;/h2&gt;

&lt;p&gt;A computer screen works in pixels.&lt;/p&gt;

&lt;p&gt;A fractal works in mathematical coordinates.&lt;/p&gt;

&lt;p&gt;The first step is converting pixel positions into coordinates in the complex plane.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;px&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;WIDTH&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;
&lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;HEIGHT&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This maps the image into a viewing region:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(-1.5, -1.5)
        ↓
( 1.5,  1.5)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every pixel becomes a unique mathematical starting point.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Escape Test
&lt;/h2&gt;

&lt;p&gt;The heart of the algorithm is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="nf"&gt;while &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;zy&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mf"&gt;4.0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
    &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;MAX_ITER&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;As long as the point remains inside the escape radius, iteration continues.&lt;/p&gt;

&lt;p&gt;If the value grows beyond:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;|z| &amp;gt; 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;the point is considered escaped.&lt;/p&gt;

&lt;p&gt;Points that remain stable create the characteristic Julia Set structure.&lt;/p&gt;




&lt;h2&gt;
  
  
  Colouring the Fractal
&lt;/h2&gt;

&lt;p&gt;After the iteration process finishes, a colour is assigned.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;iteration&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;MAX_ITER&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The pixel colour becomes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;color&lt;/span&gt; &lt;span class="o"&gt;//&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;255&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;color&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates a smooth gradient ranging from deep blues to bright highlights.&lt;/p&gt;

&lt;p&gt;More advanced colour maps can produce even more dramatic results.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why StreamingWriter Matters
&lt;/h2&gt;

&lt;p&gt;A traditional image-generation workflow usually follows this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Allocate image
Store every pixel in memory
Save image
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For small images, this isn't a problem.&lt;/p&gt;

&lt;p&gt;But a 10,000 × 10,000 RGB image contains &lt;strong&gt;100 million pixels&lt;/strong&gt;. As resolutions increase, memory requirements grow rapidly, especially when additional processing buffers are involved.&lt;/p&gt;

&lt;p&gt;StreamingWriter takes a different approach:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Generate row
Write row to disk
Discard row
Generate next row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Only a single row (and a small amount of bookkeeping data) needs to exist in memory at any given moment.&lt;/p&gt;

&lt;p&gt;Memory usage remains relatively stable because the entire image never needs to be stored in RAM simultaneously.&lt;/p&gt;

&lt;p&gt;This means even developers using older laptops, entry-level PCs, virtual machines, or systems with around &lt;strong&gt;4 GB of RAM&lt;/strong&gt; can generate extremely large procedural images without needing workstation-class hardware.&lt;/p&gt;

&lt;p&gt;Instead of requiring enough memory to hold a complete 100-million-pixel image, StreamingWriter continuously streams data directly to disk.&lt;/p&gt;

&lt;p&gt;The result is a workflow that scales far beyond what many traditional in-memory approaches can comfortably handle.&lt;/p&gt;




&lt;h2&gt;
  
  
  Understanding the Scale
&lt;/h2&gt;

&lt;p&gt;Let's put the resolution into perspective.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;10000 × 10000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;equals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;100,000,000 pixels
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For comparison:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Resolution&lt;/th&gt;
&lt;th&gt;Pixels&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1920×1080&lt;/td&gt;
&lt;td&gt;2.07 Million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3840×2160 (4K)&lt;/td&gt;
&lt;td&gt;8.29 Million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7680×4320 (8K)&lt;/td&gt;
&lt;td&gt;33.18 Million&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10000×10000&lt;/td&gt;
&lt;td&gt;100 Million&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This single fractal image contains more pixels than a typical 8K render.&lt;/p&gt;




&lt;h2&gt;
  
  
  Beyond Julia Sets
&lt;/h2&gt;

&lt;p&gt;The same streaming approach can be applied to many procedural graphics systems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mandelbrot Sets&lt;/li&gt;
&lt;li&gt;Perlin Noise&lt;/li&gt;
&lt;li&gt;Voronoi Diagrams&lt;/li&gt;
&lt;li&gt;Terrain Maps&lt;/li&gt;
&lt;li&gt;Heatmaps&lt;/li&gt;
&lt;li&gt;Scientific Visualizations&lt;/li&gt;
&lt;li&gt;AI Dataset Generation&lt;/li&gt;
&lt;li&gt;Procedural Artwork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rendering logic changes.&lt;/p&gt;

&lt;p&gt;The streaming architecture remains exactly the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Modern displays continue to increase in resolution.&lt;/p&gt;

&lt;p&gt;At the same time, procedural content generation is becoming increasingly important in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Games&lt;/li&gt;
&lt;li&gt;Simulations&lt;/li&gt;
&lt;li&gt;AI&lt;/li&gt;
&lt;li&gt;Scientific Computing&lt;/li&gt;
&lt;li&gt;Generative Art&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Generating these assets efficiently requires more than just fast algorithms.&lt;/p&gt;

&lt;p&gt;It requires memory-efficient workflows.&lt;/p&gt;

&lt;p&gt;StreamingWriter provides exactly that.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Creating a Julia Set is already an interesting mathematical exercise.&lt;/p&gt;

&lt;p&gt;Creating one at &lt;strong&gt;10,000 × 10,000 resolution&lt;/strong&gt; introduces an entirely different challenge: managing memory efficiently.&lt;/p&gt;

&lt;p&gt;By combining fractal mathematics with &lt;code&gt;pyaitk.CLSE.StreamingWriter&lt;/code&gt;, it's possible to generate images containing &lt;strong&gt;100 million pixels&lt;/strong&gt; while avoiding the need to keep the entire image in memory.&lt;/p&gt;

&lt;p&gt;One of the most interesting aspects is that this kind of rendering isn't limited to high-end workstations. Thanks to row-by-row streaming, even systems with around &lt;strong&gt;4 GB of RAM&lt;/strong&gt; can participate in generating massive procedural images that would otherwise be impractical using fully in-memory workflows.&lt;/p&gt;

&lt;p&gt;What starts as a simple equation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z = z² + c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ultimately becomes a massive, highly detailed fractal image generated one row at a time.&lt;/p&gt;

&lt;p&gt;And that's the power of streaming image generation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Other
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;pythonaibrain[clse]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  For more information
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/DivyanshuSinha136/Pythonaibrain-1.1.9" rel="noopener noreferrer"&gt;github.com/DivyanshuSinha136/Pythonaibrain-1.1.9&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>pythonaibrain</category>
      <category>clse</category>
    </item>
    <item>
      <title>Creating Fractals, Noise, Voronoi Patterns, and Gradients in Python with pyaitk.CLSE</title>
      <dc:creator>Divyanshu Sinha</dc:creator>
      <pubDate>Wed, 17 Jun 2026 19:39:02 +0000</pubDate>
      <link>https://dev.to/divyanshusinha136/creating-fractals-noise-voronoi-patterns-and-gradients-in-python-with-pyaitkclse-cf9</link>
      <guid>https://dev.to/divyanshusinha136/creating-fractals-noise-voronoi-patterns-and-gradients-in-python-with-pyaitkclse-cf9</guid>
      <description>&lt;p&gt;Procedural graphics are everywhere.&lt;/p&gt;

&lt;p&gt;They're used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Game development&lt;/li&gt;
&lt;li&gt;Scientific visualization&lt;/li&gt;
&lt;li&gt;AI dataset generation&lt;/li&gt;
&lt;li&gt;Generative art&lt;/li&gt;
&lt;li&gt;Simulations&lt;/li&gt;
&lt;li&gt;Digital design tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Traditionally, creating fractals, noise maps, Voronoi diagrams, and advanced gradients requires multiple libraries or a significant amount of custom code.&lt;/p&gt;

&lt;p&gt;But with &lt;strong&gt;pyaitk.CLSE&lt;/strong&gt;, many of these techniques are available through simple, high-level APIs.&lt;/p&gt;

&lt;p&gt;In this article, we'll explore how to generate fractals, procedural textures, and gradients using just a few lines of Python.&lt;/p&gt;




&lt;h2&gt;
  
  
  Mandelbrot Set
&lt;/h2&gt;

&lt;p&gt;The Mandelbrot Set is one of the most famous fractals in mathematics.&lt;/p&gt;

&lt;p&gt;With CLSE, generating one is straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyaitk.CLSE&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mandelbrot_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;600&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mandelbrot.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The result is a detailed fractal image generated entirely through mathematical iteration.&lt;/p&gt;

&lt;p&gt;Applications include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mathematical visualization&lt;/li&gt;
&lt;li&gt;Educational software&lt;/li&gt;
&lt;li&gt;Fractal exploration tools&lt;/li&gt;
&lt;li&gt;Procedural artwork&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Julia Sets
&lt;/h2&gt;

&lt;p&gt;Julia Sets are closely related to the Mandelbrot Set but produce dramatically different structures depending on the selected complex constant.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;julia_set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;800&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;c_real&lt;/span&gt;&lt;span class="o"&gt;=-&lt;/span&gt;&lt;span class="mf"&gt;0.7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;c_imag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;0.27015&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;julia.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Changing the values of &lt;code&gt;c_real&lt;/code&gt; and &lt;code&gt;c_imag&lt;/code&gt; creates entirely new fractal worlds.&lt;/p&gt;

&lt;p&gt;This makes Julia Sets particularly popular for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Generative art&lt;/li&gt;
&lt;li&gt;Animation&lt;/li&gt;
&lt;li&gt;Mathematical experimentation&lt;/li&gt;
&lt;li&gt;Visual effects&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Sierpinski Triangle
&lt;/h2&gt;

&lt;p&gt;The Sierpinski Triangle is a classic recursive fractal.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sierpinski_triangle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;depth&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;sierpinski.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Despite its simple construction rules, the resulting structure demonstrates self-similarity at multiple scales.&lt;/p&gt;

&lt;p&gt;Common uses include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fractal education&lt;/li&gt;
&lt;li&gt;Recursive graphics&lt;/li&gt;
&lt;li&gt;Computational geometry demonstrations&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Plasma Generation
&lt;/h2&gt;

&lt;p&gt;Procedural plasma effects create smooth, colorful organic patterns.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;plasma&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;plasma.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Plasma textures are often used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fantasy effects&lt;/li&gt;
&lt;li&gt;Energy fields&lt;/li&gt;
&lt;li&gt;Abstract backgrounds&lt;/li&gt;
&lt;li&gt;Procedural artwork&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because the image is mathematically generated, every output can be unique.&lt;/p&gt;




&lt;h2&gt;
  
  
  Voronoi Diagrams
&lt;/h2&gt;

&lt;p&gt;Voronoi diagrams divide space into regions based on distance from seed points.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;voronoi&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;n_cells&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;seed&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;voronoi.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The generated regions resemble:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cellular structures&lt;/li&gt;
&lt;li&gt;Cracked surfaces&lt;/li&gt;
&lt;li&gt;Geographic partitioning&lt;/li&gt;
&lt;li&gt;Natural growth patterns&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Voronoi diagrams are widely used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terrain generation&lt;/li&gt;
&lt;li&gt;Game maps&lt;/li&gt;
&lt;li&gt;Biology simulations&lt;/li&gt;
&lt;li&gt;Procedural environments&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Perlin Noise
&lt;/h2&gt;

&lt;p&gt;Perlin Noise is one of the most important algorithms in procedural generation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perlin_noise_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;octaves&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;perlin.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Perlin Noise serves as the foundation for many procedural systems.&lt;/p&gt;

&lt;p&gt;Applications include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Terrain generation&lt;/li&gt;
&lt;li&gt;Cloud rendering&lt;/li&gt;
&lt;li&gt;Water simulation&lt;/li&gt;
&lt;li&gt;Texture synthesis&lt;/li&gt;
&lt;li&gt;AI dataset creation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;code&gt;octaves&lt;/code&gt; parameter controls detail complexity.&lt;/p&gt;

&lt;p&gt;Higher values produce richer structures.&lt;/p&gt;




&lt;h2&gt;
  
  
  Linear Gradients
&lt;/h2&gt;

&lt;p&gt;Gradients are fundamental building blocks for many graphics workflows.&lt;/p&gt;

&lt;p&gt;Creating a smooth linear gradient is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;pyaitk.CLSE&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;VisualEffects&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VisualEffects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_linear_gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;130&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;linear_gradient.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This smoothly blends one colour into another across the image.&lt;/p&gt;

&lt;p&gt;Common uses include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;UI backgrounds&lt;/li&gt;
&lt;li&gt;Data visualization&lt;/li&gt;
&lt;li&gt;Procedural textures&lt;/li&gt;
&lt;li&gt;Design assets&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Radial Gradients
&lt;/h2&gt;

&lt;p&gt;Radial gradients create colour transitions radiating outward from a central point.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VisualEffects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_radial_gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;512&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;120&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;img&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;radial_gradient.png&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This technique is useful for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lighting effects&lt;/li&gt;
&lt;li&gt;Glow effects&lt;/li&gt;
&lt;li&gt;Planet rendering&lt;/li&gt;
&lt;li&gt;Artistic compositions&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Combining Techniques
&lt;/h2&gt;

&lt;p&gt;One of the strengths of CLSE is that these generators can be combined.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;noise&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ProceduralArt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;perlin_noise_image&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;octaves&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gradient&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;VisualEffects&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create_radial_gradient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These outputs can be blended, transformed, filtered, or streamed into larger rendering pipelines.&lt;/p&gt;

&lt;p&gt;This enables developers to create highly complex procedural graphics from simple building blocks.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Many procedural graphics workflows require multiple libraries, custom implementations, or hundreds of lines of code.&lt;/p&gt;

&lt;p&gt;CLSE provides ready-to-use generators for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mandelbrot Fractals&lt;/li&gt;
&lt;li&gt;Julia Sets&lt;/li&gt;
&lt;li&gt;Sierpinski Triangles&lt;/li&gt;
&lt;li&gt;Plasma Effects&lt;/li&gt;
&lt;li&gt;Voronoi Diagrams&lt;/li&gt;
&lt;li&gt;Perlin Noise&lt;/li&gt;
&lt;li&gt;Linear Gradients&lt;/li&gt;
&lt;li&gt;Radial Gradients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;all through a consistent API.&lt;/p&gt;

&lt;p&gt;This makes experimentation faster and lowers the barrier to creating advanced procedural imagery.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Procedural generation is one of the most powerful techniques in computer graphics.&lt;/p&gt;

&lt;p&gt;With just a few function calls, &lt;strong&gt;pyaitk.CLSE&lt;/strong&gt; can generate fractals, noise maps, cellular structures, and professional-looking gradients entirely from mathematics.&lt;/p&gt;

&lt;p&gt;Whether you're building games, creating AI datasets, generating textures, producing educational visualizations, or simply exploring generative art, CLSE provides a practical toolkit for creating images from code.&lt;/p&gt;

&lt;p&gt;And perhaps the most interesting part?&lt;/p&gt;

&lt;p&gt;Every image starts from pure algorithms—no external assets required.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>pythonaibrain</category>
      <category>clse</category>
    </item>
  </channel>
</rss>
