wooden carved cat figurine netsuke style, vibrant red floral japanese fabric background, warm lighting, macro photography, extremely detailed wood texture
Open Source Build System

Build systems,
not build scripts.

Netsuke turns a YAML-plus-Jinja Netsukefile into a static Ninja plan. Describe the graph once; let Ninja do the running.

Rust-powered Ninja backend Localised, accessible CLI
Why Netsuke?

Crafted for reliability

Declare

Describe what you want to build, not how. Netsuke figures out the steps, ensuring reproducibility across machines.

Fast by delegation

Netsuke compiles your graph to Ninja, leveraging its blazing fast incremental builds and parallelism.

Safe by default

Structured builds with explicit dependencies are safer by default. Shell escaping and YAML-first validation reduce common error classes.

Polyglot

One tool, many workflows. Build C++, Rust, Python, documentation, and assets in a single unified graph.

The Netsukefile

Readable configuration

The Netsukefile is plain YAML with controlled Jinja expansion. Structure stays declarative; the dynamic parts stay visible.

  • foreach and when for explicit expansion and filtering
  • Rules, actions, and defaults that map cleanly onto the build graph
  • String-only rendering so structure is validated before commands are produced
Netsukefile
# Reusable commands live in rules
netsuke_version: "1.0.0"

vars:
  cc: "clang"

rules:
  - name: "compile"
    command: "{{ cc }} -c {{ ins }} -o {{ outs }}"

targets:
  - name: "build/main.o"
    rule: "compile"
    sources: "src/main.c"

  - name: "docs/manual.html"
    command: "pandoc {{ ins }} -o {{ outs }}"
    sources: "README.md"
How it works

The Six-Stage Pipeline

1

Read

Load manifest files from disk

2

Parse

Validate the manifest as YAML

3

Expand

Process templates & variables

4

Render

Deserialize and render string fields

5

Validate

Check cycles & missing deps

6

Build

Execute via Ninja backend

Clear feedback, human errors

Netsuke respects your time. Output is minimal when things go right, and helpful when they go wrong.

user@devbox:~/netsuke-demo
~/netsuke-demo netsuke build app
Parsing manifests... Done (12ms)
Constructing graph... Done (4ms)
[1/3] Compiling utils.c
[2/3] Compiling main.c
[3/3] Linking app
Build successful in 0.45s
~/netsuke-demo netsuke build broken
× Cycle Detected
The dependency graph contains a cycle:
broken
└─ lib_a
└─ lib_b
└─ broken <-- Cycle here
Check src/Netsukefile:14 for dependency definitions.

What you give up vs. what you gain

Comparing Netsuke to traditional Makefiles.

Feature Make / Shell Scripts Netsuke
Configuration Imperative, shell-dependent Declarative, structured
Parallelism Manual flags (-j), flaky Automatic, max core usage
Clean Builds Often required manually Correct by default
Learning Curve Steep (obscure syntax) Gentle (Python-like)
Cross-platform Difficult (Unix vs Windows) First-class citizen