summaryrefslogtreecommitdiff
path: root/docs/archive/faqs.html
diff options
context:
space:
mode:
authorJohn Bargman2026-04-15 08:23:09 +0000
committerJohn Bargman2026-04-15 08:23:09 +0000
commitdb6b79edbfca3ab7049af2492acd567b099559f5 (patch)
treef54df4a8af70b057032e5af882bd6d1e6be87bf2 /docs/archive/faqs.html
parent4f877207787edd592687f338772d95c9ec2c7038 (diff)
downloadnixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar.gz
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar.bz2
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar.lz
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar.xz
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.tar.zst
nixtaml-website-db6b79edbfca3ab7049af2492acd567b099559f5.zip
agentic ai; is so; fucking cool; omgmain
Diffstat (limited to 'docs/archive/faqs.html')
-rw-r--r--docs/archive/faqs.html469
1 files changed, 469 insertions, 0 deletions
diff --git a/docs/archive/faqs.html b/docs/archive/faqs.html
new file mode 100644
index 0000000..05be2d8
--- /dev/null
+++ b/docs/archive/faqs.html
@@ -0,0 +1,469 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+ <head>
+ <meta charset="utf-8">
+ <meta name="generator" content="Docutils 0.22.4: https://docutils.sourceforge.io/">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <meta content="nixtamal, faqs, frequently asked questions, information" name="keywords">
+ <meta content="Answers some of your questions about Nixtamal" name="description">
+ <meta content="toastal" name="author">
+ <meta content="" name="robots">
+ <title>
+ Frequently asked questions | Nixtamal
+ </title>
+ <meta name="generator" content="soupault">
+ <meta name="viewport" content="width=device-width,initial-scale=1">
+ <meta http-equiv="X-XSS-Protection" content="1;mode=block">
+ <meta http-equiv="X-Content-Type-Options" content="nosniff">
+ <meta http-equiv="Content-Security-Policy" content="default-src 'self';">
+ <meta http-equiv="Referrer-Policy" content="strict-origin-when-cross-origin">
+ <meta name="theme" content="crimson">
+ <link rel="icon" type="image/svg+xml" href="/asset/_hashed/nixtamal/image/nixtamal-logo-gmxzsw8388sf9paq05xws7an4hnl4nx0.svg">
+ <link rel="stylesheet" href="/asset/_hashed/nixtamal/style/font-j47xx20z5d89qpsl95nnbipkg6d25m6y.css">
+ <link rel="stylesheet" href="/asset/_hashed/sugilite256/chroma-light-yfrfnk1zyqm9dc67gaa5y67s0a6x40ji.css">
+ <link rel="stylesheet" href="/asset/_hashed/sugilite256/chroma-dark-s4ssx3zwz2w418zx7pkrqlwqmywgvahl.css" media="(prefers-color-scheme: dark)">
+ <link rel="stylesheet" href="/asset/_hashed/nixtamal/style/main-lmdn1rci18371fnrcqrwga636ip08irz.css">
+ <link rel="author" href="/humans.txt">
+ </head>
+ <body>
+ <div id="DocWrapper" class="DocWrapper">
+ <div class="Banner-wrapper">
+ <header id="Banner" class="Banner">
+ <pre role="none" class="Banner-flair">┏┓╻+╻ ╱┏┳┓┏┓┏┳┓┏┓╻
+┃┃┃┃┗━┓╹┃╹┣┫┃┃┃┣┫┃
+╹┗┛╹╱ ╹ ╹ ╹╹╹ ╹╹╹┗┛</pre>
+ <a href="/" class="SiteLogo" title="Home">
+ <svg viewbox="0 0 79.375 27.099415" class="SiteLogo-image" role="img" aria-labelledby="SiteLogo-desc">
+ <use href="/asset/_hashed/nixtamal/image/nixtamal-logo-gmxzsw8388sf9paq05xws7an4hnl4nx0.svg#logo">
+ <desc id="SiteLogo-desc">
+ Home
+ </desc>
+ </use>
+ </svg>
+ </a>
+ <nav id="Navigation" class="Banner-navigation Navigation Navigation--banner" aria-expanded="true">
+ <a class="Navigation-item" href="/install/">Install</a>
+ <a class="Navigation-item" href="/manpage/">Manpage</a>
+ <a class="Navigation-item" href="/changelog/">Changelog</a>
+ <a class="Navigation-item" href="/roadmap/">Roadmap</a>
+ <a class="Navigation-item" href="/cookbook/">Cookbook</a>
+ <a class="Navigation-item" href="/real-world-showcase/">Real-world showcase</a>
+
+ <a class="Navigation-item" href="/community/">Community</a>
+ <a class="Navigation-item" href="/faqs/"><abbr title="frequently asked questions">FAQs</abbr></a>
+ <a class="Navigation-item" href="/funding/">Funding</a>
+ </nav>
+ </header>
+ <hr class="Banner-separator">
+ </div>
+ <main id="Main" class="Main">
+ <article id="Article" class="Article Stack">
+ <header class="Headline Article-headline">
+ <h1 itemprop="headline" class="title">
+ Frequently asked questions
+ </h1>
+ </header>
+ <section itemprop="articleBody" id="Content" class="Content Article-body">
+ <div class="details">
+ <details>
+ <summary>
+ How to pronounce “Nixtamal”?
+ </summary>
+ <p>
+ <strong>/nɪʃ.təˈmal/</strong> <em>or</em> <strong>/ˈnɪkstəˌmɑːl/</strong>
+ </p>
+ <p>
+ The Nahuatl pronunciation is a bit better, but no qualms with an anglicized pronunciation — as folks are probably used to Nix as /ˈnɪks/.
+ </p>
+ <p>
+ Additionally, ·𐑯𐑦𐑖𐑑𐑩𐑥𐑭𐑤 is a valid spelling for <code>en-Shaw</code>.
+ </p>
+ </details>
+ <details>
+ <summary>
+ What does the name mean?
+ </summary>
+ <figure class="Quoteblock">
+ <blockquote>
+ <p>
+ : limed kernels of [maize] that is ready to be ground into masa
+ </p>
+ </blockquote>
+ <figcaption>
+ — Merriam-Webster, <cite><a class="reference external" href="https://www.merriam-webster.com/dictionary/nixtamal">nixtamal</a></cite>
+ </figcaption>
+ </figure>
+ <p>
+ This loosens the maize’s outer hull, so it grinds easier &amp; feeds you better — making it key to Mesoamerican food &amp; health.
+ </p>
+ </details>
+ <details>
+ <summary>
+ What is “freshness”?
+ </summary>
+ <p>
+ The dual to <em>fresh</em> is <em>stale</em>. Is your input <em>stale</em>? Let’s check the <code>fresh-cmd</code> to find out!
+ </p>
+ <p>
+ The word ‘latest’ wasn’t quite appropriate since it’s up the user to decide what <em>fresh</em> means for their context — which often isn’t ‘latest’.
+The idea is: so long as it can be executed in your shell &amp; returns a string that can be compared against, you can write honestly whatever you want.
+This also pairs well with the command named <code>nixtamal refresh</code> (same as <code>pkcon refresh</code>) which runs the <code>fresh-cmd</code> which can short-circuit trying to prefetch your input to prevent wasteful network usage to download inputs or getting versions you don’t want (it’s your logic).
+ </p>
+ </details>
+ <details>
+ <summary>
+ Can I get <code>$X</code> fetcher supported? How to add a fetcher?
+ </summary>
+ <p>
+ We don’t believe it is in this project’s or the Commons’ interest to carve out special support for any fetchers (patches had to do this for <code>fetchpatch2</code>, but this was to enable a broader feature).
+What you should do is submit a patchset to upstream Nixpkgs with your fetcher — ideally with <abbr title="JavaScript Object Notation">JSON</abbr> support like the others along with being added to <code>pkgs.nix-prefetch-scripts</code>.
+This enables <em>Nix community</em> to have access to your prefetcher, not just Nixtamal which would be selfishly hoarding that capability.
+Once it is merged, ping me &amp; we can write or help you write the code needed.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Isn’t Nixpkgs big/overkill to do pinning?
+ </summary>
+ <p>
+ Big, yes.
+Overkill… it’s not as simple.
+In order to get access to the fetchers, one would need to bootstrap their setup &amp; build their own <code>derivation</code>.
+This includes at minimum a C compiler &amp; some form of <code>coreutils</code>… except you need more than this.
+For instance if you want to use <code>pkgs.fetchdarcs</code> or even create your own, you need a Darcs binary, which requires the Haskell tooling (or all static binaries built for specific platforms).
+When you take a look at how that would be set up, you would effectively be reimplementing Nixpkgs.
+As such, the simpler answer is to say Nixpkgs is effectively <em>required</em>.
+We can giggle about the size of that dependency, but the reality is 98% of projects using Nix are going to be using Nixpkgs anyhow.
+Nixtamal does offer configuration when <code>import</code>ing it which can be used to provide a minimal package set if needed.
+Wishful thoughts would be that if Nixpkgs weren’t so monolithic, core features like compilers &amp; fetchers could be separate from general packaging, but where these lines get drawn are neither clear nor simple.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Why OCaml as the main programming language?
+ </summary>
+ <p>
+ Nix the programming language falls in the <a class="reference external" href="https://en.wikipedia.org/wiki/ML_(programming_language)">ML</a> family &amp; share a lot of syntax &amp; conventions with other functional languages in the family.
+This makes the code more approachable to those familiar with Nix rather than needing to learn a very different language like Npins (Rust) or Yae (Go).
+The compile times are fast &amp; the ecosystem is sufficient.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Why <a class="reference external" href="https://kdl.dev"><abbr title="KDL Document language">KDL</abbr></a> for the manifest language?
+ </summary>
+ <p>
+ <abbr title="KDL Document language">KDL</abbr> has a syntax that isn’t a burden to use a configuration language — which helps explain why is very popular for its age.
+<abbr title="JavaScript Object Notation">JSON</abbr> has no comments, one must watch commas, &amp; is verbose with quotations.
+<abbr title="Tom’s Obvious, Minimal Language">TOML</abbr> doesn’t nest well.
+<abbr title="Yet Another Markup Language">YAML</abbr> is overly complex.
+Nickel is great, but needs to be transformed into one of these others.
+<abbr title="Extensible Data Notation">EDN</abbr> was considered, but <abbr title="KDL Document language">KDL</abbr> felt better to write – especially the <code>fresh-cmd</code> syntax using <code>$</code> &amp; <code>|</code> as node names.
+<abbr title="KDL Document language">KDL</abbr> has a schema language &amp; a best-attempt schema.kdl should be shipped as well for future <abbr title="KDL Document language">KDL</abbr> tooling or <abbr title="large language model">LLM</abbr> assistance.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Why even have a manifest file at all?
+ </summary>
+ <p>
+ Have you ever needed to switch branches on an input to something stable or next to get code working?
+The reality is your inputs evolve over time.
+If you have ever used <code>flake.nix</code>’s <code>inputs</code> you probably had a good experience of say changing a Git input’s <code>?ref=…</code> to point to a different branch/revision.
+These <abbr title="command-line interface">CLI</abbr>-only options don’t make this a nice experience—you either need to know the input key name to upsert it at the new reference point or you had to go spelunking in the lockfile (meaning you needed to be wary of <abbr title="JavaScript Object Notation">JSON</abbr> rules, but also wasn’t the lockfile supposed to be machine-generated… &amp; why do these lockfiles have data unrelated to locking?).
+The reality is that <em>betting on text</em> has been a long-standing practice for a reason.
+In the long run, a manifest file makes changing reference points, adding patches, changing hash algorithms easier—as well as being easier for humans (&amp; prehaps <abbr title="large language model">LLM</abbr>s) to understand.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Why not <abbr title="KDL Document language">KDL</abbr> for the lockfile?
+ </summary>
+ <p>
+ Nix does does not have a <code>builtins.fromKDL</code> (tho there has been <a title="Beware: this hyperlink will take you to GitHub, a proprietary code forge owned by a US-based, publicly-traded megacorporation, Microsoft which is using your data to train AIs &amp; then sell it back to you" class="bad-proprietary reference external" href="https://github.com/NixOS/nixpkgs/pull/426828">some rumblings for formats.kdl in Nixpkgs</a>).
+As such your options are <code>builtins.fromJSON</code> or <code>builtins.fromTOML</code> &amp; the Rust community’s obsession with <abbr title="Tom’s Obvious, Minimal Language">TOML</abbr> &amp; that <abbr title="Tom’s Obvious, Minimal Language">TOML</abbr> needs to integrate <abbr title="JavaScript Object Notation">JSON</abbr> syntax anyway (just like <abbr title="Yet Another Markup Language">YAML</abbr>), it tips the scales in <abbr title="JavaScript Object Notation">JSON</abbr>’s favor.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Why is the project using <a class="reference external" href="https://darcs.net"><abbr title="Darcs Advanced Revision Control System">Darcs</abbr></a> &amp; not Git?
+ </summary>
+ <p>
+ <a class="reference external" href="https://darcs.net/Theory">Patch Theory</a> is cool where patches commute (order doesn’t matter) which eliminates an entire set of merge conflicts present in snapshot-based <abbr title="version control system">VCS</abbr>s.
+Pijul has the same theory behind it, is faster, &amp; the new identity concept is what should have been (instead of name + email burned in the commits), but still lacks tooling.
+By using <abbr title="Darcs Advanced Revision Control System">Darcs</abbr>, we can also <a class="reference external" href="https://en.wikipedia.org/wiki/Eating_your_own_dog_food">dogfood</a> support for Nixtamal.
+Git uses an arcane, obtuse <abbr title="command-line interface">CLI</abbr> commands that everyone knows is overly complicated &amp; inconsistent, so why not try something fundamentally different?
+ </p>
+ <p>
+ However, <em>do not</em> be surprised if this project moves to Pijul if the tooling gets better since Darcs has been tested well enough, which would mean it would be Pijul’s turn next!
+<abbr title="Darcs Advanced Revision Control System">Darcs</abbr> is still worked on albeit it slower, but it also has some warts time has left on it.
+If there is a simple, self-hostable <abbr title="Hypertext Transfer Protocol">HTTP</abbr> option for the server &amp; a better story for rebase, <a itemprop="url" href="https://toast.al"><span itemtype="https://schema.org/Person" itemscope="" class="peer"><span itemprop="name">toastal</span></span></a> could switch.
+ </p>
+ </details>
+ <details>
+ <summary>
+ Will the project make a Git mirror?
+ </summary>
+ <p>
+ No.
+This defeats the purpose of dogfooding actual alternative <abbr title="version control system">VCS</abbr>s.
+If you see a Git mirror, it’s 100% unofficial — if not illegitimate.
+ </p>
+ </details>
+ <details>
+ <summary>
+ What is wrong with with forge-specific <abbr title="uniform resource locator">URL</abbr> schemes or semantics?
+ </summary>
+ <p>
+ Trends shift — what’s beloved now likely won’t be tomorrow.
+Rather than a minor convenience for what is popular now, a better design is to not give any place special privilege.
+This special privilege can make folks feel peer pressured into using the current trend platform (<em>especially</em> <a class="reference external" href="https://mako.cc/writing/hill-free_tools.html">proprietary code forges for free software</a>).
+We don’t want to foster this behavior — no, we want to see more self-hosting where a code base is truly owned by its makers, even if just for a backup mirror.
+This also lessens the maintenance burden as <abbr title="Application Programming Interface">API</abbr>s shift &amp; ‘mine too’-ing of someone’s unsupported platform.
+ </p>
+ </details>
+ <details>
+ <summary>
+ How can I lock the <code>fresh-cmd</code> <abbr title="command-line interface">CLI</abbr> tools?
+ </summary>
+ <p>
+ This is on you &amp; if this actually bothers you (since it might not, which we will get to).
+In most cases, we would assume you will be using old stable tools — such as <code>curl</code>, <code>jq</code>, <code>htmlq</code>, <code>git</code>, <code>coreutils</code> — which don’t really change much in practice.
+If you want, you can add these tools to your development shell &amp; run <code>nixtamal …</code> from the shell.
+You can also use something like <code>nix run</code> or <code>nix-run</code> in the <code>fresh-cmd</code>.
+But is it so bad that this could be <em>*gasp*</em> ‘impure’?
+What we mean by this is that the generated lockfile is still pure regardless after <code>fresh-cmd</code> is ran — which is the part that really matters here — &amp; other than the maintainer, I wouldn’t expect contributors or downstream to need to touch your <code>$NIXTAMAL_DIRECTORY</code>.
+ </p>
+ <p>
+ Also did you ever think about <code>nix flake update</code>?
+This is usually ran with the whimsy of the Nix version that is on your system meaning something equally ‘bad’ or ‘breaking’ could happen here.
+Perhaps not even “equally” but potentially <em>worse</em>… as the <code>nix</code> binary is usually system-dependent &amp; <code>flakes.nix</code> manifest file doesn’t have a version so its behavior could be interpretted differently depending you &amp; your team’s versions being slightly out of sync.
+ </p>
+ </details>
+ <details>
+ <summary>
+ What is wrong with Nix flakes?
+ </summary>
+ <p>
+ Well this is a hairy topic that is sure to ruffle feathers…
+First, we should address that flakes aren’t just version pinning (Nixtamal’s current focus) but an enforced pattern of project layout &amp; composition (or lack thereof depending on how you argue that).
+So let’s focus on the differences from the context of input pinning for now…
+Flakes might be “built in”, but it requires enabling an experimental flag; this might sound innocuous — especially given the prevelance of enabling it in the Nix community — but it has some serious downsides.
+ </p>
+ <ul class="simple">
+ <li>
+ <p>
+ Flakes were originally designed for specific client’s needs which might not match your own
+ </p>
+ </li>
+ <li>
+ <p>
+ Since it’s experimental, its manifest is not versioned (meaning no <code>version = "1.0.0";</code> in <code>flake.nix</code>) which ties the implementation to a version of Nix without a reasonable indicator to migrate or rollback to a version which leads can lead to unforeseen or catastrophic issues now that we are relying on the state of Nix executing it
+ </p>
+ </li>
+ <li>
+ <p>
+ Flakes have been largely “stable” in so far as they are now a political topic meaning all proposals have been gridlocked on both bikeshedding &amp; serious topics
+ </p>
+ </li>
+ <li>
+ <p>
+ “We’ll stablize soon™”, has been going on since like 2023
+ </p>
+ </li>
+ <li>
+ <p>
+ There have been multiple external efforts to stablize like Deteriminate Nix, Lix, &amp; so forth, but now you are reliant on a specific fork for stability. Like how many projects claim to have a syntax that is “just Markdown”, but Markdown being underspecified for the task means each project maintains a fork of the syntax (sometimes disguised as “flavor”). Just like the collisions you probably noticed trying to use the same Markdown file in 2 separately platforms, these flake forks will always be incompatible despite sharing <code>flake.nix</code> + <code>flake.lock</code> files
+ </p>
+ </li>
+ <li>
+ <p>
+ Being built-in &amp; not a third-party tool or pattern makes it harder to fork it reasonably &amp; also stifles diversity &amp; innovation as other options will be seen as more friction even if offering something simpler since an extra tool is involed
+ </p>
+ </li>
+ </ul>
+ <p>
+ Outside of the experimental nature we have other issue that affect pinning:
+ </p>
+ <ul class="simple">
+ <li>
+ <p>
+ We are limited to the built-in fetchers/fetch-tree &amp; if you read the bug tracker for <code>nix</code> they don’t seem terribly interested in adding more fetcher support since they already have a lot to maintain — including the burden of trying to maintain these shorthands for specific hosts; if you wanted it to support Darcs, Pijul, Fossil, or the next big <abbr title="version control system">VCS</abbr>, tough luck
+ </p>
+ </li>
+ <li>
+ <p>
+ The <abbr title="Uniform Resource Identifier">URI</abbr> scheme is nice until it isn’t — where expressing more complexity become a subjectively unreadably-long string of query parameters
+ </p>
+ </li>
+ <li>
+ <p>
+ The <abbr title="Uniform Resource Identifier">URI</abbr> scheme doesn’t support mirrors
+ </p>
+ </li>
+ <li>
+ <p>
+ Overlays offer better compositionality than <code>input.*.follows</code> but <code>follows</code> has been treated more as the preferred option, with many not exposing an overlay
+ </p>
+ </li>
+ <li>
+ <p>
+ Dependency explosion as all inputs are now added to your lock &amp; fetched (not just the millons of separately-pinned <code>nixpkgs</code> if anyone in the chain forgot or can’t use <code>follows</code>, but inputs that are just used for ‘development’, or largely useless ones like <code>flake-utils</code>’s <code>eachDefaultSystem</code> which hides the complexity of the Flake <abbr title="Application Programming Interface">API</abbr> in a dangerous way since the whole point was to be explicit about declaring what systems are supported); by providing an overlay you can skip this
+ </p>
+ </li>
+ <li>
+ <p>
+ Patching inputs are not intuitive &amp; some really wild options like involving the module system have been proposed to try to deal with it
+ </p>
+ </li>
+ </ul>
+ <p>
+ If you want to know about flakes schema criticisms, you can ask other places 🙂
+ </p>
+ </details>
+ <details>
+ <summary>
+ But can I use Nixtamal <em>with</em> flakes?
+ </summary>
+ <p>
+ You are welcome to use Nixtamal inside a <code>flake.nix</code> to get access to the the better experience that new Nix <code>command</code> setting offers (which sadly just work better with flakes instead of being more generic).
+In the basic/easiest case, you don’t let flakes manage <code>inputs</code> anymore like:
+ </p>
+ <pre class="code nix literal-block"><span class="p">{</span>
+ <span class="c1"># No longer any need for inputs</span>
+ <span class="c1"># inputs = { };</span>
+
+ <span class="n">outputs</span> <span class="o">=</span>
+ <span class="p">{</span> <span class="n">self</span> <span class="p">}:</span>
+ <span class="k">let</span>
+ <span class="n">inputs</span> <span class="o">=</span> <span class="kn">import</span> <span class="sr">./nix/tamal</span> <span class="p">{</span> <span class="p">};</span>
+
+ <span class="n">pkgs</span> <span class="o">=</span> <span class="kn">import</span> <span class="n">inputs</span><span class="o">.</span><span class="n">nixpkgs</span> <span class="p">{</span>
+ <span class="n">system</span> <span class="o">=</span> <span class="s2">"x86_64-linux"</span><span class="p">;</span>
+ <span class="n">config</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span>
+ <span class="n">overlay</span> <span class="o">=</span> <span class="p">[</span> <span class="p">(</span><span class="kn">import</span> <span class="s2">"</span><span class="si">${</span><span class="n">inputs</span><span class="o">.</span><span class="n">MY-PROJECT</span><span class="si">}</span><span class="s2">/nix/overlay"</span><span class="p">)</span> <span class="p">];</span>
+ <span class="p">};</span>
+ <span class="k">in</span>
+ <span class="p">{</span>
+ <span class="c1"># …</span>
+ <span class="p">};</span>
+<span class="p">}</span></pre>
+ <p>
+ If you want that <code>forAllSystem</code> function, you can build your own with builtins, or the standalone <a title="Beware: this hyperlink will take you to GitHub, a proprietary code forge owned by a US-based, publicly-traded megacorporation, Microsoft which is using your data to train AIs &amp; then sell it back to you" class="bad-proprietary reference external" href="https://github.com/nix-community/nixpkgs.lib">nixpkgs.lib</a> mirror, or add <a title="Beware: this hyperlink will take you to GitHub, a proprietary code forge owned by a US-based, publicly-traded megacorporation, Microsoft which is using your data to train AIs &amp; then sell it back to you" class="bad-proprietary reference external" href="https://github.com/numtide/flake-utils/">flake-utils</a> — which <strong>now</strong> has a use case since we don’t have access to Nixpkgs or <code>lib</code> (but don’t blindly use <code>eachDefaultSystem</code>).
+If this feels unergonomic, this is tradeoff for using flakes — which has pros &amp; cons against classic Nix as you must define upfront your supported systems (&amp; you must do it correctly, meaning you don’t declare systems you don’t support or haven’t tested <em>as well as</em> supporting all systems that are actually supported else users that <em>could</em> be supported have their ability to try removed).
+Classic Nix, you let the downstream user decide (even unsafely) what <code>system</code> means &amp; only <code>MY-PACKAGE.meta.platform</code> to assert system support.
+ </p>
+ <p>
+ Otherwise you could glue together some things from Nix flakes inputs + Nixtamal inputs:
+ </p>
+ <pre class="code nix literal-block"><span class="p">{</span>
+ <span class="n">inputs</span> <span class="o">=</span> <span class="p">{</span>
+ <span class="n">nixpkgs</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">"github:NixOS/nixpkgs/nixos-unstable"</span><span class="p">;</span>
+ <span class="n">OTHER-FLAKE</span><span class="o">.</span><span class="n">url</span> <span class="o">=</span> <span class="s2">"hg+https://some.dev/project"</span><span class="p">;</span>
+ <span class="c1"># …more inputs</span>
+ <span class="p">};</span>
+
+ <span class="n">outputs</span> <span class="o">=</span>
+ <span class="p">{</span>
+ <span class="n">self</span><span class="o">,</span>
+ <span class="n">nixpkgs</span><span class="o">,</span>
+ <span class="n">OTHER-FLAKE</span><span class="o">,</span>
+ <span class="p">}:</span>
+ <span class="k">let</span>
+ <span class="n">inputs</span> <span class="o">=</span> <span class="kn">import</span> <span class="sr">./nix/tamal</span> <span class="p">{</span> <span class="n">bootstrap-nixpkgs</span> <span class="o">=</span> <span class="n">nixpkgs</span><span class="p">;</span> <span class="p">};</span>
+
+ <span class="n">pkgs</span> <span class="o">=</span> <span class="kn">import</span> <span class="n">nixpkgs</span> <span class="p">{</span>
+ <span class="n">system</span> <span class="o">=</span> <span class="s2">"x86_64-linux"</span><span class="p">;</span>
+ <span class="n">config</span> <span class="o">=</span> <span class="p">{</span> <span class="p">};</span>
+ <span class="n">overlay</span> <span class="o">=</span> <span class="p">[</span>
+ <span class="p">(</span><span class="kn">import</span> <span class="s2">"</span><span class="si">${</span><span class="n">inputs</span><span class="o">.</span><span class="n">MY-PROJECT</span><span class="si">}</span><span class="s2">/nix/overlay"</span><span class="p">)</span>
+ <span class="p">(</span><span class="kn">import</span> <span class="n">OTHER-FLAKE</span><span class="o">.</span><span class="n">overlays</span><span class="o">.</span><span class="n">default</span><span class="p">)</span>
+ <span class="p">];</span>
+ <span class="p">};</span>
+ <span class="k">in</span>
+ <span class="p">{</span>
+ <span class="c1"># …</span>
+ <span class="p">};</span>
+<span class="p">}</span></pre>
+ </details>
+ <details>
+ <summary>
+ Does Nixtamal resolve recursive inputs?
+ </summary>
+ <p>
+ No.
+Could it?
+Maybe.
+Is it a good idea?
+Ehhhh…
+There is a lot of convenience that comes from recursive solving, but it relies on some implicit downloading behavior that can be harder to follow if not audit for security.
+You wouldn’t want to be like Nix flakes &amp; download a million <code>nixpkgs</code> instances… nor is emulating <code>follows</code> the right design.
+Stacking overlays might be the easier decision.
+ </p>
+ <figure class="Quoteblock">
+ <blockquote>
+ <p>
+ But couldn’t the overlays get out of sync with my one Nixpkgs pin?
+ </p>
+ </blockquote>
+ <figcaption>
+ — Astute user
+ </figcaption>
+ </figure>
+ <p>
+ Yes, but this same thing happens when you <code>follows.nixpkgs</code> as many forget.
+You can leave one input as <em>not</em> following &amp; now get the aforementioned <code>nixpkgs</code> explosion issue potentially.
+With Nixtamal, you would do a second Nixpkgs import <em>explicitly</em>, say in your <code>release.nix</code>, rather than implicitly, or will have to find another way to stitch it all together (you can even use Nixtamal’s patches feature to patch up their code!).
+All to say that this isn’t really ‘solved’ by anything today.
+Recursive inputs won’t be a near-term focus either unless the 💡 really goes off.
+ </p>
+ </details>
+ <details>
+ <summary>
+ I like Nix flakes better.
+ </summary>
+ <p>
+ Not a question, but okay.
+You may continue to use flakes.
+You won’t be the target audience — which is stable Nix users, users not requiring the extra abstraction complexity + hassle of flakes, &amp; users that want features flakes can never support given the current design limitations.
+ </p>
+ </details>
+ </div>
+ </section>
+ </article>
+ </main>
+ <footer id="Footer" class="Footer">
+ <p>
+ Site made with <a href="https://nixos.org">Nix</a> (<abbr title="dependency">dep</abbr> management), <a href="https://nickel-lang.org">Nickel</a> (<abbr title="configuration">config</abbr>), <a href="https://soupault.net">Soupault</a> (<abbr title="static site generator">SSG</abbr>), <a href="https://docutils.sourceforge.io">Docutils</a> (<abbr title="reStructuredText">rST</abbr> rendering), <a href="https://mandoc.bsd.lv">mandoc</a> (manpage conversion), &amp; <a href="https://hub.darcs.net/toastal/sugilite256">sugilite256</a> (color scheme).
+ </p>
+ <small class="Footer-copyright">
+ © 2025–2026 <span itemtype="https://schema.org/Person" itemscope=""><a itemprop="url" href="https://toast.al"><span itemprop="name">toastal</span></a></span>.
+ © 2026 Nixtamal contributors.
+ Some rights reserved.
+ Except where otherwise noted, the content on this website is licensed under <abbr title="Creative Commons Attribution Share Alike 4.0 International">CC-BY-SA-4.0</abbr>.
+ Citations must attribute the work’s writer/maker &amp; include a hyperlink to this website (or rather the work itself).
+ Yes, these rules/clauses apply to <abbr title="large language models">LLM</abbr>s &amp; <abbr title="artificial intellegence">AI</abbr> assistants too.
+ </small>
+ <div id="Maker" itemscope="" itemtype="https://schema.org/Person">
+ <link itemprop="url" href="https://toast.al/">
+ <meta itemprop="name" content="toastal">
+ <meta itemprop="foundingDate" content="2025">
+ <link itemprop="logo" href="https://nixtamal.toast.al/asset/_hashed/nixtamal/image/nixtamal-logo-gmxzsw8388sf9paq05xws7an4hnl4nx0.svg">
+ <div itemprop="address" itemscope="" itemtype="https://schema.org/PostalAddress">
+ <meta itemprop="addressCountry" content="TH">
+ </div>
+ <link itemprop="sameAs" href="https://keybase.io/toastal">
+ <link itemprop="sameAs" href="https://liberapay.com/toastal/">
+ <link itemprop="sameAs" href="https://types.pl/@toastal">
+ <link itemprop="sameAs" href="https://hub.darcs.net/toastal">
+ <link itemprop="sameAs" href="https://smeder.ee/~toastal">
+ <link itemprop="sameAs" href="https://nest.pijul.com/toastal">
+ <link itemprop="sameAs" href="https://codeberg.org/toastal/">
+ <link itemprop="sameAs" href="https://git.sr.ht/~toastal/">
+ <link itemprop="sameAs" href="https://gitlab.com/toastal">
+ <link itemprop="sameAs" href="https://github.com/toastal">
+ </div>
+ </footer>
+ </div>
+</body>
+</html>