<?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>Forem: Alex Voste</title>
    <description>The latest articles on Forem by Alex Voste (@alexvoste).</description>
    <link>https://forem.com/alexvoste</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3933967%2Fb8de18dc-40b6-4a5b-b3ce-15f26306872d.jpeg</url>
      <title>Forem: Alex Voste</title>
      <link>https://forem.com/alexvoste</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/alexvoste"/>
    <language>en</language>
    <item>
      <title>ForgeZero 3.1 “AEGIS”: Hardening a CLI Toolchain into a Secure Engineering Platform</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Thu, 21 May 2026 17:42:06 +0000</pubDate>
      <link>https://forem.com/alexvoste/forgezero-31-aegis-hardening-a-cli-toolchain-into-a-secure-engineering-platform-2pe0</link>
      <guid>https://forem.com/alexvoste/forgezero-31-aegis-hardening-a-cli-toolchain-into-a-secure-engineering-platform-2pe0</guid>
      <description>&lt;p&gt;We’ve just released ForgeZero v3.1.0 “AEGIS” — the largest architectural update since the project began.&lt;/p&gt;

&lt;p&gt;This release is not primarily about new features.&lt;/p&gt;

&lt;p&gt;It’s about trust.&lt;/p&gt;

&lt;p&gt;How do you make a build toolchain safer?&lt;br&gt;
How do you prevent corrupted state?&lt;br&gt;
How do you eliminate filesystem race conditions?&lt;br&gt;
How do you support Windows natively without falling back to WSL?&lt;/p&gt;

&lt;p&gt;AEGIS was our answer.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Goal: Harden Everything
&lt;/h2&gt;

&lt;p&gt;ForgeZero started as a sovereign build toolchain.&lt;/p&gt;

&lt;p&gt;With AEGIS, the goal was to harden every critical path:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;file access&lt;/li&gt;
&lt;li&gt;process execution&lt;/li&gt;
&lt;li&gt;path validation&lt;/li&gt;
&lt;li&gt;manifest generation&lt;/li&gt;
&lt;li&gt;checksum verification&lt;/li&gt;
&lt;li&gt;supply-chain integrity&lt;/li&gt;
&lt;li&gt;platform consistency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result is a significantly more resilient engineering platform.&lt;/p&gt;


&lt;h1&gt;
  
  
  1. Native Windows Support (Without WSL)
&lt;/h1&gt;

&lt;p&gt;One of the biggest milestones in this release:&lt;/p&gt;

&lt;p&gt;ForgeZero now runs natively on Windows without requiring WSL.&lt;/p&gt;

&lt;p&gt;That meant much more than “it builds on Windows.”&lt;/p&gt;

&lt;p&gt;It required platform-aware security guarantees.&lt;/p&gt;

