Skip to content

Feature/simplified layout - #649

Merged
braginini merged 8 commits into
mainfrom
feature/simplified-layout
May 25, 2026
Merged

Feature/simplified layout#649
braginini merged 8 commits into
mainfrom
feature/simplified-layout

Conversation

@braginini

@braginini braginini commented May 23, 2026

Copy link
Copy Markdown
Contributor

Issue ticket number and link

The 1st step of simplifying the UI layout that addresses the Peers view. Changes of the tables and moving of teh setup keys to settings wil lfollow.

Splits the Peers sidebar entry into User Devices (/peers/users) and Servers (/peers/servers), with /peers redirecting to User Devices and a shared kind filter splitting peers
by whether the owner is a real user vs a service/no-user. The Servers page description and an inline link replace what was the old "Setup Keys" sidebar item under Peers.

Refines the shared Peers table: drops the Beta badge from Control Center, removes the inline Connect column (SSH/RDP now live in the 3-dot action menu, gated to online
non-mobile peers), shortens the DNS label in the address cell (full label still copies), and renders the Groups column as a single N Groups count badge (with the existing
hover card + edit affordances).

Tailors the Install NetBird modal to the audience via a tri-state isUserDevice flag (defaults preserve legacy callers like /install):

  • User Devices (/peers/users): mobile shown, Docker hidden.
  • Servers (/peers/servers): mobile hidden, Docker shown, plus an inline setup-key step (between install and run) where the operator clicks Generate Key — a POST /setup-keys
    with type=one-off, 24-hour expiry, no auto-groups. The generated key flows into every OS tab's netbird up --setup-key=… command; before generation a SETUP_KEY placeholder
    keeps the command shape visible.
  • Long netbird up commands now break across multiple shell-continuation lines so they don't overflow the Code block.
Screenshot 2026-05-23 at 22 33 24 Screenshot 2026-05-23 at 22 40 38 Screenshot 2026-05-23 at 22 40 10

Documentation

Select exactly one:

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

netbirdio/docs#766

Summary by CodeRabbit

  • New Features

    • Peers split into "User Devices" and "Servers" sections with updated navigation and /peers now directing to User Devices.
    • Remote-access actions (SSH, RDP) available for non-mobile, connected devices.
    • Inline one‑off setup key generation added to the installer.
  • Improvements

    • Table can switch between Users/Servers and shows relevant filters and actions.
    • Shortened DNS labels for readability.
    • Group badges support optional count-only display.
    • Enhanced OS-specific install flows and command rendering.

Review Change Stack

braginini and others added 7 commits May 15, 2026 11:06
Nest Peers as a collapsible group with three children: User Devices
(/peers/users), Servers (/peers/servers) and Setup Keys. Each peer
sub-page reuses PeersTable with a new kind prop that filters by whether
the peer's owner is a real user (devices) or a service user / no user
(servers). /peers now redirects to /peers/users so old links keep
working. Also drops the Beta badge from Control Center.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Toolbar: replace the wide All/Online/Offline ButtonGroup with a single
OnlineStatusFilter dropdown, drop DataTableRowsPerPage in favor of
initialPageSize=25, and add a UserFilterSelector scoped to users who
own at least one peer in the current view.

Columns: remove the inline Connect column; fold SSH and RDP launchers
into the existing 3-dot action menu (gated to non-mobile online
peers). Shorten the DNS label in the address cell to its leading
segment; CopyToClipboardText gains a textToCopy prop so the full
label still lands on the clipboard. Collapse the Groups column to a
single count badge via a new countOnly flag on MultipleGroups /
GroupsRow.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Roll back the toolbar-filter changes from the previous commit so the
filter UI on /peers/users and /peers/servers matches what was on main:
the All/Online/Offline ButtonGroup and DataTableRowsPerPage are back,
and the OnlineStatusFilter popover, UserFilterSelector dropdown,
hidden user_id_filter column, and initialPageSize=25 are gone. The
kind split itself stays — both views still scope to their respective
peer populations. Non-filter changes (Connect column folded into the
action menu, DNS-label shortening, Groups countOnly) are unaffected.
A follow-up PR will reintroduce the richer filter UI on its own.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the existing hideDocker prop with a single semantic
isUserDevice flag on SetupModal/SetupModalContent and AddPeerButton.
SetupModalContent derives hideDocker = isUserDevice internally, so
the call sites pick the audience (user device vs server) and the
modal handles the display differences. PeersTable now passes
isUserDevice={kind === "users"} so the User Devices Add Peer flow
omits Docker. Onboarding flows that previously set hideDocker={true}
switch to isUserDevice={true}. This sets up a single hook for the
Servers-specific changes coming next.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
When isUserDevice is explicitly false (Add Peer from /peers/servers),
the modal now hides mobile, keeps Docker, and inserts an inline
setup-key generation step between install and run. The Generate
button posts to /setup-keys (one-off, 24h, no auto_groups, no "All"
group) and lifts the resulting key into a shared state so every OS
tab splices it into the netbird up / docker run command. Before
generation the command shows a SETUP_KEY placeholder so the shape
stays visible.

