Roq 2.1.0
Roq 2.1 brings a standalone CLI, LLMs.txt generation, dynamic pages from data, custom error pages, and much more.
roq-2.1 (4 Parts Series)
Hello fellow Roqers,
Roq 2.1 is officially out, and it's packed with features that make content creation smoother, the developer experience richer, and the tooling more powerful than ever.
This release is big enough that we're covering it as a series of posts. We already published posts about the built-in editor and GFM alert blocks, and this post gives you the full picture of everything else that landed.
The highlights
Here's what's new in Roq 2.1:
- Built-in Content Editor with rich text, Markdown support, and image upload
- GFM Alert Blocks (NOTE, TIP, WARNING, CAUTION, IMPORTANT) with icons and themed colors
- Standalone Roq CLI powered by Quarkus Picocli
- LLMs.txt generation for AI discoverability
- Custom error pages with source info and hints in dev mode
- Default theme with TailwindCSS and zero configuration
- Raclette link checker integration in roq-testing
- RSS content modes (full content or word-limited abstracts)
- Dynamic pages from data collections
- Qute alternative expression syntax support
- Simplified layout resolution with
theme-layoutsupport
The Roq CLI
Roq now ships as a standalone CLI tool, no Maven or Gradle knowledge required:
roq create my-blog
cd my-blog
roq
That's it. The CLI handles project creation, dev mode, static generation, plugin management, and updates. It's built as a Quarkus Picocli application and distributed via JBang.
LLMs.txt
Roq can auto-generate /llms.txt and /llms-full.txt following the llms.txt specification. AI systems like ChatGPT, Claude, and Perplexity use these files to understand your site's structure and content.
Dynamic pages from data
You can now generate pages dynamically from data collections, perfect for catalogs, team pages, or any content driven by structured data files.
Developer experience
Dev mode got a lot of love in this release:
- Custom error pages with source file location, detailed hints, and available alternatives when something goes wrong
- Centralized filesystem watcher for reliable live reload
- Simplified layout resolution with the new
theme-layoutkey for explicit theme layout targeting
What's coming next in this series
Upcoming posts will dive deeper into:
- The Roq CLI
- LLMs.txt and AI discoverability
- Dynamic pages from data
- The new default theme and TailwindCSS integration
Ready to try it? Check out the Getting Started guide, or if you're already on Roq, see how to update.
Stay tuned and happy Roqing!
Migration guide
| Applies to | Before | After | Action |
|---|---|---|---|
| All users | io.quarkiverse.roq.util.PathUtils |
io.quarkiverse.tools.stringpaths.StringPaths |
Update import and adapt usage |
| All users | layout: :theme/foo |
layout: foo or theme-layout: foo |
Update layout references in front matter |
| All users | Layouts in templates/layouts/{theme-name}/ |
templates/layouts/ |
Move custom layouts |
| All users | page.date returns current date for all pages |
Returns null for non-collection pages |
Wrap with {#if page.date}...{/if} |
| Theme users | index.html layout for blog listing |
New blog.html layout (with pagination support) |
If using layout: blog without pagination (paginate: false), add paginate: posts; if you have a custom blog.html override, use {#if page.paginator and page.paginator.isFirst} instead of {#if page.paginator.isFirst} |
| Theme users | SCSS (app.scss) |
CSS with TailwindCSS | Migrate custom styles |
| Theme users | Custom SCSS/CSS overrides | Theme CSS completely rewritten | Review your overrides, some may be unnecessary now |
| Theme users | Custom color variables | Three customizable palettes: accent, pop, neutral |
See Color Palettes |
| Theme users | No dark mode | Built-in with dark: variants |
Good to know |
| Theme users | {#author-card ...} (kebab-case) |
{#roq/authorCard ...} (namespaced camelCase) |
Update tag references |
| Plugin authors | RoqFrontMatterScanProcessor |
Step-based build items | Update plugin code |
| Plugin authors | deployment.scan.* |
deployment.items.scan.* (same for data, publish) |
Update imports |
| Plugin authors | Generated templates in target/roq-templates/full/ |
Now in target/roq-templates/content/ |
Update scripts or workflows referencing this path |
| Plugin authors | TemplateSource.generatedQuteContentTemplateId() |
Removed, use {#fragment RoqPageContent} |
Update plugin code |
| Plugin authors | PAGINATE_KEY in scan package |
RoqFrontMatterKeys (runtime) |
Update imports |
| Plugin authors | io.quarkiverse.roq.frontmatter.runtime.exception.RoqException |
io.quarkiverse.roq.exception.RoqException (in roq-common) |
Update imports |
| Plugin authors | RoqException.Builder.source(TemplateSource) |
RoqException.Builder.sourceInfo(new RoqSourceInfo(...)) |
Update builder calls |
| Plugin authors | roq-data exceptions extend RuntimeException |
All extend RoqException with builder pattern |
Update exception construction |