TENTA.DEV v5.0
--:--:-- CET
← ALL PROJECTS / 01 / TSUKIME
01 Product 2025 — Present In development

Tsukime

A full-stack anime tracking platform built around an animated companion named Tsuki — half virtual pet, half emotionally-aware co-watcher.

ROLE
Solo developer
YEAR
2025 — Present
STATUS
In development
SvelteKitSvelte 5TypeScriptRustasync-graphqlPostgreSQLRedisPyTorchRiveCapacitorElectronKubernetes
§01 OVERVIEW

Tsukime is a full-stack anime tracking platform shipped to web, iOS, Android, and desktop from a single SvelteKit codebase. The product centers on Tsuki — a Rive-animated companion with a hand-authored state machine and a TypeScript behavioural layer that synthesises time of day, affection, absence duration, and recent achievements into a live mood. Behind it sits a Rust GraphQL monolith, a PyTorch two-tower recommender, and a hybrid mood classifier whose taxonomy feeds back into Tsuki's suggestions.

§02 PROBLEM

Most tracking apps are spreadsheets in disguise — open them, log an episode, close them. There was no reason to come back beyond the chore. The goal was to invert that: build something users open to *hang out*, where the tracker is a side effect of spending time with a character that reacts to their day.

§03 APPROACH

Built Tsuki as a UI primitive rather than a one-off illustration — the same `TsukiCharacter` Rive component drives the floating overlay, dialog bubbles, the chat panel, the rating flow, completion ceremonies, and onboarding. A 32-trigger / 7-mood Rive state machine handles expression; a TypeScript `moodCalculator` and `dialogSelector` layer give the character algorithmic empathy without an LLM. The backend started as 8+ Rust microservices over gRPC + RabbitMQ and was migrated to a single Rust GraphQL monolith — gRPC channels collapsed into direct domain-module calls, RabbitMQ replaced by an in-process `MessageBus`, distributed databases consolidated into a `DatabasePools` abstraction with read/write separation. Domain boundaries were preserved as modules. One frontend codebase targets four platforms via a custom build system that swaps adapters and rewrites `.server.ts` files for the static mobile/desktop variants. A separate CLI tool, TsukiAnimator, drives the same `tsuki.riv` file headlessly with Playwright + Rhubarb Lip Sync + ffmpeg to produce lip-synced TikTok videos from audio.

§04 OUTCOME

Tsuki ships across web, iOS, Android, and desktop from one frontend codebase. The character system covers onboarding (with its own 12-trigger state machine and Rive ViewModel data binding), persistent floating overlay, dialog management, an agentic chat panel with rich tool-result cards, rating companion, and a completion ceremony — all driven by shared mood/affection/dialog state. Two ML systems are wired into production paths: an Enhanced Two-Tower recommender with five diversity modes, and a hybrid keyword + sentence-transformer mood classifier across seven vibe categories.

32
Rive triggers
7
Mood states
Web · iOS · Android · Desktop
Shipped platforms
7
Vibe categories
§05 NOTES TO SELF
  • Algorithmic empathy beats an LLM when the goal is a character that feels intelligent — a state machine is cheaper, deterministic, and ships offline.
  • Treating the mascot as a UI primitive instead of an illustration was the decision that made the rest of the product cohere.
  • Microservices were the wrong default for a solo project — collapsing to a monolith with preserved domain modules removed an entire class of operational pain without losing the boundaries.