{"version":"https://jsonfeed.org/version/1.1","title":"墨屿 / InkIsle","home_page_url":"https://ygm-studio.github.io/inkisle/","feed_url":"https://ygm-studio.github.io/inkisle/feed.json","description":"AI 原生的 Markdown 发布系统，用 Astro 生成快速、可搜索、对机器友好的静态内容站。","authors":[{"name":"YGM Studio","url":"https://github.com/YGM-Studio"}],"items":[{"id":"https://ygm-studio.github.io/inkisle/en/posts/comments-and-reactions/","url":"https://ygm-studio.github.io/inkisle/en/posts/comments-and-reactions/","title":"Comments and reactions are now available in InkIsle","summary":"Add comments and reactions to static articles with Giscus or Waline while keeping the build fully static.","content_html":"<p>InkIsle can now add comments and reactions to articles through Giscus or Waline. Interactions remain opt-in: when no provider is configured, the generated site loads no third-party interaction resources.</p>\n<h2>Two providers</h2>\n<ul>\n<li>Giscus stores interaction data in GitHub Discussions and requires almost no additional operations, making it a good fit for developer and open-source sites.</li>\n<li>Waline serves a broader readership through a separately deployed backend and can present its reactions as a single like button.</li>\n</ul>\n<p>Both providers are integrated at the InkIsle renderer boundary, so the built-in <code>personal</code> and <code>business-blog</code> themes expose the same behavior.</p>\n<h2>Stable discussion identity</h2>\n<p>An article can declare a permanent interaction identifier:</p>\n<pre><code class=\"language-yaml\">interactionId: permanent-article-id\ncomments: true\nreactions: true\n</code></pre>\n<p>Providers use <code>interactionId</code>, rather than the public URL, to find the article discussion. Existing comments therefore survive title, slug, locale-prefix, deployment-base, and domain changes as long as the identifier remains stable.</p>\n<p>Translated articles can share one discussion or keep separate discussions per language. An article can also set <code>comments: false</code> to remove the complete interaction section or <code>reactions: false</code> to keep comments without reactions.</p>\n<h2>Validated on the official site</h2>\n<p>The InkIsle site runs on GitHub Pages and uses Giscus to store article interactions in the <code>InkIsle Blog</code> Discussions category of <code>YGM-Studio/inkisle</code>. Chinese and English translations share a discussion, and the Giscus interface follows the site’s light and dark themes.</p>\n<p>We also maintain two independent npm canaries. Neither references the source workspace: each installs a pinned npm release and validates it through a separate repository and GitHub Pages workflow.</p>\n<ul>\n<li>The <a href=\"https://ygm-studio.github.io/inkisle-canary/\">Giscus canary</a> validates npm installation, the Pages base path, and GitHub Discussions interactions.</li>\n<li>The <a href=\"https://ygm-studio.github.io/inkisle-waline-canary/\">Waline canary</a> validates the independent Vercel backend, Neon database, comment form, and reactions.</li>\n</ul>\n<p>Their ownership boundaries, external data, and release update workflow are documented in <a href=\"https://github.com/YGM-Studio/inkisle/blob/main/docs/canary-sites.md\">Canary Sites</a>.</p>\n<p>This article is also a long-running public acceptance page. Leave feedback below to help us keep validating loading, sign-in, replies, and reactions in a real deployment.</p>\n","date_published":"2026-07-12T00:00:00.000Z","date_modified":"2026-07-12T00:00:00.000Z","tags":["Interactions","Giscus","Waline"],"language":"en"},{"id":"https://ygm-studio.github.io/inkisle/posts/comments-and-reactions/","url":"https://ygm-studio.github.io/inkisle/posts/comments-and-reactions/","title":"InkIsle 现已支持点赞与留言","summary":"通过 Giscus 或 Waline 为静态文章加入点赞和留言，同时保持构建过程完全静态。","content_html":"<p>InkIsle 现在可以通过 Giscus 或 Waline 为文章提供点赞与留言。互动功能仍然是可选的：没有配置 Provider 时，构建结果不会加载任何第三方互动资源。</p>\n<h2>两种 Provider</h2>\n<ul>\n<li>Giscus 使用 GitHub Discussions 保存互动数据，几乎不需要额外运维，适合开发者和开源项目。</li>\n<li>Waline 面向更广泛的读者，支持独立部署服务端，也可以把 reaction 配置成单一的点赞按钮。</li>\n</ul>\n<p>两个 Provider 都由 InkIsle 的 renderer 统一接入，内置的 <code>personal</code> 和 <code>business-blog</code> 主题会保持相同的行为。</p>\n<h2>稳定的讨论标识</h2>\n<p>文章可以显式设置永久互动标识：</p>\n<pre><code class=\"language-yaml\">interactionId: permanent-article-id\ncomments: true\nreactions: true\n</code></pre>\n<p>Provider 使用 <code>interactionId</code>，而不是公开 URL，来查找文章对应的讨论。修改标题、slug、语言前缀、部署子路径或域名时，只要保留这个标识，原有留言就不会丢失。</p>\n<p>翻译文章可以共用一个讨论，也可以按语言分开。文章还可以通过 <code>comments: false</code> 关闭完整互动区域，或者通过 <code>reactions: false</code> 只保留留言。</p>\n<h2>官方站验证</h2>\n<p>InkIsle 官方站运行在 GitHub Pages 上，使用 Giscus 把文章互动保存到 <code>YGM-Studio/inkisle</code> 的 <code>InkIsle Blog</code> Discussions 分类。中英文翻译共用讨论，明暗主题切换也会同步到 Giscus。</p>\n<p>我们还维护了两个独立 npm canary。它们都不引用源码工作区，而是从 npm 安装固定版本，再通过各自的仓库和 GitHub Pages 工作流验证发布包：</p>\n<ul>\n<li><a href=\"https://ygm-studio.github.io/inkisle-canary/\">Giscus canary</a>验证 npm 安装、Pages 子路径和 GitHub Discussions 互动。</li>\n<li><a href=\"https://ygm-studio.github.io/inkisle-waline-canary/\">Waline canary</a>验证独立 Vercel 服务端、Neon 数据库、留言表单和 reaction。</li>\n</ul>\n<p>两个站点的维护边界、数据归属和版本升级流程记录在<a href=\"https://github.com/YGM-Studio/inkisle/blob/main/docs/canary-sites.md\">Canary Sites</a>中。</p>\n<p>这篇文章本身就是长期运行的公开验收页面。你可以在下方留下反馈，帮助我们继续验证真实环境下的加载、登录、回复和 reaction 体验。</p>\n","date_published":"2026-07-12T00:00:00.000Z","date_modified":"2026-07-12T00:00:00.000Z","tags":["Interactions","Giscus","Waline"],"language":"zh"},{"id":"https://ygm-studio.github.io/inkisle/en/posts/configuration/","url":"https://ygm-studio.github.io/inkisle/en/posts/configuration/","title":"Configuration","summary":"Use inkisle.config.mjs to configure identity, themes, locales, base paths, and outputs.","content_html":"<p>InkIsle runs with defaults, but real sites usually add <code>inkisle.config.mjs</code> at the project root.</p>\n<pre><code class=\"language-js\">export default {\n  title: &quot;My Site&quot;,\n  description: {\n    zh: &quot;我的内容站&quot;,\n    en: &quot;My content site&quot;\n  },\n  site: &quot;https://example.com&quot;,\n  theme: {\n    name: &quot;business-blog&quot;,\n    defaultMode: &quot;system&quot;,\n    allowUserToggle: true\n  }\n};\n</code></pre>\n<h2>Common fields</h2>\n<ul>\n<li><code>title</code> and <code>description</code> drive page metadata, homepage copy, feeds, and <code>llms.txt</code>.</li>\n<li><code>locales</code> and <code>defaultLocale</code> control multilingual content directories.</li>\n<li><code>theme.name</code> selects <code>personal</code> or <code>business-blog</code>.</li>\n<li><code>base</code> supports subpath deployments such as <code>/inkisle</code>.</li>\n<li><code>interactions</code> can opt into Waline or Giscus; no third-party comment script loads by default.</li>\n<li><code>pwa</code>, <code>analytics</code>, <code>verificationFiles</code>, and <code>redirects</code> handle browser integration, analytics, verification files, and migration redirects.</li>\n</ul>\n<p><code>base</code> changes browser-facing URLs. It does not change Markdown paths or the generated file layout.</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Configuration","Theme"],"language":"en"},{"id":"https://ygm-studio.github.io/inkisle/en/posts/deployment/","url":"https://ygm-studio.github.io/inkisle/en/posts/deployment/","title":"Deploy to GitHub Pages","summary":"InkIsle supports GitHub Pages project URLs through base path configuration.","content_html":"<p>GitHub Pages project sites usually live under a repository subpath, such as <code>https://ygm-studio.github.io/inkisle/</code>. Configure both <code>site</code> and <code>base</code> for that shape.</p>\n<pre><code class=\"language-js\">export default {\n  site: &quot;https://ygm-studio.github.io&quot;,\n  base: &quot;/inkisle&quot;\n};\n</code></pre>\n<p>After build, asset links, search index requests, RSS, JSON Feed, <code>llms.txt</code>, and sitemap URLs include the <code>/inkisle/</code> prefix.</p>\n<h2>Recommended workflow</h2>\n<p>The InkIsle website builds <code>site/dist</code> with GitHub Actions and deploys it to Pages. You can use the same pattern:</p>\n<pre><code class=\"language-bash\">npm run build\nnpm run check:links\n</code></pre>\n<p>If you use a custom root domain, omit <code>base</code> or set it to <code>/</code>.</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Deployment","GitHub Pages"],"language":"en"},{"id":"https://ygm-studio.github.io/inkisle/en/posts/quick-start/","url":"https://ygm-studio.github.io/inkisle/en/posts/quick-start/","title":"Quick Start","summary":"Create a Markdown-first InkIsle content site with a few commands.","content_html":"<p>The default InkIsle project is content-only. You maintain <code>content/</code>, optional <code>public/</code>, and optional <code>inkisle.config.mjs</code>; the renderer and Astro internals stay inside the InkIsle package.</p>\n<h2>Create a site</h2>\n<pre><code class=\"language-bash\">npm exec inkisle -- init my-site\ncd my-site\nnpm install\nnpm run dev\n</code></pre>\n<h2>Write content</h2>\n<pre><code class=\"language-bash\">npm exec inkisle -- new post &quot;First post&quot;\nnpm exec inkisle -- new page &quot;About&quot;\n</code></pre>\n<p>Default-language content lives in <code>content/posts/</code> and <code>content/pages/</code>. English translations can live in <code>content/en/posts/</code> and <code>content/en/pages/</code>.</p>\n<h2>Check before publishing</h2>\n<pre><code class=\"language-bash\">npm run build\nnpm run check\nnpm run check:links\n</code></pre>\n<p>These commands build the static site, run Astro diagnostics, and check generated internal links.</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Quick Start","CLI"],"language":"en"},{"id":"https://ygm-studio.github.io/inkisle/en/posts/roadmap/","url":"https://ygm-studio.github.io/inkisle/en/posts/roadmap/","title":"Roadmap","summary":"InkIsle is alpha software focused on content shape, theme boundaries, and deployment quality.","content_html":"<p>InkIsle is still alpha software. The current priority is a solid Markdown publishing workflow, not a full CMS.</p>\n<h2>Near-term focus</h2>\n<ul>\n<li>Stabilize the content-only project shape.</li>\n<li>Improve static deployment on GitHub Pages, Cloudflare Pages, and similar hosts.</li>\n<li>Refine the built-in <code>personal</code> and <code>business-blog</code> themes.</li>\n<li>Improve machine-friendly outputs such as search indexes, RSS, JSON Feed, and <code>llms.txt</code>.</li>\n<li>Clarify theme extension and full project workflows for advanced users.</li>\n</ul>\n<h2>Non-goals</h2>\n<p>InkIsle is not trying to become a server runtime, login system, hosted comment service, or admin backend. It stays static-first, with Markdown as the source of truth.</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Roadmap","Alpha"],"language":"en"},{"id":"https://ygm-studio.github.io/inkisle/posts/quick-start/","url":"https://ygm-studio.github.io/inkisle/posts/quick-start/","title":"快速开始","summary":"用几条命令创建一个只需要维护 Markdown 的 InkIsle 内容站。","content_html":"<p>InkIsle 的默认项目是 content-only 形态。你维护 <code>content/</code>、可选的 <code>public/</code> 和 <code>inkisle.config.mjs</code>，渲染器和 Astro 细节留在 InkIsle 包里。</p>\n<h2>创建站点</h2>\n<pre><code class=\"language-bash\">npm exec inkisle -- init my-site\ncd my-site\nnpm install\nnpm run dev\n</code></pre>\n<h2>写内容</h2>\n<pre><code class=\"language-bash\">npm exec inkisle -- new post &quot;第一篇文章&quot;\nnpm exec inkisle -- new page &quot;关于&quot;\n</code></pre>\n<p>主语言内容放在 <code>content/posts/</code> 和 <code>content/pages/</code>。英文翻译可以放在 <code>content/en/posts/</code> 和 <code>content/en/pages/</code>。</p>\n<h2>发布前检查</h2>\n<pre><code class=\"language-bash\">npm run build\nnpm run check\nnpm run check:links\n</code></pre>\n<p>这些命令会生成静态站点、运行 Astro 检查，并确认构建产物里的内部链接没有断掉。</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Quick Start","CLI"],"language":"zh"},{"id":"https://ygm-studio.github.io/inkisle/posts/roadmap/","url":"https://ygm-studio.github.io/inkisle/posts/roadmap/","title":"路线图","summary":"InkIsle 目前处于 alpha 阶段，优先打磨内容模型、主题边界和部署体验。","content_html":"<p>InkIsle 仍处于 alpha 阶段。当前重点是把 Markdown 发布的基础体验做扎实，而不是急着扩展成完整 CMS。</p>\n<h2>近期重点</h2>\n<ul>\n<li>稳定 content-only 项目形态。</li>\n<li>改进 GitHub Pages、Cloudflare Pages 等静态部署路径。</li>\n<li>打磨 <code>personal</code> 和 <code>business-blog</code> 两个内置主题。</li>\n<li>完善搜索、RSS、JSON Feed、<code>llms.txt</code> 等机器友好输出。</li>\n<li>补齐主题扩展和高级用户的 full project 工作流。</li>\n</ul>\n<h2>非目标</h2>\n<p>InkIsle 暂时不追求服务端运行时、登录系统、评论托管或复杂后台管理。它会保持静态优先，让内容源文件继续是 Markdown。</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Roadmap","Alpha"],"language":"zh"},{"id":"https://ygm-studio.github.io/inkisle/posts/deployment/","url":"https://ygm-studio.github.io/inkisle/posts/deployment/","title":"部署到 GitHub Pages","summary":"InkIsle 支持项目页子路径部署，适合托管在 GitHub Pages。","content_html":"<p>GitHub Pages 项目页通常部署在仓库名子路径下，例如 <code>https://ygm-studio.github.io/inkisle/</code>。这种场景需要同时配置 <code>site</code> 和 <code>base</code>。</p>\n<pre><code class=\"language-js\">export default {\n  site: &quot;https://ygm-studio.github.io&quot;,\n  base: &quot;/inkisle&quot;\n};\n</code></pre>\n<p>构建后，页面里的资源、搜索索引、RSS、JSON Feed、<code>llms.txt</code> 和 sitemap 都会带上 <code>/inkisle/</code> 前缀。</p>\n<h2>推荐 workflow</h2>\n<p>InkIsle 官网使用 GitHub Actions 构建 <code>site/dist</code> 并部署到 Pages。你也可以在自己的仓库里使用同样方式：</p>\n<pre><code class=\"language-bash\">npm run build\nnpm run check:links\n</code></pre>\n<p>如果使用自定义根域名，可以省略 <code>base</code> 或设置为 <code>/</code>。</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Deployment","GitHub Pages"],"language":"zh"},{"id":"https://ygm-studio.github.io/inkisle/posts/configuration/","url":"https://ygm-studio.github.io/inkisle/posts/configuration/","title":"配置站点","summary":"通过 inkisle.config.mjs 设置站点身份、主题、多语言、base path 和输出能力。","content_html":"<p>InkIsle 的默认配置已经可以直接运行。需要定制时，在项目根目录添加 <code>inkisle.config.mjs</code>。</p>\n<pre><code class=\"language-js\">export default {\n  title: &quot;My Site&quot;,\n  description: {\n    zh: &quot;我的内容站&quot;,\n    en: &quot;My content site&quot;\n  },\n  site: &quot;https://example.com&quot;,\n  theme: {\n    name: &quot;business-blog&quot;,\n    defaultMode: &quot;system&quot;,\n    allowUserToggle: true\n  }\n};\n</code></pre>\n<h2>常用字段</h2>\n<ul>\n<li><code>title</code> 和 <code>description</code> 控制页面标题、首页文案、feed 和 <code>llms.txt</code>。</li>\n<li><code>locales</code> 和 <code>defaultLocale</code> 控制多语言内容目录。</li>\n<li><code>theme.name</code> 可以选择 <code>personal</code> 或 <code>business-blog</code>。</li>\n<li><code>base</code> 用于 GitHub Pages 这类子路径部署，例如 <code>/inkisle</code>。</li>\n<li><code>interactions</code> 可按需接入 Waline 或 Giscus，默认不会加载第三方评论脚本。</li>\n<li><code>pwa</code>、<code>analytics</code>、<code>verificationFiles</code> 和 <code>redirects</code> 处理浏览器集成、统计、搜索验证文件和迁移跳转。</li>\n</ul>\n<p><code>base</code> 只影响浏览器可访问 URL，不改变 Markdown 内容路径，也不改变构建目录里的文件结构。</p>\n","date_published":"2026-05-17T00:00:00.000Z","date_modified":"2026-05-17T00:00:00.000Z","tags":["Configuration","Theme"],"language":"zh"}]}