Duvlify
GitHubGet started
GuidesGetting started

Getting started

Clone Duvlify, run it locally, and understand the four things you will edit — content, navigation, identity and theme — before you deploy.

Duvlify is a documentation framework: Astro, static output, no framework runtime in the browser. You write Markdown in content/, describe the shape of the site in one config file, and the build produces HTML along with everything that has to agree with it — search index, share cards, sitemap, Markdown twins, and the tools an AI agent calls.

Run it

Clone and install

Node 20 or newer. Dependency versions are pinned exactly, so a clone builds the same way tomorrow as it does today.

Terminal
git clone https://github.com/DuvInc/duvlify.git my-docs
cd my-docs
npm install

Start the development server

Terminal
npm run dev

Open http://localhost:4321. Content changes appear as you save.

Confirm the build is clean

Terminal
npm test

This runs a real build, then asserts the publication rules across every output and exercises the agent surfaces over HTTP. It should pass on a fresh clone with nothing configured.

The four things you will edit

Everything below lives in src/docs.config.ts except the pages themselves. Nothing in src/components/, src/styles/ or worker/ needs touching to rebrand or restructure — if you find yourself editing those to change a string, that is a gap in the config rather than something to work around.

Add your first page

Create the file at the path you want it served from. There is no path field — the location is the URL.

content/guides/my-page.mdx
---
title: My page
description: A clear sentence explaining what the reader will learn here.
---

## Overview

Ordinary Markdown works. So do **bold text**, links, tables and code fences.

Then list it in a navigation group. The id is the path under content/ without the extension:

src/docs.config.ts
{ label: 'Start here', icon: 'zap', pages: ['getting-started', 'guides/my-page'] }

Position in that array is the sidebar order. The label, icon and badge come from the page’s own frontmatter, so nothing is restated here.

Make it yours

Replace the content

Delete content/ and write your own pages, then rewrite navigation in src/docs.config.ts to match. The build will tell you what is inconsistent.

Set the identity and theme

Fill in site, seo and theme in the same file, and replace src/logo.svg. See Configuration for every field and Theming for the colour rules that matter.

Point it at your origin

Set SITE_URL in the deploy environment rather than editing the fallback in astro.config.ts, so a preview build and a production build cannot disagree about the canonical host.

Terminal
SITE_URL=https://docs.example.com npm run deploy

Deploy

Cloudflare is the intended host and the only one where every feature works without substitution, but dist/ is ordinary static output and any host will serve it. See Deploying.

Commands

npm run devdevelopment server
npm run buildtypecheck, then build to dist/
npm run previewserve the built output
npm testbuild, then assert the outputs and the agent surfaces
npm run deploybuild, sync the semantic index, then deploy
npm run deploy:fastbuild and deploy without reindexing
npm run index:dryshow what the semantic indexer would upload

Where to go next

Use these docs with your AI tools

An AI agent can read this documentation directly. You do not need an account or an API key. Everything here is public and read-only.

Query these docs via MCP

Recommended

Add this server to Claude, Claude Code, Cursor, Mistral, or any tool that supports MCP. Your agent can then search Duvlify documentation and read it in full, instead of answering from memory.

https://duvlify.dev/mcp
  • searchFind the passages that answer a question.
  • fetchRead one page in full, as Markdown.
  • list_pagesSee every page in this documentation.

Query these docs over HTTP

The same tools also work as plain web requests. Use this for scripts, or for any tool that does not support MCP. There is one endpoint per tool. Arguments go in the query string, and the answer comes back as JSON.

https://duvlify.dev/api/docs/search?query=custom+domain

Read the OpenAPI description. It is built from the same definitions as the tools, so it always matches what the endpoints do.

Read these docs as Markdown

Add .md to any page URL to get its Markdown source. You can also send the headerAccept: text/markdown to the page URL itself.

To read the whole documentation in one file, open llms-full.txt. For a short index of every page, open llms.txt.