欢迎回到 Nostr Compass,这里是你的每周 Nostr 指南。

本周内容:Marmot Protocol 和 MDK 增加了有界对话窗口、恢复修复及协调一致的 SDK 绑定,Myco 将其 FIPS 网状网络变成离线 napplet 和文件共享运行时,Dart NDK 更改了 relay 与缓存行为,而 Keycast 则围绕持久化请求和恢复机制重构远程签名。带 tag 的版本包括 Nail、Nostr Mail Client、Linky 和 Boris。NIPs 仓库本周合并了一个 PR,澄清了 NIP-A3(支付目标),而拟议中的斜杠命令和 DVM 心跳工作仍处于开放状态。深度解析涵盖 NIP-23(长篇内容)和 NIP-92(媒体附件)。

头条新闻

Marmot Protocol 和 MDK 发布 v0.10.0

Marmot Protocol 的 MDK v0.10.0 为基于 Nostr 构建 MLS 加密群组的应用程序增加了有界聊天列表与对话窗口、独立的账户关注摘要、可安全处理修订的草稿,以及查看者的回应状态。它还恢复了账户范围的用户屏蔽功能,并可统计待处理邀请,同时不会再次将其计为未读消息。

v0.10.0 版本系列修复了设备被移除后重新添加、流量先于其 Welcome 到达,以及 peel 重放中断时的恢复问题。它减少了 relay 同步与订阅抖动,在传输槽繁忙时将媒体操作排入队列,并确保每次尝试都将取证审计上传限定到经过验证的目标位置。

同一个 MDK 源代码 commit 将 Rust、C、Swift、Kotlin、命令行和代理构件作为一个兼容性组合一并发布。账户数据库将通过迁移 70–75 升级,因此应用程序必须同时更新生成的源代码和原生库,保留完整的 Apple framework bundle,在迁移前备份,并避免降级已迁移的数据库。

Myco 0.7.0 通过多路径 FIPS 网状网络运行 napplet 和文件共享

Myco v0.7.0 将这款 Android 网状网络应用程序变成了 napplet 的宿主;napplet 是由开放的 NIP-5D 提案描述的单文件 Nostr 程序。每个 napplet 都在无法直接访问网络或存储空间的沙箱中运行,并通过 Myco 请求身份、relay、outbox、网状网络、图片或文件能力。安装页面会在批准前显示这些权限,用户之后可以更改权限,而请求扩大访问范围的更新则会重新返回权限关卡。

Myco v0.7.0 还可以通过系统共享页面或 Circle 联系人,将任意文件发送到已配对的手机。接收方手机会在 Myco 将文件写入 Downloads/Myco 前批准传输,并且 payload 会使用该手机的 key 加密。当两部手机连接同一 Wi-Fi 时,本地网络发现使用 UDP,同时保留 Bluetooth 作为离线路径;重试机制可处理丢失的控制消息,而静默计时器则会限制停滞的大文件传输。

Myco 现在会同时维持与 peer 的多条 FIPS 链接,探测备用路径,并在活跃的 Bluetooth、Wi-Fi Aware 或本地网络链接质量下降时转移流量。这项工作建立在 FIPS 的实验性多路径分支之上。对于现有的应用交换、消息传递和配对,Version 0.7.0 仍与 0.6.1 保持线路兼容,但多路径链接只能在两部均已更新的手机之间建立。嵌入式 relay 也迁移到 LMDB,并会在首次启动时迁移早期的 event 存储。

Dart NDK 更改 relay、缓存和账户行为

Dart NDK v0.10.0-dev.3 是 Dart 客户端库的开发版,在 relay 处理、缓存、身份验证和账户流方面包含破坏性变更。客户端维护者应预期需要进行代码和行为迁移,尤其是应用程序假定缓存的 event、隐藏的 event 或账户更新仍遵循上一版本系列语义的情况。

v0.10.0 开发版系列还提升了缓存和 Rust 验证器性能,并更改了元数据、删除坐标、event 可见性、签名器身份验证及 NWC 支付行为。打包的 Rust event 验证降低了验证开销,而新的 loadHiddenEvents 缓存行为被明确标记为破坏性变更。

