Nameplate
nameplate.sh- Category
- Developer Tools
- Rank
- No. 577Tools index
- Pricing
- Open Source
- Platform
- desktop · cli
- Type
- APP
- Builder
- @steipete
- GitHub
- 65 stars
- Latest release
- v0.3.1
- Date
About
Nameplate brands every Mac, Windows, and Linux machine in your fleet with a colored frame, name tag, watermark, and connect splash so you instantly know which machine you just remoted into. All overlays are click-through, fullscreen-safe, and wallpaper-preserving. A fleet config file lets you style every machine from one dotfile, and a bundled CLI lets AI agents summon attention cards when they need a human at the keyboard.
What it does
Every machine in a remote-desktop fleet gets a stable look: a colored frame around each display, a corner name tag, a translucent watermark, and a connect card that plays when a session attaches. A shared JSON file in the user config directory maps lowercase short hostnames to a name, color, and glyph, and edits apply live. Machines with no entry still differ, because the default color is hashed from the hostname across an eight-color palette. Overlay windows are click-through and float above full-screen apps, so nothing changes the wallpaper.
Why it's ranked here
Three implementations ship here, and they are not equal. The Mac side is the deep one: strict concurrency turned on across every target, window levels chosen so menus can still open above the overlay, delayed frame re-syncs because screen data lags a display change, and a fail-safe teardown that acknowledges a waiting caller instead of hanging it. Windows and Linux carry the same identity file and two commands. The build workflow compiles and tests on macOS only, so the other two rest on review alone. Judge it as a strong Mac utility with working ports, not as one even cross-platform app.
What's good
Failure modes got attention. Alert requests are written to disk and announced separately, so a cold launch cannot drop an alert whose notification was missed. Requests older than 120 seconds are discarded, which stops a login replaying stale alerts. The blocking mode returns distinct exit codes for a human click, an app dismissal, and a timeout, so a script can branch on the outcome. Card size is validated before presentation, and an unpresentable card tears itself down rather than leaving a topmost window eating clicks. The hostname read avoids DNS resolution, which would otherwise block launch and trigger a permission prompt.
Tradeoffs
Parity is thin. Blocking acknowledgement, the settings and dismissal commands, and the location field are macOS only. Wayland cannot observe global clicks, so alerts there need an explicit duration, and the compositor must support the layer shell protocol. macOS exposes no public remote-session connect event, so the connect card fires on display wake, screen unlock, and display reconfiguration instead. Those are proxies and can fire with no remote client attached. Linux release tarballs need system GTK4 and X11 libraries already present. Alert duration is clamped between 2 and 120 seconds, so a long-lived banner is not available.
How to use it well
Best fit is someone driving several machines over remote desktop who has lost time typing into the wrong one. Second fit is agent work: a coding agent blocked on approval can raise a topmost card carrying its reason and wait until a human clicks, which suits password prompts and release gates. Pair it with whatever syncs your dotfiles, since identity lives in one small JSON file. It does not do remote control, session recording, or machine inventory, and it sends nothing off the box. Routing that same alert to a phone or a chat channel is a separate tool.
Technical notes+
The macOS app is a SwiftPM package targeting macOS 15 with an app, a CLI, a shared core and two test targets, strict concurrency enabled per target in Package.swift, and Sparkle as the sole dependency. Sources/NameplateCore/Identity.swift holds hostname shortening, hex normalization, WCAG luminance for picking readable text on a colored fill, and an FNV-1a hash that selects the default palette color; Sources/NameplateCore/FleetFile.swift decodes the fleet map and normalizes its keys to short hostnames. Sources/NameplateCore/AttentionRequest.swift is the queued file handoff, with microsecond-stamped filenames sorted lexically for ordering and a 120 second freshness window, and Sources/NameplateCLI/main.swift writes the request, launches the app when needed, posts a Darwin notification, then both polls and waits on a notification for the acknowledgement. Sources/Nameplate/OverlayController.swift builds one borderless non-activating panel per screen at status bar level, and Sources/Nameplate/AttentionController.swift layers pulsating border panels plus a card two levels higher with global and local click monitors. The ports use different transports: linux/nameplate/src/daemon.rs is a newline-delimited JSON Unix socket in the runtime directory that self-spawns the daemon when no socket answers, while windows/Nameplate.App/PipeServer.cs is a single-instance named pipe reading one JSON line per connection. linux/Cargo.toml pins Rust edition 2024 with a 1.92 floor, and .github/workflows/ci.yml runs build, test, and ad-hoc packaging on a macOS runner.
Observed
- License
- MIT
- Languages
- Swift on macOS, Rust on Linux, C# on Windows
- Install surface
- Homebrew cask and formula on macOS and Linux, downloadable ZIP on Windows, DMG on macOS
- Interfaces
- Menu bar or tray app plus a CLI; splash and alert commands on all three platforms
- Platform floors
- macOS 15 on Apple silicon; Swift 6.2 with Xcode 26 to build; .NET 8 SDK for Windows; Rust 1.92 with GTK4 and X11 for Linux
- Configuration
- One JSON fleet file keyed by lowercase short hostname, read by all three platforms, applied live
- Blocking mode
- Wait returns 0 on click, 3 on app dismissal, 4 on timeout or expiry; default wait limit 600 seconds
- Tests
- Two Swift test targets declared in the package manifest; the CI job builds and tests on a macOS runner only
- Updates
- Sparkle for Developer ID builds; Homebrew builds update through Homebrew; dev builds leave it off
- Agent integration
- A bundled skill document describing the human-approval handoff
Read from README.md, Package.swift, docs/cli.md, docs/configuration.md, Sources/NameplateCLI/main.swift, Sources/Nameplate/OverlayController.swift, Sources/Nameplate/AttentionController.swift, Sources/NameplateCore/FleetFile.swift, Sources/NameplateCore/AttentionRequest.swift, Sources/NameplateCore/Identity.swift, linux/nameplate/src/daemon.rs, linux/Cargo.toml, windows/Nameplate.App/PipeServer.cs, skills/nameplate-attention/SKILL.md, .github/workflows/ci.yml.
What it can do
Overlay a colored border frame on a remote desktop display
Machine identifier and chosen color configuration → Persistent colored frame rendered around the screen edges of the target machine
Display a name tag label on a remote machine's screen
Machine name or hostname → Visible name tag overlay on the desktop identifying the machine
Apply a watermark to a machine's display
Custom watermark text or branding configuration → Semi-transparent watermark rendered persistently on the desktop
Show a connect splash screen when a remote session starts
Remote connection event and machine branding settings → Full-screen splash overlay announcing which machine was just connected to
Apply centralized branding styles to an entire fleet of machines
A fleet.json configuration dotfile defining per-machine or global styles → Consistent branded overlays deployed across all machines in the fleet
Trigger an attention card alert on a machine via CLI
CLI command invocation with alert parameters → On-screen attention card displayed to prompt a human to interact with the machine
Integrate AI agent prompts requiring human approval into the desktop display
AI agent request for human-in-the-loop confirmation → Visual attention overlay surfaced on the target machine requesting human input
Tags
Tech Stack
Media

Comments (0)
No comments yet
Editorially curated, with community endorsements as a secondary signal. Corrections welcome.