From 22710ee202c070379089620607a2237bb083118a Mon Sep 17 00:00:00 2001 From: Luiz Guilherme D'Abruzzo Pereira <707366+luiz290788@users.noreply.github.com> Date: Mon, 2 Feb 2026 11:19:54 -0300 Subject: [PATCH] feat(server): add --mdns-domain flag to customize mDNS hostname Allow users to specify a custom domain name for mDNS service discovery instead of the hardcoded 'opencode.local'. This enables running multiple OpenCode instances on the same network with distinct mDNS names. The option can be set via CLI flag (--mdns-domain) or config file (server.mdnsDomain). Closes #11794 --- packages/opencode/src/cli/cmd/web.ts | 2 +- packages/opencode/src/cli/network.ts | 9 ++++++++- packages/opencode/src/config/config.ts | 1 + packages/opencode/src/server/mdns.ts | 5 +++-- packages/opencode/src/server/server.ts | 10 ++++++++-- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/opencode/src/cli/cmd/web.ts b/packages/opencode/src/cli/cmd/web.ts index 5fa2bb4264..0fe056f21f 100644 --- a/packages/opencode/src/cli/cmd/web.ts +++ b/packages/opencode/src/cli/cmd/web.ts @@ -63,7 +63,7 @@ export const WebCommand = cmd({ UI.println( UI.Style.TEXT_INFO_BOLD + " mDNS: ", UI.Style.TEXT_NORMAL, - `opencode.local:${server.port}`, + `${opts.mdnsDomain}:${server.port}`, ) } diff --git a/packages/opencode/src/cli/network.ts b/packages/opencode/src/cli/network.ts index fe5731d071..dd09e1689f 100644 --- a/packages/opencode/src/cli/network.ts +++ b/packages/opencode/src/cli/network.ts @@ -17,6 +17,11 @@ const options = { describe: "enable mDNS service discovery (defaults hostname to 0.0.0.0)", default: false, }, + "mdns-domain": { + type: "string" as const, + describe: "custom domain name for mDNS service (default: opencode.local)", + default: "opencode.local", + }, cors: { type: "string" as const, array: true, @@ -36,9 +41,11 @@ export async function resolveNetworkOptions(args: NetworkOptions) { const portExplicitlySet = process.argv.includes("--port") const hostnameExplicitlySet = process.argv.includes("--hostname") const mdnsExplicitlySet = process.argv.includes("--mdns") + const mdnsDomainExplicitlySet = process.argv.includes("--mdns-domain") const corsExplicitlySet = process.argv.includes("--cors") const mdns = mdnsExplicitlySet ? args.mdns : (config?.server?.mdns ?? args.mdns) + const mdnsDomain = mdnsDomainExplicitlySet ? args["mdns-domain"] : (config?.server?.mdnsDomain ?? args["mdns-domain"]) const port = portExplicitlySet ? args.port : (config?.server?.port ?? args.port) const hostname = hostnameExplicitlySet ? args.hostname @@ -49,5 +56,5 @@ export async function resolveNetworkOptions(args: NetworkOptions) { const argsCors = Array.isArray(args.cors) ? args.cors : args.cors ? [args.cors] : [] const cors = [...configCors, ...argsCors] - return { hostname, port, mdns, cors } + return { hostname, port, mdns, mdnsDomain, cors } } diff --git a/packages/opencode/src/config/config.ts b/packages/opencode/src/config/config.ts index b0164e8aa8..54ca94ae4d 100644 --- a/packages/opencode/src/config/config.ts +++ b/packages/opencode/src/config/config.ts @@ -860,6 +860,7 @@ export namespace Config { port: z.number().int().positive().optional().describe("Port to listen on"), hostname: z.string().optional().describe("Hostname to listen on"), mdns: z.boolean().optional().describe("Enable mDNS service discovery"), + mdnsDomain: z.string().optional().describe("Custom domain name for mDNS service (default: opencode.local)"), cors: z.array(z.string()).optional().describe("Additional domains to allow for CORS"), }) .strict() diff --git a/packages/opencode/src/server/mdns.ts b/packages/opencode/src/server/mdns.ts index 953269de44..778afa26ac 100644 --- a/packages/opencode/src/server/mdns.ts +++ b/packages/opencode/src/server/mdns.ts @@ -7,17 +7,18 @@ export namespace MDNS { let bonjour: Bonjour | undefined let currentPort: number | undefined - export function publish(port: number) { + export function publish(port: number, domain?: string) { if (currentPort === port) return if (bonjour) unpublish() try { + const host = domain ?? "opencode.local" const name = `opencode-${port}` bonjour = new Bonjour() const service = bonjour.publish({ name, type: "http", - host: "opencode.local", + host, port, txt: { path: "/" }, }) diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts index f6dd0d122f..015553802a 100644 --- a/packages/opencode/src/server/server.ts +++ b/packages/opencode/src/server/server.ts @@ -563,7 +563,13 @@ export namespace Server { return result } - export function listen(opts: { port: number; hostname: string; mdns?: boolean; cors?: string[] }) { + export function listen(opts: { + port: number + hostname: string + mdns?: boolean + mdnsDomain?: string + cors?: string[] + }) { _corsWhitelist = opts.cors ?? [] const args = { @@ -591,7 +597,7 @@ export namespace Server { opts.hostname !== "localhost" && opts.hostname !== "::1" if (shouldPublishMDNS) { - MDNS.publish(server.port!) + MDNS.publish(server.port!, opts.mdnsDomain) } else if (opts.mdns) { log.warn("mDNS enabled but hostname is loopback; skipping mDNS publish") }