Roq 2.1.0

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-layout support

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-layout key 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