&lt;p&gt;Implemented:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Native Windows Virtual FileSystem backend&lt;/li&gt;
&lt;li&gt;Drive-letter normalization (&lt;code&gt;C:\&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;UNC path validation and unsafe network path rejection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;.exe&lt;/code&gt; / &lt;code&gt;.bat&lt;/code&gt; executable resolution&lt;/li&gt;
&lt;li&gt;Retry-safe close-then-rename semantics&lt;/li&gt;
&lt;li&gt;Reparse-point and symlink safety checks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Windows is now a first-class platform.&lt;/p&gt;


&lt;h1&gt;
  
  
  2. A Dedicated Virtual FileSystem Layer
&lt;/h1&gt;

&lt;p&gt;We moved all filesystem operations behind a hardened abstraction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;internal&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fs&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is more than an interface wrapper.&lt;/p&gt;

&lt;p&gt;It provides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;verified file access&lt;/li&gt;
&lt;li&gt;symlink rejection before open&lt;/li&gt;
&lt;li&gt;TOCTOU race protection
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Lstat → open → SameFile verification
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;atomic writes&lt;/li&gt;
&lt;li&gt;fail-closed behavior&lt;/li&gt;
&lt;li&gt;root-boundary enforcement&lt;/li&gt;
&lt;li&gt;injectable mock filesystem for deterministic testing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If something looks unsafe, ForgeZero stops.&lt;/p&gt;

&lt;p&gt;That’s intentional.&lt;/p&gt;




&lt;h1&gt;
  
  
  3. Hardened Command Execution
&lt;/h1&gt;

&lt;p&gt;Every external process now goes through a unified execution pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;RunCommand&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;RunCommandOutput&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;LookExecutable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Security improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no shell invocation&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exec.CommandContext&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;deterministic environment&lt;/li&gt;
&lt;li&gt;secure executable discovery&lt;/li&gt;
&lt;li&gt;CLI path validation&lt;/li&gt;
&lt;li&gt;traversal rejection (&lt;code&gt;../&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;constant-time checksum verification&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This removed multiple raw execution paths across the codebase.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pkgman → raw git exec
linker → raw nm/objdump/readelf
builder → raw ar
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;all external commands → hardened execution layer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  4. Verified File Access &amp;amp; TOCTOU Protection
&lt;/h1&gt;

&lt;p&gt;Race conditions in filesystem operations are easy to ignore.&lt;/p&gt;

&lt;p&gt;They shouldn’t be.&lt;/p&gt;

&lt;p&gt;AEGIS introduces verified reads:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;OpenVerified&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;OpenVerifiedRead&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The sequence:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. Lstat()
2. Reject symlinks
3. Open file
4. SameFile() check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This prevents classic time-of-check/time-of-use attacks.&lt;/p&gt;




&lt;h1&gt;
  
  
  5. Atomic Everything
&lt;/h1&gt;

&lt;p&gt;Interrupted writes can corrupt manifests, cache entries, or build artifacts.&lt;/p&gt;

&lt;p&gt;Now all critical writes are atomic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;SecureWriteFile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;atomicWrite&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;temp file → fsync → rename
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows, rename includes retry-safe logic to handle file locking behavior.&lt;/p&gt;




&lt;h1&gt;
  
  
  6. Supply Chain Hardening
&lt;/h1&gt;

&lt;p&gt;We expanded integrity guarantees for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;verify&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sbom&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;vendor scanning&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Improvements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;secure manifest reads&lt;/li&gt;
&lt;li&gt;atomic manifest generation&lt;/li&gt;
&lt;li&gt;constant-time hash comparison&lt;/li&gt;
&lt;li&gt;fail-closed symlink handling&lt;/li&gt;
&lt;li&gt;explicit warnings for external vendor symlinks&lt;/li&gt;
&lt;li&gt;degraded hashing instead of silent bypass&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Supply-chain security should not be optional.&lt;/p&gt;




&lt;h1&gt;
  
  
  7. New: &lt;code&gt;fz doctor&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;A new diagnostics command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz doctor
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Checks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zig&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fasm&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wasm-ld&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;root accessibility&lt;/li&gt;
&lt;li&gt;filesystem permissions&lt;/li&gt;
&lt;li&gt;recursive verified reads&lt;/li&gt;
&lt;li&gt;active VFS backend&lt;/li&gt;
&lt;li&gt;runtime environment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;JSON mode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz doctor &lt;span class="nt"&gt;--json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is especially useful in CI environments.&lt;/p&gt;




&lt;h1&gt;
  
  
  Testing &amp;amp; Reliability
&lt;/h1&gt;

&lt;p&gt;Everything was validated through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; ./...
go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-race&lt;/span&gt; ./...
&lt;span class="nv"&gt;GOOS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;windows go build ./...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All green.&lt;/p&gt;

&lt;p&gt;Coverage highlights:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pkgman   91.5%
fs       91.7%
doctor   90.8%
config   91.7%
watcher  91.1%
verify   84.0%
utils    83.1%
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;branch coverage suites&lt;/li&gt;
&lt;li&gt;fault-injection testing&lt;/li&gt;
&lt;li&gt;mock subprocess execution&lt;/li&gt;
&lt;li&gt;mock HTTP flows&lt;/li&gt;
&lt;li&gt;VFS failure-path testing&lt;/li&gt;
&lt;/ul&gt;




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

&lt;p&gt;Most CLI tools focus on functionality.&lt;/p&gt;

&lt;p&gt;Fewer focus on resilience.&lt;/p&gt;

&lt;p&gt;Even fewer guarantee:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;predictable behavior&lt;/li&gt;
&lt;li&gt;secure execution&lt;/li&gt;
&lt;li&gt;cross-platform parity&lt;/li&gt;
&lt;li&gt;race-condition resistance&lt;/li&gt;
&lt;li&gt;fail-closed integrity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That’s what AEGIS is about.&lt;/p&gt;

&lt;p&gt;Not just new capabilities.&lt;/p&gt;

&lt;p&gt;A stronger foundation.&lt;/p&gt;




&lt;p&gt;ForgeZero v3.1.0 “AEGIS” is live.&lt;/p&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/forgezero-cli/forgezero" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/forgezero&lt;/a&gt;&lt;br&gt;
Author: &lt;a href="https://github.com/alexvoste" rel="noopener noreferrer"&gt;https://github.com/alexvoste&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I’d love feedback from anyone building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;developer tools&lt;/li&gt;
&lt;li&gt;compilers&lt;/li&gt;
&lt;li&gt;CI/CD systems&lt;/li&gt;
&lt;li&gt;package managers&lt;/li&gt;
&lt;li&gt;secure build pipelines&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>tooling</category>
      <category>go</category>
      <category>zig</category>
      <category>c</category>
    </item>
    <item>
      <title>ForgeZero v3.0.0 “Gloria”: Building Toward Sovereign Engineering</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Wed, 20 May 2026 21:03:28 +0000</pubDate>
      <link>https://forem.com/alexvoste/forgezero-v300-gloria-building-toward-sovereign-engineering-169i</link>
      <guid>https://forem.com/alexvoste/forgezero-v300-gloria-building-toward-sovereign-engineering-169i</guid>
      <description>&lt;p&gt;In modern software development, a build system is no longer just a file pipeline—it’s the foundation of project security, determinism, and independence.&lt;/p&gt;

&lt;p&gt;Today, the ForgeZero team is introducing &lt;strong&gt;v3.0.0 “Gloria”&lt;/strong&gt;, a major step forward in our mission toward &lt;strong&gt;sovereign engineering&lt;/strong&gt;: a development process where engineers retain complete control over every byte, and external toolchains no longer dictate the rules.&lt;/p&gt;

&lt;p&gt;This release delivers major architectural upgrades across &lt;strong&gt;toolchain sovereignty&lt;/strong&gt;, &lt;strong&gt;supply chain security&lt;/strong&gt;, &lt;strong&gt;deterministic builds&lt;/strong&gt;, and &lt;strong&gt;developer tooling&lt;/strong&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.amazonaws.com%2Fuploads%2Farticles%2Fq6x3myvpgajtde7dx0va.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.amazonaws.com%2Fuploads%2Farticles%2Fq6x3myvpgajtde7dx0va.png" alt=" " width="800" height="447"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Sovereign Toolchain &amp;amp; Cross-Compilation
&lt;/h2&gt;

&lt;p&gt;One of the most significant improvements in Gloria is the integration of a &lt;strong&gt;native Zig backend directly into the ForgeZero core&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This allows us to provide &lt;strong&gt;memory-safe cross-compilation for C/C++ projects&lt;/strong&gt; without relying on system linkers, platform-specific libraries, or fragile host configurations.&lt;/p&gt;

&lt;p&gt;With ForgeZero, building for any supported target becomes a clean, autonomous process—fully isolated from environment inconsistencies and external toolchain drift.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key benefits
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Native &lt;strong&gt;Zig-powered compilation backend&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Memory-safe&lt;/strong&gt; build orchestration&lt;/li&gt;
&lt;li&gt;No dependency on &lt;strong&gt;system linker behavior&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reliable &lt;strong&gt;cross-platform output&lt;/strong&gt; from a unified pipeline&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fmk0fm01k4taras7v28nz.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.amazonaws.com%2Fuploads%2Farticles%2Fmk0fm01k4taras7v28nz.png" alt=" " width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Supply Chain Security by Default
&lt;/h2&gt;

&lt;p&gt;Security in Gloria is not an optional plugin—it is a built-in standard.&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.amazonaws.com%2Fuploads%2Farticles%2F0oui90jfeqful07amfzk.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.amazonaws.com%2Fuploads%2Farticles%2F0oui90jfeqful07amfzk.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  SAST Audit Engine
&lt;/h3&gt;

&lt;p&gt;We introduced a new &lt;strong&gt;Static Application Security Testing (SAST)&lt;/strong&gt; engine that performs real-time project inspection during the build lifecycle.&lt;/p&gt;

&lt;p&gt;It automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Detects &lt;strong&gt;secret leaks&lt;/strong&gt; and exposed credentials&lt;/li&gt;
&lt;li&gt;Verifies &lt;strong&gt;license compliance&lt;/strong&gt;, including &lt;strong&gt;MPL 2.0&lt;/strong&gt; conditions&lt;/li&gt;
&lt;li&gt;Performs deep &lt;strong&gt;code pattern analysis&lt;/strong&gt; for risky structures and anomalies&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  CycloneDX SBOM Generation
&lt;/h3&gt;

&lt;p&gt;ForgeZero now automatically generates a &lt;strong&gt;Software Bill of Materials (SBOM)&lt;/strong&gt; using the &lt;strong&gt;CycloneDX specification&lt;/strong&gt;, providing full transparency into software composition.&lt;/p&gt;

&lt;p&gt;To ensure artifact integrity, generated metadata and outputs are protected with &lt;strong&gt;BLAKE3 cryptographic hashing&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reliability &amp;amp; Deterministic Builds
&lt;/h2&gt;

&lt;p&gt;Reproducibility is a core principle of sovereign engineering.&lt;/p&gt;

&lt;h3&gt;
  
  
  Zero-Entropy Binaries
&lt;/h3&gt;

&lt;p&gt;Gloria produces &lt;strong&gt;byte-for-byte identical binaries&lt;/strong&gt;, independent of the underlying hardware used during compilation.&lt;/p&gt;

&lt;p&gt;This hardware-independent determinism improves:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Build verification&lt;/li&gt;
&lt;li&gt;Supply chain trust&lt;/li&gt;
&lt;li&gt;CI/CD consistency&lt;/li&gt;
&lt;li&gt;Long-term reproducibility&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Thread-Safe Core
&lt;/h3&gt;

&lt;p&gt;The ForgeZero core is now fully &lt;strong&gt;thread-safe and race-detected&lt;/strong&gt;, ensuring predictable behavior even under high-concurrency workloads and large-scale build pipelines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Expanded Developer Toolkit
&lt;/h2&gt;

&lt;p&gt;Gloria also introduces new utilities designed for verification and performance-focused workflows.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;fz verify&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Instant integrity validation for the entire project structure.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;code&gt;fz bench&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;High-precision benchmarking with &lt;strong&gt;nanosecond-level profiling&lt;/strong&gt;, built for engineers optimizing performance at instruction-level granularity.&lt;/p&gt;

&lt;h3&gt;
  
  
  FASM &amp;amp; WASM Support
&lt;/h3&gt;

&lt;p&gt;We expanded target support with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FASM (ELF64)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WASM (wasm32-wasi)&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes ForgeZero even more flexible across systems, low-level tooling, and portable runtime environments.&lt;/p&gt;




&lt;h2&gt;
  
  
  Our Mission: Absolute Build Sovereignty
&lt;/h2&gt;

&lt;p&gt;ForgeZero exists to give engineers complete sovereignty over the build process.&lt;/p&gt;

&lt;p&gt;By eliminating reliance on external toolchains and enforcing binary integrity at every stage of the software lifecycle, we aim to make &lt;strong&gt;secure, deterministic engineering the default—not the exception&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We’d love feedback from developers who care deeply about &lt;strong&gt;clean architecture&lt;/strong&gt;, &lt;strong&gt;reproducibility&lt;/strong&gt;, and &lt;strong&gt;supply chain security&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;code&gt;github.com/forgezero-cli/ForgeZero&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Documentation and release notes have been fully updated in the repository.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Copyright (c) 2026 Alex Voste. MIT License | ForgeZero Core Team&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>news</category>
      <category>security</category>
      <category>softwareengineering</category>
      <category>tooling</category>
    </item>
    <item>
      <title>fz 2.0.0 NEXUS — package manager, BLAKE3 cache, and cross-compilation for C/ASM</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Tue, 19 May 2026 22:39:23 +0000</pubDate>
      <link>https://forem.com/alexvoste/fz-200-nexus-package-manager-blake3-cache-and-cross-compilation-for-casm-3nig</link>
      <guid>https://forem.com/alexvoste/fz-200-nexus-package-manager-blake3-cache-and-cross-compilation-for-casm-3nig</guid>
      <description>&lt;p&gt;Yesterday I shipped 1.9.0. Got a solid mix of hate and genuinely useful feedback. Didn't sleep. Took all of it personally. Built 2.0.0 instead.&lt;/p&gt;

&lt;p&gt;No point dragging it out — here's everything I promised, shipped right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's new
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ⚡ BLAKE3 file hashing — 7x faster cache
&lt;/h3&gt;

&lt;p&gt;Dropped SHA256. Switched to BLAKE3 across the board.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File size&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;10 MB&lt;/td&gt;
&lt;td&gt;58 ms&lt;/td&gt;
&lt;td&gt;8.7 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Package verification from the catalog uses BLAKE3 too.&lt;/p&gt;




&lt;h3&gt;
  
  
  📦 Package manager — fz pm
&lt;/h3&gt;

&lt;p&gt;The big one. Dependency management for C/ASM projects that doesn't make you want to quit programming.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz pm add &amp;lt;repository&amp;gt;
fz pm remove &amp;lt;package&amp;gt;
fz pm update
fz pm list
fz pm search &amp;lt;query&amp;gt;
fz pm &lt;span class="nb"&gt;install
&lt;/span&gt;fz pm catalog
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dependencies live in &lt;code&gt;.fz.yaml&lt;/code&gt;. Removal cleans up empty parent directories automatically. Backed by a community-driven JSON package catalog.&lt;/p&gt;




&lt;h3&gt;
  
  
  🔌 Shared library support
&lt;/h3&gt;

&lt;p&gt;New flags: &lt;code&gt;-shared&lt;/code&gt;, &lt;code&gt;-cc-flag&lt;/code&gt;, &lt;code&gt;-ld-flag&lt;/code&gt;. Build &lt;code&gt;.so&lt;/code&gt; and &lt;code&gt;.dylib&lt;/code&gt; targets without wiring things up by hand.&lt;/p&gt;




&lt;h3&gt;
  
  
  🎯 Cross-compilation
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-target&lt;/span&gt; arm-linux-gnueabihf
fz &lt;span class="nt"&gt;-target&lt;/span&gt; riscv64-linux-gnu
fz &lt;span class="nt"&gt;-target&lt;/span&gt; x86_64-w64-mingw32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ARM, RISC-V, x86_64, i386. Compiler, assembler, and linker are selected automatically for the target triple.&lt;/p&gt;




&lt;h3&gt;
  
  
  🗂 Static libraries
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-type&lt;/span&gt; static &lt;span class="nt"&gt;-lib&lt;/span&gt; mylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Builds &lt;code&gt;.a&lt;/code&gt; archives from object files via &lt;code&gt;ar&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  🧠 LSP support
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-compile-commands&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates &lt;code&gt;compile_commands.json&lt;/code&gt; for clangd and any compatible LSP client. Autocomplete and go-to-definition, no manual config.&lt;/p&gt;




&lt;h2&gt;
  
  
  Improvements &amp;amp; fixes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Parallel builds with &lt;code&gt;-j N&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Linker scripts and text section address: &lt;code&gt;-T&lt;/code&gt;, &lt;code&gt;-Ttext&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fixed object file name collisions (&lt;code&gt;hello.asm&lt;/code&gt; vs &lt;code&gt;hello.s&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;All &lt;code&gt;golangci-lint&lt;/code&gt; warnings resolved: &lt;code&gt;errcheck&lt;/code&gt;, &lt;code&gt;govet&lt;/code&gt;, &lt;code&gt;ineffassign&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Context and timeouts for all network and git operations&lt;/li&gt;
&lt;li&gt;Test coverage: utils &lt;strong&gt;84%&lt;/strong&gt;, linker &lt;strong&gt;60%&lt;/strong&gt;, assembler &lt;strong&gt;60%&lt;/strong&gt;, builder &lt;strong&gt;56%&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/forgezero-cli/ForgeZero/cmd/fz@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






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

&lt;ul&gt;
&lt;li&gt;Repository: &lt;a href="https://github.com/forgezero-cli/ForgeZero" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/ForgeZero&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Package catalog: &lt;a href="https://github.com/forgezero-cli/catalog" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/catalog&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://github.com/forgezero-cli/ForgeZero#readme" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/ForgeZero#readme&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Solo project. All issues and PRs read personally. If something's broken or missing — tell me, I'll probably fix it overnight.&lt;/p&gt;

</description>
      <category>c</category>
      <category>go</category>
      <category>rust</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I haven't slept properly in days. I'm building a package manager for C. And I regret nothing.</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Tue, 19 May 2026 20:04:57 +0000</pubDate>
      <link>https://forem.com/alexvoste/i-havent-slept-properly-in-days-im-building-a-package-manager-for-c-and-i-regret-nothing-4jg6</link>
      <guid>https://forem.com/alexvoste/i-havent-slept-properly-in-days-im-building-a-package-manager-for-c-and-i-regret-nothing-4jg6</guid>
      <description>&lt;p&gt;4 hours of sleep a night for the past few days. ForgeZero went from 1.0 to 1.9.0 in that time. This isn't work anymore. This is obsession.&lt;/p&gt;




&lt;p&gt;Let me be real with you. Why would anyone spend their nights fighting linkers, allocators, and milliseconds?&lt;/p&gt;

&lt;p&gt;Because I refuse to let C development die.&lt;/p&gt;

&lt;p&gt;I'm obsessed with low-level programming. That feeling when it's just you and the bare metal. No fat abstractions. No lazy runtimes holding your hand. No GC randomly deciding now is a great time to pause everything. Just your logic, the CPU, and the truth.&lt;/p&gt;

&lt;p&gt;C is an art form. It's honest. It's foundational. And the tooling around it is, frankly, a disaster.&lt;/p&gt;

&lt;p&gt;Setting up dependencies in C feels like archaeology. The build systems look like they were designed to punish you. New devs touch it once and run back to npm. I get it. But I think we can fix this.&lt;/p&gt;

&lt;p&gt;That's what &lt;strong&gt;ForgeZero 2.0: NEXUS&lt;/strong&gt; is about.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's coming
&lt;/h2&gt;

&lt;h3&gt;
  
  
  📦 A package manager that doesn't suck — fz pm
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fz pm add&lt;/code&gt; and you're done. Pull C libraries and ASM modules the same way you'd import anything in a modern language. No more hunting down tarballs. No more copy-pasting compiler flags from Stack Overflow threads from 2009. No more dependency hell.&lt;/p&gt;

&lt;p&gt;Just: point at a repo, let ForgeZero do the rest.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔌 Compiler-agnostic core
&lt;/h3&gt;

&lt;p&gt;Clang, GCC, NASM, FASM — whatever your stack is, ForgeZero wraps it. A couple lines of config and it knows how to talk to your toolchain. Exotic target hardware? Still fine.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Incremental builds that actually work
&lt;/h3&gt;

&lt;p&gt;Stop rebuilding the entire project because you fixed a typo in a comment. NEXUS does deep header dependency analysis — it sees the full dep tree and only recompiles what actually changed. Your CPU will thank you.&lt;/p&gt;




&lt;h2&gt;
  
  
  The stack
&lt;/h2&gt;

&lt;p&gt;Go for the core. Rust for the hot paths (yeah, I'm that guy now). Pure C for the parts where I want to feel things.&lt;/p&gt;

&lt;p&gt;Is it overengineered? Maybe. Does it rip? Absolutely.&lt;/p&gt;




&lt;p&gt;This isn't just a software update. It's a bet that the classics don't go stale — they just needed better tooling.&lt;/p&gt;

&lt;p&gt;ForgeZero 2.0. NEXUS. Low-level lives.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Solo dev. All PRs and issues read personally. Come break things with me.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Documentation: &lt;a href="https://github.com/forgezero-cli/forgezero" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/forgezero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>rust</category>
      <category>go</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a build tool in Go — and now I'm slowly rewriting pieces in Rust (fz 1.9.0 release)</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Tue, 19 May 2026 18:31:36 +0000</pubDate>
      <link>https://forem.com/alexvoste/i-built-a-build-tool-in-go-and-now-im-slowly-rewriting-pieces-in-rust-fz-190-release-4n57</link>
      <guid>https://forem.com/alexvoste/i-built-a-build-tool-in-go-and-now-im-slowly-rewriting-pieces-in-rust-fz-190-release-4n57</guid>
      <description>&lt;p&gt;So I've been solo-building &lt;strong&gt;fz&lt;/strong&gt; — a fast, opinionated build tool for C/ASM projects written in Go. No Makefile hell, no CMake nightmares. Just a single binary that figures out your toolchain and gets out of the way.&lt;/p&gt;

&lt;p&gt;Today I shipped &lt;strong&gt;1.9.0&lt;/strong&gt; (and a quick &lt;strong&gt;1.9.2&lt;/strong&gt; patch). Here's what changed — and why I started poking at Rust.&lt;/p&gt;




&lt;h2&gt;
  
  
  What's new in 1.9.0
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Cross-compilation with &lt;code&gt;-target &amp;lt;triple&amp;gt;&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-target&lt;/span&gt; arm-linux-gnueabihf
fz &lt;span class="nt"&gt;-target&lt;/span&gt; riscv64-linux-gnu
fz &lt;span class="nt"&gt;-target&lt;/span&gt; x86_64-w64-mingw32
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;fz&lt;/code&gt; now auto-selects the right compiler, assembler, and linker for the target triple. ARM, RISC-V, x86_64, i386 — all supported out of the box.&lt;/p&gt;




&lt;h3&gt;
  
  
  Static libraries: &lt;code&gt;-type static&lt;/code&gt; / &lt;code&gt;-lib&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-type&lt;/span&gt; static &lt;span class="nt"&gt;-lib&lt;/span&gt; mylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Builds &lt;code&gt;.a&lt;/code&gt; archives from object files via &lt;code&gt;ar&lt;/code&gt;. Previously you had to wire this up yourself. Now it's a one-liner.&lt;/p&gt;




&lt;h3&gt;
  
  
  LSP support: &lt;code&gt;compile_commands.json&lt;/code&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-compile-commands&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates &lt;code&gt;compile_commands.json&lt;/code&gt; for clangd and any other LSP client. Finally get autocomplete and go-to-definition in your editor without configuring anything manually.&lt;/p&gt;




&lt;h3&gt;
  
  
  Other improvements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;fz -shell&lt;/code&gt; now handles both single files and full directories&lt;/li&gt;
&lt;li&gt;Fixed a long-standing bug where &lt;code&gt;hello.asm&lt;/code&gt; and &lt;code&gt;hello.s&lt;/code&gt; would produce conflicting object file names&lt;/li&gt;
&lt;li&gt;Linker test coverage: &lt;strong&gt;17% → 60%&lt;/strong&gt; 🎉&lt;/li&gt;
&lt;li&gt;Squashed dozens of &lt;code&gt;golangci-lint&lt;/code&gt; warnings&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  1.9.2 patch — the boring-but-important stuff
&lt;/h2&gt;

&lt;p&gt;Cleaned up every &lt;code&gt;errcheck&lt;/code&gt;, &lt;code&gt;govet&lt;/code&gt;, and &lt;code&gt;ineffassign&lt;/code&gt; warning across the codebase:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Proper error handling for &lt;code&gt;json.Encode&lt;/code&gt;, &lt;code&gt;os.Rename&lt;/code&gt;, &lt;code&gt;os.Chmod&lt;/code&gt;, &lt;code&gt;storeCache&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Error checks in tests: &lt;code&gt;os.Chdir&lt;/code&gt;, &lt;code&gt;os.MkdirAll&lt;/code&gt;, &lt;code&gt;os.Create&lt;/code&gt;, &lt;code&gt;buf.ReadFrom&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Fixed an empty branch in &lt;code&gt;builder_test.go&lt;/code&gt; and a wrong &lt;code&gt;printf&lt;/code&gt; format&lt;/li&gt;
&lt;li&gt;Updated &lt;code&gt;go.mod&lt;/code&gt; / &lt;code&gt;go.sum&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Nothing glamorous, but the kind of hygiene that prevents weird bugs six months from now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Rust experiment: &lt;code&gt;rustcache&lt;/code&gt;
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ This lives in a separate branch and is &lt;strong&gt;not&lt;/strong&gt; part of the release. Yet.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I've been curious about Rust FFI for a while, so I decided to try moving the caching layer — file hashing and copying — into a Rust static library.&lt;/p&gt;

&lt;p&gt;Here's what I've built so far in &lt;code&gt;rustcache/&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="c1"&gt;// SHA256 of a file, returned as a hex string over FFI&lt;/span&gt;
&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;rust_hash_file&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="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;c_char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="nb"&gt;c_char&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Simple file copy via std::fs::copy&lt;/span&gt;
&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;rust_copy_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;c_char&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dst&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;c_char&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;5 unit tests, all passing. Builds into &lt;code&gt;librustcache.a&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  The plan
&lt;/h3&gt;

&lt;p&gt;Once I wire it into Go via &lt;code&gt;cgo&lt;/code&gt; and build tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;//go:build rustcache&lt;/span&gt;

&lt;span class="c"&gt;// #cgo LDFLAGS: -L./rustcache/target/release -lrustcache&lt;/span&gt;
&lt;span class="c"&gt;// #include "rustcache.h"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...users will be able to opt in with &lt;code&gt;-tags rustcache&lt;/code&gt; and I'll benchmark both paths. If the Rust version is meaningfully faster, it becomes the default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For now: zero impact on existing &lt;code&gt;fz&lt;/code&gt; users.&lt;/strong&gt; The Go cache path is unchanged.&lt;/p&gt;




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

&lt;ul&gt;
&lt;li&gt;[ ] Finish the Rust → Go integration (cgo, build tags, benchmarks)&lt;/li&gt;
&lt;li&gt;[ ] Dynamic library support (&lt;code&gt;.so&lt;/code&gt; / &lt;code&gt;.dylib&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;[ ] Colored error and warning output&lt;/li&gt;
&lt;li&gt;[ ] Remote cache (S3 / MinIO) for CI/CD speedups&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;If you're building C or ASM projects and tired of Makefile archaeology, give &lt;strong&gt;fz&lt;/strong&gt; a try. Issues and PRs welcome — it's a solo project and I read everything.&lt;/p&gt;

&lt;p&gt;Docs and install: &lt;a href="https://github.com/forgezero-cli/forgezero" rel="noopener noreferrer"&gt;https://github.com/forgezero-cli/forgezero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>rust</category>
      <category>buildsystem</category>
      <category>opensource</category>
    </item>
    <item>
      <title>🚀 ForgeZero v1.9.0 — The "Architect" Update: LSP Integration, Cross-Compilation &amp; Industrial-Grade Reliability</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Mon, 18 May 2026 23:10:31 +0000</pubDate>
      <link>https://forem.com/alexvoste/forgezero-v190-the-architect-update-lsp-integration-cross-compilation-industrial-grade-4f44</link>
      <guid>https://forem.com/alexvoste/forgezero-v190-the-architect-update-lsp-integration-cross-compilation-industrial-grade-4f44</guid>
      <description>&lt;p&gt;If you've been sleeping on &lt;strong&gt;ForgeZero&lt;/strong&gt; (&lt;code&gt;fz&lt;/code&gt;) — the zero-config C build tool that actually respects your time — v1.9.0 just dropped and it's a proper glow-up. We're talking IDE superpowers, native cross-compilation, a critical bug squash, and enough test coverage to make your QA lead weep with joy. Let's break it down. 🧵&lt;/p&gt;




&lt;h2&gt;
  
  
  1. LSP &amp;amp; IDE Support — Your Editor Finally Gets It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-compile-commands&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One flag. That's all it takes to spit out a &lt;code&gt;compile_commands.json&lt;/code&gt; — the &lt;strong&gt;Compilation Database&lt;/strong&gt; that every serious editor lives and breathes.&lt;/p&gt;

&lt;p&gt;What this means in practice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Neovim + clangd&lt;/strong&gt; — full autocomplete, go-to-definition, find-references. Everything just works™&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VSCode + clang&lt;/strong&gt; — same story, zero manual config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Any LSP client&lt;/strong&gt; — if it reads &lt;code&gt;compile_commands.json&lt;/code&gt;, it's happy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;fz&lt;/code&gt; went from "fast build runner" to a &lt;strong&gt;legit professional dev environment&lt;/strong&gt; with this single addition. Your IDE will finally stop lying to you about missing includes.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Cross-Compilation — Build for ARM from Your x86 Couch
&lt;/h2&gt;

&lt;p&gt;Embedded devs, this one's for you. &lt;code&gt;fz&lt;/code&gt; now ships with &lt;strong&gt;full cross-compilation support&lt;/strong&gt; out of the box:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-target&lt;/span&gt; arm-linux-gnuebihf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No hunting for toolchain paths, no manual &lt;code&gt;-CC=&lt;/code&gt; gymnastics. &lt;code&gt;fz&lt;/code&gt; auto-detects the correct &lt;strong&gt;prefixed compilers and linkers&lt;/strong&gt; for your target triple.&lt;/p&gt;

&lt;p&gt;Build for ARM while sitting on your x86 machine. One command. Shipped. 📦&lt;/p&gt;

&lt;p&gt;Supported target examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;arm-linux-gnuebihf&lt;/code&gt; — ARMv7 hard-float (Raspberry Pi and friends)&lt;/li&gt;
&lt;li&gt;Any standard GNU cross-compilation triple&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Industrial Reliability — The Boring Part That Actually Matters
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Linker Coverage: 48% → 60%+
&lt;/h3&gt;

&lt;p&gt;Nobody likes writing linker tests. We did it anyway. The darkest corners of the linking pipeline are now covered, which means fewer "works on my machine" surprises in CI.&lt;/p&gt;

&lt;h3&gt;
  
  
  🐛 Critical Bug Fix: Object Name Collisions
&lt;/h3&gt;

&lt;p&gt;This one was nasty. Multi-file projects were silently producing &lt;code&gt;_.o&lt;/code&gt; collisions — meaning files from different directories could stomp each other's object files. The result: corrupted builds that were &lt;em&gt;sometimes&lt;/em&gt; correct, which is the worst kind of wrong.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The fix:&lt;/strong&gt; every object file now gets a &lt;strong&gt;unique name derived from its full source path&lt;/strong&gt;. No more &lt;code&gt;_.o&lt;/code&gt;. No more collisions. Multi-file projects build reliably, every time.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Before: src/foo.c → _.o  (collision risk)
After:  src/foo.c → src_foo.o  (unique, always)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. UX &amp;amp; Infrastructure — The QoL Stuff You'll Actually Notice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Smart Self-Update with Rollback
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-update&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Before: blew away your old binary and hoped for the best.&lt;/p&gt;

&lt;p&gt;Now: &lt;strong&gt;backs up the old version&lt;/strong&gt; to &lt;code&gt;/usr/local/bin/fz.old&lt;/code&gt; before installing the new one. Broke something? Roll back in one move. Safe as it gets. 💊&lt;/p&gt;

&lt;h3&gt;
  
  
  Shell Mode Now Has Tests
&lt;/h3&gt;

&lt;p&gt;The interactive shell (&lt;code&gt;fz&lt;/code&gt; REPL mode) now has full test coverage for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SplitCommand&lt;/code&gt; parsing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CmdSet&lt;/code&gt; handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CmdBuild&lt;/code&gt; execution&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your in-tool console is no longer running on vibes and prayers.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Strict Coding Standards — &lt;code&gt;fz&lt;/code&gt; Teaches You to Write Clean C
&lt;/h2&gt;

&lt;p&gt;ForgeZero now ships with &lt;strong&gt;sane-by-default compiler flags&lt;/strong&gt; in all docs and JSON command configs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-Wall&lt;/span&gt; &lt;span class="nt"&gt;-Wextra&lt;/span&gt; &lt;span class="nt"&gt;-Werror&lt;/span&gt; &lt;span class="nt"&gt;-Wpedantic&lt;/span&gt; &lt;span class="nt"&gt;-Wshadow&lt;/span&gt; &lt;span class="nt"&gt;-Wconversion&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This isn't gatekeeping — it's a forcing function. If your code compiles cleanly with these flags, it's genuinely clean code. &lt;code&gt;fz&lt;/code&gt; has an opinion about code quality, and it's the right opinion.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Treat warnings as errors. Your future self will thank you. Your coworkers will thank you. The universe will be in slightly better order.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  TL;DR — What Shipped in v1.9.0
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;-compile-commands&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Generates &lt;code&gt;compile_commands.json&lt;/code&gt; for LSP/IDE&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-compilation&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;-target &amp;lt;triple&amp;gt;&lt;/code&gt; — auto-detects toolchain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Object name fix&lt;/td&gt;
&lt;td&gt;Unique &lt;code&gt;.o&lt;/code&gt; names, no more multi-file collisions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Linker coverage&lt;/td&gt;
&lt;td&gt;48% → 60%+ test coverage&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smart update&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;fz -update&lt;/code&gt; backs up old binary to &lt;code&gt;fz.old&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shell tests&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;SplitCommand&lt;/code&gt;, &lt;code&gt;CmdSet&lt;/code&gt;, &lt;code&gt;CmdBuild&lt;/code&gt; are tested&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default flags&lt;/td&gt;
&lt;td&gt;&lt;code&gt;-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




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

&lt;p&gt;The "Architect" name wasn't chosen lightly. v1.9.0 lays the foundation for &lt;code&gt;fz&lt;/code&gt; to become the go-to build tool for serious C projects — from single-file scripts to multi-target embedded systems.&lt;/p&gt;

&lt;p&gt;Got feedback? Ran into an edge case? Drop it in the comments or open an issue. We read everything. 👇&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with &lt;code&gt;fz&lt;/code&gt;. Compiled cleanly. No warnings.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>c</category>
      <category>buildtools</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>fz 1.6 &amp; 1.7: build C, ASM and C++ without CMake hell</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Mon, 18 May 2026 00:19:15 +0000</pubDate>
      <link>https://forem.com/alexvoste/fz-16-17-build-c-asm-and-c-without-cmake-hell-25ca</link>
      <guid>https://forem.com/alexvoste/fz-16-17-build-c-asm-and-c-without-cmake-hell-25ca</guid>
      <description>&lt;p&gt;We all know the pain: you have a tiny C or ASM project, and suddenly you're knee-deep in CMake syntax from 2003, googling why your &lt;code&gt;target_link_libraries&lt;/code&gt; silently does nothing. I built ForgeZero so that building feels like &lt;code&gt;go build&lt;/code&gt; — you just run it and it works.&lt;/p&gt;

&lt;p&gt;Here's what landed in the last two releases.&lt;/p&gt;




&lt;h2&gt;
  
  
  v1.6 — daily quality of life
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;fz init&lt;/code&gt;&lt;/strong&gt; scaffolds &lt;code&gt;.fz.yaml&lt;/code&gt;, &lt;code&gt;.fzignore&lt;/code&gt; and a README in one shot. No more copy-pasting boilerplate before writing a single line of actual code.&lt;/p&gt;

&lt;p&gt;Speaking of &lt;code&gt;.fz.yaml&lt;/code&gt; — yes, I added proper config file support, because large projects need it. Define your deps, flags, output format once and forget about it. &lt;code&gt;.fzignore&lt;/code&gt; works exactly like &lt;code&gt;.gitignore&lt;/code&gt;: tell fz what to skip, it skips it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;-format bin&lt;/code&gt;&lt;/strong&gt; outputs flat binaries — no ELF headers, just raw bytes. Essential for bootloaders and firmware where the header is dead weight.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;libs&lt;/code&gt;&lt;/strong&gt; in config auto-injects &lt;code&gt;-lm&lt;/code&gt;, &lt;code&gt;-lc&lt;/code&gt;, whatever you need. &lt;strong&gt;&lt;code&gt;flags.cc&lt;/code&gt;&lt;/strong&gt; lets you drop in &lt;code&gt;-O3 -march=native&lt;/code&gt; without touching a build script.&lt;/p&gt;




&lt;h2&gt;
  
  
  v1.7 — for when the project gets serious
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;-j N&lt;/code&gt;&lt;/strong&gt; parallel builds. On a 12-core machine the compile spreads across threads faster than you can blink. If you're building system software where every file matters, this one's a relief.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linker scripts&lt;/strong&gt; (&lt;code&gt;-T&lt;/code&gt;, &lt;code&gt;-Ttext&lt;/code&gt;) for precise address control — without this, working on OSes and embedded targets was just not practical.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;fz -shell&lt;/code&gt;&lt;/strong&gt; drops you into an interactive mode: tweak params, build, clean, watch output — all live. Useful when you're deep in a debug loop and don't want to retype the same command 40 times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full C++ support&lt;/strong&gt; — &lt;code&gt;.cpp&lt;/code&gt;, &lt;code&gt;.cc&lt;/code&gt;, &lt;code&gt;.cxx&lt;/code&gt; now compile with the same strict flags as C. No shortcuts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get it
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/forgezero-cli/ForgeZero/cmd/fz@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Fully open source. Docs, examples and a forum at &lt;a href="http://fzforum.duckdns.org" rel="noopener noreferrer"&gt;fzforum.duckdns.org&lt;/a&gt; — drop by if you're tired of heavyweight build systems. PRs welcome. &lt;a href="http://github.com/forgezero-cli/forgezero" rel="noopener noreferrer"&gt;documentation&lt;/a&gt; &lt;/p&gt;

</description>
      <category>cli</category>
      <category>cpp</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>I got tired of typing nasm/ld/gcc by hand, so I built a tool that does it for me</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Sun, 17 May 2026 16:11:51 +0000</pubDate>
      <link>https://forem.com/alexvoste/i-got-tired-of-typing-nasmldgcc-by-hand-so-i-built-a-tool-that-does-it-for-me-5bkf</link>
      <guid>https://forem.com/alexvoste/i-got-tired-of-typing-nasmldgcc-by-hand-so-i-built-a-tool-that-does-it-for-me-5bkf</guid>
      <description>&lt;p&gt;If you've ever written assembly or C without CMake, Makefiles, or any build system — you know &lt;em&gt;the ritual&lt;/em&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.amazonaws.com%2Fuploads%2Farticles%2F3u22y8hawuv58dhoqxsh.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.amazonaws.com%2Fuploads%2Farticles%2F3u22y8hawuv58dhoqxsh.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open terminal. Remember the flags. Compile one file. Then another. Then link them. Then mess up the argument order. Then do it again. And again. Every. Single. Time.&lt;/p&gt;

&lt;p&gt;I did this long enough to finally say: &lt;strong&gt;enough&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That's how &lt;strong&gt;fz (ForgeZero)&lt;/strong&gt; was born — a small CLI tool written in Go that takes all the assembly/C build drudgery off your plate. No extra dependencies. No 300-line config files. It just works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What it actually does
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Build a single file — one command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-asm&lt;/span&gt; hello.asm
fz &lt;span class="nt"&gt;-cc&lt;/span&gt; main.c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to remember &lt;code&gt;nasm&lt;/code&gt;, &lt;code&gt;fasm&lt;/code&gt;, or &lt;code&gt;gcc&lt;/code&gt; flags. fz figures out what it's looking at and spits out a binary.&lt;/p&gt;

&lt;h3&gt;
  
  
  Build an entire project — also one command
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-dir&lt;/span&gt; ./src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Recursively finds all &lt;code&gt;.asm&lt;/code&gt;, &lt;code&gt;.s&lt;/code&gt;, &lt;code&gt;.fasm&lt;/code&gt;, and &lt;code&gt;.c&lt;/code&gt; files, compiles each into an object file, then links everything together. Object filenames are unique, so &lt;code&gt;hello_asm.o&lt;/code&gt; and &lt;code&gt;hello_s.o&lt;/code&gt; don't step on each other.&lt;/p&gt;

&lt;h3&gt;
  
  
  SHA256 caching — because waiting is pain
&lt;/h3&gt;

&lt;p&gt;Incremental builds without changes are near-instant. fz hashes each source file + build flags, and if nothing changed, the compiler doesn't even get invoked. That's it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Strict mode for C — no escape from quality
&lt;/h3&gt;

&lt;p&gt;C files are compiled with the full warnings-as-errors suite:&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;-Wall -Wextra -Werror -Wpedantic -Wshadow -Wconversion
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;AddressSanitizer and UBSan are on by default. The &lt;code&gt;-strict&lt;/code&gt; flag adds &lt;code&gt;use-after-return&lt;/code&gt; and &lt;code&gt;use-after-scope&lt;/code&gt;, and automatically prefers &lt;code&gt;clang&lt;/code&gt; if it's available, falling back to &lt;code&gt;gcc&lt;/code&gt; with limited support.&lt;/p&gt;

&lt;p&gt;Don't want sanitizers? &lt;code&gt;-no-sanitize&lt;/code&gt;. Done.&lt;/p&gt;

&lt;h3&gt;
  
  
  Watch mode — because hitting ↑ Enter is still too many keystrokes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-watch&lt;/span&gt; &lt;span class="nt"&gt;-dir&lt;/span&gt; ./src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Watches your source files and config for changes, rebuilds with a 500ms debounce. Save a file, and a second later you've got a fresh binary.&lt;/p&gt;

&lt;h3&gt;
  
  
  JSON output — for your CI/CD pipelines
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;fz &lt;span class="nt"&gt;-json&lt;/span&gt; &lt;span class="nt"&gt;-dir&lt;/span&gt; ./src
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns structured JSON: status, exit code, build time, list of sources and object files, binary name, error message. Easy to parse in any pipeline, no string-scraping needed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Config file — set it and forget it
&lt;/h3&gt;

&lt;p&gt;Drop a &lt;code&gt;.fz.yaml&lt;/code&gt; in your project root and stop passing flags every time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;source_dir&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;./src&lt;/span&gt;
&lt;span class="na"&gt;output&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my_program&lt;/span&gt;
&lt;span class="na"&gt;mode&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;auto&lt;/span&gt;
&lt;span class="na"&gt;debug&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;keep_obj&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
&lt;span class="na"&gt;exclude&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;legacy/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also accepts &lt;code&gt;fz.yaml&lt;/code&gt;, &lt;code&gt;.fz.yml&lt;/code&gt;, &lt;code&gt;fz.yml&lt;/code&gt; — whatever you prefer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Three linker modes
&lt;/h2&gt;

&lt;p&gt;Not all projects are the same, so you can pick:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Mode&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Tries &lt;code&gt;gcc&lt;/code&gt;, then &lt;code&gt;gcc -no-pie&lt;/code&gt;, then &lt;code&gt;ld&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only &lt;code&gt;gcc&lt;/code&gt; (for C projects)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;raw&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Only &lt;code&gt;ld&lt;/code&gt; (for pure assembly)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;fz also checks for duplicate symbols &lt;em&gt;before&lt;/em&gt; linking via &lt;code&gt;nm&lt;/code&gt; / &lt;code&gt;objdump&lt;/code&gt;, so you get a clean, readable error instead of a linker wall of text.&lt;/p&gt;




&lt;h2&gt;
  
  
  Linters &amp;amp; formatters
&lt;/h2&gt;

&lt;p&gt;Since fz builds real C and assembly, it plays nicely with the tools you're already using:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;C:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;clang-format&lt;/code&gt; — format your sources before/after build&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;clang-tidy&lt;/code&gt; — static analysis; pairs well with fz's strict mode&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cppcheck&lt;/code&gt; — extra static checks on top of GCC/clang warnings&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;splint&lt;/code&gt; — if you're into really paranoid C checking&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Assembly (NASM/GAS):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;asmfmt&lt;/code&gt; — NASM formatter (like &lt;code&gt;gofmt&lt;/code&gt;, but for asm)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;nasm -E&lt;/code&gt; — preprocessor pass to inspect macro expansion&lt;/li&gt;
&lt;li&gt;GAS has no official formatter, but &lt;code&gt;indent&lt;/code&gt;-style scripts exist in the wild&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Go (fz itself):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;gofmt&lt;/code&gt; / &lt;code&gt;goimports&lt;/code&gt; — standard Go formatting&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;golangci-lint&lt;/code&gt; — runs staticcheck, errcheck, govet and a bunch more in one shot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;go vet&lt;/code&gt; — built-in static analysis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The philosophy: fz enforces quality at the &lt;em&gt;compiler&lt;/em&gt; level (warnings as errors, sanitizers), and you layer your preferred linter on top.&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;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/forgezero-cli/ForgeZero/cmd/fz@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You just need Go, plus whatever compilers you're already using (&lt;code&gt;nasm&lt;/code&gt;, &lt;code&gt;gcc&lt;/code&gt;, &lt;code&gt;fasm&lt;/code&gt;). That's it. No package manager drama.&lt;/p&gt;




&lt;h2&gt;
  
  
  Roadmap (v1.4.0 → v1.5.0)
&lt;/h2&gt;

&lt;p&gt;Here's what's coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C++ support&lt;/strong&gt; — &lt;code&gt;.cpp&lt;/code&gt; files → &lt;code&gt;g++&lt;/code&gt;, same strict flags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom flags&lt;/strong&gt; — &lt;code&gt;-asm-flag&lt;/code&gt;, &lt;code&gt;-cc-flag&lt;/code&gt;, &lt;code&gt;-ld-flag&lt;/code&gt; for when you need to pass something weird&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exclude patterns&lt;/strong&gt; — &lt;code&gt;-exclude&lt;/code&gt; in CLI and &lt;code&gt;exclude:&lt;/code&gt; in config&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better error messages&lt;/strong&gt; — with hints like &lt;em&gt;"did you forget &lt;code&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/code&gt;?"&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Colored output&lt;/strong&gt; — errors in red, success in green, respects &lt;code&gt;NO_COLOR&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CI/CD matrix&lt;/strong&gt; — automated tests on Linux, macOS, Windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Packages&lt;/strong&gt; — Homebrew tap and AUR package&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shell completions&lt;/strong&gt; — bash, zsh, fish&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Current state
&lt;/h2&gt;

&lt;p&gt;Version &lt;strong&gt;1.3.0&lt;/strong&gt; is stable, production-ready, with ~70% test coverage, a built-in man page (&lt;code&gt;fz -man&lt;/code&gt;), and a colored &lt;code&gt;--help&lt;/code&gt; with grouped options and examples.&lt;/p&gt;

&lt;p&gt;If you write low-level code and this pain sounds familiar — give it a shot. Feedback and ⭐ on GitHub are always appreciated.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/forgezero-cli/ForgeZero" rel="noopener noreferrer"&gt;github.com/forgezero-cli/ForgeZero&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>assembly</category>
      <category>c</category>
      <category>devtools</category>
      <category>go</category>
    </item>
    <item>
      <title>ForgeZero v1.0 on Go: the assembly builder that gobbles up folders and doesn't whine</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Sat, 16 May 2026 21:16:45 +0000</pubDate>
      <link>https://forem.com/alexvoste/forgezero-v10-on-go-the-assembly-builder-that-gobbles-up-folders-and-doesnt-whine-2o1n</link>
      <guid>https://forem.com/alexvoste/forgezero-v10-on-go-the-assembly-builder-that-gobbles-up-folders-and-doesnt-whine-2o1n</guid>
      <description>&lt;p&gt;Yo, AlexVoste back again.&lt;/p&gt;

&lt;p&gt;Not long ago I wrote about my ForgeZero builder written in vanilla Node.js – zero dependencies, pure pain. Well, time flies, and I've moved to something lighter and more modern.&lt;/p&gt;

&lt;p&gt;I rewrote the whole damn thing in Go, added new flags, the ability to link entire directories in one shot. Meet fz – the assembly Swiss Army knife that just works.&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.amazonaws.com%2Fuploads%2Farticles%2Fumv1yqi9tbocrsl0g52s.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.amazonaws.com%2Fuploads%2Farticles%2Fumv1yqi9tbocrsl0g52s.png" alt=" " width="800" height="293"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why though?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you ever touched assembly (NASM, GAS, FASM), you know the drill: run nasm, then gcc, then ld, don't forget the flags, and for multi‑file projects – manually list every object file. It gets old real fast.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz boils it down to:&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -asm boot.asm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or for a whole folder&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -dir ./src&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;What's under the hood&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; Single file build – fz -asm file.asm → file.o + file (or .exe on Windows).&lt;/li&gt;
&lt;li&gt;    Recursive folder build – fz -dir ./kernel finds every .asm, .s, .fasm, assembles each into an object file, then links everything into one binary. Binary name = folder name + .out (or .exe).&lt;/li&gt;
&lt;li&gt;    Noise? Shut it – by default external commands (nasm, gcc, ld) stay silent. You only see Built: program.out. If something fails – a short error telling you to try -verbose.&lt;/li&gt;
&lt;li&gt;    Auto‑linking – first gcc, then gcc -no-pie, then ld (auto mode). You can force c (gcc only) or raw (ld only) if you're a control freak.&lt;/li&gt;
&lt;li&gt;    Debug flag – -debug passes -g down to the assembler.&lt;/li&gt;
&lt;li&gt;    Cleanup – fz -dir ./src -clean nukes all .o files, executables, and the .fz_objs temp folder in one go.&lt;/li&gt;
&lt;li&gt;    Unique object names – hello.asm and hello.s become hello_asm.o and hello_s.o so they don't step on each other's toes.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Show me the commands&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a single NASM file with verbose output:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -asm hello.asm -verbose&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build a whole project folder into a custom binary:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -dir ./src -out myapp&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Force raw linking (no libc, pure ld):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -asm boot.asm -mode raw&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clean up all artifacts generated by fz:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fz -dir . -clean&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install – two ways (one is super slick)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;_    Via go install (recommended, because Go is awesome)_&lt;/p&gt;

&lt;p&gt;&lt;code&gt;go install github.com/alexvoste/ForgeZero/cmd/fz@latest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That drops the fz binary into $GOPATH/bin (usually ~/go/bin). Make sure that directory is in your PATH.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;_    Old school clone &amp;amp; build_&lt;br&gt;
&lt;code&gt;&lt;br&gt;
    git clone https://github.com/alexvoste/ForgeZero.git&lt;br&gt;
    cd ForgeZero&lt;br&gt;
    go build -o fz ./cmd/fz&lt;br&gt;
    sudo mv fz /usr/local/bin/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;: you need the tools you're actually using – nasm, gcc, fasm, ld must be in PATH. The builder will politely remind you if something is missing.&lt;br&gt;
What's next&lt;/p&gt;

&lt;p&gt;I'm planning to add custom linker scripts, JSON output for CI/CD pipelines, and maybe a watch mode that rebuilds automatically when source files change.&lt;/p&gt;

&lt;p&gt;Try it out, open issues, send pull requests – all welcome.&lt;/p&gt;

&lt;p&gt;Happy building!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/alexvoste/forgezero/" rel="noopener noreferrer"&gt;https://github.com/alexvoste/forgezero/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>assembly</category>
      <category>systemdesign</category>
      <category>forgezero</category>
    </item>
    <item>
      <title>ForgeZero: How I stopped fearing linkers and wrote a universal assembly builder (Node.js Go)</title>
      <dc:creator>Alex Voste</dc:creator>
      <pubDate>Fri, 15 May 2026 22:35:47 +0000</pubDate>
      <link>https://forem.com/alexvoste/forgezero-how-i-stopped-fearing-linkers-and-wrote-a-universal-assembly-builder-nodejs-go-4p1f</link>
      <guid>https://forem.com/alexvoste/forgezero-how-i-stopped-fearing-linkers-and-wrote-a-universal-assembly-builder-nodejs-go-4p1f</guid>
      <description>&lt;p&gt;Hey everyone, low-level programmers and fellow weirdos.&lt;/p&gt;

&lt;p&gt;About two months ago, I was tinkering with a real-mode operating system that also had 64-bit support. Assembly was a daily grind: crypto protocols, syscalls, manual memory management. And I got tired of it. Tired of endlessly typing nasm ..., ld ..., babysitting flags, and cleaning up object file garbage.&lt;/p&gt;

&lt;p&gt;So I decided to write my own builder. First in Node.js (just for fast prototyping), and now I'm in the middle of a full rewrite in Go. And no, it's not just because Go is trendy – it's because when you write a system tool, it should be fast, native, and not drag around a 100 MB runtime.&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.amazonaws.com%2Fuploads%2Farticles%2Ftojrx91vsqs1y4cq9rbj.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.amazonaws.com%2Fuploads%2Farticles%2Ftojrx91vsqs1y4cq9rbj.png" alt=" " width="739" height="551"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What it actually does&lt;/p&gt;

&lt;p&gt;You write:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node index.js main.asm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And you get an executable. That's it. The builder does everything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Finds all .asm (or .s, .fasm) files recursively.&lt;/li&gt;
&lt;li&gt;Calls the right assembler with the right flags.&lt;/li&gt;
&lt;li&gt; Picks the right linker for your OS (ld for Linux, gcc for Windows, ld for macOS).&lt;/li&gt;
&lt;li&gt;Links with libraries if needed.&lt;/li&gt;
&lt;li&gt;Optionally cleans up object files.&lt;/li&gt;
&lt;/ul&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.amazonaws.com%2Fuploads%2Farticles%2Fkl9qn18zd93dl9r3izxi.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.amazonaws.com%2Fuploads%2Farticles%2Fkl9qn18zd93dl9r3izxi.png" alt=" " width="800" height="465"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Why it's unique&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Three assemblers in one bottle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most builders are locked to one assembler — make with NASM rules, that's it. But here:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NASM (x86 standard):&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;node index.js program.asm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GAS (GNU Assembler, AT&amp;amp;T syntax):&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;node index.js --assembler gas program.s&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;FASM (flat assembler, custom syntax):&lt;/strong&gt;&lt;br&gt;
&lt;code&gt;node index.js --assembler fasm program.fasm&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;No switching tools — one builder rules them all. Each assembler has its own flag quirks (NASM needs -f elf64, GAS just as, FASM wants format ELF64 in the source), but I made you forget about that. The --format flag works for NASM; for FASM it's… well, almost works, but you get it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Cross‑platform linking, no headache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You know that on Linux the linker is ld, on Windows it's gcc (via MinGW), and on macOS it's also ld but with different flags? I do. The builder detects your platform and:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;On Linux: adds -dynamic-linker /lib64/ld-linux-x86-64.so.2&lt;/li&gt;
&lt;li&gt;On Windows: calls gcc (because ld can't handle PE formats properly)&lt;/li&gt;
&lt;li&gt;On macOS: uses ld with native defaults&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And you just run ./program — no #ifdef in your head.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Debugging is not a luxury&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ever tried debugging assembly without symbols? I have. It's pain. So there's a --debug flag:&lt;br&gt;
bash&lt;/p&gt;

&lt;p&gt;&lt;code&gt;node index.js --debug factorial.asm&lt;br&gt;
gdb ./factorial&lt;br&gt;
(gdb) break main&lt;br&gt;
(gdb) run&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
It adds -g to the assembler (where supported) and to the linker. For FASM I had to hack it (-d DEBUG=1), but it works. Now you can set breakpoints and watch registers like a civilised person.&lt;/p&gt;

&lt;p&gt;What else makes it cool (and why I'm honestly proud)&lt;/p&gt;

&lt;p&gt;The code is split into args.js, assembler.js, linker.js, builder.js, logger.js. That's not just fancy talk — you can grab only the linker or only the argument parser for your own project. Or add your own assembler (YASM? FASM? LLVM? — let me know, I'll add it).&lt;/p&gt;

&lt;p&gt;Protection from dumb mistakes&lt;/p&gt;

&lt;p&gt;Once I accidentally overwrote my source code with the compiled binary because the builder named the output the same as the input. Since then, there's a check: if output == input, it either changes the name or throws an error. No more rm -rf of destiny.&lt;/p&gt;

&lt;p&gt;The catch (honest truth)&lt;/p&gt;

&lt;p&gt;The builder isn't perfect. Here's what it can't do yet:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parallel compilation – builds one file at a time. On a hundred files, it's slow.&lt;/li&gt;
&lt;li&gt;Windows without MinGW – if you have a bare Windows with no gcc, linking fails.&lt;/li&gt;
&lt;li&gt;FASM is still finicky – with --debug it sometimes complains about "illegal instruction" (but I'm fixing it).&lt;/li&gt;
&lt;li&gt;No config file – all flags come from the command line. That's also a plus for simplicity, though.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But for 99% of tasks — building one or two assembly files with or without libc — it works like a charm.&lt;/p&gt;

&lt;p&gt;Why I wrote it&lt;/p&gt;

&lt;p&gt;I got tired of fragmentation. Assembly is already low‑level — why should the tools around it be complicated? I wanted a "just run it" experience, like gcc main.c. Now I have it. And so do you.&lt;/p&gt;

&lt;p&gt;Try it. If you find a bug, please tell me. I'll fix it.&lt;/p&gt;

&lt;p&gt;What's next (Go version)&lt;/p&gt;

&lt;p&gt;Right now I'm actively developing the new version in Go (separate branch). The core engine is rewritten, argument parsing and assembler invocations work. FASM + --debug is also being fixed (no more "illegal instruction" — I finally understood that FASM doesn't like -d without a value).&lt;/p&gt;

&lt;p&gt;Once the Go version catches up with Node.js feature‑wise (in the next few weeks), I'll release 2.0. The Node.js version will stay as an archived prototype, but the main builder will be Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Repo&lt;/strong&gt;: &lt;a href="https://github.com/alexvoste/ForgeZero" rel="noopener noreferrer"&gt;https://github.com/alexvoste/ForgeZero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>node</category>
      <category>showdev</category>
      <category>tooling</category>
    </item>
  </channel>
</rss>