isUserDevice becomes tri-state (true / false / undefined) so legacy
call sites (/install, InstallNetBirdButton, ReverseProxyTargetSelector,
routing-peer onboarding) keep their pre-existing behaviour via the
undefined branch.

The key step heading carries a HelpTooltip explaining what a setup
key is plus a Learn more link. Pre-generation the banner is just a
Generate button; post-generation it shows the key, copy action, and
a one-line single-use / 24-hour reminder.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Drop the size=xs from the Generate Key button so it matches the
other primary actions in the modal (e.g. Download NetBird), restore
the "Generate" → "Generate Key" label, and revert the server-flow
description to the original "install and run NetBird with the setup
key as a parameter" copy so user-device and server flows read
consistently.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Long netbird up commands overflowed the modal's Code block once
--setup-key, --hostname, or --management-url were spliced in. Introduce
a shared NetBirdUpCommand helper that drops the command across multiple
shell-continuation lines (with trailing backslashes) so the full
invocation stays on screen and still copy/pastes cleanly. Linux,
Windows, and macOS tabs (main + accordion paths) now render through
the helper; unused getNetBirdUpCommand imports are cleaned up.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@braginini
braginini requested review from heisbrot and mlsmaycon May 23, 2026 20:44
@coderabbitai

coderabbitai Bot commented May 23, 2026

Copy link
Copy Markdown
Contributor

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f830bdfd-6db4-4c97-b180-c17748e9aea0

📥 Commits

Reviewing files that changed from the base of the PR and between bd54ae8 and 42d15ce.

📒 Files selected for processing (2)
  • src/app/(dashboard)/peers/servers/page.tsx
  • src/app/(dashboard)/peers/users/page.tsx

📝 Walkthrough

Walkthrough

Splits the legacy peers route into /peers/users and /peers/servers (legacy /peers now redirects), refactors SetupModal for user-device vs server flows with inline key generation, and updates PeersTable, cells, and navigation to support the new flows.

Changes

Peers Route Restructuring and Navigation Updates

Layer / File(s) Summary
Route redirection and new pages/layouts
src/app/(dashboard)/peers/page.tsx, src/app/(dashboard)/peers/users/page.tsx, src/app/(dashboard)/peers/users/layout.tsx, src/app/(dashboard)/peers/servers/page.tsx, src/app/(dashboard)/peers/servers/layout.tsx
The legacy /peers route now redirects to /peers/users. New /peers/users and /peers/servers pages render permission-gated views that join peers to users and render PeersTable inside PeersProvider. Both subroutes export metadata using globalMetaTitle and use BlankLayout.
Navigation sidebar refactoring for peers routes
src/layouts/Navigation.tsx
Replaces the direct "Peers" and standalone "Setup Keys" items with a collapsible "Peers" parent containing "User Devices" (/peers/users) and "Servers" (/peers/servers) children (gated by !isRestricted) and nests "Setup Keys" under that parent (gated by permission.setup_keys.read). Simplifies "Control Center" label.

Setup Modal Refactoring for User Device and Server Flows

