Every dependency was researched and validated. Here’s what we use and why.
| Crate | Version | Purpose | Why This One |
| tokio | latest | Async runtime | Industry standard, full features |
| ratatui | 0.30 | TUI framework | 19.1K stars, only mature option, Component Architecture |
| crossterm | latest | Terminal backend | ratatui default, cross-platform |
| rusqlite | 0.39 | Database | Bundled SQLite, zero external deps, ideal for CLI |
| refinery | latest | DB migrations | Clean integration with rusqlite |
| Crate | Purpose |
| rat-widget | Form widgets (text input, date, number, checkbox, tabs) |
| tui-textarea | Multi-line text editing |
| tui-scrollview | Scrollable content views |
| throbber-widgets-tui | Loading spinners for async operations |
| similar | Text diff for resume comparison |
| Crate | Version | Purpose | Why |
| reqwest | 0.13 | HTTP client | 412M downloads, rustls-tls |
| scraper | 0.26 | HTML parsing | CSS selectors, built on html5ever |
| chromiumoxide | 0.9 | Headless browser | CDP protocol, async, needed for Indeed |
| Crate | Version | Purpose | Why |
| rig-core | 0.33 | LLM framework | 6.6K stars, native Anthropic support, structured output, streaming |
- Multi-provider support (Claude, GPT, Gemini) — switch models without code changes
- Structured output with Serde — deserialize LLM responses directly into Rust structs
- Tool calling support — for potential future agent workflows
- Streaming responses — show LLM output in real-time in the TUI
| Alternative | Verdict |
Raw reqwest to Anthropic API | Works but reinvents serialization, retry, streaming |
anthropic-ai-sdk (37K downloads) | Low adoption, uncertain maintenance |
async-anthropic (32K downloads) | Stale since May 2025 |
genai 0.6 beta | Still in beta, less mature than rig |
| Crate | Layer | Purpose |
| thiserror | Library crates | Custom error types per crate |
| color-eyre | Binary crate | Beautiful error reports, terminal-aware |
bundled feature = SQLite compiled into binary, zero runtime deps
- No compile-time query checking needed for this scale
- Faster builds (no proc macros)
- Note: rusqlite and sqlx cannot coexist in the same binary (libsqlite3-sys conflict)
- Ecosystem: 2,800+ dependent crates vs cursive’s shrinking community
- Control: immediate-mode rendering gives pixel-perfect layouts
- Async: first-class tokio integration
- Direct CDP access (can intercept network, modify headers)
- Async-native (tokio)
- Better anti-detection capabilities than WebDriver-based tools