GitHubGo to GitHub

Kagami Works // Portfolio

Toumei

Builds
Bots, servers, apps

"I build software I end up using every day."

I also run the servers it lives on. These are the three projects that take up most of my time: a Discord bot, the homelab under it, and an app for interactive roleplay.

03 PROJECTS

Discord bot // since 2025.12

Mikarin

Type
Discord bot + web dashboard
Built with
Python, discord.py, Flask, Socket.IO, React, SQLite, Podman

"Started as a music bot for a few friends' servers and kept growing."

It plays music from YouTube and Spotify, with a queue anyone in the voice channel can manage. There's an AI chat mode that can look things up and remembers what the channel talked about last week. The rest is the work a server actually needs: moderation, a spam filter, support tickets, a small economy, and anime list lookups.

The dashboard lets you control playback from a browser tab. Changes show up in Discord and on every open dashboard at the same moment, over WebSockets. The bot runs in Podman containers on my homelab and reaches the internet through a Cloudflare Tunnel.

Mikarin, the bot's mascot: a pink-haired girl hugging a pillow, in watercolor.
Commits
170+
Since
2025.12

Kagami Works-Homelab

The homelab

Everything I build runs here, along with the services my family uses every day. Two Proxmox servers, about 20 containers, set up so that either one can go down without taking the house with it.

ServerHardwareMain jobs
proxmoxOptiPlex 3050 Micro, i5-6400T, 16 GBMikarin, backups, standby DNS
homeserverXeon W-2135, 32 GB, RTX 2060 + RTX A400, 4 TBDNS, photos, file shares, local AI models

No ports are open on the router. Public sites go out through a Cloudflare Tunnel with a connector on each server, so they stay up if one machine is off. Admin pages only answer on the home network. AdGuard Home blocks ads and phishing domains for the whole house, and a standby copy on the other server syncs every ten minutes and takes over if the main one stops.

The servers also back each other up. One runs Proxmox Backup Server and takes nightly snapshots of the other's containers, and the other keeps the first one's backups on its hard drive. Each runs an Uptime Kuma that watches the other, so a dead machine still gets reported to Discord.

Also running: Immich for the family's photos, a Samba file server, Forgejo for my own Git, Vaultwarden for passwords, Kasm for opening suspicious links in throwaway browsers, and llama.cpp on the GPUs for local language models. Scrutiny watches disk health.

Android app // since 2026.07

Narrata

Type
AI-narrated interactive fiction
Built with
Flutter, Dart
Status
Private, in playtesting

"You write what your character does, and an AI narrator tells you what happens next."

The app keeps track of the world so the story holds together over hundreds of turns. It records the characters you've met, where you are, what you're carrying, open quests, and the date and time inside the story. When an old event becomes relevant again, semantic search brings it back into the narrator's context. It works with hosted AI models or with the one running on my own GPU server.

It started as RP Assistant

The first version was RP Assistant, a desktop app in plain JavaScript (Electron, later Tauri). It reached 69 commits between July and September 2026 before I shelved it. I mostly played on my phone, and a browser-based app was never going to feel right there.

Narrata is the rewrite. The story engine is pure Dart with over 150 tests, so I can run whole sessions from the command line on my PC, and the Flutter app sits on top of it.

Narrata chat screen: narration about a courier named Ren, a speech box from the guildmaster Thorne, and the player's typed action in pink.
Platform
Android
Built with
Flutter
Tests
150+