# Warp desktop client The [web client](../web/README.md) in a native window, built with [Wails v3](https://v3alpha.wails.io). Every screen is the web client's: `warp-desktop` embeds the same build `warp-web` does and serves it through the same Go package (`apps/web/host`), so web and desktop don't drift apart. It runs on Windows (WebView2), macOS (WKWebView) and Linux (WebKitGTK). ``` window ──► wails.localhost ──► shell (this app) ── the web client, /config.json │ first-run page, links └──────────────────────────────────────────────► homeserver /_matrix/* ``` Unlike `warp-web`, the desktop app isn't installed next to one homeserver, so it proxies nothing. The client calls the homeserver directly, the way any Matrix client does; homeservers answer CORS for every origin. The Content-Security-Policy allows the homeserver plus any `https:` and `wss:` origin, because the call backend (the LiveKit JWT service and SFU) is learned from the homeserver at run time and can't be listed in advance. ## What it adds to the web client - **First run asks for the homeserver.** A server name (`example.org`) or an address. Discovery follows `/.well-known/matrix/client` and checks `/_matrix/client/versions`. If the well-known document names an address that doesn't answer, the typed address is used when that one works. **File → Change homeserver…** asks again. A session already signed in keeps the server it signed in to until you sign out, so changing the homeserver never sends one server's access token to another. - **Links to other sites open in the system browser.** That covers a URL in a message, `target="_blank"` and `window.open`. Without this they would replace the app in its window or open a bare webview window. `/_desktop/links.js` does it; the shell adds a `