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