Skip to main content

Floating AI assistant orb for Arch Linux โ€” KDE Plasma 6 Wayland

Project description

NixOrb ๐ŸŒ

Floating AI assistant orb for Arch Linux โ€” KDE Plasma 6 Wayland โ€” GTX 1080

CI PyPI License: MIT Python 3.12 Arch Linux


What it is

NixOrb is a frameless, always-on-top AI assistant that floats on your Wayland desktop as a glowing GLSL-shader orb. Press a global hotkey (or say a wake word), speak, and it transcribes โ†’ thinks โ†’ speaks back โ€” the orb pulsing to the audio in real time.

Key features at a glance:

Category What it does
Orb UI Frameless QML shader orb with particle system, drag-to-reposition
ASR Whisper Large v3 INT8 (~2 GB VRAM) via faster-whisper
LLM OpenAI API, Ollama, llama.cpp local, with offline auto-fallback
TTS OpenAI TTS, HuggingFace models, offline Piper
VRAM Priority-eviction manager keeps 8 GB GTX 1080 from OOM crashing
Actions Sandboxed bash execution via bubblewrap; user confirmation gate
Memory ChromaDB long-term vector memory, injected into every prompt
Vision grim screen capture โ†’ VLM description on demand
Wake word OpenWakeWord always-on detector (low CPU)
Plugins Drop-in .py plugin folder, hot-reloadable
Clipboard wl-paste / wl-copy Wayland integration
Tray KDE Plasma 6 system tray icon

Installation

Option 1 โ€” Arch Linux (pacman) โ€” recommended

# Download the .pkg.tar.zst from the GitHub Releases page, then:
sudo pacman -U nixorb-0.1.0-1-x86_64.pkg.tar.zst

Option 2 โ€” PyPI

# Install PyTorch with CUDA first (GTX 1080 โ†’ CUDA 11.8)
pip install torch==2.7.1+cu118 torchaudio==2.7.1+cu118 \
  --index-url https://download.pytorch.org/whl/cu118

pip install nixorb

Option 3 โ€” AppImage (portable)

chmod +x NixOrb-0.1.0-x86_64.AppImage
./NixOrb-0.1.0-x86_64.AppImage start

Option 4 โ€” Flatpak

flatpak install NixOrb-0.1.0.flatpak
flatpak run io.nixorb.NixOrb

Option 5 โ€” From source (development)

git clone https://github.com/minerofthesoal/nixorb.git
cd nixorb

# System packages
sudo pacman -S --needed python qt6-base qt6-declarative qt6-wayland \
  qt6-multimedia qt6-tools cuda cudnn portaudio wl-clipboard grim \
  ffmpeg base-devel
yay -S --needed kglobalacceld piper-tts openwakeword

# Python environment
python -m venv .venv --system-site-packages
source .venv/bin/activate
pip install torch==2.7.1+cu118 --index-url https://download.pytorch.org/whl/cu118
pip install -e ".[dev]"

# Compile QML shaders (required once)
cd assets/shaders
qsb --glsl "100es,120,150" --hlsl 50 --msl 12 orb_glow.vert -o orb_glow.vert.qsb
qsb --glsl "100es,120,150" --hlsl 50 --msl 12 orb_glow.frag -o orb_glow.frag.qsb
cd ../..

# Run
nixorb start

Quick start

nixorb start               # Launch GUI orb
nixorb start --headless    # Daemon only (no Qt), for SSH/scripting
nixorb ask "What is 2+2?"  # One-shot LLM query
nixorb tts "Hello world"   # Speak text
nixorb transcribe audio.wav
nixorb check-deps          # Verify Arch packages
nixorb list-devices        # List microphones
nixorb list-plugins        # Show loaded plugins
nixorb memory-search "python"
nixorb memory-clear --yes
nixorb export-config --out backup.tar.gz.enc
nixorb import-config backup.tar.gz.enc
nixorb version

Configuration

~/.config/nixorb/config.toml is created on first run from the shipped defaults.

Key settings:

hotkey       = "Ctrl+Alt+Space"   # global activation hotkey
llm_backend  = "openai"           # openai | ollama | local
llm_model    = "gpt-4o-mini"
openai_api_key = "sk-..."

tts_backend  = "openai"           # openai | huggingface | piper
tts_voice    = "alloy"

local_model_path    = "/home/you/models/mistral-7b.Q4_K_M.gguf"
fallback_model_path = "/home/you/models/phi-2.Q4_K_M.gguf"

