fddl Features: Shortcodes, Plugins, and More
Dec 25, 2024
fddl Features and Capabilities
fddl packs a surprising amount of functionality into a Swift-based static site generator; these features include shortcodes, plugins, the dev server, and the template system. A custom markdown processor (SwiftMark) is also included.
Shortcodes: Dynamic Content in Static Sites
Shortcodes let you embed rich content without writing HTML. fddl supports both modern and retro shortcodes. Think geocities, gopher, & gemini (not the AI)
Modern Shortcodes
Modern shortcodes are written in markdown and should be processed by SwiftMark. Sometimes they are simply going to be parsed as markdown, other times they are going to be processed as HTML, depending on the situation.
YouTube Embeds
Embed videos with a simple shortcode:
Alert Boxes
Create styled alert boxes for different message types:
fddl has a complete plugin system!
Your site was generated successfully! 🎉
Always backup your content before major changes.
Images with Captions
Retro GeoCities Shortcodes
For those who miss the 90s web, fddl includes nostalgic effects:
🌟 UNDER CONSTRUCTION 🌟
Welcome to my homepage!
Rainbow Text is BACK!
These aren’t just for fun—they demonstrate fddl’s flexible shortcode system that you can extend with your own custom shortcodes.
Plugin System
fddl’s plugin architecture allows you to extend functionality without modifying core code.
Built-in Plugins
Sitemap Generation
Automatically creates sitemap.xml for SEO:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://yoursite.com/</loc>
<lastmod>2024-12-30</lastmod>
</url>
</urlset>
RSS Feed
Generates an RSS 2.0 feed at /feed.xml for blog posts:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Your Blog</title>
<item>
<title>Latest Post</title>
<link>https://yoursite.com/blog/latest-post.html</link>
</item>
</channel>
</rss>
Search Index
Builds a searchable JSON index of all content:
{
"pages": [
{
"title": "Page Title",
"url": "/page.html",
"content": "Searchable content...",
"tags": ["example"]
}
]
}
Reading Time Estimator
Automatically calculates reading time for each page based on word count.
Creating Custom Plugins
The plugin system is designed to be extensible. Future versions will include a documented API for creating your own plugins.
Template System
fddl uses a flexible YAML-based template system with multiple layouts.
Template Configuration
# template.yml
name: "default"
version: "1.0"
defaultLayout: "page"
outputs:
- html
Multiple Layouts
Different content types can use different layouts:
# html.yml
layouts:
page: "views/page.html"
post: "views/post.html"
index-list: "views/index-list.html"
Template Variables
Access page and site metadata in your templates:
<h1>fddl Features: Shortcodes, Plugins, and More</h1>
<div class="content">fddl Features and Capabilities
fddl packs a surprising amount of functionality into a Swift-based static site generator; these features include shortcodes, plugins, the dev server, and the template system. A custom markdown processor (SwiftMark) is also included.
Shortcodes: Dynamic Content in Static Sites
Shortcodes let you embed rich content without writing HTML. fddl supports both modern and retro shortcodes. Think geocities, gopher, & gemini (not the AI)
Modern Shortcodes
Modern shortcodes are written in markdown and should be processed by SwiftMark. Sometimes they are simply going to be parsed as markdown, other times they are going to be processed as HTML, depending on the situation.
YouTube Embeds
Embed videos with a simple shortcode:
{{\< youtube id="dQw4w9QgXcW" width="560" height="315" \>}}
Alert Boxes
Create styled alert boxes for different message types:
{{\< alert type="info" title="Did you know?" \>}}
fddl has a complete plugin system!
{{\< /alert \>}}
{{\< alert type="success" title="Build Status" \>}}
Your site was generated successfully! 🎉
{{\< /alert \>}}
{{\< alert type="warning" title="Remember" \>}}
Always backup your content before major changes.
{{\< /alert \>}}
Images with Captions
{{\< image src="/assets/images/photo.jpg" alt="Description" caption="A beautiful sunset" width="600" \>}}
Retro GeoCities Shortcodes
For those who miss the 90s web, fddl includes nostalgic effects:
{{\< blink \>}}🌟 UNDER CONSTRUCTION 🌟{{\< /blink \>}}
{{\< marquee direction="left" speed="normal" \>}}
Welcome to my homepage!
{{\< /marquee \>}}
{{\< rainbow \>}}Rainbow Text is BACK!{{\< /rainbow \>}}
{{\< counter style="digital" \>}}
These aren’t just for fun—they demonstrate fddl’s flexible shortcode system that you can extend with your own custom shortcodes.
Plugin System
fddl’s plugin architecture allows you to extend functionality without modifying core code.
Built-in Plugins
Sitemap Generation
Automatically creates sitemap.xml for SEO:
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://yoursite.com/</loc>
<lastmod>2024-12-30</lastmod>
</url>
</urlset>
RSS Feed
Generates an RSS 2.0 feed at /feed.xml for blog posts:
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Your Blog</title>
<item>
<title>Latest Post</title>
<link>https://yoursite.com/blog/latest-post.html</link>
</item>
</channel>
</rss>
Search Index
Builds a searchable JSON index of all content:
{
"pages": [
{
"title": "Page Title",
"url": "/page.html",
"content": "Searchable content...",
"tags": ["example"]
}
]
}
Reading Time Estimator
Automatically calculates reading time for each page based on word count.
Creating Custom Plugins
The plugin system is designed to be extensible. Future versions will include a documented API for creating your own plugins.
Template System
fddl uses a flexible YAML-based template system with multiple layouts.
Template Configuration
# template.yml
name: "default"
version: "1.0"
defaultLayout: "page"
outputs:
- html
Multiple Layouts
Different content types can use different layouts:
# html.yml
layouts:
page: "views/page.html"
post: "views/post.html"
index-list: "views/index-list.html"
Template Variables
Access page and site metadata in your templates:
<h1>{{page.title}}</h1>
<div class="content">{{page.content}}</div>
<p>Generated on {{site.generatedDate}}</p>
<p>Build #{{site.buildID}}</p>
Available variables include:
{{page.title}} - Page title from frontmatter
{{page.content}} - Rendered HTML content
{{page.description}} - Page description
{{page.date}} - Publication date
{{site.name}} - Site name
{{site.buildID}} - Incremental build number
{{site.generatedDate}} - Generation timestamp
Development Server
fddl includes a development server with hot reload capabilities (powered by SwiftNIO):
fddl serve --port 8080 --open
Features:
🔥 Hot Reload: Changes appear instantly via WebSocket
👀 File Watching: Automatically detects content changes
🚀 Instant Rebuilds: Fast regeneration on save
🌐 Local Preview: Test before deploying
Syntax Highlighting
Code blocks are automatically highlighted using Splash:
struct Person {
let name: String
var age: Int
func greet() {
print("Hello, my name is \(name)!")
}
}
Supports multiple languages including Swift, JavaScript, Python, Bash, and more.
Asset Management
fddl automatically handles static assets:
templates/default/assets/
├── css/
│ └── theme.css
├── javascript/
│ └── theme.js
└── images/
└── logo.png
All assets are copied to the output directory, maintaining the folder structure.
Build Tracking
Every site generation increments a build number, stored in .fddl-build:
Build #42
This helps track versions and can be displayed in your site footer.
Flexible Navigation
Navigation is simple HTML in your templates—no complex configuration:
<nav>
<a href="/">Home</a>
<a href="/blog/">Blog</a>
<a href="/about.html">About</a>
<a href="/projects/">Projects</a>
</nav>
Different layouts can have different navigation menus.
What’s Coming Next?
Future features on the roadmap:
API JSON output for headless CMS usage
Custom 404 error pages
macOS Services menu integration
Watch mode improvements
Theme marketplace
Plugin documentation and API
Try It Yourself
The best way to understand fddl’s capabilities is to use it. Check out the features demo page to see these features in action, or dive into the source code to see how they’re implemented.
“Features are only as good as their implementation.” — fddl’s guiding principle
Built with fddl - Where modern meets retro, and Swift meets markdown.
</div>
<p>Generated on Jan 17, 2026 at 10:42 PM</p>
<p>Build #09A486B3-9D5B-4E8E-8C24-61507010C9C9</p>
Available variables include:
fddl Features: Shortcodes, Plugins, and More- Page title from frontmatter- Rendered HTML contentfddl Features and Capabilities
fddl packs a surprising amount of functionality into a Swift-based static site generator; these features include shortcodes, plugins, the dev server, and the template system. A custom markdown processor (SwiftMark) is also included.
Shortcodes: Dynamic Content in Static Sites
Shortcodes let you embed rich content without writing HTML. fddl supports both modern and retro shortcodes. Think geocities, gopher, & gemini (not the AI)
Modern Shortcodes
Modern shortcodes are written in markdown and should be processed by SwiftMark. Sometimes they are simply going to be parsed as markdown, other times they are going to be processed as HTML, depending on the situation.
YouTube Embeds
Embed videos with a simple shortcode:
{{\< youtube id="dQw4w9QgXcW" width="560" height="315" \>}}Alert Boxes
Create styled alert boxes for different message types:
{{\< alert type="info" title="Did you know?" \>}} fddl has a complete plugin system! {{\< /alert \>}} {{\< alert type="success" title="Build Status" \>}} Your site was generated successfully! 🎉 {{\< /alert \>}} {{\< alert type="warning" title="Remember" \>}} Always backup your content before major changes. {{\< /alert \>}}Images with Captions
{{\< image src="/assets/images/photo.jpg" alt="Description" caption="A beautiful sunset" width="600" \>}}Retro GeoCities Shortcodes
For those who miss the 90s web, fddl includes nostalgic effects:
{{\< blink \>}}🌟 UNDER CONSTRUCTION 🌟{{\< /blink \>}} {{\< marquee direction="left" speed="normal" \>}} Welcome to my homepage! {{\< /marquee \>}} {{\< rainbow \>}}Rainbow Text is BACK!{{\< /rainbow \>}} {{\< counter style="digital" \>}}These aren’t just for fun—they demonstrate fddl’s flexible shortcode system that you can extend with your own custom shortcodes.
Plugin System
fddl’s plugin architecture allows you to extend functionality without modifying core code.
Built-in Plugins
Sitemap Generation
Automatically creates
sitemap.xmlfor SEO:<?xml version="1.0" encoding="UTF-8"?> <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> <url> <loc>https://yoursite.com/</loc> <lastmod>2024-12-30</lastmod> </url> </urlset>RSS Feed
Generates an RSS 2.0 feed at
/feed.xmlfor blog posts:<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0"> <channel> <title>Your Blog</title> <item> <title>Latest Post</title> <link>https://yoursite.com/blog/latest-post.html</link> </item> </channel> </rss>Search Index
Builds a searchable JSON index of all content:
{ "pages": [ { "title": "Page Title", "url": "/page.html", "content": "Searchable content...", "tags": ["example"] } ] }Reading Time Estimator
Automatically calculates reading time for each page based on word count.
Creating Custom Plugins
The plugin system is designed to be extensible. Future versions will include a documented API for creating your own plugins.
Template System
fddl uses a flexible YAML-based template system with multiple layouts.
Template Configuration
# template.yml name: "default" version: "1.0" defaultLayout: "page" outputs: - htmlMultiple Layouts
Different content types can use different layouts:
# html.yml layouts: page: "views/page.html" post: "views/post.html" index-list: "views/index-list.html"Template Variables
Access page and site metadata in your templates:
<h1>{{page.title}}</h1> <div class="content">{{page.content}}</div> <p>Generated on {{site.generatedDate}}</p> <p>Build #{{site.buildID}}</p>Available variables include:
{{page.title}}- Page title from frontmatter{{page.content}}- Rendered HTML content{{page.description}}- Page description{{page.date}}- Publication date{{site.name}}- Site name{{site.buildID}}- Incremental build number{{site.generatedDate}}- Generation timestamp
Development Server
fddl includes a development server with hot reload capabilities (powered by SwiftNIO):
fddl serve --port 8080 --openFeatures:
🔥 Hot Reload: Changes appear instantly via WebSocket
👀 File Watching: Automatically detects content changes
🚀 Instant Rebuilds: Fast regeneration on save
🌐 Local Preview: Test before deploying
Syntax Highlighting
Code blocks are automatically highlighted using Splash:
struct Person { let name: String var age: Int func greet() { print("Hello, my name is \(name)!") } }Supports multiple languages including Swift, JavaScript, Python, Bash, and more.
Asset Management
fddl automatically handles static assets:
templates/default/assets/ ├── css/ │ └── theme.css ├── javascript/ │ └── theme.js └── images/ └── logo.pngAll assets are copied to the output directory, maintaining the folder structure.
Build Tracking
Every site generation increments a build number, stored in
.fddl-build:Build #42This helps track versions and can be displayed in your site footer.
Flexible Navigation
Navigation is simple HTML in your templates—no complex configuration:
<nav> <a href="/">Home</a> <a href="/blog/">Blog</a> <a href="/about.html">About</a> <a href="/projects/">Projects</a> </nav>Different layouts can have different navigation menus.
What’s Coming Next?
Future features on the roadmap:
API JSON output for headless CMS usage
Custom 404 error pages
macOS Services menu integration
Watch mode improvements
Theme marketplace
Plugin documentation and API
Try It Yourself
The best way to understand fddl’s capabilities is to use it. Check out the features demo page to see these features in action, or dive into the source code to see how they’re implemented.
“Features are only as good as their implementation.” — fddl’s guiding principle
Built with fddl - Where modern meets retro, and Swift meets markdown.
A comprehensive look at fddl's features including shortcodes, plugins, the dev server, and the template system.- Page descriptionDec 25, 2024- Publication datefddl- Site name09A486B3-9D5B-4E8E-8C24-61507010C9C9- Incremental build numberJan 17, 2026 at 10:42 PM- Generation timestamp
Development Server
fddl includes a development server with hot reload capabilities (powered by SwiftNIO):
fddl serve --port 8080 --open
Features:
🔥 Hot Reload: Changes appear instantly via WebSocket
👀 File Watching: Automatically detects content changes
🚀 Instant Rebuilds: Fast regeneration on save
🌐 Local Preview: Test before deploying
Syntax Highlighting
Code blocks are automatically highlighted using Splash:
struct Person {
let name: String
var age: Int
func greet() {
print("Hello, my name is \(name)!")
}
}
Supports multiple languages including Swift, JavaScript, Python, Bash, and more.
Asset Management
fddl automatically handles static assets:
templates/default/assets/
├── css/
│ └── theme.css
├── javascript/
│ └── theme.js
└── images/
└── logo.png
All assets are copied to the output directory, maintaining the folder structure.
Build Tracking
Every site generation increments a build number, stored in .fddl-build:
Build #42
This helps track versions and can be displayed in your site footer.
Flexible Navigation
Navigation is simple HTML in your templates—no complex configuration:
<nav>
<a href="/">Home</a>
<a href="/blog/">Blog</a>
<a href="/about.html">About</a>
<a href="/projects/">Projects</a>
</nav>
Different layouts can have different navigation menus.
What’s Coming Next?
Future features on the roadmap:
API JSON output for headless CMS usage
Custom 404 error pages
macOS Services menu integration
Watch mode improvements
Theme marketplace
Plugin documentation and API
Try It Yourself
The best way to understand fddl’s capabilities is to use it. Check out the features demo page to see these features in action, or dive into the source code to see how they’re implemented.
“Features are only as good as their implementation.” — fddl’s guiding principle
Built with fddl - Where modern meets retro, and Swift meets markdown.