Skip to main content

dark-matrix

dark-matrix is an open-source control system for the Framework Laptop 16's dual 9×34 LED Matrix Input Modules, developed by community member heckseven. It is built as a persistent TypeScript/Node.js daemon driving both modules over USB serial, paired with a browser-based web UI called the Deck for configuration, animation editing, HUD presets, audio visualization, video display, and games1. The project is licensed under GPL-3.0-or-later2.

The author notes the code was "written entirely by AI" and openly labels the project as "vibe-coded jank" in its community announcement, while the designs are entirely their own work13.

Background

The Framework Laptop 16 supports hot-swappable LED Matrix Input Modules — 9×34 (306 LED) monochrome displays driven by an RP2040 microcontroller and an IS31FL3741A LED controller, communicating over USB ACM Serial4. dark-matrix was created to consolidate a wide wish-list of matrix capabilities — animations, HUDs, audio reactivity, video, and notifications — into a single daemon and web UI, where two modules are treated as a unified 18×34 canvas where applicable13.

Deck Modes

The Deck is a local web server (default port 7340) opened in the browser. It exposes the following modes1:

ModeDescription
designPixel animation editor — draw, animate, push frames to hardware live over WebSocket
hudNamed HUD presets — widget layouts per module side; switchable via CLI
audioReal-time audio visualizer — EQ bars, waveform, radial, waterfall, heatmap
videoMatrix-rendered video display
dataData-driven display (in progress)
runesRune/glyph display
gamesGame of Life and similar generative modes
configDaemon settings — startup, brightness, hardware, notifications, appearance

The design mode supports undo/redo (50-level history), import of PNG/GIF/.dmx.json projects, export to GIF/PNG, and live preview streaming frames to the physical modules as you draw1.

Notification Sources

The daemon runs a priority-ordered notification queue that preempts the resting HUD state1:

SourceTriggerPriority
Mic switch (FW16 EC)Physical mic privacy switch toggled ONHigh
Camera switch (FW16 EC)Physical camera privacy switch toggled ONHigh
VM activityVM started/stopped via libvirtMedium
Claude activityPostToolUse hook fires (tool use within last 30s)Low

CLI Reference

CommandDescription
initGuided first-run setup: config, calibrate, report optional deps
pingCheck if daemon is running; prints version
statusShow daemon version, uptime, current animation, brightness, module state
calibrateConfirm left/right module assignment
ui [--port <n>]Launch the Deck UI (default port 7340)
hud preset <name>Switch to a named HUD preset
image <path>Display any image (PNG/JPEG/GIF), resized to 9×34
show-split <left> <right>Send different images to each module
scroll <text>Scroll text across both modules
animate gif [--dual] <path>Play a GIF (optionally spanning both modules)
play [--loop] <path>Play a .dmx.json project (optionally looping)
display yeah|runes|0x07|panicBuilt-in presets
releaseRelease serial port handles (for compatibility with matrix.sh)
self-updateFetch latest GitHub release and update in-place
uninstall [--purge]Stop service and remove install (and config with --purge)

Installation

dark-matrix targets Linux and ships a one-line installer that installs to ~/.local/share/dark-matrix/, enables a systemd user service, and writes a dark-matrix wrapper to ~/.local/bin/1:

curl -fsSL https://raw.githubusercontent.com/heckseven/dark-matrix/main/scripts/install.sh | sh

The user must be in the dialout group (or uucp on some distros) for serial access to /dev/ttyACM*1. Optional dependencies include ffmpeg (audio pipeline), wpctl/pw-dump (PipeWire audio source selection and device enumeration), yt-dlp (video download), dbus-monitor (desktop notification watching), and ectool (EC privacy switch detection)1.

After install, open the Deck and run first-run calibration1:

dark-matrix ui # opens the welcome screen on first launch
dark-matrix calibrate # confirms left/right module assignment

Configuration

Config lives at ~/.config/dark-matrix/config.json, generated on first run and hot-reloadable via SIGHUP to the daemon. Modules are referenced by stable by-path symlinks, and brightness can track an ambient light sensor ("sensor" mode) with hysteresis smoothing1.

Technical Details

DetailValue
LanguageTypeScript (99.3%), Shell, C, JavaScript, CSS, HTML1
LicenseGPL-3.0-or-later2
PlatformLinux (systemd user service)
IPCUnix socket (DARK_MATRIX_SOCKET)
DeckLocal HTTP server, default port 7340
HardwareTwo 9×34 LED Matrix modules (RP2040 + IS31FL3741A)4
Pair resolution18×34 (612 LEDs)
Project format.dmx.json (column-major base64 pixels)
Audio visualizersEQ bars, waveform, radial, waterfall, heatmap
Stars21
CreatedApril 30, 20261
Latest releasev0.1.4 (July 1, 2026)5

Releases

VersionDateNotes
v0.1.0June 3, 2026Initial release5
v0.1.1June 6, 2026Install, runtime deps, and calibration fixes (PR #1)5
v0.1.2June 13, 2026
v0.1.3June 30, 2026
v0.1.4July 1, 2026Latest release5
ProjectDescription
fw16-led-matrixdCross-platform Rust daemon with image rendering and pair mode
led-matrix-managerQt GUI for LED matrix management
fw16-ledvuPipeWire/CAVA audio visualizer for the LED matrix
Dual LED Matrix Audio VisualizerStereo frequency bars across both matrix modules
FW16 LED Matrix VisualizerWindows audio visualizer + Pixel Hero animation player
fw16-pongwarsPong Wars game for the FW16 LED Matrix

Footnotes

  1. heckseven/dark-matrix — GitHub (README, CLI reference, Deck modes) 2 3 4 5 6 7 8 9 10 11 12 13 14

  2. dark-matrix LICENSE.md — GPL-3.0-or-later, Copyright (C) 2026 heckseven 2

  3. Dark-matrix - LED matrix daemon and deck — Framework Community (heckseven, June 4, 2026) 2

  4. LED Matrix Input Module — Electrical Documentation — FrameworkComputer/InputModules (GitHub) 2

  5. Releases · heckseven/dark-matrix — GitHub 2 3 4