Skip to main content

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.

PathOutput 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.

FolderPurpose
templates/layouts/Full page templates (header, body, footer)
templates/partials/Reusable fragments (nav, footer, card)
templates/*.paxTop-level pages (home, about, contact)

The PAXLoader searches for .pax first, then .html.

static/​

Assets copied verbatim to output/ on every build.

FolderPurpose
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.

FilePurpose
_data/site.yamlGlobal 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​

FilePurpose
ssg.pyThe static site generator
dev.pyLocal dev server with live reload
install.pyAutomatic dependency installer
requirements.txtPython package list
netlify.tomlNetlify deploy config
vercel.jsonVercel deploy config
README.mdBeginner setup guide
LICENSEEnd 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:

SourceURL
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​

  1. Create a Markdown file in content/:
---
layout: layouts/page
title: "My New Page"
description: "A description"
---

# My New Page

Content here...
  1. Build the site:
python ssg.py
  1. The page appears at /my-new-page/.

Adding a New Collection​

  1. Create a folder in content/:
mkdir content/services
  1. Add Markdown files inside:
---
layout: layouts/service
title: "Web Design"
---

Content...
  1. Create a controller content/services.md:
---
layout: layouts/services
collection: services
pagination: 6
sort_by: date
sort_order: desc
---
  1. Build the site. The collection is now listed at /services/.

What's Next?​