Repository navigation
Releases: SyntaxNyah/ferris-ao-switch
Release list
Ferris-AO Switch v1.05
Ferris-AO Switch — v1.05
First stable release. A Nintendo Switch homebrew client for
Attorney Online 2. Connect to any standard AO2
server, pick a character, and play — characters, backgrounds, music and sound all
stream from the server, so there is nothing to pre-download.
Runs as a single .nro on real modded hardware (Atmosphère) and on the Ryujinx
emulator — the same binary.
Fixed in this release
- Music plays. BGM is now decoded up front and played through the mixer's
working channel path. The streaming-music path is silent on the Switch's
SDL2_mixer build, so Opus tracks (the AO norm) came out silent before. - Blips & SFX play. Opus sound effects are decoded directly with libopusfile
(the bundled mixer mis-detects Opus as Vorbis and dropped them). - Audio opens at the Switch's native 48 kHz (opening at 44.1 kHz played as
silence, worst on Ryujinx). - No more crash on disconnect/kick. A packet-buffer bug crashed the client
whenever a server dropped it mid-message (e.g. an Akashi "you are sending
messages too quickly" kick). Fixed.
Install — modded Switch (Atmosphère)
Copy ferris-ao-switch.nro to /switch/ on your SD card and launch it from the
Homebrew Menu. No firmware keys, title install, or base pack required.
Running on Ryujinx
Check these three settings — otherwise you get no network, no typing, or no sound:
- Internet access ON — Options → Settings → System → Enable Internet Access.
Required to reach servers and stream assets. - Keyboard input ON — Options → Settings → Input → Enable Keyboard. Lets you
type into IC/OOC with your computer keyboard. - Audio Backend not
Dummy— Options → Settings → Audio → Audio Backend →
SDL3 (or SoundIO / OpenAL).Dummyproduces no sound for any game.
Then load the .nro via File → Load Application from File…
Unofficial homebrew — not affiliated with the official Attorney Online project or
Nintendo.
Ferris-AO Switch v1.00
🦀 Ferris-AO Switch — v1.00
Attorney Online 2, running natively on your Nintendo Switch. First 1.0 release — the client is now fully playable end to end: connect, pick a character, and actually hold court with a keyboard that doesn't freeze and chat that flows live.
Runs as a single .nro on real modded hardware (Atmosphère) and on the Ryujinx emulator — same binary. Characters, backgrounds, music and sounds all stream from the server, so there's nothing to pre-download.
🔧 Hotfix
The v1.00 download has been updated with three fixes:
- 🔊 Audio works now. The mixer was opening at 44.1 kHz, but the Switch runs audio at 48 kHz natively — the resample was coming out silent (worst on Ryujinx). It now opens at 48 kHz, so blips / shout SFX / music actually play.
- ⌨️ USB / host keyboard types. A physical keyboard (incl. Ryujinx's, with keyboard input enabled) now types straight into the IC/OOC composer — read directly from the Switch HID keyboard. The on-screen keyboard still handles touch / mouse / controller.
- 🎯 Composer layout. The message box no longer overlaps the Flip / Realization / Screenshake toggles.
Follow-up pass:
- 🎵 Opus music plays. Server music is Opus, which SDL_mixer's auto-detector kept misreading (Opus rides in the same
OggScontainer as Vorbis) → silence. The player now forces the Opus decoder by file extension, so BGM actually streams.- ⌨️ No more double letters. On Ryujinx the physical keyboard reached both SDL and the new HID poll, so every key typed twice — HID is now the sole physical-keyboard source on Switch.
- 🔁 Change Character button. A small Char button in the courtroom HUD jumps straight back to character select.
- 🎭 More mislabeled sprites fixed. Animated GIFs shipped with a
.webpname (e.g. Tyrell Badd) now get correct transparency on every load path, not just when they happened to be pre-cached.- 🔌 Fewer random disconnects. Added a proactive
CHkeep-alive every 15 s — servers that never send their ownCHECKping were silently timing out the socket during idle. Long sessions stay connected now.
🎉 What's new since v0.5
- ⌨️ In-app keyboard that doesn't freeze the game. Typing used to open the blocking system keyboard, which froze the whole client — incoming messages piled up and only appeared after you sent one. The IC/OOC keyboard is now an on-screen keyboard the app draws itself, so chat keeps flowing live while you type. Works with touch (handheld), mouse (Ryujinx), controller (D-pad cursor + A/B — so it works docked), and a USB keyboard.
- ⭐ Send shouts & effects. The IC composer can now SEND Objection! / Hold It! / Take That! / Custom shouts, plus Flip, Realization, and Screenshake — not just receive them.
- 🔍 Navigate huge rosters. The character grid zooms (32 → 220 per page via on-screen
− / +) and has a right-edge scrollbar you drag to jump — built for 3000+ character servers. - 🧹 OOC chat fixed. The OOC log no longer overlaps itself on long lines — entries stack cleanly by their real height.
- ⚡ Much faster on big HTTPS/Cloudflare servers. Fixed a connection bug that did a fresh TLS handshake on every file; now the workers keep warm connections and stream back-to-back. Plus off-thread image decode and a smarter, WebP-first, self-learning asset probe.
- 🐦 Mislabeled assets handled. Old GIF sprites shipped with a
.webpname (e.g. Polly) no longer render as a "giant pink screen," and WebP emote buttons load correctly.
Feature highlights
- Full IC gameplay — animated idle/talk sprites, pre-animations, typewriter text with the AO2 colour palette, shouts, realization, screenshake, pairing (rendered), an always-on IC log.
- Server browser + direct connect (TCP /
ws:/// securewss://). - Character search/filter, music & rooms/areas panels, OOC chat, evidence viewer, HP bars, narrator mode.
- Themes — drop any AO2
courtroom_design.initheme on the SD card and pick it. - Streams everything from the server's CDN — no base pack required (optional local pack supported).
Full feature list
Connecting — public server browser (configurable master URL); direct host/port/username; TCP, WebSocket, secure WebSocket (TLS); akashi/tsuserver/Ferris-AO compatible; clean reconnect.
Characters — zoomable grid for thousands of chars; instant name search; streamed icons; taken-dimming; narrator mode.
IC — typewriter + word-wrap; 10 AO2 colours; custom/character shownames; idle/talk + pre-anims; Objection!/Hold It!/Take That!/Custom shouts; Flip / Realization / Screenshake; pairing; positions; always-on word-wrapped IC log.
Text entry — non-blocking on-screen keyboard (touch / mouse / controller / USB keyboard).
Panels — OOC chat (own-message highlight, clean wrap); music list (play any track, now-playing, crossfade); evidence viewer; rooms/areas with live counts/status/lock (ARUP); HP bars.
Audio — per-character blips, message & shout SFX, crossfading BGM, separate SFX/music volumes.
Assets — HTTP/HTTPS streaming (no base pack); four-tier resolution (CDN → community CDN → local → bundled); persistent disk cache; WebP-first learned probing; off-thread decode; decoded-animation cache; keep-alive connection reuse; content-based format detection.
Themes/settings — courtroom_design.ini themes (live switch, auto-scaled); persistent showname/theme/master-URL/volumes.
Input/display — touchscreen (tap + drag); Joy-Con/Pro Controller; on-screen + USB keyboard; 1280×720 docked & handheld, hardware-accelerated.
Why it's so fast
The render loop never waits on anything: 8 worker threads fetch and decode assets off the main thread, the client probes WebP-first and learns each server's format (so it asks for one file, not five), reuses warm HTTPS connections, and caches decoded sprites in memory + raw files on the SD card. The payoff — it stays responsive even on 3000+ file servers, and a repeat visit is nearly instant.
Installing
Modded Switch (Atmosphère): download ferris-ao-switch.nro, copy it to /switch/ on your SD card, open the Homebrew Menu, and launch Ferris-AO.
Ryujinx: download ferris-ao-switch.nro, drag it onto Ryujinx (or File → Load Application from File…), and make sure internet access is enabled.
No firmware keys, no title install, no base pack.
Controls
| Where | Controls |
|---|---|
| Connect | L/R tabs · A connect/edit · R refresh |
| Character select | D-pad move · A pick · Y/F/tap search · on-screen − / + zoom · drag the scrollbar to jump |
| Courtroom | X IC composer · L OOC · R Music · Y Evidence · − Rooms · ←/→ emote · A quick-talk · + leave |
| Keyboard | tap keys, or D-pad cursor + A press + B cancel (docked) |
⚠️ Known limitations
- Evidence is viewable but not yet attachable to a message; pair-up partner picker, judge/CM controls and mod-calls aren't wired into the UI yet.
- Build-tested; please report anything odd on the repo.
Credits
Created by SyntaxNyah, for the Attorney Online community, devkitPro and SDL2. You can fork it, do what you like with it, just obey the AGPL guidelines.
Unofficial homebrew — not affiliated with the official Attorney Online project or Nintendo.
Ferris-AO Switch v0.5 — First Public Release
Ferris-AO Switch — v0.5 (First Public Release!)
Attorney Online 2, running natively on your Nintendo Switch.
Ferris-AO Switch is a homebrew client for Attorney Online 2 — the same courtroom roleplay you know from the desktop and web clients, now as a single .nro you can launch right from the homebrew menu. Hold court in handheld mode on the couch, or play docked with a Pro Controller. No PC required, and no base pack to download — characters, backgrounds, music and sounds all stream straight from the server.
Written from scratch in C++17 on devkitPro + SDL2. Same binary runs on real Switch hardware (Atmosphère) and the Ryujinx emulator.
Highlights
Full courtroom gameplay
- Animated character sprites — idle, talking, and pre-animations (GIF / APNG / animated WebP)
- Typewriter IC messages with word-wrap and the full AO2 text-colour palette
- OBJECTION!, Hold It!, Take That! shout bubbles, realization flash, and screenshake
- Character pairing (two characters side-by-side with offsets + flip)
- Always-on IC scrollback log so you never miss a line
- HP bars, music now-playing strip, and narrator mode
Everything you need to play
- Server browser — pulls the live public server list; pick one and connect
- Direct connect for private/unlisted servers (TCP,
ws://, and securewss://) - Character search — filter a 600-, 3000-, even 3800-character roster by name in seconds
- Music, OOC chat, evidence, and room/area switching panels
- Themes — drop any AO2
courtroom_design.initheme folder on your SD card and pick it in Settings - Custom showname, master-server URL, and volume — all saved across launches
Built to feel fast and not sloggy
- Assets stream on 8 background threads and decode off the render thread, so the courtroom never stalls on the network
- WebP-first smart format probing that learns what each server uses (and remembers it next time)
- An in-memory decode cache plus an on-disk cache, so anyone who just spoke re-appears instantly and revisits load from the SD card with zero network
- Keep-alive HTTPS connection reuse — comfortably handles big Cloudflare-hosted servers with 3000+ files
Controls
- Touchscreen in handheld — tap buttons/lists, drag to scroll, tap-to-talk
- Joy-Con & Pro Controller — full button mapping
- System keyboard for all text entry
Complete feature list
Click to expand the full list
Connecting
- Public server browser (live master list; configurable master-server URL)
- Direct connect by host / port / username
- TCP, WebSocket (
ws://), and secure WebSocket (wss://, TLS) — auto-detected from the address - Compatible with akashi, tsuserver, Ferris-AO and other standard AO2 servers
- Full AO2 handshake; reconnects cleanly on disconnect
Characters
- 8×4 character grid, paged, supporting huge rosters (thousands of characters)
- Name search / filter (instant, case-insensitive)
- Taken characters dimmed; streamed character icons; per-character
char.ini(name, showname, emotes, blips) - Narrator mode (talk with no character)
In-Character messaging
- Typewriter text with word-wrap
- 10 AO2 text colours (white, green, red, orange, blue, yellow, pink, cyan, grey, rainbow)
- Custom or character shownames
- Idle / talking sprite animation, pre-animations
- Shout bubbles — Objection!, Hold It!, Take That!, and custom
- Realization flash, screenshake, horizontal flip, desk / no-desk
- Pairing — partner character drawn alongside with independent offset + flip
- Position support (
wit,def,pro,jud,hld,hlp,jur,sea) - Always-on IC log — word-wrapped, colour-coded scrollback you can scroll through
- Tap-to-talk bar with inline
< >emote arrows (fire lines back-to-back) - IC composer — emote grid with thumbnails, live sprite preview, colour swatch, position
Other panels
- OOC chat — send + scrollable log, with your own messages highlighted
- Music — full server track list, play any track, now-playing strip, crossfade (OGG/MP3/Opus)
- Evidence — viewer with thumbnails
- Rooms / Areas — live player counts, status, CM and lock state (ARUP); hop rooms without reconnecting
- HP bars — defense & prosecution (0–10)
Audio
- Per-character typewriter blips, message SFX, and shout SFX
- Background music with crossfade
- Separate SFX / music volume controls
Assets & streaming
- HTTP & HTTPS streaming from the server's CDN (
ASS) — no base-pack download needed - Four-tier resolution: prefetch cache → server CDN → community base CDN → local
sdmc:base → bundledromfs: - Optional local base pack (
sdmc:/switch/ferris-ao/base/) with on-screen "detected" indicator - Persistent on-disk cache (per-URL) — revisits load from SD with no network
- WebP-first smart probing + learned format per server (remembered across visits)
- Off-thread image decode (workers decode; render thread only uploads)
- Decoded-animation cache (recently-seen sprites re-show instantly)
- Keep-alive connection reuse; 8-thread async prefetch; content-based format detection (handles mislabeled files like GIF-as-
.webp) - Formats: PNG, APNG, GIF, WebP (static & animated)
Themes & settings
- Standard AO2
courtroom_design.initheme support — drop a theme folder on the SD card and pick it; live switching; auto-scaled to 1280×720; readscourtroom_sounds.ini - Persistent settings (
config.ini): custom showname, theme, master-server URL, SFX/music volumes
Input & display
- Touchscreen (tap + finger drag-scroll), Joy-Con / Pro Controller, system keyboard, plus mouse/keyboard on Ryujinx
- 1280×720 native, docked & handheld; hardware-accelerated, vsync; full-screen stage with overlaid HUD
Under the hood
- The render loop never blocks on the network — no join freeze or IC stutter, even on 3000+ file servers
- Crash-resilient networking; streams the server's real background (no placeholder courtroom flashing)
- One
.nro, runs on Atmosphère hardware and Ryujinx — no keys, no title install
Why it's so fast
AO content can be gigabytes — thousands of characters, backgrounds and tracks — and the Switch is not a powerful machine. Ferris-AO Switch stays smooth anyway because the render loop never waits on anything:
- Nothing downloads or decodes on the main thread. Eight background worker threads fetch files and decode the images (PNG/WebP/GIF/APNG) into ready-to-upload pixels; the game thread only does the final, cheap GPU upload. No hitches, no "loading…" freezes.
- It asks for far less. AO files carry no extension on the wire, so most clients fire ~5 guesses per asset and let 4 of them 404. Ferris-AO probes WebP-first, learns the format a server actually uses from the first file, and then asks for only that one — and remembers it for next time.
- It reuses connections. A single warm HTTPS connection per worker streams file after file instead of paying a fresh DNS + TLS handshake every time — the difference between sluggish and snappy on big Cloudflare-hosted servers.
- It remembers what it's seen. A decoded-sprite cache means anyone who just spoke pops back instantly, and an on-disk cache means the second visit to a server loads from your SD card with zero network.
The payoff: it stays responsive even on 3000+ file servers, and on a repeat visit it's nearly instant.
Installing
On a modded Switch (Atmosphère CFW):
- Download
ferris-ao-switch.nrofrom the Assets below. - Copy it to the
/switch/folder on your SD card. - Open the Homebrew Menu (hold the Album button, or launch your hbmenu entry point) and pick Ferris-AO.
On Ryujinx (PC):
- Download
ferris-ao-switch.nro. - Drag it onto the Ryujinx window, or File → Load Application from File….
- Make sure internet access is enabled in Ryujinx settings.
That's it — no firmware keys, no title installation, no base pack.
Controls (quick reference)
| Where | Button | Action |
|---|---|---|
| Connect | L / R | Switch tabs · A connect/edit · R refresh list |
| Character select | D-pad move · A pick · Y / tap search · wheel/drag scroll | |
| Courtroom | X IC composer · L OOC · R Music · Y Evidence · − Rooms | |
| Courtroom | ← / → cycle emote · A / Enter quick-talk or skip typewriter | |
| Anywhere | + disconnect · B close panel · touch-drag to scroll long lists |
The chat bar has a tap-to-talk input with inline < > emote arrows — fire line after line without re-opening the composer.
✅ Compatibility
- Connects to standard AO2 servers — Ferris-AO, Athena, KFO, tsuserver, akashi, and others — over TCP, WebSocket, or secure WebSocket (TLS).
- Reads stock AO2 content: characters, backgrounds, evidence, music, themes. Mislabeled assets in the wild (e.g. GIF sprites saved with a
.webpname) are detected by content and handled. - Servers without a CDN: drop an AO2 base pack at
sdmc:/switch/ferris-ao/base/and it loads locally; otherwise the community base CDN fills in the classics.
⚠️ Known limitations
- Evidence can be viewed but not yet attached to an outgoing message from the UI.
- The IC composer exposes emote + colour + position; some advanced toggles (flip, immediate, etc.) are rendered when received but not yet selectable when sending.
- This is a 0.x first public release — expect rough edges, and please report bugs! The current download listened down below...
Ferris-AO-Switch-V0.3
Ferris AO-Switch v02
First release