1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
|
================================================================================
Nixtamal Philosophy & Design Principles
================================================================================
.. role:: ab
.. role:: ac
------------------------------------------------------------------------------
Core Philosophy
------------------------------------------------------------------------------
Nixtamal exists because we believe:
1. **Version pinning should be VCS-agnostic**
2. **Configuration should be human-readable**
3. **Users deserve privacy and control**
4. **Software should be maintainable without megacorporate platforms**
5. **The command line is still the best interface**
------------------------------------------------------------------------------
Why KDL?
------------------------------------------------------------------------------
We chose :ac:`KDL` (KDL Document Language) over JSON, YAML, or TOML for several
reasons:
**Readability**
KDL's node-based structure is immediately scannable. Unlike JSON's braces
and commas, or YAML's whitespace sensitivity, KDL looks like what it
represents:
.. code:: kdl
inputs {
nixpkgs {
git {
repository "https://github.com/NixOS/nixpkgs"
branch "nixos-unstable"
}
}
}
**Semantic Richness**
Nodes can have properties, children, and values all in one structure. This
maps naturally to our domain model:
.. code:: kdl
hash algorithm=SHA256 expected="sha256-..."
**No Whitespace Ambiguity**
Unlike YAML, KDL is unambiguous. No more "did I use tabs or spaces?"
**Comment Preservation** (Future)
Once KDL v2 stabilizes, we can preserve comments through roundtrips,
enabling better tooling.
------------------------------------------------------------------------------
First-Class VCS Diversity
------------------------------------------------------------------------------
**The Git Monoculture Problem**
The software industry has converged almost entirely on Git. While Git is
capable, this monoculture:
- Discourages innovation in version control
- Creates single points of failure
- Excludes projects using other VCS
- Reinforces GitHub's dominance
**Our Approach**
Nixtamal treats all VCS equally:
• **Git**: Full support with submodules, LFS, mirroring
• **Darcs**: Patch-based, context-aware locking
• **Pijul**: Channel and state-based references
• **Fossil**: Checkin-based with built-in wiki/ticket integration
• **Nilla**: Emerging framework support
Each VCS gets:
- Native prefetch integration
- Appropriate reference types (branches, tags, contexts, states)
- Proper lockfile serialization
- Documentation and examples
**Why This Matters**
When you use Darcs or Pijul, you shouldn't have to convert to Git just to use
Nix. Nixtamal meets you where you are.
------------------------------------------------------------------------------
The Anti-Corporate Stance
------------------------------------------------------------------------------
**Privacy and Surveillance**
Nixtamal will never:
- Use proprietary SaaS for core functionality
- Phone home with usage data
- Require accounts or authentication
- Track users across projects
**Platform Independence**
The source code and community are hosted on:
- Self-hosted Darcs repositories (original)
- Community-maintained Git mirrors
- XMPP for real-time communication
- nixtamal.tech for project website
We deliberately avoid:
- GitHub (Microsoft surveillance)
- Discord (proprietary, privacy-invasive)
- Slack (corporate surveillance)
- Twitter/X (disinformation platform)
**Why This Is Practical**
Modern distributed version control doesn't need a central platform. Darcs,
Pijul, and Fossil all work perfectly well without GitHub. XMPP is a mature,
federated protocol. The web existed before Cloudflare.
------------------------------------------------------------------------------
Dual Workflow Philosophy
------------------------------------------------------------------------------
**The Flake Controversy**
Nix flakes are powerful but controversial:
- Lockfiles in Git (bad for binary files)
- JSON configuration (not human-friendly)
- Centralized registry (single point of failure)
- No standardized update workflow
**Our Solution: Compatibility Without Compromise**
Nixtamal supports both workflows:
**Traditional Nix** (Default)
- ``manifest.kdl`` in repo
- ``lock.json`` in repo or separate
- Works with ``nix-build``, ``nix-shell``
- No evaluation caching issues
**Flake Integration** (Optional)
- Use ``nixtamal.lib.fromNixtamalProject`` in flake.nix
- Consume nixtamal projects as flake inputs
- Generate flake.lock from nixtamal lockfile
- Best of both worlds
**Why Both?**
Users should choose their workflow. Some teams love flakes. Others need
traditional Nix. Nixtamal doesn't force a choice.
------------------------------------------------------------------------------
Privacy by Design
------------------------------------------------------------------------------
**What We Don't Collect**
- No analytics
- No crash reporting
- No usage statistics
- No dependency telemetry
**What Stays Local**
- Lockfile generation
- Prefetch operations
- Mirror selection
- Template rendering
**Network Activity**
The only network activity is:
1. Prefetching inputs (to your own stores)
2. Checking for latest versions (when you run ``refresh``)
3. Fetching nixpkgs (if you use the default)
That's it. No metrics. No tracking. No bullshit.
------------------------------------------------------------------------------
Command Line as Primary Interface
------------------------------------------------------------------------------
**The TUI Question**
We've considered adding a Text User Interface (TUI). While appealing, we're
hesitant because:
- CLI is scriptable; TUI is not
- CLI works over SSH; TUI requires terminal support
- CLI is timeless; TUIs become dated
- CLI is accessible; TUIs may not be
**Our Compromise**
- CLI is primary and always will be
- TUI may be added as optional enhancement (Phase 4)
- All functionality available via CLI first
- Web interface for visualization (Phase 3)
------------------------------------------------------------------------------
Sustainability and Maintenance
------------------------------------------------------------------------------
**Long-term Viability**
Nixtamal is designed to be maintainable:
- OCaml is a stable, typed language with decades of history
- KDL is a simple, well-specified format
- No external service dependencies
- Clear module boundaries
- Comprehensive tests
**Community Governance**
The project follows a "benevolent dictator" model:
- toastal maintains and decides direction
- Community contributions welcome
- Forks encouraged if direction diverges
- No CLA or corporate ownership
**Funding**
Currently unfunded. If you want to support:
- Contribute code
- Write documentation
- Package for distributions
- Donate to toastal
------------------------------------------------------------------------------
Comparison with Alternatives
------------------------------------------------------------------------------
**vs. Flakes**
+ Better VCS support
+ Human-readable config (KDL vs JSON)
+ External lockfiles
+ No evaluation caching issues
- Less integrated with nix command
- Smaller ecosystem
**vs. npins**
+ First-class VCS diversity
+ KDL > JSON
+ Template support
+ Schema versioning
- More complex
- OCaml dependency
**vs. niv**
+ Modern codebase
+ Better error handling
+ Schema upgrades
- No niv import (yet)
- Less mature ecosystem
**vs. Built-in fetchers**
+ Unified interface
+ Lockfile management
+ Stale checking
+ Update workflow
- Additional dependency
------------------------------------------------------------------------------
Conclusion
------------------------------------------------------------------------------
Nixtamal represents a bet: that users want:
1. **Control** over their tooling
2. **Privacy** by default
3. **Diversity** in VCS support
4. **Compatibility** without lock-in
5. **Sustainability** over hype
If these values resonate with you, welcome. If not, there are plenty of
alternatives. Choice is the point.
.. vim: set textwidth=80
|