Complete workflow examples for common tasks.
Create and Publish Blog Post
# 1. Create markdown file
cat > services/content/blog/my-post.md << 'EOF'
---
title: "My Article"
description: "Brief description for SEO"
author: "Author Name"
slug: "my-article"
keywords: "keyword1, keyword2"
kind: "article"
image: "/files/images/blog/featured.webp"
public: true
tags: ["topic"]
published_at: "2026-01-28"
updated_at: "2026-01-28"
---
# My Article
Content here...
EOF
{ "command": "infra jobs run content_publish" }
{ "command": "core content verify my-article --source blog" }
Add Custom CSS
# 1. Create CSS file
cat > storage/files/css/custom.css << 'EOF'
.my-component {
color: var(--text-primary);
padding: 1rem;
}
EOF
# 2. Register in extension.rs (add to required_assets)
# AssetDefinition::css(storage_css.join("custom.css"), "css/custom.css"),
{ "command": "infra jobs run copy_extension_assets" }
Reference in template: <link rel="stylesheet" href="/css/custom.css">
Add Custom JavaScript
# 1. Create JS file
cat > storage/files/js/custom.js << 'EOF'
document.addEventListener('DOMContentLoaded', () => {
console.log('Custom JS loaded');
});
EOF
# 2. Register in extension.rs (add to required_assets)
# AssetDefinition::js(storage_js.join("custom.js"), "js/custom.js"),
{ "command": "infra jobs run copy_extension_assets" }
Reference in template: <script src="/js/custom.js" defer></script>
Update Homepage
Edit services/web/config/homepage.yaml for homepage data, then:
{ "command": "infra jobs run content_publish" }
Quick Content Refresh (No Prerender)
For quick content updates without full prerendering:
{ "command": "infra jobs run publish_pipeline" }
Quick Reference
| Recipe | Key Command |
|---|---|
| Full publish | infra jobs run content_publish |
| Quick publish (no prerender) | infra jobs run publish_pipeline |
| Add CSS/JS | infra jobs run copy_extension_assets |
| Ingest content only | infra jobs run blog_content_ingestion |
| Index images | infra jobs run file_ingestion |