Article summary — original

作者开发 F1 Quote/0:把赛程、积分与赛果搬上桌面电子纸 为了摆脱频繁在手机中查找 F1 赛事信息的繁琐步骤,作者为少数派共创的 Quote/0 电子纸信息屏开发了一款本地 macOS 原生应用「F1 Quote/0」,将赛程倒计时、实时与赛后成绩、车手及车队积分等关键数据以卡片形式呈现在桌面上。 应用运行在本地 macOS 上,通过 Dot Canvas API 向 Quote/0 电子纸屏幕推送格式化赛事看板,无需刷入第三方固件。 设计了比赛结果、比赛时间、关注车手和关注车队 4 大类共 11 块看板,支持比赛进行时的实时排名前三显示及本地时间换算。 针对 152 × 296 的黑白电子纸特性做视觉减法,仅保留前三名、放大名次与积分,去除侧视图等复杂装饰。 数据综合自 ESPN 公开接口、Jolpica F1 和 OpenF1,赛道轮廓则直接内置于本地。 设计初衷与看板分类 作者认为 F1 资讯不需要像常规手机 App 那样高频翻查,电子纸的常显特性非常适合呈现阶段性赛事信息。应用共设计了 11 块专属看板,按比赛结果、比赛时间、关注车手与车队划分为四组。看板涵盖全赛段前三名、冲刺/正赛过滤结果、本地时区开赛时间、下一站倒数日及内置赛道轮廓,车手和车队看板则聚焦特定对象的积分与队内排位变化。 黑白小屏的视觉克制 面对 Quote/0 仅 152 × 296 的黑白电子纸限制,作者在排版上大幅做减法,放弃塞入全部车手与赛车侧视图,仅突显名次、积分与前三名核心数据。由于缺乏车队颜色区分,页面完全依托字号、粗细、留白和边框建立视觉层级,模拟报纸头版和赛场计时牌的高可读性效果。 技术架构与本地运行考量 为避免搭建云端服务器的维护成本,工具采用 macOS 原生应用方案,读取 ESPN(主要数据与排名)、Jolpica F1(车队车手对应)及 OpenF1(DNF 等状态)数据,本地组装 Canvas 数据结构并调用 Dot 开放平台 API 推送。比赛期间每 15 秒抓取一次排名,自动推送最小间隔限制为 60 秒以保护墨水屏。配置信息仅保存在 Mac 本地,退出软件或休眠后将停止数据更新。

Article summary — zh

作者开发 F1 Quote/0:把赛程、积分与赛果搬上桌面电子纸 为了摆脱频繁在手机中查找 F1 赛事信息的繁琐步骤,作者为少数派共创的 Quote/0 电子纸信息屏开发了一款本地 macOS 原生应用「F1 Quote/0」,将赛程倒计时、实时与赛后成绩、车手及车队积分等关键数据以卡片形式呈现在桌面上。 应用运行在本地 macOS 上,通过 Dot Canvas API 向 Quote/0 电子纸屏幕推送格式化赛事看板,无需刷入第三方固件。 设计了比赛结果、比赛时间、关注车手和关注车队 4 大类共 11 块看板,支持比赛进行时的实时排名前三显示及本地时间换算。 针对 152 × 296 的黑白电子纸特性做视觉减法,仅保留前三名、放大名次与积分,去除侧视图等复杂装饰。 数据综合自 ESPN 公开接口、Jolpica F1 和 OpenF1,赛道轮廓则直接内置于本地。 设计初衷与看板分类 作者认为 F1 资讯不需要像常规手机 App 那样高频翻查,电子纸的常显特性非常适合呈现阶段性赛事信息。应用共设计了 11 块专属看板,按比赛结果、比赛时间、关注车手与车队划分为四组。看板涵盖全赛段前三名、冲刺/正赛过滤结果、本地时区开赛时间、下一站倒数日及内置赛道轮廓,车手和车队看板则聚焦特定对象的积分与队内排位变化。 黑白小屏的视觉克制 面对 Quote/0 仅 152 × 296 的黑白电子纸限制,作者在排版上大幅做减法,放弃塞入全部车手与赛车侧视图,仅突显名次、积分与前三名核心数据。由于缺乏车队颜色区分,页面完全依托字号、粗细、留白和边框建立视觉层级,模拟报纸头版和赛场计时牌的高可读性效果。 技术架构与本地运行考量 为避免搭建云端服务器的维护成本,工具采用 macOS 原生应用方案,读取 ESPN(主要数据与排名)、Jolpica F1(车队车手对应)及 OpenF1(DNF 等状态)数据,本地组装 Canvas 数据结构并调用 Dot 开放平台 API 推送。比赛期间每 15 秒抓取一次排名,自动推送最小间隔限制为 60 秒以保护墨水屏。配置信息仅保存在 Mac 本地,退出软件或休眠后将停止数据更新。

