跳转到内容

在浏览器和手机上

终端窗口
./bin/casty web

casty web 询问密钥库口令,然后在 http://127.0.0.1:3390 提供一个页面,它与其他命令通过同一个节点 读取和写入。它打印一个带令牌的链接;打开它即可配对浏览器。

casty web on http://127.0.0.1:3390
open to pair a browser: http://127.0.0.1:3390/#token=<43 characters>
Ctrl-C stops it; until then the app key stays unlocked in memory

想在没有节点的情况下看看它,pnpm demo:web 会启动模拟节点,用测试助记词添加密钥,发布一条 cast, 并在空闲端口提供页面,直到你按下 Ctrl-C。

手机上浅色主题的时间线:带编号的 cast、每条 cast 经由的应用、以文字显示的 reply、recast 和 like,以及底部用于发布新 cast 的栏

页面拥有 CLI 的各项命令,名称相同。

在页面上 在终端中
带编号的时间线:你的 cast 和你关注的账户的 cast,最新的在前 casty feed
mentions:提及你的 cast,以及对你最新 25 条 cast 的回复 casty mentions
上方的开关:显示或隐藏回复,以及每个应用一个开关 --no-replies、--exclude-app
点击频道名称:只显示该频道;再次点击过滤器:显示全部 --channel
点击一条 cast:它所回复的 cast、这条 cast、对它的回复 casty thread
reply、recast、like,以及 more 中的:delete、在 farcaster.xyz 上打开、复制链接 reply、recast、like、delete
底部的 › cast something:文本中的 @name 会成为提及,可选的频道,最多两个链接 cast --channel --embed
点击一个名称:该账户的 cast、它发帖所经由的应用、关注 clients --fid、follow、unfollow
“你”页面:你的 fid、托管地址、应用密钥、存储、节点和时钟 whoami、key list、storage、doctor
“你”页面中的 “add a key with your wallet”(这个 casty 已有密钥后折叠在 “add another key” 下):一个由浏览器中的钱包授权的新应用密钥 用助记词运行 casty init
个人资料中已验证的地址,Ethereum 或 Solana,带复制按钮
“你”页面中的搜索框:按 @name 或 fid 查找账户 follow @name

撰写框中的草稿在重新加载后仍然保留,按它所回复的内容保存在浏览器中,直到这条 cast 发出。 时间线在滚动到末尾时加载下一页,“show more” 按钮保留给键盘使用。在手机上,从时间线顶部向下拉再松开 即可刷新,因为安装后的页面没有可以下拉的浏览器栏。

每当页面绘制时间线或提及时,它会像 casty feed 那样保存它们的顺序,所以在终端中运行 casty like 3 作用于屏幕上编号为 3 的 cast。以最近一次显示的列表为准:另一个浏览器, 或者终端中的 casty feed、casty mentions 或 casty thread,都会重新编号。

托管地址用两个 EIP-712 签名授权一个应用密钥,即密钥请求和密钥添加;casty init 让助记词签署它们。 页面也可以改为让钱包签署:在“你”页面中,“add a key with your wallet” 向 casty web 请求一个新密钥和 这两条消息,把它们交给浏览器中的钱包(钱包扩展,或者在钱包应用自带的浏览器中打开的页面, 通过 EIP-1193 调用 eth_signTypedData_v4),检查钱包的账户是否就是托管地址,然后把签名发回; casty web 检查签名,通过你的节点发送 KEY_ADD,并把密钥加密保存为它最新的密钥。 助记词从不离开钱包,扩展背后的硬件钱包也以同样的方式工作。

要完全不用助记词开始,casty init --fid <fid> 从节点获取信息写入配置(包括托管地址),不创建密钥; 然后 casty web 要求为它即将创建的密钥库设置口令,由页面添加第一个密钥。移除密钥仍然在终端中进行 (casty key revoke,使用助记词或密钥本身)。

页面按照钱包宣告自身的方式(EIP-6963)查找钱包,所以同时装有多个扩展也没有问题,并以 window.ethereum 作为后备。如果钱包提供的账户不是托管地址,页面会请求它让你选择正确的账户。密钥消息指定的是 Ethereum 主网,所以在 Base 或 OP Mainnet 上的钱包会先被请求切换(MetaMask 拒绝为当前链以外的链签名); 切换不花费任何费用。在浏览器中没有钱包的手机上,页面提供在 MetaMask、Coinbase Wallet 或 Trust Wallet 中打开它的链接,以及一个复制配对链接的按钮,以便粘贴到那里的页面上,从而由钱包自带的浏览器 签名。这些链接不携带令牌:每个链接都会先经过钱包厂商的服务器。托管地址对应 farcaster.xyz 的 Farcaster 恢复助记词的账户,可以把该助记词一次性导入上述任一钱包,而从不需要在终端中输入它。

个人资料显示其账户已验证为自己所有的地址,Ethereum 或 Solana,数据来自节点:每个地址都链接到对应的 浏览器(只在点击时打开),并且可以复制。你的地址也列在“你”页面中。不从任何链上读取数据。

