Skip to main content

A modern Hugo theme built with Tailwind CSS v4 and daisyUI v5 . Shiloh was heavily inspired by the Congo theme and shares many of its configuration patterns.

Shiloh was named after a dog

Shiloh

Core Features #

Appearance #

  • Dark mode with automatic system preference detection and manual toggle
  • OKLCH color space for perceptually uniform, modern color handling
  • Two custom themes with full color palette
  • Configurable fonts supporting Fira Code and Prata typefaces

Content & Navigation #

  • Full-text search powered by Fuse.js with weighted results
  • Table of contents with scroll spy highlighting for long articles
  • Pagination with smart ellipsis and configurable window size
  • Taxonomy support for tags and categories with term counts
  • Previous/Next article navigation on single pages

Code & Typography #

  • Syntax highlighting via Chroma with theme-aware colors
  • Code copy button on all fenced code blocks
  • Custom typography system with article prose styling
  • Heading anchors for deep linking to sections
  • Blockquote attribution support via markdown attributes

Media & Performance #

  • Image optimization with WebP conversion and lazy loading
  • Quicklink prefetching for instant page loads
  • Responsive images with proper aspect ratios
  • Featured images on article cards

SEO & Accessibility #

  • Open Graph and Twitter Cards for social sharing
  • JSON-LD structured data for rich search results
  • Search engine verification (Google, Bing, Pinterest, Yandex)
  • Semantic HTML with proper landmarks and ARIA labels
  • Skip-to-content link for keyboard navigation
  • Focus indicators on all interactive elements

Recent Posts

Sentence Rotate

The sentence-rotate shortcode displays a sentence with rotating words appended to the end. Each word can have its own color styling. Basic Usage # Use the sentence-rotate shortcode with a sentence parameter and a list of words with optional color classes. Use daisyUI theme colors for consistent styling: {{< sentence-rotate sentence="Providing AI Agents for" >}} Designers | bg-primary text-primary-content Developers | bg-secondary text-secondary-content Managers | bg-accent text-accent-content {{< /sentence-rotate >}} Providing AI Agents for Designers Developers Managers Custom Size # Use the size parameter to change the text size:

1 min read

Timeline

The timeline shortcode displays a horizontal timeline of events. Each event consists of a label (left side) and description (right side), connected by visual markers. Basic Usage # Use the timeline shortcode with one event per line in label: description format: {{< timeline >}} 1984: Macintosh PC 1998: iMac 2001: iPod 2007: iPhone 2015: Apple Watch 2024: Vision Pro {{< /timeline >}} 1984 Macintosh PC 1998 iMac 2001 iPod 2007 iPhone 2015 Apple Watch 2024 Vision Pro Using Text Labels # The label doesn’t have to be a year. You can use any text:

2 min read

UI Preview

The preview shortcode displays HTML in a tabbed interface with a live preview and the source code. It’s useful for documentation and component showcases. Basic Usage # Use the preview shortcode with raw HTML inside: {{< preview >}} <button class="btn btn-primary">Click me</button> {{< /preview >}} Click me <button class="btn btn-primary">Click me</button> Button Group # {{< preview >}} <div class="flex gap-2"> <button class="btn">Default</button> <button class="btn btn-primary">Primary</button> <button class="btn btn-secondary">Secondary</button> <button class="btn btn-accent">Accent</button> </div> {{< /preview >}} Default Primary Secondary Accent <div class="flex gap-2"> <button class="btn">Default</button> <button class="btn btn-primary">Primary</button> <button class="btn btn-secondary">Secondary</button> <button class="btn btn-accent">Accent</button> </div> Card Component # {{< preview >}} <div class="card bg-base-200 w-80"> <div class="card-body"> <h2 class="card-title">Card Title</h2> <p>This is a sample card with some content inside.</p> <div class="card-actions justify-end"> <button class="btn btn-primary">Action</button> </div> </div> </div> {{< /preview >}} Card Title This is a sample card with some content inside.

2 min read

Code Blocks

Inline Code # Use backticks for inline code within paragraphs. Fenced Code Blocks # JavaScript # function greet(name) { return `Hello, ${name}!`; } const users = ['Alice', 'Bob', 'Charlie']; users.forEach(user => console.log(greet(user))); TypeScript # interface User { id: number; name: string; email: string; } async function fetchUser(id: number): Promise<User> { const response = await fetch(`/api/users/${id}`); return response.json(); } Go # package main import "fmt" func main() { messages := make(chan string) go func() { messages <- "Hello from goroutine" }() msg := <-messages fmt.Println(msg) } Python # from dataclasses import dataclass from typing import List @dataclass class Article: title: str tags: List[str] published: bool = False def get_published(articles: List[Article]) -> List[Article]: return [a for a in articles if a.published] Rust # use std::collections::HashMap; fn main() { let mut scores: HashMap<String, i32> = HashMap::new(); scores.insert(String::from("Blue"), 10); scores.insert(String::from("Red"), 50); for (key, value) in &scores { println!("{}: {}", key, value); } } YAML # baseURL: https://example.org/ title: My Site theme: shiloh params: enableSearch: true author: name: John Doe HTML # <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Example</title> </head> <body> <h1>Hello World</h1> </body> </html> CSS # .article-prose { @apply prose prose-lg max-w-none; h2 { @apply text-2xl font-bold mt-8 mb-4; } a { @apply text-primary hover:underline; } } Shell # #!/bin/bash hugo server --buildDrafts --disableFastRender SQL # SELECT u.name, COUNT(p.id) as post_count FROM users u LEFT JOIN posts p ON p.author_id = u.id WHERE u.active = true GROUP BY u.id HAVING COUNT(p.id) > 5 ORDER BY post_count DESC; JSON # { "name": "shiloh", "version": "1.0.0", "dependencies": { "tailwindcss": "^4.0.0", "daisyui": "^5.0.0" } } Plain Code Block # Plain text without syntax highlighting. Useful for output or logs.

2 min read