A safe, async, and type-safe Rust client for querying status information from a Starlink Gen 3 Dishy via gRPC
- API version: 33
- Fully tested on hardware version: rev4_panda_prod1
- ✅ Simple API to query dish status
- ✅ Fully async with Tokio
- ✅ Type-safe models wrapping raw gRPC responses
- ✅ Clean error handling with
thiserror - ✅ Ready for polling integrations or CLI tools
[dependencies]
starlink-grpc-client = "0.4.1"
tokio = "1.45.0"(or whatever the last version is)
use starlink_grpc_client::client::DishClient;
#[tokio::main]
async fn main() {
let mut client = DishClient::connect("http://dishy.starlink.com:9200")
.await
.expect("Failed to connect to Dish");
let status = client.get_status()
.await
.expect("Failed to fetch dish status");
println!("{:#?}", status);
}✅ See working examples in usage.rs, stream.rs and with simple charts
| Method | Signature | Description |
|---|---|---|
| connect | pub async fn connect(endpoint: &str) -> Result<Self, DishError> |
Create a new client by dialing the given URL. |
| get_status | pub async fn get_status(&mut self) -> Result<DishStatus, DishError> |
Perform a single, unary status RPC. |
| stream_status | pub async fn stream_status(&mut self) -> Result<impl Stream<Item = Result<DishStatus, DishError>>, DishError> |
Poll getStatus once per second, silently. |
| stream_status_logged | pub async fn stream_status_logged(&mut self) -> Result<impl Stream<Item = Result<(DishStatus, Duration), DishError>>, DishError> |
Poll with outbound logs and true RTT measurement. |
- Push-based streaming support (server-driven updates)
- Configurable polling API
- Prometheus / Grafana integration
- CLI binary interface
- JSON serialization helpers
Clone the repository and build:
git clone https://github.com/andywwright/starlink-grpc-client.git
cd starlink-grpc-client
cargo buildIf you change the .proto files and need to regenerate the Rust bindings, use the build-protos feature:
cargo build --features build-protos- This will regenerate files into
proto_bindings. - You must commit these regenerated files if you want the default build to work for consumers.
When to use this:
- When updating
.protodefinitions. - When preparing a new crate release with updated API.
When not needed:
- Regular consumers or users do not need to run this.
- Default builds use the already checked-in generated code without
protoc.
This project follows Semantic Versioning 2.0.0:
- MAJOR: Breaking changes
- MINOR: Backward-compatible features
- PATCH: Bug fixes
MIT License. See LICENSE for details.
- Issues and PRs welcome!
- Please follow Rust API Design Guidelines.