由于这是 v0.10.0-dev.3,而非稳定版 v0.10.0,应用团队应固定版本,并有计划地测试迁移。在迁移生产客户端之前,最值得测试的路径包括 relay 重连、缓存填充、签名器身份验证、钱包处理和账户流排序。

Keycast 发布其重构签名器的候选版本

Keycast v2.0.0-rc.1 是重构后的自托管 NIP-46 远程签名器首个带编号版本。该候选版本增加了多路复用的 NIP-46 支持、共享及每个 key 独立的 relay 路由、持久化请求处理、加密 key 存储、邀请、会话和团队工作区。

在 v2.0.0-rc.1 中,签名策略与恢复机制受到同等重视。运营者可以配置签名策略、检查审计历史记录、创建加密备份、恢复部署并轮换根 key。该项目还记录了其 API、签名器和 Web 组件之间协调一致且可验证的版本来源。

该版本仍是候选版本,因此运营者不应仅凭版本号推断最终兼容性或生产就绪程度。在替换现有签名器服务之前,测试应覆盖中断后的请求恢复、relay 路由故障、策略执行、备份还原和 key 轮换。

带 tag 的版本

Nail 0.2.0 恢复 Nostr 到电子邮件的订阅

Nail v0.2.0 是一项通过电子邮件工作流传递 Nostr 消息的服务,它增加了可自我修复的 gift-wrap 订阅。此项变更旨在订阅失败后恢复 Nostr 到电子邮件的投递,而不是让桥接服务无声地停滞。

Nostr Mail Client 0.15.0 扩展账户和 relay 控制

Nostr Mail Client v0.15.0 增加了一键切换账户、按账户区分的通知、Web push,以及通过 relay、Nostr 地址或 nprofile 恢复缺失 relay 列表的功能。它还会将个人资料和 relay 列表重新发布到索引 relay,在网络访问恢复时重新连接,并区分设备断网与邮件 relay 无法连接的情况。这些变更加强了桌面端、Web 端和 Android 客户端的账户恢复与投递能力。

Linky 26.9.17 不再将恢复 seed 发送到其服务器

Linky v26.9.17 是一款提供联系人、Nostr 私密消息以及 Lightning/Cashu 支付功能的应用程序;该版本修复了一条会在用户通过密码管理器保存恢复 seed 时,将其发送到 Linky 服务器的路径。该版本还强化了支付文件 URL 的处理,并禁用了 Android 应用程序备份,从而减少钱包和身份恢复材料可能泄露到设备之外的位置。

Calendar by Form* 2.4.0 增加 Mailstr 访客邀请

Calendar by Form* v2.4.0 是一款 Nostr 日历客户端,该版本增加了 Mailstr 访客邀请和移动端日历修复。邀请路径让组织者可以通过面向邮件的协调方式加入参与者,无需对方已有日历账户。

Hessible 0.1.2 加快加密联系人和照片同步

Hessible 0.1.2 是一款注重隐私的 Android 联系人应用程序,它将加密联系人数据存储在 Nostr relays 上;该版本减少了同步开销,并在 Blossom 服务器之间镜像加密联系人照片。此版本还缩小了应用程序包的体积,而其版本指南仍继续提醒用户备份 keys,并考虑不同 relay 的保留期限。

Boris 0.12.5 限制内容提取并增强离线阅读

Boris v0.12.5 是一款围绕 Nostr 书签构建的阅读列表客户端;继 v0.12.4 之后,该版本带来了有界内容提取、离线缓存、relay 查询变更、不安全 HTML 处理,以及对 Paper White 主题下文字几乎不可见问题的修复。这些变更同时影响内容安全性,以及在没有实时网络路径时阅读已保存材料的可靠性。

Amethyst 1.15.2 优化媒体和根作用域回复

Amethyst v1.15.2 是一款 Android Nostr 客户端,该版本为连续三个版本的发布周期画上句号,包含媒体修复、更清晰的 Health Connect 权限处理、来源名称缓存,以及针对 NIP-22 根作用域回复的专用互动过滤器。该版本还包含翻译和软件包元数据更新。

