Nix & Flakes Support ==================== Ada provides first-class support for `Nix `_ and Nix flakes, offering declarative, reproducible development and deployment environments. Why Nix? -------- **Solves Version Mismatches** Your distro doesn't have Python 3.13 yet? Nix provides it instantly, no compilation needed. Ubuntu 22.04/24.04 users: This is your easiest path to Python 3.13! **Reproducibility** Nix ensures everyone gets the exact same dependencies, eliminating "works on my machine" issues. **Declarative** All dependencies declared in ``flake.nix`` - Python packages, system libraries, tools. **Cross-platform** Works on Linux, macOS, and Windows (via WSL). Perfect for teams with mixed environments. **Composable** Integrate Ada into larger Nix configurations, NixOS modules, or home-manager. **Cutting Edge** Nix flakes are at the forefront of reproducible software development. Quick Start ----------- Prerequisites ^^^^^^^^^^^^^ Install Nix with flakes enabled: .. code-block:: bash # Install Nix (official installer) curl -L https://nixos.org/nix/install | sh # Enable flakes (add to ~/.config/nix/nix.conf or /etc/nix/nix.conf) experimental-features = nix-command flakes Development Shell ^^^^^^^^^^^^^^^^^ Enter a development environment with all dependencies: .. code-block:: bash cd ada-v1 nix develop # Shell hook displays available commands # 🤖 Ada development environment # Available commands: ada, ollama, python, pytest... Now you're in a shell with: - Python 3.13 with all Ada dependencies - Ollama LLM runtime - Tesseract OCR - Development tools (uv, ruff, pytest) - Pre-configured environment variables Run Ada in development mode: .. code-block:: bash # Inside nix develop shell ada setup ollama serve & ollama pull qwen2.5-coder:7b ada run Build Ada Package ^^^^^^^^^^^^^^^^^ Build Ada as a standalone package: .. code-block:: bash # Build Ada nix build # Result in ./result/bin/ada ./result/bin/ada --version Run Ada Directly ^^^^^^^^^^^^^^^^ Run Ada without building or entering dev shell: .. code-block:: bash # Run from flake nix run github:luna-system/ada # Or locally nix run . -- chat "Hello Ada" # Specific commands nix run .#ada-doctor nix run .#ada-setup direnv Integration ^^^^^^^^^^^^^^^^^^ Automatically activate Nix environment when entering directory: .. code-block:: bash # Install direnv nix profile install nixpkgs#direnv # Hook into your shell (add to ~/.bashrc or ~/.zshrc) eval "$(direnv hook bash)" # or zsh, fish, etc. # Allow direnv in Ada directory cd ada-v1 direnv allow Now the Nix environment activates automatically when you ``cd`` into the Ada directory! 🎉 NixOS Module ------------ Deploy Ada as a system service on NixOS: .. code-block:: nix # In your configuration.nix or flake { inputs.ada.url = "github:luna-system/ada"; outputs = { self, nixpkgs, ada }: { nixosConfigurations.myhost = nixpkgs.lib.nixosSystem { system = "x86_64-linux"; modules = [ ada.nixosModules.default { services.ada = { enable = true; port = 8000; ollamaUrl = "http://localhost:11434"; dataDir = "/var/lib/ada"; }; # Ollama automatically enabled by default services.ollama.enable = true; } ]; }; }; } Module Options ^^^^^^^^^^^^^^ .. code-block:: nix services.ada = { enable = true; # Enable Ada service package = pkgs.ada; # Package to use (override if needed) dataDir = "/var/lib/ada"; # Data directory ollamaUrl = "http://localhost:11434"; # Ollama endpoint port = 8000; # API port user = "ada"; # Service user group = "ada"; # Service group }; Service Management ^^^^^^^^^^^^^^^^^^ .. code-block:: bash # Start Ada sudo systemctl start ada # Enable on boot sudo systemctl enable ada # Check status sudo systemctl status ada # View logs sudo journalctl -u ada -f Home Manager Integration ------------------------ Include Ada in your personal environment: .. code-block:: nix # In home.nix { pkgs, ... }: { home.packages = [ (pkgs.callPackage /path/to/ada/flake.nix {}).packages.${pkgs.system}.default ]; } Or as a flake input: .. code-block:: nix { inputs.ada.url = "github:luna-system/ada"; outputs = { self, nixpkgs, home-manager, ada }: { homeConfigurations."user@host" = home-manager.lib.homeManagerConfiguration { pkgs = nixpkgs.legacyPackages.x86_64-linux; modules = [ { home.packages = [ ada.packages.x86_64-linux.default ]; } ]; }; }; } Customization ------------- Override Flake Inputs ^^^^^^^^^^^^^^^^^^^^^ Use specific nixpkgs version or overlays: .. code-block:: bash nix develop --override-input nixpkgs github:NixOS/nixpkgs/nixos-24.11 Custom Python Version ^^^^^^^^^^^^^^^^^^^^^ Edit ``flake.nix`` to use different Python: .. code-block:: nix let python = pkgs.python312; # Change from python313 in # ... rest of flake Add Extra Dependencies ^^^^^^^^^^^^^^^^^^^^^^ Add packages to ``devShells.default.buildInputs``: .. code-block:: nix devShells.default = pkgs.mkShell { buildInputs = with pkgs; [ adaPythonEnv tesseract # Add your tools ripgrep fd neovim ]; }; Flake Structure --------------- The Ada flake provides: **Development Shell** (``nix develop``) Complete development environment with all dependencies and tools. **Package** (``nix build``) Standalone Ada package that can be installed system-wide. **Apps** (``nix run``) - ``ada`` - Main command - ``ada-setup`` - Setup wizard - ``ada-doctor`` - Health check **NixOS Module** System service configuration for NixOS deployments. Flake Outputs ^^^^^^^^^^^^^ .. code-block:: bash # List all outputs nix flake show # Output structure: # ├── devShells.x86_64-linux.default # ├── packages.x86_64-linux.default # ├── apps.x86_64-linux # │ ├── default (ada) # │ ├── ada-setup # │ └── ada-doctor # └── nixosModules.default GPU Support ----------- For GPU acceleration (NVIDIA CUDA): .. code-block:: nix # In flake.nix or overlay let pkgs = import nixpkgs { config.allowUnfree = true; # CUDA is unfree config.cudaSupport = true; }; in # ... use pkgs Or enable system-wide on NixOS: .. code-block:: nix # configuration.nix { nixpkgs.config.allowUnfree = true; services.xserver.videoDrivers = [ "nvidia" ]; hardware.opengl.enable = true; } Troubleshooting --------------- **Flakes not enabled** .. code-block:: bash # Add to ~/.config/nix/nix.conf experimental-features = nix-command flakes **Permission issues / "need sudo"** If Nix requires sudo after installation, your setup is incomplete: .. code-block:: bash # Check if you're in nix-users group groups | grep nix-users # If not, add yourself sudo usermod -aG nix-users $USER # Start the daemon sudo systemctl enable --now nix-daemon # Log out and back in (or reload shell) exec $SHELL # Now nix should work without sudo nix --version **Locale errors** If you see UTF-8 or locale errors, the flake sets ``LC_ALL=C.UTF-8`` automatically. If using Nix outside the flake, set it manually: .. code-block:: bash export LC_ALL="C.UTF-8" nix develop **direnv not activating** .. code-block:: bash # Check direnv is hooked direnv status # Re-allow direnv allow **Python import errors** .. code-block:: bash # Ensure PYTHONPATH is set (automatic in dev shell) echo $PYTHONPATH # If missing: export PYTHONPATH="$PWD:$PYTHONPATH" Comparison with Other Methods ------------------------------ .. list-table:: :header-rows: 1 :widths: 20 20 20 20 20 * - Feature - Nix Flake - Docker - Python venv - System Install * - Reproducibility - ✅ Perfect - ✅ Very Good - ⚠️ Partial - ❌ Poor * - Cross-platform - ✅ Linux/macOS/WSL - ✅ Linux/macOS/Win - ✅ All platforms - ⚠️ Linux/macOS * - Disk Usage - ⚠️ Moderate - ⚠️ Large - ✅ Minimal - ✅ Minimal * - Isolation - ✅ Strong - ✅ Strong - ⚠️ Python only - ❌ None * - Speed - ✅ Native - ⚠️ Overhead - ✅ Native - ✅ Native * - Setup Time - ⚠️ First time slow - ⚠️ Pull images - ✅ Fast - ✅ Fast * - System Impact - ✅ Minimal - ⚠️ Daemon - ✅ Minimal - ⚠️ Packages * - Declarative - ✅ Yes - ✅ Yes - ❌ No - ❌ No * - Composability - ✅ Excellent - ⚠️ Limited - ❌ No - ❌ No Best Practices -------------- **Development**: Use ``nix develop`` with ``direnv`` for automatic environment activation. **CI/CD**: Use ``nix build`` for reproducible builds across different machines. **Production (NixOS)**: Use the NixOS module for system service deployment. **Production (Other)**: Use ``nix build`` then copy ``result/`` to target system. **Teams**: Pin flake inputs with ``flake.lock`` for consistent environments. **Updates**: Run ``nix flake update`` to update dependencies, commit ``flake.lock``. Integration Examples -------------------- GitHub Actions ^^^^^^^^^^^^^^ .. code-block:: yaml # .github/workflows/test.yml name: Test on: [push, pull_request] jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: cachix/install-nix-action@v27 with: extra_nix_config: | experimental-features = nix-command flakes - run: nix build - run: nix run . -- doctor GitLab CI ^^^^^^^^^ .. code-block:: yaml # .gitlab-ci.yml test: image: nixos/nix:latest before_script: - nix --version script: - nix build - nix run . -- doctor With Docker (Nix-built) ^^^^^^^^^^^^^^^^^^^^^^^^ .. code-block:: bash # Build Docker image from Nix package nix build .#dockerImage docker load < result docker run -p 8000:8000 ada:latest Philosophy ---------- Nix support aligns with Ada's core values: **Reproducibility = Accessibility** Everyone can run Ada in the exact same environment, regardless of their system. **Declarative = Hackable** The entire environment is defined in ``flake.nix`` - read it, understand it, modify it. **Local-first = Control** No cloud services, no Docker daemon required - just Nix and your code. **Standards-based = Composable** Nix flakes are a standard, allowing Ada to integrate into larger Nix ecosystems. Resources --------- - `Official Nix Documentation `_ - `Nix Flakes Tutorial `_ - `NixOS Module System `_ - `direnv Documentation `_ - `Nix Pills `_ (deep dive) Community --------- - **NixOS Discourse**: https://discourse.nixos.org/ - **Nix Matrix**: #nix:nixos.org - **r/NixOS**: https://reddit.com/r/NixOS Contributing ------------ To improve Ada's Nix support: 1. Test flake on different platforms (Linux, macOS, NixOS) 2. Report issues with ``nix flake show`` output 3. Suggest additional packages for dev shell 4. Improve NixOS module options 5. Share your Nix configurations! See ``docs/development.rst`` for contribution guidelines. --- **Ada + Nix**: Reproducible AI for everyone. 🤖❄️