Interact with the Steam network via rust https://steam-vent.grebedoc.dev/
  • Rust 96.8%
  • Lua 2.9%
  • Nix 0.3%
Robin Appelman b0e40109dd
Some checks failed
CI / checks (push) Failing after 44s
CI / semver-checks (push) Has been skipped
CI / tests (push) Has been skipped
mention steam-vent-cache in chat example
2026-06-28 14:55:06 +02:00
.forgejo/workflows
core
crypto
examples mention steam-vent-cache in chat example 2026-06-28 14:55:06 +02:00
src gc cleanup 2026-06-28 14:52:59 +02:00
tools
.envrc
.gitignore
Cargo.lock
Cargo.toml
CHANGELOG.md split session and auth tracking to properly type the availability of auth details 2026-06-27 21:27:18 +02:00
flake.lock
flake.nix
README.md
vent.png
vent.svg

Steam-Vent

Interact with the Steam network via rust

Allows communication with the steam servers using the same protocol as the regular steam client.

State

Most forms of authenticating to steam are implemented, and you can send requests for using protobufs that are either packaged by the project or that you bring yourself.

While the api isn't fully stable yet, it's unlikely to receive major changes at this point.

  • Anonymous sessions
  • Password Authentication
  • QR Authentication
  • Steam guard (device or email) confirmation
  • Device notification confirmation
  • Saved machine token confirmation
  • Sending and receiving raw messages
  • Making RPC calls over the connection
  • Communicating with the game coordinator
  • Allow using messages from protobufs not included in the project

Non-goals

This crate intentionally does not include any high level apis, instead it's encouraged to implement high level apis in separate crates that wrap a Connection.

See steam-vent-chat for an example high-level library.

Documentation

The main documentation can be found at steam-vent.grebedoc.dev, additional api documentation can be at docs.rs/steam-vent.

Usage

Note that this project is still in early development and apis might see large changes.

use std::error::Error;
use steam_vent::connection::Connection;
use steam_vent::serverlist::ServerList;
use steam_vent_proto::steammessages_gameservers_steamclient::CGameServers_GetServerList_Request;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    let server_list = ServerList::discover().await?;
    let mut connection = Connection::anonymous(server_list).await?;

    let mut req = CGameServers_GetServerList_Request::new();
    req.set_limit(16);
    req.set_filter(r"\appid\440".into());
    let some_tf2_servers = connection.service_method(req).await?;
    for server in some_tf2_servers.servers {
        println!(
            "{}({}) playing {}",
            String::from_utf8_lossy(server.name()),
            server.addr(),
            server.map()
        );
    }

    Ok(())
}

Protobuf packages

Game-specific probufs are packaged for the following games:

They can be used by either enabling the features in steam-vent-proto or by depending on the protobuf package directly.

Contribution guidelines

LLM driven contributions are not welcome in this project.

Credit

This is in large parts inspired by and based of @DoctorMcKay's work on SteamUser, massive credits go to all who worked on that.