Saved original article

**特别声明** 本文的项目构思、结构设计及相关素材整理均由人工完成。在产品开发与调试过程中,使用 GPT-5.6 Sol 模型作为辅助工具,参与方案讨论、代码编写与问题排查。文章内容基于实际开发过程中的经验与记录,由 AI 协助生成初稿,并经过人工审核、修改与润色后发布。 我写完那篇 [F1 入坑指南](https://sspai.com/post/103846)后,身边陆续多了不少开始看比赛的朋友。大家很快就能认清车队和车手,却常常卡在更日常的问题上:下一场比赛几点开始?这个周末有没有冲刺赛?刚结束的比赛前三名是谁?自己关注的车手现在排第几? 答案当然都能找到。F1 官网、体育 App 和搜索引擎里有赛历、新闻、视频和完整数据,但每次都要拿起手机、打开应用,再从一大堆内容里找到真正想看的那几行。 我缺少的不是另一个功能更完整的 F1 App,而是一个不需要主动打开的地方。 于是,我给 [Quote/0 摘录](https://sspai.com/create/quote0)做了一个 F1 信息看板。它会在桌面上显示下一场比赛、最近赛果、车手积分和车队表现,也能在比赛进行时更新当前前三名。对我来说,它更像一张会自己换版的 F1 赛事卡片。 [Quote/0](https://sspai.com/create/quote0) 是少数派共创项目中的一台电子纸信息屏。共创页面把它称为「你的专属信息视窗,于安静中洞悉重要」。这句话恰好概括了我喜欢它的原因:它不试图把另一块手机屏幕搬到桌面上,而是让少量真正重要的信息待在那里,等人偶尔看上一眼。 这种形态和 F1 很合拍。 F1 的信息并不是每分钟都值得查看。非比赛日,我只想知道下一站还有多久;到了比赛周,想确认每个赛段的本地时间;比赛结束后,再看一眼领奖台和积分变化。这些内容不值得让我一直开着网页,却很适合每隔一段时间更新在电子纸上。 Quote/0 的开放能力让这件事成为可能。Dot 的[开发者平台](https://dot.mindreset.tech/docs/service/open)可以用 API Key 和设备 ID 指定设备,再通过 Text、Image 或 Canvas 等接口控制内容。其中 [Canvas API](https://dot.mindreset.tech/docs/service/open/canvas_api) 不只是发送一张预先做好的图片,而是把数据和版面结构一并交给设备:标题、数字、列表、边框和层级都可以根据当前数据生成。 也就是说,我不需要更换 Quote/0 的固件,只要让 Mac 整理好 F1 数据、生成一张适合电子纸的卡片,再把它推送到设备即可。 [F1 Quote/0](https://github.com/belcheckyoung/f1-quote0) 是一款完全运行在本地的原生 macOS 应用。它读取赛历、比赛结果、积分榜和比赛期间的排名,按 Quote/0 的实际屏幕比例生成 Canvas 页面,再推送到指定设备。 我最终做了 11 块看板,并把它们分成比赛结果、比赛时间、关注车手和关注车队四组。这个数字听起来不少,但每一块只回答一个很具体的问题。 「全部比赛结果」显示最近一个赛段的前三名。比赛仍在进行时,它会优先显示实时前三名和当前圈数;比赛结束后,再切换为最终排名。 另一块「冲刺赛 / 正赛结果」会过滤练习赛和排位赛,只保留真正产生比赛结果的赛段。这样到了冲刺周末,我既可以知道刚刚结束的是什么,也不会把冲刺赛和正赛混在一起。 我刻意没有把二十多名车手全部塞进屏幕。放在桌面上的这块屏,更像赛后报纸的头版:它不负责替代完整数据页,只留下冠军、领奖台和当前进度。 F1 每一站都在不同国家和时区举办。对中国车迷来说,正赛可能在晚上,也可能从深夜延续到凌晨。单看日期远远不够,真正有用的是换算后的本地时间。 「下一场比赛时间」会显示接下来的两个赛段,包括大奖赛、赛道、赛段类型、日期和本地开赛时间。看到下一项是第一次练习赛,意味着比赛周末已经开始;看到下一项是正赛,就知道该给周日晚上的两个小时留出位置。 「下一站倒数日」则更克制:屏幕上只保留距离下一站正赛的天数、大奖赛名称、赛道、开赛时间和赛道轮廓。这是信息最少的一块,也是我最喜欢的一块。 应用已经内置完整的 2026 赛历赛道、近年轮换赛道,以及 [F1DB](https://github.com/f1db/f1db) 收录的 78 个历史赛道家族的最新布局。赛道轮廓不需要显示时再从网络下载,即使数据源暂时不稳定,版面本身仍然是完整的。 在设置中选择关注车手后,应用会生成三类看板:年度积分、最近全部赛制的成绩,以及最近正赛或冲刺赛的成绩。 年度积分把排名和积分放在最醒目的位置;最近赛果则让名次成为画面主角。对我来说,这比在完整积分榜里寻找一个名字更实用。桌面上不需要同时摆下所有车手,我只想知道自己关注的人最近过得怎么样。 车队部分有四块看板:车队年度积分、两位车手的年度排名、两位车手最近全部赛制的成绩,以及两位车手最近正赛或冲刺赛的成绩。 其中我最常看的是「车队车手年度排名」。同一支车队的两名车手使用同一代赛车,他们之间的积分变化既能反映车队整体状态,也能呈现队内竞争。有时单看一场比赛很难说明问题,放到一个赛季里,差距会变得直观得多。 Quote/0 使用的是一块 152 × 296 的黑白电子纸屏幕。这个尺寸足够显示一张信息卡片,却不适合复刻完整的 F1 数据网站。屏幕越小,「还能再加一点」就越危险。 最初设计时,我也尝试过赛车侧视图、更多统计项目、完整车手列表和额外的装饰元素。真正推到实机上之后,这些内容只会挤压字号,让最关键的数据失去存在感。 于是我开始做减法:比赛结果只保留前三名;车手赛果让名次占据接近半块屏幕;积分面板把排名和积分做成最大的两个元素;车队面板则用清楚的分区容纳两名车手。赛车侧视图最终被删掉,赛道轮廓只留在真正需要它的倒数日页面。 黑白屏幕也没有车队颜色可以依赖,只能用字号、粗细、边框、留白和位置建立层级。这种限制反而很像传统报纸或赛事计时牌:没有复杂效果,但隔着一段距离,也应该能立刻找到最重要的信息。 这套工具的数据并非来自单一来源。 应用主要读取 ESPN 的公开 F1 数据,用于整季赛历、各类赛段结果、积分榜和比赛中的排名;再通过 [Jolpica F1](https://api.jolpi.ca/docs/) 补充车手与车队的对应关系,通过 [OpenF1](https://openf1.org/docs/) 补充 DNF、DNS 和 DSQ 等异常完赛状态;赛道轮廓则来自随应用打包的本地资源。 比赛进行期间,应用每 15 秒检查一次 ESPN 排名。进行中的赛段会自动优先于上一场已经完赛的结果;等比赛结束后,页面再切回最终排名。用户不需要手动区分「实时」和「历史」模式。 拿到数据后,Mac 会根据当前看板生成 Canvas 的 `data` 与 `windowData`:前者保存大奖赛、车手、名次和积分等值,后者描述这些信息在屏幕上的结构。最后,应用通过 [Dot Canvas API](https://dot.mindreset.tech/docs/service/open/canvas_api) 把两部分一起推送到 Quote/0。 Canvas 不是一个完整的网页环境,但这反而适合电子纸。它支持面向静态卡片的文字、图片、列表、条件和样式,又限制了脚本与复杂网页能力,最终得到的是一张结构明确、能根据数据更新的设备页面,而不是一张 Mac 提前渲染好的截图。 理论上,这些逻辑也可以放在服务器或树莓派上运行。但对大多数人来说,为了一块 F1 看板去配置服务器、部署定时任务、管理环境变量,已经比追比赛本身更麻烦。 所以我把它做成了一款原生 macOS 应用。 应用左侧列出所有可用看板,中间直接预览 Quote/0 上的实际排版,右侧负责当前页面、设备和关注对象。你可以手动推送一块看板,也可以勾选多个页面组成自动轮播。自动推送的最短间隔为 60 秒,既保证比赛期间的信息能够跟进,也避免让设备过于频繁地刷新。 设置里只需要填写 Dot API Key 和 Quote/0 的设备 ID,再选择关注车手、关注车队和轮播间隔。当前版本会把 API Key、设备 ID 和用户设置写入这台 Mac 的应用偏好设置;它们不会进入项目仓库,也不会上传到我的服务器。 项目已经在 [GitHub](https://github.com/belcheckyoung/f1-quote0) 开源。目前仓库没有提供独立的 Release 安装包,需要在 macOS 14 或更高版本、安装了 Xcode 的 Mac 上从源码构建。 下载项目后,在项目目录执行: `./scripts/package_app.sh` 构建完成后,第一次使用需要做五件事: `Build/F1 Quote 0.app`,在设置里填写 API Key 和设备 ID。 如果你想修改应用本身,可以直接查看 [F1 Quote/0 的源码与构建说明](https://github.com/belcheckyoung/f1-quote0#%E4%BB%8E%E6%BA%90%E7%A0%81%E6%9E%84%E5%BB%BA)。如果你对 Quote/0 的外壳、GPIO、显示驱动或自定义固件更感兴趣,则可以继续阅读 MindReset 的 [Dot 开放硬件仓库](https://github.com/MindReset/dot_open_platform)。两者解决的是不同问题:前者通过官方 API 推送内容,后者提供设备级硬件与固件资料。 首先,它是一款完全运行在 Mac 本地的应用。自动推送依赖应用保持运行,并且 Mac 需要联网。退出应用、关机或进入深度睡眠后,数据就不会继续更新;Quote/0 会保留最后一次成功推送的画面,但服务器不会代替本地应用继续抓取 F1 数据。 其次,主要数据来自 ESPN 公开但没有正式文档化的接口。字段和结构未来可能变化,应用的解析逻辑和测试也需要跟着更新。Jolpica F1 与 OpenF1 同样是外部服务,网络状态、访问限制或接口调整都可能影响部分信息。 电子纸也不适合像手机屏幕那样连续刷新。当前版本把数据检查与设备推送分开:比赛期间可以更频繁地检查排名,但自动推送最短仍为一分钟。这是一种及时性、稳定性和设备刷新频率之间的折中。 最后,这是一个非官方个人项目,与 Formula 1、ESPN、Dot 或 MindReset 不存在隶属或认可关系。赛事、车队、车手及相关标志的权利归各自权利人所有。 我一直觉得,Quote/0 这类产品最有意思的地方,不在于厂商预装了多少内容,而在于使用者能不能把自己的兴趣和生活接进去。 有人会用它显示日历、天气和待办事项;有人会放服务器状态、家庭自动化信息或一条值得反复看的摘录。除了面向内容推送的[开发者平台](https://dot.mindreset.tech/docs/service/open),MindReset 也公开了 Quote/0 的外壳、GPIO、显示驱动和固件上手资料。它给不同经验的人留下了几条路径:可以只调用 API,也可以继续向硬件和固件深入。 而我最关心的东西恰好是 F1。 所以现在,即使没有打开手机,我也能从桌面上知道下一场比赛还有多少天、这个周末几点开赛、关注的车手上一站跑得怎么样,以及喜欢的车队离年度冠军还有多远。 它没有让我获得更多信息。 它只是把我真正关心的信息,从手机里的某个页面,带到了每天都能看见的地方。