信息流是一条 Korat 帖子最显眼的地方,而 Korat 的大部分东西——群组、商家主页、限时动态、分享——都建在同一行帖子记录上,而不是四套并行的系统。群组帖子就是带着群 id 的普通帖子,商家主页帖子就是带着商家 id 的普通帖子。正因如此,表情回应、评论、@提及和通知在任何地方行为一致,修好一处等于修好全部。所以本页其实是在描述应用其余部分的构成材料。
四种写法
一条帖子可以是纯文字;可以是彩色底上的文字,给那种放进灰色段落里会被淹没的短句;也可以是最多四张图,按数量自适应的 X 式网格排布。你可以用自己的身份发,也可以用你管理的商家主页发,还可以发进某个群组而不是主信息流。
每条帖子带着自己的可见范围——公开或仅好友——而且发布之后仍可更改,不会在按下发送的那一刻被冻结。人们经常判断错受众:写给朋友的东西后来觉得值得给所有人看,或者反过来,一小时后才发现不该公开。唯一的例外是以商家主页发布的帖子,它永远公开——一条只有部分顾客看得见的店铺帖子,就是一张等着被开的客诉工单。
每一条帖子、评论和快拍都可以举报,理由从固定的列表里选。举报走的是一个以*你自己*的权限运行的函数,而不是服务器的权限,所以你看不到的帖子和根本不存在的帖子,答复完全一样——举报按钮永远不会变成一种试探「我看不到的内容是否存在」的手段。频率限制在数据库里强制,不在应用里。发布之后你可以编辑自己的帖子,也可以删除它。评论支持能解析到真实账号的 @提及,所以一次提及是指向某个人的链接,而不是一串碰巧以 @ 开头的字符,被提及的人会收到通知。
六种表情,一人一个
表情有六个——👍 ❤️ 😄 😮 😢 😡——每个人在一条帖子上只有一个。再点一次同样的就取消,点另一个就把自己的回应移过去。没有可以靠反复点击刷高的计数,也没有点赞与表情两套需要对账的记录。
要六个而不是一个,是因为坏消息底下一个赞是含混的;不要三十个,是因为长尾里那些几乎没人用的表情会让计数变得读不懂。六个足以区分赞同、同情和愤怒,而这正是人们真正需要区分的。
信息流是排序过的,而且排序写下来了
主信息流不是严格按时间倒序。它由应用源码中 data/Ranking.kt 这一个文件里的排序函数决定,其中每一个权重都记在项目的核心算法文档里,和好友推荐、约会与搜索用的权重放在一起。权重一改,那份文档跟着改。
我们提这件事,是因为“算法”通常是社交产品里没人愿意描述的那部分。排序不过是某个人选定的一组数字;把它们集中写下来,就是一个可以被质疑的排序与一个黑箱之间的区别。群组帖子在这条流水线上的恰好一个位置被排除出主信息流——它们属于自己的群组,也就留在那里。
相册,以及你的照片最后在哪
照片按相册组织,相册带自己的可见范围——公开、仅好友或私密——与用到这些照片的帖子相互独立。每个相册有封面,可以改名或删除;开局就有三个默认相册:头像、封面和帖子图片。所以给帖子传一张照片,不会在你看不见的地方悄悄生成第二份照片库。
私密相册的“私密”,指的是 Korat 的界面不会把它展示给别人。它不是密码学意义上的私密——这就引出了诚实的那一段。
上传的媒体可以通过 URL 被任何人读取。Korat 没有使用签名 URL,也没有私有存储桶。任何拿到图片直链的人都能打开它,无论它所属的帖子或相册设了什么可见范围——可见范围控制的是谁能*在应用里*看到它,不是谁能取到这个文件。
Korat 里没有任何东西是端到端加密的,也没有应用层的静态加密。请把上传的照片当作“拿到地址的人就能打开的东西”,凡是这种结果会造成严重后果的,就不要上传。
分享,以及那条什么都不说的链接
可分享的东西都能以卡片形式进入会话、发到自己的信息流、做成限时动态,或通过安卓系统分享面板发到设备上任何其他应用。它也可以变成 koratland.com 上的一条分享链接——形如 koratland.com/s/<token>,其中 token 是 14 位随机字符。帖子、个人资料、商家和限时动态都可以这样分享。
令牌是故意不透明的。有人打开它时,服务器通过 resolve_share 解析,而它只返回两件事:这是什么类型的对象,以及是哪一个。它从不返回是谁分享的,也不返回被点开过多少次。点击计数走的是反方向——由另一个函数记录一次点击,而底层那张表对任何人都刻意没有插入权限,所以访客能让计数加一,却写不进任何别的东西。因此,你粘进群里的一条链接,不会向接收者透露你的分享历史。
会过期的限时动态,和不会过期的观看名单
限时动态是一张照片,或者彩色底上的文字:可选内嵌字体、文字可以自由摆放在画布任意位置、颜色自选。可见范围是公开或仅好友,和帖子一样两个选项,到时间自己消失,你也可以提前删掉自己的那条。
作者会拿到一份观看名单——具体是哪些人打开过,而不是一个数字。计数只告诉你被看了,名单告诉你被谁看了,那才是你想知道的;同时它也让所有人都清楚:看限时动态不是匿名的。运动模块里的活动也能分享成限时动态,配上你选的背景和一句文案——那还是同一个对象,只是倒进了不同的内容。
跑步和骑行的成绩会和队友排进同一张榜,那是运动俱乐部;把一条帖子单独发给某个人,它落进聊天里变成一张卡片。
名字旁边那枚徽章凭什么给出、又凭什么绝不写「已认证」,写在信任与安全那一页;店铺账号发帖和回复的那一侧,在商家控制台里。