Skip to content

v2026.3.23 — janus fmt Ships

Released: March 21, 2026

A language that takes itself seriously has a formatter. Now Janus does.

1,887 lines. 34 tests. Zero configuration.

Terminal window
janus fmt src/main.jan # Format in-place
janus fmt --check src/main.jan # CI: exit 1 if not formatted, show diff

The formatter enforces SPEC-017 Law 2 (the structural divide), normalizes spacing around operators, indents bodies at 4 spaces, preserves all comments, and inserts blank lines between top-level declarations.

Every test verifies idempotency: format(format(x)) == format(x). Always. Dogfooded on 1,056-line hinge_cli.jan — formats and compiles.

--check mode shows a line-by-line diff so CI logs tell you what changed, not just that something failed.

Full documentation


janus build now reads janus.lock when present. For each dependency in the lockfile, it finds the source in .hinge/registry/<name>/<version>/src/, compiles it to an object file, and links it into the final binary.

Deduplication: dependencies already compiled via use zig are detected by basename and skipped. No double-linking.

Verified end-to-end: library publishes with source, consumer resolves + locks + builds, binary calls functions from the dependency. It works.


The nested using type mismatch (i64 passed to ptr parameter of janus_using_close) was confirmed fixed. Verified with 3-level nesting: db -> tx -> cursor with correct LIFO cleanup order.

All :service profile tests pass: channels, select, nursery, spawn, using, async/await.


  • Deduplicated SemVer, manifest, and resolver into canonical lib/ modules
  • add command writes proper KDL dependencies { } blocks (was appending comments)
  • Lockfile includes transitive dependencies with CID schema
  • publish copies source files to local registry
  • Full local loop: init -> add -> resolve -> lock -> publish -> search -> consume

The LLVM emitter now correctly detects string sources from variables. User-defined functions that return string pointers are treated as strings by println (not printed as raw pointer addresses). The fix removes a function_return_types check that misclassified all :core functions as integer-returning.


  • 4 commits in this release
  • 1,887 lines of formatter code
  • 34 formatter tests (idempotency-verified)
  • ~140 lines of lockfile consumption in the build pipeline
  • 5 :service profile test targets all green