431 lines
12 KiB
Markdown
431 lines
12 KiB
Markdown
# Copilot Instructions for AI Agents
|
|
|
|
## Project Overview
|
|
This is **aron.petau.net**, a multilingual personal portfolio and blog built with:
|
|
- **Framework**: [Zola](https://www.getzola.org/) static site generator (v0.19+)
|
|
- **Theme**: Customized [Duckquill](https://duckquill.daudix.one) theme
|
|
- **Languages**: English (default) and German (`.de.md` suffixed files)
|
|
- **Deployment**: Manual build process, `public/` directory is version controlled
|
|
- **URL**: https://aron.petau.net/
|
|
- **Source**: Hosted on self-hosted Forgejo at https://forgejo.petau.net/aron/awebsite
|
|
|
|
## Architecture & File Structure
|
|
|
|
### Content Layer (`content/`)
|
|
- `_index.md` / `_index.de.md` - Homepage content
|
|
- `pages/` - Static pages (About, CV, Contact, Privacy, etc.)
|
|
- `project/` - Blog posts and projects, organized by date folders
|
|
- Format: `YYYY-MM-DD-slug/index.md` and `index.de.md`
|
|
- Each project is self-contained with its own images
|
|
|
|
### Template Layer
|
|
- `themes/duckquill/templates/` - Base theme templates (DO NOT MODIFY)
|
|
- `templates/` - Custom template overrides (use this for customization)
|
|
- `templates/shortcodes/` - Custom shortcodes (gallery, mermaid, skills, timeline)
|
|
|
|
### Style Layer
|
|
- `sass/` - Custom SCSS source files (compiled by Zola)
|
|
- `themes/duckquill/sass/` - Theme SCSS (DO NOT MODIFY)
|
|
- `static/css/` - Pre-built CSS for shortcodes (gallery, mermaid, skills, timeline)
|
|
|
|
### Static Assets
|
|
- `static/` - Raw files copied as-is to output (images, documents, fonts, CSS, JS)
|
|
- `static/documents/` - PDFs and downloadable files
|
|
- `static/images/` - Site-wide images
|
|
- `static/css/` - Custom CSS for shortcodes
|
|
- `public/` - **Generated output** (version controlled, pushed to server)
|
|
|
|
### Configuration
|
|
- `config.toml` - Main Zola configuration
|
|
- Base URL: `https://aron.petau.net/`
|
|
- Theme: `duckquill`
|
|
- Features: RSS/Atom feeds, search index, taxonomy (tags)
|
|
- Custom styles loaded: timeline, mermaid, skills, gallery
|
|
- `i18n/de.toml` - German translations for UI elements
|
|
|
|
## Critical Workflows
|
|
|
|
### Development
|
|
```bash
|
|
# Serve with live reload on localhost:1111
|
|
zola serve
|
|
|
|
# Build site (output to public/)
|
|
zola build
|
|
|
|
# Run comprehensive tests (build, link checking, etc.)
|
|
./scripts/test_site.sh
|
|
```
|
|
|
|
### Content Management
|
|
```bash
|
|
# Create German stubs for all existing English content
|
|
./scripts/create_german_stubs.sh
|
|
|
|
# Update frontmatter across content files
|
|
./scripts/add_update_frontmatter.sh
|
|
|
|
# Organize content (details in script)
|
|
./scripts/organize.sh
|
|
```
|
|
|
|
### Content Creation
|
|
|
|
**New Project/Blog Post:**
|
|
1. Create folder: `content/project/YYYY-MM-DD-slug/`
|
|
2. Create `index.md` (English) and `index.de.md` (German)
|
|
3. Add required frontmatter:
|
|
```toml
|
|
+++
|
|
title = "Project Title"
|
|
authors = ["Aron Petau"]
|
|
date = 2025-10-06
|
|
description = "Brief description"
|
|
|
|
[taxonomies]
|
|
tags = ["tag1", "tag2"]
|
|
|
|
+++
|
|
```
|
|
4. Place images in the same directory as the markdown file
|
|
5. Build and test locally before committing
|
|
|
|
**New Page:**
|
|
1. Create in `content/pages/`: `pagename.md` and `pagename.de.md`
|
|
2. Add frontmatter (same structure as above)
|
|
3. Ensure both language versions have matching content structure
|
|
|
|
**Adding Documents (PDFs, etc.):**
|
|
- Place in `static/documents/`
|
|
- Reference as `/documents/filename.pdf` in content
|
|
- **DO NOT** use external CDN dependencies (Adobe, etc.)
|
|
|
|
## Project-Specific Conventions
|
|
|
|
### Multilingual Content
|
|
- **Every page must have both `.md` (English) and `.de.md` (German)**
|
|
- Filenames must match exactly (except for language suffix)
|
|
- German translations should match English structure and tone
|
|
- Use `./scripts/create_german_stubs.sh` to generate initial German files
|
|
|
|
### Frontmatter Requirements
|
|
All markdown files require TOML frontmatter with:
|
|
- `title` - Page/post title
|
|
- `authors` - Array, typically `["Aron Petau"]`
|
|
- `date` - ISO format (YYYY-MM-DD)
|
|
- `description` - Brief summary (for SEO and cards)
|
|
- `[taxonomies]` - tags array
|
|
- `[extra]` - Optional settings (show_copyright, show_shares, etc.)
|
|
|
|
### Directory Structure Conventions
|
|
- `content/pages/` - Static site pages
|
|
- `content/project/` - Blog posts and projects (date-prefixed folders)
|
|
- `static/documents/` - PDFs and downloadable files
|
|
- `static/images/` - Site-wide images
|
|
- `static/css/` - Shortcode-specific CSS
|
|
- Project images go in same folder as `index.md`
|
|
|
|
### Theme Customization Rules
|
|
- **NEVER modify** `themes/duckquill/` directly
|
|
- Use `templates/` for template overrides
|
|
- Use `sass/` for style customizations
|
|
- Use `static/` for additional assets
|
|
- Theme updates can overwrite changes in `themes/` directory
|
|
|
|
### Asset References
|
|
- Static files: `/path/from/static/` (e.g., `/documents/file.pdf`)
|
|
- Images in same folder: `./image.jpg`
|
|
- Processed images: Zola handles automatically
|
|
- External links: Use full URLs with https://
|
|
|
|
## Custom Shortcodes
|
|
|
|
The site provides four custom shortcodes in `templates/shortcodes/`:
|
|
|
|
### 1. Gallery Shortcode
|
|
Creates responsive image galleries with lightbox support.
|
|
**Location**: `templates/shortcodes/gallery.html`
|
|
**CSS**: `static/css/gallery.css`
|
|
|
|
```md
|
|
{% gallery() %}
|
|
[
|
|
{"file": "image1.jpg", "alt": "Description", "title": "Optional Caption"},
|
|
{"file": "image2.jpg", "alt": "Description", "title": "Another caption"}
|
|
]
|
|
{% end %}
|
|
```
|
|
|
|
**Requirements:**
|
|
- Images must be in the same directory as the content file
|
|
- Use `./imagename.jpg` for relative paths
|
|
- All images must have `alt` text for accessibility
|
|
- `title` is optional and appears in lightbox
|
|
|
|
### 2. Mermaid Shortcode
|
|
Renders diagrams using Mermaid.js syntax.
|
|
**Location**: `templates/shortcodes/mermaid.html`
|
|
**CSS**: `static/css/mermaid.css`
|
|
|
|
```md
|
|
{% mermaid() %}
|
|
graph TD
|
|
A[Start] --> B[Process]
|
|
B --> C{Decision}
|
|
C -->|Yes| D[End]
|
|
C -->|No| A
|
|
{% end %}
|
|
```
|
|
|
|
**Supported diagrams:** flowchart, sequence, class, state, ER, Gantt, pie, etc.
|
|
|
|
### 3. Skills Shortcode
|
|
Displays categorized skills with optional icons and links.
|
|
**Location**: `templates/shortcodes/skills.html`
|
|
**CSS**: `static/css/skills.css`
|
|
|
|
```md
|
|
{% skills() %}
|
|
[
|
|
{
|
|
"name": "Programming",
|
|
"skills": [
|
|
{"name": "Python", "icon": "fab fa-python", "link": "https://python.org"},
|
|
{"name": "JavaScript", "icon": "fab fa-js"}
|
|
]
|
|
},
|
|
{
|
|
"name": "Design",
|
|
"skills": [
|
|
{"name": "Figma"},
|
|
{"name": "Adobe XD", "link": "https://adobe.com/xd"}
|
|
]
|
|
}
|
|
]
|
|
{% end %}
|
|
```
|
|
|
|
**Properties:**
|
|
- `name` (required) - Skill name
|
|
- `icon` (optional) - FontAwesome class
|
|
- `link` (optional) - External URL
|
|
|
|
### 4. Timeline Shortcode
|
|
Displays chronological events and experiences.
|
|
**Location**: `templates/shortcodes/timeline.html`
|
|
**CSS**: `static/css/timeline.css`
|
|
|
|
```md
|
|
{% timeline() %}
|
|
[
|
|
{
|
|
"from": "2025-01",
|
|
"to": "2025-12",
|
|
"title": "Event Title",
|
|
"location": "Berlin, Germany",
|
|
"icon": "fas fa-briefcase",
|
|
"body": "Description of the event or experience",
|
|
"link": "https://example.com"
|
|
},
|
|
{
|
|
"from": "2024-06",
|
|
"to": "present",
|
|
"title": "Current Position",
|
|
"location": "Remote",
|
|
"body": "Ongoing work description"
|
|
}
|
|
]
|
|
{% end %}
|
|
```
|
|
|
|
**Properties:**
|
|
- `from` (required) - Start date (YYYY-MM format)
|
|
- `to` (required) - End date or "present"
|
|
- `title` (required) - Event title
|
|
- `location` (optional) - Physical location
|
|
- `icon` (optional) - FontAwesome class
|
|
- `body` (optional) - Detailed description
|
|
- `link` (optional) - External URL
|
|
|
|
## Build & Deployment Process
|
|
|
|
## Build & Deployment Process
|
|
|
|
### Local Development
|
|
1. **Serve locally** (live reload on port 1111):
|
|
```bash
|
|
zola serve
|
|
```
|
|
|
|
2. **Build site** (outputs to `public/`):
|
|
```bash
|
|
zola build
|
|
```
|
|
|
|
3. **Run tests** (comprehensive validation):
|
|
```bash
|
|
./scripts/test_site.sh
|
|
```
|
|
Tests include:
|
|
- Build validation
|
|
- Link checking (internal and external)
|
|
- Markdown linting
|
|
- Accessibility checks
|
|
|
|
### Deployment Workflow
|
|
1. Make content/code changes
|
|
2. Test locally with `zola serve`
|
|
3. Run `zola build` to generate `public/`
|
|
4. **Important**: `public/` is version controlled
|
|
5. Commit both source files AND generated `public/` directory
|
|
6. Push to Forgejo (self-hosted Git)
|
|
7. Server pulls and serves from `public/`
|
|
|
|
### Quality Checks
|
|
Before committing:
|
|
- [ ] Build succeeds without errors
|
|
- [ ] Both EN and DE versions exist and match structure
|
|
- [ ] Links are valid (run `./scripts/test_site.sh`)
|
|
- [ ] Images have alt text
|
|
- [ ] Frontmatter is complete and valid
|
|
- [ ] No external CDN dependencies added
|
|
|
|
## Common Tasks & Examples
|
|
|
|
### Add a new blog post/project
|
|
```bash
|
|
# 1. Create directory
|
|
mkdir -p content/project/2025-10-06-my-project
|
|
|
|
# 2. Create content files
|
|
touch content/project/2025-10-06-my-project/index.md
|
|
touch content/project/2025-10-06-my-project/index.de.md
|
|
|
|
# 3. Add images to same directory
|
|
cp ~/images/hero.jpg content/project/2025-10-06-my-project/
|
|
|
|
# 4. Edit markdown files with proper frontmatter
|
|
# 5. Test locally
|
|
zola serve
|
|
|
|
# 6. Build and commit
|
|
zola build
|
|
git add .
|
|
git commit -m "Add: My Project blog post"
|
|
git push
|
|
```
|
|
|
|
### Add a new static page
|
|
```bash
|
|
# Create both language versions
|
|
touch content/pages/newpage.md
|
|
touch content/pages/newpage.de.md
|
|
|
|
# Or use the German stub generator
|
|
./scripts/create_german_stubs.sh
|
|
```
|
|
|
|
### Update theme styles
|
|
```bash
|
|
# Add custom SCSS (never edit themes/duckquill/)
|
|
nano sass/_custom.scss
|
|
|
|
# Add to sass/style.scss imports
|
|
# Rebuild
|
|
zola build
|
|
```
|
|
|
|
### Add a PDF document
|
|
```bash
|
|
# Place in static directory
|
|
cp ~/Downloads/document.pdf static/documents/
|
|
|
|
# Reference in markdown
|
|
# Link: [Download PDF](/documents/document.pdf)
|
|
```
|
|
|
|
### Create a gallery in a post
|
|
```markdown
|
|
{% gallery() %}
|
|
[
|
|
{"file": "./hero.jpg", "alt": "Main image", "title": "Project hero image"},
|
|
{"file": "./detail1.jpg", "alt": "Detail view"},
|
|
{"file": "./detail2.jpg", "alt": "Another detail"}
|
|
]
|
|
{% end %}
|
|
```
|
|
|
|
## Troubleshooting
|
|
|
|
### Build fails
|
|
1. Check TOML frontmatter syntax (no smart quotes)
|
|
2. Ensure all referenced files exist
|
|
3. Check for unclosed shortcodes
|
|
4. Run `zola check` for detailed errors
|
|
|
|
### Links broken
|
|
1. Use absolute paths for static files (`/documents/file.pdf`)
|
|
2. Use relative paths for same-folder images (`./image.jpg`)
|
|
3. Run `./scripts/test_site.sh` to find broken links
|
|
|
|
### German version missing
|
|
```bash
|
|
./scripts/create_german_stubs.sh
|
|
```
|
|
|
|
### Images not showing
|
|
1. Check image is in same folder as markdown file
|
|
2. Use `./` prefix for relative images in gallery
|
|
3. Ensure proper JSON formatting in gallery shortcode
|
|
|
|
### Styles not applying
|
|
1. Check `config.toml` extra.styles array includes your CSS
|
|
2. Ensure CSS is in `static/css/` not `sass/`
|
|
3. Rebuild with `zola build`
|
|
4. Clear browser cache
|
|
|
|
## Key Files Reference
|
|
|
|
| File/Directory | Purpose | Edit? |
|
|
|---------------|---------|-------|
|
|
| `config.toml` | Main configuration | ✅ Yes |
|
|
| `content/` | All markdown content | ✅ Yes |
|
|
| `templates/` | Custom template overrides | ✅ Yes |
|
|
| `sass/` | Custom SCSS | ✅ Yes |
|
|
| `static/` | Static assets | ✅ Yes |
|
|
| `themes/duckquill/` | Base theme | ❌ No - override instead |
|
|
| `public/` | Generated output | 🤖 Auto-generated, but version controlled |
|
|
| `i18n/de.toml` | German UI translations | ✅ Yes |
|
|
| `scripts/*.sh` | Automation scripts | ✅ Yes |
|
|
|
|
## Integration Points
|
|
|
|
- **Zola CLI**: All builds use Zola v0.19+
|
|
- **Theme**: Duckquill ([docs](https://duckquill.daudix.one))
|
|
- **Version Control**: Self-hosted Forgejo at https://forgejo.petau.net/aron/awebsite
|
|
- **Hosting**: Static files served from `public/` directory
|
|
- **Search**: Fuse.js with index built by Zola
|
|
- **Math**: KaTeX for equations
|
|
- **Diagrams**: Mermaid.js via custom shortcode
|
|
- **Icons**: FontAwesome (loaded by theme)
|
|
|
|
## Notes for AI Agents
|
|
|
|
1. **Always create bilingual content** - Every `.md` needs a `.de.md`
|
|
2. **Never modify theme files directly** - Use overrides in `templates/` or `sass/`
|
|
3. **Version control `public/`** - Unlike typical Zola sites, this project commits build output
|
|
4. **No external dependencies** - Don't add CDN scripts (Adobe, etc.) - use local files
|
|
5. **Test before committing** - Run `./scripts/test_site.sh`
|
|
6. **Respect existing structure** - Projects in date-prefixed folders, pages in `pages/`
|
|
7. **Use shortcodes** - Gallery, timeline, skills, mermaid for rich content
|
|
8. **Accessibility matters** - Always include alt text, proper heading hierarchy
|
|
9. **Check frontmatter** - Required fields: title, authors, date, description
|
|
|
|
---
|
|
|
|
For detailed theme documentation, see `themes/duckquill/README.md`
|
|
- Static assets: `static/`, `public/`
|
|
- Custom shortcodes: `templates/shortcodes/`
|
|
|
|
---
|
|
For questions or unclear conventions, check theme docs or ask for clarification.
|