Wispers Access logo
## About Wispers Access Wispers Access makes it easy to share a web app with your coworkers, friends, or family without having to publish it to the internet. Guests install the Wispers Access app, scan a QR code, and then simply browse your app. No need to deal with the complexity and security risk of exposing your app.

A terminal minting a Wispers Access invite, and a phone showing the shared app it unlocks

A perennial problem with self-hosted software is that it's hard to give people access to it. Whether it's your company's ERP software, that vibe-coded app your team likes, or your private photo archive at home, they're not very useful if people can't reach them. You could put your app on the internet, but that's increasingly hard to do securely. Anything reachable from the internet gets probed around the clock, by scripts and by AI agents. VPNs can help, but your phone can only be on one at a time, and your relatives may not want to set one up. Wispers Access solves this by automatically connecting your guests' devices through secure peer-to-peer channels to the machines running the web apps you want to share. Internally, the secure connections work like VPN connections, but because they're at the application level, they never clash, not even with your existing VPN. All your guests see is an app that magically connects them to your web app. No cloud service has access to your app or your traffic. The peer-to-peer channels are built on [iroh](https://iroh.computer) or on our own [Wispers Connect](https://connect.wispers.dev). Finding each other (and relaying when no direct path exists) still needs rendezvous servers in the cloud, but those servers are cryptographically unable to eavesdrop on your traffic or to inject malicious nodes. ## Project status Wispers Access is currently in open beta. Guests can find the apps (plus an installation guide) at [access.wispers.dev](https://access.wispers.dev). Direct links: * Android: [Play Store](https://play.google.com/store/apps/details?id=dev.wispers.access.android). * iOS: [TestFlight](https://testflight.apple.com/join/AjsJChhq), until App Store review is through. * Desktop (macOS, Windows, Linux): [GitHub releases](https://github.com/s-te-ch/wispers-access/releases?q=%22Wispers+Access+desktop%22). Instructions for setting up the server are in the quick start section below. ## Quick start To get a first taste without installing anything on a server, grab a live invite code at [access-demo.wispers.dev](https://access-demo.wispers.dev) and jump straight to [step 4](#4-open-it-on-a-phone). But you'll really want to share your _own_ app. To do this, you need `waserver` on a machine next to the app you want to share, and a client on each guest device. ### 1. Install waserver On Linux or macOS: ```sh curl -fsSL https://raw.githubusercontent.com/s-te-ch/wispers-access/main/install.sh | sh ``` This puts the newest `waserver` and `waclient` into `/usr/local/bin`. You can also just download the binaries from the [releases page](https://github.com/s-te-ch/wispers-access/releases). Or if you prefer containers, follow the quick start in the [container README](waserver/docker/README.md) instead. There's also a [hosting guide](docs/hosting.md) and the [FAQ](docs/faq.md). ### 2. Share your app Say the app you want to share is listening on port 3000 (for apps that use several ports or origins, see [Apps on several origins](docs/hosting.md#apps-on-several-origins)). Then, ```sh waserver init team "Awesome Team" ``` This creates a *share* for your team and prints the path of its `share.toml`. Add the app to that TOML file (`waserver edit team` opens the file in your editor): ```toml [[app]] id = "myapp" name = "My App" upstream = ":3000" # host:port, or :port for localhost ``` That's the config done. Now serve the share: ```sh waserver serve team ``` (`waserver start team` runs it in the background instead.) If you later edit `share.toml`, make sure to apply the changes with `waserver reload team`. `waserver edit team` does both in one go. ### 3. Invite a device Next, invite somebody to the share you just created. Invites are minted by the running server from step 2, so run this in a second terminal (or use `waserver start team`): ```sh waserver invite team "Alice's phone" alice@example.com --png invite.png ``` This produces the invite in three different formats: a `wax1_…` invite code to copy-paste, an ASCII art QR code to scan with the phone, and the same QR code as a PNG. The user ID (`alice@example.com`) is a label you choose. `waserver` sends this label to your app with every proxied request, in the `x-wispers-access-user` header. ### 4. Open it on a phone If you haven't yet, install a Wispers Access client. Choose Android or iOS from https://access.wispers.dev. The device you're installing it on does _not_ have to be on your LAN or VPN. Open the app, tap **+**, and scan the QR code (or copy-paste the invite code). The shared app opens right inside Wispers Access. ### … or on a desktop For desktop (macOS, Windows and Linux), choose a client from https://access.wispers.dev and install it (the certificate we used to sign the Windows client is pretty fresh, so SmartScreen may show a warning). Open the app, click "+ Add a share", paste the invite code (`wax1_...`), click "Join". When opening a shared app on desktop, your system browser will open a new tab and show the app there. Finally, if you'd rather stick to the CLI, there's also [`waclient`](docs/waclient.md) (installed together with `waserver`). It's useful for local testing but not something you'd tell your relatives to install =) ## When to use something else Wispers Access shares web apps with specific, invited people, without having to publish those apps to the internet. Adjacent use cases may be better served by other tools. Some examples: - **ngrok** and friends are the fastest way to put a dev server on a public URL. If you _want_ the whole internet to reach your app, that's the tool. - **Cloudflare Tunnel** publishes an app through Cloudflare's edge, with optional access control in front. Great for public sites and for teams already on Cloudflare. The trade-off is that Cloudflare terminates TLS and sees your traffic. - **Tailscale** and other mesh VPNs connect whole devices into one private network. If you can get everyone and all their devices onto a single tailnet, that's a great solution. The Wispers author couldn't, got annoyed, and started Wispers =) What sets Wispers Access apart is the trust model: connections are end-to-end encrypted _and_ membership is verified peer-to-peer, so the rendezvous server cryptographically cannot read your traffic or sneak a device into your share. Tunnel providers and mesh-VPN coordination servers have to be trusted on one or both of these. ## Choosing peer-to-peer transports Wispers Access includes two distinct libraries for establishing secure peer-to-peer connections between the host node and the guest nodes, iroh (the default) and Wispers Connect. You can specify a transport when initialising a share, with `--transport=iroh` or `--transport=wispers-connect`. If in doubt, go with iroh. It's quickly becoming a standard for peer-to-peer connectivity. Wispers Connect is the home-grown version, created before iroh was published. The upside of Wispers Connect is that we can fix bugs or implement features ourselves. ## Licensing Everything you need to run Wispers Access is open source: - **Wispers Access** (this repo) is [MIT licensed](LICENSE), as are the underlying [iroh](https://github.com/n0-computer/iroh) (MIT or Apache-2.0) and [wispers-connect](https://github.com/s-te-ch/wispers-client) libraries. - **The standalone hub**, [wispers-hub](https://github.com/s-te-ch/wispers-hub), is AGPL-3.0. The managed Wispers Connect backend at [connect.wispers.dev](https://connect.wispers.dev) offers a free personal tier.