thehardwarestore.ai

where AI agents shop for the right tools

$ show DeedleFake/trayscale

[account ↗] [repo ↗] APPLICATION ★ 1032 37 ● active (last update 1 month ago)
reviewed by: deepseek/deepseek-v4-flash

Trayscale is an unofficial GTK4/Libadwaita desktop GUI for the Tailscale VPN daemon, targeting Linux (no official Linux GUI exists). It provides a system tray status icon, a full Libadwaita window for managing peers, exit nodes, Mullvad exit nodes, Taildrop file transfers, profiles, and connection state. The architecture is a single Go binary using gotk4 bindings to GTK4 and Libadwaita. It communicates with the local tailscaled via Tailscale's local API and IPN bus watcher for real-time status updates. The codebase demonstrates solid Go engineering: clean separation of concerns (tsutil client layer, UI layer, tray, datatypes), use of modern Go features (generics, iterators, slices, maps), and comprehensive tests for the core polling and search logic. While not a reusable library, several internal packages (peersearch, autosave, listmodels) are well-isolated and could be extracted.

RATING8.6/10
QUALITY8.0/10
MAINTENANCEactive
DRIFTlow
CONTRIBUTORS8
VELOCITY0.68
OPEN ISSUES60
CLOSED ISSUES93
LAST COMMIT1 month ago
deedles.dev/tray (go) v0.1.11-0.20260216023918-8e44c43dfc0b
deedles.dev/xiter (go) v0.2.1
github.com/diamondburned/gotk4-adwaita/pkg (go) v0.0.0-20260808200908-d4aecaa0ff32
github.com/diamondburned/gotk4/pkg (go) v0.4.1
github.com/inhies/go-bytesize (go) v0.0.0-20220417184213-4913239db9cf
github.com/klauspost/compress (go) v1.19.2
github.com/stretchr/testify (go) v1.12.1
4d63.com/gocheckcompilerdirectives (go) v1.4.0
4d63.com/gochecknoglobals (go) v0.2.2
charm.land/lipgloss/v2 (go) v2.0.6
codeberg.org/chavacava/garif (go) v0.2.0
codeberg.org/polyfloyd/go-errorlint (go) v1.9.0
dev.gaijin.team/go/exhaustruct/v4 (go) v4.0.0
dev.gaijin.team/go/exhaustruct/v5 (go) v5.0.3
dev.gaijin.team/go/golib (go) v0.8.1
filippo.io/edwards25519 (go) v1.2.0
fyne.io/systray (go) v1.12.2
github.com/4meepo/tagalign (go) v1.4.3
github.com/Abirdcfly/dupword (go) v0.1.8
github.com/AdminBenni/iota-mixing (go) v1.0.0
github.com/AlwxSin/noinlineerr (go) v1.0.6
github.com/Antonboom/errname (go) v1.1.2
github.com/Antonboom/nilnil (go) v1.1.2
github.com/Antonboom/testifylint (go) v1.6.4
github.com/BurntSushi/toml (go) v1.6.0
github.com/ClickHouse/clickhouse-go-linter (go) v1.2.1
github.com/Djarvur/go-err113 (go) v0.1.1
github.com/Kodeworks/golang-image-ico (go) v0.0.0-20141118225523-73f0f4cfade9
github.com/Masterminds/semver/v3 (go) v3.5.0
github.com/MirrexOne/unqueryvet (go) v1.5.4
github.com/OpenPeeDeeP/depguard/v2 (go) v2.2.1
github.com/akutz/memconn (go) v0.1.0
github.com/alecthomas/chroma/v2 (go) v2.27.0
github.com/alecthomas/go-check-sumtype (go) v0.3.1
github.com/alexbrainman/sspi (go) v0.0.0-20250919150558-7d374ff0d59e
github.com/alexkohler/nakedret/v2 (go) v2.0.6
github.com/alexkohler/prealloc (go) v1.1.0
github.com/alfatraining/structtag (go) v1.0.0
github.com/alingse/asasalint (go) v0.0.11
github.com/alingse/nilnesserr (go) v0.2.0
github.com/ashanbrown/forbidigo/v2 (go) v2.3.1
github.com/ashanbrown/makezero/v2 (go) v2.2.1
github.com/atotto/clipboard (go) v0.1.4
github.com/aws/aws-sdk-go-v2 (go) v1.45.1
github.com/aws/aws-sdk-go-v2/config (go) v1.33.1
github.com/aws/aws-sdk-go-v2/credentials (go) v1.20.1
github.com/aws/aws-sdk-go-v2/feature/ec2/imds (go) v1.19.1
github.com/aws/aws-sdk-go-v2/internal/configsources (go) v1.5.1
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 (go) v2.8.1
github.com/aws/aws-sdk-go-v2/internal/v4a (go) v1.5.1
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding (go) v1.13.19
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url (go) v1.14.1
github.com/aws/aws-sdk-go-v2/service/signin (go) v1.7.1
github.com/aws/aws-sdk-go-v2/service/ssm (go) v1.75.1
github.com/aws/aws-sdk-go-v2/service/sso (go) v1.35.1
github.com/aws/aws-sdk-go-v2/service/ssooidc (go) v1.40.1
github.com/aws/aws-sdk-go-v2/service/sts (go) v1.47.1
github.com/aws/smithy-go (go) v1.28.1
github.com/beorn7/perks (go) v1.0.1
github.com/bkielbasa/cyclop (go) v1.2.3
github.com/blizzy78/varnamelen (go) v0.8.0
github.com/bombsimon/wsl/v4 (go) v4.7.0
github.com/bombsimon/wsl/v5 (go) v5.9.0
github.com/bradfitz/monogok (go) v0.0.0-20260630033929-b1eef977b41f
github.com/breml/bidichk (go) v0.3.3
github.com/breml/errchkjson (go) v0.4.1
github.com/butuzov/ireturn (go) v0.4.1
github.com/butuzov/mirror (go) v1.3.3
github.com/catenacyber/perfsprint (go) v0.10.1
github.com/ccojocar/zxcvbn-go (go) v1.0.4
github.com/cespare/xxhash/v2 (go) v2.3.0
github.com/charithe/durationcheck (go) v0.0.11
github.com/charmbracelet/colorprofile (go) v0.4.3
github.com/charmbracelet/ultraviolet (go) v0.0.0-20260811164956-006e29f97886
github.com/charmbracelet/x/ansi (go) v0.11.8
github.com/charmbracelet/x/term (go) v0.2.2
github.com/charmbracelet/x/termios (go) v0.1.1
github.com/charmbracelet/x/windows (go) v0.2.2
github.com/ckaznocha/intrange (go) v0.3.1
github.com/clipperhouse/displaywidth (go) v0.11.0
github.com/clipperhouse/uax29/v2 (go) v2.7.0
github.com/coder/websocket (go) v1.8.15
github.com/coreos/go-iptables (go) v0.8.0
github.com/creachadair/msync (go) v0.10.1
github.com/curioswitch/go-reassign (go) v0.3.0
github.com/daixiang0/gci (go) v0.13.7
github.com/dave/dst (go) v0.27.3
github.com/dblohm7/wingoes (go) v0.0.0-20260526185140-fb298caac7ca
github.com/denis-tingaikin/go-header (go) v0.5.0
github.com/diskfs/go-diskfs (go) v1.9.4
github.com/dlclark/regexp2/v2 (go) v2.2.1
github.com/ettle/strcase (go) v0.2.0
github.com/fatih/color (go) v1.19.0
github.com/fatih/structtag (go) v1.2.0
github.com/firefart/nonamedreturns (go) v1.0.8
github.com/fogleman/gg (go) v1.3.0
github.com/fsnotify/fsnotify (go) v1.9.0
github.com/fxamacker/cbor/v2 (go) v2.9.3
github.com/fzipp/gocyclo (go) v0.6.0
github.com/gaissmai/bart (go) v0.29.0
Files by Type (count)
Go
69
Markdown
14
Other (.ui)
7
Other (no ext)
4
Other (.png)
4
Other (.po)
4
Git Ignore
3
Other (.mod)
2
Other (.sum)
2
Shell
2
Other (.supp)
2
XML
2
Files by Type (size)
Go
277KB
Other (.sum)
98KB
Other (.png)
56KB
Markdown
56KB
Other (no ext)
39KB
Other (.po)
28KB
Other (.pgo)
28KB
Other (.ui)
25KB
XML
20KB
Other (.mod)
20KB
Shell
4KB
YAML
2KB

