Mist provides the technical foundation DNS isolation layer within the Land
ecosystem. Mist operates a local authoritative DNS server for the
editor.land zone, ensuring all private network communication stays on loopback
and preventing sidecars from reaching unauthorized external hosts.
The reset was the opposite: editor.land is the former domain; production
runtime traffic now uses editor.land.
Mist is a Rust library built on Hickory DNS. It exposes a public API for
starting the server, querying the bound port, and constructing resolvers. The
DNS catalog contains two zones: an authoritative zone for editor.land and a
restricted forward allowlist for external queries.
graph TB
subgraph "Mist - DNS Isolation Server"
LibRS["lib.rs\nPublic API: start / dns_port"]
ServerRS["server.rs\nHickory UDP + TCP listeners"]
ZoneRS["zone.rs\neditor.land zone authority"]
ResolverRS["resolver.rs\nDNS resolver for consumers"]
ForwardSecurity["forward_security.rs\nExternal allowlist enforcement"]
end
subgraph "DNS Catalog"
AuthZone["editor.land zone\n*.editor.land → 127.0.0.1"]
ForwardZone["Forward allowlist\nupdate.editor.land only"]
DNSSEC["DNSSEC\nECDSA P-256 zone signing"]
end
subgraph "Consumers"
Mountain["Mountain\nDnsPort managed state"]
SideCar["SideCar\nNode.js DNS environment variable"]
Cocoon["Cocoon\neditor.land resolution"]
end
LibRS --> ServerRS
ServerRS --> ZoneRS
ServerRS --> ForwardSecurity
ZoneRS --> AuthZone
ZoneRS --> DNSSEC
ForwardSecurity --> ForwardZone
LibRS --> ResolverRS
Mountain --> LibRS
SideCar --> ResolverRS
Cocoon --> ResolverRS
| Path | Description |
|---|---|
Source/lib.rs |
Public library API: start(port), dns_port(), module re-exports |
Source/server.rs |
Hickory DNS server: UDP/TCP socket binding, catalog wiring, async accept loop |
Source/zone.rs |
editor.land zone configuration: SOA, A records, wildcard resolution |
Source/resolver.rs |
LandDnsResolver - DNS client pointed at the local server for consumer use |
Source/forward_security.rs |
Forward allowlist: rejects external queries not on the approved list |
tests/integration.rs |
Integration tests: zone resolution, DNSSEC verification, forward blocking |
sequenceDiagram
participant App as Application (Wind / Cocoon)
participant Resolver as Land DNS Resolver
participant MistServer as Mist DNS Server
participant Catalog as DNS Catalog
App->>Resolver: resolve("api.editor.land")
Resolver->>MistServer: DNS query (UDP 127.0.0.1:PORT)
MistServer->>Catalog: Lookup "api.editor.land"
Catalog->>MistServer: A record → 127.0.0.1 (authoritative)
MistServer->>Resolver: DNS response with RRSIG
Resolver->>App: 127.0.0.1
App->>Resolver: resolve("external.example.com")
Resolver->>MistServer: DNS query
MistServer->>Catalog: Lookup "external.example.com"
Catalog->>MistServer: Not in allowlist → REFUSED
MistServer->>Resolver: REFUSED response
Resolver->>App: Resolution error
Startup sequence:
- Mountain calls
Mist::start(5380)during initialization. - Mist attempts to bind to port 5380; if unavailable,
portpickerselects an alternative. - The bound port is stored in Mountain's
DnsPortmanaged Tauri state. - Mountain passes the port to Air and SideCar so they configure their DNS clients accordingly.
| Connecting Element | Direction | Mechanism | Description |
|---|---|---|---|
| Mountain | Consumer | Mist::start() Rust API |
Mountain starts Mist and stores the port in DnsPort managed state |
| SideCar | Consumer | Environment variable | SideCar passes the DNS port to spawned Node.js processes via NODE_EXTRA_CA_CERTS / DNS override |
| Cocoon | Indirect consumer | Node.js DNS override | Cocoon resolves cocoon.editor.land and Mountain gRPC addresses through Mist |
| Parameter | Value | Description |
|---|---|---|
| Preferred port | 5380 |
Primary bind port; falls back to any available port if taken |
| Bind address | 127.0.0.1 |
Loopback only - no external interface exposure |
| Authoritative zone | editor.land |
All subdomains resolve to 127.0.0.1 |
| Forward allowlist | update.editor.land |
Only this domain may be resolved externally |
| DNSSEC algorithm | ECDSA P-256 | Zone signing key algorithm |
| Transport | UDP + TCP | Hickory serves both; clients may use either |
DNSSEC signing is performed at zone load time. The DNSKEY and RRSIG records are
included in responses to clients that request DNSSEC data (DO bit set).