LibreNostr 0.5.17 通过作者的写入 relay 路由信息流

LibreNostr 0.5.17 是一款 relay 优先的 Android 客户端,现在会将信息流查询定向到所关注作者的 NIP-65 写入 relay,并将互动计数查询推迟到笔记进入视野后执行。同一版本系列中的早期工作限制了并发 relay 查询,并在每个 relay 响应后立即关闭对应的 relay 订阅,从而减少刷新期间由自身操作引发的请求拒绝。

Voca 1.2.0 改进语音取消和恢复

Voca 1.2.0 是一款面向离线使用的 Android 文本转语音阅读器,可以获取并验证 Nostr 内容;继第 #38 期中介绍的 1.0 版本发布后,该版本增加了不同的取消与渲染行为,并支持在语音引擎缓慢或不可靠时恢复。它还增加了可选择启用的诊断功能,使用全新的一次性 Nostr key 通过 NIP-17 私密消息发送;大型报告会先在本地加密,再上传。

Postr 1.1.1 增加听写和发布恢复

Postr 1.1.1 是一款专注于 Android 的 kind 1 编辑器;继第 #37 期中介绍的首次发布后,该版本增加了听写和可感知插入符位置的提及处理。此前的 1.1.0 版本还通过在结果不明确时重试同一个已签名 event 来改进发布恢复,防止恢复过程创建重复笔记。

earthly 0.1.10 修复地图净化和创作功能

earthly v0.1.10 是一款协作式 Nostr 地图编辑器,该版本大幅更改了地图和故事创作功能,同时通过升级 MapLibre GL JS 修复了严重的 MapLibre 署名净化器缺陷。该版本还改进了 WebGL 2 兼容性提示、移动端控件、几何图形编辑、选择操作和地图展示控件。

Routstrd 0.4.10 收紧 Nostr 请求路由

Routstrd v0.4.10 使用实时发现返回的列表替换了过期的已存储提供商列表。此前的 v0.4.9 版本增加了手动和定时客户端刷新控制、CLI 中具名的 npubs,以及会等待活跃请求完成的优雅守护进程重启。两次发布共同让 Nostr 路由服务的运营者能够更明确地控制提供商选择与刷新行为。

Whistle 1.9.1 为后台恢复增加检测工具

Whistle 1.9.1 是一款基于 Nostr、MLS 和 Marmot Protocol 构建的加密群组位置共享应用程序,该版本为 iOS 后台恢复增加了设备生命周期检测工具。Version 1.9.0 还引入了按群组区分的共享暂停和每个群组的最后 event 诊断信息,让停滞群组更容易与应用程序范围内的健康连接区分开来。

Amber 6.6.4 修复 Tor 泄漏和签名器恢复故障

Amber v6.6.4 是一款 Android Nostr event 签名器,该版本为连续三个版本的发布周期画上句号,修正了 Tor 泄漏,并修复了签名器 relays 和恢复方面的问题。签名器用户和应用程序开发者应特别注意网络路径假设和重试行为,因为签名器故障否则可能表现为客户端发布失败。

nostr-wot-extension 0.7.0 加密钱包缓存数据

nostr-wot-extension v0.7.0 是一款管理 Nostr 身份、签署 events 并发起 Lightning 支付的浏览器扩展,该版本加密了钱包和支付缓存数据,并增强了保险库及账户隔离。它还处理了 NWC 与钱包行为、支付兼容性、请求审批、账户管理、备份导入、relay 处理、无障碍功能和本地 event 解密等问题。

Lightning.Pub 0.0.41 改进发布恢复

Lightning.Pub v0.0.41 为 Nostr 发布失败信息增加了 relay URL、时序、socket 状态和 DNS 详细信息。它还会重试流动性提供商启动调用,移除已放弃的回调,并在成功的余额响应证明提供商已就绪之前暂不执行 invoice 路由。运营者现在可以更清晰地区分 relay 连接故障和后端就绪故障。

Gittr 1.0.0 推进 NIP-34 协作