Layer / File(s) Summary
SetupModal core contract and isUserDevice flow logic
src/modules/setup-netbird-modal/SetupModal.tsx
Adds isUserDevice?: boolean to SetupModal/SetupModalContent, computes effectiveSetupKey, and derives hideDocker, hideMobile, and showKeyGenerator from isUserDevice and setupKey; updates title/header/tab visibility and forwards props to OS-specific tabs.
Setup key generator and parameter utilities
src/modules/setup-netbird-modal/SetupModal.tsx
Adds SetupKeyGenerator to create one-off setup keys via /setup-keys with clipboard support; extends SetupKeyParameter and NetBirdUpCommand to accept placeholder/setupKeyPlaceholder and conditionally include --setup-key.
Docker tab setup key and content flow support
src/modules/setup-netbird-modal/DockerTab.tsx
Accepts setupKeyContent and setupKeyPlaceholder, inserts optional banner step, computes step offset, and renders Docker command using either real key or placeholder.
Linux tab and NetBirdUpCommand refactor
src/modules/setup-netbird-modal/LinuxTab.tsx
Adds setupKeyContent/setupKeyPlaceholder, computes dynamic runStep and usingSetupKey, and renders NetBirdUpCommand for command steps instead of assembling commands manually.
macOS tab CLI flow and command rendering refactor
src/modules/setup-netbird-modal/MacOSTab.tsx
Adds setupKeyContent/setupKeyPlaceholder, derives step numbers and flags (useCliRun, usingSetupKeyParam) to branch between CLI and manual flows, and uses NetBirdUpCommand in terminal/HomeBrew paths.
Windows tab CLI and fallback flow support
src/modules/setup-netbird-modal/WindowsTab.tsx
Adds setupKeyContent/setupKeyPlaceholder, computes dynamic step numbers, optionally renders setup-key content as its own step, and selects between NetBirdUpCommand CLI step or fallback Connect+signup sequence.
Onboarding integration with isUserDevice
src/modules/onboarding/networks/OnboardingAddUserDevice.tsx, src/modules/onboarding/p2p/OnboardingFirstDevice.tsx
Updates onboarding to pass isUserDevice={true} into SetupModalContent (replacing prior hideDocker usage).

Peers Table Filtering and UI Cell Updates

