Project Structure
Shevky uses a convention-based directory structure resolved by core/lib/project.js.
Expected Layout
project-root/
|-- package.json
|-- tailwind.config.js # Tailwind CSS configuration
|-- src/
| |-- site.json # Site configuration (identity, plugins, build, etc.)
| |-- i18n.json # Multi-language dictionary
| |-- content/ # Markdown content files
| | |-- hello-world.md
| | \-- about.md
| |-- layouts/ # Mustache page shells
| | |-- default.mustache # Main layout
| | \-- _header.mustache # Partial (prefix with _)
| |-- templates/ # Content templates (post, page, collection, etc.)
| | |-- post.mustache
| | \-- page.mustache
| |-- components/ # Reusable Mustache components
| |-- assets/ # Static files copied to dist/assets/
| |-- css/
| | \-- app.css # CSS entry point (for Tailwind plugin)
| \-- js/
| \-- app.js # JS entry point (for esbuild plugin)
\-- dist/ # Generated output (created by build)Key Directories
| Directory | Purpose |
|---|---|
src/content/ | Markdown source files parsed by gray-matter into front matter + body |
src/layouts/ | Page shells and partials. _-prefixed files are loaded as partials |
src/templates/ | Content-area templates selected by the template front matter field |
src/components/ | Reusable Mustache components, usable in both templates and Markdown |
src/assets/ | Copied to dist/assets/ during build |
dist/ | Generated static output. Cleared and recreated on each build |
Minimal Required Files
For a working build you need at minimum:
src/site.json- site configurationsrc/i18n.json- language dictionary (can be{}for single language)- At least one Markdown file in
src/content/with valid front matter - A default layout template in
src/layouts/
Build Output Conventions
- HTML pages follow content slug/language/canonical resolution.
- Plugin outputs appear at the root of
dist/:output.css(Tailwind),output.js(esbuild),robots.txt,sitemap.xml,feed.xml
- The
build.contentRootDirectoriesconfig (default:[".well-known"]) copies matchingsrc/content/subdirectories directly todist/.