家里有台 Mac mini 跑着一堆自建服务,设备和端口越来越多,记不住哪个服务在哪台机器的哪个端口,于是写了个 tailnet 主页。
GitHub: https://github.com/muzig/tailscale-home 在线演示(虚构数据,建议手机打开): https://muzig.github.io/tailscale-home/

它做什么
- 读
tailscale status/tailscale serve status,自动列出 tailnet 里所有设备(在线/离线、IP 、MagicDNS 名,点一下复制)和 serve 出来的服务 - 可选探测在线设备的常见 Web 端口;手写的服务和书签放在
services.json,和自动发现的去重 - 可达性由扫描端实测,不可达的磁贴会标出来
- 桌面端键盘直达:方向键选择、回车打开、Esc 返回
- 手机上是 Windows Phone 8.1 开始屏幕:黑底、4 列磁贴、转门动画、动态磁贴,左滑进 A–Z 全部服务列表
整个项目就一个静态 HTML + 一个只用标准库的 Python 脚本,没有构建、没有框架、没有数据库。
顺便的副产品:手机上改代码的闭环
这个页面本身就是这样开发的:
- 开发机上开着
claude,打开 Remote Control - 出门在外,用手机 Claude App 说「手机上磁贴小一点」
- Claude 改代码、commit 、push → 家里 Mac mini 上的自建 Gitea Actions 自动构建部署(一分钟内)
- 同一部手机刷新
https://<服务器>.<tailnet>.ts.net,直接看真实页面
全程不需要 VPS 、公网 IP 、端口转发、域名和证书(tailscale serve 自动签 *.ts.net 的 HTTPS ),除了本来就在用的 Claude 订阅,其他都免费。
和 Homepage / Glance 的区别
它们是功能完整的仪表盘(小组件、几十种集成),代价是一份要手动维护的 YAML 。这个做得少得多:tailnet 本身就是配置,设备和服务自动出现;代码小到十分钟读完,fork 了随便改。想要小组件还是推荐 Homepage / Glance 。
部署
- macOS:Gitea + runner ,push 即部署(仓库里就是我自己在用的 workflow )
- Linux:
docker compose up+ 一个 systemd 定时器,或者直接用ghcr.io/muzig/tailscale-home镜像 - 只想看看:clone 下来
python3 -m http.server就能跑演示数据
MIT 协议。欢迎提意见,尤其是:
- 手机上的交互还有哪里别扭
- 你的 tailnet 里有什么服务识别不出来 / 图标不对
- Linux 部署踩到的坑
