Project Structure
This page documents every folder and file in a Pycora Pro project.
Full Tree
pycora-pro/
├── content/ # Markdown content
│ ├── index.md # Home page
│ ├── about.md # About page
│ ├── contact.md # Contact page
│ ├── journal.md # Journal controller
│ ├── projects.md # Projects controller
│ ├── posts/ # Blog posts collection
│ └── projects/ # Projects collection
│
├── templates/ # Jinja2 templates
│ ├── layouts/ # Full page templates
│ ├── partials/ # Reusable fragments
│ └── *.pax / *.html # Top-level pages
│
├── static/ # Static assets
│ ├── admin/ # Decap CMS config
│ │ └── config.yml
│ ├── css/ # Stylesheets
│ ├── js/ # Scripts
│ └── img/ # Images
│
├── _data/ # YAML configuration
│ └── site.yaml # Global site settings
│
├── output/ # Generated site (git-ignored)
│
├── ssg.py # Static site generator
├── dev.py # Development server
├── install.py # Dependency installer
├── requirements.txt # Python dependencies
├── netlify.toml # Netlify config
├── vercel.json # Vercel config
├── README.md # Setup guide
└── LICENSE # End User License Agreement
Folder Reference
content/
All Markdown files live here. The folder structure maps directly to URL structure.
| Path | Output URL |
|---|---|
content/index.md | / |
content/about.md | /about/ |
content/posts/hello.md | /hello/ |
content/projects/site-redesign.md | /site-redesign/ |
Controllers (files with a collection: key) do not become pages. They generate listing pages.
templates/
Jinja2 and PAX templates.
| Folder | Purpose |
|---|---|
templates/layouts/ | Full page templates (header, body, footer) |
templates/partials/ | Reusable fragments (nav, footer, card) |
templates/*.pax | Top-level pages (home, about, contact) |
The PAXLoader searches for .pax first, then .html.
static/
Assets copied verbatim to output/ on every build.
| Folder | Purpose |
|---|---|
static/admin/ | Decap CMS config |
static/css/ | Stylesheets |
static/js/ | Scripts |
static/img/ | Images (uploaded via CMS) |
_data/
YAML configuration files. All files here are merged into a single config object.
| File | Purpose |
|---|---|
_data/site.yaml | Global site settings |
You can add more YAML files — each one is merged under its filename.
output/
The generated static site. Do not edit files here. They are overwritten on every build.
This folder is ignored by Git (see .gitignore).
Root Files
| File | Purpose |
|---|---|
ssg.py | The static site generator |
dev.py | Local dev server with live reload |
install.py | Automatic dependency installer |
requirements.txt | Python package list |
netlify.toml | Netlify deploy config |
vercel.json | Vercel deploy config |
README.md | Beginner setup guide |
LICENSE | End User License Agreement |
Content Flow
Here is how a Markdown file becomes a page:
content/about.md
│
▼
Parse YAML frontmatter ──► metadata
│
Parse Markdown body ──► HTML body
│
Find layout: layouts/page
│
Render layout with page data
│
▼
output/about/index.html
URL Mapping
Pycora Pro maps file paths to URLs automatically:
| Source | URL |
|---|---|
content/index.md | / |
content/about.md | /about/ |
content/contact.md | /contact/ |
content/posts/my-post.md | /my-post/ |
content/projects/project-01.md | /project-01/ |
The file name (without .md) becomes the slug.
To override the slug, add a slug: field in the frontmatter.
Adding a New Page
- Create a Markdown file in
content/:
---
layout: layouts/page
title: "My New Page"
description: "A description"
---
# My New Page
Content here...
- Build the site:
python ssg.py
- The page appears at
/my-new-page/.
Adding a New Collection
- Create a folder in
content/:
mkdir content/services
- Add Markdown files inside:
---
layout: layouts/service
title: "Web Design"
---
Content...
- Create a controller
content/services.md:
---
layout: layouts/services
collection: services
pagination: 6
sort_by: date
sort_order: desc
---
- Build the site. The collection is now listed at
/services/.