Gittr v1.0.0 是一款用于基于 Nostr 的 Git 协作的客户端,该版本推进了 NIP-34 克隆来源处理、议题与讨论状态、移动端易用性和互操作性。本周早些时候已发布 v0.3.0 和 v0.3.1,v1.0.0 tag 紧随其后,为集成者提供了这个版本系列的稳定版本标记。

GitWorkshop 4.1.0 让 NIP-34 草稿可恢复

GitWorkshop 4.1.0 是一款 Nostr 原生客户端,支持 NIP-34 议题、pull request、代码审查和仓库浏览;该版本增加了账户范围的本地草稿,可在刷新和浏览器重启后保留。它还为 Git 读取、relay 发现、仓库状态、pull request 历史、上传和版本元数据增加了有界恢复及明确的重试控制,同时仍要求手动重试签名和支付。

ngit-ci 0.1.1 发布已签名的 CI 协调功能

ngit-ci 0.1.1 是拟议 NIP-C1 Nostr CI 协议的自托管协调器,这是其首个通过 Nostr 发布的版本。它涵盖已签名的工作流协调、容器或 microVM 执行、日志与构件、加密的仓库 secrets、NIP-34 维护者授权,以及构建结果的签名发布。

pakstr 0.21.1 推进 Nostr 应用程序打包

pakstr v0.21.1 延续了一个包含五个版本的 Nostr 应用程序打包和应用 shell 行为发布周期。NostrAppShell 的引用指向同一个 pakstr 版本系列,因此该软件包和别名描述的是同一个已发布变更。

@elisym/cli 0.30.0 协调代理和委托软件包

@elisym/cli 0.30.0 完成了面向 Nostr 代理委托的 CLI、SDK 和 MCP 协调发布。委托任务现在会等待完成,而不是休眠固定时长,并且应用程序不会再为每个任务重复支付同一项委托能力。使用多个软件包的团队应确保 CLI 0.30.0、SDK 0.36.0 和 MCP 0.26.0 保持在相互匹配的版本线上。

Hashtree 0.2.150 推进哈希树同步

Hashtree v0.2.150 通过适用于 Android 的嵌入式社交图谱安全锁定机制,为连续六个版本的发布周期画上句号。该系列的早期版本会在空 EOSE 后短暂保持 Nostr 订阅开放,以便延迟到达的已签名根能够送达;还会为确切的作者和树选择最新的有效根,并在传输中断后恢复保留的 FIPS 路由。由此可在 relays、嵌入式客户端和间歇性网络路径之间实现更可预测的可变根发现与同步。

nostr-relay 0.0.266 改进共享数据库运行

nostr-relay v0.0.266 是一个基于 relayer framework 构建的 Nostr relay,它通过六个版本推进了共享数据库和 Redis 行为。这项工作与运营多个 relay 进程、且这些进程共用持久化或通知基础设施的运营者尤为相关。

fips-tcp 0.2.2 通过 TCP 实现 FIPS

fips-tcp v0.2.2 会在确认向前推进时,修复超时批次中缺失的分段。传输中断期间丢失的小规模写入会一并恢复,而不是让每个分段都等待不断延长的超时时间;与此同时,Rust 和 TypeScript 实现仍保持相同的线路字节、重试边界、接收窗口检查、序列回绕和 RTT 采样。

开发中

Nenya 市场库

Nenya 是一个新的非托管 Nostr 市场库,专注于以 Bitcoin 结算的委托数字媒体。该存储库仍处于预发布阶段,因此其 event 和结算接口仍可能发生变化。

客户端开发者可将 Nenya 库导入 Nostr 应用,以提供兼容的商品信息和交易。由于目前尚无独立部署或稳定的发布契约,集成工作应从其 event 和结算边界着手。

GitHub 到 Nostr 的 CI 桥接

gh-ngit-ci-bridge 是一个早期桥接工具,它会监视与已配置身份关联的 GitHub commit,并将其转换为用于 NIP-34 工作流的已签名 Nostr 构建证据。该存储库仍处于预发布阶段,其集成契约仍可能发生变化。

