<?xml version="1.0" encoding="utf-8"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>技述 — JS.GRIPE</title><link>https://www.js.gripe/zh-SG/</link><description>Independent development, curious experiments and open-source collaboration, with AI as a tool for exploration.</description><language>zh-SG</language><lastBuildDate>Fri, 30 Oct 2026 01:04:41 GMT</lastBuildDate><atom:link href="https://www.js.gripe/zh-SG/rss.xml" rel="self" type="application/rss+xml"/><item><title>一个防火墙入口，多个业务源站</title><link>https://www.js.gripe/zh-SG/2026/10/edgeaegis-multiple-origins/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/edgeaegis-multiple-origins/</guid><pubDate>Thu, 29 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-29T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>EdgeAegis 在请求流入业务前执行原生 OWASP CRS。内部业务函数、VPS 和负载均衡主机名统一写入一份回源配置，不同信任边界使用独立密钥。</description><category>edgeaegis</category><content:encoded>&lt;p&gt;EdgeAegis 在请求流入业务前执行原生 OWASP CRS。内部业务函数、VPS 和负载均衡主机名统一写入一份回源配置，不同信任边界使用独立密钥。&lt;/p&gt;
&lt;h2&gt;真实终端与 HTTP 响应&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/edgeaegis-routing.3d240e2bb6009766.gif&quot; alt=&quot;EdgeAegis VM terminal&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;隔离虚拟机录像使用 curl 访问两个业务函数和三个带身份验证的 HTTPS 源站。SQL 注入返回 403，源站访问日志没有增加；演示用的五秒临时封禁随后到期恢复。五秒 TTL 仅供实验，不是生产默认值。&lt;/p&gt;
&lt;h2&gt;规则和回源分别配置&lt;/h2&gt;
&lt;p&gt;rules/config.yml 选择原生规则、策略和白名单；origin/config.yml 将公开主机名与路径映射到业务；secret/credentials.yml 存放独立回源密钥，只保留在私有部署库。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm exec --package=edgeaegis -- edgeaegis init my-firewall
cd my-firewall
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;routes:
  - pattern: api.example/shop/*
    origin: function:shop
  - pattern: api.example/orders/*
    origin: https://192.0.2.10
    key: orders-vps
  - pattern: api.example/search/*
    origin: https://lb.example
    key: search-lb
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;内部业务也经过安全检查&lt;/h2&gt;
&lt;p&gt;配置 function:&amp;lt;业务名&amp;gt; 后加载 origin/&amp;lt;平台&amp;gt;/&amp;lt;业务&amp;gt;/index.js。统一入口先检查请求，再调用业务，并检查业务响应。外部源站必须验证自己对应的密钥。&lt;/p&gt;
&lt;h2&gt;把验证范围说清楚&lt;/h2&gt;
&lt;p&gt;规则更新前需要完成完整 CRS 编译和执行检查，未知语义会明确报错。平台资源限制仍然适用；升级后的 WebSocket 消息不受 SecLang 内容检查，单 Worker 计数也不是全网共享计数。&lt;/p&gt;
&lt;p&gt;欢迎 Vibe Coding 与 Agent 安全报告。上传代码前先运行相关测试；敏感问题通过私密渠道报告，附受影响版本、脱敏复现、影响和真实测试证据。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/edgeaegis/&quot; rel=&quot;noopener noreferrer&quot;&gt;了解 EdgeAegis&lt;/a&gt; · &lt;a href=&quot;https://github.com/jsw-teams/edgeaegis#readme&quot; rel=&quot;noopener noreferrer&quot;&gt;README&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>AMA-1 开发记录：从干净基线到两轮未见题测试</title><link>https://www.js.gripe/zh-SG/2026/10/ama1-genesis-two-round-review/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/ama1-genesis-two-round-review/</guid><pubDate>Sat, 17 Oct 2026 18:11:40 GMT</pubDate><dc:date>2026-10-17T18:11:40.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>AGY 实现、Codex 审核，并在反复修复不足后介入补丁。85 项回归通过，但两轮路由准确率只有 37.5% 和 33.3%，最终目标仍未达成。</description><category>ama</category><category>AMA</category><category>本地AI</category><category>从零训练</category><category>独立测试</category><content:encoded>&lt;p&gt;我想做一个能够逐步认识世界、认识自身局限，并通过工具和经过核验的资料持续成长的本地助理。AMA 系列就是沿着这个方向做实验：从干净资料和随机初始化开始，控制资源占用，也把失败记录留下来。&lt;/p&gt;
&lt;p&gt;这次 AMA-1 Genesis 的工作从一个 v0.1 小原型开始。AGY 负责实现，由 Codex 发起并审查开发过程；两轮独立测试之后，一些修复仍只覆盖了已知路径，Codex 再按我的授权介入对应文件。现在的结果是一个能运行的基础原型，完整目标还没有实现。&lt;/p&gt;
&lt;h2&gt;先把目标和现状分开&lt;/h2&gt;
&lt;p&gt;长期方向有六个：从零训练、自我模型与稳定人格、世界与物品认知、经过核验的持续学习、轻量化与工具优先，以及能够抵抗虚假信息和提示注入的联网能力。发展顺序仍是自我模型、物品知识、工具、学习纠错，再到更自然的聊天和多模态。&lt;/p&gt;
&lt;p&gt;当前真正训练的神经组件只有 &lt;strong&gt;516 个参数&lt;/strong&gt;，是基于字符二元组的线性路由分类器。训练资料是 24 条合成示例，用于区分自我、世界、搜索和其他请求。它还不是语言模型；SQLite 里的物品属性也不等于视觉识别。&lt;/p&gt;
&lt;p&gt;人格风格参考凯尔希的冷静、理性与独立，但 AMA-1 保持自己的身份。主观意识是长期探索的问题，功能性的状态报告不能证明主观体验。&lt;/p&gt;
&lt;h2&gt;AGY 写代码，Codex 查实际发生了什么&lt;/h2&gt;
&lt;p&gt;开始时先冻结原始文件清单，再保存干净 Git 基线。没有移植旧项目代码、数据或模型权重。审核关注源代码、真实执行输出、模型来源和能力边界，历史报告不能直接充当本轮证据。&lt;/p&gt;
&lt;p&gt;最初 16 项测试全部通过，额外检查却找到了无效检查点被接受、重复知识纠错后仍矛盾、危险地址过滤不足，以及 CAPTCHA 被记为搜索成功的问题。AGY 随后加入类型化物品记录、事件记忆、工具注册表、候选模型清单和回滚操作，并补充测试。&lt;/p&gt;
&lt;p&gt;这一步也暴露了测试容易漏掉的路径：重复定义会丢失物品身份；新属性接口绕过审核；只校验文件哈希仍可能晋升无效模型；损坏备份可以覆盖有效模型；固定搜索地址也可能通过重定向访问私网。网络复现使用模拟传输，没有真的请求私网目标。&lt;/p&gt;
&lt;h2&gt;两轮题目如何隔离&lt;/h2&gt;
&lt;p&gt;两套题都先冻结并记录哈希，实现方被明确禁止读取。训练文件保持原来的 24 条，没有加入测试题和答案。审核方检查原文、大小写与 Unicode 规范化后的重叠，并查看可见工具调用记录。&lt;/p&gt;
&lt;p&gt;这属于实现方不可见的独立评估，&lt;strong&gt;不能称为严格实验双盲&lt;/strong&gt;：没有操作系统权限隔离，审核方也知道题目。分类任务使用同样的意图类别，不能因此声称语义完全独立。&lt;/p&gt;
&lt;p&gt;第一轮结果用于指导修复后，那份题集就转为回归集。第二轮首次使用另一套未公开题目。两轮之后的任何针对性修复，只计作回归验证。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路由评估&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;正确数&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;准确率&lt;/th&gt;
&lt;th align=&quot;right&quot;&gt;多数类基线&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;第一轮&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;9/24&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;37.5%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;第二轮&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;8/24&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;33.3%&lt;/td&gt;
&lt;td align=&quot;right&quot;&gt;25%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;两轮的训练多数类基线均为 25%。这是路由分类成绩，不能充当物品认知或语言理解成绩。表情输入仍可能被分类为搜索请求，置信度也没有独立校准。模型建议不能因此获得工具权限。&lt;/p&gt;
&lt;h2&gt;修复通过后，仍要保留原来的失败&lt;/h2&gt;
&lt;p&gt;第二轮继续发现异常训练参数、非法样本导致部分权重已修改、控制字符地址、字符串布尔授权、别名遮蔽和备份谱系缺口。AGY 继续处理路由器和 URL 校验；Codex 单独提交知识审核、权限、属性纠错、事务和回滚修复。&lt;/p&gt;
&lt;p&gt;最终完整回归是 &lt;strong&gt;85 项通过，0 失败、0 错误、0 跳过，退出码 0&lt;/strong&gt;。另外实际启动了 17 次 CLI 命令，走通候选属性、显式审核、别名保留、纠错、计算和默认拒绝联网。&lt;/p&gt;
&lt;p&gt;Codex 介入后的测试属于补丁作者的验证，不再冒充独立审核。两轮失败、逐题预测、误报和修复记录都保留在仓库中。训练准确率虽然达到 100%，两轮未见题结果仍表明能力不足；实际检查点保持候选，没有晋升为生产模型。&lt;/p&gt;
&lt;h2&gt;资源与联网，按测量范围说话&lt;/h2&gt;
&lt;p&gt;独立训练进程的观测峰值约 17.72 MiB RSS，另一 CLI 进程样本约 25.34 MiB。它们是不同进程的单次样本。对象卸载后 RSS 没有下降，不能说内存已经归还操作系统。&lt;/p&gt;
&lt;p&gt;6GB 显存仍是适配目标。CUDA 分配、保留、全局 GPU 占用和未来感知模型的显存需求都未测。&lt;/p&gt;
&lt;p&gt;联网默认拒绝，显式同意后才能发送搜索查询。结果仅是不可信候选链接，不自动入库，不抓取下游页面，也不绕过 CAPTCHA。真实搜索提供者成功本轮未验证；跨源核验、来源所有权聚类和完整 GEO 防御仍待实现。&lt;/p&gt;
&lt;h2&gt;这一版留下了什么&lt;/h2&gt;
&lt;p&gt;源码和审核快照已经上传到 &lt;a href=&quot;https://github.com/jsw-teams/train&quot; rel=&quot;noopener noreferrer&quot;&gt;jsw-teams/train&lt;/a&gt;。上传采用原远端历史的后继提交，覆盖当前文件树，同时保留旧提交。公开证据脱敏了本机路径，完整原始运行日志留在本地。数据、模型与冻结题集按精确字节保存，避免换行转换破坏哈希。&lt;/p&gt;
&lt;p&gt;后续需要来源和许可可核查的代表性资料，以及新的隔离评估集。完整持续学习闭环、从零语言模型、自然聊天、照片识别和语音都还没有完成。已经公开或被反馈过的题目，不能再作为下一版的新盲测。&lt;/p&gt;
&lt;p&gt;可以继续看 &lt;a href=&quot;https://www.js.gripe/zh-SG/ama/&quot; rel=&quot;noopener noreferrer&quot;&gt;AMA 系列模型页面&lt;/a&gt;、&lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/CODEX_REVIEW.md&quot; rel=&quot;noopener noreferrer&quot;&gt;本次审核报告&lt;/a&gt;、&lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/TEST_RESULTS.json&quot; rel=&quot;noopener noreferrer&quot;&gt;实际测试记录&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/jsw-teams/train/blob/48c1bb4c5bb1ba708d91892ad9ad2745c8d41c19/data/MANIFEST.json&quot; rel=&quot;noopener noreferrer&quot;&gt;训练资料清单&lt;/a&gt;。最终目标发布继续保持阻塞。&lt;/p&gt;
</content:encoded></item><item><title>写文建站主题二次开发：从共享布局到实际元素</title><link>https://www.js.gripe/zh-SG/2026/10/edgepress-theme-development/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/edgepress-theme-development/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>创建本地主题，修改 HTML 局部模板与样式，保留现有服务和查看器机制。</description><category>edgepress</category><category>EdgePress</category><category>使用笔记</category><content:encoded>&lt;p&gt;主题改变网站的呈现，文章和页面文件继续保存内容。先做一个本地主题，把共享布局搭好，再用同一份内容检查宽屏和窄屏。&lt;/p&gt;
&lt;h2&gt;创建并选择主题&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npx edgepress theme list
npx edgepress theme create my-theme
npx edgepress theme use my-theme
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;theme create&lt;/code&gt; 复制默认布局骨架，并为你创建空白的 &lt;code&gt;assets/style.css&lt;/code&gt;，视觉设计需要自己补齐。已有主题用 &lt;code&gt;theme use&lt;/code&gt; 切换，已发布的主题包可以用 &lt;code&gt;npx edgepress theme install &amp;lt;package&amp;gt;&lt;/code&gt; 安装。站点在 &lt;code&gt;config.yml&lt;/code&gt; 根层设置了 &lt;code&gt;theme:&lt;/code&gt; 时，以它选择主题；较早的项目也可以使用构建配置的 &lt;code&gt;paths.theme&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;themes/my-theme/
  theme.json
  layouts/layout.html
  layouts/partials/head.html
  layouts/partials/header.html
  layouts/partials/footer.html
  assets/style.css
  assets/data-saver-theme.css
  package.json
  README.md
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;先做共享布局&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;html lang=&quot;{{site.language}}&quot;&amp;gt;
&amp;lt;head&amp;gt;{{&amp;gt; head}}&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;a class=&quot;skip-link&quot; href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-theme-development/#main&quot;&amp;gt;{{site.skipToContent}}&amp;lt;/a&amp;gt;
  {{&amp;gt; header}}
  &amp;lt;main id=&quot;main&quot;&amp;gt;{{{page.content}}}&amp;lt;/main&amp;gt;
  {{&amp;gt; footer}}
  &amp;lt;script defer src=&quot;https://www.js.gripe/edgepress/language-select.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;模板使用 HTML 和局部模板。&lt;code&gt;{{page.title}}&lt;/code&gt; 等普通占位符会转义，&lt;code&gt;{{{page.content}}}&lt;/code&gt; 插入框架已经渲染的内容。保留 head 局部模板、同意管理、语言导航和框架的本地运行代码，主题不需要复制这些浏览器实现。&lt;/p&gt;
&lt;p&gt;保留跳转链接、唯一 main、可见键盘焦点和一个页面级 H1。body 占满视窗高度，main 可以增长，短页面的页脚才能落在底部。长标题、文章、项目列表、空状态和本地化 404 都要看一遍。&lt;/p&gt;
&lt;h2&gt;给真实元素写样式&lt;/h2&gt;
&lt;p&gt;颜色、字体、间距和响应式规则放在 &lt;code&gt;assets/style.css&lt;/code&gt;。内置字体变量是 &lt;code&gt;--edgepress-font-sans&lt;/code&gt;、&lt;code&gt;--edgepress-font-serif&lt;/code&gt;、&lt;code&gt;--edgepress-font-mono&lt;/code&gt;，字体资源在本地。除了文章正文，也要照顾页面的行与单元格、导航、表格、代码、演示播放进度条和提示。不要用只能适应桌面的固定宽度。&lt;/p&gt;
&lt;p&gt;文章和页面的图片放在 &lt;code&gt;content/assets/&lt;/code&gt;，主题自有装饰才放主题资源目录。本地 CSS、JavaScript 和它们的依赖在构建时生成内容哈希；哈希资源缓存一年，HTML 与未版本化元数据保持可重新验证。&lt;/p&gt;
&lt;h2&gt;扩展交互与服务&lt;/h2&gt;
&lt;p&gt;小型本地交互可以写在主题的 &lt;code&gt;assets/&lt;/code&gt;。构建插件放在 &lt;code&gt;edgepress.config.mjs&lt;/code&gt; 指定的路径里，构建时作为受信任的 Node 代码运行。可选外部服务登记到 &lt;code&gt;config.yml&lt;/code&gt; 的扁平 &lt;code&gt;plugins.consent.services&lt;/code&gt; 列表，填好名称、用途与数据披露，取得当前服务同意后才请求。评论交给我提问，主题不再做一套评论系统。&lt;/p&gt;
&lt;p&gt;图片、媒体图库和文档元素使用现有可复用查看器。调整颜色时保留焦点、授权与延迟加载，不必复制播放器或文档引擎。&lt;/p&gt;
&lt;h2&gt;用真实内容检查&lt;/h2&gt;
&lt;p&gt;运行 &lt;code&gt;npm run build&lt;/code&gt;、&lt;code&gt;npm run check&lt;/code&gt;，再看浅色与深色、键盘导航、翻译后的菜单和手机布局。至少打开一篇含代码与表格的文章、一个双栏页面、一段带进度条的演示和一个文档预览。构建通过说明结构有效，页面是否好读还需要实际查看。&lt;/p&gt;
&lt;p&gt;轻量文字版是主题的可选能力。添加时既要看布局，也要看实际请求：&lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-data-saving/&quot; rel=&quot;noopener noreferrer&quot;&gt;省流配置&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;写作与 Pages&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-SG/theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;主题元素参考&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>写文建站可选省流配置：站点开关、主题资源与读者选择</title><link>https://www.js.gripe/zh-SG/2026/10/edgepress-data-saving/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/edgepress-data-saving/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:32:28.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>按实际字段启用文字版，说明主题资源、逐项服务同意和慢速加载验证。</description><category>edgepress</category><category>EdgePress</category><category>使用笔记</category><content:encoded>&lt;p&gt;完整页面加载太慢，或者读者想省一点流量时，可以选择文字版。它是可选功能，主题先提供可读的轻量样式，站点再开启。默认仍显示完整版，由读者决定是否切换。&lt;/p&gt;
&lt;h2&gt;在站点配置里开启&lt;/h2&gt;
&lt;p&gt;把下面配置合并到 &lt;code&gt;config.yml&lt;/code&gt; 现有的 &lt;code&gt;site&lt;/code&gt; 里，不要再添加一个同名根节点：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;site:
  dataSaver:
    enabled: true
    debug: false
    mode: auto
    detectSlowConnection: true
    respectBrowserPreference: false
    promptAfterMs: 5000
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;字段&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;开启等待与文字版流程，默认 false。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;mode: auto&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;从完整版开始，读者已有明确选择时沿用其选择。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;detectSlowConnection&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;首屏仍在等待资源时提供文字版入口，不根据网络速度标签自动切换。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;promptAfterMs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;延迟提示阈值，5000 表示五秒；有效范围 100–60000。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;respectBrowserPreference: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;不让浏览器省流提示替读者决定初始模式。&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;debug: false&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;正式站点关闭空值 &lt;code&gt;?data-save&lt;/code&gt; 预览入口。&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;已保存的读者选择优先于站点的自动起始模式。&lt;code&gt;mode: text&lt;/code&gt;、&lt;code&gt;mode: full&lt;/code&gt; 可以改变配置的起始偏好，上面的流程不需要它们。&lt;/p&gt;
&lt;h2&gt;由主题定义轻量呈现&lt;/h2&gt;
&lt;p&gt;在当前主题的 &lt;code&gt;theme.json&lt;/code&gt; 里合并 &lt;code&gt;dataSaver&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;name&quot;: &quot;my-theme&quot;,
  &quot;renderer&quot;: &quot;layouts/layout.html&quot;,
  &quot;templateEngine&quot;: &quot;edgepress-partials-v1&quot;,
  &quot;dataSaver&quot;: {
    &quot;stylesheet&quot;: &quot;data-saver-theme.css&quot;,
    &quot;scripts&quot;: [],
    &quot;layoutStyles&quot;: [&quot;style.css&quot;]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;样式表和脚本路径相对于主题的 &lt;code&gt;assets/&lt;/code&gt;。&lt;code&gt;layoutStyles&lt;/code&gt; 列出共享已发布 CSS，构建时去掉字体声明和含 URL 的声明，保留导航、行、卡片和页脚的实际布局；轻量样式再补充字体和颜色。标题、文章摘要、时间、说明文字和键盘焦点都要能用。&lt;/p&gt;
&lt;p&gt;文字版使用系统字体，暂缓图片、演示视频、文档引擎与可选服务组件。读者可以单独加载需要的媒体，也可以返回完整版。图表和截图仍需有用的文字说明，省流不能把理解文章所需的信息一起省掉。&lt;/p&gt;
&lt;h2&gt;服务同意与加载分开&lt;/h2&gt;
&lt;p&gt;同意服务不等于下载全部组件。服务请求仍然需要当前逐项同意，以及加载该组件的实际需求；远程文档还要允许 CORS。保留扁平服务列表和每项数据披露，不使用分类总开关。&lt;/p&gt;
&lt;p&gt;主题动态媒体需要在赋值 URL 之前调用 &lt;code&gt;window.edgepressDataSaver?.deferMedia(element, activate, description)&lt;/code&gt;，由 &lt;code&gt;activate&lt;/code&gt; 在实际请求时赋值；省流能力关闭时也要有正常加载的后备分支。完整版的非必要脚本加上 &lt;code&gt;data-data-optional&lt;/code&gt;。先给图片设置 &lt;code&gt;src&lt;/code&gt; 再隐藏，已经来不及避免请求。&lt;/p&gt;
&lt;h2&gt;检查等待画面与跳转&lt;/h2&gt;
&lt;p&gt;把实际资源传输限制到约 100 KB/s，打开新页面，在完整版样式和媒体尚未加载完时切换文字版。检查等待画面的控件能否用键盘操作，进度是否来自已完成资源，晚到的资源是否保持读者选择，文章跳转后是否沿用选择。查看字体、图片、视频与组件的请求记录，仅看元素隐藏无法证明省了流量。&lt;/p&gt;
&lt;p&gt;也要检查返回完整版、手机页脚边界和禁用 JavaScript 的页面。&lt;code&gt;debug: true&lt;/code&gt; 允许空值 &lt;code&gt;?data-save&lt;/code&gt; 测试入口；关闭时会跳转到当前语言的静态 404 页面。这种浏览器跳转不能证明托管平台返回了 HTTP 404。测试后保持 debug 为 false。&lt;/p&gt;
&lt;p&gt;各站的命令入口放在自己的 &lt;code&gt;tools/&lt;/code&gt;，回归用例放在 &lt;code&gt;tests/&lt;/code&gt;。这个站点可运行 &lt;code&gt;npm run test:data-saver&lt;/code&gt; 和 &lt;code&gt;npm run verify:performance&lt;/code&gt;；后者使用冷缓存、gzip、100 KB/s 和 150 ms 延迟，分别记录首次内容绘制与正文可读时间。通用实现由固定版本的写文建站依赖提供，主题开发者可以按&lt;a href=&quot;https://github.com/jsw-teams/edgepress/blob/main/tools/verification/README.md&quot; rel=&quot;noopener noreferrer&quot;&gt;公开工具说明&lt;/a&gt;配置自己的页面路径与语言，不需要取得本站源码。验证使用本地匿名模拟响应，不代表线上服务或发布账号已经检查。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;写作与 Pages&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;主题二次开发&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>在写文建站页面里阅读文档</title><link>https://www.js.gripe/zh-SG/2026/10/doc-views-inline-reading/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/doc-views-inline-reading/</guid><pubDate>Sun, 11 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T00:00:00.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>添加本地文档，保留阅读控件，并检查完整版与文字版的实际呈现。</description><category>doc-views</category><content:encoded>&lt;p&gt;文档查看器让读者在文章或页面里阅读 Word、PDF、PowerPoint 和 Excel。我把源文档放进 &lt;code&gt;content/assets/documents/&lt;/code&gt;，再引用它的站内路径。预览在原处展开，不移动键盘焦点；标题由文档元素显示一次。&lt;/p&gt;
&lt;p&gt;文章在 Markdown 正文里单独放一行。下面的路径需要换成你已经添加的文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;!document[项目报告](/documents/project-report.pdf)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;JSON 页面则把文档元素放进某个单元格的元素数组：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;type&quot;: &quot;document&quot;,
  &quot;title&quot;: &quot;项目报告&quot;,
  &quot;src&quot;: &quot;/documents/project-report.pdf&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;预览用连续阅读区域展示分开的页面，表格保留工作表切换。外围控件跟随网站配色，文档内容保留自身颜色。不同格式的解析开销不同，我会检查实际样本，不把所有文件都当成能持续流式读取、保持固定内存的内容。&lt;/p&gt;
&lt;p&gt;文字版暂缓加载查看器，读者需要时再请求。远程文件直链需要当前服务同意，来源还须允许 CORS；同意服务不会自动下载全部文档或组件。构建后在本地检查滚动、键盘焦点、手机宽度，以及完整版与文字版之间的切换。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/doc-views/&quot; rel=&quot;noopener noreferrer&quot;&gt;文档查看器与样本&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;JSON Pages&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>站点收录与审核说明</title><link>https://www.js.gripe/zh-SG/2026/10/website-submissions-review/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/website-submissions-review/</guid><pubDate>Fri, 09 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-09T11:16:29.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>了解 JS.GRIPE 友链目录的收录原则，并通过本文下方的评论区推荐个人网站、博客或独立项目。</description><category>site-notice</category><category>友链</category><category>站点收录</category><content:encoded>&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/links/&quot; rel=&quot;noopener noreferrer&quot;&gt;友链目录&lt;/a&gt; 想收集一些值得慢慢阅读的网站：个人主页、认真写作的博客、独立项目，以及其他有自己想法的小站。这里不是流量排行榜，也不是付费推广或自动交换链接的地方。无论技术、科学、艺术还是日常记录，都欢迎推荐。&lt;/p&gt;
&lt;h2&gt;在文章下方评论区提交&lt;/h2&gt;
&lt;p&gt;请直接&lt;strong&gt;在本文下方评论区留言&lt;/strong&gt;，尽量提供以下信息：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;网站名称&lt;/strong&gt;：希望展示在目录中的名称。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站地址&lt;/strong&gt;：以 &lt;code&gt;https://&lt;/code&gt; 或 &lt;code&gt;http://&lt;/code&gt; 开头、可以公开访问的链接。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简短介绍&lt;/strong&gt;：用一两句话说明网站主要分享什么。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;图标信息（可选）&lt;/strong&gt;：如希望使用图标，请说明是否拥有版权或使用授权。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;评论区由 &lt;strong&gt;我提问（iask）&lt;/strong&gt; 提供。请先在隐私设置中同意加载评论服务，再按提示使用 GitHub 登录。&lt;strong&gt;评论是公开的&lt;/strong&gt;，请不要留下私人联系方式、密码或其他敏感资料。若评论服务暂时无法使用，也可以通过&lt;a href=&quot;https://www.js.gripe/zh-SG/contact/&quot; rel=&quot;noopener noreferrer&quot;&gt;联系页面&lt;/a&gt;提交。&lt;/p&gt;
&lt;p&gt;你可以推荐自己的网站，也可以分享真正喜欢的站点。不过，推荐别人的网站不代表你有权授权使用对方的图标。&lt;/p&gt;
&lt;h2&gt;审核原则&lt;/h2&gt;
&lt;p&gt;所有投稿均由我人工查看。我更在意内容是否真实、有持续探索的价值或鲜明的个人特色，而不是流量、主题领域或技术栈。&lt;strong&gt;不要求添加本站的反向链接&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;垃圾广告、冒充他人的站点、恶意下载、诱导跳转，以及其他不适合目录展示的内容可能不予收录或被移除。&lt;strong&gt;提交不等于保证收录&lt;/strong&gt;，也不承诺固定审核或回复时间。&lt;/p&gt;
&lt;p&gt;通过审核的条目会作为静态页面内容维护。如果需要图标，只会在确认使用权后保存到本站，不会让访客浏览目录时自动向投稿网站请求图标。&lt;/p&gt;
&lt;h2&gt;信息更正与移除&lt;/h2&gt;
&lt;p&gt;如果已收录的网站改名、跳转到了不合适的页面，或者你希望更正、移除条目，请通过&lt;a href=&quot;https://www.js.gripe/zh-SG/contact/&quot; rel=&quot;noopener noreferrer&quot;&gt;联系页面&lt;/a&gt;告知；也可以在下方补充评论，但不要公开敏感信息。&lt;/p&gt;
&lt;p&gt;外部网站有各自的隐私规则。普通点击外链前，本站会先显示目标站点提示。&lt;/p&gt;
&lt;p&gt;欢迎分享你认为值得一看的互联网角落。&lt;/p&gt;
</content:encoded></item><item><title>按自己的节奏看视频，看清图片细节</title><link>https://www.js.gripe/zh-SG/2026/10/media-viewer-play-and-inspect/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/media-viewer-play-and-inspect/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-30T01:04:41.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>进度条独立一行，当前时间与总时长放在一起。拖动跳到实际播放位置。演示会停留显示跳转后的时间，以及已选中的 2 倍速，让播放变化看得清楚。</description><category>media-viewer</category><content:encoded>&lt;p&gt;进度条独立一行，当前时间与总时长放在一起。拖动跳到实际播放位置。演示会停留显示跳转后的时间，以及已选中的 2 倍速，让播放变化看得清楚。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/media-videojs10.da5382978c5b7462.gif&quot; alt=&quot;按自己的节奏看视频，看清图片细节&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;需要细节时，再打开原图&lt;/h2&gt;
&lt;p&gt;卡片和帖子先请求优化预览，点击详情图后才打开完整原图。可以放大、拖动查看，关闭叉号位于图片之外，返回后焦点回到原来的图片。&lt;/p&gt;
&lt;h2&gt;组件负责交互，网站负责内容&lt;/h2&gt;
&lt;p&gt;Video.js 10 HTML 组件与 hls.js 本地打包，画廊只挂载选中的附件，切换时释放之前的播放。接入网站提供资源地址、同意设置与主题配色，组件本身不负责发表或存储。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/media-viewer/&quot; rel=&quot;noopener noreferrer&quot;&gt;项目与说明&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>图片和视频放在一起：发表故事，再分享给别人</title><link>https://www.js.gripe/zh-SG/2026/10/ishare-publish-and-share/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/ishare-publish-and-share/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:11:57.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>先写故事，在下方添加照片与视频，再发表同一篇帖子。居中的进度弹窗分别显示实际传输量、附件处理和帖子发布；发表成功后，直接查看帖子、分享或进入个人主页。</description><category>ishare</category><content:encoded>&lt;p&gt;先写故事，在下方添加照片与视频，再发表同一篇帖子。居中的进度弹窗分别显示实际传输量、附件处理和帖子发布；发表成功后，直接查看帖子、分享或进入个人主页。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/ishare-workflow-zh.50679b78cbd481f1.gif&quot; alt=&quot;图片和视频放在一起：发表故事，再分享给别人&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;分享完整故事，也能分开插入附件&lt;/h2&gt;
&lt;p&gt;“链接”提供公开帖子地址；“嵌入代码”包含配文、作者与附件画廊，支持 oEmbed 的网站也能从分享链接发现完整嵌入。“Markdown”则提供逐张图片的链接，以及视频播放页链接。写文建站先注册对应服务，访客同意后，可见的嵌入会自动加载。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/ishare-sharing-zh.b321f3274981714e.gif&quot; alt=&quot;把帖子链接贴进文章，在网站里查看嵌入画廊&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;h2&gt;放进写文建站的文章&lt;/h2&gt;
&lt;p&gt;在 config.yml 原有服务列表中追加爱分享条目。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;plugins:
  consent:
    services:
      - id: ishare
        provider: oembed
        enabled: true
        name: 爱分享
        backendUrl: https://ishare.js.gripe
        purpose: 在你同意后显示作者分享的照片与视频。
        dataCategories: 请求的媒体与 IP 地址。
        recipient: ishare
        retention: 直到发布者删除帖子。
        privacyUrl: https://ishare.js.gripe/privacy/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在文章正文写入嵌入语法，将示例 URL 换成自己复制的帖子链接。保存后运行 edgepress server，从首页点击进入文章；访客同意爱分享后，就能一起看到配文和附件画廊。&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-md&quot;&gt;!embed[ishare](https://ishare.js.gripe/s/0726bea158a144129dd3b70468f1a0fc)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Pages 的 text 区块使用相同的 &lt;code&gt;!embed[ishare](URL)&lt;/code&gt; 语法。未授权时保留主题占位区；授权后在接近视口时加载。&lt;/p&gt;
&lt;h2&gt;历史放在个人主页&lt;/h2&gt;
&lt;p&gt;从头像菜单进入“我的主页”。访客看到已发表的帖子，只有本人能看到删除按钮和是否展示在平台首页的开关。个人中心另行处理显示名、自我介绍与数据权利。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/ishare/&quot; rel=&quot;noopener noreferrer&quot;&gt;项目与说明&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>用写文建站写文章、编排 Pages</title><link>https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/</guid><pubDate>Tue, 06 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T15:08:30.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>从当前命令和文件结构开始，写文章、读懂页面包含关系，再生成静态网站。</description><category>edgepress</category><category>EdgePress</category><category>使用笔记</category><content:encoded>&lt;p&gt;我用写文建站把写作和版式留在普通文件里。文章写 Markdown，首页和项目页写 JSON 布局，构建后得到 &lt;code&gt;dist/&lt;/code&gt; 里的静态 HTML 与本地资源。日常发一篇文章，不需要为网站维护数据库。&lt;/p&gt;
&lt;h2&gt;先让项目运行起来&lt;/h2&gt;
&lt;p&gt;使用当前源码仓库时，准备 Node.js 22.12 或更新版本，在项目根目录运行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;npm ci
npm run new -- post &quot;A quiet afternoon&quot;
npm run dev
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;新建命令会打印生成的文件路径。用编辑器打开它，保留两道 &lt;code&gt;---&lt;/code&gt; 之间的元数据，在第二道分隔线后写正文。预览会在保存源文件后重新构建；创建文章时用一次命令，之后就在编辑器里修改。&lt;/p&gt;
&lt;p&gt;如果要开始一个新站，使用本站固定的已发布 GitHub 源码版本，在空目录里初始化：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;mkdir my-site
cd my-site
npm install edgepress@https://codeload.github.com/jsw-teams/edgepress/tar.gz/ac42e0046d022a318e4eef21e56e2e459584b2a5 --save-exact
npx edgepress init
npm install
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;npm 发布版本可能与 GitHub 最新源码不同。站点的依赖版本和锁文件应一起保留；已经通过依赖使用写文建站的网站，继续用自己的 npm 脚本，不必再全局安装一份。&lt;/p&gt;
&lt;h2&gt;分清要改哪个文件&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-text&quot;&gt;config.yml                    (site, theme, privacy, consent services)
edgepress.config.mjs           (paths, locales, permalink, build plugins)
content/posts/&amp;lt;post-id&amp;gt;/en.md   (article metadata + Markdown)
content/pages/&amp;lt;page-id&amp;gt;/en.json   (page metadata + rows and elements)
content/assets/images/walk.jpg (published as /images/walk.jpg)
themes/&amp;lt;name&amp;gt;/                 (shared layouts and visual styles)
dist/                         (generated output)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;站名、规范网址、导航、页脚和隐私信息放在 &lt;code&gt;config.yml&lt;/code&gt;；构建路径、启用语言与文章路径格式放在 &lt;code&gt;edgepress.config.mjs&lt;/code&gt;。语言文件名用小写：页面用 &lt;code&gt;en.json&lt;/code&gt;、&lt;code&gt;zh-cn.json&lt;/code&gt;，文章用 &lt;code&gt;en.md&lt;/code&gt;、&lt;code&gt;zh-cn.md&lt;/code&gt;，&lt;code&gt;lang&lt;/code&gt; 要匹配已启用的语言。每篇文章或每个页面有自己的目录，译文放在同一个目录里。&lt;/p&gt;
&lt;h2&gt;写一篇文章&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;---
title: A quiet afternoon
date: 2026-10-11T10:00:00+08:00
lang: en
category: blog
tags: [walk, photography]
---

We stopped by the water.

## A small detail

![Reflections by the shore](/images/walk.jpg)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;命令会填写当前时间和站点语言，上面只是文件结构示例。主题已经显示文章标题，正文从段落开始，章节用 &lt;code&gt;##&lt;/code&gt;，不用再放一个同名一级标题。照片先保存到 &lt;code&gt;content/assets/images/walk.jpg&lt;/code&gt;，再用 &lt;code&gt;/images/walk.jpg&lt;/code&gt; 引用。&lt;/p&gt;
&lt;p&gt;一个 &lt;code&gt;category&lt;/code&gt; 决定文章归属。本站的 &lt;code&gt;blog&lt;/code&gt;、&lt;code&gt;uncategorized&lt;/code&gt; 进入见闻观点，&lt;code&gt;edgepress&lt;/code&gt;、&lt;code&gt;ishare&lt;/code&gt;、&lt;code&gt;iask&lt;/code&gt;、&lt;code&gt;media-viewer&lt;/code&gt; 进入产品笔记。&lt;code&gt;tags&lt;/code&gt; 用来描述文章，不决定首页列表。&lt;/p&gt;
&lt;h2&gt;从外往里看一个页面&lt;/h2&gt;
&lt;p&gt;页面（行列表）→ 行（栏数，单元格列表）→ 单元格（按顺序排列的元素）→ 元素（类型，内容）。下面是一份完整的双栏页面：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-json&quot;&gt;{
  &quot;title&quot;: &quot;Project notes&quot;,
  &quot;lang&quot;: &quot;en&quot;,
  &quot;slug&quot;: &quot;notes&quot;,
  &quot;blocks&quot;: [
    {
      &quot;columns&quot;: 2,
      &quot;cells&quot;: [
        [
          {
            &quot;type&quot;: &quot;heading&quot;,
            &quot;level&quot;: 2,
            &quot;text&quot;: &quot;What I am making&quot;
          },
          {
            &quot;type&quot;: &quot;text&quot;,
            &quot;text&quot;: &quot;A small tool for everyday writing.&quot;
          }
        ],
        [
          {
            &quot;type&quot;: &quot;post-list&quot;,
            &quot;title&quot;: &quot;Notes&quot;,
            &quot;category&quot;: &quot;edgepress&quot;,
            &quot;count&quot;: 3
          }
        ]
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存为 &lt;code&gt;content/pages/notes/en.json&lt;/code&gt;。元数据与 blocks 同在一个 JSON 对象里，不加 YAML 分隔线，也不写 Markdown 正文。VS Code 能识别并折叠 blocks、每一行、cells、每个单元格和元素；本地 &lt;code&gt;$schema&lt;/code&gt; 提供字段说明与结构检查。&lt;code&gt;columns: 2&lt;/code&gt; 对应两个单元格数组，元素按顺序显示。section 的 blocks 放子元素，长段落用 paragraphs，代码字符串内部换行用 \n。旧 Markdown/YAML 页面仍可构建，同一页面的每种语言只保留一种格式。&lt;/p&gt;
&lt;h2&gt;预览之后再发布&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;npm run build&lt;/code&gt; 校验并生成网站，&lt;code&gt;npm run check&lt;/code&gt; 把页面报告写入 &lt;code&gt;tools/reports/&lt;/code&gt;。本地检查首页、文章、语言链接和手机布局，再把 &lt;code&gt;dist/&lt;/code&gt; 交给现有托管与部署流程。生成的 HTML 是结果；需要修正时，回到源文件里修改。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-theme-development/&quot; rel=&quot;noopener noreferrer&quot;&gt;主题二次开发&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-data-saving/&quot; rel=&quot;noopener noreferrer&quot;&gt;可选省流配置&lt;/a&gt; · &lt;a href=&quot;https://www.js.gripe/zh-SG/edgepress/quick-start/&quot; rel=&quot;noopener noreferrer&quot;&gt;项目与快速入门&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>我提问：可选的网站讨论服务</title><link>https://www.js.gripe/zh-SG/2026/10/reporelay-introduction/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/10/reporelay-introduction/</guid><pubDate>Sat, 03 Oct 2026 00:00:00 GMT</pubDate><dc:date>2026-10-07T02:08:42.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>我提问负责讨论界面与后端。网站在 config.yml 注册可选服务，由读者决定是否加载。发表时使用 GitHub 登录，阅读公开讨论无需登录。文字可以搭配图片与黑熊、熊猫表情，表情在编辑时就直接显示在输入框里。</description><category>iask</category><category>github-app</category><category>open-source</category><content:encoded>&lt;p&gt;我提问负责讨论界面与后端。网站在 config.yml 注册可选服务，由读者决定是否加载。发表时使用 GitHub 登录，阅读公开讨论无需登录。文字可以搭配图片与黑熊、熊猫表情，表情在编辑时就直接显示在输入框里。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://www.js.gripe/images/previews/iask-workflow-zh.9fc8bb73f6746d70.gif&quot; alt=&quot;我提问：可选的网站讨论服务&quot; loading=&quot;lazy&quot; /&gt;&lt;/p&gt;
&lt;p&gt;界面跟随网站配色、可用宽度与语言。Cloudflare 与 Netlify 提供平台入口，Vercel 另需持久 PostgreSQL。现行配置与登录回调请以部署说明为准。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jsw-teams/iask&quot; rel=&quot;noopener noreferrer&quot;&gt;GitHub&lt;/a&gt; / &lt;a href=&quot;https://github.com/jsw-teams/iask/blob/main/docs/edgepress.md&quot; rel=&quot;noopener noreferrer&quot;&gt;Documentation&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>写文建站文章的 Markdown 与嵌入写法</title><link>https://www.js.gripe/zh-SG/2026/09/markdown-syntax-guide/</link><guid isPermaLink="true">https://www.js.gripe/zh-SG/2026/09/markdown-syntax-guide/</guid><pubDate>Wed, 30 Sep 2026 00:00:00 GMT</pubDate><dc:date>2026-10-11T14:11:57.000Z</dc:date><dc:creator>toewpq</dc:creator><dc:language>zh-SG</dc:language><description>实际文章会用到的正文语法、本地媒体与需同意的文档及分享嵌入。</description><category>edgepress</category><category>EdgePress</category><category>使用笔记</category><content:encoded>&lt;p&gt;写文建站文章由 YAML 元数据和后面的 Markdown 正文组成。先用命令生成文件，再编辑第二道 &lt;code&gt;---&lt;/code&gt; 之后的正文。下面集中列出一篇实际笔记会用到的写法：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-markdown&quot;&gt;## What I noticed

A paragraph with **emphasis**, a [link](https://example.org/) and `inline code`.

- A short list
- Another point

&amp;gt; A quoted observation.

| Step | Result |
| --- | --- |
| Build | Static HTML |

- [x] Draft
- [ ] Preview

![A photograph](/images/walk.jpg)

!document[Report](/documents/report.pdf)

!embed[ishare](https://ishare.js.gripe/s/EXAMPLE)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正文支持标题、段落、强调、链接、列表、引用、代码围栏、GFM 表格和任务列表。代码放在三道反引号之间，并注明语言。文章标题已由页面显示，正文章节从 &lt;code&gt;##&lt;/code&gt; 开始。&lt;/p&gt;
&lt;p&gt;媒体先放在 &lt;code&gt;content/assets/&lt;/code&gt;，再引用站点根路径。图片打开共享查看器；明确指定的原图地址在点击后请求。本地文档由可复用文档查看器自动预览；外部文档需要登记服务、当前同意与 CORS。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;!embed[ishare](URL)&lt;/code&gt; 独占一行，EXAMPLE 要换成实际发布的分享链接。使用前在 &lt;code&gt;plugins.consent.services&lt;/code&gt; 注册服务，请求等待同意和实际加载需求。同样的扩展行也能写在 Pages 的 text 元素里，不要把嵌入放进文章前置数据。&lt;/p&gt;
&lt;p&gt;Pages 使用结构化元素，不要把整篇 Markdown 文章粘贴进文字字段。排版参考&lt;a href=&quot;https://www.js.gripe/zh-SG/2026/10/edgepress-content-and-project-guides/&quot; rel=&quot;noopener noreferrer&quot;&gt;完整 Pages 实例&lt;/a&gt;。写作时用 &lt;code&gt;npm run dev&lt;/code&gt; 预览，发布前构建。&lt;/p&gt;
</content:encoded></item></channel></rss>