wake_word_enabled   = true
wake_word_model     = "hey_jarvis_v0.1"
screen_capture_enabled = true
require_action_confirmation = true

All settings are also editable via the GUI (right-click orb โ†’ Settings).


VRAM budget โ€” GTX 1080 (8 GB)

Model VRAM Priority
Whisper Large v3 INT8 ~2.1 GB LOW โ€” evicted first
Local LLM 7B Q4_K_M ~4.0 GB HIGH โ€” evicted last
HuggingFace TTS ~1.5 GB MEDIUM
Piper TTS (offline) ~0.1 GB MEDIUM
Driver + KDE compositor ~0.5 GB reserved
Safety buffer 0.25 GB reserved

Paging flow: hotkey โ†’ Whisper loads โ†’ transcript โ†’ Whisper evicted โ†’ LLM loads โ†’ response โ†’ LLM evicted โ†’ TTS speaks.


Writing a plugin

Drop a .py file into ~/.local/share/nixorb/plugins/ (or the plugins/ repo dir):

TOOL_DEFINITION = {
    "type": "function",
    "function": {
        "name": "my_tool",
        "description": "What this does โ€” the LLM reads this to decide when to call it.",
        "parameters": {
            "type": "object",
            "properties": {
                "input": {"type": "string", "description": "The input"}
            },
            "required": ["input"],
        },
    },
}

def my_tool(input: str) -> str:
    return f"Result: {input.upper()}"

Async plugins work too โ€” use async def. Reload in Settings โ†’ Plugins โ†’ Reload.


Architecture

Qt Main Thread          asyncio Event Loop          Thread Pool
โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€          โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
OrbWindow (QML)    โ†โ”€โ”€ EventBus (PriorityQueue) โ†โ”€โ”€ Whisper inference
SettingsWindow     โ†โ”€โ”€ LLM stream chunks        โ†โ”€โ”€ llama.cpp generate
NixOrbTray         โ†โ”€โ”€ TTS audio chunks         โ†โ”€โ”€ VRAM load/unload
HotkeyManager          VRAMManager monitor           sounddevice record
                        PluginLoader
                        VectorMemory (ChromaDB)

Security

  • Hard-deny list blocks destructive commands unconditionally
  • REQUIRE_CONFIRM list prompts user confirmation before sensitive ops
  • Optional bubblewrap (bwrap) sandbox with --unshare-net
  • NixOrb refuses to run as root
  • API keys stored in ~/.config/nixorb/config.toml (mode 600 recommended)
  • Config export is PBKDF2 + Fernet encrypted

Contributing

git clone https://github.com/minerofthesoal/nixorb.git
cd nixorb
pip install -e ".[dev]"
ruff check nixorb/
mypy nixorb/
pytest tests/ -v

License

MIT ยฉ NixOrb Contributors

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

nixorb-0.1.0.9.tar.gz (110.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

nixorb-0.1.0.9-py3-none-any.whl (85.2 kB view details)

Uploaded Python 3

File details

Details for the file nixorb-0.1.0.9.tar.gz.

File metadata

  • Download URL: nixorb-0.1.0.9.tar.gz
  • Upload date:
  • Size: 110.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nixorb-0.1.0.9.tar.gz
Algorithm Hash digest
SHA256 2b4271be432d74abb01ca3f04db539d561e5e9356d72f2a3d0d71db5a9a5feb5
MD5 58706d635c9193a4a7ec2672d618bd2a
BLAKE2b-256 95ae8337eaf5c379af085beeff610e20fd8c9bb2cb27ee0e6beae435205e8212

See more details on using hashes here.

Provenance

The following attestation bundles were made for nixorb-0.1.0.9.tar.gz:

Publisher: release.yml on minerofthesoal/nixorb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file nixorb-0.1.0.9-py3-none-any.whl.

File metadata

  • Download URL: nixorb-0.1.0.9-py3-none-any.whl
  • Upload date:
  • Size: 85.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for nixorb-0.1.0.9-py3-none-any.whl
Algorithm Hash digest
SHA256 c74f4ef9aa7ba4f36b4e36b869294310160ded7c1411cd19b2429407d369f76b
MD5 31e2fb9501c8d1838160745b445ae90c
BLAKE2b-256 049ae29f25859793301e66b7d231eeee860cc9b193cdee5ba1e20c1d938ca750

See more details on using hashes here.

Provenance

The following attestation bundles were made for nixorb-0.1.0.9-py3-none-any.whl:

Publisher: release.yml on minerofthesoal/nixorb

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page