Appendix A Module Options

A.1 Jotain — Module Options Reference

Auto-generated reference for all Nix module options exposed by Jotain.

————————————————————————

A.2 Home Manager Module

Import and enable in your Home Manager configuration:

{
  imports = [ jotain.homeManagerModules.default ];
  services.jotain = {
    enable = true;
    defaultEditor = true;
    client.enable = true;
  };
}

A.2.1 services.jotain.enable

Whether to enable the Jotain Emacs daemon.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.2 services.jotain.package

Custom Jotain Emacs package to use. Leave this unset to use the default distribution from emacs.nix (pgtk/Wayland GUI on Linux, patched NS GUI on Darwin).

Type: null or package

Default:

null

Declared by:

A.2.3 services.jotain.authSources

Extra authinfo/netrc file paths to hand to Emacs’s auth-sources, searched ahead of ~/.authinfo(.gpg) and the 1Password backend. Point these at runtime secret files a secret manager produces (sops-nix, agenix, …) — the entries are file paths, not the secrets themselves, and are passed to the daemon through the JOTAIN_AUTH_SOURCES environment variable that lisp/init-systems.el reads. Every package that consults auth-source (gptel, forge, smtpmail, circe) then resolves credentials from them; the eca server, which reads only its environment, additionally has its provider keys exported from auth-source before each session (see lisp/init-ai.el).

Type: list of string

Default:

[ ]

Example:

[
  "/run/secrets/authinfo"
]

Declared by:

A.2.4 services.jotain.claudeCode.enable

Whether to enable the Claude Code CLI (claude) on the wrapper PATH, the external agent claude-code-ide (lisp/init-ai.el, C-c q) drives. Pulls the unfree claude-code package, so it needs allowUnfree .

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.5 services.jotain.client.enable

Whether to enable generation of Jotain client desktop file.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.6 services.jotain.client.arguments

Command-line arguments to pass to emacsclient.

Type: list of string

Default:

[
  "-c"
]

Declared by:

A.2.7 services.jotain.defaultEditor

Whether to configure emacsclient as the default editor using the EDITOR and VISUAL environment variables.

Type: boolean

Default:

true

Example:

false

Declared by:

A.2.8 services.jotain.devenv.enable

Whether to enable the devenv CLI on the wrapper PATH, for the native environment loader (devenv-env-global-mode, lisp/devenv.el) under launchd/systemd daemons whose login shell does not export it. Opt-in because exec-path-from-shell normally finds the user’s own devenv, and pkgs.devenv bundles its own nix and can version-skew against per-project devenv installs .

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.9 services.jotain.dockerfileLsp.enable

Whether to enable Dockerfile language server (docker-langserver), auto-attached by Eglot in dockerfile-mode.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.10 services.jotain.eca.enable

Whether to install ~/.config/eca/config.json for the eca server (the AI pair-programming backend in lisp/init-ai.el). Enabled automatically when services.jotain.eca.openrouter.enable is set or services.jotain.eca.settings is non-empty.

Type: boolean

Default:

eca.openrouter.enable || eca.settings != { }

Example:

true

Declared by:

A.2.11 services.jotain.eca.environmentFile

Alias of services.jotain.environmentFile.

Type: null or absolute path

Default:

null

Declared by:

A.2.12 services.jotain.eca.openrouter.enable

Whether to enable the default OpenRouter provider in the generated eca config. The provider and its model catalogue come from config/eca/config.json (kept in sync with gptel’s models in lisp/init-ai.el); the API key is read at runtime from OPENROUTER_API_KEY via eca’s ${env:…} interpolation, so no secret is written to the Nix store. Supply the key through services.jotain.environmentFile. gptel defaults to OpenRouter regardless of this option .

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.13 services.jotain.eca.settings

Freeform eca configuration, rendered to ~/.config/eca/config.json and deep-merged over the default OpenRouter provider (later values win). Any eca key is expressible (providers, models, rules, mcpServers, behavior, …). Use eca’s ${env:VAR} syntax for secrets so nothing sensitive lands in the Nix store; provide the referenced variables through services.jotain.environmentFile.

