Mutable enumset, dependency upgrades
### EnumSet - Added `equals` and `hashCode` to `EnumSet32` (#164, !228) - Added the experimental `MutableEnumSet32` (#164, !228) - Added fast paths for comparisons (#164, !228) ### Deployment - Intel-based Apple targets have been removed (!236) ### Dependencies - Kotlin 2.4.10 - Arrow 2.2.3 - KotlinX.Coroutines 1.11.0 - KotlinJS 2026.7.7
32-bit enum sets and weak map improvements
### EnumSet - Added `BitSet32.of()` which accepts an iterable (!205) - Added `.toSet()` and `.toMutableSet()` (!205) - Added `enumSetOf()` and `.toEnumSet()` (#170, !206) - Optimized `enumSetOf(Foo.entries)` (!206) - Optimized 32-bit `EnumSet` (#170, !206) ### Weak - Added `WeakRef.isEmpty()` and `WeakRef.isNotEmpty()` (!207) - Added `WeakValueHashMap` (#178, !225) - Added `toString()`, `equals()` and `hashCode()` on `FakeWeakRef` (!225) - Documented the thread safety of `WeakRef` and `WeakMap` (#180, !225) - Added a wrapper for the JVM `WeakHashMap` (#179, !226) - Added a wrapper for the JS `WeakMap` (#179, !226) ### Dependencies - Kotlin 2.2.21
Fixed documentation website deployment
### Documentation - Fixed deployment to the new documentation website (!202)
WasmJS weak references and the new documentation website
### Weak - Added support for `wasmJs()` (#155, !200) ### Documentation - Moved the documentation website to https://pedestal.opensavvy.dev (!199) ### Dependencies - Kotlin 2.2.0 - KotlinJS 2025.7.6
Support for more platforms
### Breaking changes - Removed Spine (was deprecated, moved to other coordinates, !163) - Stripped down Logger (was deprecated, !179) - Removed State Arrow (all functionality has been moved into State, !163) - Removed deprecated methods (!163) ### Weak Weak is a new module containing weak references and related algorithms. ### EnumSet EnumSet is a new experimental module with memory-efficient bitfields and enum sets.
Stable weak references, stripped down logger
### Progress - Support for more Kotlin platforms (469dcb51, !179) ### State - Support for more Kotlin platforms (20046cb0, !179) ### Cache - Support for more Kotlin platforms (5b0ee6ff, !179) ### Backbone - Support for more Kotlin platforms (0fde1531, !179) ### Weak - Stabilized `WeakRef()` and `SoftRef()` (1820e495, !185) - Removed `EmptyWeakRef()` (7fc0774c, !185) ### Logger The `logger` library has been stripped down to a minimal println-based implementation (08ac9d92, !179). It was deprecated for a while and was blocking us from supporting more platforms. In the future, [Sentier](https://gitlab.com/opensavvy/groundwork/sentier) will take its place. ### Dependencies - KotlinJS 2025.5.8 - KotlinX.Datetime 0.6.2 - KotlinX.Coroutines 1.10.2 - Lincheck 2.39 - Arrow 2.1.2 - Slf4J 2.0.17
BitSet32, documentation improvement and more Kotlin Native platforms
### EnumSet `:enumset` is a new module which will implement performant Set implementations for small integer sets and for enums. It is not yet complete as of this release. - Implement `BitSet32` (#168, !174) - Implement `MutableBitSet32` (#169, !176) ### Weak - Support more Kotlin Native platforms (#163, ad11a243, !177) ### Documentation - Mention the Weak module in the main README (!170) - Fix links in the main README (#160, !170) - Add copyright headers in all files (!173) ### Dependencies - Kotlin 2.1.10 (143f6dd3) - KotlinX.Coroutines 1.10.1 (9e53816c) - KotlinJS Wrappers 2025.1.4 (5e855377) - Prepared 2.0.0-alpha.2 (ae0a1c8d) - Slf4J 2.0.16 (81c6f352)
Removal of deprecated code and testing improvements
### Breaking changes - Removed the deprecated Spine modules (#158, 17c3ec57, !163) - Removed the unused tester module (!163) - Removed the unused state-arrow module (!163) - Removed deprecated cache and state methods (!163) ### Testing - Better cache tests using Lincheck (#80, !133) - Rewrite all tests to use Prepared instead of kotlin-test (#136, #137, !120, !139, !163) ### Documentation - Link to versioned documentation in module headers (!160) ### Dependencies - Kotlin 2.0.20 - KotlinX.Datetime 0.6.1 - KotlinX.Coroutines 1.9.0
Experimental Progressive holder and the new Weak module
### Progress - Experimental Progressive holder class (#144, !136) - Experimental helpers to capture progress into a Flow (!136) - Increased test coverage (!142) ### State - Experimental conversions from Progressive, Outcome and ProgressiveOutcome (!136) - Increased test coverage (!142) ### Weak Pedestal Weak is a new module to use weak reference and associated data structures from common Kotlin code! - Experimental WeakRef and SoftRef (#152, !147) - Experimental WeakMap (#153, !147) - Experimental pure Kotlin implementation of WeakKeyMap (!147) - Helpers to test weak data structures (!147) ### Dependencies - KotlinX.Datetime 0.6.0 (!143) - KotlinX.Coroutines 1.8.1 (!143) - KotlinX.Serialization 1.7.1 (!143) - Prepared 1.3.0 (!143)
Bug fixes, Kotlin 2.0.0
### Build and deployment - Fixed JVM tests not running (ec557993, !129) - Enable code coverage for all modules (#142, !129) - Migrate Progress tests to Prepared (778387b1, !129) - Stop publishing the `tester` module (89f4d925, !119) ### Dependencies - Kotlin 2.0.0 (55a01666, !70) - Slf4J 2.0.13 (00733016, !132) - Arrow 1.2.4 (3884e8a6, !132) - Logback Classic 1.5.6 (983d8f98, !132) - KotlinX.Datetime 0.5.0 (03dbf236, !132) - KotlinX.Coroutines 1.8.0 (03dbf236, !132)
Improved testing, Kotlin 2.0.0-RC1
### Testing - Fixed JVM tests not running (ec557993, !129) - Set a minimal code coverage for all active modules (#142, !129) ### Spine (deprecated) - Unify the string representation of floating-point numbers on all platforms (99f5d234) ### Dependencies - Kotlin 2.0.0-RC1 (66672126)
Documentation improvements, Arrow built into State, experimental progressive DSL
### Backbone - Documentation improvements and example modernization (#133, !118) ### State - Merge :state-arrow into :state (1ddf5e18, !123) - Documentation improvements for State (!123) - Experimental DSL for ProgressiveOutcome (!124) ### Documentation - Remove the link to Logger from the main README (7186f217, !122) - Fix links after move to OpenSavvy Groundwork (c4fcbd7a, !122)
Experimental LocalStorage cache
### Cache - Created the experimental LocalStorage/SessionStorage cache implementation (#2, !114) ### Spine - Mention that Spine is being rewritten (24c862d6, 110) ### Build and deployment - Fixed incorrect documentation URL in MavenCentral metadata (#127, !101) ### Dependencies - Kotlin 1.9.22 (128dfe13)
Helpers to combine completed results
### State - Helpers to accumulate incomplete results with the previous complete result (#125, !96) ### Documentation - Mark each module's stability (#119, !95) - Fixed a broken link in State Arrow (f1e814d9) - Document how each logger implementation works (154377bd)
Stable 2.0.0 release
Here are the highlights of this range of updates. To learn more, see the pre-release changelogs: ### Progress Previously a part of Pedestal State, the progress management is now its own independent library (#58, !54). ### State - State was previously based on Arrow. We have decided to make State independent of Arrow. We have completely rewritten the failure management (#59, #70, !58). - Introduced a compatibility module for use with Arrow. - Introduced a compatibility module for use with Coroutines. ### Cache - Reworked the module so implementations are private, and only instantiation methods are public. This will make it much easier to make changes to implementations in the future (#86, !81). - Introduced contextual cache algorithms, which understand authentication or paging (#85, !66). - Introduced blocking algorithms for Java interoperability (#109, !83). ### Backbone - Reworked the Backbone pattern to entirely hide the Cache as an implementation detail, making future changes much easier (#73, !59). ### Build and deployment - The project is now published as 'dev.opensavvy.pedestal:<module>:<version>' instead of 'opensavvy:<module>:<version>' (#69, !68) - Major documentation improvements. - Support for LinuxX64 (#115, !86) - The project is now published on MavenCentral! - The project is now based on the OpenSavvy Playground (#114, !87)
Fix MavenCentral publishing
Fix MavenCentral publication
Fix MavenCentral publication
Log bug and better documentation
### Documentation - Avoid single-letter type parameters (#112, !88) - Mention the LinuxX64 support in the README (#118, !90) ### Build and deployment - The project is now based on the OpenSavvy Playground, which should make build configuration easier (#114, !87) - Fixed the CI not running on the GitLab Shared Runners for MacOS (!82, !92) ### Cache - Fixed the lock bug on Kotlin/JS (#101, !91) ### Dependencies - Kotlin 1.9.0 - Arrow 1.2.0 - Dokka 1.9.0 - Logback 1.4.8 - Slf4j 2.0.7 - Ktor 2.3.2 - KotlinX.Coroutines 1.7.2 - KotlinX.Serialization 1.5.1 ### Contributions Thanks @darbyfrey (from the GitLab team) for helping us figure out how to use the MacOS Shared Runners.
LinuxX64 support
### Build and deployment - Support for the LinuxX64 platform (#115, !86) ### Cache - Explicitly specify which clock to use when using ExpirationCache (#111, !85)
Fix MavenCentral publication
Blocking cache and MavenCentral publication
### Migration steps The group for Gradle configuration has been renamed from 'opensavvy.pedestal' to 'dev.opensavvy.pedestal'. ### Cache - Better documentation (9bf6b475, !81) - All implementations are internal, only their factory methods are public (#86, !81) - Create blocking wrappers to use the library without coroutines (#109, !83) ### Build and deployment - Gitpod support to contribute to the project in a cloud environment (#107, !79) - Migrate after changes to the GitLab shared MacOS runners (#102, !78) - Pedestal is now published on MavenCentral (#105, !77)
Documentation and Spine fixes
### State - Improved documentation (#98, !74) ### Spine - Do not crash when deserializing a malformed SpineFailure
Type-safe Spine errors
### Pedestal - Completely rewrite of the documentation (#97, !72) ### Spine Spine is deprecated and will be removed in the future. - Type-safe errors (#103, !73)
Easier Outcome-based error management
### Progress - ProgressReporter.NoOp has been moved to a private class, accessed by the factory 'emptyProgressReporter' (#90, !69) ### State - Added Outcome.mapFailure and ProgressiveOutcome.mapFailure (#92, !70) ### Build and deployment - Fixed the links in Dokka to the Arrow documentation (#63, !71)
Failure removal
### State - Removed the Failure interface (#87, !67) - Conversion functions from Either to Outcome (!67) - Accessors for Outcome<Nothing, T> and similar (#88, !68)
Contextual caches
### Cache - Created contextual cache algorithms (#85, !66) ### Backbone - Removed Backbone.request (#84, !64) ### Build and deployment - Cleaned up the README (#82, !62) - Added the OpenSavvy coding style (#83, !63)
Pedestal 2.0 first release candidate
### Progress The progress management, originally a part of Pedestal State, has been split into its own Pedestal Progress project. To facilitate usage into projects with specific requirements, it is organized as a main project and a compatibility module to use with Kotlin Coroutines. - Extracted Progress from the State project (#58, !54) ### State Completely reworked the failure management. Previously, failure was a single class, whereas it became an interface. This allows code to declare its own sealed classes of possible failures, making testing easier. - Complete failure rework (#59, #70, !58) ### Backbone - Hide the cache as an implementation detail instead of exposing it (#71, !61) ### Spine - Spine is deprecated, and will be removed in the future (#73, !59) ### Build and deployment - Enabled the Gradle Build Cache (#76, !55, !56) - Exposed Dokka as a review app (#78, !57) - The library is now published as 'opensavvy.pedestal:<module>:<version>' instead of 'opensavvy:<module>:<version>' (#69, !68)
iOS support & Gradle convention plugins
### Platform support Thanks to @LandryNorris for contributing the support for iOS platforms and helping me set up the CI for them. - Added iOS support for State and Logger (!47) - Added iOS support for Cache and Backbone (!50) - Configured the CI to run on MacOS virtual machines to test and publish the libraries (#64, !50) ### State - Added ProgressiveOutcome.map, Flow<ProgressiveOutcome>.mapSuccess (#56, !45) ### Build and deployment - Complete rewrite of the Gradle build using convention plugins (#61, #67, !46, !49) - Kotlin 1.8.10 and other dependency updates (#66, !48)
Release candidate 2 to check iOS library publishing
Release candidate 1 to check iOS library building
Failure debugging, ID serialization
### State - Better stacktraces for FailureException (#52, !43) ### Spine (experimental) - IDs are serialized as strings instead of objects (#55, !44)
Pass coroutine context elements through the cache
### Cache - Implement the PassThroughContext interface to avoid being captured by the cache (#54, !42)
Stabilization of Logger, State, Cache and Backbone
The projects Logger, State, Cache and Backbone are now reaching stable status. All future API changes will go through proper depreciation cycles. Spine (and its related projects, Spine-Ktor, etc) are still experimental.
Outcome and documentation
### General - Added the description of each projection in its documentation (#45, !37) - Added information on how to use the project (#45, !37) ### State - Removed the 'reporter' progress of the slice builder, avoiding the context creation on each call (3bad6da0, !36) - Renamed Slice to Outcome (#49, !38) - Created ProgressiveOutcome, which combines an Outcome with a Progression (#47, #49, !36, !38) ### Cache - Less logging for ExpirationCache (#43, !39) ### Backbone - Added function Ref.now() as a convenience for Ref.request().firstValue() (b7e824bb, !36) ### Spine - Clearer failure logging for the Ktor backend (#51, !40)
Endpoint advertisement
The library is getting closer to the 1.0 release! The next steps are to add more documentation. ### Spine for Ktor - Other endpoints of the same resource are advertised using the `Link` header (#22, !35) ### Build - Faster CI (!34)
Easier caching and failure management cohesion
### State - Cleaned up the 'valueOrThrow', 'valueOrNull', 'requestValueOrThrow()', 'firstValueOrNull()' methods (#40, !31) - Callback implementation of `ProgressionReporter` (#39, !32) - Removed the Identifier interface (#41, !33) ### Spine - The endpoint 'create' returns an `Identified` type instead of a `Pair` (#30, !26) ### Deployment - Fixed a Dokka memory exaustion bug which made the documentation fail to generate (!30) - GitLab Pages now displays the documentation for the latest tag, and not for the 'main' branch (#14, !29) - Optimize GitLab CI pipeline usage (!30)
State rewrite
Instead of using our own State type, we use Arrow's Either. We also decouple Progression from State.
Sub-route deletion, URL character list expansion
### Spine - It is now possible to create deletion operation on sub-routes (#32, !25) - Endpoints are now allowed to be composed of almost all characters, the API implementation is responsible for URL-encoding etc (#37, !24)
Identification rewrite
Value identification has been majorly simplified.
Pedestal Spine: RESTful typesafe APIs
Pedestal Spine is a typesafe multiplatform RESTful framework. # Changes - State management has been extracted from Backbone as Pedestal State - Cache management has been extracted from Backbone as Pedestal Cache - Created the Pedestal Spine project - Implemented Pedestal Spine for Ktor - Licensed the project under Apache 2.0
Bug fixes
Fixed: - Infinite recomposition when reading from a flow originating from the MemoryCache (!11) Project organization: - We do not publish beta versions anymore (previously built from the 'main' branch, #13, !10)
Request batching and authentication
New features: - Identification & authentication API (#10, !6) - Request batching for Backbone implementations (#8, !8) Code quality: - The API documentation is exposed on GitLab Pages (#5, !9) - Minimal code coverage is enforced (#11, !7)
Various bug fixes
This version only contains bug fixes. - f28c88da Cache.expire only expired the first layer - 5b34b2db ExpirationCache did not expire its contents - 5cdf5940 MemoryCache did not transfer new updates to previously-expired elements - 6efd6b8d MemoryCache starts a new request if subscribers are waiting, even if they don't explicitely request one - 00325e2d MemoryCache resubscribes to the previous layer if it failed More release information: https://gitlab.com/opensavvy/pedestal/-/releases/0.1.3
GitLab Maven Repository
Pedestal is now available on the GitLab Maven Repository.