NidhOX

Nidhogg Open-source eXperience: a two-player fencing game played in a terminal on Cauldron, from your own copy of the game's files.

No game files are included. NidhOX reads the data file of a copy you own — data.win from the Windows build, or game.ios from inside the macOS build's Nidhogg.app — and draws its rooms from it. It also reads the game's executable installed with it (Nidhogg.exe beside data.win, or the app's MacOS/Nidhogg) for the depths the game creates its objects at and its news; a data file without it does not start. The languages come from the copy's lang folder, and the search screen's lines from its match.txt.

Each NidhOX release plays one version of the game. Use the release that matches your copy:

Your copy of Nidhogg NidhOX Dependency
Updated to the Online Update of October 2026 (online play, training mode) 0.2 {:nidhox, "~> 0.2"}
Still on the version before it (the Remix Level update of September 2021) 0.1.4 {:nidhox, "0.1.4"}

Steam updates your copy unless you held it back, so most copies are on the Online Update. NidhOX 0.2 was checked against that update's first build (Steam build 25889827, 13 October 2026); its patch of 16 October 2026 ("The Waiting Game", build 25998581) has not been checked yet.

mix deps.get
mix nidhox
mix nidhox --area Wilds
mix nidhox --data path/to/data.win

--data defaults to NIDHOX_DATA, then the first of the usual Steam installs under your home directory: CrossOver's, macOS's and Linux's (set in config/runtime.exs). --area is the area the level select starts on: Cemetery (the default), Castle, Mines, Sky or Wilds.

Controls

Two players share the keyboard, or play with a controller each:

action side 1 side 2 controller
move A D ← → d-pad, left stick
up, down W S ↑ ↓ d-pad, left stick
attack F M X
jump G N A
start, pause Enter Enter Start
pause Esc

In the menus, either side's keys work: up and down move, jump or start chooses, and Esc (a controller's B) goes back. The prompts in each box show the keys and buttons of the player using it. Ctrl+Q quits at once.

Controllers take the free sides in the order they connect; Options → Controls → Controllers lists the connected ones and moves each between player 1, player 2 and none, and the choice is kept for that controller.

Modes

NidhOX opens on the logos, then the main menu. Press start to open it. Left alone for twenty seconds, the computer plays a match against itself on one of the five areas; any key brings back the menu. A white dot marks what is new, and News while an article is unread.

Enter or Esc during a bout pauses it: unpause, change level, variants (changing the time limit or sudden death asks to restart the match), change color (each side's colour from eight), options, and exit, which asks first. After a bout come its time, the winner, and each side's kills and suicides; any press goes on to the level select. Every bout's result is kept, per player, in ~/.local/share/nidhox/ledger.dets.

Playing online

Multiplayer → Online opens the online menu. While it shows, this machine keeps a lobby open on the local network that friends can join.

Two players who meet play in the lobby: each stands in their own half and readies up by standing on their ready zone. Once both have stood there for a second, the loser of the last match picks the area, and the match is played. Its results wait for both players, and the lobby comes back, with each player's wins tallied. In the lobby, start opens the pause: Input delay sets how many frames ahead your input is sent, green when it covers the ping. Leaving the lobby or the level select ends the session for both; in a match, the pause's Forfeit gives it to the other player.

Each machine runs and draws the game itself, playing with rollback. The two exchange only the players' joins, leaves and input over one TCP connection, and nothing the other machine sends can run code on yours.

On a terminal that keeps images, how the picture is sent can be chosen when starting the game, for every player including those over ssh, with mix nidhox --picture (or NIDHOX_PICTURE) and any of, comma separated: native draws the room at its own size times the largest whole number that fits the window, or native:2, native:3, … at that many times; size:WxH sets the size itself; png sends each frame as a PNG, smaller; swap replaces each frame without the picture going blank in between. The default is native:2,png,swap; --picture none sends the picture at the window's cells as raw pixels instead.

Where the machine has a graphics card, it draws the picture: the same picture, pixel for pixel at the whole-number sizes native picks, in about a sixth of the time at large sizes. Without one the game draws it in software. The picture options choose otherwise: software draws in software, gpu asks for the card in the terminal, and window opens a window of its own whose keys play the game, as in --picture native:2,png,window.

How it plays

Two fencers start in the middle of an area. Yellow wants to reach the far right end, orange the far left.

The rooms, their scenery and ground, the fencers, the menus and their lettering, the sounds and the music all come from your copy of the game.