Tyllo: a bookmark manager for everything on my network
A single-file dashboard for my internal tools, with live widgets for Proxmox, servers, Spotify and speakers.
Between Proxmox, the NAS, Home Assistant, the media apps, the arcade cabinet and a pile of half-forgotten admin pages, I had a few dozen internal tools and no good way to reach them. Browser bookmarks went stale, and every dashboard I tried was either heavy or didn’t look right.
So I built Tyllo. At heart it’s a bookmark manager for my internal tools, with live widgets alongside the links.
The bookmark manager
Everything starts with the tiles. Each tool gets a tile with a name, an address, a description and an icon, and tiles live in groups that collapse and expand.
The parts that make it more than a link list:
- Icons without the faff. Upload one, pick from an icon library, or hit Find online and Tyllo reads the tool’s page for its favicon. Auto-fix all tiles gives every tile without an icon one in a single pass and matches the tile colour to it.
- Edit on the grid. Press and hold a tile and it wiggles. Tap one to edit it, and drag tiles to reorder or move them between groups.
- Status at a glance. Each tile can check whether the tool is up, so I can tell what’s down before I click.
- Ctrl+K command palette. Type a few letters in order (
rdrfinds Radarr) and hit Enter. Pinned and recently used tools rank first. - Search that falls through. If nothing on the page matches, the same box searches the web with a prefix:
gfor Google,cfor Claude, and so on.
Widgets for the things I actually watch
Tyllo has a small module system. A module is a folder with a manifest, an HTML widget and an optional server-side file. Four of mine earn their place every day.
Proxmox
Nodes, VMs and containers, what’s running, CPU and memory, and the fullest storage. It uses a Proxmox API token and works with the free edition. If I allow it, each machine gets start, shut down and reboot buttons, and the destructive ones need a second tap.
Linux servers over SSH
CPU, memory, disks, uptime, failed units and chosen services, read with read-only commands as an unprivileged user. I add the widget once per server. Host keys are remembered on first connect, so there’s no agent to install on the machines.
Spotify Connect
Now playing with album art, plus play/pause, skip, seek, volume, shuffle and repeat. A device list shows every Spotify Connect device (phones, computers, speakers) with a Play button, and a Play on picker moves the running music between them.
WiiM
Speakers are found automatically on the network, with no addresses to type. It shows what’s playing, with volume, mute, input and output selection and EQ presets, and a drop-down appears when there’s more than one speaker. Each change waits for the speaker to confirm, so the buttons don’t lie.
And the rest
There are also widgets for Home Assistant (a room’s lights, blinds, scenes and thermostats) and a desk of small tools: calculator, timers, converter and a shared notepad.
A Live row at the top of the grid shows one number per widget, such as “Proxmox 4 of 5” or the track that’s playing, and tapping it opens the full widget.
Built to be boring to run
Tyllo is a single Node.js file with no npm install. The theme, icons and wallpapers are embedded when I build it, so deploying means copying a file and restarting a service.
- It runs on my Ubuntu server behind a Cloudflare Tunnel, with Cloudflare Access in front.
- It installs as a PWA.
- It redeploys from a private GitHub repo through a webhook.
- API tokens and secrets live in a data folder that isn’t in git.
And it should look good
Since it’s the page I open most, I gave it some personality: live HTML wallpapers that react to the theme (and to the music, on some), glass tiles, and a logo made of two rounded tiles, a teal bar and an amber stem, forming a T. On the login screen they spin out of the y and slide together.
Live wallpapers cost frames, so the picker shows still thumbnails and only runs a live preview for the one you hover.
What I learned
- Make the common path fast. A dashboard is worth it only if opening a tool takes one keystroke or one tap.
- Read-only by default. The SSH and Proxmox widgets can’t change anything unless I explicitly allow it.
- Confirm, don’t assume. The speaker and Spotify controls wait for the device to confirm before the UI updates.
- Small and boring wins. One file and no dependencies mean there’s very little to break at 11pm.
If you’re building something similar, I’d like to hear what you put on yours.
Further reading
- Proxmox VE API: what the Proxmox widget talks to, and how API tokens work.
- Cloudflare Zero Trust docs: Tunnels and Access, for putting internal tools online without opening ports.
- Spotify Web API: the playback and device endpoints behind the Spotify widget.