{"slug": "aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1", "title": "ARIA – Voice-native 3D spatial AI SoC with governed autonomy (BSL 1.1)", "summary": "ARIA, a voice-native 3D spatial AI security operations cockpit with governed autonomy, is now available under BSL 1.1 for evaluation and research. Developed by a solo developer, the platform runs entirely on user hardware and features a four-rung autonomy ladder where capabilities must earn authority through measured outcomes, with all actions written to an append-only audit log. ARIA supports local speech-to-text via Whisper and enforces data sovereignty by refusing to send prompts to public hosts unless explicitly configured.", "body_md": "**A voice-native, 3D spatial security operations cockpit with governed autonomy — that runs entirely on your own hardware if you want it to.**\n\n*Source-available for evaluation and research. Not open source — see License.*\n\nMost AI security tools act and then ask you to trust them. ARIA inverts that: every\nautonomous capability has to **earn** its authority through measured outcomes, and\nyou can see and bound exactly how far it is allowed to go.\n\nIt is a single-operator SOC cockpit you talk to. The entire feature set is a navigable 3D galaxy rather than a sidebar of menus. It ingests telemetry from your cloud, identity, code, and network surfaces, explains what matters in plain language, and proposes bounded actions that are gated by policy and written to an audit trail.\n\nHonest status:ARIA is a working platform under active solo development, not a hardened commercial product. It is genuinely functional — real connectors, real local network and BLE discovery, real audit trails, a real local-model path — but parts of it are demo-grade and labelled as such throughout this README and in the product itself. Nothing here is presented as more finished than it is.\n\n→is the full engineering audit, published unedited: module-by-module status with file paths and line numbers, naming exactly which subsystems are production-grade and which are simulated. If it disagrees with this README, believe it instead. A shorter summary is in[ROADMAP_AND_LIMITATIONS.md][Maturity & what is not done]below.\n\nThe whole platform is a Three.js/WebGL galaxy. **Sectors** are capability domains;\n**nodes** are individual panels. A three-tier colour system (blue nominal → amber\nthreat → red critical) propagates live from scan and telemetry state, so posture is\nlegible from across the room.\n\nFour interchangeable ways to navigate: click a node, **speak** a destination, type a\ncommand, or let ARIA route you automatically when a critical event fires.\n\nThe core idea, and the reason the rest exists. Autonomy is not a global on/off\nswitch — it is **per-capability** and **earned**.\n\nFour capabilities (`threat_analysis`\n\n, `remediation`\n\n, `containment`\n\n,\n`identity_actions`\n\n) each sit independently on a four-rung ladder:\n\n| Rung | Mode | Behaviour |\n|---|---|---|\n| 1 | `approval` |\nARIA proposes; a human approves every action |\n| 2 | `assisted` |\nARIA acts on low-risk items, escalates the rest |\n| 3 | `auto` |\nARIA acts autonomously except on critical-risk actions |\n| 4 | `full_auto` |\nARIA acts, and reports |\n\nPromotion requires a track record of measured outcomes. Crucially, **the model\ncannot promote itself** — a capability only climbs when an operator promotes it, and\ndemotion on a bad outcome is immediate. Every promotion, demotion, approval and\naction is written to an append-only audit log with a retention envelope.\n\nTwo-way spoken conversation over live data, not a chatbot bolted to a dashboard.\nSpeech-to-text is **always local** (Whisper via `@xenova/transformers`\n\n) — your voice\nnever leaves the machine. Text-to-speech is an optional cloud call you can leave\nunconfigured.\n\nARIA is built for regulated environments where sending telemetry to a third-party\nSaaS is not merely undesirable but illegal. In `LOCAL`\n\nmode reasoning runs against\nyour own model over an OpenAI-compatible endpoint (Ollama, vLLM, LM Studio,\nllama.cpp) and **the sovereignty boundary is enforced in code, not promised in\ndocs**:\n\n`server/localLlm.mjs`\n\nrefuses to send a prompt to any host outside loopback or a private range. A public address is rejected unless you explicitly set`ARIA_LOCAL_LLM_ALLOW_REMOTE=true`\n\n.`LOCAL`\n\nmode**never** silently falls back to a cloud provider, even when a cloud API key is sitting right there in your environment. If your local engine is down you get a clearly-labelled degraded summary and the reason — not a quiet egress.- The server binds to loopback by default and is not designed to face the internet.\n\nAI Security Posture Management across GitHub, AWS, Okta, Snyk, Azure AD, VirusTotal, and Elastic Security — inventorying AI assets, secrets, model infrastructure, endpoints, and identity links, then mapping attack paths and blast radius across them. Connector credentials are encrypted at rest with AES-256-GCM.\n\nReal ARP-table and BLE discovery with IEEE OUI vendor attribution and Bluetooth assigned-number decoding, device identity claims, and proximity estimation. Broadcast and multicast MACs are filtered at parse time rather than reported as devices. Active discovery is authorization-gated; passive visibility is not.\n\n**Under five minutes, no API keys required** — ARIA starts with local-only features\nand every AI provider disabled but visibly labelled as such.\n\n**Node.js ≥ 22**(uses`node:`\n\nbuiltins and native`fetch`\n\n)**npm**(or pnpm)*Optional:*[Ollama](https://ollama.com)for sovereign local reasoning*Optional:*Docker, for the containerised server\n\n```\ngit clone https://github.com/<your-org>/aria-guardian.git\ncd aria-guardian\nnpm install\ncp .env.example .env.local\nnode scripts/generate-encryption-key.mjs --write   # AES-256-GCM key for the credential vault\n```\n\n`.env.example`\n\ndocuments every variable. **All AI keys are optional** — fill in only\nwhat you want. See [Bring Your Own Key](#-bring-your-own-key).\n\n```\nnpm run start:local     # API on :5000 + web UI on :5173\n```\n\nThen open ** http://127.0.0.1:5173** and log in with the development operator:\n\n```\nusername: operator\npassword: aria\n```\n\nThis built-in account exists\n\nonlywhen`NODE_ENV`\n\nis`development`\n\n/`test`\n\n, or when`ARIA_ENABLE_DEMO_LOGIN=true`\n\noutside production. Production is fail-closed: it refuses to boot without real operator credentialsanda credential encryption key. Set`ARIA_LOGIN_USERNAME`\n\n/`ARIA_LOGIN_PASSWORD`\n\n(or`ARIA_OPERATORS`\n\n) for any real deployment.\n\n| Command | What it does |\n|---|---|\n`npm run start:local` |\nAPI + web UI together (recommended first run) |\n`npm run aria` |\nElectron desktop app |\n`npm run server` |\nAPI server only, on `:5000` |\n`npm run dev` |\nVite frontend only |\n`npm run build` |\nProduction frontend bundle |\n`npm run dist` |\nPackaged desktop app (macOS `.dmg` ) |\n`npm run lint` |\nESLint |\n`npm run test:server` |\nServer test suite |\n\n```\nexport ARIA_CREDENTIAL_ENCRYPTION_KEY=$(node scripts/generate-encryption-key.mjs)\ndocker compose up\n```\n\nCompose fails fast with an explanatory message if that key is unset — the image runs\nwith `NODE_ENV=production`\n\n, which will not silently store credentials in plaintext.\nTo reach a model server running on your host rather than in a container, set\n`ARIA_LOCAL_LLM_URL=http://host.docker.internal:11434/v1`\n\n.\n\nARIA ships with **no keys**, has **no telemetry**, and **never proxies your traffic\nthrough anyone else's infrastructure**. There is no analytics SDK in this repo —\nverify it yourself:\n\n```\ngrep -rniE --include='*.mjs' --include='*.js' --include='*.jsx' \\\n  \"posthog|mixpanel|amplitude|google-analytics|gtag|datadog|sentry\" src/ server/\n```\n\nEvery outbound host in the codebase is one you configured: your chosen LLM provider, your connectors' own APIs, and ElevenLabs if you enable speech.\n\nKeys live in `.env.local`\n\n(gitignored) or your process environment. Connector\ncredentials entered through the UI are encrypted at rest with AES-256-GCM, or can be\ndelegated to AWS Secrets Manager.\n\nFour **Intelligence Modes**, switchable live from the cockpit:\n\n| Mode | Provider | Requires | Data leaves your network? |\n|---|---|---|---|\n`CLOUD` |\nAnthropic Claude | `ANTHROPIC_API_KEY` |\nYes |\n`GEMINI` |\nGoogle Gemini | `GEMINI_API_KEY_V2` |\nYes |\n`LOCAL` |\nAny OpenAI-compatible local server | a running engine | No — enforced in code |\n`HYBRID` |\nCloud first, local failover | either | Only while cloud is reachable |\n\nThe selector reflects **reality, not aspiration**: each mode is greyed out with a\nhover explanation when it cannot actually answer, and `LOCAL`\n\ndisplays the name of\nthe model you actually have loaded. Query it directly at\n`GET /api/model/status`\n\n.\n\n```\nollama serve\nollama pull qwen3:8b\n```\n\nThat is the entire configuration. ARIA defaults to Ollama on loopback and, if you\nhave not named a model, **uses the first one the server reports** — so it works with\nwhatever you have already pulled. To be explicit:\n\n```\nARIA_LOCAL_LLM_URL=http://127.0.0.1:11434/v1\nARIA_LOCAL_LLM_MODEL=qwen3:8b\n```\n\nvLLM, LM Studio, llama.cpp's server and text-generation-webui all work through the\nsame path — anything that speaks `/v1/chat/completions`\n\n.\n\n```\n┌──────────────────────────────────────────────────────────────────┐\n│  Renderer — React 19 + Three.js (Electron window or browser)     │\n│  Galaxy scene · panels · voice loop · Intelligence Mode selector │\n└───────────────────────────────┬──────────────────────────────────┘\n                                │  HTTP + WebSocket (loopback)\n┌───────────────────────────────┴──────────────────────────────────┐\n│  Node.js server — server/index.mjs                               │\n│                                                                  │\n│  authz · quotaGuard · rateLimiter · auditLog · securityHeaders    │\n│  ariaTrust (Trust Ladder) · actionRunner · policyStore            │\n│  reasoningEngine · autonomousResponse · ariaMemory                │\n│  aiSpmInventory · aiRiskEngine · aiSpmBlastRadius                 │\n│  NetworkIntelligence/ · Bluetooth/ · connectors/                  │\n└───┬──────────────────────┬───────────────────────┬───────────────┘\n    │                      │                       │\n┌───┴────────┐   ┌─────────┴──────────┐   ┌────────┴─────────────┐\n│ Reasoning  │   │ Connectors         │   │ Persistence          │\n│            │   │                    │   │                      │\n│ Anthropic  │   │ GitHub · AWS       │   │ JSON under           │\n│ Gemini     │   │ Okta · Snyk        │   │ aria-memory/         │\n│ Local      │   │ Azure AD           │   │ + optional KV mirror │\n│ (sovereign)│   │ VirusTotal·Elastic │   │ AES-256-GCM vault    │\n└────────────┘   └────────────────────┘   └──────────────────────┘\n```\n\n**Frontend** — React 19 with Three.js via `@react-three/fiber`\n\n, `drei`\n\n, and\n`postprocessing`\n\n. Panels are lazily code-split. Vite for dev and build;\n`electron-vite`\n\nfor the desktop target.\n\n**Server** — a single Node.js HTTP + WebSocket server, no framework, ~4,500 lines of\nrouting in `server/index.mjs`\n\ndelegating to 74 focused modules. Loopback-bound by\ndefault. Role-based authz (`owner`\n\n/`admin`\n\n/`analyst`\n\n/`viewer`\n\n) with opaque\nin-memory session tokens.\n\n**Reasoning** — one dispatcher (`callAI`\n\n) fans out to Anthropic, Gemini, or your\nlocal engine, with per-mode fallback policy that respects the sovereignty\nguarantee.\n\n**Persistence** — file-based JSON under `aria-memory/`\n\n, with an optional Upstash KV\nmirror for durability across restarts. Deliberately boring: it is inspectable with\n`cat`\n\n, which matters for an audit trail.\n\n**Voice** — local Whisper STT (`@xenova/transformers`\n\n, runs on-device); ElevenLabs\nTTS as an optional cloud call.\n\nPublishing an honest list is more useful than a feature grid. Known gaps, current as\nof this commit — the full module-by-module account with file paths is in\n[ROADMAP_AND_LIMITATIONS.md](/sidevworks/aria-sec/blob/main/ROADMAP_AND_LIMITATIONS.md):\n\n| Area | Status |\n|---|---|\nNetwork scan depth |\nARP-table reads and BLE scanning are real; \"deep scan\" is not a full active port/vuln scan. Phase naming is being made literal. |\nLocal TTS |\nSpeech-to-text is local; text-to-speech is still a cloud call, so `LOCAL` mode is sovereign for reasoning but not for speech output. Piper/Kokoro is the intended fix. |\nSemantic memory |\nKeyword search, not vector search. Fine at current scale. |\nMulti-tenancy |\nTenant IDs flow through the system but isolation is not enforced on every store. Single-tenant desktop use only today. |\nApproval queue |\nFile-backed; does not survive across multiple server instances. |\nAudit log rotation |\nCapped per file with a retention envelope; rotation is not yet implemented. |\nRate limiting |\nLegacy in-memory limiter still present alongside the newer `quotaGuard` . |\nCI/CD |\nManual shell scripts. No pipeline in this repo. |\nLint |\n45 pre-existing ESLint errors, mostly unused vars in two large components. `npm run build` is clean. |\nCompliance |\nNo SOC 2, no formal privacy policy or IR plan yet. |\n\nSecurity reports are welcome — please open a private advisory rather than a public issue.\n\n```\nserver/               Node.js API — routing, autonomy, connectors, intelligence\n  ariaTrust.mjs         Trust Ladder: scoring, promotion, demotion\n  localLlm.mjs          Sovereign local LLM client + egress guard\n  auditLog.mjs          Append-only audit trail with retention\n  authz.mjs             Role-based authorization\n  connectors/           GitHub, AWS, Okta, Snyk, Azure AD, VirusTotal, Elastic\n  NetworkIntelligence/  ARP discovery, OUI vendor lookup, device identity\n  Bluetooth/            BLE scanning and intelligence\nsrc/                  React 19 + Three.js renderer\n  landing/              Cinematic Three.js entry surface\n  panels/               Operator panels (galaxy nodes)\n  voice/                Local Whisper STT + voice loop\nelectron/             Desktop main + preload\nscripts/              Launchers, registry updaters, key generation\ninfra/trial-form/     AWS SAM reference stack for the landing page's forms\ndocs/                 Capability reference and API documentation\ntest/                 Node test-runner suites\n\nROADMAP_AND_LIMITATIONS.md   Full engineering audit — read this before evaluating\n```\n\n**Business Source License 1.1** — source-available, not open source.\n\n- ✅\n**Permitted without a fee:** development, testing, evaluation, security and academic research, personal sandbox use, internal demonstration. - ❌\n**Requires a commercial license:** production use, or offering ARIA's functionality to third parties as a hosted or managed service. - 🔓\n**Converts to GPL-3.0-or-later on 2030-07-26.**\n\nFull terms in [LICENSE](/sidevworks/aria-sec/blob/main/LICENSE). Copyright © 2026 Sary Ismail.\n\nBuilt in the Kingdom of Bahrain.", "url": "https://wpnews.pro/news/aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1", "canonical_source": "https://github.com/sidevworks/aria-sec", "published_at": "2026-07-26 12:35:18+00:00", "updated_at": "2026-07-26 12:52:33.612350+00:00", "lang": "en", "topics": ["artificial-intelligence", "ai-safety", "ai-products", "ai-infrastructure", "ai-policy"], "entities": ["ARIA", "Three.js", "WebGL", "Whisper", "Ollama", "vLLM", "LM Studio", "llama.cpp"], "alternates": {"html": "https://wpnews.pro/news/aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1", "markdown": "https://wpnews.pro/news/aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1.md", "text": "https://wpnews.pro/news/aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1.txt", "jsonld": "https://wpnews.pro/news/aria-voice-native-3d-spatial-ai-soc-with-governed-autonomy-bsl-1-1.jsonld"}}