一条命令ssh ssh.place,不用装任何软件,不用注册账号,任何一把SSH公钥就能连进一块200×60格的共享画布,和陌生人一起画色块。每15秒能落一次笔,画满这块12000格的布,理论上至少要一小时——这不是产品夸张,是它自己写进架构文档里的限速上限。
这类协作画布玩法早不新鲜,Reddit的r/place打了样,pxls.space、PixelPlanet.fun这类网页版早就把持久画布和长期社区运营到很成熟。ssh.place真正值得看的,不是画布本身,而是它把整套交互塞进了SSH协议——用公钥指纹当身份证,用一次连接当一次登录,不留注册表,不留密码。
零安装靠的是什么
项目开源在GitHub(jeninh/ssh.place,MIT协议,Go语言),架构其实很直接:Wish这个SSH服务器负责接住连接、认出你的公钥指纹,每个连接再单独跑一个Bubble Tea写的终端界面程序。你按下的每一次方向键、每一次空格落笔,都要经过内部的坐标和调色板校验,通过了才更新内存里的画布,再由一个Hub广播给所有在线的人。
网页端的canvas.png只读展示,画布真正的写入只发生在SSH会话里。这套设计的好处是门槛几乎为零——没有客户端要下载,没有账号要填,SSH本身自带的公钥认证就顶替了整套登录系统。
三层限流,和一个理论漏洞
“你的冷却时间绑在SSH密钥上”这句话听起来像是没法作弊,但架构其实是三层叠起来的:每把密钥15秒冷却,每个网络地址一个令牌桶(突发5次、每3秒补充1次),再加一个全局吞吐上限。全局限速换算下来大约是每秒3.33次成功落子——这也是为什么画满整块画布至少要一小时。
风险在于这三层限流本身就承认了自己的软肋:文档里写得很直白,按密钥、按网络的限制理论上可以被“拿到大量密钥和网络”的方式绕开,全局吞吐上限是防止这种滥用的最后一道闸,而不是第一道。这跟“密钥绑定=无法刷屏”的直觉印象是有落差的。
- 风险.三层限流的最后一道防线只是流量上限,并不能真正杜绝女巫式的多密钥刷屏。
“无账号”和事件日志的张力
画布数据本身存在内存里,用读写锁保护,每10秒有变化就落盘一次到canvas.json,关闭时再存一次。这解决的是崩溃后的数据留存问题,合理且必要。
真正微妙的是可选的events.jsonl——它把每一次成功落子和密钥指纹、网络信息一起记下来,理论上可以用来从空白重放整块画布的历史。文件权限设成了0600,项目方也建议长期部署要定期轮转这个文件,但它客观上是一份会不断增长、能把身份和行为对应起来的日志。这和主页宣传的“没有账号,没有什么可注册的”之间,存在一层普通用户不会第一时间意识到的隐私代价。
免装不等于免记录,密钥指纹本身就是一张不用填表的身份证。
放进坐标系里看,它新在哪
单看画布玩法,ssh.place不算创新——pxls.space是最接近的核心循环对标,PixelPlanet.fun在持久画布运营上更成熟。真正接近它的分发模型的,反而是SSHTron这类免安装的SSH终端游戏,但SSHTron是即时对战,不是持久画布。
ssh.place真正的定位,是把持久协作画布和终端原生交付两条本来不相交的线接在了一起。对终端和命令行爱好者来说,这提供的是一种新鲜的零安装社交体验;对想自建实例的人,-mode mixed字符模式和events.jsonl的轮转策略,才是真正要提前想清楚的成本,而不是画布好不好看。