Type: JSON value

Default:

{ }

Example:

{
  providers.anthropic = {
    api = "anthropic";
    key = "${env:ANTHROPIC_API_KEY}";
    models."claude-sonnet-4.6" = { };
  };
}

Declared by:

A.2.14 services.jotain.environmentFile

Path to a systemdexec5-style environment file (VAR=value lines) loaded into the Jotain daemon’s environment. Every subprocess Emacs spawns inherits it, so this is the single place to supply credentials for all external-system integrations that read the environment — among them gptel’s OPENROUTER_API_KEY / ANTHROPIC_API_KEY / GEMINI_API_KEY (lisp/init-ai.el), the eca server’s provider keys, and any token a tool reads from the environment. Point it at a runtime secret path (sops-nix, agenix, …); the file is read at daemon start and never copied into the Nix store. On Linux it becomes the service’s EnvironmentFile; on macOS the launchd agent sources it before exec. Secrets that instead live in a password manager can be resolved through auth-source — see services.jotain.onePassword.enable and services.jotain.authSources.

Type: null or absolute path

Default:

null

Example:

"/run/secrets/jotain-env"

Declared by:

A.2.15 services.jotain.extraOptions

Extra command-line arguments to pass to emacs when starting the daemon.

Type: list of string

Default:

[ ]

Example:

[
  "-f"
  "exwm-enable"
]

Declared by:

A.2.16 services.jotain.nativeCompile.enable

AOT native-compile the Jotain config into the store, so the daemon loads .eln for init.el and the lisp/ modules from services.jotain’s own derivation instead of JIT-compiling into var/eln-cache after every deploy (every deploy that touches lisp/ moves the store path, which invalidates the JIT cache). early-init.el is structurally excluded: its .eln lookup happens before the load path is extended, so it always runs from .elc — with or without this option.

