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.5.tar.gz (85.3 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.5-py3-none-any.whl (78.1 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: nixorb-0.1.0.5.tar.gz
  • Upload date:
  • Size: 85.3 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.5.tar.gz
Algorithm Hash digest
SHA256 6e46f2f95d257989e0e5e037f704f246b355b7143a92c0837e41fdc1acb786d9
MD5 ddc641850641ae7794c43a57bc60f7c0
BLAKE2b-256 2c8d1cac5bf22d68b7ef2def4f1429a9b90418ec8f594374b69945a9e4464357

See more details on using hashes here.

Provenance

The following attestation bundles were made for nixorb-0.1.0.5.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.5-py3-none-any.whl.

File metadata

  • Download URL: nixorb-0.1.0.5-py3-none-any.whl
  • Upload date:
  • Size: 78.1 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.5-py3-none-any.whl
Algorithm Hash digest
SHA256 4561319865647c9ff42f3be1623062bc36b6f9ebf5c1c15b41c44020630f81b3
MD5 9da28638826006c4cf1d1f60689172ef
BLAKE2b-256 4360ee5cd70565c8355f34cdffc38e0e2c76279d17ce70a381980233119d746e

See more details on using hashes here.

Provenance

The following attestation bundles were made for nixorb-0.1.0.5-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