No external requests: no CDN or Google Fonts dependency; fonts and assets are self-hosted
hugo-ink — Hugo Starter Template
By vinooganesh
Ink is a minimalist personal website and blog theme built on Hugo, emphasizing no external requests, self-hosted fonts and assets, and including light/dark mode, fuzzy search, llms.txt output, and an Ask AI button.
Explore the design
Compare the page layouts and mobile experience. Open any screenshot for a closer look.
Preview provided in the project README.
One original preview is available. Open the full image to inspect the design.
Screenshots show visual appearance; interactive behavior may differ.
What stands out
A quick read of the recorded project description.
Light/dark mode: flicker-free toggle, system preference detection, and Alt+T shortcut
Search: Fuse.js fuzzy search, loaded only on the search page, requires JSON output configuration
AI-related output: provides llms.txt structured site index and a configurable Ask AI button
Content features: table of contents, related posts, series navigation, code copy button, and full RSS
Customizable: 17 CSS custom properties, 21 translatable UI strings, and multiple installation methods
Template Details
Ink is a Hugo theme for personal websites and blogs, with code under the MIT license. It keeps homepage loading free of CDN, Google Fonts, or external requests; the Inter font is provided as self-hosted WOFF2, and CSS and JS are minified with fingerprinting and SRI hashes. The theme includes a light/dark mode toggle, supports following system preference, and provides keyboard shortcuts (Alt+T to toggle theme, / to focus search, Escape to clear search).
On the content side, Ink provides layouts for blog posts, About, Now, and search pages. Post front matter can control table of contents (ShowToc, TocOpen), series, search hiding (searchHidden), and llms.txt hiding (hidden). Related posts are automatically generated via tags and date indexing, and series navigation is used for multi-part series. The search page uses Fuse.js, loaded only on the search page, and requires the site to output JSON; llms.txt output requires configuring a custom output format. The homepage can display an avatar, bio, social links, and an Ask AI button; the Ask AI button defaults to Claude, ChatGPT, and Perplexity, and can be customized or disabled.
The theme requires Hugo v0.123.0 or later, and the extended version is recommended. Installation methods include Git submodule, Hugo Module, and direct download. The README lists complete configuration parameters, front matter reference, 17 CSS custom properties, and 21 translatable UI strings. Licenses for third-party assets such as demo images, fonts, and icons must be checked separately; external services such as domains and hosting may incur costs.
Is it right for your project?
Use Cases
- Building a personal website or tech blog where the homepage should not make external requests
- Blogs that need light/dark mode, reading progress bar, sticky header, and other reading experience features
- Serialized content sites that add table of contents, related posts, and series navigation to articles
- Sites that want to provide an llms.txt index for AI crawlers and place an Ask AI entry on the homepage
- Hugo sites that need multilingual UI string translation and keyboard accessibility
Suitable For
- Individual developers and writers using Hugo v0.123.0 or later
- Sites that prefer minimalist typography, self-hosted assets, and no JavaScript frameworks
- Personal content sites that need blog, About, Now, and search pages
- Those willing to configure and customize styles via hugo.toml and CSS variables
Getting started & customization
Use these recorded setup notes alongside the repository instructions for your chosen version.
- 1
Requires Hugo v0.123.0 or later; the extended version is recommended
- 2
Installation options include Git submodule, Hugo Module (requires Go), or downloading the release and extracting it to themes/ink/
- 3
To enable search, add JSON to home in [outputs] and create content/search.md using layout: search
- 4
To enable llms.txt, add llmstxt to home in [outputs] and configure the corresponding outputFormats
- 5
The example site is in exampleSite/; you can copy its hugo.toml as a starting point for configuration
License & source material
Usage conditions & limitations
Free to use · keep license noticeThis entry covers the free version under the MIT license in the public repository; the free scope is the code of this version and does not mean external services or third-party assets are free.
Must comply with when using
- Free use, modification, commercial use, and distribution of this version's code are permitted.
- When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
- The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.
Additional costs & items to verify
- Using this theme requires Hugo v0.123.0 or later; the extended version is recommended, otherwise the site may not build properly.
- If you choose the Hugo Module installation method, Go must be installed in advance; Git submodule or download methods do not have this requirement.
- Enabling search requires adding the JSON output format to home in the site configuration's [outputs] and creating a search page using layout: search; otherwise search is unavailable.
- The Ask AI button relies on external AI services (such as Claude, ChatGPT, Perplexity); clicking it redirects to these third-party sites. Tools that do not support URL parameters rely on clipboard copying of the prompt. Use of these external services may be subject to their own terms and fees.
- The theme's self-hosted Inter font uses the SIL Open Font License, which differs from the theme code's MIT license; redistributing or modifying the font requires compliance with its separate license terms.
- The Fuse.js used for search is under the Apache 2.0 license, which differs from the theme code's MIT license; redistribution requires retaining its separate license and notices.
- Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
- External services such as domains, hosting, databases, payments, or AI may incur additional charges.
View Original Text Basis
Permission is hereby granted, free of charge
Original License Text
Requires Hugo **v0.123.0** or later (extended edition recommended)
Original README
Requires [Go](https://go.dev/dl/) installed.
Original README
Requires `"JSON"` in your `[outputs]` config. Search is powered by Fuse.js and loads only on this page.
Original 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.
Original README
- [Inter](https://rsms.me/inter/) typeface by Rasmus Andersson (SIL Open Font License)
Original 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)
Original README
Compiled by DeepSeek based on repository license and README ·2026-10-03. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.
Project checks & description sources
Template Information
- Source platforms
- Hugo Themes
- Documentation and maintenance reference score
- Partly documented · 63 / 100
- Technologies
- Hugo
- Website type
- Starter
How this score is calculated
Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.
What to verify for this project
- Repository update recorded
- 2026-02-18
- Screenshot last checked
- 2026-10-03
No demo link is recorded. Use the repository instructions to evaluate the project locally; the screenshot alone cannot establish interactive behavior.
The catalog identifies Hugo as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.
Use a selection guide →How this description was prepared
AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.
Review declaration: [email protected] · 2026-10-04
Inspect the recorded source material
SHA-256: 122b8141d0122f7548c10a35cb4f867633c943488728441fee000423422c61aa
2026-10-03T14:18:44.678Z
Source file / repository# 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)
Explore similar templates
Compare previews and descriptions within the same stack and category.

hugo-xmin
hugo-xmin is an extremely minimal Hugo theme written by Yihui Xie for template beginners. HTML and CSS total about 140 lines, with no external dependencies, and it uses the MIT license.
Hugo · Starter

hugo-theme-gallery
A Hugo Extended photo gallery theme that organizes images with Page Bundles, automatically generating album lists and gallery pages with a Justified layout and PhotoSwipe lightbox.
Hugo · Starter

reveal-hugo
reveal-hugo is a Hugo theme that converts Markdown content into Reveal.js-based HTML presentations. It supports slide separation with `---`, shortcodes for fragments, slides, sections, notes, Markdown, and MathJax, and organizes content as root or section presentations with order controlled by weight.
Hugo · Starter

anatole
Anatole is a minimalistic two-column Hugo theme ported from farbox-theme-Anatole, featuring dark mode, multilingual and RTL support, and optional portfolio, comments, analytics, KaTeX, and Mermaid integrations. It suits personal blogs, portfolios, or documentation sites built with Hugo.
Hugo · Starter

hugo-theme-diary
A Hugo diary-style theme ported from the Hexo theme Journal, with a grid homepage for essays and daily notes. It supports six languages, dark mode, table-of-contents scroll positioning, reading time, code highlighting, and configurable sidebar, fonts, and colors.
Hugo · Starter

risotto
risotto is a minimalist, responsive Hugo theme inspired by terminal ricing aesthetics. It uses semantic HTML and pure CSS with no JavaScript, and its layout relies on CSS Grid for native responsiveness without manual breakpoints.
Hugo · Starter
