linecast——终端里的天气、雷达、潮汐和地图
文章摘要
linecast 是开发者 ashuttl 做的一套免费开源终端应用集合,由六个命令组成:weather(天气)、radar(雷达)、sunshine(日照)、moon(月相)、tides(潮汐)和 maps(地图)。作者在 Show HN 自述里给它下的定义很传神——「就像《老农历书》(The Old Farmer’s Almanac)是为 Minitel 而造的」。Minitel 是法国 1980 年代的终端信息服务,这个类比同时点出了它的两个气质:实用的自然信息年鉴,加上纯字符的复古呈现。项目已被 Terminal Trove 选为「本周工具」。
做它的动机很个人化:作者过去两年越来越多地待在终端里,对天气预报的信息架构和设计有自己的执念,同时喜欢「做一些有用的小型终端桌面摆件」这个想法。
技术选择是这个项目最有辨识度的地方。所有画面都用 ANSI 颜色和 Unicode 盲文点阵字符(braille characters)绘制,而不是图形协议——盲文字符每格能表示 2×4 个点,是终端里做「高分辨率」曲线和位图的经典技巧。界面会随终端窗口缩放自动重排,颜色直接取自你当前的终端调色板,甚至在运行期间切换主题也能跟着变。鼠标在合适的地方可用(可拖动、可滚动)。代码只用 Python 标准库,在 macOS 和 Linux 上零依赖,Windows 上也只有两个依赖(tzdata 补时区库,truststore 走系统证书)。
数据源全部是公共免费资源,不需要账号也不需要 API key:天气与空气质量来自 Open-Meteo;预警、潮汐、雷达来自各类公开源;日月位置在本地直接计算;地图用 OpenStreetMap 派生的矢量数据(OpenFreeMap 矢量瓦片)和公开的高程瓦片。
各个子应用的细节:weather 把当前状况、按日照深浅着色的逐小时温度曲线、降水、日温差、空气质量和自然语言比较放在一块仪表盘上,官方预警覆盖 36 个国家。sunshine 灵感来自 Apple Watch 的 Solar 表盘,太阳沿日弧移动,天空在黎明、白昼、黄昏、夜晚之间渐变,还会显示日长相对昨天的变化。moon 画出带真实晨昏线、月海阴影、光晕以及按你所在半球正确定向的月面。tides 的数据在美国来自 NOAA、加拿大来自 CHS,还有昆士兰开放数据和香港天文台,其他地方回落到 Open-Meteo 的全球潮汐模型,所以几乎任何海岸线都能用。radar 在盲文底图上播放近期观测加一小时预报,叠加美国的预警多边形、可选的温度和风场图层以及逐小时红外卫星云图;真实雷达只在北美、欧洲和东亚、东南亚部分地区有公开合成图,其他地方用 LibreWXR 的降水模型补位,页脚会如实标注。maps 把矢量瓦片渲染成实心的水面、陆地、公园和建筑,路网用盲文绘制,支持悬停高亮地物、/ 搜索地名、d 查路线(转向指引面板,翻页时地图沿路线飞行),还有地形视图(全球高程转晕渲和高程色带,从深海海沟到低地绿再到高山白)和带实时日照与云层的可旋转地球仪。
安装方式很齐全:有 uv 的话 uvx linecast weather 可以完全不安装直接跑;也支持 uv tool install、Homebrew tap、AUR、pipx 和 pip;还有一个 get.sh 脚本,用机器上现成的任何 Python 都能起(实在没有就在缓存目录里维护一个小型私有环境,每天检查一次新版本)。linecast link 会在二进制旁边建立 weather、radar 等短命令的符号链接,并自动跳过系统上已被占用的名字。--print 输出单帧静态画面(管道输出时自动切换),天气、日照、月相、潮汐还支持 --json 和适合放进状态栏的 --oneline。作者在 HN 自述里说当时仅支持 macOS 和 Linux(Python 3.10+)、不能在 SSH 下用、Windows 未探索,但项目 README 显示 Windows Terminal 支持随后已经补上(Git Bash 和 mintty 因为被识别为管道,只能拿到静态输出)。许可证是 MIT。
HN 评论精华
这条 Show HN 帖子没有任何评论——截至抓取时是 9 分、0 条评论,Algolia 返回的评论树完全为空。搜索 HN 也没有找到 linecast 的其他提交或被合并的讨论帖,所以这里不存在「讨论被合并到别处」的情况,就是单纯没有引起讨论。为避免虚构,本节不编造任何用户名或发言。
作为替代,这里补充几点原帖自述中值得留意、但正文没有充分展开的取舍:
- 为什么用盲文字符而不是图形协议:Sixel、Kitty graphics、iTerm2 inline images 这类终端图形协议能画真图片,但兼容性碎片化严重。选盲文点阵加 ANSI 颜色,代价是分辨率低,换来的是在几乎任何现代终端里都能跑,而且能随窗口自由重排——这是「终端桌面摆件」这个定位下的合理取舍。
- 颜色取自终端调色板:这个设计决定意味着 linecast 不强推自己的配色,而是融入用户已有的主题;作者甚至处理了运行期间主题热切换的情况。副作用是如果你的主题是单色的,雷达数据也会是单色的——README 对此明确说明,并提供了
dusk、ember、ink、marangai几套本地主题和 LibreWXR 的服务端渲染主题,按t切换。 - 对数据可信度的诚实处理:雷达在没有公开合成图的地区回落到降水模型时,页脚会明确告诉你「你现在看到的不是真雷达」。这种在 UI 里标注数据来源降级的做法,在这类小工具里并不常见。
- 零依赖的代价:只用标准库意味着 HTTP、TLS、时区、矢量瓦片解析、图形绘制全部自己写。好处是安装极快、供应链风险低;坏处是维护面积不小,而且 Windows 上还是不得不引入
tzdata和truststore两个依赖,因为标准库在这两件事上确实补不上。