+ {% endfor %}
+
diff --git a/.theme/theme.yml b/.theme/theme.yml
new file mode 100644
index 0000000..cfca5b7
--- /dev/null
+++ b/.theme/theme.yml
@@ -0,0 +1,28 @@
+protocol: labyricorn-theme/v1
+id: labyricorn-default
+version: 1.0.0
+engine: liquid
+
+templates:
+ layout: templates/layout.liquid
+ home: templates/home.liquid
+ notFound: templates/404.liquid
+ sections:
+ articles: templates/sections/articles.liquid
+ projects: templates/sections/projects.liquid
+ content:
+ page: templates/content/page.liquid
+ article: templates/content/article.liquid
+ project: templates/content/project.liquid
+
+assets:
+ styles:
+ - assets/styles/theme.css
+ scripts: []
+ files: []
+ fonts: []
+
+security:
+ allowScripts: false
+ allowExternalAssets: false
+ allowedExternalOrigins: []
diff --git a/README.md b/README.md
index 7396e80..0c29545 100644
--- a/README.md
+++ b/README.md
@@ -7,8 +7,10 @@ publishing path before more content or integrations are added.
## Source of truth
This repository is authoritative for the site content it contains. Labyricorn
-reads `.labyricorn/site.yml`, discovers the configured content, builds the
-website, and publishes the completed output to the local canonical site.
+reads the repository participation policy in `.labyricorn/site.yml`, resolves
+the canonical site definition in `site.yml`, validates the `.theme/` package,
+discovers the configured content, builds the website, and publishes the
+completed output to the local canonical site.
Generated website files do not belong in this repository.
@@ -16,6 +18,10 @@ Generated website files do not belong in this repository.
```text
.labyricorn/site.yml Repository participation and publishing policy
+site.yml Canonical site definition and theme selection
+navigation.yml Public navigation and section-template selection
+projects.yml Allowlisted project-page declarations
+.theme/ Strict Liquid templates and declared static assets
pages/ Standalone website pages
articles/ Article source documents
projects/ Project source documents
@@ -30,6 +36,7 @@ The first deployment includes:
- one homepage;
- one introductory article;
- one project page;
+- a repository-owned, script-free Liquid theme;
- local publication through Labyricorn.
It does not yet include:
diff --git a/articles/welcome.md b/articles/welcome.md
index f1e52df..65f07ee 100644
--- a/articles/welcome.md
+++ b/articles/welcome.md
@@ -2,6 +2,7 @@
model: article
title: Welcome to Labyricorn
slug: welcome
+route: /articles/welcome/
date: 2026-07-23
status: published
summary: Why the first deployment is intentionally small and locally hosted.
@@ -11,8 +12,6 @@ tags:
- git
---
-# Welcome to Labyricorn
-
Labyricorn is a configuration-first, Git-driven site builder. Repositories
provide content and configuration; the builder turns those sources into a
coherent website; the generated local site is the canonical runtime copy.
diff --git a/docs/DEPLOYMENT.md b/docs/DEPLOYMENT.md
index be8babd..3cd7805 100644
--- a/docs/DEPLOYMENT.md
+++ b/docs/DEPLOYMENT.md
@@ -17,15 +17,19 @@ Cloudflare Pages, Docker, or a public Control Plane.
2. Add that Gitea repository as the remote for this local repository.
3. Push the default branch to Gitea.
4. Connect the repository in the Labyricorn Control Plane.
-5. Synchronize it and confirm `.labyricorn/site.yml` is valid.
-6. Confirm that the `page`, `article`, and `project` models are installed and
+5. Synchronize it and confirm `.labyricorn/site.yml` and the root `site.yml`
+ are valid.
+6. Validate `.theme/theme.yml`, every referenced Liquid template, and the
+ declared stylesheet before creating a release.
+7. Confirm that the `page`, `article`, and `project` models are installed and
enabled in Labyricorn.
-7. Confirm discovery finds the three Markdown documents in this repository.
-8. Preview the generated routes and resolve any validation errors.
-9. Build the site.
-10. Publish the completed build to the local canonical site.
-11. Verify the homepage, article, and project page from a browser.
-12. Record the deployed Git revision and active local release.
+8. Confirm discovery finds the three Markdown documents in this repository.
+9. Preview the generated routes and resolve any validation errors.
+10. Build the site.
+11. Publish the completed build to the local canonical site.
+12. Verify the homepage, article, project index, and project page from a
+ browser.
+13. Record the deployed Git revision and active local release.
## Required proof
@@ -33,6 +37,7 @@ The initial deployment is successful only when all of the following are true:
- the repository revision shown by Labyricorn matches Gitea;
- configuration validation uses the committed `site.yml`;
+- theme validation uses the committed `.theme/theme.yml` and declared files;
- all three source documents are discovered without filename heuristics;
- generated routes come from configured model behavior;
- the public pages are served from the activated local release;
diff --git a/navigation.yml b/navigation.yml
new file mode 100644
index 0000000..33e3122
--- /dev/null
+++ b/navigation.yml
@@ -0,0 +1,22 @@
+navigation:
+ - id: home
+ label: Home
+ route: /
+ iconName: Home
+ contentModel: page
+
+ - id: articles
+ label: Articles
+ route: /articles/
+ iconName: FileText
+ contentModel: article
+ presentation:
+ sectionTemplate: articles
+
+ - id: projects
+ label: Projects
+ route: /projects/
+ iconName: Boxes
+ contentModel: project
+ presentation:
+ sectionTemplate: projects
diff --git a/pages/index.md b/pages/index.md
index d9a40db..96cbdfa 100644
--- a/pages/index.md
+++ b/pages/index.md
@@ -7,8 +7,6 @@ status: published
summary: A configuration-first, Git-driven home for projects, articles, and documentation.
---
-# Build once. Understand every part.
-
Labyricorn brings project information, articles, and documentation together
without replacing Git as the source of truth.
diff --git a/projects.yml b/projects.yml
new file mode 100644
index 0000000..30d5270
--- /dev/null
+++ b/projects.yml
@@ -0,0 +1,19 @@
+projects:
+ - id: labyricorn
+ source: site-definition
+ route: /projects/labyricorn/
+ title: Labyricorn
+ summary: A configuration-first, Git-driven static-site builder and control plane.
+ license: Proprietary
+ tags:
+ - labyricorn
+ - git
+ - static-site
+ stack:
+ - TypeScript
+ - React
+ - Liquid
+ - Nginx
+ presentation:
+ detailTemplate: project
+ publishedFiles: []
diff --git a/projects/labyricorn.md b/projects/labyricorn.md
index ff05f8b..37ecd7b 100644
--- a/projects/labyricorn.md
+++ b/projects/labyricorn.md
@@ -2,6 +2,7 @@
model: project
title: Labyricorn
slug: labyricorn
+route: /projects/labyricorn/
status: published
summary: A configuration-first, Git-driven site builder and its administrative control plane.
repository_url: https://git.labyricorn.com
@@ -11,8 +12,6 @@ tags:
- static-site
---
-# Labyricorn
-
Labyricorn builds and hosts locally generated sites from Git repositories.
Content models, routes, navigation, styles, themes, and integrations derive
their meaning from configuration rather than hardcoded content-type names.
diff --git a/site.yml b/site.yml
new file mode 100644
index 0000000..b3c49e0
--- /dev/null
+++ b/site.yml
@@ -0,0 +1,52 @@
+protocol: labyricorn-site/v1
+
+site:
+ id: labyricorn
+ title: Labyricorn
+ baseUrl: https://labyricorn.com
+ language: en-US
+
+navigationFile: ./navigation.yml
+projectsFile: ./projects.yml
+
+theme:
+ source: site-definition
+ path: .theme
+
+markdown:
+ dialect: labyricorn-commonmark-v1
+ rawHtmlPolicy: disabled
+ rawHtmlEnabled: false
+ extensions:
+ tables: true
+ taskLists: true
+ footnotes: true
+ definitionLists: true
+ headingAnchors: true
+ fencedCode: true
+ syntaxHighlighting: true
+ callouts: true
+ youtube: false
+ wikipediaLinks: true
+
+hosting:
+ engine: nginx
+ production:
+ enabled: true
+ hostname: labyricorn.com
+ listen: 80
+ staging:
+ enabled: true
+ hostname: preview.labyricorn.com
+ listen: 8080
+ releases:
+ retainCount: 10
+
+buildPolicy:
+ staging:
+ enabled: true
+ requireApproval: true
+ localActivation:
+ automatic: false
+ push:
+ automatic: false