Build And Runtime Paths
Skulk supports both uv and Nix in development, but they do not have the same
job.
Recommended Contract
uvis the canonical runtime path for Skulk on macOS.- Nix is the canonical tooling and validation path for formatter, dev shell,
and
flake-based checks. - Nix should match the
uvruntime contract rather than silently swapping in a different MLX runtime.
Today that means both paths align on the same macOS MLX dependency contract:
the official mlx and mlx-metal wheel stack pinned by Skulk.
What uv Does
Use uv when you want to run Skulk itself:
uv sync
uv run skulk
On macOS, this path uses the official mlx and mlx-metal wheel stack that
the project pins in pyproject.toml.
That means the runtime path is the one most users and nodes should follow.
What Nix Does
Use Nix when you want reproducible development tooling:
nix develop
nix fmt
nix flake check
Nix gives us:
- a reproducible dev shell
- a consistent formatter entrypoint
- hermetic lint and typecheck checks
- a single place to express CI-oriented tooling
Why This Matters
Upstream exo historically carried a macOS Nix path that also changed how MLX and Metal were built. That made Nix behave like a hidden "real" runtime path, even though other docs implied that source installs and Nix installs were equivalent.
Skulk intentionally avoids that ambiguity:
- the runtime contract lives with the
uvenvironment - the Nix shell exists to support development and validation around that same runtime contract
Current macOS Guidance
For local development on Apple Silicon:
- Install the normal runtime prerequisites.
- Run Skulk with
uv. - Use Nix for
nix fmt,nix develop, andnix flake check.
If you are standing up nodes, treat uv as the path that must work first.
Treat Nix as a developer convenience and CI reproducibility layer unless the
project explicitly documents otherwise in a future release note.