--- id: 2cf3058c-85f4-481a-bbe7-17ebb9b9e908 type: decision title: "SBA Scout Python-to-Rust TUI migration: recommended stack and approach" tags: [sba-scout, rust, migration, ratatui, research, decision, tui] importance: 0.7 confidence: 0.8 created: "2026-02-23T18:05:05.367031+00:00" updated: "2026-02-28T04:58:41.332752+00:00" relations: - target: c9add129-283a-445a-8dff-4525ec7fa9b6 type: BUILDS_ON direction: incoming strength: 0.9 edge_id: 5cde624d-cbf0-456b-aa87-076e7e999dde - target: 4dc83eed-b0b1-4924-b82e-faf352426785 type: FOLLOWS direction: incoming strength: 0.7 edge_id: b8e47bac-8b05-4e2c-b0a0-bd7683ced31f --- # SBA Scout Python-to-Rust TUI Migration Research ## Context SBA Scout is a Python TUI app using Textual + SQLAlchemy + httpx + pydantic-settings. Research was conducted to evaluate converting it to Rust. ## Recommended Stack (Option A - Lean and Idiomatic) - **UI:** ratatui 0.30 + crossterm - **Async runtime:** tokio - **Database:** sqlx 0.8.6 (sqlite, async) - **HTTP client:** reqwest 0.12.28 - **Config:** figment 0.10.19 - **Serialization:** serde + toml - **Math:** pure f64 (no external crate needed) - **Rust edition:** 2024 ## Alternative Stack (Option B - Higher Abstraction) - **UI:** tui-realm 3.3 on top of ratatui - **Config:** config-rs 0.15.19 with YAML ## Rejected Libraries - **Diesel:** rejected — no async SQLite support - **rusqlite:** rejected — sync only, not Send - **serde_yaml:** deprecated — migrate config to TOML instead of YAML ## Migration Order 1. Data structs (models) 2. sqlx queries (database layer) 3. API client (reqwest) 4. Config (figment) 5. First screen: Roster (screens layer) 6. Iterate remaining screens ## Key Challenges - Calc layer is the easiest port (pure math, f64) - Screens are the hardest: ratatui is immediate-mode (draw loop), while Textual is retained-mode (component tree with reactive state) - Async patterns differ significantly between Python and Rust ## Reference Full research saved to NoteDiscovery at `projects/sba-scout/rust-tui-migration-research`.