Skip to content
ScathachGripPublic

About

A decentralized @ScathachGrip custom branding registry.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

Β 

History

60 Commits

Folders and files

Repository files navigation

A high-performance decentralized for custom branding registry.

Maintainability

Powered by the axum web framework for async concurrency without garbage collection overhead. Exposes first-class Prometheus observability, mimalloc-accelerated allocation, and compile-time registry never breaks the codebase.

Playground β€’ Contributing β€’ Report Issues


The Problems

Managing tag registries across multiple Discord bots is a maintenance nightmare. When a new character-series drops, every bot project must be edited individually β€” update the list, rebuild, redeploy. Teams maintaining 5, 10, or 20 bots end up copy-pasting the same 100+ character array across repos, creating drift between deployments. One bot gets "sandrone_(genshin_impact)", "lauma_(genshin_impact)", "anis_(star)_(nikke)", and etc.. with correct formatting, another uses a stale alias. There is no single source of truth, no centralized versioning, and no way to propagate updates without touching each codebase by hand.

The Solutions

@ScathachGrip/teivax decouples the tag registry from all bot code. Instead of embedding character lists in every project, point all your bots at a single HTTP endpoint. Add or update tags in one place β€” teivax β€” and every bot picks up the change on its next request. The registry is compile-time constant, served with sub-millisecond latency, and needs no database, no cache warming, and no runtime synchronization. One cargo build propagates new characters to every consumer.

Architecture

                        β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                        β”‚         HTTP Client          β”‚
                        β”‚   (curl / browser / bots)    β”‚
                        β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                       β”‚
                                       β”‚ GET /, /:id, /health
                                       β”‚ GET /metrics, /loadavg
                                       v
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                     axum HTTP Server (0.7)                                       β”‚
β”‚                                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚             data_router              β”‚          β”‚              metrics_router              β”‚  β”‚
β”‚  β”‚   (CORS permissive, tracing, prom)   β”‚          β”‚         (no CORS, direct scrape)         β”‚  β”‚
β”‚  β”‚                                      β”‚          β”‚                                          β”‚  β”‚
β”‚  β”‚   GET  /                             β”‚          β”‚   GET  /metrics                          β”‚  β”‚
β”‚  β”‚   GET  /:id                          β”‚          β”‚   GET  /debug/mimalloc                   β”‚  β”‚
β”‚  β”‚   GET  /health                       β”‚          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚  β”‚   GET  /loadavg                      β”‚                                 β”‚                      β”‚
β”‚  β”‚   GET  /data                         β”‚                                 v                      β”‚
β”‚  β”‚   GET  /global_anime_girls           β”‚          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚   GET  /blocklists                   β”‚          β”‚            prometheus metrics            β”‚  β”‚
β”‚  β”‚   GET  /playground                   β”‚          β”‚    (axum-prometheus + metrics 0.23)      β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                     β”‚                                                                            β”‚
β”‚                     v                                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                        β”‚
β”‚  β”‚               handlers               β”‚                                                        β”‚
β”‚  β”‚   index() β†’ REGISTRY                 β”‚                                                        β”‚
β”‚  β”‚   get_anime() β†’ by_id()              β”‚                                                        β”‚
β”‚  β”‚   health() β†’ "ok"                    β”‚                                                        β”‚
β”‚  β”‚   loadavg() β†’ sysinfo::System        β”‚                                                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                        β”‚
β”‚                     β”‚                                                                            β”‚
β”‚                     v                                                                            β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                        β”‚
β”‚  β”‚               data.rs                β”‚                                                        β”‚
β”‚  β”‚   Anime struct                       β”‚                                                        β”‚
β”‚  β”‚   REGISTRY: &[Anime]                 β”‚                                                        β”‚
β”‚  β”‚   by_id(id) β†’ Option<&Anime>         β”‚                                                        β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                        β”‚
β”‚                     β”‚                                                                            β”‚
β”‚           β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                                  β”‚
β”‚           v                   v                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”                                                         β”‚
β”‚  β”‚    nikke.rs    β”‚   β”‚  arknights.rs  β”‚  ... 25 more tag files                                  β”‚
β”‚  β”‚    106 tags    β”‚   β”‚    70 tags     β”‚                                                         β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                         β”‚
β”‚                                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                               Background Tasks (tokio::spawn)                              β”‚  β”‚
β”‚  β”‚                                                                                            β”‚  β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚  β”‚
β”‚  β”‚  β”‚            system_updater()            β”‚    β”‚               dump_json()              β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  every N seconds:                      β”‚    β”‚  on startup:                           β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β€’ sysinfo::System::*                  β”‚    β”‚  β€’ write json/{id}.json                β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β€’ CPU / mem / disk / net              β”‚    β”‚  β€’ best-effort                         β”‚  β”‚  β”‚
β”‚  β”‚  β”‚  β€’ process info / threads              β”‚    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚  β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                                                β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                               β”‚
                                               v
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                            Filesystem                                            β”‚
β”‚                                                                                                  β”‚
β”‚   json/                                                                                          β”‚
β”‚   β”œβ”€β”€ nikke.json                  <── dump_json() writes                                         β”‚
β”‚   β”œβ”€β”€ arknights.json                                                                             β”‚
β”‚   β”œβ”€β”€ genshin.json                                                                               β”‚
β”‚   β”œβ”€β”€ global_anime_girls.json                                                                    β”‚
β”‚   β”œβ”€β”€ blocklists.json                                                                            β”‚
β”‚   └── ...                                                                                        β”‚
β”‚                                                                                                  β”‚
β”‚   playground/                                                                                    β”‚
β”‚   └── index.html                  <── gen_playground binary                                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                                               β”‚
                                               v
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                                       Global State (const)                                       β”‚
β”‚                                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                                   REGISTRY (compile-time)                                  β”‚  β”‚
β”‚  β”‚  &[Anime; 25]                                                                              β”‚  β”‚
β”‚  β”‚  β€’ id: &'static str                                                                        β”‚  β”‚
β”‚  β”‚  β€’ title: &'static str                                                                     β”‚  β”‚
β”‚  β”‚  β€’ provider: &'static str                                                                  β”‚  β”‚
β”‚  β”‚  β€’ tags: &'static [&'static str]                                                           β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                                      AppState (runtime)                                    β”‚  β”‚
β”‚  β”‚  started: Instant                                                                          β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚                                                                                                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚                             mimalloc::MiMalloc (global allocator)                          β”‚  β”‚
β”‚  β”‚  /debug/mimalloc exposes extended stats                                                    β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Prerequisites

NOTE: Rust 1.96.0 or higher / or simply just use docker

Installation

Rust toolchain with cargo is required. The build is self-contained β€” no external services, no database, no runtime config beyond env vars. Choose one of:

Docker

docker pull ghcr.io/scathachgrip/teivax:latest
docker run -p 3000:3000 -d ghcr.io/scathachgrip/teivax:latest

Manual

cargo build
./target/debug/teivax
# Windows
.\build.cmd
.\target\debug\teivax.exe
Env Default Notes
PORT 3000 TCP bind on 0.0.0.0
RUST_LOG info tracing EnvFilter

.env auto-created from .env.schema on first run.

API

Route Returns Description
GET / JSON Alive check β€” version, server location, memory stats
GET /data JSON Registry index β€” all supported anime with tag counts
GET /:id JSON Tag data for an ID (e.g. /nikke, /data_gif)
GET /global_anime_girls JSON Global anime girls dataset
GET /blocklists JSON Blocklist entries per category
GET /playground HTML Browser UI (requires gen_playground)
GET /health text "ok"
GET /loadavg JSON System load average {one, five, fifteen}
GET /metrics text Prometheus metrics
GET /debug/mimalloc JSON mimalloc allocator stats

GET /data

{
  "entries": [
    {
      "id": "nikke",
      "title": "Nikke",
      "provider": "rule34",
      "tag_count": 106,
      "endpoint": "/nikke"
    }
  ],
  "endpoints": [
    "/health",
    "/metrics",
    "/data",
    "/global_anime_girls",
    "/blocklists"
  ]
}

GET /:id

Unknown ID returns 404 Not Found with body unknown anime: <id>.

Supported Titles (25)

ID Title Provider Type Entries
genshin Genshin Impact rule34 tags 79
fgo Fate/Grand Order rule34 tags 118
nikke Nikke rule34 tags 106
arknights Arknights rule34 tags 70
bluearchive Blue Archive rule34 tags 73
azurlane Azur Lane rule34 tags 66
genshin_danbooru Genshin Impact (Danbooru) danbooru tags 36
honkai_starrail Honkai: Star Rail rule34 tags 50
girls_frontline Girls' Frontline rule34 tags 39
naruto Naruto rule34 tags 30
bleach Bleach rule34 tags 31
vtubers VTubers danbooru tags 196
danbooru_sex Danbooru Sex Tags danbooru tags 64
data_gif GIFs others gif 2792
data_gif_nsfw NSFW GIFs others gif 5194
gif_sex GIF Sex Tags others tags 30
hentai_yandere Hentai Yandere Tags yandere tags 49
ai_sex AI Sex Tags others tags 3
wuthering_waves Wuthering Waves rule34 tags 34
zenless_zone_zero Zenless Zone Zero danbooru tags 42
uma_musume Uma Musume rule34 tags 59
honkai_impact Honkai Impact 3rd danbooru tags 27
one_piece One Piece rule34 tags 8
league_of_legends League of Legends rule34 tags 23
persona Persona danbooru tags 21
global_anime_girls β€” β€” β€” special dataset
blocklists β€” β€” β€” blocklist entries

