Skip to content

The iOS app, so far

We're building a native iPhone and iPad app for Nekotopia. It isn't a VPN app: WireGuard stays in its own app, as it should. This one is a console for your account, showing what your tunnel is doing, what you've used, what's switched on, and the bTen machines. Here's where it stands, including what isn't finished.

Written up afterwards

Written on 25 September 2026 from the app's session notes and commit history, and dated to the most recent build. The app isn't on TestFlight or the App Store yet.

What shipped

11 Apr: an empty project. The Xcode project was created in April and then left alone while the network work took priority.

11 Sep: the foundation. The app signs in with the same session the website uses, so there's no separate API or token to keep in step. It has four screens (Overview, Access, Usage, Account), light and dark appearance, and monospaced readings in the same cyan instrument style as the website. It could only run in the simulator that day, on sample data that says it's sample data.

13 Sep: on a real phone. The first install on a physical iPhone, and the same day:

  • Passkeys. Sign in with Face ID or Touch ID instead of a password, and manage your passkeys under Account. The server side went live the same day. Enrolling and signing in with a passkey on a real device hasn't been fully proven yet, so we're not calling it done.
  • Live usage. Upload and download gauges that update every few seconds, only while Overview is on screen and the app is in the foreground, backing off if the server is struggling. Your monthly allowance, what's left and when it resets come from a new endpoint that's scoped to your account. If the accounting is stale or ambiguous, the app says so and doesn't show a number.
  • Where you are, and where your tunnel is. Your phone's public address and country are shown separately from your tunnel's.
  • Service controls. Tunnel Enable, Torus Access and nSolo Access can be switched from the app, which reads back the saved state after every change. nColo is shown but can't be switched, because the only control that exists releases your prefix rather than pausing it.
  • Your website avatar and display name on the Account screen.

Running the app and the web dashboard at the same time also turned up two bugs in the website: logouts after a brief network blip, and a request limit sized for one client. Both are covered in the September round-up.

20 Sep: the console, and a release candidate. Version 1.0 now has the full Torus console (Overview, Access, Usage, Configure) and a native bTen collection where you can browse the machines, import or paste an SSH public key, and request an account on each machine. It also has a branded sign-in screen, app icons, a launch screen and a privacy manifest. Build 4 adds support and privacy links and a way to request account deletion from the app. It's tested with targeted UI tests on iPhone and iPad, in light, dark and landscape.

What we left out on purpose

  • Round-trip time. An early design had an RTT reading. We don't yet have a real measurement of latency between your hub and your node, and timing an API call isn't the same thing, so the reading was removed rather than faked.
  • An SSH terminal or a VPN engine. Configure hands off to the website, and WireGuard stays in the WireGuard app.
  • Claims about enforcement. The switches show what's saved on your account. Proof that every router enforces it is separate work, tracked on the network side.

What's between here and the App Store

  • Distribution signing. Build 4 archives and verifies, but exporting it for App Store distribution is blocked on our Apple developer account setup. That's our paperwork, not the app.
  • Account deletion. The app only starts deletion; the server does the rest. The server side needs reworking before we'll ship the button, so that deleting an account reliably removes everything, everywhere, and doesn't report success when something failed.
  • Privacy details. Our privacy statements need to match what the site and app actually do before we answer Apple's privacy questions.
  • Real-world testing. Password and passkey sign-in on real devices and disposable accounts, VoiceOver and Dynamic Type, then TestFlight.

By the numbers

6 commits to the app's Swift repository (1 in April, 5 in September) and 4 to its documentation and test repository, with 14 session notes behind them.