Layer / File(s) Summary
PeersTable kind-based filtering and AddPeerButton integration
src/modules/peers/PeersTable.tsx, src/components/ui/AddPeerButton.tsx
Adds `PeersTableKind = "users"
Groups badge and GroupsRow forwarding
src/components/ui/MultipleGroups.tsx, src/modules/common-table-rows/GroupsRow.tsx, src/modules/peers/PeerGroupCell.tsx
Adds countOnly?: boolean to MultipleGroups to render a single "N Groups" badge when enabled; GroupsRow forwards countOnly and PeerGroupCell passes countOnly={true}.
PeerAddressCell DNS label display and copy
src/components/CopyToClipboardText.tsx, src/modules/peers/PeerAddressCell.tsx
Adds shortDnsLabel helper to display truncated DNS label while CopyToClipboardText gains textToCopy?: string to copy the full peer.dns_label. Adjusts layout width constraints.
PeerActionCell remote access conditional rendering
src/modules/peers/PeerActionCell.tsx
Adds OS detection and imports SSH/RDP dropdown buttons; computes showRemoteAccessItems (non-mobile && connected) and conditionally renders SSH/RDP entries with a separator.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • netbirdio/dashboard#514: Updates onboarding device flows to use SetupModalContent isUserDevice={true}, overlapping with setup modal changes in this PR.

Suggested reviewers

  • mlsmaycon
  • heisbrot

"🐰 I hopped through routes, split them true,
Modal keys twinkled, placeholders too.
Tables now whisper users or servers by kind,
Groups hide tidy, DNS shortened to mind.
A tiny rabbit cheers the devs, well-timed!"

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 8.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Title check ❓ Inconclusive The title is vague and overly broad; 'Feature/simplified layout' lacks specificity about the main changes (Peers sidebar split, modal refinements). Provide a more descriptive title such as 'Split Peers into User Devices and Servers with modal refinements' to clarify the primary changes.
✅ Passed checks (3 passed)
Check name Status Explanation
Description check ✅ Passed The description covers the core changes with detail but is missing required template section on documentation choice validation and has incomplete docs PR URL field.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/simplified-layout

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

src/app/(dashboard)/peers/servers/page.tsx

Oops! Something went wrong! :(

ESLint: 9.39.2

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property 'configs' -> object with constructor 'Object'
| property 'flat' -> object with constructor 'Object'
| ...
| property 'plugins' -> object with constructor 'Object'
--- property 'react' closes the circle
Referenced from: /.eslintrc.json
at JSON.stringify ()
at /node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2255:45
at Array.map ()
at ConfigValidator.formatErrors (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2246:23)
at ConfigValidator.validateConfigSchema (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2277:84)
at ConfigArrayFactory._normalizeConfigData (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3123:19)
at ConfigArrayFactory._loadConfigData (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3088:21)
at ConfigArrayFactory._loadExtendedShareableConfig (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3393:21)
at ConfigArrayFactory._loadExtends (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3261:25)
at ConfigArrayFactory._normalizeObjectConfigDataBody (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3199:25)
(node:2) ESLintRCWarning: You are using an eslintrc configuration file, which is deprecated and support will be removed in v10.0.0. Please migrate to an eslint.config.js file. See https://eslint.org/docs/latest/use/configure/migration-guide for details. An eslintrc configuration file is used because you have the ESLINT_USE_FLAT_CONFIG environment variable set to false. If you want to use an eslint.config.js file, remove the environment variable. If you want to find the location of the eslintrc configuration file, use the --debug flag.
(Use node --trace-warnings ... to show where the warning was created)

src/app/(dashboard)/peers/users/page.tsx

Oops! Something went wrong! :(

ESLint: 9.39.2

TypeError: Converting circular structure to JSON
--> starting at object with constructor 'Object'
| property 'configs' -> object with constructor 'Object'
| property 'flat' -> object with constructor 'Object'
| ...
| property 'plugins' -> object with constructor 'Object'
--- property 'react' closes the circle
Referenced from: /.eslintrc.json
at JSON.stringify ()
at /node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2255:45
at Array.map ()
at ConfigValidator.formatErrors (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2246:23)
at ConfigValidator.validateConfigSchema (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:2277:84)
at ConfigArrayFactory._normalizeConfigData (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3123:19)
at ConfigArrayFactory._loadConfigData (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3088:21)
at ConfigArrayFactory._loadExtendedShareableConfig (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3393:21)
at ConfigArrayFactory._loadExtends (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3261:25)
at ConfigArrayFactory._normalizeObjectConfigDataBody (/node_modules/@eslint/eslintrc/dist/eslintrc.cjs:3199:25)
(node:2) ESLintRCWarning: You are using an eslintrc configuration file, which is deprecated and support will be removed in v10.0.0. Please migrate to an eslint.config.js file. See https://eslint.org/docs/latest/use/configure/migration-guide for details. An eslintrc configuration file is used because you have the ESLINT_USE_FLAT_CONFIG environment variable set to false. If you want to use an eslint.config.js file, remove the environment variable. If you want to find the location of the eslintrc configuration file, use the --debug flag.
(Use node --trace-warnings ... to show where the warning was created)


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

🧹 Nitpick comments (1)
src/modules/setup-netbird-modal/SetupModal.tsx (1)

478-487: 💤 Low value

Silent clipboard failure is acceptable but consider minimal feedback.

The empty catch {} is a common pattern for clipboard operations since they can fail silently due to browser permissions or lack of focus. The success path shows a notification, so users know when it works. If you want to improve UX, you could add a brief error notification, but this is not blocking.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/setup-netbird-modal/SetupModal.tsx` around lines 478 - 487, The
empty catch in the copy function swallows clipboard errors; update the catch to
provide minimal feedback by calling notify with an error title/description (or
at least console.debug) so users get informed on failure; locate the copy
function that uses generatedKey?.key and navigator.clipboard.writeText and add a
small error notification via the existing notify(...) call inside the catch
block.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/app/`(dashboard)/peers/servers/page.tsx:
- Around line 37-47: The peersWithUser mapping uses users without checking the
users-loading state, causing peers to temporarily lack user data and be
misclassified as kind={"servers"}; update the logic (both where peersWithUser is
computed and the similar block around lines 79-84) to gate rendering until users
are loaded: use the loading flag from useUsers (e.g., isLoading or similar) or
check users !== undefined before mapping or before rendering the table, and
preserve peer.user as undefined only after users finish loading so kind
determination waits for users data (adjust the peersWithUser computation and the
server-table rendering condition accordingly).
- Line 113: The SetupModalContent invocation on the servers onboarding page
currently omits the server/client flow flag; update the call to pass the
explicit prop isUserDevice={false} so SetupModalContent uses the server
onboarding rules (locate the JSX element SetupModalContent in page.tsx and add
the isUserDevice prop with value false).

In `@src/app/`(dashboard)/peers/users/page.tsx:
- Around line 37-47: The table readiness logic is ignoring the users loading
state causing temporary empty results when kind={"users"}; update the mapping
that builds peersWithUser (and the similar mapping at lines ~77-82) to respect
useUsers' loading state (from useUsers) — either wait until users are loaded
before applying users?.find(...) or add a separate isUsersLoading check so you
don't filter out rows while loading; ensure peersWithUser only substitutes user
when users are available (keep user undefined/null while loading) and that any
downstream filter by kind={"users"} accounts for the loading flag to avoid a
transient empty table.

---

Nitpick comments:
In `@src/modules/setup-netbird-modal/SetupModal.tsx`:
- Around line 478-487: The empty catch in the copy function swallows clipboard
errors; update the catch to provide minimal feedback by calling notify with an
error title/description (or at least console.debug) so users get informed on
failure; locate the copy function that uses generatedKey?.key and
navigator.clipboard.writeText and add a small error notification via the
existing notify(...) call inside the catch block.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ce32c548-54c2-42aa-982d-85b5f9729f52

📥 Commits

Reviewing files that changed from the base of the PR and between 42cd088 and bd54ae8.

📒 Files selected for processing (21)
  • src/app/(dashboard)/peers/page.tsx
  • src/app/(dashboard)/peers/servers/layout.tsx
  • src/app/(dashboard)/peers/servers/page.tsx
  • src/app/(dashboard)/peers/users/layout.tsx
  • src/app/(dashboard)/peers/users/page.tsx
  • src/components/CopyToClipboardText.tsx
  • src/components/ui/AddPeerButton.tsx
  • src/components/ui/MultipleGroups.tsx
  • src/layouts/Navigation.tsx
  • src/modules/common-table-rows/GroupsRow.tsx
  • src/modules/onboarding/networks/OnboardingAddUserDevice.tsx
  • src/modules/onboarding/p2p/OnboardingFirstDevice.tsx
  • src/modules/peers/PeerActionCell.tsx
  • src/modules/peers/PeerAddressCell.tsx
  • src/modules/peers/PeerGroupCell.tsx
  • src/modules/peers/PeersTable.tsx
  • src/modules/setup-netbird-modal/DockerTab.tsx
  • src/modules/setup-netbird-modal/LinuxTab.tsx
  • src/modules/setup-netbird-modal/MacOSTab.tsx
  • src/modules/setup-netbird-modal/SetupModal.tsx
  • src/modules/setup-netbird-modal/WindowsTab.tsx

Comment thread src/app/(dashboard)/peers/servers/page.tsx Outdated
Comment thread src/app/(dashboard)/peers/servers/page.tsx Outdated
Comment thread src/app/(dashboard)/peers/users/page.tsx Outdated
// one click away inside the three-dot menu.
const peerOs = getOperatingSystem(peer?.os);
const isMobile =
peerOs === OperatingSystem.ANDROID || peerOs === OperatingSystem.IOS;

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is wrong. Android is supported

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The change reflects the current state of the functionality (main). Apparently, I don't see that "Connect" is supported for the Android devices in the current version of the table.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Android (and iOS) was explicitly skipped. PeerConnectButton.tsx lines 19–22:

  const os = getOperatingSystem(peer?.os);
  const isMobile = os === OperatingSystem.ANDROID || os === OperatingSystem.IOS;
  if (isMobile) return;

So the old Connect column cell returned nothing for Android/iOS peers — the button never rendered. My replacement in PeerActionCell.tsx keeps the same gating
(showRemoteAccessItems = !isMobile && !!peer.connected), so behavior is preserved: SSH/RDP items in the 3-dot menu also hide for Android/iOS peers.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can add android support tho

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

we can do in a small change later

@braginini
braginini merged commit a604643 into main May 25, 2026
6 checks passed
@braginini
braginini deleted the feature/simplified-layout branch May 25, 2026 11:09
This was referenced May 27, 2026
@ramphex

ramphex commented Jun 5, 2026

Copy link
Copy Markdown

Instead of having different sections for User Devices and Servers, it should've been a toggle. Now I can't see the entire list of all devices. This UX behavior removes functionality, not adds to it.

This was referenced Jun 26, 2026
ocoj pushed a commit to ocoj/dashboard that referenced this pull request Jul 17, 2026
Splits the Peers sidebar entry into User Devices (/peers/users) and Servers (/peers/servers), with /peers redirecting to User Devices and a shared kind filter splitting peers
by whether the owner is a real user vs a service/no-user. The Servers page description and an inline link replace what was the old "Setup Keys" sidebar item under Peers.
ocoj pushed a commit to ocoj/dashboard that referenced this pull request Aug 16, 2026
Splits the Peers sidebar entry into User Devices (/peers/users) and Servers (/peers/servers), with /peers redirecting to User Devices and a shared kind filter splitting peers
by whether the owner is a real user vs a service/no-user. The Servers page description and an inline link replace what was the old "Setup Keys" sidebar item under Peers.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants