Awesome json2dir 
A curated list of implementations, ports, rewrites and
heresies of json2dir.
One JSON object in. One directory tree out. Many languages, many opinions.
{ .
"greeting": "Hello, world!", ├── greeting "Hello, world!"
"dir": { ├── dir/
"subfile": "Content.\n", json2dir │ ├── subfile "Content.\n"
"subdir": {} ─────────▶ │ └── subdir/
}, ├── symlink ──▶ target path
"symlink": ["link", "target path"], └── script* #!/bin/sh …
"script": ["script", "#!/bin/sh\necho Howdy!"]
}
Contents
- The format
- Specification and tests
- Reference implementation
- Ports and rewrites
- Alternative takes
- Inverse tools
- Tooling
- Rebuttals
- Articles and usage
- At a glance
- Wanted
- Contributing
The format
Every implementation in this list speaks the same conversion scheme,
defined by the original json2dir and specified in RFC J2D-1:
| JSON value | Filesystem entry |
|---|---|
| Object | Directory, populated recursively |
| String | Regular file with exactly that content |
["link", "target"] |
Symbolic link pointing to target |
["script", "content"] |
File with the executable bit set |
The root of the document must be an object. See RFC J2D-1 for the full rules.
Specification and tests
- RFC J2D-1 - The format, the processing model and the security rules, written down with MUST and SHOULD.
- Conformance suite - 68
language-agnostic test cases and a runner. Point it at any
implementation:
python3 conformance/run.py /path/to/json2dir. - Manifesto - Why a tree is a value, and why four shapes are enough.
Reference implementation
- alurm/json2dir
- The original. Directory archives, made human-readable. Ships a Nix flake and a guide for managing dotfiles with
nix profileas ahome-managerreplacement.
Ports and rewrites
- 71g3pf4c3/json2dir-zig
- From-scratch, drop-in compatible rewrite focused on safety: never follows symlinks on the way down (
O_NOFOLLOW,AT_SYMLINK_NOFOLLOW), adds a dry-run mode and a target directory flag, and builds as a single static binary with no libc. - TheMaxMur/json2dir-scheme
- Guile Scheme port that preserves the original Unix behavior, with its own JSON parser built on Guile 3.0 standard modules only. Packaged as a Nix flake.
- daniilvaino/json2dir-cs
- The whole tool as a single C# expression:
System.Text.Json, LINQ and a self-applied recursive lambda. - daniilvaino/json2dir-msbuild
- A single MSBuild project file. No C#, no inline tasks, no
Exec: JSON is parsed with .NET regex balancing groups, and recursion goes through the<MSBuild>task calling its own project. - TheMaxMur/json2dir-nix
- JSON parsing, validation and traversal in
lib.nixusing only Nix builtins; a small shell launcher runs the generated filesystem operations, since evaluation cannot write files. Validates the whole tree before touching the destination. Also a library:mkTreebuilds a tree into the Nix store as a derivation. - tsalkenov/json2dir-lean
- Lean 4 port whose key parsing and value classification are pure functions with proofs: every accepted key is one nonempty relative component without
.or.., and each JSON form maps to the intended operation. Filesystem effects are not covered by the proofs. - TheMaxMur/json2dir-llvm-IR
- Handwritten textual LLVM IR: JSON parser, UTF-8 handling, key sorting and tree creation, linked only against libc. Differentially tested against the Rust original on 2460 input and directory-state combinations.
- TheMaxMur/json2dir-F-
- The whole CLI written in F* and extracted to OCaml: JSON parser, UTF-8 handling, path checks and tree traversal. Ports every theorem from json2dir-lean's
Spec.leanas F* lemmas checked with Z3, withoutadmit. Differentially tested against the Rust original. - TheMaxMur/json2dir-agda
- JSON parser, name checks, duplicate handling, ordering and traversal written in Agda and compiled through the GHC backend; only small
COMPILE GHCbindings for IO are handwritten. Pure modules use--safe, and the name checker and classifier carry proofs that follow json2dir-lean's specification. - TheMaxMur/json2dir-ats
- ATS2 port with the JSON parser, Unicode decoder, key sorting, path validation and tree writer in one
main.dats. Owned trees and buffers use linear types and are freed explicitly, with no garbage collector. Documents its compatibility with the Rust original rule by rule. - TheMaxMur/json2dir-bimbo
- A new compiled language built for one mission: rewriting json2dir. The JSON parser and tree walk live in
src/json2dir.bimbo; a Python frontend emits LLVM IR, and a small C runtime supplies strings, maps and POSIX calls. Functions arebestie, loopsstrut, returnsgimme. - KovalevDima/json2dir-hs
- Written by HAND, no LLMs, according to its author. A one-file Haskell take on the scheme with
aesonanddirectory. Looser than RFC J2D-1: names are joined as paths without validation, scripts get no execute bit, and numbers, booleans andnullare written to files instead of rejected. - TheMaxMur/json2dir-thesis
- The converter written in Typst: validation, traversal, planning and shell quoting live in
.typfiles, and Typst's bundle export emits a shell program that a small launcher runs. Validates the whole tree first, rejects every key with a slash, and offers--planand--emitdry runs. Ships with a satirical PhD dissertation and diploma in Doctor of Philosophical Directories. - TheMaxMur/json2dir-uiua
- The whole CLI in one
json2dir.ua: JSON decoding, validation, traversal and file creation in Uiua, with&fficalls into libc for the Unix operations Uiua lacks. No external commands or native helpers. - TheMaxMur/json2dir-ludka
- A tiny LLVM language with trading-floor syntax, built to rewrite json2dir. The parser and tree walk live in
src/json2dir.ludka; a Python compiler emits LLVM IR, and errors printMARGIN CALL. - monadix/nuon2dir
- Turns a native Nushell record into a directory tree, with a strict-JSON stdin wrapper that works as a drop-in
json2dir. Binary values become files with their exact bytes, and the whole value is validated before anything is written. - json2dir-guru/json2dir-ada
- json2dir in Ada. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-aheui
- json2dir in Aheui, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-algol60
- json2dir in ALGOL 60, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-algol68
- json2dir in ALGOL 68, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ansible
- json2dir in Ansible. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-aot
- json2dir in C#, .NET 8 Native AOT. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-apl
- json2dir in APL, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-arnoldc
- json2dir in ArnoldC, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-asm
- json2dir in x86-64 assembly (JWasm). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-awk
- json2dir in AWK, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-bash
- json2dir in Bash, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-basic
- json2dir in BASIC (FreeBASIC). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-bat
- json2dir in cmd.exe batch. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-bcpl
- json2dir in BCPL, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-befunge
- json2dir in Befunge-98, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-bqn
- json2dir in BQN. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-braincopter
- json2dir in Braincopter, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-brainfuck
- json2dir in Brainfuck, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-brainloller
- json2dir in Brainloller, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-c17
- json2dir in C17. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-c23
- json2dir in C23. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-c89
- json2dir in ANSI C (C89). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cforall
- json2dir in Cforall. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-checkedc
- json2dir in Checked C. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-chef
- json2dir in Chef, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-chez
- json2dir in Chez Scheme. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cil
- json2dir in hand-written CIL (ilasm). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cilk
- json2dir in Cilk (OpenCilk). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-clojure
- json2dir in Clojure. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cmake
- json2dir in CMake script. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cobol
- json2dir in COBOL. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-commonlisp
- json2dir in Common Lisp. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-compcert
- json2dir in C, compiled with CompCert. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cow
- json2dir in COW, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-cpp
- json2dir in C++. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-crystal
- json2dir in Crystal. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-d
- json2dir in D. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-dafny
- json2dir in Dafny. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-dart
- json2dir in Dart. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-eiffel
- json2dir in Eiffel. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-elisp
- json2dir in Emacs Lisp. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-elixir
- json2dir in Elixir. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-emojicode
- json2dir in Emojicode. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-erlang
- json2dir in Erlang. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-false
- json2dir in FALSE, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-fennel
- json2dir in Fennel. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-fish
- json2dir in ><> (Fish), with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-forth
- json2dir in Forth. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-fortran
- json2dir in Fortran. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-fractran
- json2dir in Fractran, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-freepascal
- json2dir in Free Pascal. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-fsharp
- json2dir in F#. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-gleam
- json2dir in Gleam. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-gnuc
- json2dir in GNU C. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-go
- json2dir in Go. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-groovy
- json2dir in Groovy. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-hare
- json2dir in Hare. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-haskell
- json2dir in Haskell. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-hexagony
- json2dir in Hexagony, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-holyc
- json2dir in HolyC. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-idris2
- json2dir in Idris 2. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-intercal
- json2dir in INTERCAL, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-j
- json2dir in J. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-janet
- json2dir in Janet. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-java
- json2dir in Java. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-jq
- json2dir in jq, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-js
- json2dir in plain JavaScript. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-jscript
- json2dir in JScript (Wine). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-jsonnet
- json2dir in Jsonnet, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-jsonscript
- json2dir in JSONScript. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-julia
- json2dir in Julia. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-k
- json2dir in K, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-koka
- json2dir in Koka. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-kotlin
- json2dir in Kotlin. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-kr
- json2dir in K&R C. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ksh
- json2dir in ksh93. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-logo
- json2dir in Logo, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-lolcode
- json2dir in LOLCODE, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-lua
- json2dir in Lua 5.4, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-luajit
- json2dir in LuaJIT. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-luatex
- json2dir in LuaTeX, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-malbolge
- json2dir in Malbolge Unshackled, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-mercury
- json2dir in Mercury. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-modula2
- json2dir in Modula-2. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-mojo
- json2dir in Mojo. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-neovim
- json2dir in Neovim Lua. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-nim
- json2dir in Nim. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-njs
- json2dir in nginx njs + WebDAV. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-objc
- json2dir in Objective-C. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ocaml
- json2dir in OCaml. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-octave
- json2dir in MATLAB/Octave. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-octave-pure
- json2dir in MATLAB/Octave, without Java. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-odin
- json2dir in Odin. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ook
- json2dir in Ook!, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-perl
- json2dir in Perl. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-php
- json2dir in PHP. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-piet
- json2dir in Piet, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-pikachu
- json2dir in Pikachu, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-pli
- json2dir in PL/I. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-pony
- json2dir in Pony. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-prolog
- json2dir in Prolog. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-puppet
- json2dir in Puppet. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-purescript
- json2dir in PureScript. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-pwsh
- json2dir in PowerShell. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-python
- json2dir in Python. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-r
- json2dir in R. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-racket
- json2dir in Racket. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-raku
- json2dir in Raku. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-rexx
- json2dir in REXX. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-roc
- json2dir in Roc. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-rockstar
- json2dir in Rockstar, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-rocq
- json2dir in Rocq (extracted to OCaml). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ruby
- json2dir in Ruby. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-scala
- json2dir in Scala. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-sed
- json2dir in sed, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-shakespeare
- json2dir in the Shakespeare Programming Language, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-smalltalk
- json2dir in Smalltalk. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-sml
- json2dir in Standard ML. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-snobol4
- json2dir in SNOBOL4, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-sqlite
- json2dir in SQL (SQLite). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-subleq
- json2dir in Subleq, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-swift
- json2dir in Swift. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-systemverilog
- json2dir in SystemVerilog, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-taxi
- json2dir in Taxi, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-tcl
- json2dir in Tcl. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-thue
- json2dir in Thue, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-tla
- json2dir in TLA+, evaluated by the TLC model checker, with a shell launcher for the writes. The same operators are model-checked against an independent reference spec: name safety, plan well-formedness, UTF-8 and the JSON parser over bounded input spaces. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-ts
- json2dir in TypeScript. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-unicon
- json2dir in Unicon (Icon). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-unlambda
- json2dir in Unlambda, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-v
- json2dir in V. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-vala
- json2dir in Vala. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-vbnet
- json2dir in VB.NET. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-vbs
- json2dir in VBScript (Wine). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-velato
- json2dir in Velato, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-vhdl
- json2dir in VHDL, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-vim
- json2dir in Vim script, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-wasm
- json2dir in hand-written WebAssembly (WASI, Bun). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-whitespace
- json2dir in Whitespace, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-why3
- json2dir in WhyML (Why3, extracted to OCaml). Part of the json2dir-guru collection.
- json2dir-guru/json2dir-xslt
- json2dir in XSLT 3.0, with a shell launcher for the writes. Part of the json2dir-guru collection.
- json2dir-guru/json2dir-zsh
- json2dir in zsh. Part of the json2dir-guru collection.
Alternative takes
- lcensies/json2llm
- Same JSON in, same tree out, except a language model does the compiling. Go validates the model's plan and performs the writes. Backends: OpenAI-compatible API,
claude,codex,opencode,pi, orlocalfor the cowards. - 71g3pf4c3/kube-operator2dir
- The scheme as a Kubernetes operator: a cluster-scoped
DirTreeresource holds the tree, and a DaemonSet agent materializes it on nodes matched bynodeSelector. Replaces instead of merging, reverts external drift on a resync and prunes the tree when the resource is deleted. - 71g3pf4c3/zakon2dir
- The scheme as a parody Russian federal constitutional law, in a
.docx: objects, strings, links and scripts as articles, plus the right to reverse conversion anddir2json --checkexit codes as legal facts. Has no legal force. - 71g3pf4c3/brainfuck2dir
- The scheme as an output format for brainfuck: runs of a command become files and loops become directories. The converter itself is about 94 KB of brainfuck, generated by a macro assembler and run by a Zig VM.
- 71g3pf4c3/json2philosophy
- Being and JSON, a 51-page book in Russian on the ontology of conversion: Plato's two worlds as eidos and inode, Heidegger's Dasein of the user, and
--checkexit code 3 as the call of conscience. Built from HTML with WeasyPrint. - 71g3pf4c3/voice2dir
- Dictate a tree in Russian: whisper transcribes the audio, a deterministic DSL parser turns it into a json2dir document, the tree is created and then checked by reading it back. Takes any audio ffmpeg can decode, or the microphone.
- Noiidor/json2dir-syscall
- The scheme as a Linux kernel module for x86-64: write
<base-path>\0<json>to/sys/kernel/json2dir/dataand the tree is created in kernel space. Rejects multi-component and special names; payloads are limited to one page. - 71g3pf4c3/json2dir
- J son's plan to become a director: a Russian novella in a prologue, eight chapters and an epilogue about J's son, a value at
J/son, who leaves the house of braces to become a directory.
Inverse tools
- 71g3pf4c3/dir2json
- The scheme in reverse: walks a directory and prints a
json2dir-compatible JSON object. Never follows symlinks.
Tooling
- lcensies/json2slop
- One CLI and one container image in front of the other implementations: pick a backend with
-b(rust,zig,scheme,cs,llm) or runreversethroughdir2json. Options a backend cannot honour are a usage error, never silently dropped. Includes a smoke test that applies the same fixtures with every backend and compares the trees. - json2dir-guru/json2dir-tester
- A C# runner that builds each implementation from source with its own toolchain, feeds every one the same cases and compares the resulting trees. Its cases include this list's conformance suite plus cases collected from other implementations' test suites.
Rebuttals
Projects that exist to explain why json2dir should
not.
- 71g3pf4c3/json2json
- Reads JSON and writes the same JSON back, preserving key order, duplicate keys and number forms. Argues that
json → dir → jsonis a round-trip best done in one step. - 71g3pf4c3/dir2dir
- A manifesto for copying directory trees through a typed intermediate representation, with plans, diffs and dry-runs. No code yet.
Articles and usage
- json2dir: Directory archives, made human-readable - Discussion on Lobsters, submitted by the author of json2dir.
- From JSON to File-System in One Step - Bright Coding, August 2025: a walk-through of the conversion scheme and where it fits.
- alurm/x:
apply-dotfiles - The author's own dotfiles: a Nix attribute set in
the json2dir scheme (
mac/home/config/default.nix), evaluated withnix eval --jsonand piped into json2dir.
At a glance
| Project | Language | Direction | License |
|---|---|---|---|
| json2dir | Rust | JSON → dir | ISC |
| json2dir-zig | Zig | JSON → dir | GPL-3.0 |
| json2dir-scheme | Guile Scheme | JSON → dir | ISC |
| json2dir-cs | C# | JSON → dir | Unlicense |
| json2dir-msbuild | MSBuild | JSON → dir | Unlicense |
| json2dir-nix | Nix | JSON → dir | ISC |
| json2dir-lean | Lean 4 | JSON → dir | WTFPL |
| json2dir-llvm-IR | LLVM IR | JSON → dir | ISC |
| json2dir-F- | F* | JSON → dir | ISC |
| json2dir-agda | Agda | JSON → dir | ISC |
| json2dir-ats | ATS2 | JSON → dir | ISC |
| json2dir-bimbo | bimbo-lang → LLVM IR | JSON → dir | ISC |
| json2dir-hs | Haskell | JSON → dir | BSD-3-Clause |
| json2dir-thesis | Typst | JSON → dir | ISC |
| json2dir-uiua | Uiua | JSON → dir | ISC |
| json2dir-ludka | ludka-trade → LLVM IR | JSON → dir | ISC |
| nuon2dir | Nushell | Nushell record / JSON → dir | ISC |
| json2llm | Go + LLM | JSON → LLM → dir | None specified |
| kube-operator2dir | Go + Kubernetes | CR → node dirs | Apache-2.0 (per README) |
| zakon2dir | Russian legalese | JSON ⇄ dir, by law | GPL-3.0 |
| brainfuck2dir | Brainfuck + Zig | brainfuck → JSON → dir | GPL-3.0 |
| json2philosophy | Russian prose | JSON → Being | GPL-3.0 |
| voice2dir | Python + whisper | voice → JSON → dir | GPL-3.0 |
| json2dir-syscall | C, Linux kernel module | JSON → dir, in kernel space | None specified |
| json2dir (novella) | Russian prose | J/son → director | None specified |
| json2slop | Shell + Docker | JSON → any backend → dir | None specified |
| json2dir-tester | C# | runs every implementation | None specified |
| dir2json | Rust | dir → JSON | GPL-3.0 |
| json2json | Rust | JSON → JSON | GPL-3.0 |
| dir2dir | none yet | dir → dir | GPL-3.0 |
| json2dir-ada | Ada | JSON → dir | MIT |
| json2dir-aheui | Aheui | JSON → dir (launcher) | MIT |
| json2dir-algol60 | ALGOL 60 | JSON → dir (launcher) | MIT |
| json2dir-algol68 | ALGOL 68 | JSON → dir (launcher) | MIT |
| json2dir-ansible | Ansible | JSON → dir | MIT |
| json2dir-aot | C#, .NET 8 Native AOT | JSON → dir | MIT |
| json2dir-apl | APL | JSON → dir (launcher) | MIT |
| json2dir-arnoldc | ArnoldC | JSON → dir (launcher) | MIT |
| json2dir-asm | x86-64 assembly (JWasm) | JSON → dir | MIT |
| json2dir-awk | AWK | JSON → dir (launcher) | MIT |
| json2dir-bash | Bash | JSON → dir (launcher) | MIT |
| json2dir-basic | BASIC (FreeBASIC) | JSON → dir | MIT |
| json2dir-bat | cmd.exe batch | JSON → dir | MIT |
| json2dir-bcpl | BCPL | JSON → dir (launcher) | MIT |
| json2dir-befunge | Befunge-98 | JSON → dir (launcher) | MIT |
| json2dir-bqn | BQN | JSON → dir | MIT |
| json2dir-braincopter | Braincopter | JSON → dir (launcher) | MIT |
| json2dir-brainfuck | Brainfuck | JSON → dir (launcher) | MIT |
| json2dir-brainloller | Brainloller | JSON → dir (launcher) | MIT |
| json2dir-c17 | C17 | JSON → dir | MIT |
| json2dir-c23 | C23 | JSON → dir | MIT |
| json2dir-c89 | ANSI C (C89) | JSON → dir | MIT |
| json2dir-cforall | Cforall | JSON → dir | MIT |
| json2dir-checkedc | Checked C | JSON → dir | MIT |
| json2dir-chef | Chef | JSON → dir (launcher) | MIT |
| json2dir-chez | Chez Scheme | JSON → dir | MIT |
| json2dir-cil | hand-written CIL (ilasm) | JSON → dir | MIT |
| json2dir-cilk | Cilk (OpenCilk) | JSON → dir | MIT |
| json2dir-clojure | Clojure | JSON → dir | MIT |
| json2dir-cmake | CMake script | JSON → dir | MIT |
| json2dir-cobol | COBOL | JSON → dir | MIT |
| json2dir-commonlisp | Common Lisp | JSON → dir | MIT |
| json2dir-compcert | C, compiled with CompCert | JSON → dir | MIT |
| json2dir-cow | COW | JSON → dir (launcher) | MIT |
| json2dir-cpp | C++ | JSON → dir | MIT |
| json2dir-crystal | Crystal | JSON → dir | MIT |
| json2dir-d | D | JSON → dir | MIT |
| json2dir-dafny | Dafny | JSON → dir | MIT |
| json2dir-dart | Dart | JSON → dir | MIT |
| json2dir-eiffel | Eiffel | JSON → dir | MIT |
| json2dir-elisp | Emacs Lisp | JSON → dir | MIT |
| json2dir-elixir | Elixir | JSON → dir | MIT |
| json2dir-emojicode | Emojicode | JSON → dir | MIT |
| json2dir-erlang | Erlang | JSON → dir | MIT |
| json2dir-false | FALSE | JSON → dir (launcher) | MIT |
| json2dir-fennel | Fennel | JSON → dir | MIT |
| json2dir-fish | ><> (Fish) | JSON → dir (launcher) | MIT |
| json2dir-forth | Forth | JSON → dir | MIT |
| json2dir-fortran | Fortran | JSON → dir | MIT |
| json2dir-fractran | Fractran | JSON → dir (launcher) | MIT |
| json2dir-freepascal | Free Pascal | JSON → dir | MIT |
| json2dir-fsharp | F# | JSON → dir | MIT |
| json2dir-gleam | Gleam | JSON → dir | MIT |
| json2dir-gnuc | GNU C | JSON → dir | MIT |
| json2dir-go | Go | JSON → dir | MIT |
| json2dir-groovy | Groovy | JSON → dir | MIT |
| json2dir-hare | Hare | JSON → dir | MIT |
| json2dir-haskell | Haskell | JSON → dir | MIT |
| json2dir-hexagony | Hexagony | JSON → dir (launcher) | MIT |
| json2dir-holyc | HolyC | JSON → dir | MIT |
| json2dir-idris2 | Idris 2 | JSON → dir | MIT |
| json2dir-intercal | INTERCAL | JSON → dir (launcher) | MIT |
| json2dir-j | J | JSON → dir | MIT |
| json2dir-janet | Janet | JSON → dir | MIT |
| json2dir-java | Java | JSON → dir | MIT |
| json2dir-jq | jq | JSON → dir (launcher) | MIT |
| json2dir-js | plain JavaScript | JSON → dir | MIT |
| json2dir-jscript | JScript (Wine) | JSON → dir | MIT |
| json2dir-jsonnet | Jsonnet | JSON → dir (launcher) | MIT |
| json2dir-jsonscript | JSONScript | JSON → dir | MIT |
| json2dir-julia | Julia | JSON → dir | MIT |
| json2dir-k | K | JSON → dir (launcher) | MIT |
| json2dir-koka | Koka | JSON → dir | MIT |
| json2dir-kotlin | Kotlin | JSON → dir | MIT |
| json2dir-kr | K&R C | JSON → dir | MIT |
| json2dir-ksh | ksh93 | JSON → dir | MIT |
| json2dir-logo | Logo | JSON → dir (launcher) | MIT |
| json2dir-lolcode | LOLCODE | JSON → dir (launcher) | MIT |
| json2dir-lua | Lua 5.4 | JSON → dir (launcher) | MIT |
| json2dir-luajit | LuaJIT | JSON → dir | MIT |
| json2dir-luatex | LuaTeX | JSON → dir (launcher) | MIT |
| json2dir-malbolge | Malbolge Unshackled | JSON → dir (launcher) | MIT |
| json2dir-mercury | Mercury | JSON → dir | MIT |
| json2dir-modula2 | Modula-2 | JSON → dir | MIT |
| json2dir-mojo | Mojo | JSON → dir | MIT |
| json2dir-neovim | Neovim Lua | JSON → dir | MIT |
| json2dir-nim | Nim | JSON → dir | MIT |
| json2dir-njs | nginx njs + WebDAV | JSON → dir | MIT |
| json2dir-objc | Objective-C | JSON → dir | MIT |
| json2dir-ocaml | OCaml | JSON → dir | MIT |
| json2dir-octave | MATLAB/Octave | JSON → dir | MIT |
| json2dir-octave-pure | MATLAB/Octave, without Java | JSON → dir | MIT |
| json2dir-odin | Odin | JSON → dir | MIT |
| json2dir-ook | Ook! | JSON → dir (launcher) | MIT |
| json2dir-perl | Perl | JSON → dir | MIT |
| json2dir-php | PHP | JSON → dir | MIT |
| json2dir-piet | Piet | JSON → dir (launcher) | MIT |
| json2dir-pikachu | Pikachu | JSON → dir (launcher) | MIT |
| json2dir-pli | PL/I | JSON → dir | MIT |
| json2dir-pony | Pony | JSON → dir | MIT |
| json2dir-prolog | Prolog | JSON → dir | MIT |
| json2dir-puppet | Puppet | JSON → dir | MIT |
| json2dir-purescript | PureScript | JSON → dir | MIT |
| json2dir-pwsh | PowerShell | JSON → dir | MIT |
| json2dir-python | Python | JSON → dir | MIT |
| json2dir-r | R | JSON → dir | MIT |
| json2dir-racket | Racket | JSON → dir | MIT |
| json2dir-raku | Raku | JSON → dir | MIT |
| json2dir-rexx | REXX | JSON → dir | MIT |
| json2dir-roc | Roc | JSON → dir | MIT |
| json2dir-rockstar | Rockstar | JSON → dir (launcher) | MIT |
| json2dir-rocq | Rocq (extracted to OCaml) | JSON → dir | MIT |
| json2dir-ruby | Ruby | JSON → dir | MIT |
| json2dir-scala | Scala | JSON → dir | MIT |
| json2dir-sed | sed | JSON → dir (launcher) | MIT |
| json2dir-shakespeare | the Shakespeare Programming Language | JSON → dir (launcher) | MIT |
| json2dir-smalltalk | Smalltalk | JSON → dir | MIT |
| json2dir-sml | Standard ML | JSON → dir | MIT |
| json2dir-snobol4 | SNOBOL4 | JSON → dir (launcher) | MIT |
| json2dir-sqlite | SQL (SQLite) | JSON → dir | MIT |
| json2dir-subleq | Subleq | JSON → dir (launcher) | MIT |
| json2dir-swift | Swift | JSON → dir | MIT |
| json2dir-systemverilog | SystemVerilog | JSON → dir (launcher) | MIT |
| json2dir-taxi | Taxi | JSON → dir (launcher) | MIT |
| json2dir-tcl | Tcl | JSON → dir | MIT |
| json2dir-thue | Thue | JSON → dir (launcher) | MIT |
| json2dir-tla | TLA+ (TLC) | JSON → dir (launcher) | MIT |
| json2dir-ts | TypeScript | JSON → dir | MIT |
| json2dir-unicon | Unicon (Icon) | JSON → dir | MIT |
| json2dir-unlambda | Unlambda | JSON → dir (launcher) | MIT |
| json2dir-v | V | JSON → dir | MIT |
| json2dir-vala | Vala | JSON → dir | MIT |
| json2dir-vbnet | VB.NET | JSON → dir | MIT |
| json2dir-vbs | VBScript (Wine) | JSON → dir | MIT |
| json2dir-velato | Velato | JSON → dir (launcher) | MIT |
| json2dir-vhdl | VHDL | JSON → dir (launcher) | MIT |
| json2dir-vim | Vim script | JSON → dir (launcher) | MIT |
| json2dir-wasm | hand-written WebAssembly (WASI, Bun) | JSON → dir | MIT |
| json2dir-whitespace | Whitespace | JSON → dir (launcher) | MIT |
| json2dir-why3 | WhyML (Why3, extracted to OCaml) | JSON → dir | MIT |
| json2dir-xslt | XSLT 3.0 | JSON → dir (launcher) | MIT |
| json2dir-zsh | zsh | JSON → dir | MIT |
Wanted
Implementations that have been requested but do not exist yet. Be the first:
Contributing
Wrote your own json2dir? Run the conformance suite against it, then open a
pull request. Read the contribution
guidelines first.
