April 2026 · 8 min read

Nullkia: A Pipeline-Driven Desktop Environment

Nullkia is a desktop environment written in Lateralus. Tiling and floating window management, GPU-accelerated compositing, and pipeline-based widgets — all in under 50 MB of RAM.

Why build a DE?

NullSec Linux v1.x shipped with XFCE. It works, but it's not ours. Nullkia is purpose-built for security work: every panel, widget, and menu is a Lateralus pipeline that can be inspected, modified, and extended.

Architecture

Nullkia runs on Wayland via wlroots. The compositor is a thin C shim that delegates to Lateralus for all layout and rendering decisions:

fn layout_windows(windows: Vec<Window>, screen: Rect) -> Vec<Placement> {
    match current_mode() {
        Tiling => windows |> tile_bsp(screen),
        Floating => windows |> map(|w| w.last_placement),
        Monocle => windows |> map(|w| Placement::fullscreen(screen)),
    }
}

Pipeline widgets

Every status bar widget is a pipeline. The battery widget:

fn battery_widget() -> Widget {
    every(30.seconds())
        |> map(|_| read_file("/sys/class/power_supply/BAT0/capacity"))
        |> map(|s| s |> trim() |> to_int())
        |> map(|pct| Widget::text("{battery_icon(pct)} {pct}%"))
}

Memory footprint

Nullkia idles at 38 MB RSS with a status bar, system tray, and wallpaper. For comparison, GNOME Shell idles at 200+ MB. We achieve this by having no JavaScript engine, no web views, and no runtime interpreter.

Keybindings

All keybindings are configurable via ~/.config/nullkia/keys.ltl. Default bindings are tiling-WM-inspired: Super+Enter for terminal, Super+1-9 for workspaces, Super+Shift+Q to close.

The status bar

Nullkia's status bar is entirely built from Lateralus pipelines. Each widget is a pipeline that transforms system data into display text:

// Battery widget
fn battery_widget() -> Widget {
    poll_interval(5.seconds())
        |> map(|_| read_file("/sys/class/power_supply/BAT0/capacity"))
        |> map(|cap| {
            let icon = match cap {
                0..20   => "🔴",
                20..50  => "🟡",
                50..100 => "🟢",
            }
            "{icon} {cap}%"
        })
        |> to_widget(font: "VT323", color: colors::lime)
}

// Network widget — shows current IP and transfer rate
fn network_widget() -> Widget {
    poll_interval(1.second())
        |> map(|_| {
            let iface = active_interface()
            let ip = iface.ipv4_addr
            let rx = iface.rx_bytes_per_sec |> format_bytes()
            let tx = iface.tx_bytes_per_sec |> format_bytes()
            "⬇{rx} ⬆{tx} | {ip}"
        })
        |> to_widget(font: "VT323", color: colors::cyber_blue)
}

Users can edit these pipelines live. Change the poll interval, add custom formatting, or pipe data through additional transformations. The bar hot-reloads on save.

Workspace management

Nullkia ships with 9 workspaces, each pre-configured for a pentest phase:

Switch with Super+1 through Super+9. Each workspace remembers its window layout between reboots.

Theming engine

Nullkia themes are Lateralus data files that control every visual element:

// themes/nullsec-dark.ltl
theme NullSecDark {
    background: #0a001a,
    foreground: #e0e0ff,
    accent: #00ff41,
    warning: #ffee00,
    error: #ff00aa,
    border: #330066,

    fonts: {
        ui: "VT323",
        code: "JetBrains Mono",
        title: "Press Start 2P",
    },

    window: {
        border_width: 2,
        border_color: self.border,
        active_border: self.accent,
        title_bg: gradient(#110028, #1a0033),
        corner_radius: 0,  // Sharp corners for Y2K aesthetic
    },

    bar: {
        height: 28,
        bg: #110028,
        border_bottom: self.accent,
    },
}

The community has already contributed 12 themes, including a Solarized Dark variant, a Dracula port, and a "CRT Green" theme that simulates phosphor glow.

Accessibility

Security tools are notorious for poor accessibility. Nullkia addresses this:

Lateralus is built by bad-antics. Follow development on GitHub or try the playground.