3 Quickstart

3.1 Clone the repository

git clone https://github.com/Jylhis/jotain.git
cd jotain

3.2 Enter the development shell

Jotain ships a devenv shell that provides the tooling — just, nil, nixfmt-rfc-style, treefmt, Nix linters, the language servers the config shells out to, and the fonts the UI config looks up. Emacs itself is not in the shell (see Launching Emacs); it is built via Nix on demand. With direnv installed the shell activates automatically; otherwise enter it manually:

devenv shell

3.3 Build and run Emacs with the Jotain configuration

just run-built            # build for the current platform, then launch result/bin/emacs
just run-built-debug      # same, with --debug-init and debug-on-error

just run-built builds the full distribution (Emacs 31 + packages + tree-sitter grammars — usually a binary-cache pull, not a compile) and launches ./result/bin/emacs with --init-directory=<repo>, so it never touches ~/.emacs.d. The first launch bootstraps any package not provided by Nix from MELPA; subsequent launches load from the package cache.

The direct-launch recipes (just run, just debug, just tty, just daemon, just client, just client-tty, just quick) are currently disabled stubs — see the note in Launching Emacs, which also covers the daemon + client pattern and the emd / em / emg shell aliases via services.jotain.shellAliases.

3.4 Sanity-check the configuration

just check          # nix flake check: package builds, Nix linting, docs checks,
                    # elisp paren check, byte-compile (warnings as errors), ERT tests
just test           # build only the elisp-test flake check (ERT tests under test/)
just fmt            # nix fmt — treefmt with nixfmt-rfc-style, deadnix, statix

3.5 Clean build artifacts

just clean          # .elc files, autosaves, eln-cache, result/
just clean-all      # also elpa/, var/, .dev-home/ — forces a full re-fetch

3.6 Update pinned sources

flake.lock is the single source of truth for input revs; devenv.yaml mirrors the shared ones (nixpkgs, treefmt-nix, emacs-overlay).

just update             # update every flake input, then sync devenv.yaml + devenv.lock
just verify             # assert flake.lock and devenv.lock agree on every shared input