Documentation theme with semantic vector search.
A beautiful, dark-mode documentation theme powered by libsql-search for semantic search capabilities. Perfect for technical documentation, knowledge bases, and content-heavy sites.
- 🎨 Modern Dark UI - Sleek design with OKLCH colors
- 🔍 Semantic Search - AI-powered vector search in the header
- 📱 Responsive - Mobile-friendly with collapsible sidebar
- 📑 Auto TOC - Table of contents generated from headings
- 🚀 Edge-Ready - Optimized for Turso's global database
- ⚡ Fast - Static generation with server-rendered search
- 🎯 Type-Safe - Full TypeScript support
git clone https://github.com/llbbl/semantic-docs.git
cd semantic-docsOr use as a template on GitHub.
pnpm installOptional: use the justfile task runner for common commands:
just
just dev
just testSee docs/just.md for the full list of recipes.
Copy .env.example to .env and add your credentials:
cp .env.example .envEdit .env:
TURSO_DB_URL=libsql://your-database.turso.io
TURSO_AUTH_TOKEN=your-auth-tokenGet Turso credentials:
# Install Turso CLI
curl -sSfL https://get.tur.so/install.sh | bash
# Sign up and authenticate
turso auth signup
# Create a database
turso db create my-docs
# Get credentials
turso db show my-docsCreate markdown files in ./content:
mkdir -p content/getting-started
echo "# Hello World\n\nThis is my first article." > content/getting-started/intro.mdFront matter support:
---
title: Getting Started
tags: [tutorial, beginner]
---
# Getting Started
Your content here...# Initialize database and index content to Turso
pnpm db:init
pnpm index
# Or use local database without Turso (for testing)
pnpm db:init:local
pnpm index:localThis will:
- Scan your markdown files
- Generate embeddings (using local model by default)
- Store everything in Turso (or local.db with
:localcommands)
pnpm devVisit http://localhost:4321 to see your docs!
Edit src/components/DocsHeader.astro:
<span class="font-sans">Your Site Name</span>And src/layouts/DocsLayout.astro:
const { title = "Your Site Name", description = "Your description" } = Astro.props;Edit src/styles/global.css to change the color scheme. The theme uses OKLCH colors for smooth gradients and perceptual uniformity.
Semantic search uses local embeddings by default, so no API keys are required.
semantic-docs/
├── src/
│ ├── components/
│ │ ├── DocsHeader.astro # Header with search
│ │ ├── DocsSidebar.astro # Navigation sidebar
│ │ ├── DocsToc.tsx # Table of contents
│ │ └── Search.tsx # Search component
│ ├── layouts/
│ │ └── DocsLayout.astro # Main layout
│ ├── lib/
│ │ └── turso.ts # Database client
│ ├── pages/
│ │ ├── api/
│ │ │ └── search.json.ts # Search API endpoint
│ │ ├── content/
│ │ │ └── [...slug].astro # Article pages
│ │ └── index.astro # Home page
│ └── styles/
│ └── global.css # Global styles
├── scripts/
│ └── index-content.js # Indexing script
├── content/ # Your markdown files
├── astro.config.mjs
├── package.json
└── .env # Your credentials
This project is designed to run on platforms that support Docker containers, such as:
# Build with Node.js adapter (default)
pnpm build
# The built application runs on Node.js and can be containerized
# Set environment variables in your platform's dashboardImportant: Always run pnpm index before deploying to ensure content is indexed.
Note: These platforms have not been tested and cannot be recommended at this time.
# Build with Node.js adapter (default)
pnpm build
# Deploy
vercel
# or
netlify deploy --prod
# Add environment variables in platform dashboardThe theme automatically organizes content by folder:
content/
├── getting-started/
│ ├── intro.md
│ └── installation.md
├── guides/
│ ├── configuration.md
│ └── deployment.md
└── reference/
└── api.md
Folders become collapsible sections in the sidebar.
The search bar in the header provides semantic search:
- Semantic matching: Finds content by meaning, not just keywords
- Instant results: Real-time as you type
- Smart ranking: Most relevant results first
- Tag display: Shows article tags in results
Try searching for concepts rather than exact phrases!
# Index content
pnpm index
# Build site
pnpm build
# Preview
pnpm preview- Check
.envfile has correct credentials - Ensure
output: 'server'inastro.config.mjs - Verify content is indexed: run
pnpm index
- Run
pnpm indexto index your markdown files - Check content is in
./contentdirectory - Verify Turso database has data
First run downloads ~50MB model. Subsequent runs use cache.
- Framework: Astro 5
- Search: libsql-search
- Database: Turso (libSQL)
- Styling: Tailwind CSS 4
- UI: React islands for interactivity
- Embeddings: Xenova (local)
MIT
Built with libsql-search.