应用展示

四款应用,都从一件具体的小事开始。点开产品故事,能看到它们是怎么被做出来的。

共 4 款 · 2024—2025
潮汐应用界面:一条随时间起伏的曲线

01 · iOS · 2025

潮汐 · Tidal

为专注而设计的呼吸计时器:用一条随时间流动的曲线替代倒计时数字, 让二十五分钟自然地流过去。

SwiftUI 动效设计 4-7-8
产品故事
墨迹应用界面:文稿列表、正文排版与竖排预览

02 · macOS · 2025

墨迹 · Inkspace

围绕中文排版优化的极简写作工具:字距、标点挤压与竖排预览, 让长文写作重新接近纸面的手感。

排版 Electron 竖排
产品故事
光栅应用界面:参考图与生成的语义色阶

03 · Web · 2024

光栅 · Raster

面向界面设计师的调色板生成器:从参考图提炼语义色阶, 并实时校验正文与按钮的对比度。

色彩系统 React 可访问性
产品故事
回声应用界面:录音按钮、实时声波与灵感条目

04 · Android · 2024

回声 · Echo

按下即录的灵感速记本:离线转写、本地优先, 网络只负责同步,不负责存在。

Kotlin 离线优先 逻辑时钟
产品故事

有想法,
或者只是想聊聊?

无论是一款还没开始的产品,还是一个用了很久、该重新设计的旧工具, 都可以直接写信来。

写信给工作室

产品故事 · 潮汐

删掉九个版本之后

潮汐的第一条规则写在白板最上面:界面上不许出现任何时间数字。 这条规则听起来武断,但它逼我们重新想了一遍「计时」到底是什么。

为什么数字让人焦虑

数字是精确的,而精确意味着可比较。当屏幕上显示「还剩 17:42」, 大脑会自动做两件事:判断还剩多少,判断这个速度正不正常。 两件事都在消耗注意力,而且是每看一眼消耗一次。 相比之下,呼吸、潮汐、光线变化这些自然节奏,人不会去计算,只会跟上。

前九个版本

第一版是环形进度条,工作正常,也很无聊——环形的缺口天然指向终点, 它仍然是一个倒计时,只是换了个形状。第二版用粒子,太吵; 第三版用渐变遮罩,无法表达「正在进行」。到第七版,我们删光了所有元素, 只剩一条水平线。

让一条线呼吸

曲线的形状由两个频率不同的正弦波相乘得到,包络不会精确重复, 看起来像水面起伏,而不是一个机械循环。节奏取 4-7-8:吸气四秒、屏息七秒、呼气八秒。 测试时没有人问「这个怎么用」,看两轮就跟上了。

好的动效不是让人注意到动画,而是让人注意到变化本身。

上线一年后,收到最多的一句反馈是「它没有催我」。这是我们最想听到的评价。

产品故事 · 墨迹

为中文排版花掉的三周

墨迹的字体选型花了三周,中间否掉了十一个方案。 这一页记录最后的决定,以及为什么不是别的。

先确定场景,再谈美学

墨迹是写作工具,用户会长时间盯着成段的正文。 所以评价标准不是「好看」,而是「读两千字不累」。约束只有三条: 正文 16–18px、笔画必须清晰、中英混排要协调。

宋体还是黑体

宋体横细竖粗,长文有节奏感,但在低分辨率屏幕下细横笔容易断断续续。 黑体笔画均匀、屏幕表现稳定,代价是呼吸感弱一些。 最终默认黑体,同时保留宋体主题——写字的人对这些细节有自己的偏好。

标点挤压与竖排

中文排版不只是把字排上屏。连续的逗号句号会挤出空洞,所以做了半宽标点挤压; 竖排也不是把文字旋转九十度,而要重新处理标点位置、数字方向和拉丁字母宽度。 这两件事,占掉了开发时间的一半。

克制

我们没有做云同步。第一版只有一个本地文件夹,加上每天一次的自动备份。 先让「写」这件事稳,再谈同步。

字体选择的本质,是选一个在具体约束下问题最少的。

产品故事 · 光栅

从一个取色器开始

光栅的起点是一个很小的抱怨:设计师拿到参考图,取色很快, 但把几个颜色变成一套能用的色阶很慢。

先有取色,才有配色

第一版只做两件事:从上传的图片里聚类出六种主色, 再按 OKLCH 均匀插值生成长度可选的色阶。 没有 AI,也没有「风格推荐」,因为我们自己也说不清楚那是什么意思。

意外的主要用途

上线后发现用得最多的不是「从图片生成」,而是把手上已有的品牌色贴进来, 检查一遍:正文够不够黑、按钮对比够不够、深色模式下会不会糊。 我们据此把对比度校验从设置里提到了第一屏。

不做的事

试过加入自动配色建议。它确实好看,但给不出理由—— 为什么这个按钮用这一阶?说不清楚的东西,设计师最终不会信任,也不会用第二次。

工具的价值,是替你做完那些无聊但必须精确的部分。

产品故事 · 回声

没有账号的笔记应用

回声没有账号、没有服务器、没有注册流程。打开就能录,录完就存在手机上。

三秒的代价

灵感来的时候,人只愿意等三秒。登录框、权限弹窗、首页加载, 任何一步都可能让人放弃。所以我们把第一条路径做到最短:按下即录。

本地是唯一的事实来源

「离线优先」常被理解成在线同步、离线缓存,我们不喜欢这个定义。 在回声里,所有内容先写入本地数据库,同步在后台发生,失败也不影响使用。 任何网络状态下,应用的行为都一致。

不用时间戳

冲突解决用混合逻辑时钟:计数器保证同一设备内的顺序,设备 id 用来打破平局。 系统时间不可信——用户会改时间、会跨时区。用时间戳做合并, 迟早会出现「新修改被旧数据覆盖」。

真正的离线优先,是让网络变成加速器,而不是前提。

转写也在本地完成。它慢一点,但录音永远不会离开手机。