Repository navigation
Releases
v1.11.0
A dependency-refresh release on top of 1.10.0 that also reworks how make versions reports dependency updates. There are no DSL, content, or runtime source changes. Existing Content.kt definitions compile and run unchanged, and the build still targets JDK 25. The minor-version bump reflects the readingbat-core minor bump, the core-utils major-version jump, and the new make versions-all target.
Highlights
make versionslists only what is behind. A customoutputFormatteronDependencyUpdatesTask(inconfigureVersions()inbuild.gradle.kts) replaces the plugin's report. It prints one line per outdated dependency (group:name current -> latest), a?line for each dependency that could not be checked, a line for a newer Gradle release, andAll dependencies are up to datewhen nothing is behind. The existing pre-release filter is unchanged.- New
make versions-alltarget. It runs the same task with--output-formatter=plainto get the plugin's full report, which also lists every up-to-date dependency. Only this target writesbuild/dependencyUpdates/report.txtnow. - readingbat-core / readingbat-kotest 3.4.0 → 3.5.0. A minor bump; no call-site changes were required.
correctAnswers()is still a suspend function, soContentTests.ktkeeps itsrunBlocking { … }wrapper. - core-utils 3.2.2 → 5.1.1. This is two major versions.
Content.kt(FileSystemSource,GitHubRepo,OwnerType) andContentTests.kt(toDoubleQuoted) compile unchanged. readingbat-core 3.5.0 itself moved to thecommon-utils5.1.1 line, so the whole runtime classpath agrees on 5.1.1 and no conflict resolution is involved. - Kotlin 2.4.10 → 2.4.21. A patch bump. The
-Xreturn-value-checker=checkcompiler flag oncompileKotlinstill reports nothing. - Gradle 9.7.1 → 9.8.1. The wrapper jar,
gradle-wrapper.properties,gradlew.bat, and thegradle-wrappercatalog key all moved together viamake upgrade-wrapper. The configuration cache still stores and reuses entries. - ben-manes versions plugin 0.64.0 → 0.66.0.
- Gradle daemon JVM args.
gradle.propertiesnow setsorg.gradle.jvmargsto give the Gradle and Kotlin daemons a 4 GB heap, write a heap dump onOutOfMemoryError, and use UTF-8 file encoding. - Docs refreshed.
CHANGELOG.mdandRELEASE_NOTES.mdgained 1.11.0 entries,llms.txtpicked up the new Gradle, readingbat-core, and core-utils versions and the new targets, andREADME.md/CLAUDE.mdnow documentmake versionsandmake versions-all.
Dependencies
| Library | Version |
|---|---|
| Kotlin | 2.4.21 |
| Ktor | 3.6.0 |
| Kotest | 6.2.5 |
| readingbat-core | 3.5.0 |
| core-utils | 5.1.1 |
| kotlin-logging | 8.0.4 |
| detekt | 2.0.0-alpha.6 |
| kotlinter | 5.7.0 |
| Gradle | 9.8.1 |
| JDK toolchain | 25 |
Unchanged from 1.10.0: Ktor, Kotest, kotlin-logging, detekt, kotlinter, and the JDK toolchain.
Upgrade Notes
- No source changes are required for forks that track this template. This release touches only
build.gradle.kts(thedependencyUpdatesformatter), theMakefile,gradle/libs.versions.toml,gradle/wrapper/*,gradlew.bat,gradle.properties, and the docs. - core-utils 5.1.1 removes or changes some public API, including
ScopeFunctionsKt,SingleAssignVar.ThreadSafeSingleAssignVar,MiscFuncs.waitForPortAvailable(which now returnsBoolean),toCreated(LocalDateTime), and theSecureObjectInputStream,NonNullableAtomicReferenceDelegate, andSingleSetAtomicReferenceDelegateconstructors. This template uses none of them. Forks that call core-utils directly beyond whatContent.ktuses should check their call sites against that list. - The new
org.gradle.jvmargsasks for a 4 GB daemon heap. On a machine with little memory, lower-Xmxingradle.properties. - Re-run
./gradlew --versionafter pulling so the new wrapper (9.8.1) downloads on first use. - Under Gradle 9.8.1 every build prints "Deprecated Gradle features were used in this build, making it incompatible with Gradle 10". The cause is detekt 2.0.0-alpha.6 calling
Configuration.setVisible(), which Gradle 9.8 deprecated and plans to remove in Gradle 11. It's harmless for now and should go away with a later detekt release. make versionsno longer writesbuild/dependencyUpdates/report.txt. Usemake versions-allif you rely on that file.- JDK 25 is still required, unchanged since 1.8.0.
Full Changelog: 1.10.0...1.11.0
v1.10.0
A dependency-refresh release on top of 1.9.1, plus cross-platform line-ending normalization. There are no DSL, content, or runtime source changes — existing Content.kt definitions compile and run unchanged, and the build still targets JDK 25. The minor-version bump tracks the minor bumps in Ktor and readingbat-core rather than any change in this repo's own API.
Highlights
- readingbat-core / readingbat-kotest 3.3.1 → 3.4.0. A minor bump; no call-site changes were required.
correctAnswers()remains a suspend function, as it has since 3.2.0, soContentTests.ktkeeps itsrunBlocking { … }wrapper. - Ktor 3.5.1 → 3.6.0. The catalog and readingbat-core 3.4.0 agree on this version —
runtimeClasspathresolvesio.ktor:ktor-server-coreto 3.6.0 with no conflict resolution in play. - Kotest 6.2.3 → 6.2.5. A patch bump; the
libs.bundles.testingbundle and the StringSpec/JUnit5 setup are unchanged. - Gradle 9.6.1 → 9.7.1. The wrapper jar,
gradle-wrapper.properties, and thegradle-wrappercatalog key all move together. The configuration cache continues to store and reuse entries. - Static-analysis and tooling bumps. detekt 2.0.0-alpha.5 → 2.0.0-alpha.6, Kotlinter 5.6.0 → 5.7.0, and the ben-manes versions plugin 0.57.0 → 0.64.0. Both linters re-run clean under the new versions, so no
.editorconfigchanges were needed and the repo still requires no detekt baseline. .gitattributesadded. Git now normalizes line endings per file type instead of relying on each contributor'score.autocrlfsetting:gradlewis pinned tolfso the launcher stays executable on Linux and macOS after a Windows checkout,*.battocrlf, and*.jar/*.pngare markedbinaryso Git stops attempting text diffs or EOL conversion on them — which also keepsgradle/wrapper/gradle-wrapper.jarintact across wrapper upgrades.- Docs refreshed.
CHANGELOG.mdandRELEASE_NOTES.mdgained 1.10.0 entries,llms.txtpicked up the new Gradle and readingbat-core versions plus the new file, andREADME.md/CLAUDE.mdnow document the.gitattributesconventions and that the Gradle version is driven by thegradle-wrappercatalog key viamake upgrade-wrapper.
Dependencies
| Library | Version |
|---|---|
| Kotlin | 2.4.10 |
| Ktor | 3.6.0 |
| Kotest | 6.2.5 |
| readingbat-core | 3.4.0 |
| core-utils | 3.2.2 |
| kotlin-logging | 8.0.4 |
| detekt | 2.0.0-alpha.6 |
| kotlinter | 5.7.0 |
| Gradle | 9.7.1 |
| JDK toolchain | 25 |
Unchanged from 1.9.1: Kotlin, core-utils, kotlin-logging, and the JDK toolchain.
Upgrade Notes
- No source changes are required for forks that track this template — this release touches only
gradle/libs.versions.toml,gradle/wrapper/*,gradle.properties,.gitattributes, and the docs. - Re-run
./gradlew --versionafter pulling to let the new wrapper (9.7.1) download on first use. Forks that track their own Gradle version should bump thegradle-wrapperkey ingradle/libs.versions.tomland runmake upgrade-wrapper, which drives./gradlew wrapperfrom that key. - Windows contributors may see a one-time line-ending renormalization the first time they check out with
.gitattributesin place.git add --renormalize .resolves any spurious whole-file diffs. - JDK 25 remains required, unchanged from 1.8.0.
- Deliberately not adopted in this release: Kotlin 2.4.20 and core-utils 3.2.3 / 4.1.0, all of which
./gradlew dependencyUpdatesreports as available.
Full Changelog: 1.9.1...1.10.0
v1.9.1
A patch release on top of 1.9.0: a dependency refresh, a build-plugin coordinate fix, and a CLAUDE.md trim. There are no DSL, content, or runtime source changes — existing Content.kt definitions compile and run unchanged, and the build still targets JDK 25.
Highlights
- readingbat-core / readingbat-kotest 3.3.0 → 3.3.1. A patch bump; no call-site changes were required.
correctAnswers()remains a suspend function, as it has since 3.2.0. - core-utils 3.2.1 → 3.2.2. A patch bump on the 3.x line adopted in 1.9.0. The template's four call sites —
FileSystemSource,GitHubRepo, andOwnerType.OrganizationinContent.kt, plustoDoubleQuotedinContentTests.kt— compile unchanged. - ben-manes versions plugin 0.54.0 → 0.57.0, with a coordinate move. The plugin's published ID changed from
com.github.ben-manes.versionstoio.github.ben-manes.versions;gradle/libs.versions.tomlnow points at the new ID. The catalog alias staysben-manes-versions, soalias(libs.plugins.ben.manes.versions)inbuild.gradle.ktsis untouched and./gradlew dependencyUpdates/make versionsbehave exactly as before. CLAUDE.mdtrimmed 89 → 31 lines. Removed the guidance a session can reconstruct from the repo itself — the build-command list (already surfaced by the self-documentingmake help), the architecture tour, the dependency inventory, and the step-by-step CI description. What stays is the material the code can't teach: theinitTestProperties()and suspend-correctAnswers()runtime gotchas, thegradle.properties/FAIL_ON_PROJECT_REPOS/ configuration-cache build constraints, the pre-push lint etiquette, and the DSL conventions.
Dependencies
| Library | Version |
|---|---|
| Kotlin | 2.4.10 |
| Ktor | 3.5.1 |
| Kotest | 6.2.3 |
| readingbat-core | 3.3.1 |
| core-utils | 3.2.2 |
| kotlin-logging | 8.0.4 |
| detekt | 2.0.0-alpha.5 |
| kotlinter | 5.6.0 |
| Gradle | 9.6.1 |
| JDK toolchain | 25 |
Upgrade Notes
- No source changes are required for forks that track this template — this release touches only
gradle/libs.versions.toml,gradle.properties,CLAUDE.md, and the release docs. - Forks that declare the ben-manes versions plugin themselves must update the coordinate from
com.github.ben-manes.versionstoio.github.ben-manes.versions. Forks that consume it through this repo's catalog alias need no change. - JDK 25 remains required, unchanged from 1.8.0.
Verification
./gradlew --rerun-tasks check— BUILD SUCCESSFUL; all threeContentTestsspecs pass (Test all challenges,Test with correct answers,Test individual challenges), 3 tests, 0 failures, 0 errors../gradlew buildFatJar— BUILD SUCCESSFUL; producesbuild/libs/server.jar../gradlew lintKotlin detekt— both checks run cleanly../gradlew dependencyUpdates— BUILD SUCCESSFUL under the new plugin coordinate, confirming the ID move resolves.build/libs/readingbat-template-1.9.1.jarconfirms thegradle.propertiesversion bump took effect.
Full Changelog: 1.9.0...1.9.1
v1.9.0
A dependency-refresh and CI release on top of 1.8.0. There are no DSL, content, or runtime source changes — existing Content.kt definitions compile and run unchanged, and the build still targets JDK 25.
Highlights
- GitHub Actions CI.
.github/workflows/ci.ymlruns on pushes and pull requests targetingmaster. It checks out the repo, installs Temurin JDK 25, sets up Gradle viagradle/actions/setup-gradle@v4, runs./gradlew --rerun-tasks check, then runs./gradlew lintKotlin detekt. Lint and static analysis are now enforced on every PR rather than by convention. - readingbat-core / readingbat-kotest 3.2.1 → 3.3.0. No call-site changes were required;
correctAnswers()remains a suspend function as of 3.2.0. - core-utils 2.9.3 → 3.2.1. A major-version bump of a library this template uses directly —
FileSystemSource,GitHubRepo, andOwnerType.OrganizationinContent.kt, andtoDoubleQuotedinContentTests.kt. All four call sites compile unchanged against 3.x. - Kotlin 2.4.0 → 2.4.10, Kotest 6.2.1 → 6.2.3, Kotlinter 5.5.0 → 5.6.0.
- Catalog version key renamed.
[versions] ben-manes-versions→versions. The plugin alias remainsben-manes-versions, soalias(libs.plugins.ben.manes.versions)inbuild.gradle.ktsis unchanged. This affects only theversion.refinsidelibs.versions.toml.
Documentation
CHANGELOG.md— 1.9.0 section plus the compare link.RELEASE_NOTES.md—v1.9.0highlights, dependency table, upgrade notes, and verification results.CLAUDE.md/README.md— new "Continuous Integration" sections documenting the workflow.README.md— CI status badge.llms.txt— refreshedreadingbat-coreand current-version values; CI noted under Key Files and Tech Stack.
Dependencies
| Library | Version |
|---|---|
| Kotlin | 2.4.10 |
| Ktor | 3.5.1 |
| Kotest | 6.2.3 |
| readingbat-core | 3.3.0 |
| core-utils | 3.2.1 |
| kotlin-logging | 8.0.4 |
| detekt | 2.0.0-alpha.5 |
| kotlinter | 5.6.0 |
| Gradle | 9.6.1 |
| JDK toolchain | 25 |
Upgrade Notes
- No source changes are required for forks that track this template — this release touches only
.github/workflows/ci.yml,gradle/libs.versions.toml, andgradle.properties. - Forks that add their own
[versions] ben-manes-versionsentry should rename the key toversions(or keep their ownversion.ref). - Forks with custom code against
core-utils2.x should re-verify against 3.x; this template's own usage needed no changes, but 3.0.0 is a major release. - JDK 25 remains required, unchanged from 1.8.0.
Verification
./gradlew --rerun-tasks check— BUILD SUCCESSFUL; all threeContentTestsspecs pass (Test all challenges,Test with correct answers,Test individual challenges)../gradlew buildFatJar— BUILD SUCCESSFUL; producesbuild/libs/server.jar../gradlew lintKotlin detekt— both checks run cleanly.- GitHub Actions CI passed on PR #11, confirming the build on a clean JDK 25 runner.
Full Changelog: 1.8.0...1.9.0
v1.8.0
A linting and toolchain-modernization release on top of 1.7.0. The content DSL is unchanged, but the project now targets JDK 25 and picks up readingbat-core 3.2.1, which adjusts one test call site.
Highlights
- JVM toolchain 17 → 25. A JDK 25 is now required to build.
- readingbat-core 3.1.5 → 3.2.1.
correctAnswersis now a suspend function;ContentTestscallscorrectAnswers()inside arunBlocking { … }block. ExistingContent.ktdefinitions compile and run unchanged. - Linting wired in. detekt (
dev.detekt2.0.0-alpha.5) and Kotlinter (org.jmailen.kotlinter5.5.0) Gradle plugins, withmake lint/make format/make detekt/make detekt-baselineshortcuts and a project-wide.editorconfig. - Gradle configuration cache enabled (
org.gradle.configuration-cache=true). - Dropped Heroku deployment support. Removed
Procfile,system.properties, and theheroku/logsMakefile targets; deploy the./gradlew buildFatJaroutput (build/libs/server.jar) instead. - Build tidy-ups. Self-documenting Makefile (
make help), a fixedmake uberjartarget (now./gradlew buildFatJar), fat-jar config moved to Ktor'sktor { fatJar { … } }block, andjvm/gradle-wrapperversions promoted into the version catalog. - Kotlin challenge package renamed
kgroup1→kgroupto match the documented layout.
Dependencies
| Library | Version |
|---|---|
| Kotlin | 2.4.0 |
| Ktor | 3.5.1 |
| Kotest | 6.2.1 |
| readingbat-core | 3.2.1 |
| core-utils | 2.9.3 |
| kotlin-logging | 8.0.4 |
| detekt | 2.0.0-alpha.5 |
| kotlinter | 5.5.0 |
| Gradle | 9.6.1 |
| JDK toolchain | 25 |
Upgrade Notes
- Install a JDK 25 — the toolchain target moved from 17 to 25.
- Forks invoking
./gradlew uberjarshould switch to./gradlew buildFatJar(ormake uberjar). - Forks referencing
libs.plugins.versionsshould rename tolibs.plugins.ben.manes.versions. - Forks referencing the
kgroup1package should rename it tokgroup. - Heroku users:
Procfileandsystem.propertieswere removed — deploy the fat JAR instead.
Full Changelog: 1.7.0...1.8.0
v1.7.0
Release of ReadingBat Template 1.7.0.
Changes
- Clean up Gradle build and bump version to 1.7.0 (#4)
- Migrate repository configuration to
settings.gradle.ktsand clean upbuild.gradle.kts - Bump Gradle to 9.5.0 and update Kotlin, Ktor, and dependency versions
- Update
readingbatto 3.1.2, adjust group ID, and clean up build config - Migrate packages from JitPack to Maven Central and update dependencies
Full Changelog: 1.6.0...1.7.0
v1.6.0
Highlights
- Upgrade Gradle to 9.0.0, then 9.4.0
- Update Kotlin, Ktor, kotest 6.0.0, readingbat 3.0.5, utils 2.4.2
- Add shadowJar config and test logging
- Update Java runtime to 17 and remove redisEnabled config
- Fix tests by adding initTestProperties and ktor-server-config-yaml
- Migrate packages from JitPack to Maven Central
- Update readingbat to 3.1.2, adjust group ID
- Modernize README, add CLAUDE.md and llms.txt
- Add .DS_Store to .gitignore
- Fix unreachable slice1.py
Full Changelog: 1.5.0...1.6.0
v1.5.0
Highlights
- Upgrade to Kotlin 1.9.22
- Update to Kotlin 2.1.0 and Ktor 3.0.1
- Update to readingbat-core 2.0.0
- Convert to using libs.versions.toml
Full Changelog: 1.4.0...1.5.0