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 installCopy .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-token
EMBEDDING_PROVIDER=localGet 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.
Use Gemini (free tier: 1,500 requests/day):
EMBEDDING_PROVIDER=gemini
GEMINI_API_KEY=your-keyUse OpenAI (paid):
EMBEDDING_PROVIDER=openai
OPENAI_API_KEY=your-keysemantic-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
Note: Cloudflare Workers/Pages deployment support is currently in development on the
cloudflare-workersbranch.
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.
Use Gemini for faster embeddings:
EMBEDDING_PROVIDER=gemini
GEMINI_API_KEY=your-key- Framework: Astro 5
- Search: libsql-search
- Database: Turso (libSQL)
- Styling: Tailwind CSS 4
- UI: React islands for interactivity
- Embeddings: Xenova, Gemini, or OpenAI
MIT
Built with libsql-search.