steamie: A Terminal-Native Steam Client Written in Rust
Steamie is designed for individuals who prefer working within terminal environments, offering access to Steam services without the need for a traditional desktop client.
Key Features:
Login Methods: Supports QR-code sign-in (default) or username/password authentication, eliminating the need for Web API keys.
Friends List: Directly accesses your friends list from Steam, ensuring up-to-date information.
Library Management: Organizes owned games and tools with Steam-style filters (All, Games, Software-Tools).
Real-time Chat: Enables 1-on-1 conversations with scrollable history and real-time message delivery via FriendMessages service.
Game Launching: Launches games directly from the terminal; optionally starts Steam minimized or uses experimental direct launch for DRM-free titles.
Audience & Benefit:
Ideal for power users, developers, and Linux enthusiasts who value CLI environments. Steamie integrates seamlessly into their workflow, providing access to Steam services without graphical overhead, enhancing efficiency and focus within the terminal.
README
steamie
> A terminal-native Steam client written in Rust, powered by Ratatui.
>
> Browse your library, chat with friends, and launch games — all from a fast, keyboard-driven TUI,
> with no browser and no Steam window in your way.
> Unofficial. steamie is an independent project and is not affiliated with, endorsed by, or
> sponsored by Valve or Steam. It talks to Steam's own connection-manager protocol the same way the
> official client does; use it at your own discretion.
Login over the Steam CM protocol — QR-code sign-in (default) or username/password, no Web API
key required.
Friends — your friends list, loaded directly from Steam.
Library — owned games and tools, filtered Steam-style by app type (t cycles
All / Games / Software-Tools).
Real-time 1-on-1 chat — a Chat tab with conversation list, scrollable history, and a composer;
messages send and arrive live over the modern FriendMessages service, with local history kept
per-conversation.
Per-game playtime & achievements — native, pulled over the protocol (no scraping, no API key).
News — sourced from your library, recently-played, and wishlist apps.
Launch games — start any installed game from the library. By default Steam is launched
silently (minimized to the tray, no window); an experimental mode can launch DRM-free titles
with no Steam at all. See Launching games below.
Installation
> steamie requires Rust 1.85+ (it uses edition 2024) when building from source.
# Cargo (installs the `steamie` binary)
cargo install steamie
# Arch Linux (AUR) — prebuilt binary (faster)
yay -S steamie-bin
# Arch Linux (AUR) — build from source
yay -S steamie
# Homebrew (macOS)
brew install LargeModGames/steamie/steamie
# Windows (winget)
winget install steamie
git clone https://github.com/LargeModGames/steamie.git
cd steamie
cargo build --release
./target/release/steamie
cargo run --bin steamie works too for a debug build. No special system libraries are required —
networking uses rustls and desktop notifications use zbus, so there's no OpenSSL, X11, or audio
dependency to install.
Configuration
Configuration is optional — steamie runs with sensible defaults. To customize, create
~/.config/steamie/config.toml:
# api_key = "YOUR_STEAM_WEB_API_KEY" # optional fallback; https://steamcommunity.com/dev/apikey
# steam_id = "76561198XXXXXXXXX" # optional; auto-detected after login
[auth]
method = "qr" # "qr" (default) or "credentials"
account_name = "" # optional hint for credential login
[ui]
tick_rate_ms = 250 # default 250
theme = "dark" # default "dark"
[chat]
notifications_enabled = true # terminal bell on incoming message
desktop_notifications = false # also raise a notify-rust desktop notification
history_retention_days = 30 # local chat history kept; 0 = keep everything
[launch]
steam_path = "" # override; auto-detected (registry / default path) when empty
dry_run = false # log the exact launch command instead of spawning it
kill_steam_on_exit = false # if steamie started Steam, shut it down when the game exits (best-effort)
silent = true # start Steam minimized to tray (no window); false shows it
direct_launch = false # experimental: launch DRM-free-listed games with NO Steam running
force_direct = false # experimental: with direct_launch, try the direct path for any installed game
[launch.game_args] # optional per-game args, keyed by appid string
# "730" = "-novid -high"
Usage
Run steamie to start the UI. Press ? at any time for the in-app keybinding help.
Key
Action
j / ↓
Move down
k / ↑
Move up
g g
Jump to top
G
Jump to bottom
Enter
Open detail · launch in detail view
l
Launch highlighted game
L
Recently-played quick-launch overlay
Esc / Backspace
Go back
/
Search library
t
Cycle library type filter (All / Games / Software-Tools)
From the Library tab: press l to launch the highlighted game, Enter to open its detail
view (then Enter/l to launch), or L for a recently-played quick-launch overlay.
By default the game launches through the official Steam client, but Steam stays out of your way:
it starts minimized to the system tray with no window (steam -silent -applaunch ), the game
appears, and DRM/presence work normally. Set silent = false if you'd rather see Steam's window.
Experimental — launch with no Steam at all. Games that are confirmed to run without the Steam
client (DRM-free titles) can be launched directly from their executable, so Steam never wakes. Enable
it with direct_launch = true; a game is eligible when it's on the community
DRM-FREE-GAMES.md list and installed. Anything else falls back to the silent
Steam launch above. The status line shows ▶ Launched X (no Steam) when it goes direct.
kill_steam_on_exit only ever shuts down a Steam that steamie itself started, and is best-effort
(reliable on Windows, weaker on Linux, a no-op on macOS). Set dry_run = true to preview the exact
command a launch would run without starting anything.
Contributing to the DRM-free list
DRM-FREE-GAMES.md is a community-maintained table of Steam games that run with
Steam fully closed. To add a game: quit Steam, confirm the game still launches from its
steamapps/common// executable, then add a row with its AppID and name and open a PR. You can
also keep a private list at ~/.config/steamie/drm-free.md (same format).
Limitations
Direct launch needs the library load to have populated PICS launch info; otherwise it falls
back to Steam. Proton/Wine prefix wrapping for the direct path is not yet implemented (Steam still
applies Proton itself for the mediated path).
force_direct on a DRM-protected game spawns an executable that will bounce (Steam isn't running)
and won't auto-recover.
kill_steam_on_exit detection is best-effort: reliable on Windows (registry), weaker on Linux, a
no-op on macOS.
Launch arguments are whitespace-split (no quoted-argument grouping).
Group chat is not yet supported (1-on-1 only); the chat list is populated as conversations arrive
or are opened, and per-message wall-clock timestamps aren't displayed yet.
Architecture
steamie is a Cargo workspace with three crates:
steamie-api — Steam Web API / Store API HTTP client.
steamie-core — config, session, caching, the game launcher, and local chat history.
steamie — the ratatui terminal UI (produces the steamie binary).
The raw Steam connection-manager protocol (WebSocket connection, auth, friends, service calls) lives
in a separate crate, steam-cm-protocol
(crates.io).
Development
cargo run --bin steamie # run (debug)
cargo build --release # release build
cargo check --workspace # type-check everything
cargo test --workspace # run tests
cargo clippy --workspace --all-targets -- -D warnings
cargo fmt --all # format