Quarkus Forge is a keyboard-first terminal UI (TUI) and headless CLI for generating and scaffolding Quarkus projects. It acts as a fast, offline-capable alternative to quarkus create, deeply integrated with code.quarkus.io's remote metadata but built for terminal power users.
- Keyboard-First TUI: Zero-mouse, Vim-like bindings for navigating catalogs, toggling extensions, and validating inputs. Fuzzy search highlighting, chip-style selected extensions, Tamboui selector/input widgets with visible caret, and animated progress feedback.
- Speed & Caching: Background loading and local snapshot caching mean you don't wait for the network to start configuring your project.
- Headless & CI-Ready: Powerful non-interactive modes for generating applications identically across local environments and CI pipelines.
- Deterministic State: Supports
Forgefilewith an optionallockedsection for exact reproduction of generated applications, much like standard dependency managers. - Customizable: Theming via
.tcssfiles, IDE auto-detection withQUARKUS_FORGE_IDE_COMMANDoverride, post-generation hooks. - Workflow Enhancers: Post-generation handoffs let you open in your auto-detected IDE, drop into a shell, or publish to GitHub β all from the keyboard.
| Feature | Quarkus Forge | quarkus create |
|---|---|---|
| Offline / no-internet | β snapshot cache fallback | β requires network |
| Keyboard-first TUI | β full Vim-style navigation | β wizard prompts |
| Deterministic replay | β
Forgefile + --lock |
β |
| CI headless jar | β no TUI deps (~40% smaller) | |
| Fuzzy extension search | β | β |
| Session persistence | β remembers last config | β |
| Theming | β
.tcss override |
β |
| Post-gen IDE open | β auto-detects IDEs | β |
| Quarkus CLI required | β plain JRE / JBang | β |
| TUI (interactive) | Headless (generate) |
|
|---|---|---|
| Best for | Local development, exploration | CI pipelines, scripting, containers |
| Jar | quarkus-forge.jar |
quarkus-forge-headless.jar |
| Interaction | Keyboard-driven UI | Flags only, non-interactive |
| Extension search | Live fuzzy search | --extension / --preset flags |
| Forgefile | Export via post-gen menu | --from, --save-as, --lock |
| Post-gen hooks | IDE open, GitHub, shell handoff | n/a |
| JVM flag needed | --enable-native-access=ALL-UNNAMED |
none |
| Key | Action |
|---|---|
? |
Help overlay |
Ctrl+P |
Command palette |
/ or Ctrl+F |
Focus extension search |
Space |
Toggle extension |
Enter / Alt+G |
Generate project |
Ctrl+R |
Reload catalog |
Ctrl+K |
Toggle favorites-only |
Alt+S |
Toggle selected-only view |
v |
Cycle category filter |
c |
Toggle current category |
C |
Open all categories |
x |
Clear selected extensions |
Esc |
Unwind filter context / exit |
Ctrl+C |
Quit immediately |
Full keybindings: docs/modules/ROOT/pages/ui/keybindings.adoc
- Java 25+
- Maven 3.9+
./mvnw clean package -DskipTestsOutput: target/quarkus-forge.jar
./mvnw clean package -PheadlessOutput: target/quarkus-forge-headless.jar β ~40% smaller, no TUI or terminal dependencies.
./mvnw clean package -PnativeOutput: target/quarkus-forge β standalone binary, no JVM required at runtime.
Note: Native image requires GraalVM or a compatible toolchain. Set
GRAALVM_HOMEbefore building.
Run directly from the JBang catalog:
jbang quarkus-forge@ayagmarHeadless-only (no TUI dependencies, ideal for CI):
jbang quarkus-forge-headless@ayagmar generate \
--group-id org.acme \
--artifact-id demo \
--build-tool maven \
--java-version 25Install as a persistent local command:
jbang app install --name quarkus-forge quarkus-forge@ayagmar
quarkus-forgejava --enable-native-access=ALL-UNNAMED -jar target/quarkus-forge.jarNote: The
--enable-native-access=ALL-UNNAMEDflag suppresses Panama FFM warnings from the TamboUI terminal backend.
Hit ? for help, Ctrl+P for the command palette, or / to jump to extension search.
java -jar target/quarkus-forge-headless.jar generate \
--group-id org.acme \
--artifact-id demo \
--build-tool maven \
--java-version 25 \
--preset web \
--extension io.quarkus:quarkus-smallrye-healthThe full jar (
quarkus-forge.jar) also supports thegeneratesubcommand. The headless-only jar is preferred for CI/containers β no TUI or terminal dependencies.
java -jar target/quarkus-forge-headless.jar generate \
--group-id org.acme \
--artifact-id demo \
--preset web \
--extension io.quarkus:quarkus-smallrye-health \
--dry-runjava -jar target/quarkus-forge.jar \
--post-generate-hook="git init && git add . && git commit -m 'Initial commit'"# Generate from a Forgefile template
java -jar target/quarkus-forge-headless.jar generate --from Forgefile
# Generate and write/update the locked section
java -jar target/quarkus-forge-headless.jar generate --from Forgefile --lock
# Verify no drift against locked section
java -jar target/quarkus-forge-headless.jar generate --from Forgefile --lock-check --dry-run
# Save current configuration as a shareable template
java -jar target/quarkus-forge-headless.jar generate --save-as my-template.json --lock \
--group-id com.acme --artifact-id my-service -e io.quarkus:quarkus-restCreate a .tcss file with semantic color tokens (one token = value per line):
base = #1e1e2e
text = #cdd6f4
accent = #f38ba8
focus = #89b4fa
muted = #6c7086Apply via environment variable or system property:
export QUARKUS_FORGE_THEME=/path/to/my-theme.tcss
# or
java -Dquarkus.forge.theme=/path/to/my-theme.tcss -jar target/quarkus-forge.jarAfter generating a project, Quarkus Forge auto-detects installed IDEs (IntelliJ IDEA, VS Code, Eclipse, Cursor, Zed, Neovim) and shows one menu entry per detected IDE.
To override auto-detection, set QUARKUS_FORGE_IDE_COMMAND:
export QUARKUS_FORGE_IDE_COMMAND="idea ." # Force IntelliJ
export QUARKUS_FORGE_IDE_COMMAND="code-insiders ." # VS Code Insiders- Machine-local app state:
~/.quarkus-forge/catalog-snapshot.jsonβ catalog cache/snapshot (offline fallback)preferences.jsonβ user preferences (restored on next launch)favorites.jsonβ favorite extensionsrecipes/β reusable Forge recipes
- Project/workflow files:
Forgefileβ shareable project template with optionallockedsection for CI reproducibility
Forgefile path resolution:
--from <name>: uses local file if found; otherwise resolves~/.quarkus-forge/recipes/<name>.--save-as <name>: writes to~/.quarkus-forge/recipes/<name>when<name>is just a filename.
The codebase is organized into focused modules that follow SOLID principles and separate concerns cleanly.
QuarkusApiClientβ Async HTTP client with retry/backoff, implementsAutoCloseablefor resource safety. Responsible only for transport orchestration.ApiPayloadParserβ Stateless JSON deserialization for all API payloads (extensions, metadata, streams, presets, OpenAPI).JsonFieldReaderβ Shared JSON field reading helpers used across all store and parser classes (DRY).CatalogSnapshotCacheβ Local catalog snapshot persistence and freshness management.
ProjectRequest/ProjectRequestValidatorβ Immutable project configuration with validation rules.MetadataCompatibilityContextβ Enforces metadata-driven compatibility constraints (build tool β Java version).CliPrefillMapperβ Maps CLI options to validated project requests.
CoreTuiControllerβ TUI orchestration shell delegating transitions to reducer/effects and rendering from immutable state snapshots.CoreUiReducerβ Pure reducer for migrated UI intents and effects.UiStateSnapshotMapperβ Builds immutableUiStatesnapshots from controller-managed state slices.OverlayRendererβ Stateless overlay rendering (command palette, help, progress, post-generation menus).MetadataSelectorManagerβ Metadata selector state (platform stream, build tool, Java version cycling and label generation).UiTextConstantsβ UI text content (help lines, splash art, action labels).ExtensionCatalogStateβ Extension catalog search, filtering, favorites, presets, and category navigation.BodyPanelRenderer/FooterLinesComposerβ Layout rendering helpers.
QuarkusForgeCliβ Picocli command entry point for TUI mode, runtime configuration, and startup metadata resolution.HeadlessCliβ Lightweight entry point for headless/CI mode (no TUI or terminal dependencies).HeadlessGenerationServiceβ Decoupled headless generation engine for CI/scripting, withAsyncFailureHandlerfor consistent error handling.ExitCodesβ Central exit code constants shared by both entry points.PostTuiActionExecutorβ Post-generation shell actions (IDE open, GitHub publish, terminal handoff).IdeDetectorβ Cross-platform IDE auto-detection (macOS, Linux, Windows).ForgefileStoreβ Forgefile persistence (with optional locked section).
SafeZipExtractorβ Hardened ZIP extraction with Zip-Bomb and Zip-Slip protections.ProjectArchiveServiceβ Orchestrates download, extraction, and progress reporting.
For a complete overview of the internal design, see the Architecture & Internals documentation.
Full documentation is available at ayagmar.github.io/quarkus-forge.
Source pages (AsciiDoc):
- Getting Started
- TUI Usage
- Keybindings
- Headless CLI
- Forge Files & State
- Theming
- Architecture
- Troubleshooting
Antora docs source: docs/ Β· Site build scripts: site/ Β· Local site guide: site/README.md
sdk env install # install Java 25 via SDKMAN! (.sdkmanrc)
just verify # format-check + headless compile + all tests
just format # auto-formatOr without just: ./mvnw clean verify and ./mvnw spotless:apply.
Coverage reports (after ./mvnw clean verify): target/site/jacoco/index.html (HTML) and target/site/jacoco/jacoco.xml (XML).
See CONTRIBUTING.md for full setup guide, code style, testing conventions, and commit format. PRs welcome.
