Companion to Should Seed become a browser?. The work that follows from this page is in Plan: a very secure browser in Seed.
If Seed desktop shows real websites, it takes on the job every browser has: keep hostile pages away from the user's data, accounts and computer. This page lists what that means for Seed, starting with security. It was revised after reading the desktop, daemon and release code on 2026-10-05.
What is at stake
A normal browser protects the user's signed-in sessions and their computer. A browser inside Seed sits next to more:
Signing keys. Seed desktop signs documents, comments and capabilities for the user's accounts, and can export keys.
The local daemon. It serves an API on localhost with the user's private documents, keys, contacts and wallets behind it.
The Seed app itself. The app window has privileged APIs (IPC to the main process, file dialogs, key import and export, window control) that a web page must never reach.
Hypermedia identity. A page that can make Seed show the wrong author, or sign something as the user, breaks the one thing the protocol promises.
Every website is untrusted. A bug that would leak one site's cookies in Chrome could leak keys or private documents in Seed.
The ground rules
Everything else on this page follows from five rules.
Websites never reach anything that is Seed's. Not the daemon, not the app's IPC, not the keys, not other windows. This has to hold at the network layer (the daemon refuses them) and at the process layer (the page cannot talk to the app), not only in the UI.
Chromium fixes ship within days, not months. A browser is only as safe as its engine. Seed desktop has to be on a supported Electron line at all times, and the pane has to turn itself off when it is not.
Deny by default, grant by click. Permissions, popups, downloads, switches to Seed pages, agent access. Nothing happens because a page asked.
Verify, do not trust. Every rule above is a test that runs a hostile page in the real Electron build in CI. A rule without a test does not count.
Say what Seed does not do. No password autofill, no extensions, no sync, no "make Seed your default browser". General browsing happens in the user's real browser, one click away.
Security
Keeping Chromium up to date
Seed renders websites with the Chromium version bundled in our Electron release. Chrome ships security fixes every week or two, often for bugs attackers already use. Electron supports its latest three major versions, and today Seed desktop is behind that line, so the bundled Chromium has not received security fixes since May 2026. In the last year Electron was bumped twice.
Move to a supported Electron now, and commit to a maximum lag behind Electron's stable security releases.
Make auto-update fast and reliable, and sign update manifests so the update channel cannot be used against us.
Add a kill switch: when the bundled Chromium is older than the policy allows, the pane turns off and links open in the user's real browser.
Protecting the local daemon
The daemon's localhost API is the most valuable thing on the machine. It must authenticate the desktop app and refuse requests that come from web pages, whatever browser they are in. Browser-side rules about local networks are a second layer, not the first: they differ between Chromium versions, and we measured that they cannot be relied on in the pane as it is today.
Listen on loopback only by default.
Give the desktop app a per-launch secret and require it on every call that reads private data or writes anything. Public content stays public.
Replace the open cross-origin policy with an allowlist of the app's own origins.
Keep a test that runs a page from a public address and proves it gets refused.
Isolating pages from the app
Websites run in an Electron web view inside the same window as the Seed app. One renderer bug in the page must not turn into control of the app.
Guest pages get no preload script, no Node, context isolation, the Chromium sandbox, and web security on. Their settings are built from a fixed allowlist.
Pages get no permissions: no camera, microphone, location, notifications, clipboard reading, or USB, serial and HID devices.
Popups, downloads and switches to Seed pages only happen right after a real click, and downloads always show a save dialog.
Client certificates are never picked automatically, and certificate errors are always fatal.
Move the pane from the webview tag to a main-process-owned WebContentsView, so the app renderer never has web view privileges at all.
Every IPC handler and preload API in the app window has to be written as if a hostile page were one bug away. The app window today also embeds third-party iframes for video and social embeds, strips frame-protection headers for local URLs, and exposes a generic IPC bridge to the renderer. All of that needs the same review as the pane.
Hardening the app binary
A browser inside the app makes the usual Electron hardening non-negotiable: Electron fuses set (no running as Node, no Node options, no CLI inspect, ASAR integrity on), macOS entitlements trimmed to what the app uses, a content security policy on the app's own pages, and a permission handler on the app's own session, not only on the browser partition.
Phishing and the address bar
Browsers spend years on the address bar: the real domain, the lock icon, certificate warnings, look-alike characters in domain names. The web pane today shows only a title and a favicon, and the website controls both. A page can look exactly like a Seed screen or a sign-in page.
Always show the real origin of the page, in an area the page cannot draw over.
Display look-alike (punycode) domains in their raw form.
Never let website content look like a Seed dialog, especially anything that asks to sign or publish.
HTTPS only: upgrade plain http, warn before loading a page that cannot be upgraded.
Seed has one thing Chrome does not: when a page is a Hypermedia site, Seed can verify which account it belongs to and show that identity beside the origin.
Seed links coming from the web
Seed recognizes Hypermedia URLs and opens them as native Seed pages. A website can use this to move the app to a Seed screen, such as site settings or an agent page, without the user asking.
Only switch to a Seed page after a real click on a link, never from a redirect or a script.
Treat a Seed page opened from the web the same as one opened from an unknown email link.
Private networks
A page in the pane can try to reach localhost and the user's home or office network: the daemon, dev servers, routers, printers. The daemon fix above is the real answer for Seed's own API. For everything else, block navigation and requests from public pages to private addresses, including hostnames that resolve to them, and keep an explicit allow for addresses the user typed themselves.
Shared cookies and storage
All websites in the pane share one persistent storage partition, separate from the user's real browser and from the Seed app.
Users must be able to clear it easily ("Clear browsing data" exists in Settings).
Offer a private mode that keeps nothing.
Block third-party cookies, or give each top-level site its own cookie jar.
Signing in to the Seed web vault inside the pane would store web identity keys in that partition. Hypermedia URLs open natively, so this should rarely happen, but it must be checked.
Safety features we do not have
Chrome, Safari and Firefox ship protections that the pane lacks:
warnings for known malware and phishing sites;
a password manager, so users do not type passwords by hand into pages that might be fakes;
content and tracker blocking;
years of tuning for permission prompts, autoplay, and abuse like popup storms.
Some of these are cheap to add with existing open components (blocklists, tracker blocking, secure DNS). A password manager is not. Without it the pane is less safe than the user's normal browser for signing in, which is one more reason to keep it a reading surface.
Privacy
Pages in the pane can fingerprint users like any browser. Tracker blocking and a Global Privacy Control header reduce it; nothing removes it.
Clicking a link in a Seed document must not send the document's address as a referrer.
WebRTC can reveal local network addresses; restrict it to the public interface.
DNS lookups should go over an encrypted resolver.
Imported or archived pages must not keep loading images from the source site, because every load tells that site who opened the document and when.
If agents can use the pane
Letting an agent read and act on a page the user is signed in to is the biggest new risk, because a page can carry instructions meant for the agent. The rules that apply today are on the security task: off until the user allows a website, only for the user's own agents, and agents cannot open private network addresses, fill in secret fields, or post forms to other sites. Any future browser work has to keep those rules, and should add a read-only default where clicks and typing need a second approval.
Other considerations
Sign-in compatibility. Some identity providers block or warn about embedded web views. Expect support requests on day one.
Memory and performance. Each website runs in its own renderer process. Several open pages next to the Seed app will use a lot of memory on smaller laptops.
Accessibility. Browsers have years of screen reader and keyboard work. A web view inside our layout needs its own testing.
History and navigation. Web pages and Seed pages share one back and forward history. That is convenient but can confuse people.
Archives and copyright. Importing a page into a draft is fine for personal notes. Publishing it republishes someone else's work. Keep attribution, and do not make that a one-click action.
Support load. "This site does not work in Seed" will become a common report. "Open in default browser" must always be one click away.
Measuring use. Find out whether people use the pane for reading and importing, which we want, or for general browsing, which we do not want to own.
Before it leaves the experiment
The daemon authenticates the desktop and refuses web pages, with a test from a public-address page.
Seed desktop on a supported Electron, with a lag policy and a kill switch for old builds.
The real origin always visible and unspoofable, HTTPS only.
A security review of the app window's IPC, preload and embed surface with a hostile page loaded.
The isolation and permission rules above covered by tests that run in CI, including the Electron end-to-end test.
Do you like what you are reading? Subscribe to receive updates.
Unsubscribe anytime