
miaowunya/rikkahub-sillytavern-android
Developer tools安卓AI聊天端:开箱即聊,无损导入酒馆卡,缓存强省用量,Jev 决策,专属RP模式,防空回,主动信息,前端卡支持,高定制主题,QQbot,AI群聊,插件系统,强兼容中转站。手机移动端原生支持,求 Star 收藏⭐Android AI Chatbox: lossless SillyTavern card import, aggressive cache optimization, Jev...
Overview
(merged with upstream v2.5.6, plus 2150+ commits of additions), natively implemented in Kotlin + Jetpack Compose. - : plug in any API and start talking — multi-provider, streaming, voice calls, plugin tools, memory, cache savings. No "tavern" concepts required. - : character cards, lorebooks, presets, regex and themes import losslessly with official semantics — no Termux, no Node.js. Both routes share the same client and don't interfere with each other. : rikkahub.luoca.cn · Documentation (installation, configuration, tavern imports, plugin development) 🗺️ Where this fork sits between its two upstreams (click to expand) Two upstream lineages meet here — knowing them makes the diff readable: - : everything preserved; the tavern/plugin/memory work is purely additive - : the tavern core comes from it; this fork adds cache optimization, plugins, memory, proxy fix, voice, and privacy hardening on top - : see Credits — feature provenance is stated per project 1.
README
A deeply customized fork of RikkaHub (merged with upstream v2.5.6, plus 2150+ commits of additions), natively implemented in Kotlin + Jetpack Compose.
- Just want a good AI chat app: plug in any API and start talking — multi-provider, streaming, voice calls, plugin tools, memory, cache savings. No “tavern” concepts required.
- Migrating from desktop SillyTavern: character cards, lorebooks, presets, regex and themes import losslessly with official semantics — no Termux, no Node.js.
Both routes share the same client and don’t interfere with each other.
Website & docs: rikkahub.luoca.cn · Documentation (installation, configuration, tavern imports, plugin development)
Tavern compatibility
| Character cards (V3 card + 62-entry embedded lorebook) | Macro engine (60+ official macros) |
|---|---|
Memory & caching
| Multi-dimensional memory settings | Prefix divergence diagnostics (character-level diff) |
|---|---|
This fork’s exclusives
| HuaDeng Settings (compatibility & helpers) | HuaDeng Settings (access & automation) | Jev decisioning |
|---|---|---|
| Plugin system |
|---|
✨ Fork features
| Area | In one line | |
|---|---|---|
| ⚡ | Prompt cache optimization | Removes per-turn context divergence — long-conversation token cost drops sharply |
| 🧠 | Memory & long conversations | Semantic RAG + three-layer memory + rolling compression |
| 🧿 | Jev decisioning | Mounts the TypeSafe System One judge model: memory screening + quick Q&A for the main model |
| 🧩 | Plugin system | QuickJS-sandboxed plugins, ZIP import, directly callable by the AI |
| 🍺 | Deep SillyTavern compatibility | Cards / lorebooks / presets / regex / QR / themes, lossless with official semantics |
| 🗼 | Proxy-station compatibility | Auto-fixes the three classic Gemini-via-OpenAI-proxy pathologies |
| 🔊 | Doubao voice | TTS 2.0 + Volcengine ASR; one Agent Plan key powers voice/video calls |
| 📱 | On-device augmentation | 30 device tools (lazy-discovery), WeChat/QQ Bots, AI proactive messaging |
| 🏮 | HuaDeng Settings | One page collecting this fork’s new switches |
| 🎨 | Appearance & themes | 7 custom colors + SillyTavern theme import |
| 🛠 | Skills & tools | GitHub one-click skill install, 20 new tools, DSML text tool-call compat |
| 💞 | Companionship | Couples space, life hub (cycle / memo / calendar / music / reading) |
| 🛡 | Privacy & stability | Log sanitization, approval boundaries, telemetry off, SSE & DB hardening |
🚀 Quick start
- Grab the latest APK from Releases (
arm64-v8a, Android 8.0+) - Settings → Models & Services → Providers, add your API; then Default models & prompts to pick models for chat / title / compression
- Start chatting. Want more:
- Import a character card (Assistants page → import, PNG / V2 / V3 JSON; lorebooks and presets come along automatically)
- Import lorebooks / presets / regex / QR (Settings → Extensions)
- Try a SillyTavern theme (Settings → Preferences → Chat appearance → import theme)
- Add plugins (Settings → Plugins → import ZIP; bundled plugins work out of the box)
In-app update: Settings → About → Check for updates (GitHub Releases API, with an auto-fallback mirror for mainland China)
💬 Chat features (this fork’s core enhancements)
⚡ Prompt Prefix Cache Optimization
Major providers (DeepSeek / Kimi / Claude, etc.) offer automatic prefix caching: a byte-identical prefix to the previous request is a cache hit, billed far below the normal rate. But in chat, plenty of content changes every turn (timestamps, recent chats, memories, random numbers, rolling summaries) — one divergence kills the whole cache.
Drawing on the DeepSeek Harness prefix-stability design, this fork eliminates those divergence points one by one:
| Divergence point | How it’s handled |
|---|---|
| Dynamic injections (recent chats, memory refs) | Frozen anchors: old block stays in place, new block appends at the tail |
{{random}} / {{pick}} and other random macros |
Resolved deterministically per message — history no longer re-rolls |
| Lorebooks / skills / cross-window memory / OCR / regex depth | Frozen per user turn, so repeated requests in a turn share a prefix |
| Macro rendering of assistant messages already in history | Frozen per message — no longer varies with time or variables |
Time-family macros ({{time}}, …) |
Aligned to 5-minute granularity, avoiding second-level jitter |
| Rolling compression summaries | Append-style chaining keeps the token prefix stable across compressions |
| Full memory injection / Recent Chats | Moved out of the prefix zone (the former to the context tail) |
| Multiple API keys | Sticky per session, so upstream caching isn’t invalidated by key switching |
Claude redacted_thinking |
Preserved and replayed, keeping the thinking-block structure intact |
Diagnostics: a built-in prefix divergence view compares consecutive requests item by item, shows the common prefix and estimated hit rate, and supports character-level diff location — you can always see exactly why a cache missed. A prompt viewer also shows the exact prompt sent this turn.
Actual results vary by conversation shape: in steady, append-only chats the hit rate improves noticeably; the exact gain depends on how often content changes and on each provider’s pricing.
🧠 Memory & Long Conversations
- Semantic memory RAG (ported from Rikkahub-Revised): memories split into FACT / EPISODIC, embedded with the vector model and retrieved via cosine similarity (with a lexical fallback of word terms + CJK bigrams); episodic memories get recency weighting; results are injected within a budget
- Three-layer memory (from orangechat/Tumin): a fixed-memory section (independently editable without touching the character card) + a recent-life stream (cross-conversation memory of the current chat; unread events from other conversations auto-injected) + long-term recall via lexical-overlap scoring; the stream is auto-summarized in the background past a threshold
- Enhanced
memory_tool: alistread operation plus fact / episodic distinction — the model can review existing memories before writing or updating - Memory management page: view / edit / delete entries per assistant
- Rolling context compression: past a threshold (auto-computed from the model’s context window or set manually), a compression model rolls earlier turns into a summary (originals preserved, replaced only at request time), injected as a system message — staying in-window without losing persona or foreshadowing
- Recent chats reference: optionally inject the assistant’s recent conversation list for cross-session continuity
- Transient-content pruning: web-search results / images / audio / video older than two turns are dropped from requests (with the message ID so the AI can retrieve the original via
read_history_message) - First-turn auto memory: the first turn injects the most recent memories (no relevance query exists yet), later turns recall by relevance — the AI knows you from the first message
Memory features (memory tool / RAG / three-layer memory / cross-window life stream) are on by default — memory helps the AI know you better and isn’t sacrificed to save context. Existing assistants keep their settings and can opt out per assistant.
🧿 Jev decisioning (TypeSafe System One)
Settings → HuaDeng Settings → Jev decisioning. Jev is a dedicated small model that only judges — it never generates text (~100ms end to end, output tokens free). It mounts as an invisible decision layer inside the client: paste an API key and it works. Two takeover switches:
| Switch | What it does |
|---|---|
| Automatic memory screening | Instead of embedding-similarity retrieval, Jev judges each memory “is this relevant to the current conversation?” — no embedding API calls. Candidates are batched in parallel newest-first; anything over 50% relevance probability is injected; identity memories (what to call you, preferences) count as relevant even when not mentioned |
| judge tool for the main model | Gives the main model a judge tool (shown as “Jev 明断” in the UI): when unsure about a yes/no, multiple-choice, or rating question it asks Jev instead of guessing. A tool-routing note is injected into the system prompt so weaker models discover it too |
Silence is a hard requirement: whenever Jev is unavailable (no key, network failure, low confidence), memory and tools fall back to the original logic — no error dialogs, no blocking.
🧩 Plugin System
QuickJS-sandboxed plugins. A plugin is a ZIP package (manifest.json + main.js); import it in Settings → Plugins.
The plugin system originated in orangechat / Tumin; this fork added the sandbox capabilities tool-style plugins need (session-aware HTTP, image decoding, detail-page cards).
What it can do
toolsdeclared in the manifest become AI-callable tools (unifiedplugin_prefix)- System-prompt injection:
systemPromptinjected directly, orsectionseach gated by a config switch (supportsfile:external files andenc:AES-256-GCM encrypted files) - Detail-page data cards: declare
detailCardand the plugin page calls that exported function and renders a live status card (e.g. calorie “today’s intake”) - Folders, enable/disable, per-plugin config forms (text / password / boolean / select / model picker)
- Per-plugin
dataStorekey-value storage underplugin_data_
Sandbox capabilities
| API | Purpose |
|---|---|
fetch(url, options) |
One-shot request, no cookie persistence, fail-closed host allowlist |
http.* |
Session-aware requests with a built-in cookie jar (saves each hop’s Set-Cookie), binary-capable via bytes() / base64(). Built for “get a session, then log in with it” flows — academic systems, forums |
image.decode(data) |
Image → RGBA pixel array (same layout as canvas.getImageData). There is no canvas in the sandbox, so per-pixel work (captcha OCR, color picking) relies on it |
dataStore |
set / get / del / list |
btoa / atob / TextEncoder / TextDecoder |
Encoding helpers |
config |
Global object holding the plugin’s config |
Single-threaded; 30s tool timeout, 8s detail-card timeout. ES5 only (async/await are preprocessed into synchronous calls).
Security
- Two-stage import: parse and preview the manifest, then commit
- SHA-256 integrity check (
.integrity) in the plugin directory — a modified plugin is disabled automatically - Zip-Slip protection: every entry’s canonical path is verified on extraction
- Empty
allowedHosts= all network requests denied - Plugins reach only the explicitly injected bridge objects, never host capabilities
⚠️ Plugins are third-party code. Only import sources you trust.
Bundled plugins
| Plugin | Description |
|---|---|
| 🍱 Calories & Protein | Say “I had a bowl of beef noodles for lunch” and both the calories and the protein are recorded. Daily targets are set in plugin settings; the detail page shows today’s intake and each remaining budget |
| 🌍 AI Model World | Profiles and benchmark scores of 600+ LLMs (data from liyupi/ai-model-world, hourly sync of Epoch AI / models.dev / LiveBench). Ask “how much does model X cost / how long is its context / is it stronger than Y / what are the cheap models” and the AI answers from the local database; one-tap data refresh |
| 🎓 YNUFE Academic System | Timetable / grades / exam schedule / notices / empty classrooms for Yunnan University of Finance and Economics. Credentials live in plugin settings; captchas are OCR’d locally, with an image fallback for manual entry |
All packages (source included) are in docs/plugins/; see docs/PLUGINS_GUIDE.md for the development guide.
🗼 Proxy-Station Compatibility & Anti-Empty-Reply
Classic pathologies when Gemini is accessed through OpenAI-compatible proxy stations (newapi etc.), fixed automatically:
- Body swallowed by
reasoning_content: some proxies put the actual reply into the reasoning field, leaving artifacts incontent— after the stream ends, if the body is empty while reasoning has substance, the reasoning is promoted to the body (no false positives during the thinking phase) responseprefix artifacts: strayresponse/Response:leftovers at the start of the body — stripped on both streaming and non-streaming paths, even when split across deltas; boundary checks avoid mangling words likeresponses- Truncation: promotion + stripping present the reply in full instead of “answer in the thinking block, half a reply in the body”
Anti-empty-reply (global):
- System prompt into the conversation flow: SYSTEM messages convert in place to user turns (with an acknowledgment turn after the first); lorebook / persona / rolling-summary positions and content stay untouched — bypassing Gemini’s safety blocking of
systemInstruction - Auto-perturb retry: on a reply with no text and no tool calls, the last user message is perturbed (add/remove periods, add space — 4 rotating variants) and retried up to 3 times
Both are off by default; enable in HuaDeng Settings or per assistant.
🔊 Doubao Voice (Volcengine Agent Plan)
- Doubao TTS: Doubao speech-synthesis large model 2.0
seed-tts-2.0resource with 14 built-in 2.0 voice presets (default Cancan 2.0, plus Kuaile Xiaodong, Tianmei Taozi, Gaoleng Yujie, …); any voice ID can be typed manually- Speech-rate control; audio format (mp3/wav/pcm/ogg/opus) and sample rate selectable
- Fully parses Volcengine’s concatenated-JSON chunked streaming responses; long-audio synthesis verified
- The Agent Plan dedicated endpoint is built in as the default; standard-console users can switch back
- Volcengine ASR: Agent Plan
ark-xxxkeys are only valid on the dedicated/api/v3/plan/path — the default URL now points there; standard-console users can change it back in settings - One Agent Plan API key drives both voice input and voice output
Pairs with voice / video calls: one tap on the chat top bar enters the call screen (shown only when both TTS and ASR are configured) — local voice-activity detection → ASR incremental transcription → auto-send → streaming TTS of the reply, interruptible at any time; on hang-up the call folds into an archive card in the conversation.
📱 On-Device Augmentation
Device toolbox (30 tools)
Enable it on an assistant and the AI can call phone system capabilities:
torch · vibrate · volume read/write · brightness read/write · toast · battery · storage · Wi-Fi / audio / telephony / sensor info · share · wallpaper · notifications · alarm / timer · music control · SMS reading · contacts · call log · location · app launching · open URL · media scanning · file download · open file
To save tokens it uses a lazy-discovery meta-tool: only one device_toolbox slot is registered in context. The AI calls action=list to fetch the catalog (parameter schemas + permission status), then action=run to invoke a specific tool.
WeChat Bot / QQ Bot
Connect an existing assistant to a messaging channel (AI, memories, and tools all reused from that assistant):
- WeChat Bot: QR-login with your own WeChat account (iLink protocol); HTTP long-polling receives messages → auto reply; an expired token stops the service with a notification
- QQ Bot: official QQ Open Platform API — enter AppID + AppSecret; WebSocket gateway for real-time send/receive with automatic token refresh
Both are off by default with a privacy risk-confirmation dialog before enabling.
AI proactive messaging
AlarmManager exact alarms + WorkManager fallback; the assistant reaches out at random intervals (configurable range). Generation injects context (time since last chat, current time, battery) and politely skips a trigger while a generation is running. Off by default.
🎨 Appearance & Themes
- Color overrides: 7 custom colors (primary, global text, user / AI / thinking bubbles, chat background, input field; ARGB)
- Bubble beautification: user / AI bubble background images + corner radius + theme-color overlay; drawer background image and chat background image (tinted with the chat background color)
- Fine-grained text colors: separate body / quote / italics colors, with Tavern-orange, warm-gold, rose, coral, lavender, sky-blue and mint presets
- SillyTavern theme import: one-tap import of SillyTavern beautification theme JSONs, bulk-verified against 537 real themes (537/537 parse successfully):
- Layered color compositing: theme tints (
blur_tint→chat_tint→ message bubble tints → background image) are composited source-over into opaque approximations following SillyTavern’s render stack, so transparent-bubble themes no longer collapse into flat color blocks; 8-digit hex parsed per CSS spec as#RRGGBBAA - Background image:
background-imageon#bg1/body/#chatdetected fromcustom_css(URLs auto-downloaded, data URIs decoded) - Bubble styling:
border-radiuson.mes/#chatmaps to bubble corner radius;chat_display=1(bubble mode) enables assistant bubbles automatically - Theme fonts: ttf/otf from
@font-faceare auto-downloaded and set as the chat font (woff/woff2 ignored) - Also:
main_text_color→ global text,quote/italics_text_color→ quote/italics colors,font_scale→ font scale
- Layered color compositing: theme tints (
- Preset palettes + HCT custom themes + dynamic color remain unchanged
🛠 Skills & Tools
Skills
- Automatic triggering: matching keywords inject
SKILL.mdwithout relying on the model - Public skills directory
/Rikkahub/skills: add or remove via any file manager - GitHub one-click install / batch download / update detection: subdirectories and multi-skill repos supported, with source + directory-hash tracking
Tools
New on top of upstream:
| Tool | Description |
|---|---|
file |
Unified file tool: read / write / patch / list / search / copy / move / mkdir / delete |
execute_command |
Shell command on device; returns stdout/stderr/exit code |
execute_python |
Isolated on-device Python execution (Chaquopy) |
calculator |
700+ function calculator (statistics / finance / matrix / calculus / physics) |
database_query |
Read-only SQLite query against the local database |
task_* |
Task list creation / lookup / update / team orchestration |
web_fetch |
HTTP requests to any URL (GET/POST/PUT/PATCH/DELETE) |
present_file |
Share a file via the system share sheet |
read_history_message |
Retrieve the original text of pruned messages (registered when pruning is on) |
device_toolbox |
Lazy-discovery entry point to the 30 device tools |
life_* / shared_* / *_couple_space |
Life hub and couples space operations |
memory_tool / conversation_search / recent_chats |
Memory and conversation retrieval |
judge |
Ask the Jev judge model a yes/no / multiple-choice / rating question (see Jev decisioning) |
There is also a system-prompt assembler (tool-selection guide / work ethics).
Tool-calling compatibility
- DSML text tool-call compat: when a model writes tool calls into the message body instead of using function calling, they are parsed and executed, and the markers are stripped from the body
- Tool alias mapping: DSML-idiomatic names like
web_searchare mapped to the actually-registered name (search_web) - Chinese tool display names: tool calls always show a Chinese name in the UI (
web_search→ 联网搜索,execute_python→ 灵枢演算)
💞 Companionship
Hidable in one tap via HuaDeng Settings → Clean simple mode, which also stops registering the related tools.
- Couples space: bind a partner to unlock the “Rabbit’s Burrow” feed (both sides post, and the AI genuinely replies in the comments), “Our Diary”, and “Anniversaries”
- Life hub: six panels — Today / Cycle & Body / Memos / Calendar reminders / Listen together / Shared reading shelf — which the AI can participate in via tools
🍺 SillyTavern compatibility (aligned with official semantics)
Existing tavern assets migrate directly — parsed with official SillyTavern semantics rather than an approximate conversion:
| Asset type | Compatibility |
|---|---|
| Character cards (PNG / V2 / V3 JSON) | 20+ fields (upstream keeps only 6): example messages, alternate greetings, multilingual notes, post-history instructions, character version, tags, nickname, assets, embedded lorebook, raw extensions JSON… nothing upstream drops is lost — import → export round-trips without data loss |
| Lorebooks | 30+ entry fields, aligned rule by rule with official world-info.js: four secondary-keyword logic modes, whole-word/regex/case, per-entry scan depth, constant activation, cross-book groups + weight + override, trigger probability, sticky / cooldown, delayed activation, recursion controls, budget exemption, character-field matching ×6 |
| Presets | Imported with the official prompt-manager structure and kept in full: entries present in prompts but missing from prompt_order (SillyTavern’s “not in order” area) are imported as disabled entries too; enable state merges both switches, only marker slots are skipped |
| Quick Replies (QR) | QR sets import; run from the slash popup in one tap |
| Beautification themes | Verified against 537 real themes (537/537 parse): layered color compositing, custom_css backgrounds, bubble corner radius, theme fonts |
| HTML display cards | Rendered in-chat, expanded by default with tap-to-fullscreen |
| Frontend-card mode | Conversations with HTML frontend cards can render the whole message area in a single WebView (auto-detected and announced on character-card import) — cards get TavernHelper.triggerSlash / sendMessage / variable access, macros and slash commands work as usual |
| Multiple greetings | Full alternate_greetings import with in-chat switching |
The prompt pipeline follows the official structure too: main prompt, standalone character-field messages, example messages split on `` into real user/assistant turns, PHI appended after history, depth prompts injected at their configured depth and role.
Differences from other Android tavern projects
Searching “Android SillyTavern” surfaces mostly containers or launchers — projects that bundle Node.js with SillyTavern and run it (their descriptions typically use terms such as runner, launcher, container, installer, local Node.js server).
This project is a native implementation: a complete Kotlin + Jetpack Compose client in which the tavern compatibility layer is core code rather than an external wrapper. The differences:
- No Node service to run — no background process holding memory, faster cold start
- Tavern features interoperate with client features: a card’s lorebook can drive plugin tools, the memory system, TTS read-aloud, and the device toolbox
- A complete mobile experience: Material You theming, gestures, notifications, the share sheet
It also addresses two common tavern pain points
- ⚡ Long chats get expensive → Prompt prefix cache optimization removes per-turn divergence points
- 🧠 The AI forgets / the context blows up → Memory & long conversations: semantic RAG + three-layer memory + rolling compression
The tavern core (character-card structure, lorebook engine, Macro Engine 2.0, slash commands, group chats) comes from the
mingli2branch of the intermediate fork heikeyangle-code/rikkahub-plus. This branch (huadeng) adds on top: HTML card rendering, multiple-greetings import, preset & regex import, QR import, lorebook editor field completion + token-budget fallback, Vector Storage semantic entries, a prompt viewer, regex depth limits & caching, and greeting macro substitution.
Switching from Chatbox or another general-purpose AI client?
If you currently use Chatbox (or any other general AI chat client) to talk to APIs, this app is a worthwhile upgrade — the fundamentals are fully covered (multi-provider access, streaming, Markdown / LaTeX / syntax highlighting, chat export, data backup), plus an entire layer Chatbox doesn’t have:
| Chatbox has | This app adds |
|---|---|
| Multi-provider access, streaming | ✅ Yes, plus native Anthropic / Gemini protocols and auto-fix for proxy-station pathologies |
| Chat history | ✅ + semantic memory RAG / three-layer memory — the AI remembers you across sessions, no pasting context manually |
| Full context resent every turn, long chats get expensive | ✅ Prompt prefix cache optimization — long-conversation token cost drops sharply |
| Single interface | ✅ + SillyTavern compatibility (character cards / lorebooks / presets / regex / themes imported with official semantics) |
| No extension mechanism | ✅ QuickJS plugin system + 30 device tools + WeChat / QQ Bots |
| Text chat only | ✅ + voice / video calls (Doubao TTS 2.0 + Volcengine ASR) |
| Cloud sync | ✅ Data stays local, with optional S3 / WebDAV backup |
No “tavern” concepts required as a pure chat client — both routes coexist. Start with it as a plain AI client and import a character card whenever you want.
🔍 Common needs and where they map
| Need | Corresponding feature |
|---|---|
| Find a good Android AI chat app | This project: plug in an API and chat — multi-provider + streaming + voice + memory + plugins |
| Using Chatbox, want memory / roleplay / lower token cost | This project — see Switching from Chatbox |
| Cut long-conversation API cost | Prompt prefix cache optimization — cache hits are billed far below the normal rate |
| The AI keeps forgetting | Semantic memory RAG + three-layer memory + rolling compression, with optional Jev memory screening |
| Use tavern character cards and lorebooks on Android | Cards (V2/V3/PNG), lorebooks (30+ fields), presets, regex, QR, themes — all imported with official semantics |
| Find a SillyTavern client for Android | This project; the tavern compatibility layer is a core module |
| Migrate desktop tavern data to a phone | Six asset types import: cards, lorebooks, presets, regex, QR, themes |
| Mobile tavern performance is insufficient, or Termux setup is undesirable | Native client — no Termux, no Node.js, just install the APK |
| Connect a self-hosted proxy station or third-party API | OpenAI / Anthropic / Google / DeepSeek compatible; the proxy-fix switch cures the common pathologies |
| Extend the AI with custom tools | QuickJS plugin system — write a main.js, zip it, import it |
| Continue conversations from WeChat / QQ | WeChat Bot (QR login), QQ Bot (official API), reusing any assistant’s AI and memory |
| Speech output and voice conversation | Doubao TTS 2.0 + Volcengine ASR, powering voice / video calls |
| Let the AI operate the phone | Device toolbox: 30 tools — torch, volume, SMS, contacts, location, notifications… |
| Privacy | Sanitized request logging, tool-approval boundaries, telemetry off by default, all data stays local |
Search keywords: AI chat app, Android AI client, AI assistant, AI memory, prompt cache, Android SillyTavern, SillyTavern Android client, mobile SillyTavern, tavern client, character card import, lorebook, world info, roleplay AI, AI roleplay, RP client, Android LLM chat, AI chat client, RAG memory, OpenAI-compatible proxy, Chatbox for Android, Chatbox alternative, Chatbox with memory, Chatbox roleplay, Kotlin Jetpack Compose AI app, local AI chat.
🏮 HuaDeng Settings (fork-exclusive)
Settings → HuaDeng Settings collects this fork’s compatibility and helper features on one page. Global switches apply to all assistants (per-assistant switches can override).
Compatibility & helpers
| Switch | Description |
|---|---|
| Proxy fix | Auto-fixes the three classic pathologies of Gemini via OpenAI-compatible proxies (off by default) |
| Anti-empty-reply | Gemini empty-reply auto-perturb retry + system prompt into the conversation flow (off by default) |
| Transient-content pruning | Web-search results, images, audio and video older than two turns stop being sent each request (placeholders carry the message ID) — a large token saving on image- and search-heavy chats |
| Clean simple mode | Hides the couples space, life hub and similar entries, and stops registering their tools — cleaner UI, fewer tokens |
| Rolling context compression | Compresses early messages into a summary when a chat grows long. Turning it off disables auto-compression (per-assistant switches still work) |
| Tool result truncation | Tool output over 32KB is truncated and saved to a file. Try turning it off if a proxy station breaks tool calls |
| System prompt escaping | Converts `` in system messages to HTML entities to bypass proxy WAFs (enable on upstream_content_rejected) |
Access & automation
Five entries: WeChat Bot, QQ Bot, AI proactive messaging, Security settings, and Author’s note.
Security settings (Settings → Security): the global tool-call approval policy — force-confirm all tool calls (confirm before every execution) or auto-approve all tool calls (skip approval; use with caution). They are mutually exclusive. The former is off by default; the latter is on by default.
Jev decisioning
The configuration page for the TypeSafe System One judge model: API base URL / key / model name, a confidence-threshold slider, and the two takeover switches (automatic memory screening, judge tool). See Jev decisioning.
🛡 Privacy & Stability
Privacy hardening
- Sanitized request logging: request-header allowlist, prompt / schema / binary / credential redaction, secret masking and size caps on error messages
- Tool approval boundaries: clipboard / screen-time / shell require approval on every execution; file tools require it for writes; screen-time queries are scope-limited and never expose package names
- Backup-restore resource budget: entry counts and per-entry / total decompression sizes are capped against malicious archives
- Daily file cleanup: chat attachments and generated images can auto-expire by retention days (off by default)
- Firebase telemetry off by default: Google services and Crashlytics only activate with a build property
- Plugin sandbox: see Plugins → Security
Stability
- Foreground-service keep-alive: generation survives app switching
- SSE long-connection hardening: OkHttp 30s PING keep-alive; event-stream requests disable caching and compression so proxies no longer buffer streaming output
- Smooth database upgrades: every schema change ships as an explicit migration — existing data upgrades losslessly; migrations are idempotent
- Consistent-snapshot backup import with safe startup recovery, PickVisualMedia image picking, and many fixes
📦 Download
| Channel | Description |
|---|---|
| Stable | Versioned releases (2.5.6.N; historical versions used 2.5.4fixN — installs upgrade over them directly) on Releases |
| Nightly | Actions build twice daily (skipped if no commit in the past 24h) and overwrite the nightly prerelease; versions advance by date (2.5.6.YYYYMMDD) |
| Manual builds | Every push produces an APK artifact on Actions (build page → Artifacts → rikkahub-plus-fresh; sign-in required) |
| In-app update | Settings → About → Check for updates (GitHub Releases API, with a mainland-China-reachable mirror fallback) |
Only a single
arm64-v8aAPK is published, supporting Android 8.0 (API 26) and above.
✅ Relationship to upstream
- Everything preserved: Material You theming, multi-provider support, streaming, conversation forking & regeneration, message edit / delete / translate, full-text search (jieba), favorites, image generation, TTS / ASR, MCP, workspace sandbox (multi-tab terminal + shell compatibility mode), backup (S3 / WebDAV), web chat endpoint, and chat export all work as before
- Already merged with upstream:
rikkahub/rikkahubmaster v2.5.6 (2026-10, includes the provider advanced-settings tab with custom request headers, memory copying when duplicating an assistant, the MCP OAuth callback moving to localhost to dodge WAF 403s,$refinlining for MCP tool input schemas, Gemini Interactions API support, Claude Opus/Sonnet 5.5 and Gemini 4 model registry entries, per-provider model-list collapsing, thechart_displaylocal tool, and an export option that omits reasoning) - Versus the intermediate mingli2 branch: beyond tavern enhancements, this branch adds prompt prefix caching, semantic memory RAG & rolling compression, Jev decisioning, proxy-station compatibility & anti-empty-reply, Doubao voice, and privacy hardening
- New since v2.5.6: the academic system moved out of the app into a plugin, the calories & protein plugin, session-aware HTTP and image decoding in the plugin sandbox, detail-page data cards, the update check moving to the GitHub Releases API, Jev decisioning, and a fix for the proactive-message foreground service crashing on startup
- Merging upstream: see the conflict handbook in DIVERGENCE.md
🤝 Contributions welcome
Contributions are always welcome! Bug reports, suggestions, and code are all appreciated:
- Bug reports / suggestions: Issues
- Code: just Fork + PR — no permission needed
🙏 Credits
This project stands on the shoulders of others:
| Project | Relationship | License |
|---|---|---|
| rikkahub/rikkahub | Original upstream — all base functionality comes from it | AGPL-3.0 |
| heikeyangle-code/rikkahub-plus | Direct upstream (intermediate fork) — author of the tavern system, macro engine, slash commands, group chats | AGPL-3.0 |
| sue1231513/orangechat | Same-origin fork — this project introduced couples space / life hub / three-layer memory / chat appearance customization / QuickJS plugin system from it and its downstream | AGPL-3.0 |
| lingwangshu018/Tumin | Downstream of orangechat — see above | AGPL-3.0 |
| ExTV/rikkahub-agent | Same-origin fork — reference for some device-toolbox implementations | AGPL-3.0 |
| YaeNovin/Rikkahub-Revised | Same-origin fork — this project ported semantic memory RAG and rolling context compression from it | AGPL-3.0 |
| SillyTavern/SillyTavern | The compatibility target; the semantics and format specs of cards / lorebooks / macros / slash commands follow its official implementation (AGPL-3.0). No code was copied from it | AGPL-3.0 |
This repository and its upstreams are all AGPL-3.0 licensed; this fork continues under the same license. Copyright of each upstream project belongs to its authors — thank you for open-sourcing.
中文介绍:README_CN.md —— 安卓上的 AI 聊天客户端,兼为 SillyTavern(酒馆)安卓兼容端:角色卡 / 世界书 / 预设 / 正则 / 美化主题按官方语义一键导入,无需 Termux 或 Node.js。搜「安卓 酒馆」「SillyTavern 安卓」即可找到本项目。
Recommended Tools
Try a different keyword or remove a filter.
Install
npx skillfish add miaowunya/rikkahub-sillytavern-android