← Back to Blog

Nullkia: A Pipeline-Driven Desktop Environment

April 6, 2026 nullkiadesktopwayland

Nullkia is a lightweight, Wayland-native desktop environment written entirely in Lateralus. Tiling and floating modes, GPU-accelerated compositor, and pipeline-based widgets — all in under 50 MB RAM.

◉ Why Nullkia?

Existing desktop environments are either:

Nullkia is different: lightweight (~40MB idle), fully configurable via pipelines, and Wayland-native from the ground up.

◉ Pipeline Widgets

Status bar widgets are Lateralus pipelines. CPU usage, network stats, volume — all streaming data transformations:

// ~/.config/nullkia/widgets.ltl

// CPU widget - samples every 500ms, smooths, formats
widget cpu_widget {
    interval: 500,
    pipeline: cpu_samples()
        |> window(10)
        |> map(avg)
        |> format("CPU: {:.1}%")
}

// Memory widget
widget mem_widget {
    interval: 1000,
    pipeline: mem_info()
        |> map(fn(m) { m.used / m.total * 100.0 })
        |> format("RAM: {:.0}%")
}

// Network throughput
widget net_widget {
    interval: 1000,
    pipeline: net_stats()
        |> map(fn(n) { n.rx_bytes / 1024.0 })
        |> diff()  // Delta from previous
        |> format("↓ {:.1} KB/s")
}

// Battery with color coding
widget battery_widget {
    interval: 5000,
    pipeline: battery_info()
        |> map(fn(b) {
            let color = match b.percent {
                p if p < 20 => "#ff5555",
                p if p < 50 => "#ffcc00",
                _ => "#55ff55",
            }
            { text: "⚡ " + str(b.percent) + "%", color: color }
        })
}

◉ Hybrid Window Management

Switch between tiling and floating modes per-workspace:

// ~/.config/nullkia/config.toml

[workspaces]
count = 9

[workspace.1]
name = "dev"
layout = "tiling"
master_ratio = 0.55

[workspace.2]
name = "web"
layout = "floating"

[workspace.3]
name = "term"
layout = "tiling"
layout_type = "columns"  # or "rows", "spiral"

[tiling]
gap = 8
border_width = 2
border_color = "#00ff88"
border_focus = "#ff66ff"

Layout Rules

// Window rules are pipeline expressions
[rules]

// Firefox always on workspace 2
[[rule]]
match = { app_id = "firefox" }
action = { workspace = 2, floating = false }

// Terminals tile on workspace 3
[[rule]]
match = { app_id = "kitty|alacritty|foot" }
action = { workspace = 3 }

// Dialogs float
[[rule]]
match = { type = "dialog" }
action = { floating = true, center = true }

// Picture-in-picture
[[rule]]
match = { title = "*Picture in Picture*" }
action = { floating = true, sticky = true, size = [400, 225] }

◉ Keyboard Bindings

[keybindings]
"Super+Return" = "spawn kitty"
"Super+d" = "spawn wofi --show drun"
"Super+q" = "close_window"
"Super+f" = "toggle_fullscreen"
"Super+Space" = "toggle_floating"

# Focus
"Super+h" = "focus left"
"Super+j" = "focus down"
"Super+k" = "focus up"
"Super+l" = "focus right"

# Move
"Super+Shift+h" = "move left"
"Super+Shift+j" = "move down"
"Super+Shift+k" = "move up"
"Super+Shift+l" = "move right"

# Workspaces
"Super+1" = "workspace 1"
"Super+2" = "workspace 2"
"Super+Shift+1" = "move_to_workspace 1"
"Super+Shift+2" = "move_to_workspace 2"

# Layout
"Super+t" = "layout tiling"
"Super+y" = "layout floating"
"Super+[" = "resize shrink"
"Super+]" = "resize grow"

◉ Plugin System

v1.1 introduces plugins — load Lateralus modules to extend the desktop:

// ~/.config/nullkia/plugins/auto_tile.ltl

plugin auto_tile {
    // Automatically tile new windows based on content
    on window_open(win: Window) {
        let should_tile = win.app_id
            |> matches_any(["code", "kitty", "firefox"])

        if should_tile {
            win.set_tiled(true)
        }
    }

    // Smart resize based on content
    on window_resize(win: Window, new_size: Size) {
        if win.is_terminal() && new_size.width < 400 {
            win.set_font_size(win.font_size - 2)
        }
    }
}

// Enable in config.toml:
// [plugins]
// enabled = ["auto_tile", "workspace_history"]

◉ Notifications

// Notification styling and behavior
[notifications]
position = "top-right"
width = 350
timeout = 5000
max_visible = 5

// Filter notifications
[[notification_rule]]
match = { app = "Slack", urgency = "low" }
action = { timeout = 2000 }

[[notification_rule]]
match = { app = "Discord" }
action = { sound = false }

[[notification_rule]]
match = { urgency = "critical" }
action = { timeout = 0, sticky = true }

◉ Theming

// ~/.config/nullkia/theme.toml

[colors]
background = "#0a0a0f"
foreground = "#e0e0e0"
accent = "#00ff88"
warning = "#ffcc00"
error = "#ff5555"

[bar]
height = 28
background = "#0a0a0f"
font = "JetBrains Mono"
font_size = 12

[window]
border_width = 2
border_radius = 0
shadow = true
shadow_color = "#000000aa"

[cursor]
theme = "Adwaita"
size = 24

◉ Performance

◉ Installation

# NullSec Linux (pre-installed)
# Already your default desktop

# Arch Linux
yay -S nullkia

# Debian/Ubuntu
sudo add-apt-repository ppa:nullsec/nullkia
sudo apt install nullkia

# From source
git clone https://github.com/bad-antics/nullkia
cd nullkia
lateralus build --release
sudo make install

Nullkia ships with NullSec Linux and is available as a standalone download. Source on GitHub.