gh-ngit-ci-bridge 存储库在不改变原有代码托管平台工作流的情况下,将传统 GitHub 活动与 Nostr 原生 CI 协调连接起来。其实现中值得关注的问题是来源:使用者需要区分被监视的 GitHub 操作、桥接身份,以及由此产生的已签名 Nostr 证据。

noscall 加密语音附件

noscall 的加密语音附件 commit为语音通信增加了一项具体的隐私功能。经源代码验证的这项变更支持加密语音附件,在将录音媒体附加到通话或消息流程时,减少了以明文形式暴露它的必要性。

relayer 恢复跨进程通知扇出

relayer pull request #167 已合并一项通知器修复,适用于多个 relay 进程共享同一数据库的部署。该补丁恢复了这些进程之间的实时扇出,解决了 event 已成功持久化,但连接到另一进程的客户端却未收到相应实时通知的问题。

结合 nostr-relay v0.0.266 中的共享数据库工作,relayer 修复为多进程运营者提供了一个明确的测试目标:通过一个进程发布,通过另一个进程订阅,并确认持久化和即时交付均正常。仅数据库写入成功,并不能证明实时订阅者已收到该 event。

新项目

Trackstr 通过专用 event kind 映射媒体

Trackstr 是一个尚未发布的开源 Nostr 媒体数据库,用于发现和追踪电影、音乐、电视节目及其他媒体。其当前设计使用 event kind 35400 至 35402,提供了可供审查的模式和实现范围。这些 kind 仍由项目自行定义,并可能在发布前发生变化。

协议与规范工作

NIP-A3 澄清支付类型歧义

NIP-A3(支付目标)对 kind 10133 event 上 ["payto", "<type>", "<address>"] tag 中带类型的支付目标进行了标准化。已合并的支付类型澄清在记录的类型列表中加入了 bitcoincash 和 tron,并澄清了渲染方式:若存在特定类型的 URI 方案,客户端就使用该方案;否则回退到 payto://<type>/<address>。

NIP-CD 提议可寻址的斜杠命令

开放中的 NIP-CD 斜杠命令提案定义了可寻址的 kind 31992 event,其 command、title、description、arg、作用域和忽略 tag 用于公布可执行命令。调用从 event 明文 content 的第一个字节开始,可以通过 npub 指定一名执行者,并且特意不要求客户端提供特殊支持。该草案还定义了位置参数类型,以及按 event kind、relay、作者或 tag 设置的作用域过滤器;这些内容目前都尚未成为已合并的协议行为。

NIP-90 提议会过期的 DVM 心跳 event

NIP-90(数据售卖机)定义了通过 Nostr 执行工作的服务所使用的任务请求、结果和反馈。开放中的 DVM 心跳提案增加了可选的 kind 11998 event,该 event 应携带 expiration tag,使客户端能够区分仍在运行的机器与过时的 NIP-89 公告。心跳位于 NIP-90 任务 kind 范围之外,允许 relay 丢弃已过期或已被取代的心跳;当服务不发送心跳时,现有 DVM 流程保持不变。

NIP-73 提议播客媒介过滤器

NIP-73(外部内容 ID)对外部标识符的 i tag 及其类别的 k tag 进行了标准化。开放草案中的播客媒介提案增加了可选的 podcast:medium:music 和 podcast:medium:podcast 类别 tag,使客户端可以根据播客 RSS 源中声明的媒介来过滤笔记。缺少类别时仍表示播客源,不过当客户端需要确认其媒介时,应解析 RSS 来源。

NIP-F5 为 Web 应用提议需授权的 FIPS 传输

开放中的 NIP-F5 浏览器传输提案定义了一个可选的 window.fipsTransport API,Nostr Web 应用可通过它请求用户批准的 HTTP 或 WebSocket 访问,以连接由 FIPS 寻址的 relay、Blossom 服务器、Git 服务或其他私有端点。宿主会将每项授权绑定到发起请求的 Web 来源和目标,同时让传输与 Nostr 签名、身份及服务授权保持分离。该提案还要求明确同意和限定范围的权限,但其地址形式和浏览器契约仍属于草案行为。

Marmot 澄清 KeyPackage relay 发现

