Ace map · devices

Phone and web

Use Ace from a phone or another device's browser.

testedvisualpartialbrokenuntestedmissingplannednopen gap
^780

Open Ace on your phone over the tailnet

visual
  1. ^781

    Find the phone address

    visual
    Settings → Host → Phone

    Open Settings → Host.

    Open on your phone: a QR code and the host's HTTPS address (https://<machine>.<tailnet>.ts.net:<port+1000>) with a copy button. The QR holds only the address, no token.

    1 Not re-checked after #581 (HTTP address and QR when tailnet HTTPS is off): it needs a host on the tailnet, and this pass ran loopback only.

  2. ^782

    Scan the QR with the phone's camera

    untested
    Settings → Host → Phone

    Point a phone that is on the tailnet at the code.

    The phone opens the HTTPS address.

  3. ^783

    Copy the address

    visual
    Settings → Host → Phone → copy

    The icon turns into a check and the clipboard holds the host's HTTPS tailnet address (https://<machine>.<tailnet>.ts.net:<port>).

  4. ^784

    Open the HTTPS address

    visual
    https://<machine>.<tailnet>.ts.net:<port+1000>

    Open the address on a device signed in to the same tailnet account.

    The full app, at phone size, with no token or sign-in.

  5. ^785

    Open the plain HTTP address

    visual
    http://<machine>.<tailnet>.ts.net:<port> (printed by ace serve)

    The same app over HTTP, which WireGuard encrypts.

    2 Not re-checked after #581 (Voice input needs HTTPS toast): a loopback host refuses any other Host name (Forbidden), so an insecure origin needs a tailnet host.

^786

Add Ace to the home screen

untested
  1. ^787

    Add the HTTPS page to the home screen

    untested
    Safari → Share → Add to Home Screen (Android: ⋮ → Install app)

    An Ace icon that opens full screen, without browser chrome.

    3 The manifest and Apple meta tags are served (/manifest.webmanifest returns 200 on the HTTPS listener), but there is no service worker, so a home-screen Ace has no offline page when the host is unreachable.

^788

Use the team's deployed web app

visual

A Worker-hosted copy of the app with no host of its own; it remembers the host you name and connects to it over the tailnet.

  1. ^789

    Name your host

    tested
    Web app → Connect to your host

    Enter the HTTPS address, such as mac.tailnet.ts.net:5140, and press Connect.

    The app reloads connected to that host.

  2. ^790

    Open a link that names the host

    visual
    https://<web app>/#host=<machine>.<tailnet>.ts.net:5140

    The app remembers the host, drops #host from the URL, and connects.

    4 The 2026-10-22 study's headless browser never connected (no local-network prompt), and nothing documents the #host= link.

  3. ^791

    Change host after a failed connection

    tested
    Web app → banner → Change host

    "Can't reach <host>. Check that Tailscale is on." when the host doesn't answer; <host> refused this web app. On that host, run ace web <origin>, then reload. when it answers but refuses the WebSocket. Change host forgets it and shows Connect again.

  4. ^792

    Let the host accept the web app

    tested
    ace web <https url>, the ACE_WEB_APP env var, or the directory's APP

    The host lets sockets from that origin in, for its owner only.

    5 Done here with ACE_WEB_APP on a second host and the app served over the tailnet certificate; ace web itself is covered under Command line.

    6 Only ace web shows or sets it; the app has no web-app row.

  5. ^793

    Deploy the web app

    untested
    bun --filter @ace/app deploy

    build:web builds with VITE_ACE_WEB=1 into dist-web and wrangler deploys it as ace-app.

^794

How a device gets in

partial
  1. ^795

    Open with the host token on this machine

    tested
    http://127.0.0.1:<port>/#token=<host.token> (what ace open and the desktop app do)

    The app takes the token from the fragment and removes it from the URL. Without it the socket gets 401.

  2. ^796

    Get in over the tailnet as the host's owner

    visual

    The host asks Tailscale (tailscale whois) who is connecting and serves the owner's own browsers; there is no token or pairing step.

  3. ^797

    Pages from other sites are refused

    tested

    A socket from an origin other than the host's own pages or its web app gets 403; a request for an unknown Host name gets 404.

  4. ^798

    A teammate's browser is refused

    tested

    "Open Ace from your own host" (403); teammates reach your channels through their own host.

    7 Re-check, Canary 0.0.54.93: Sam's browser on Nate's host read This is iamnbutler@gmail.com's host. Open Ace from your own host. It shows the owner's full email to anyone on the tailnet and offers no link to your own host.

^799

Use Ace at phone size

partial

Under 40rem wide the sidebars become drawers and navigation moves to a bottom tab bar.

  1. ^800

    Switch areas with the bottom tab bar

    partial
    Dashboard · Channels · Issues · PRs

    Below 26rem the bar names only the current page; the account button fits at 390px.

    8 While the Channels drawer is open the bottom bar can't be tapped.

  2. ^801

    Pick a channel from the Channels drawer

    tested
    Channels tab

    The channel list fills the screen while no channel is open and slides away once one is.

  3. ^802

    Message @ace and read the reply

    tested
    Channel → composer

    The reply streams into the timeline as on desktop.

  4. ^803

    Use the composer toolbar

    tested
    Channel → composer

    At 390px the model name truncates (claude-haik…) and Send stays on screen.

  5. ^804

    Open a Terminal tab

    tested
    Channel → + → Terminal

    A shell in the channel's checkout; typing works with a hardware keyboard.

    9 With three tabs (chat, Diff, Terminal) the Terminal title is still cut to Termina and runs under the machine icon at 390px.

    10 On-screen keyboard input to the terminal is untested.

  6. ^805

    Open a Diff tab

    tested
    Channel → + → Diff

    The channel's changes, or "No file changes".

  7. ^806

    Open channel details

    tested
    Channel → details button (top right)

    A full-screen sheet with summary, changes, branch and channel facts.

  8. ^807

    Open Settings

    tested
    Account button → Settings

    Settings as a sheet; its section tabs wrap onto a second row (Host).

  9. ^808

    Open a project by path

    tested
    Dashboard → Open folder…

    Browsers can't pick a folder on the host, so a dialog asks for the folder's path on the host.

  10. ^809

    Type with the on-screen keyboard

    untested

    The app shrinks to the visible viewport and the tab bar hides while the keyboard is up.

  11. ^810

    Dictate a message

    untested
    Channel → composer → mic
  12. ^811

    Browse issues and pull requests

    visual
    Issues or PRs tab

    At phone width the project picker is in a drawer (Toggle issues sidebar); picking a project closes it.