Pure-stdlib Go client libraries for media automation, metadata, and download APIs
69 modules covering 63+ services in a multi-module monorepo with zero external dependencies
goenvoy is a collection of Go client libraries for media automation, metadata, and download service APIs — 69 modules covering 63+ services. Designed as a multi-module monorepo, it allows importing only what you need, from a single library to an entire category, using only Go's standard library.
📖 Principles · Architecture Decisions · Contributing
- Pure stdlib — zero external dependencies, just
net/httpandencoding/json - Context-aware — every method takes
context.Contextfor cancellation and timeouts - Functional options —
WithHTTPClient,WithTimeout,WithHeaderand service-specific options - Type-safe errors — each module defines an
APIErrorwith status code, message, and body - OAuth2 support — device code, authorization code, PKCE, and refresh flows where applicable
- Thoroughly tested — httptest-based tests, race detector enabled, no live API calls
Import a specific service library:
go get github.com/golusoris/goenvoy/arr/sonarrOr import shared category types:
go get github.com/golusoris/goenvoy/arrpackage main
import (
"context"
"fmt"
"log"
"github.com/golusoris/goenvoy/arr/sonarr"
)
func main() {
client, err := sonarr.New("http://localhost:8989", "your-api-key")
if err != nil {
log.Fatal(err)
}
ctx := context.Background()
// Get system status
status, err := client.GetSystemStatus(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%s version %s\n", status.AppName, status.Version)
// Get all series
series, err := client.GetAllSeries(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("Total series: %d\n", len(series))
}Each service module follows the same pattern: New(baseURL, apiKey) → typed methods with context.
| Category | Module | Services |
|---|---|---|
| Arr Stack | github.com/golusoris/goenvoy/arr |
Sonarr, Radarr, Lidarr, Readarr, Whisparr (v2+v3), Prowlarr, Bazarr, Seerr, Autobrr, Mylar3, Jackett, NZBHydra2 |
| Metadata | github.com/golusoris/goenvoy/metadata |
TMDb, TheTVDB, Fanart.tv, OMDb, TVmaze, AniList, Kitsu, AniDB, MAL, Trakt, Simkl, Letterboxd, ListenBrainz, MusicBrainz, StashBox, TPDB, OpenSubtitles, Last.fm, Discogs, TheAudioDB, Open Library, Google Books, Spotify, Deezer, IGDB, RAWG, Steam, MobyGames, SteamGridDB, RetroAchievements, ScreenScraper, Hasheous, LaunchBox |
| Download Clients | github.com/golusoris/goenvoy/downloadclient |
qBittorrent, Transmission, Deluge, rTorrent, SABnzbd, NZBGet |
| Media Servers | github.com/golusoris/goenvoy/mediaserver |
Plex, Jellyfin, Emby, Tautulli, Audiobookshelf, Komga, Navidrome, Kavita, Stash, Tdarr |
| Tools | github.com/golusoris/goenvoy/tools |
FlareSolverr |
| Anime | github.com/golusoris/goenvoy/anime |
Shoko Server |
Each category has a base module with shared types, plus sub-modules for individual services:
goenvoy/
├── arr/ # shared *arr types + base client
│ ├── sonarr/ # Sonarr v3 client
│ ├── radarr/ # Radarr v3 client
│ ├── lidarr/ # Lidarr client
│ ├── readarr/ # Readarr client
│ ├── whisparr/ # Whisparr v2 + v3 (Eros) client
│ ├── prowlarr/ # Prowlarr client
│ ├── bazarr/ # Bazarr client
│ ├── seerr/ # Seerr client
│ ├── autobrr/ # Autobrr client
│ ├── cleanuparr/ # Cleanuparr client
│ ├── mylar/ # Mylar3 client
│ ├── jackett/ # Jackett client
│ └── nzbhydra/ # NZBHydra2 client
├── tools/ # adjacent automation utilities
│ └── flaresolverr/ # FlareSolverr Cloudflare-bypass client
├── metadata/ # shared metadata types (Rating, Image, Person, ...)
│ ├── video/ # TMDb, TheTVDB, Fanart.tv, OMDb, TVmaze, OpenSubtitles
│ ├── anime/ # AniList, Kitsu, AniDB, MAL
│ ├── music/ # MusicBrainz, Last.fm, Discogs, TheAudioDB, Spotify, Deezer
│ ├── tracking/ # Trakt, Simkl, Letterboxd, ListenBrainz
│ ├── adult/ # StashBox, TPDB
│ ├── book/ # Google Books, Open Library
│ └── game/ # IGDB, RAWG, Steam, MobyGames, SteamGridDB, RetroAchievements, ScreenScraper, Hasheous, LaunchBox
├── downloadclient/ # shared download types + Downloader interface
│ ├── qbit/ # qBittorrent WebUI client
│ ├── transmission/ # Transmission RPC client
│ ├── deluge/ # Deluge JSON-RPC client
│ ├── rtorrent/ # rTorrent XMLRPC client
│ ├── sabnzbd/ # SABnzbd client
│ ├── nzbget/ # NZBGet JSON-RPC client
│ └── queue/ # Unified read-only queue snapshot
├── mediaserver/ # shared media server types
│ ├── plex/ # Plex Media Server client
│ ├── jellyfin/ # Jellyfin client
│ ├── emby/ # Emby client
│ ├── tautulli/ # Tautulli client
│ ├── audiobookshelf/ # Audiobookshelf client
│ ├── komga/ # Komga client
│ ├── navidrome/ # Navidrome client
│ ├── kavita/ # Kavita client
│ ├── stash/ # StashApp GraphQL client
│ └── tdarr/ # Tdarr client
├── anime/ # shared anime types
│ └── shoko/ # Shoko Server client
Requires Go 1.26+. See CONTRIBUTING.md for full details.
# Set up workspace (local dev, links all 63 modules)
go work init && find . -name 'go.mod' -not -path './.workingdir/*' -exec dirname {} \; | xargs go work use
# Run all tests
make test-all
# Lint all modules
make lint-all
# Tidy all modules
make tidy-all
# Format all modules
make fmt-allIf goenvoy saves you time, a coffee helps ☕
- Pure stdlib (ADR-0001).
depguardin CI enforces. - Per-module independent semver (ADR-0002). Tags:
<path>/vX.Y.Z. - Every release: cosign-signed checksums + SPDX SBOM + SLSA-L3 provenance.
- Every merged commit: 0 lint / 0 gosec / 0 govulncheck / race-green across all modules.
- AGENTS.md / CLAUDE.md for agent-assisted development conventions.
docs/adr/for all architectural decisions (Nygard format).
See CONTRIBUTING.md and SECURITY.md.
Praetor manages this repository's declared governance policy. This managed block records adoption state; it is not a verification certificate.
Verification: make verify-all runs the repository's configured
verification cascade.
HISS Audit: praetorctl audit enforces policy, generated-surface
integrity, and the debt ratchet.
Context Sync: praetorctl compile-context --verify verifies every
generated agent context against AGENTS.md.
Documentation: make docs-lint enforces locked Markdown style and the
private scratch-link policy.
Debt Baseline: .standards-baseline.json anchors the debt ratchet at
5 recorded infractions; audit forbids growth.