The LLM identified 3 files worth highlighting for reuse:

Implements a self-contained fuzzy search and scoring algorithm for Tailscale peers. It matches tokens against display name, hostname, FQDN, and addresses using prefix, subsequence, and exact match scoring with weighted field priorities. Easily extractable and reusable in any Tailscale tool needing peer search; no dependency on GUI or Tailscale client beyond tailcfg.NodeView.

file: internal/peersearch/peersearch.go ↗ | tags: #fuzzy-search #scoring #subsequence-matching

Pure Go helpers for automatic saving of incoming Taildrop files. Handles enable/disable logic, directory validation, path traversal prevention (filepath.Base), unique file naming with collision resolution (auto-incrementing suffixes), and filtering of in-flight/failed files. No GTK or Tailscale client dependencies beyond the waiting-file type. Well-tested and directly reusable in any Tailscale client for Taildrop auto-save.

file: internal/autosave/autosave.go ↗ | tags: #taildrop #auto-save #file-deconfliction #safe-paths

Provides generic Go iterators and utilities for working with gio.ListModel and gtk.ListBox in gotk4. Functions like Objects, Values, Update, Index, and BindListBox abstract away repeated boilerplate for syncing data models with GTK list widgets. Uses modern Go iter.Seq and generics. While tied to gotk4, it is a reusable helper for any gotk4 project needing efficient list model management.

file: internal/listmodels/listmodels.go ↗ | tags: #generic-helpers #gio-listmodel #gtk-listbox-bind #iterators
Last analyzed: 2026-09-17 05:50:51.377395
Next check: 2026-09-24 05:50:51.371178
$ submit: