Migrer une app

Découper en API, remonter une UI réactive, empaqueter en app de bureau. Fil rouge : EVQuest, de Streamlit à Tauri + React + FastAPI.

Vérifié le

0/6

Vue d'ensemble

Ton prototype marche, mais il est devenu un monolithe : l'UI et la logique vivent dans le meme process, chaque clic re-execute tout, et tu ne peux rien distribuer. La methode tient en trois mouvements que tu peux mener dans cet ordre, sans jamais reecrire ta logique metier : decouper en API, remonter une UI reactive, empaqueter en app de bureau.

Cas reel : EVQuest
Tout ce guide est illustre par une migration qu'on a faite pour de vrai — EVQuest v0.5, de Streamlit (monolithe Python) vers un trio Tauri + React + FastAPI. Les chiffres, les arborescences et les extraits de code viennent de ce projet. Ta pile sera differente : ce qui se transfere, c'est l'ordre des etapes et les pieges, pas le choix des outils. Toute la logique metier Python a ete preservee intacte — c'est le critere qui rend la migration tenable.

Avant Streamlit

text
Streamlit (Python)
├── Re-execute TOUT le script
│   a chaque clic
├── UI + logique = meme process
├── Latence perceptible
└── Pas d'animations fluides

Apres Tauri + React + FastAPI

text
Tauri (Rust) → Desktop natif
├── React (TypeScript) → UI reactive
├── FastAPI (Python) → API REST
├── Logique metier → INCHANGEE
└── Communication HTTP/SSE

Architecture v0.5

Schema d'architecture
┌──────────────────────────────────────┐
│          Fenetre Tauri (Rust)         │
│                                       │
│  ┌────────────────────────────────┐  │
│  │     Frontend React (TS)        │  │
│  │  Vite + TailwindCSS + Axios   │  │
│  └──────────────┬─────────────────┘  │
│                  │ HTTP / SSE          │
│  ┌──────────────▼─────────────────┐  │
│  │    Backend FastAPI (Python)     │  │
│  │  34 endpoints, 10 routers     │  │
│  │  → parsers, analysis, storage  │  │
│  └────────────────────────────────┘  │
└──────────────────────────────────────┘

Decisions cles

DecisionDetail
Orbitron pour les titresLa spec suggerait Inter partout, on garde Orbitron pour la continuite visuelle
Port randomTcpListener::bind("127.0.0.1:0") — plus sur que le port fixe 8742
0 fichiers Python modifiesSeul pyproject.toml a change (ajout fastapi + uvicorn). Zero impact sur le code existant.
Scope v0.5 = skeleton + APIPas de pages React completes — seulement le proof-of-concept health check

Ce qui a change

  • frontend/
  • src-tauri/
  • src/poker_coach/api/
  • tests/test_api.py
  • pyproject.toml

Ce qui n'a PAS change

  • parsers/
  • engine/
  • strategy/
  • analysis/
  • storage/
  • ui/ (legacy)
  • scripts/
  • data/