The store-.eln-through-symlinks mechanism is sound: Emacs realpath()s the source before hashing it into the .eln name (src/comp.c, Bug#44701), so the HM symlinks resolve to the exact path the AOT step compiled against. Off by default only because enabling it adds a native-compilation pass to every activation that rebuilds the config, and roughly 50–150 MB of .eln to the closure.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.17 services.jotain.onePassword.enable

Whether to enable the 1Password CLI (op) on the wrapper PATH, the backend for auth-source-1password (lisp/init-systems.el) that resolves credentials for gptel, forge, smtpmail, etc. from the vault when they are not supplied through services.jotain.environmentFile. Pulls the unfree _1password-cli package, so it needs allowUnfree .

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.18 services.jotain.shellAliases.enable

Whether to enable shell aliases for the Jotain daemon and clients.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.19 services.jotain.shellAliases.prefix

Optional prefix to namespace the emd / em / emg aliases (e.g. set to "j" to get jemd, jem, jemg).

Type: string

Default:

""

Example:

"j"

Declared by:

A.2.20 services.jotain.socketActivation.enable

Whether to enable systemd socket activation for the Jotain service.

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.21 services.jotain.sonarlint.enable

Whether to enable SonarLint language server (M-x jotain-sonarlint).

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.22 services.jotain.sops.enable

Whether to enable the sops CLI on the wrapper PATH, required by sops.el (lisp/init-systems.el) for transparent encrypt/decrypt of SOPS-managed files .

Type: boolean

Default:

false

Example:

true

Declared by:

A.2.23 services.jotain.spell.dictionaries

Aspell dictionary packages for jinx spell-checking (lisp/init-writing.el). Installed into the profile, where libaspell’s NIX_PROFILES patch finds them at runtime and enchant’s aspell backend hands them to jinx.

Type: list of package

Default:

[ pkgs.aspellDicts.en ]

Example:

[ pkgs.aspellDicts.en pkgs.aspellDicts.fi ]

Declared by:

A.2.24 services.jotain.startWithUserSession

Whether to launch the Jotain service with the systemd user session. If true, the service is started by default.target. If "graphical", it is started by graphical-session.target.

Type: boolean or value “graphical” (singular enum)

Default:

!config.services.jotain.socketActivation.enable

Example:

"graphical"

Declared by:

————————————————————————

A.3 System Module (NixOS / nix-darwin)

Applies the Jotain overlay and adds the package to system environment. For per-user daemon management, use the Home Manager module instead.

{
  imports = [ jotain.nixosModules.default ];  # or darwinModules.default
  services.jotain.enable = true;
}

A.3.1 services.jotain.enable

Whether to enable the Jotain Emacs configuration.

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.2 services.jotain.package

Custom Jotain Emacs package to use. Leave this unset to use the cache-friendly default build from emacs.nix.

Type: null or package

Default:

null

Declared by:

A.3.3 services.jotain.claudeCode.enable

Whether to enable the Claude Code CLI (claude) on the wrapper PATH, the external agent claude-code-ide (lisp/init-ai.el) drives. Pulls the unfree claude-code package, so it needs allowUnfree .

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.4 services.jotain.defaultEditor

Whether to configure emacsclient as the default editor using the EDITOR and VISUAL environment variables.

Type: boolean

Default:

true

Example:

false

Declared by:

A.3.5 services.jotain.devenv.enable

Whether to enable the devenv CLI on the wrapper PATH, for the native environment loader (devenv-env-global-mode, lisp/devenv.el) under launchd/systemd daemons whose login shell does not export it. Opt-in because exec-path-from-shell normally finds the user’s own devenv, and pkgs.devenv bundles its own nix and can version-skew against per-project devenv installs .

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.6 services.jotain.dockerfileLsp.enable

Whether to enable Dockerfile language server (docker-langserver), auto-attached by Eglot in dockerfile-mode.

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.7 services.jotain.onePassword.enable

Whether to enable the 1Password CLI (op) on the wrapper PATH, the backend for auth-source-1password (lisp/init-systems.el) that resolves credentials for gptel, forge, smtpmail, etc. from the vault. Pulls the unfree _1password-cli package, so it needs allowUnfree .

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.8 services.jotain.sonarlint.enable

Whether to enable SonarLint language server (M-x jotain-sonarlint).

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.9 services.jotain.sops.enable

Whether to enable the sops CLI on the wrapper PATH, required by sops.el (lisp/init-systems.el) for transparent encrypt/decrypt of SOPS-managed files .

Type: boolean

Default:

false

Example:

true

Declared by:

A.3.10 services.jotain.spell.dictionaries

Aspell dictionary packages for jinx spell-checking (lisp/init-writing.el). Installed into the system profile, where libaspell’s NIX_PROFILES patch finds them at runtime and enchant’s aspell backend hands them to jinx.

Type: list of package

Default:

[ pkgs.aspellDicts.en ]

Example:

[ pkgs.aspellDicts.en pkgs.aspellDicts.fi ]

Declared by:

————————————————————————

A.4 devenv Module

Emacs Lisp development support for devenv shells.

{
  languages.emacs-lisp = {
    enable = true;
    lsp.enable = true;
  };
}

A.4.1 languages.emacs-lisp.enable

Whether to enable Emacs Lisp support.

Type: boolean

Default:

false

Example:

true

Declared by:

A.4.2 languages.emacs-lisp.package

The emacs-nox package to use.

Type: package

Default:

pkgs.emacs-nox

Example:

emacs

Declared by:

A.4.3 languages.emacs-lisp.elsa.enable

Whether to enable Emacs Lisp Static Analyzer (Elsa).

Type: boolean

Default:

true

Example:

true

Declared by:

A.4.4 languages.emacs-lisp.elsa.package

The Elsa static analyzer package to use.

Type: package

Default:

pkgs.callPackage ./elsa.nix { emacs = cfg.package; }

Declared by:

A.4.5 languages.emacs-lisp.lsp.enable

Whether to enable Emacs Lisp Language Server (ellsp).

Type: boolean

Default:

true

Example:

true

Declared by:

A.4.6 languages.emacs-lisp.lsp.package

The Emacs Lisp language server package to use.

Type: package

Default:

pkgs.callPackage ./ellsp.nix { emacs = cfg.package; }

Declared by: