# Stack technique

# Stack technique

> _Dernière mise à jour : 2026-05-10_

## Runtime

| Composant | Version | Rôle |
|---|---|---|
| Node.js | 22 (image `node:22-bookworm-slim`) | Runtime backend |
| Vue 3 | 3.5.31 | Framework frontend |
| Tailwind CSS | 4.2.2 (`@tailwindcss/vite`) | Utility-first CSS |
| Vite | (via `@tailwindcss/vite`) | Bundler frontend |
| Pinia | 3.0.4 | State management |
| Vue Router | 5.0.4 | Routing client |

## Backend principal

| Lib | Version | Rôle |
|---|---|---|
| Hono | 4.7.6 | Web framework (routes + middleware + SSE streaming) |
| `@hono/node-server` | 1.14.1 | Adapter HTTP Node |
| Drizzle ORM | 0.44.2 | ORM SQLite type-safe |
| `better-sqlite3` | 11.9.1 | Driver SQLite synchrone (rapide, low-overhead) |
| Zod | 3.24.4 | Validation schémas |
| Argon2 | 0.43.0 | Password hashing |
| `ssh2` | 1.16.0 | Client SSH (pool vers VM oracle) |
| `pdfjs-dist` | 4.10.38 | Extraction texte PDF |
| `sharp` | 0.34.5 | Resize cache images cartes |
| `cheerio` | 1.2.0 | HTML parsing (méta-game scraping) |
| `nodemailer` | 8.0.5 | SMTP optionnel |
| `stream-chain` + `stream-json` | 3.6.1 / 1.9.1 | Streaming JSON parser (Claude SSH) |
| `tsx` | 4.19.4 | TS executor (dev + scripts) |
| `uuid` | 11.1.0 | UUIDs partout |

## Stockage / persistance

| Composant | Rôle |
|---|---|
| **SQLite** (`better-sqlite3`) | Users, games, questions, feedbacks |
| **Drizzle Kit** | Migrations |
| **Qdrant** | Vector DB (1024 dims, dense + BM25 sparse) — une collection par jeu (`rules_<slug>`) + collections cartes par TCG (`magic-cards`, `lorcana-cards`, etc.) |
| **Filesystem** (`/app/pdfs`, `/app/data`) | PDFs uploadés, PNG rendus, caches JSON (OCR / contextual / conflicts), data sources cartes |

## ML / RAG

| Composant | Rôle |
|---|---|
| **TEI (Text Embeddings Inference)** | Service HTTP local sur RTX 3060 — modèle `bge-m3` (1024 dim dense + sparse BM25) |
| **TEI Reranker** | Service HTTP local — modèle `bge-reranker-v2-m3` cross-encoder |
| **Claude Code CLI** (Anthropic) | Génération streamée via SSH vers VM `oracle` |
| Modèle Haiku | `claude-haiku-4-5-20251001` — HyDE, decompose-query, conflit detect, classify intent |
| Modèle Opus | (par défaut) — réponses RAG, deckbuilding |

## TCG (sources de données)

| TCG | Source |
|---|---|
| MTG | Scryfall bulk JSON (téléchargé) + traduction Haiku |
| Lorcana | LorcanaJSON.org (MIT, bulk JSON FR/EN) |
| FAB | Package npm `@flesh-and-blood/cards` (bundlé dans l'image Docker) |
| Riftbound | API Riot card-gallery (live JSON) |
| Terraforming Mars | HTML parsing local + cards.json |
| Ark Nova | Sprite sheets découpées + cards.json |

## Méta-game

| Source | TCG |
|---|---|
| 17Lands API | MTG (draft analytics) |
| MTGGoldfish (scrape) | MTG (constructed metagame) |
| MTGTop8 (scrape) | MTG (top 8 tournois) |
| Mobalytics (scrape) | Riftbound (tier list) |
| RiftboundStats (API) | Riftbound (tournois) |
| fabtcg.com (scrape) | FAB (tournois officiels LSS) |
| BoardGameGeek XML v2 | Tous (forums Rules) |

## Infra

| Composant | Rôle |
|---|---|
| **Unraid** | OS hôte des containers |
| **Docker** | Containerisation (image multi-stage) |
| **Gitea** (`gitea.thymon.fr`) | Git + CI Runners + registry |
| **Nginx Proxy Manager (NPM)** | Reverse proxy + Let's Encrypt sur `rules.thymon.fr` |
| **VM SSH `oracle`** | Exécute Claude Code CLI (compte dédié least-privilege) |
| **RTX 3060** | TEI bge-m3 + reranker (GPU) |