Skip to content
Get started
Documentation menu

Outbound connections

This page lists every outbound connection of the hatamoto server, so you can decide what to allow on a locked-down network. Hatamoto sends no telemetry and no usage reports. To close the optional ones on a production server, work through Harden an instance.

Overview

ConnectionToWhenWhat it sendsTurn it off
Update checkhttps://hatamoto.dev/releases/channels/<channel>.jsonAbout every six hours (give or take 30 minutes), first within ten minutes of startOne anonymous GET. No query, cookie or identifier of your install; only the headers Go adds itself.HATAMOTO_UPDATES=off, or the update mode in Settings > Updates (policy)
Update downloadThe same host: the release record and the binaryOnly when the check finds a release the policy installs, or you press Update nowAnonymous GETs, same as aboveHATAMOTO_UPDATES=notify (look, never install) or off
Registryhttps://hatamoto.dev/registry.json, then the package files it listsOnly when an admin opens the Plugins or Themes browser, or installs from it. The public directory page also fetches it when one is servedAnonymous GETHATAMOTO_REGISTRY_URL=off (uploads still work)
AI-crawler IP rangesThe published range files of the crawler operators in the built-in agent registry: Google, Bing, OpenAI, Perplexity, Anthropic, Common Crawl, DuckDuckGo, Apple and AhrefsFirst about 90 seconds after start, then dailyGET with the user agent hatamoto-agent-verifier; no cookies, nothing about your siteHATAMOTO_AGENT_RANGES=off
Reverse DNSYour system's DNS resolverWhen a hit claims to be a crawler whose operator is verified by host name, or whose ranges are not downloaded yet (checked by the worker, every five minutes)A reverse lookup of the visitor's IP address, then a forward lookup of the name it returnsWORKER_DISABLE_JOBS=agent_verify (hits stay unverified)
CaptchaThe provider you pick: Cloudflare Turnstile, Google reCAPTCHA or hCaptchaWhen a visitor submits a form that has the captcha switched onYour secret key, the visitor's captcha token and the visitor's IP addressDo not enable a captcha on the form
EmailThe SMTP host you configureWhen Hatamoto sends a password reset, an invitation or a form notification, or an owner presses Send a test email (Test connection on the captcha settings also reaches the provider)The messageLeave email unconfigured: no saved Settings > Email (Use the server's SMTP_* settings instead removes it) and no SMTP_HOST
WebhooksThe URLs you subscribe in Settings > WebhooksOn the events you pickThe event payload, signedDelete the subscription
PluginsThe hosts a plugin declares in allowed_hosts and you grantedWhen the plugin calls http.fetchWhatever the plugin sendsDo not grant http.fetch; HATAMOTO_PLUGIN_FETCH_PER_MINUTE caps the rate
Embeds in pagesThe visitor's browser, not your server, loads YouTube, Vimeo or map iframesWhen a visitor opens a page that contains oneNothing from the serverRemove the embed; HATAMOTO_EMBED_HOSTS limits which hosts rich text may embed
WordPress importThe WordPress site you import from, every media URL it (or the WXR file) lists, and the --audit-url siteOnly during an import you startRequests for the content and the media filesDo not run an import

Plugin calls, webhooks and the import are checked against private, loopback and link-local addresses before they connect, so they cannot be pointed at your internal network (the command-line import can lift this with --allow-private-hosts, and --audit-url may be local).

Where each one lives in the code

ConnectionCode
Update check, schedulebackend/internal/updater/run.go:43 (checkEvery, checkJitter), first run at :137
Update fetchesbackend/internal/updater/fetch.go:23 (default host), :45 (no headers of its own), :120 (manifest), :128 (record), :147 (download)
HATAMOTO_UPDATESbackend/internal/updater/types.go:31 and :84
Registrybackend/internal/config/packages.go:13 (default URL), :24 (off); backend/internal/packages/registry.go:154; backend/internal/server/admin_packages.go:61; backend/internal/server/registry_directory.go:148
IP rangesbackend/internal/agents/registry.json (hosts); backend/internal/agents/refresh.go:14 and :108 (user agent); backend/internal/worker/scheduler.go:343 (daily, 90 s after start); backend/internal/server/worker_jobs.go:18 and :47 (HATAMOTO_AGENT_RANGES=off)
Reverse DNSbackend/internal/agents/verify.go:128 (LookupAddr); backend/internal/agents/verify_worker.go
Captchabackend/internal/spam/verify.go:28 (endpoints), :85 (fields sent)
Emailbackend/internal/email/, backend/internal/mailsettings/settings.go
Webhooksbackend/internal/webhook/outbound.go, deliver.go
Plugin http.fetchbackend/internal/pluginhost/fetch.go:20
Embedsbackend/internal/render/funcs.go:128; backend/internal/entity/sanitize.go:19