| Crates.io | relnotify |
| lib.rs | relnotify |
| version | 1.0.1 |
| created_at | 2026-01-15 19:30:41.836701+00 |
| updated_at | 2026-01-15 19:43:24.113828+00 |
| description | A library for checking GitHub releases and notifying about updates |
| homepage | |
| repository | https://github.com/captainsafia/relnotify |
| max_upload_size | |
| id | 2046380 |
| size | 89,696 |
A lightweight Rust library for checking GitHub Releases to notify CLI users of available updates, with built-in caching and disk persistence.
cargo add relnotify
cargo add tokio --features full
use relnotify::{ReleaseNotifier, ReleaseNotifierConfig};
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let config = ReleaseNotifierConfig::new("owner/repo");
let notifier = ReleaseNotifier::new(config)?;
// Check if an update is available
let result = notifier.check_version("1.0.0", false).await?;
if result.update_available {
if let Some(release) = &result.latest_release {
println!("Update available: {}", release.tag_name);
println!("Download: {}", release.html_url);
}
}
Ok(())
}
let config = ReleaseNotifierConfig::new("owner/repo");
let notifier = ReleaseNotifier::new(config)?;
// Get the latest stable release
if let Some(stable) = notifier.get_latest_release(false).await? {
println!("Latest stable: {}", stable.tag_name);
}
// Include prereleases in the search
if let Some(latest) = notifier.get_latest_release(true).await? {
println!("Latest (including prereleases): {}", latest.tag_name);
}
let config = ReleaseNotifierConfig::new("owner/repo");
let notifier = ReleaseNotifier::new(config)?;
if let Some(prerelease) = notifier.get_latest_prerelease().await? {
println!("Latest prerelease: {}", prerelease.tag_name);
}
let config = ReleaseNotifierConfig::new("owner/repo");
let notifier = ReleaseNotifier::new(config)?;
// Check against the latest prerelease
let result = notifier.check_version("2.0.0-beta.1", true).await?;
if result.update_available {
if let Some(release) = &result.latest_release {
println!("New prerelease available: {}", release.tag_name);
}
}
let config = ReleaseNotifierConfig::new("owner/repo")
// Check interval in milliseconds (default: 1 hour)
.check_interval(3600000)
// Optional: persist cache to disk
.cache_file_path("/path/to/cache.json");
let notifier = ReleaseNotifier::new(config)?;
// Clear the cache manually
notifier.clear_cache();
use relnotify::{ReleaseNotifier, ReleaseNotifierConfig};
use std::env;
const VERSION: &str = env!("CARGO_PKG_VERSION");
#[tokio::main]
async fn main() {
// Run update check in the background
tokio::spawn(check_for_updates());
// ... rest of your CLI logic
}
async fn check_for_updates() {
let home = env::var("HOME").unwrap_or_default();
let config = ReleaseNotifierConfig::new("your-org/your-cli")
.check_interval(86400000) // Check once per day
.cache_file_path(format!("{}/.your-cli/update-cache.json", home))
.token(env::var("GITHUB_TOKEN").ok().unwrap_or_default());
let Ok(notifier) = ReleaseNotifier::new(config) else {
return; // Silently fail
};
if let Ok(result) = notifier.check_version(VERSION, false).await {
if result.update_available {
if let Some(release) = result.latest_release {
eprintln!("\n Update available: {} -> {}", VERSION, release.tag_name);
eprintln!(" Run: cargo install your-cli");
eprintln!(" Or visit: {}\n", release.html_url);
}
}
}
// Silently fail - don't block the CLI for update checks
}