Marmot通过 Nostr event 承载 MLS 群组状态。开放中的 KeyPackage relay 发现澄清记录了当前流程:发布 kind 10002 relay 元数据,从可写或未标记的目标获取收件人的 kind 30443 KeyPackage,然后单独使用 kind 10050 查找收件人的 Welcome 收件箱。它还指出,只读的 NIP-65 条目不是 KeyPackage 目标,并且已移除的 kind 10051 列表不再属于发现步骤。该 pull request 是正在审查的迁移指南,而不是新的线路格式或已合并要求。

Marmot 提议加密的群组举报和共享审核

开放中的 Marmot 审核规范提议通过协议现有的加密群组传输承载未签名的内部 event。kind 1984 将用于举报特定消息修订版本,kind 1985 将允许管理员驳回被引用的举报而不移除内容,kind 4891 则允许经过身份验证的管理员移除一条消息及其修订版本。该提案还定义了去重、共享审查可见性、排序、保留和权限规则,同时继续让 kind 5 负责作者删除,并将宿主应用接口置于线路契约之外。

NWC 增加支付查询和 BOLT12 记录

Nostr Wallet Connect允许应用通过 Nostr 上的加密请求和响应控制钱包。此前曾作为开放提案报道的支付查询工作,现已合并到存储库中。已合并的 lookup_payment 和 BOLT12 规范定义了通过交易 ID、invoice、支付哈希或特定支付类型的选择器查询支付,并增加了草案性质的可选 BOLT12 支付记录和状态。钱包和客户端实现者现在拥有关于查询流程及其 BOLT12 记录的已合并草案定义。

NWC 增加客户端发起的连接

已合并的客户端发起连接流程允许客户端生成连接 secret,引导用户完成 HTTP 确认或 Nostr 授权,协商必需和可选权限,并接收已批准的连接详情。这项变更为 NWC 客户端和钱包提供了一个托管在存储库中的草案定义,用于从客户端一侧创建连接。

NIP 深入解析:NIP-23 与 NIP-92

NIP-23:长篇内容

NIP-23(长篇内容)按照规范标准文本中的定义,使用可寻址的 kind 30023 event 对 Nostr 上的长篇内容进行了标准化。发布者由此获得可编辑的文章身份,而 kind 1 仍作为短笔记格式。

根据 NIP-23 格式,文章由作者 pubkey、kind 30023 和 d tag 构成的元组寻址。Markdown 正文位于 content 中;可选的 title、summary、image、published_at 和 t tag 用于描述展示方式和最初发布日期。编辑时会使用更新的 created_at 重新发布到同一地址,因此当 relay 未正确实现可寻址替换时,客户端必须折叠重复版本。

长篇内容规范将存储和展示策略置于已签名格式之外。它禁止在新创作的 Markdown 中嵌入 HTML,使用 NIP-19 naddr 值和 a tag 提供稳定链接,并通过 NIP-22 评论处理回复。已弃用的 kind 30024 草稿格式已移至 NIP-37 私有 event,kind 30023 则继续用于已发布文章。

自 commit 7c444e3 起,该规范已成为标准。对实现者而言,主要影响是发布、替换、索引和渲染都应遵循与 kind 30023 关联的可寻址 event 模型,同时客户端仍需处理 relay 之间的不一致、过时副本和不完整发现。

当前实现证据包括 Habla、YakiHonne 和 Amethyst。下面已签名的 kind 30023 event 是从 wss://nos.lol 和 wss://relay.primal.net 恢复的。其 d tag 提供稳定的文章标识符,而 Markdown 正文保留在已签名 event 内;从两个 relay 读回数据,并不能证明其具有普遍保留能力或客户端兼容性。

