Quickstart
Get a working Saturn discovery exchange in five steps. Each step works against the same _saturn._tcp.local. advertisement; pick the language tab you prefer.
1. Confirm your OS speaks mDNS
Saturn rides on Bonjour (macOS, Windows + Bonjour Print Services) or Avahi (Linux). You almost certainly already have one.
Install Bonjour Print Services. The dns-sd command lands in %PROGRAMFILES%\Bonjour\.
2. Browse the network for Saturn services
package main
import ( "context"; "fmt"; "github.com/grandcat/zeroconf" )
func main() {
r, _ := zeroconf.NewResolver(nil)
entries := make(chan *zeroconf.ServiceEntry)
go r.Browse(context.Background(), "_saturn._tcp", "local.", entries)
for e := range entries { fmt.Println(e.Instance, e.Port, e.Text) }
}
If nothing appears, no responder is running on your LAN. Skip to step 5 to start one.
3. Resolve one instance to host + port + TXT
The TXT record is the wire artifact you build clients against. → TXT keys reference
4. Call the OpenAI-compatible endpoint
Any OpenAI-compatible client works — the discovered URL drops in as base_url.
5. Run your own responder
Use any Bonjour/Avahi tool that registers a service. Example with avahi-publish:
The responder broadcasts on mDNS. Every device on the LAN now sees it via step 2.
What just happened
You browsed _saturn._tcp.local., resolved an SRV+TXT pair, and called an OpenAI-compatible HTTP endpoint. No accounts, no manual URLs, no per-app keys. The advertisement is reachable from any conformant mDNS stack — none of the steps above required Saturn-specific code.
Next steps
- Tutorial — build a discovery-aware client end-to-end (~30 min).
- How-to: advertise a service — task-shaped recipes.
- Protocol reference — full TXT schema and endpoint contract.