JSON Dumps

On startup, the server writes json/{id}.json for each anime and json/global_anime_girls.json, json/blocklists.json. Best-effort β€” failures logged, not fatal.

Running tests

You can check available tests on cargo/config.toml and Makefile.toml.

Audit checks

Audit tag registries against live API post counts:

cargo make check-entries <name>

Examples:

# danbooru-provider
cargo make check-entries genshin_danbooru
cargo make check-entries vtubers
cargo make check-entries danbooru_sex
cargo make check-entries honkai_impact
cargo make check-entries zenless
cargo make check-entries persona

# rule34-provider
cargo make check-entries genshin
cargo make check-entries fgo
cargo make check-entries nikke
cargo make check-entries arknights
cargo make check-entries bluearchive
cargo make check-entries azurlane
cargo make check-entries honkai_starrail
cargo make check-entries girls_frontline
cargo make check-entries naruto
cargo make check-entries bleach
cargo make check-entries uma_musume
cargo make check-entries one_piece
cargo make check-entries league_of_legends
cargo make check-entries wuthering_waves

To ensure nasty tags or ambiguous wildcard exists, manual clean up is required.
This will surface a new file target/check_<name>_output.txt example:

TAG                                                          POST_COUNT
---------------------------------------------------------------------------
raiden_shogun                                                23755
ganyu_(genshin_impact)                                       15595
yae_miko                                                     14832
lumine_(genshin_impact)                                      14759
mona_(genshin_impact)                                        13786
hu_tao_(genshin_impact)                                      12982
eula_(genshin_impact)                                        10210

=== SUMMARY ===
Total: 79
Total posts: 258407

Output: E:\Ferris\teivax\target\check_genshin_output.txt
[cargo-make] INFO - Build Done in 110.88 seconds.

Build tools

Command Description
cargo build Build debug
cargo make build Same, via cargo-make
cargo dev cargo run alias
cargo make run Run server binary
cargo release cargo run --release --bin teivax alias
cargo make check cargo check
cargo make lint Clippy with deny warnings
cargo make fmt Format all
cargo make test Run tests
cargo make qlty Run Qlty check (linters + analyzers)
cargo make qlty-smells Qlty code smells only
cargo make check-entries <name> Audit tag registry live counts

See .cargo/config.toml for aliases and Makefile.toml for cargo-make tasks.

Playground

cargo run --bin gen_playground

Generates playground/index.html β€” a browser UI for browsing tags. Served at /playground. Deployed to GitHub Pages via CI.

Observability

Prometheus metrics at /metrics:

  • System: CPU, memory, swap, loadavg, disk, network
  • Process: CPU, RSS, virtual mem, threads, disk I/O, status
  • mimalloc: commit, RSS, reserved, fragmentation, arenas, heaps, threads
  • App: HTTP request count/duration, JSON dump timing, anime tag counts
  • Tokio: worker thread count

Stack

Concern Crate Version
HTTP server axum 0.7
Runtime tokio 1
Allocator mimalloc (extended) 0.1
Metrics axum-prometheus + metrics 0.7 / 0.23
System info sysinfo 0.32
Serialization serde + serde_json 1
Logging tracing + tracing-subscriber 0.1 / 0.3
HTTP middleware tower-http (cors, trace) 0.5
Env loading dotenvy 0.15

Adding a New Data

  1. Create src/data/my_config.rs:
    pub const TAGS: &[&str] = &[
        "character_name_(my_config)",
    ];
  2. Add pub mod my_config; to src/data.rs
  3. Add entry to REGISTRY:
    Anime { id: "my_config", title: "my_config", provider: "rule34", tags: my_config::TAGS },
  4. cargo build

Known Issues

  • process_open_fds always 0.0 β€” open_files() requires sysinfo >= 0.33, project pinned at 0.32
  • system_cpu_brand and process_memory_used_bytes gauges are described but not populated
  • loadavg returns zeros on Windows (platform limitation)
  • imageboards/*.ts, custom_bot/client/*.ts are reference data only β€” not compiled, not read at runtime

Pronunciation

en_US β€’ /tayΒ·vaks/ β€” Tei (Teyvat, Genshin reference; reflects the project's primary data source) + Ax (shorthand for Axum, the Rust web framework).

Legal

This tool can be freely copied, modified, altered, distributed without any attribution whatsoever. However, if you feel like this tool deserves an attribution, mention it. It won't hurt anybody.

Licence: WTF.

About

A decentralized @ScathachGrip custom branding registry.

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages