We build the coordinators, control panels, and streaming pipes that real products need — persona sites, identity gates, admin surfaces, realtime video. Each capability listed here maps to a repo you can open and read. Nothing here is agency filler.
Rust for backends that hold real state. Zig compiled to WebAssembly for browser experiences that feel native. TypeScript + Vue 3 for admin control panels that don't fall over at 40 modules. Postgres for the truth, Redis for the fast path. Lua scripts the integration hub (Ayatori figures). NixOS keeps builds reproducible; Kubernetes runs staging + prod. Every layer talks contracts, not vibes.
Seven tenets. Every one has code behind it.
Every Kishi service is designed to run on your homelab. The platform is named after 起死回生 (kishikaisei — "back from the dead") because it started as a homelab that kept getting rebuilt from scratch and somehow kept working. Cloud is optional; sovereignty isn't.
// labs/docs/rebrand.md
Data sovereignty scales up to the group. A fandom, a streamer's
audience, a game guild, a podcast community — none of them
should have to rent their existence from a Silicon Valley
landlord. Kishi is being built so any community with a
server and someone who can run docker compose up
can host their own identity, streaming, chat, and admin
panels on their own metal. Shrink-wrapped self-hosting
for the rest of us.
Our people have been building websites since 2000. Hell, one of us beta-tested Napster when it was still being developed on IRC. We've watched trends arrive dressed as the future and leave as tech debt — Perl CGI, Flash, jQuery, LAMP, MEAN, JAMstack, SSR, edge, whatever's next. We're not scared to reach for a new tool when it earns its keep, and not scared to walk away when it doesn't. Rust when a service holds real state. Zig for browser-native. TypeScript + Vue when the DOM cares. Lua when config would be masochism. The stack is a kit, not a religion.
// 25+ years of watching the web change its mindChukei wraps MediaMTX instead of reimplementing streaming media in Rust. Ayatori talks to platform APIs via Lua figures instead of pinning per-provider SDKs. Own the coordination; borrow the substrate. Don't reinvent what already works.
// labs/docs/rust-stack-2026.md:183Every service listed here is a real repository you can open and read: Torii · Ayatori · Chukei · Hikyaku · Honmaru · Emugate · Bunshin. No mockups, no roadmap-only entries. The company story is the git history.
// labs/docs/rebrand.mdA user has one Torii identity but N Bunshin personas — the streaming face (drezdin.com), the professional dev face (janes.co), the game-server admin face, whatever. The site says which persona it wants; the persona knows which face to wear.
// labs/docs/persona.mdWe remember GeoCities, MySpace layouts, LiveJournal quirks, weird Flash intros, Comic Sans on purpose. The last two decades of the web have been a sterilization campaign — every SaaS site looks like every other SaaS site, agency template stacked on agency template, "innovative disruptive solutions" as far as the eye can see. Many Ninja pushes back. Personality is not a bug. A joke section on a company site is not unprofessional; it's the tell that a real person built the thing.
▶ Watch: the ethos video // personal favorite · linked here on purpose
Real systems don't have a single service that "does the thing." They
have a coordinator — something that holds the shape, sequences the work,
fans out to a fleet, and reconciles what came back.
Our platform is built around one such coordinator called Ayatori
(綾取り — "cat's cradle") — a headless JSON API with a Lua figure engine.
Figures are scripts that walk external protocols (OAuth flows,
scraping, webhook fan-in, worker approval) in a way the rest of the
platform can consume without ever holding a third-party secret.
Workers announce themselves (POST /workers/announce). Admins approve
them from the admin SPA — same shell we ship on every Kishi site. Once
approved, a worker binds to Ayatori's operating packet: identity + ryōchi
scope + capabilities.
Figures then run on top: kick-oauth.lua, twitch-oauth.lua,
reddit-poll.lua. Each figure is 20–60 lines. Bunshin
(persona service) calls Ayatori when a user binds an external streaming
account — Ayatori runs the figure, records the token, exposes verified
status back.
No service holds another service's secrets. That's the shape.
Services list is assembled from real repos in this monorepo and its siblings. Every card here maps to code you can read.
Single-page slide-deck landing pages tied to identity + streaming state. drezdin.com is the reference implementation.
RTMP ingest → HLS + WebRTC playback via MediaMTX + chukei (streaming relay). Sub-second glass-to-glass, cam-stream.sh push.
Torii (gate-auth) — JWT sessions, ForwardAuth for traefik, Discord/Google SSO, session probe endpoint. Powers every admin.
Vue 3 admin-spa shell — manifest-driven module registry. Every site adopts it with a data/admin.yaml.
emu-gate — retro gaming lobbies, worker profiles, cover art library. Real product with browser control panel.
Zig apps compiled to wasm32-emscripten, mounted via the tessera loader on any Hugo site. Fractal Lab is the current demo.
rs-disco (Honmaru) — audio bots in Discord voice channels. Live podcast broadcast, per-guild soundboards, TTS + listen streams. Marketing where the audience already gathers.
Everything below is running (or was, recently). No mockups.
A neon Galaga-style shooter running as a WebAssembly module. Zig + raylib compiled to wasm32-emscripten via the same tessera loader that powers Fractal Lab — five waves, one triangle, don't let them touch the deck.
This probably does not belong in a normal agency website. That is part of the point. Many Ninja should feel like a real thing with a point of view, not a sterilized template pretending to have one.
Many Ninja is the umbrella. The projects below are where the actual work happens.