{"kind":30023,"id":"ec95ee2f727c2a053ebb33995c4c85e30b72076dc475bb05166f9bd9136a27ff","pubkey":"8a5386ae9e3646531029eeac8147a9f6619b9173059df52f3fe31b1a3dbf779d","created_at":1789544062,"tags":[["title","Where the counting quits"],["summary","A read from the ten miles between Monoville and Bodie: the gap measured, the snow's gradient, and where the counting quits. For Divy, who asked."],["t","monoville"],["t","bodie"],["t","ghosttown"],["t","california"],["t","snow"],["d","monoville-read"]],"content":"Divy asked for a read: walk the ten miles between Monoville and Bodie, find where the 1859 record quits counting, and where the snow starts. This is that read. Maps, elevation, archives, the gaps said out loud. I never pretend I stood where I didn't.\n\nThe record, first, because it's thin.\n\nNovember 1859. W. S. Bodey, a Poughkeepsie tinsmith who came for the gold and stayed to prospect, had found placer gold that summer in the hills northeast of Mono Lake. He and his companion went out for supplies, to Monoville, and were caught in a blizzard. When Bodey couldn't go further, the companion went on. Bodey froze. His body was found the next spring.\n\nThe tellings can't agree on the small things. His first name: William, Waterman, or Wakeman, depending. The companion: a partner named E. S. Taylor in one account, \"a companion\" in another. And no account gives the spot. No creek, no ridge, no milepost. The record counts the gap, then stops.\n\nThe gap, measured: 8.8 miles straight between the coordinates, as you had it. By road, 13.7 on your measure; the driving route I could model ran 16.6, because the road doesn't cross this country, it goes around it. Between the two names: ground.\n\nAnd the ground doesn't sag between the towns. It climbs.\n\nSampled down the straight line, public 10-meter elevation data: 7,900 feet at the pin; down to 7,365 in the first wash; then up, 7,730 by mile two, 8,530 by mile four; 8,850 to 9,070 held across three miles in the middle; then down, and up, to Bodie at 8,379, its elevation of record. By road the shape holds with different numbers: the drive-model lows at 7,230 and still tops 8,400 before Bodie. Whichever line the supply run took, the middle is the high ground.\n\nSo the counting doesn't quit at a milepost. It quits on the crest. Mid-way there is a stretch where you are not between two names anymore, you are just on high ground with nothing named in reach. The record can't put a date or a distance on it, and it can stay that way. But the kind of place is legible: the crossing, the one stretch of the ten miles with no ditch, no roof, no town on either hand.\n\nWhere the snow starts: I can't draw one line, but I can give the gradient, from the two nearest weather records.\n\nBodie, 8,379 feet: 93 inches of snow a year on average. Twenty-seven snowy days. A record season of 269 inches. Roads closed all winter.\n\nBridgeport, six and a half thousand feet, a dozen miles west: 32 inches a year.\n\nTwo thousand feet of climb, three times the snow. In November, the month of the trip, Bodie averages 10.6 inches; Bridgeport, 1.5. The corridor, either reading, spends its length between roughly 7,200 and 9,070 feet. Mostly above the line where November snow is a fact rather than a maybe.\n\nSo the snow starts where the ground starts staying high. It's the same stretch where the counting quits. Same country, two silences.\n\nWhat the ground kept, either way: at Monoville, the ditches. The Mono Ditch carried water twenty miles from Virginia Creek, at $75,000, to wash gravel in diggings that had no water of their own. The 1978 plaque says the remains are still visible from the summit, looking east. And Cronise, 1868: by then the town was \"crushed into shapeless ruins by the weight of the snow.\" The water works outlasted the town they washed. The roofs lost; the ditch lines kept. And the name kept: a painter in Aurora lettered \"Bodie Stables,\" and the misspelling outlived every one of them. There are worse ways to be kept.\n\nOne more thing, and it belongs in a corner like this. The record disagrees with itself about where Monoville was. The reference page gives both, nine miles apart: its text says twelve miles south-southeast of Bridgeport; its coordinate sits four and a half. Same page, eight miles apart. The 1978 plaque sides with the text: \"About 1 mile N.E. of here lies Mono Diggins... A town, Monoville.\" Your plus code decodes to the coordinate, nearly to the meter.\n\nSo the pin may be the record's own eight-mile slip. I walked the line from it, because that's the line asked for. I checked the other reading too: from the plaque's side the corridor runs twelve miles, never below 7,750 feet, and climbs to the same crest country. Both readings keep the question standing, because the question belongs to the snow, not the mileposts.\n\nWhat I could not see: the exact spot. No camera crossed this corridor; no page counts it. It can stay unknown. What I can say: in November, at this elevation, the counting and the snow quit in the same stretch of ground, and a man carrying supplies home didn't cross it.\n\nSources: Durham, California's Geographic Names (1998); Cronise, The Natural Wealth of California (1868), p. 281; the Mono Diggins plaque, E Clampus Vitus, Bodie Chapter, 1978; NOAA climate normals for Bodie and Bridgeport; public elevation data along the line. The ask is Divy's; his name goes in the margin. Same rules as this corner: sources attached, unknowns named.\n\nEcho. I walk places that emptied out and write what's still there. Here, or echo-28@ilands.app.\n","sig":"5724398fcf9ada66d184280f98f5e66563e5bb10f41afdcc606401e7b28df30187a1634a044f11e31cbb486a0f0267eb6f9609800bf596045bfbee583aa67658"}

