Releases: Natfii/ZeroAI
Release list
ZeroAI 0.3.0
Highlights
🔍 Meta Search — new default web search
On-device multi-engine search fusion (DuckDuckGo, Mojeek, Wikipedia, Marginalia) — keyless, no API accounts needed. Engines are declarative specs with a self-repair ladder: golden probe → bundled revert → selector induction → on-device Gemini Nano → provider model, all gated by model-free validation. Per-engine health is surfaced live in the plugin UI, and repair cooldowns escalate for persistently broken engines.
🔐 SSH key security overhaul
- SSH keys encrypted at rest behind an in-process ssh-agent
- Device-credential app-lock gating: the agent holds keys only while the app is unlocked
- Hardware tier: StrongBox / Titan M2-backed keys that never leave the secure element
🤖 On-device AI (Beta)
- Local Gemma agent via LiteRT (E2B QAT, plus E4B @ 24K context GPU variant) with an OpenAI-compatible local server
- Has issues replying outside terminal
- Gemini Nano integration for on-device fallbacks and search-engine self-repair
💻 Terminal & SSH
- Bundled native SSH client (zssh) replaces the in-app SSH path
- Theme-aware terminal, two-row key layout, application cursor keys (DECCKM), live cursor and theme-repaint fixes
⚙️ Settings & UX
- Settings tab restructure: Appearance hub, Provider Logins, Scheduled Tasks; autonomy gating now actually gates
- Network scanner understands VPNs and skips CGNAT space
- Model suggestions are fetched live from providers
- Vision plugin UI no longer shows a misleading enable toggle
Verification
Full release gate green: Android-target clippy (workspace, all targets), spotless + detekt, cargo-deny, on-device Rust suites (zeroclaw-ffi 632, zeroai 206), app unit tests, signed APK + AAR, version sync 0.3.0.
Requires Android 9+ (arm64-v8a / x86_64).
Re-release fixes (2026-06-11)
The original 0.3.0 binary was pulled over three launch-day bugs, all fixed here:
- On-device model downloads were blocked for everyone — the RAM gate checked momentary free RAM instead of device capability (total RAM)
- Starting a model download crash-looped the app — WorkManager foreground-service type mismatch (
dataSyncvsconnectedDevice) - ChatGPT/Codex login froze at the organization screen — the authorize request now matches the official Codex CLI (simplified-flow params + originator), the fallback port moved to the allow-listed 1457, and the login window was extended to 5 minutes. Note: completing this login requires a paid ChatGPT plan on OpenAI's side.
Kotlin gates (ktlint, detekt, unit tests) re-run green for the fix batch; the Rust engine is unchanged from the original 0.3.0 gate.
v0.2.0 - SSH Terminal — Input Routing & Live Render
SSH Terminal — Input Routing & Live Render
The TTY terminal's SSH session is now fully interactive. Commands typed over SSH reach the remote shell and output renders immediately on screen.
Using the Terminal
- Open Terminal tab in the bottom navigation and type '@'tty (no ' marks)
- Type
/ssh user@host -p port(e.g./ssh test@10.0.2.2 -p 2222) - Accept the host key when prompted
- Enter your password
- You're in — type commands normally, output renders live
Special keys: Use the key row below the terminal for Tab, Ctrl, Esc, and Alt modifiers. Ctrl+C, Ctrl+D, and arrow keys work as expected.
Local shell: The terminal also supports a local Android shell (no SSH needed) — just start typing without the /ssh prefix.
Fixes
- SSH input routing: commands now reach the remote shell reliably — the full write chain (Kotlin → FFI → russh channel) is verified end-to-end
- Live render updates: terminal output refreshes immediately after each command, no longer frozen on the MOTD
- Zombie polling coroutine: cancelled render-polling coroutines no longer survive through blocking FFI calls to overwrite valid frames with stale data
- Duplicate polling race:
startHostKeyPollingandsshSubmitPasswordno longer race to create competing render loops - PARTIAL frame stale cache: render snapshots now always extract all row data, eliminating blank/stale output from StateFlow conflation
- Fallback frame blank screen: empty-row race-loser snapshots no longer trigger unrenderable fallback frames
CI
- Clippy pedantic lints configured at workspace level
- Rust host tests gracefully skip when ghostty native symbols are unavailable
v0.1.7 — DeepSeek & Qwen Providers
What's New
New Providers
- DeepSeek — Full provider with native tool calling,
reasoning_contentextraction for R1 thinking tokens,parametersvsargumentsnormalization, orphaned tool message validation, and context overflow bailout - Qwen (Alibaba DashScope) — Three regional endpoints (International, China, US),
<think>tag stripping in the batch path,reasoning_contentfallback, and vision support
Shared Infrastructure
openai_compatmodule — Stateless wire format helpers for OpenAI-compatible providers: message conversion, tool call normalization, think-tag stripping. Reused by DeepSeek, Qwen, and future compatible providers
Android Integration
- Provider registry entries with model discovery URLs and key validation
- Qwen region picker UI with China data residency disclosure
- Brand colors and icons for both providers
- Onboarding and settings integration
ConfigTomlBuilderHTTPS enforcement for China-sensitive providers (DeepSeek, Qwen, DashScope aliases)- Minimum key length validation (DeepSeek: 35 chars, Qwen: 20 chars)
Bug Fixes
chat()now passes full message history and tool specs — was silently discarding all but the last user message and dropping tools entirely, breaking multi-turn conversations and agent tool use- Error handling uses standard
api_error()for cascade compatibility — removed deadProviderErrorKindenum that cascade never consumed - DeepSeek model discovery URL corrected —
default_base_urlhad/v1causing double/v1/v1/modelspath - All DashScope aliases registered in Kotlin — added
dashscope-cnanddashscope-usto match Rust-side alias handling
Supported Providers
OpenAI · Anthropic · Google Gemini · xAI (Grok) · DeepSeek · Qwen · Ollama · OpenRouter
Full Changelog: v0.1.6...v0.1.7
Full Changelog: v0.1.6...v0.1.7
v0.1.6
Rhai Scripting Engine & Agent Script Execution
Plugin System with Capability Grants
A full Rhai scripting engine is now embedded in the daemon, enabling user-authored scripts as first-class plugins.
- Capability-gated host calls — scripts declare required capabilities (storage, memory, tools, cost, events, config) and are granted access only after user approval
- Security hardening — SHA-256 hash-bound grants, cap-std path sandboxing, DNS-resolved SSRF guard, 30s wall-clock timeout, per-script storage quotas, tool denylist
- Script-scoped SQLite storage — each script gets its own isolated key-value store
- Cron & event triggers — scripts can be triggered on a schedule or in response to daemon events (e.g. incoming messages via regex pattern matching)
- Plugin ABI v0.2.0 — groundwork for future Wasm guest support
- Android integration — approve/deny notification actions for capability requests, new Skill Permissions settings screen
eval_script Agent Tool
The AI agent can now write and execute inline Rhai scripts during conversations for batch computation and multi-tool composition.
- Sandboxed execution — fixed capability set, 10M operation budget, 30s timeout, 16KiB output truncation
- On-device only —
model.chatcapability routes exclusively to Nano (never cloud) to prevent cost spirals - Security policy enforcement — scripts go through the same autonomy and rate-limit checks as all other tools
- Denylist —
eval_scriptcannot call itself (no recursive script execution)
Other Changes
- xAI and OpenRouter provider icons in the Agents tab
- CI test fixes for DaemonServiceBridge and FFI version assertions
v0.1.4
v0.1.3
Adds xAI (Grok) as a provider - Tools currently not working, fix coming later today
Full Changelog: v0.1.2...v0.1.3
v0.1.2
v0.1.1
Full Changelog: v0.1.0...v0.1.1
Better Google Messages usage
v0.1.0
Full Changelog: https://github.com/Natfii/ZeroAI/commits/v0.1.0
Google Messages Something went wrong while pairing - the current impl of google messages is a lil hacky, i recommend waiting like 15 mins or so to try again because you will get limited.