New app checklist
Each group links to the page with the rules and the Editora code to copy. Everything here is a MUST unless it says SHOULD.
Start from the template. adl-desktop-app-template is a GitHub template repository that already
ticks every MUST on this list: a small runnable app with its tests, CI and release workflows and every repository
document. Click Use this template, then run scripts/rename.sh <AppName> <package>.
Platform
Section titled “Platform”- JDK 25 or newer (
release25 is the floor) and JavaFX 27 or newer - One JPMS module,
com.<app> - Maven Wrapper committed (
mvnw,mvnw.cmd,.mvn/wrapper/) - AtlantaFX light and dark themes, following the system by default
- Inter bundled and attached to every scene and dialog SHOULD
Code quality
Section titled “Code quality”- The version comes only from
pom.xml(filteredbuild-info.properties); lists that repeat a fact have a drift test - Rules live in pure, unit-tested helpers; UI classes stay thin
- A capture hook or headless screenshot drives the real window for UI checks
- Every package
@NullMarked; NullAway on Error Prone fails the build - Spotless with Palantir Java Format
- JUnit 5 and headless FX tests (
-Dglass.platform=Headless), FX tests taggedfx - JaCoCo check at 0.90 lines and 0.90 methods
Performance
Section titled “Performance”- No I/O, process, parsing or waiting on the JavaFX application thread; results return through
Platform.runLater - Background results applied under a generation guard; named daemon threads
- Redraws coalesced to one per pulse; streams delivered in batches
- Logs, histories and caches bounded; large inputs guarded
- Only the first frame built before it paints; update check and extras deferred
Keyboard and commands
Section titled “Keyboard and commands”- One
CommandRegistry: every action is a command with an id - Command Palette as an in-scene overlay, not a
Popup - Emacs and CUA keymaps at least, with user overrides on top
Settings
Section titled “Settings”- Settings window with a page sidebar, search and live apply
- A palette command for every setting
- Versioned config in
~/.<app>, with migrations and downgrade backups - Export and import of the config folder
- Settings sync through a Git/GitHub repository SHOULD
Diagnostics
Section titled “Diagnostics”- Status-bar echo and Message Log
- Debug Log with a session file, and an uncaught exception handler
- Daily update check with an off switch; About shows versions and update status
- Report a Problem (redacted, prefilled GitHub issue) and
--report
Command line and languages
Section titled “Command line and languages”Command line · Internationalization
-
--help,--version,--config-dir,--dev - Single instance per config folder
- At least six message catalogs, with a parity test
Repository
Section titled “Repository”-
README.mdwith the badge row and a light/dark hero screenshot -
CHANGELOG.mdin Keep a Changelog format - MIT
LICENSE, andNOTICEwith every third-party licence -
AGENTS.md, with a one-lineCLAUDE.mdpointing to it -
CONTRIBUTING.md,docs/andbranding/ -
.github/ISSUE_TEMPLATE/bug_report.yml
Packaging and signing
Section titled “Packaging and signing”Packaging, signing and release
- jpackage installers through JReleaser: Linux x64 and arm64, macOS arm64 and x64, Windows x64
- macOS
.dmgsigned with Developer ID, notarized and stapled - Linux downloads with
.ascsignatures from the shared release key - Build provenance attestations for every download
- Windows
.msiAuthenticode, once the certificate is chosen SHOULD - Homebrew cask in
adriandeleon/homebrew-tapand a winget packageAdrianDeLeon.<App>SHOULD
CI/CD (GitHub Actions)
Section titled “CI/CD (GitHub Actions)”-
ci.ymlon every push and pull request: Format and Build & Test, both required checks formaster -
full-tests.ymlon Linux, macOS and Windows: daily, on afull-cilabel, before every release SHOULD -
release.ymlon av*tag that matches the pom, with aworkflow_dispatchdry run - Every third-party action pinned to a commit SHA
- Dependabot for
github-actionsandmaven -
permissions: contents: readby default; write only in publishing jobs -
timeout-minuteson every job; superseded pull-request runs cancelled - Test and coverage reports uploaded; coverage totals in the job summary
- Signing skipped without secrets, but a tag without them fails
- A smoke launch of the packaged app on each OS before release
Pauta 1.1.0 · · Changelog