无外部请求:不依赖 CDN 与 Google Fonts,字体与资源自托管
hugo-ink — Hugo 启动器模板
作者 vinooganesh
Ink 是一个基于 Hugo 的极简个人网站与博客主题,强调无外部请求、自托管字体与资源,并内置浅色/深色模式、模糊搜索、llms.txt 输出和 Ask AI 按钮。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
目前有 1 张原始预览,可打开完整图片查看设计细节。
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
浅色/深色模式:无闪烁切换,支持系统偏好检测与 Alt+T 快捷键
搜索:Fuse.js 模糊搜索,仅在搜索页加载,需配置 JSON 输出
AI 相关输出:提供 llms.txt 结构化站点索引与可配置的 Ask AI 按钮
内容功能:文章目录、相关文章、系列导航、代码复制按钮与完整 RSS
可定制:17 个 CSS 自定义属性、21 条可翻译 UI 字符串与多种安装方式
模板详细介绍
Ink 是面向个人网站与博客的 Hugo 主题,代码采用 MIT 许可。它把首页加载控制在不依赖 CDN、Google Fonts 或外部请求的范围内,字体 Inter 以自托管 WOFF2 形式提供,CSS 与 JS 均经过压缩并带指纹与 SRI 哈希。主题内置浅色/深色模式切换,支持跟随系统偏好,并提供键盘快捷键(Alt+T 切换主题、/ 聚焦搜索、Escape 清空搜索)。
内容层面,Ink 提供博客文章、About、Now 和搜索等页面布局。文章 front matter 可控制目录(ShowToc、TocOpen)、系列(series)、搜索隐藏(searchHidden)以及 llms.txt 隐藏(hidden)。相关文章通过 tags 与 date 索引自动生成,系列导航用于多篇连载。搜索页使用 Fuse.js,仅在搜索页加载,需要站点输出 JSON;llms.txt 输出需要配置自定义 output format。首页可展示头像、简介、社交链接和 Ask AI 按钮,Ask AI 按钮默认指向 Claude、ChatGPT 与 Perplexity,也可自定义或关闭。
主题要求 Hugo v0.123.0 或更高版本,建议使用 extended 版本。安装方式包括 Git submodule、Hugo Module 和直接下载三种。README 中列出了完整的配置参数、front matter 参考、17 个 CSS 自定义属性以及 21 条可翻译的 UI 字符串。演示图片、字体、图标等第三方素材的许可需要单独核对,域名、托管等外部服务可能产生费用。
适合你的项目吗?
适用场景
- 搭建个人网站或技术博客,希望首页不发起外部请求
- 需要浅色/深色模式、阅读进度条、粘性页头等阅读体验的博客
- 为文章添加目录、相关文章和系列导航的连载型内容站点
- 希望为 AI 爬虫提供 llms.txt 索引,并在首页放置 Ask AI 入口
- 需要多语言 UI 字符串翻译与键盘可访问性的 Hugo 站点
适合人群
- 使用 Hugo v0.123.0 或更高版本的个人开发者与写作者
- 偏好极简排版、自托管资源、无 JavaScript 框架的站点
- 需要博客、About、Now 与搜索页面的个人内容站点
- 愿意通过 hugo.toml 与 CSS 变量进行配置和样式定制
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Hugo v0.123.0 或更高版本,建议使用 extended 版本
- 2
安装方式可选 Git submodule、Hugo Module(需 Go)或下载 release 解压到 themes/ink/
- 3
启用搜索需在 [outputs] 的 home 中加入 JSON,并创建使用 layout: search 的 content/search.md
- 4
启用 llms.txt 需在 [outputs] 的 home 中加入 llmstxt,并配置对应的 outputFormats
- 5
示例站点位于 exampleSite/,可复制其 hugo.toml 作为配置起点
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 使用该主题需安装 Hugo v0.123.0 或更高版本,建议使用 extended 版本,否则可能无法正常构建站点。
- 若选择 Hugo Module 安装方式,需要预先安装 Go 环境;使用 Git submodule 或下载方式则无此要求。
- 启用搜索功能需在站点配置的 [outputs] 中为 home 添加 JSON 输出格式,并创建使用 layout: search 的搜索页,否则搜索不可用。
- Ask AI 按钮依赖外部 AI 服务(如 Claude、ChatGPT、Perplexity),点击后会跳转至这些第三方站点;不支持 URL 传参的工具需依赖剪贴板复制提示词,使用这些外部服务可能受其各自条款与费用约束。
- 主题自托管的 Inter 字体采用 SIL Open Font License,与主题代码的 MIT 许可不同,再分发或修改字体时需遵守其单独许可条款。
- 搜索功能使用的 Fuse.js 采用 Apache 2.0 许可,与主题代码的 MIT 许可不同,再分发时需保留其单独许可与声明。
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
Requires Hugo **v0.123.0** or later (extended edition recommended)
README 原文
Requires [Go](https://go.dev/dl/) installed.
README 原文
Requires `"JSON"` in your `[outputs]` config. Search is powered by Fuse.js and loads only on this page.
README 原文
If a tool supports URL-based prompts, include `PROMPT` in the URL — it will be replaced with the auto-generated prompt. For tools without URL prompt support, the prompt is copied to clipboard before opening.
README 原文
- [Inter](https://rsms.me/inter/) typeface by Rasmus Andersson (SIL Open Font License)
README 原文
https://github.com/vinooganesh/hugo-ink/blob/main/LICENSEhttps://github.com/vinooganesh/hugo-ink/blob/main/README.md- [Fuse.js](https://www.fusejs.io/) by Kiro Risk (Apache 2.0)
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-03。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- Hugo Themes
- 资料与维护参考分
- 资料一般 · 63 / 100
- 技术栈
- Hugo
- 网站类型
- 启动器
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-02-18
- 截图检查日期
- 2026-10-03
目前没有记录演示链接。请依据仓库说明在本地评估;仅凭截图无法确认交互行为。
目录记录的主要技术栈是 Hugo。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: [email protected] · 2026-10-04
查看当时使用的来源资料
SHA-256: 122b8141d0122f7548c10a35cb4f867633c943488728441fee000423422c61aa
2026-10-03T14:18:44.678Z
来源文件 / 仓库# Ink
A minimal, blazing-fast Hugo theme for personal websites and blogs.
**Fast | Minimal | AI-Ready | Sub-100KB**
Built by [Vinoo Ganesh](https://vinoo.io) ([GitHub](https://github.com/vinooganesh))
---


---
## Features
- Sub-100KB first page load — no CDN, no Google Fonts, no external requests
- Flash-free light/dark mode with OS preference detection
- Self-hosted [Inter](https://rsms.me/inter/) font (Latin subset, ~76KB WOFF2 total)
- Minified and fingerprinted assets with SRI hashes
- No JavaScript frameworks — vanilla inline JS only
- Fuzzy search powered by [Fuse.js](https://www.fusejs.io/) (loaded only on search page)
- `llms.txt` output — structured site index for AI crawlers
- Ask AI buttons — one-click prompt to Claude, ChatGPT, Perplexity
- JSON-LD structured data (Article, WebSite, WebPage)
- Table of Contents (collapsible, per-post opt-in)
- Related posts (auto-generated, 3-column grid)
- Post series navigation
- Code copy button on all code blocks
- Full-content RSS feed with autodiscovery
- Dedicated [Now page](https://nownownow.com/about) layout
- Reading progress bar, scroll-to-top, sticky header
- Open Graph, Twitter Cards, canonical URLs
- Full i18n support (21 translatable UI strings)
- Keyboard accessible with ARIA labels and semantic HTML
- Print stylesheet and `prefers-reduced-motion` support
- Four responsive breakpoints
> Requires Hugo **v0.123.0** or later (extended edition recommended)
---
## Installation
### Method 1: Git Submodule (recommended)
```bash
hugo new site my-site
cd my-site
git init
git submodule add https://github.com/vinooganesh/hugo-ink.git themes/ink
```
Set the theme in `hugo.toml`:
```toml
theme = "ink"
```
**Updating:**
```bash
git submodule update --remote --merge
```
### Method 2: Hugo Module
Requires [Go](https://go.dev/dl/) installed.
```bash
hugo new site my-site
cd my-site
hugo mod init github.com/your-username/my-site
```
Add to `hugo.toml`:
```toml
[module]
[[module.imports]]
path = "github.com/vinooganesh/hugo-ink"
```
**Updating:**
```bash
hugo mod get -u github.com/vinooganesh/hugo-ink
```
### Method 3: Download
Download the [latest release](https://github.com/vinooganesh/hugo-ink/releases) and extract into `themes/ink/`.
---
## Quick Start
After installing, the fastest way to get running:
```bash
# Copy the example configuration
cp themes/ink/exampleSite/hugo.toml hugo.toml
# Create your first post
hugo new posts/hello-world.md
# Start the dev server
hugo server
```
Open [http://localhost:1313](http://localhost:1313) to see your site.
The `exampleSite/` directory contains a full working site you can reference for content structure and configuration.
---
## Configuration
### Minimal `hugo.toml`
The minimum config to get a working site:
```toml
baseURL = "https://example.com/"
languageCode = "en-us"
title = "My Site"
theme = "ink"
[params]
author = "Your Name"
description = "My personal site."
homeTitle = "Your Name"
homeSubtitle = "A short tagline."
[menu]
[[menu.main]]
name = "Blog"
url = "/posts/"
weight = 1
[outputs]
home = ["HTML", "RSS"]
```
### Full `hugo.toml`
All available options with comments:
```toml
baseURL = "https://example.com/"
languageCode = "en-us"
title = "Your Name"
theme = "ink"
[params]
author = "Your Name"
description = "Designer, developer, and writer."
homeTitle = "Your Name"
homeSubtitle = "Designer, developer, and writer."
homeBio = "I build things for the web and write about technology, design, and the craft of making software."
homeImage = "/images/avatar.jpg" # Avatar on homepage (place in static/images/, renders as 110px circle)
favicon = "/favicon.ico" # Place in static/
recentPostsCount = 3 # Posts shown on homepage (default: 3)
# Social links — displayed in the homepage hero section
[[params.socialLinks]]
name = "GitHub"
url = "https://github.com"
external = true # Opens in new tab with external link indicator
[[params.socialLinks]]
name = "LinkedIn"
url = "https://linkedin.com"
external = true
[[params.socialLinks]]
name = "Email"
url = "mailto:[email protected]"
[[params.socialLinks]]
name = "Blog"
url = "/posts/"
# Ask AI buttons — shown on homepage, configurable
# If omitted entirely, defaults to Claude, ChatGPT, and Perplexity
# Use PROMPT in URL for tools with native query support
[[params.askAI]]
name = "Claude"
url = "https://claude.ai/new"
[[params.askAI]]
name = "ChatGPT"
url = "https://chatgpt.com/"
[[params.askAI]]
name = "Perplexity"
url = "https://perplexity.ai/search?q=PROMPT"
# Navigation menu
[menu]
[[menu.main]]
name = "Now"
url = "/now/"
weight = 1
[[menu.main]]
name = "About"
url = "/about/"
weight = 2
[[menu.main]]
name = "Blog"
url = "/posts/"
weight = 3
# Output formats — add "llmstxt" and "JSON" to enable llms.txt and search
[outputs]
home = ["HTML", "RSS", "llmstxt", "JSON"]
[outputFormats.llmstxt]
mediaType = "text/plain"
baseName = "llms"
isPlainText = true
notAlternative = true
# Related posts — powers the "Related Posts" section on blog posts
[related]
includeNewer = true
threshold = 80
toLower = true
[[related.indices]]
name = "tags"
weight = 100
[[related.indices]]
name = "date"
weight = 10
```
### Site Parameters Reference
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `author` | string | — | Author name for meta tags |
| `description` | string | — | Site description for SEO |
| `homeTitle` | string | — | Large heading on homepage |
| `homeSubtitle` | string | — | Subtitle below the heading |
| `homeBio` | string | — | Paragraph text on homepage |
| `homeImage` | string | — | Avatar image path (110px circle) |
| `favicon` | string | — | Favicon path |
| `recentPostsCount` | int | `3` | Number of posts on homepage |
| `socialLinks` | array | — | Social links in hero section |
| `askAI` | array | Claude, ChatGPT, Perplexity | AI prompt buttons on homepage |
---
## Content
### Directory Structure
```
content/
about.md # About page
now.md # Now page (uses layout: "now")
search.md # Search page (uses layout: "search")
posts/
my-first-post.md
another-post.md
```
### Blog Post Front Matter
```yaml
---
title: "My Post"
date: 2026-02-15
tags: ["go", "web"]
description: "A short description for SEO and post cards."
ShowToc: true # Show table of contents (default: false)
TocOpen: true # TOC starts expanded (default: false)
series: "My Series" # Group posts into a navigable series
searchHidden: true # Exclude from search index (default: false)
hidden: true # Exclude from llms.txt (default: false)
cover: "/images/cover.jpg" # Open Graph / Twitter Card image
---
```
### Front Matter Reference
| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `title` | string | — | Post title |
| `date` | date | — | Publication date |
| `tags` | array | — | Tags for categorization and related posts |
| `description` | string | — | SEO meta description and post card summary |
| `ShowToc` | bool | `false` | Show table of contents |
| `TocOpen` | bool | `false` | TOC expanded by default |
| `series` | string | — | Series name for multi-part posts |
| `searchHidden` | bool | `false` | Hide from search index |
| `hidden` | bool | `false` | Hide from llms.txt |
| `cover` | string | — | Image for Open Graph / Twitter Cards |
### Special Pages
**Search page** — Create `content/search.md`:
```yaml
---
title: "Search"
layout: "search"
searchHidden: true
---
```
Requires `"JSON"` in your `[outputs]` config. Search is powered by Fuse.js and loads only on this page.
**Now page** — Create `content/now.md`:
```yaml
---
title: "Now"
layout: "now"
subtitle: "What I'm up to these days"
---
```
Uses a dedicated layout. Learn more about [Now pages](https://nownownow.com/about).
**About page** — Create `content/about.md`:
```yaml
---
title: "About"
---
```
Uses the default single page layout.
---
## Customization
### Colors
The theme uses 17 CSS custom properties with full light/dark pairs. Override them in your own stylesheet:
```css
:root {
--bg: #ffffff;
--text: #111111;
--link: #0066cc;
/* ... */
}
```
| Variable | Light | Dark | Used for |
|----------|-------|------|----------|
| `--bg` | `#fafaf9` | `#1c1917` | Page background |
| `--text` | `#1c1917` | `#fafaf9` | Primary text |
| `--text-secondary` | `#78716c` | `#a8a29e` | Meta text, subtitles |
| `--link` | `#2563eb` | `#60a5fa` | Link color |
| `--link-hover` | `#1d4ed8` | `#93bbfd` | Link hover |
| `--accent` | `#2563eb` | `#60a5fa` | Focus rings, progress bar |
| `--border` | `#e7e5e4` | `#44403c` | Borders, dividers |
| `--code-bg` | `#f5f5f4` | `#292524` | Inline code background |
| `--code-text` | `#44403c` | `#d6d3d1` | Inline code text |
| `--code-block-bg` | `#1e1e1e` | `#292524` | Code block background |
| `--code-block-text` | `#d4d4d4` | `#d6d3d1` | Code block text |
| `--tag-bg` | `#f5f5f4` | `#292524` | Tag pill background |
| `--tag-text` | `#44403c` | `#d6d3d1` | Tag pill text |
| `--blockquote-border` | `#d6d3d1` | `#57534e` | Blockquote left border |
| `--selection-bg` | `#2563eb` | `#60a5fa` | Text selection background |
| `--selection-text` | `#fff` | `#1c1917` | Text selection text |
| `--hover-bg` | `#f5f5f4` | `#292524` | Card hover background |
### Ask AI Buttons
Configurable via `params.askAI`. If omitted entirely, defaults to Claude, ChatGPT, and Perplexity.
Add any AI tool:
```toml
[[params.askAI]]
name = "Gemini"
url = "https://gemini.google.com/"
```
If a tool supports URL-based prompts, include `PROMPT` in the URL — it will be replaced with the auto-generated prompt. For tools without URL prompt support, the prompt is copied to clipboard before opening.
To disable Ask AI buttons entirely, set an empty array:
```toml
[params]
askAI = []
```
### i18n / Translations
The theme ships with English (`i18n/en.yaml`). All 21 UI strings are translatable.
Create `i18n/xx.yaml` in your site root for your language:
```yaml
# i18n/es.yaml
prev: "← Anterior"
next: "Siguiente →"
search: "Buscar"
search_placeholder: "Escribir para buscar..."
search_no_results: "No se encontraron resultados."
search_unavailable: "Indice de busqueda no disponible."
search_requires_js: "La busqueda requiere JavaScript."
recent: "Recientes"
view_all: "Ver todo"
toggle_theme: "Cambiar tema"
scroll_to_top: "Ir arriba"
copy: "copiar"
copied: "Copiado!"
toc_title: "Tabla de contenidos"
related_posts: "Articulos relacionados"
ask_ai_label: "Pregunta a la IA sobre este sitio"
page_not_found: "Pagina no encontrada"
back_home: "Volver al inicio"
series: "Serie"
min_read:
one: "1 min de lectura"
other: "{{ .Count }} min de lectura"
```
---
## Keyboard Shortcuts
| Key | Action |
|-----|--------|
| `Alt + T` | Toggle light/dark mode |
| `/` | Focus search input (on search page) |
| `Escape` | Clear search input |
---
## Performance
| Asset | Size |
|-------|------|
| CSS (minified) | ~15 KB |
| Inter 400 (Latin WOFF2) | 37 KB |
| Inter 700 (Latin WOFF2) | 38 KB |
| Inline JS | ~2 KB |
| Fuse.js (search page only) | 15.4 KB |
| **Homepage first load** | **~95 KB** |
No external requests. No CDN. No Google Fonts. Everything is self-hosted.
---
## Credits
- [Inter](https://rsms.me/inter/) typeface by Rasmus Andersson (SIL Open Font License)
- [Fuse.js](https://www.fusejs.io/) by Kiro Risk (Apache 2.0)
- Inspired by [PaperMod](https://github.com/adityatelange/hugo-PaperMod)
## License
[MIT](LICENSE)
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

hugo-xmin
eXtremely Minimal Hugo theme: about 140 lines of code in total, including HTML and CSS (with no dependencies)
Hugo · 启动器

hugo-theme-gallery
Gallery Theme for Hugo
Hugo · 启动器

reveal-hugo
📽️ Create rich HTML-based presentations with Hugo and Reveal.js
Hugo · 启动器

anatole
Anatole is a minimalistic two-column theme for Hugo.
Hugo · 启动器

hugo-theme-diary
Moments piled up. A Hugo theme ported from SumiMakito/hexo-theme-Journal.
Hugo · 启动器

risotto
A minimalist, responsive hugo theme inspired by terminal ricing aesthetics.
Hugo · 启动器
