Find a file
RainbowBird febfd707ff
Some checks are pending
CI / Unit Test (push) Waiting to run
CI / Type Check (push) Waiting to run
CI / Check Provenance (push) Waiting to run
CI / Build Test (stage-tamagotchi-godot) (push) Waiting to run
CI / Build Test (stage-web) (push) Waiting to run
CI / Build Test (ui-loading-screens) (push) Waiting to run
CI / Build Test (ui-transitions) (push) Waiting to run
CI / Lint (push) Waiting to run
CI / Build Test (stage-tamagotchi) (push) Waiting to run
Crowdin upload changed translations / upload-translations-to-crowdin (push) Waiting to run
Cloudflare Pages (Auth UI) / Deploy - ui-server-auth (push) Waiting to run
Cloudflare Workers / Build - docs (push) Waiting to run
Cloudflare Workers / Deploy - stage-web (push) Blocked by required conditions
E2E Test - Tamagotchi (Linux) / X11 window render (Xvfb) (push) Waiting to run
E2E Test - Tamagotchi (Linux) / Wayland window render (weston headless) (push) Waiting to run
Update Nix assets Hash / update (push) Waiting to run
Update Nix pnpmDeps Hash / update (push) Waiting to run
feat(stage-ui,stage-layouts): add character voice volume control to the mobile settings drawer (#2953)
## Summary

The mobile settings drawer offered only an on/off switch for the
character voice. There was no way to lower the volume without disabling
speech synthesis entirely.

This PR adds a persistent playback volume (0–1) next to the existing
mute flag, applies it to the Stage speech gain node, and replaces the
drawer checkbox with a mute button plus a volume slider. Dragging the
slider to 0 mutes (stops synthesis); dragging away from 0 while muted
restores the voice. Tapping the speaker icon toggles mute and keeps the
volume value.

## Change map

| Module | Before | After | Description |
| --- | --- | --- | --- |
| Speech output control store | Persisted only `speechMuted` | Also
persists `speechVolume` with a clamped setter | `useLocalStorage`
propagates the value across windows through storage events |
| Stage speech playback | Gain node ran at unity |
`speechDestination.gain` follows `speechVolume` via `setTargetAtTime` |
One wiring point covers stage-web and stage-tamagotchi; the 50 ms
smoothing avoids clicks while dragging |
| Mobile settings drawer | "Character voice" row with a checkbox |
Speaker icon (mute toggle, three icon states) plus an iOS-style slider |
The slider reuses `@proj-airi/ui` `Range` with CSS variable overrides
scoped to the drawer; the shared component is unchanged |

## Boundaries and risks

| Invariant or boundary | Failure mode | Protection | Evidence or gap |
| --- | --- | --- | --- |
| Mute stops synthesis, volume only scales playback | Users could pay
for silent TTS after dragging to 0 | The drawer setter mutes at 0 and
unmutes above 0 | Browser-verified: Home key set `{volume: 0, muted:
true}`, ArrowRight set `{volume: 0.01, muted: false}` |
| Volume stays in the 0–1 gain range | Out-of-range writes distort or
silence output | `setSpeechVolume` clamps |
`speech-output-control.browser.test.ts` covers clamping and persistence
|
| Unmuting at volume 0 produces silence | Confusing no-sound state |
Icon shows the muted state whenever volume is 0, so the row explains
itself | Manual reasoning; no automated UI test |
| Voice message playback and other audio paths | Unintended volume
coupling | Only the Stage `speechDestination` gain reads `speechVolume`;
other players are untouched | Code inspection of `BrowserPlayback`
wiring in `Stage.vue` |

## Verification

```text
pnpm -F @proj-airi/stage-ui exec vitest run src/stores/speech-output-control.browser.test.ts  # 3 passed
pnpm -F @proj-airi/stage-layouts exec vitest run                                              # 10 passed, 7 failed
pnpm -F @proj-airi/stage-ui typecheck                                                         # passed
pnpm -F @proj-airi/stage-layouts typecheck                                                    # passed
pnpm typecheck                                                                                # 54/54 tasks passed
pnpm exec eslint <4 changed files>                                                            # 0 errors
```

- The 7 failures in `use-chat-interruption.test.ts` reproduce on a clean
`main` checkout (`localStorage.getItem is not a function` in the test
environment) and are unrelated to this change.
- Runtime checks used Chromium at 390×844 with seeded local storage:
slider drag persists `settings/speech/output-volume`, the mute button
toggles `settings/speech/output-muted` and keeps the volume value, and
the mute icon has three states (muted, low, loud).
- Not verified: real device iOS Safari, audible output level.

## Visual changes

Mobile settings drawer, 390×844, stage-web:

| Before | After |
| --- | --- |
|
![](https://github.com/user-attachments/assets/ff6c1730-f4e7-4b81-abaf-b69510e6378a)
|
![](https://github.com/user-attachments/assets/bb430d51-43ea-4497-92d2-716f166080e1)
|
| Dark, checkbox row | Dark, mute icon + volume slider at 65% |
|
![](https://github.com/user-attachments/assets/9a4bd7a6-38df-4a2e-9bc3-7ca36a794be5)
|
![](https://github.com/user-attachments/assets/c367d2aa-79f1-4e19-abf4-c602c848b0ce)
|
| Light, checkbox row | Light, mute icon + volume slider at 65% |
2026-10-14 20:25:14 +08:00
.agents/skills feat(stage-ui,stage-tamagotchi): trace spoken turns from the wake word to playback (#2939) 2026-10-13 21:56:02 +08:00
.claude feat(skills): add symlink to agent skills directory 2026-10-03 20:58:18 +08:00
.cursor/commands feat(ci): lint swift code 2026-01-02 23:49:01 +08:00
.gemini chore: disable gemini review 2026-05-16 17:27:26 +08:00
.github fix(server): change the Railway source branch with a project token (#2940) 2026-10-12 23:36:33 +08:00
.vscode chore(deps): bump dependencies 2026-08-26 19:47:20 +08:00
.zed chore(workspace): added Zed editor config 2026-01-30 16:56:50 +08:00
apps feat(stage-ui,stage-layouts): add character voice volume control to the mobile settings drawer (#2953) 2026-10-14 20:25:14 +08:00
bucket fix(bucket): update Scoop manifest to v0.9.0-alpha.18 (#1430) 2026-03-20 23:45:26 +08:00
deploy/openpanel refactor(analytics): replace PostHog with OpenPanel (#2480) 2026-09-09 08:26:18 +00:00
docs feat(stage-ui): add speaker tracker runtime (#2975) 2026-10-14 20:31:26 +09:00
engines/stage-tamagotchi-godot release: v0.12.0-beta.5 2026-08-30 02:31:30 +08:00
integrations fix(minecraft): explain AIRI authentication failures (#2750) 2026-10-03 22:57:27 +00:00
nix chore(nix): update pnpmDeps hash (#2977) 2026-10-14 11:54:15 +00:00
packages feat(stage-ui,stage-layouts): add character voice volume control to the mobile settings drawer (#2953) 2026-10-14 20:25:14 +08:00
patches chore(deps): update xsai to 0.5.1 and trim patch (#2736) 2026-09-30 08:45:00 +00:00
plugins feat(stage-tamagotchi,stage-ui): control Home Assistant through typed tools (#2865) 2026-10-08 18:16:35 +08:00
scripts chore(docs): move the documentation site to moeru-ai/airi-docs (#2924) 2026-10-12 14:30:33 +08:00
server fix(api): grant only the RevenueCat subscriptions of the deployment environment (#2970) 2026-10-14 17:26:08 +08:00
services/computer-use-mcp docs(AGENTS.md): perform housekeeping on agent-facing docs (#2678) 2026-09-28 01:24:04 +08:00
.dockerignore chore(docs): move the documentation site to moeru-ai/airi-docs (#2924) 2026-10-12 14:30:33 +08:00
.editorconfig
.gitattributes fix(ci): min-integrity: none for safeoutput mcp call (#1645) 2026-04-12 18:02:58 +08:00
.gitignore feat(hearing): add Sherpaw recognition across apps (#2550) 2026-09-28 21:58:29 +08:00
.prototools chore(ci): added Godot vscode extension recommendation, and .prototools for managing dotnet versions 2026-04-23 02:19:44 +08:00
.tool-versions fix(stage-layouts): fix iOS keyboard closing right after opening (#2436) 2026-09-02 12:21:51 +08:00
AGENTS.md chore(skills): add the enforce-rules-for-i18n skill (#2805) 2026-10-06 00:36:17 +08:00
alint.config.ts Revert "style: lint" 2026-08-26 20:13:10 +08:00
bump.config.ts Revert "style: lint" 2026-08-26 20:13:10 +08:00
CLAUDE.md chore(docs): replace CLAUDE.md symlink with @AGENTS.md reference (#1455) 2026-03-23 13:56:52 +08:00
crowdin.yml
cspell.config.yaml chore(cspell): update config (#2427) 2026-08-31 11:10:47 +00:00
default.nix
DESIGN.md docs(ui): define AIRI design conventions with the DESIGN.md format (#2689) 2026-09-28 14:52:15 +00:00
eslint.config.ts chore(lint): add eslint-plugin-slop (#2544) 2026-09-15 03:49:40 +08:00
flake.lock fix(pnpm): allow releases within the minimum release date cutoff for trusted packages (#2236) 2026-08-08 15:30:02 +00:00
flake.nix chore(nix): update xorg attributes to top-level (#2037) 2026-07-10 01:24:10 +00:00
knip.json perf: setup knip, remove unused dependencies (#992) 2026-01-24 15:08:08 +08:00
LICENSE
package.json chore(docs): move the documentation site to moeru-ai/airi-docs (#2924) 2026-10-12 14:30:33 +08:00
pnpm-lock.yaml feat(stage-ui): add speaker tracker runtime (#2975) 2026-10-14 20:31:26 +09:00
pnpm-workspace.yaml feat(stage-ui): add speaker tracker runtime (#2975) 2026-10-14 20:31:26 +09:00
README.md chore(docs): move the documentation site to moeru-ai/airi-docs (#2924) 2026-10-12 14:30:33 +08:00
rustfmt.toml
skills-lock.json chore(.agents/skills): update existing skills 2026-08-05 20:46:16 +08:00
sponsorkit.config.js chore(docs): move the documentation site to moeru-ai/airi-docs (#2924) 2026-10-12 14:30:33 +08:00
tsconfig.json chore(pocket): exclude build and public folder in tsconfig 2026-05-04 19:47:38 +08:00
turbo.json chore: optimize typecheck execution (#2499) 2026-09-10 00:03:27 +08:00
uno.config.ts revert(stage-tamagotchi): restore bundled CJK fonts 2026-10-05 16:48:31 +08:00
vite-env.d.ts feat(api,stage-ui): add the Capacitor, a subscription store of Flux (#2813) 2026-10-11 01:18:20 +08:00
vitest.config.ts test: include pipelines audio in root vitest projects (#2419) 2026-10-02 08:02:32 +00:00

Project AIRI

Re-creating Neuro-sama, a soul container of AI waifu / virtual characters to bring them into our world.

[Join Discord Server] [Try it] [简体中文] [日本語] [Русский] [Tiếng Việt] [Français] [한국어]

AIRI - A container of cyber living souls, re-creation of Neuro-sama | Product Hunt moeru-ai%2Fairi | Trendshift AIRI - #1 repository of the week across all languages | Trendshift

Heavily inspired by Neuro-sama

Tip

On Windows, you can also install AIRI with winget:

winget install MoeruAI.AIRI

Or install AIRI with Scoop:

scoop bucket add airi https://github.com/moeru-ai/airi
scoop install airi/airi

On macOS, you can install AIRI with Homebrew Cask without adding a custom tap:

brew install --cask airi

Warning

Attention: We do not have any officially minted cryptocurrency or token associated with this project. Please check the information and proceed with caution.

Note

We've got a whole dedicated organization @proj-airi for all the sub-projects born from Project AIRI. Check it out!

RAG, memory system, embedded database, icons, Live2D utilities, and more!

Tip

You can translate AIRI on Crowdin, or open a pull request that changes packages/i18n/src/locales/. Both ways update the same translations.

Do not submit a translation that is the same as the English text. Review rejects it. A string without a translation shows the English text.

Crowdin | Agile localization for tech companies

Have you dreamed about having a cyber living being (cyber waifu, digital pet) or digital companion that could play with and talk to you?

With the power of modern large language models like ChatGPT and famous Claude, asking a virtual being to roleplay and chat with us is already easy enough for everyone. Platforms like Character.ai (a.k.a. c.ai) and JanitorAI as well as local playgrounds like SillyTavern are already good-enough solutions for a chat based or visual adventure game like experience.

But, what about the abilities to play games? And see what you are coding at? Chatting while playing games, watching videos, and is capable of doing many other things.

Perhaps you know Neuro-sama already. She is currently the best virtual streamer capable of playing games, chatting, and interacting with you and the participants. Some also call this kind of being "digital human." Sadly, as it's not open sourced, you cannot interact with her after her live streams go offline.

Therefore, this project, AIRI, offers another possibility here: let you own your digital life, cyber living, easily, anywhere, anytime.

Recent DevLogs & Stories

What's So Special About This Project?

Unlike the other AI driven VTuber open source projects, アイリ was built with support of many Web technologies such as WebGPU, WebAudio, Web Workers, WebAssembly, WebSocket, etc. from the first day.

Tip

Worrying about the performance drop since we are using Web related technologies?

Don't worry, while the Web browser version is meant to give an insight into how much we can push and do inside browsers and webviews, we will never fully rely on this. The desktop version of AIRI is capable of using native NVIDIA CUDA and Apple Metal by default (thanks to HuggingFace & the beloved candle project), without any complex dependency management. Considering the tradeoff, it is partially powered by Web technologies for graphics, layouts, animations, and the WIP plugin system for everyone to integrate things.

This means that アイリ is capable of running on modern browsers and devices and even on mobile devices (already done with PWA support). This brings a lot of possibilities for us (the developers) to build and extend the power of アイリ VTuber to the next level, while still leaving the flexibility for users to enable features that require TCP connections or other non-Web technologies such as connecting to a Discord voice channel or playing Minecraft and Factorio with friends.

Note

We are still in the early stage of development where we are seeking out talented developers to join us and help us to make アイリ a reality.

It's ok if you are not familiar with Vue.js, TypeScript, and devtools required for this project, you can join us as an artist, designer, or even help us to launch our first live stream.

Even if you are a big fan of React, Svelte or even Solid, we welcome you. You can open a sub-directory to add features that you want to see in アイリ, or would like to experiment with.

Fields (and related projects) that we are looking for:

  • Live2D modeller
  • VRM modeller
  • VRChat avatar designer
  • Computer Vision
  • Reinforcement Learning
  • Speech Recognition
  • Speech Synthesis
  • ONNX Runtime
  • Transformers.js
  • vLLM
  • WebGPU
  • Three.js
  • WebXR (checkout the another project we have under the @moeru-ai organization)

If you are interested, why not introduce yourself here? Would like to join part of us to build AIRI?

Current Progress & Roadmap

Capable of

  • Brain
  • Ears
    • Audio input from browser
    • Audio input from Discord
    • Client side speech recognition
    • Client side talking detection
  • Mouth
    • Multi-provider voice synthesis, including ElevenLabs, Microsoft/Azure Speech, OpenAI-compatible TTS, Alibaba Cloud Model Studio, and local Kokoro TTS
  • Body
    • VRM support
      • Control VRM model
    • VRM model animations
      • Auto blink
      • Auto look at
      • Idle eye movement
    • Live2D support
      • Control Live2D model
    • Live2D model animations
      • Auto blink
      • Auto look at
      • Idle eye movement

Development

For detailed instructions to develop this project, follow CONTRIBUTING.md

Note

By default, pnpm dev will start the development server for the Stage Web (browser version). If you would like to try developing the desktop version, please make sure you read CONTRIBUTING.md to setup the environment correctly.

pnpm i
pnpm dev

Stage Web (Browser Version at airi.moeru.ai)

pnpm dev

Stage Tamagotchi (Desktop Version)

pnpm dev:tamagotchi

A Nix package for Tamagotchi is included. To run airi with Nix, first make sure to enable flakes, then run:

nix run github:moeru-ai/airi

NixOS

Electron requires shared libraries that aren't in standard paths on NixOS. Use the FHS shell defined in flake.nix:

nix develop .#fhs
pnpm dev:tamagotchi

Stage Pocket (Mobile Version)

Start the development server for the capacitor:

pnpm dev:pocket:ios --target "<DEVICE_ID_OR_SIMULATOR_NAME>"
# Or
CAPACITOR_DEVICE_ID_IOS="<DEVICE_ID_OR_SIMULATOR_NAME>" pnpm dev:pocket:ios

Quote the target: simulator names such as iPhone 16 Pro contain spaces.

You can see the list of available devices and simulators by running pnpm -F @proj-airi/stage-pocket exec cap run ios --list. @capacitor/cli is declared in apps/stage-pocket, so cap does not resolve from the repository root.

If you need to connect server channel on pocket in wireless mode, you need to start tamagotchi as root:

sudo pnpm dev:tamagotchi

Then enable secure websocket in tamagotchi settings/connections.

Documentation Site

The documentation site lives in moeru-ai/airi-docs.

Publish

Run bumpp to update the monorepo version:

npx bumpp --no-commit --no-tag

Support of LLM API Providers (powered by xsai)

Sub-projects Born from This Project

flowchart LR
  subgraph Apps[Stage applications]
    Web[stage-web]
    Desktop[stage-tamagotchi]
    Pocket[stage-pocket\nexperimental]
  end

  subgraph Shared[Shared product packages]
    StageUI[stage-ui]
    Domain[core-agent\ncore-character]
    Audio[pipelines-audio]
    Renderers[stage-ui-live2d\nstage-ui-three and renderers]
    SDK[server-sdk\nserver-shared]
  end

  subgraph Channel[Desktop server channel]
    Runtime[server-runtime]
  end

  subgraph Integrations[Source-configured integrations]
    Discord[discord-bot]
    Minecraft[minecraft-bot]
    Other[Telegram, Factorio, MCP, and others]
  end

  subgraph Hosted[Hosted backend]
    Edge[Caddy]
    API[api-server]
    Auth[auth-server]
    Database[(PostgreSQL)]
    Cache[(Redis)]
  end

  Web --> StageUI
  Desktop --> StageUI
  Pocket --> StageUI
  StageUI --> Domain
  StageUI --> Audio
  StageUI --> Renderers
  StageUI --> SDK
  Desktop --> Runtime
  SDK <-->|server channel| Runtime
  Discord --> SDK
  Minecraft --> SDK
  Other -. optional .-> SDK
  Edge --> API
  Edge --> Auth
  API --> Database
  API --> Cache
  Auth --> Database
  Auth --> Cache

Similar Projects

Open sourced ones

Non-open-sourced ones

Project Status

Repobeats analytics image

Acknowledgements

Supporters

Thank you for supporting Project AIRI through OpenCollective, Patreon, and Ko-fi.

Project AIRI supporters

Special Thanks

Special thanks to all contributors for their contributions to Project AIRI ❤️

Star History

Star History Chart