为了保持快速,当你切换过滤器、显示更多或回到某个视图时,页面会复用过去 30 秒内从你的节点读取的内容。 你在页面上做的任何写入都会清除这些缓存,刷新、重新加载页面,以及在 feed、mentions 或“你”页面已打开时 再次点击它们也会清除;在终端中发布的 cast 会在下一次刷新时出现,或者在 30 秒之后的加载中出现。 重新加载页面会重新读取 cast,但关注列表取自过去十分钟内的数据;刷新也会重新读取关注列表, 所以在另一个应用中关注的账户会立即出现。

页面打开期间,它每两分钟询问一次你的节点,并在你每次回到页面时再询问一次,自你上次查看以来是否有人 提及你或回复了你最新的 25 条 cast。答案以数字显示在 mentions 旁边、标签页标题中,如果你把页面安装为应用 且浏览器允许,还会显示在页面图标上。打开 mentions 会清除它。在终端中运行 casty mentions, 或在另一个浏览器中打开 mentions,也会清除:casty 把向你显示过的最新提及记在它的配置目录中, 而不是浏览器中。第一次计数从页面第一次询问的时刻开始,所以在那之前的提及从不算作新的。

在这个 casty 的应用密钥失效前一周,栏下方的提示会说明这一点;任何 cast、点赞或关注都会让它续期。 撰写框按字节计数。超过 320 字节时,cast 作为长 cast 发出,最多 1024 字节。写入会像 CLI 那样 等到节点拥有该消息;如果失败,页面显示的消息和提示与 CLI 打印的相同。casty 旁边的圆点代表你的节点: 已同步时为绿色,落后时为琥珀色,没有应答时为红色。

键盘操作:n 新建 cast,r 刷新,j 和 k 在 cast 之间移动,l 点赞,o 或 Enter 打开, Esc 关闭,Ctrl-Enter 或 Cmd-Enter 发送。

右上角的文字设置主题:auto 跟随系统,light 和 dark 在该浏览器中保持所选。在手机上,栏中没有空间放它, 也没有空间放刷新按钮:主题在“你”页面中,而在 feed、mentions 或“你”页面已打开时再次点击它们会重新加载。

深色主题中的一条 cast,上方是它所回复的 cast,下方是对它的回复

页面不从其他网站加载任何内容。它不显示图片和头像,cast 中的链接只有在你点击时才会打开。

终端窗口
./bin/casty web --listen 0.0.0.0:3390

这会为机器在网络上的每个 IPv4 地址打印一个链接,并打印第一个链接的二维码。用同一网络中的手机扫描它。 页面可以添加到主屏幕,之后会全屏打开;如果那里显示配对界面,把链接粘贴进去即可。 机器必须保持开机并运行 casty web。

连接是普通 HTTP。任何能监视该网络流量的人都能读取令牌,并在你停止 casty web 之前以你的身份发帖。 请使用你信任的网络,或者把手机和机器加入 WireGuard 这样的 VPN,并只在 VPN 地址上监听。 要让之前打印的所有链接失效,停止 casty web,然后用 --new-token 重新启动它。

已配对的浏览器为该地址和端口(比如 http://192.168.1.20:3390)保存令牌。在另一个网络中, 同一个地址可能属于别人的机器,从主屏幕在那里打开的页面会把令牌交给它。如果这种情况可能已经发生, 请用 --new-token 启动 casty web。

打开链接会把它(包括令牌)记入浏览器的历史记录,如果浏览器会同步,还会记入同步的历史记录。 在共用的浏览器上请清除这一条记录。

--read-only 跳过口令。此时页面只能读取,不能写入。

Ctrl-C 停止 casty web。仍在等待其消息的写入(cast、点赞、recast、删除或关注)会先被允许完成, 终端会说明这一点;再按一次 Ctrl-C 会立即停止。

要从任何网络访问页面,而不只是机器所在的网络,请改为在节点主机上以 HTTPS 运行它,在那里提及或回复 还可以作为推送通知到达手机:从任何网络访问。

  • 除非 --listen 另有指定,它监听 127.0.0.1。
  • 每个 API 请求都携带令牌。链接把令牌放在 # 之后,浏览器从不把这部分发送给服务器; 页面把它移到浏览器的存储中,并从地址栏中去掉,在已经显示该页面的标签页中打开链接时也是如此。
  • 令牌保存在 ~/.config/casty/web-token 中,权限 0600,所以已配对的手机在重启后仍保持配对。
  • 写入只接受 JSON,所以其他网站上的表单无法向页面提交。
  • Host 不是 IP 地址、localhost 或 --listen 主机的请求会被拒绝,所以把自己的域名指向你机器的网站 无法访问页面。
  • 页面只运行它自己的脚本和样式,并把 cast 文本作为文本放入,从不作为 HTML。
  • casty web 运行期间,应用密钥在内存中处于解密状态,就像单次 casty cast 运行期间一样。
Usage: casty web [options]
the feed, threads and a compose box in a browser, on this machine or a phone
Options:
--listen <host:port> where to serve; 0.0.0.0:3390 lets a phone on the same
network in (default: "127.0.0.1:3390")
--new-token pair again; links printed before stop working
--read-only do not unlock the app key; the page reads but cannot
write
--no-allow-fname-server look @names up with your node only; by default names
it does not know are looked up on
fnames.farcaster.xyz (public, no key)
-h, --help display help for command