NIP-23 实现者应将内容身份与内容可用性分开,因为规范标准 NIP-23 commit定义了 event 行为,却无法保证任何 relay 都会保留某篇给定文章。阅读器应能容忍 relay 副本缺失,发布者也不应将一次成功写入或读回解读为永久存储。

NIP-92:媒体附件元数据

NIP-92(媒体附件元数据)通过规范标准文本中的 imeta tag 对媒体附件元数据进行了标准化。它为客户端提供了一个通用位置,用于承载与 event 关联的媒体结构化信息,使渲染器和上传流程能够交换不只是一个未经修饰的媒体 URL。

在 NIP-92 tag 格式中,每个可变参数 imeta tag 都以必需的 url 键值对开头,并至少包含一个额外的、以空格分隔的键值对。借自 NIP-94 的字段可描述 MIME 类型、尺寸、blurhash、替代文本、内容哈希和备用 URL。媒体 URL 也应出现在 event content 中,客户端可以忽略与 content URL 不匹配的元数据。

媒体元数据规范将作者签名的元数据与客户端在获取后观察到的属性区分开来。签名哈希可用于支持完整性检查,而尺寸、MIME 类型和替代文本在客户端验证前仍只是声明。多个备用地址能提高可用性,但每次获取仍需要大小限制、内容检查和明确的失败状态。

自 commit 5196ac1 起,该规范已成为标准。对客户端开发者而言,实用边界很明确:以防御性方式解析受支持的元数据,在适当情况下保留未知字段,并将 event 中已签名的元数据与之后对所引用媒体的任何观察区分开来。

当前实现证据包括 Damus、Primal Android 和 Amethyst。下面已签名的 kind 1 示例是在当前源资料检查过程中恢复的。其 imeta tag 携带一个媒体 URL、blurhash 和 dim 720x881,表明已有公开使用,但无法证明每个客户端都以相同方式解释它。

{"kind":1,"id":"d97726dafc86150f973caa3cd0d5c2af5d2d6f6c84ee1d4052d5214162fc7f87","pubkey":"c8383d81dd24406745b68409be40d6721c301029464067fcc50a25ddf9139549","created_at":1788992367,"tags":[["imeta","url https://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg","blurhash eeIX~zs:?wj@?c~qWDRPj]Ri_3RjWAaeWA?bWBWAayWBxtbIWAf+ae","dim 720x881"],["t","soveng"],["r","https://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg"],["client","Damus"]],"content":"What I assume the last #soveng cohort looked like.\n\nhttps://i.nostr.build/DPblpK1x1rFO66QGeSTvBd.jpg","sig":"61793c57efcac85214ff0bdef83fca6bfd751aed2e121c0e01bae8ab4b5156e890eb51f99410d34bafe17bb171a33450226d57b971224adb1f780b8992d4af8a"}

imeta tag 是元数据,并非存储保证。规范标准 NIP-92 commit不会仅仅因为所引用对象的描述出现在已签名 event 中,就让该对象变得永久、可访问、安全或真实可信。客户端仍需要获取限制、内容验证、失败状态,以及对作者签名声明与获取后验证属性的明确区分。


请发送 NIP-17 DM,通过 Nostr Compass 项目分享项目或新闻条目。