Repository navigation
feat(web,mobile): your devices in Linked environments - #170
Merged
Merged
Conversation
jayleaton
force-pushed
the
feat/linked-devices-rows
branch
from
October 30, 2026 10:15
7d26952 to
f670495
Compare
Thread transfer impact✅ Thread transfer remains within every enforced ceiling.
Baseline: Scenario and decoded snapshot size10 historical turns, 5 command tools per turn, 878.9 KiB retained MCP result per historical turn, and a 1.05 MiB retained result in the measured turn.
Updated in place by a trusted workflow. PR artifacts are strictly validated and never executed. |
jayleaton
force-pushed
the
feat/linked-devices-rows
branch
from
October 30, 2026 10:52
f670495 to
422f385
Compare
jayleaton
changed the base branch from
feat/mesh-contracts-pr2
to
feat/tailnet-device-open
October 30, 2026 10:52
Linked environments listed only this machine's links, so your other tailnet devices and their access were invisible. The section now merges the server's device list with its links by environmentId: each device shows how it is linked, its status, an access level, Revoke/Restore, and on web Open, which adds it to this app without a pairing code. The header holds automatic linking and the default access. Servers that cannot list devices yet show a quiet "not available" note instead of an error. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Open now asks the host for a credential and hands it to ConnectionOnboarding.registerDevice, the one path that redeems it at the first address answering as that device. Rows note when a device below full access opens read-only. The section also offers the stricter capability rule, and the remote-access guide covers your tailnet devices. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
jayleaton
force-pushed
the
feat/linked-devices-rows
branch
from
October 30, 2026 11:00
422f385 to
af71d17
Compare
jayleaton
marked this pull request as ready for review
October 30, 2026 11:13
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Linked environments listed only the links this machine made, so you couldn't see or manage your other tailnet devices' access.
What changed
packages/client-runtime):state/tailnetDeviceswrapstailnetDevices.list | setAccess | updateSettings | openDevice. The three mutations usecreateEnvironmentRpcCommand, and the UI gates on theirpermissionAtom.tailnet-devicesholdslinkedDeviceRows, which merges the device list, this environment's links and this app's saved environments by environmentId. It also holdsisTailnetDevicesForbidden.requireCapability) and "Access for new devices", all throughupdateSettings.openDevice, thenConnectionOnboarding.registerDevicefrom feat(server,client-runtime): apps open any of my devices without a code #173, so there's one redemption path. A device below full access shows "Opens read-only", matching the server's scope rule. Open doesn't show for devices already saved here.LinkedEnvironmentsSection: the same rows. Tapping a row expands its access levels, Revoked included. Revoke asks to confirm; choosing a level restores the device.docs/user/remote-access.mdgets a "Your tailnet devices" section: automatic linking on one Tailscale account, access and revoke/restore, pairing codes for everything else, and thet3.codes/devicecapability option. The Labs paragraph now says linked environments is on by default.Risk: low. Changes are confined to the Linked environments section and new client-runtime modules. Open only adds an environment through the existing onboarding path.
Verification
vp test run src/tailnetDevices.test.ts(client-runtime): 3 passed.TailnetDevices.listoutput decodes through the contract's JSON codec into the expected rows (revoked incoming-only device, tailnet link, paired link).Screenshots: placeholder, coming from Captain's integrated pass.
🤖 Generated with Claude Code · Claude Opus 5.5 in T3 Code