Cohesive micro-libraries to facilitate Kotlin Multiplatform development pedestal.opensavvy.dev/api-docs
3.2.2 34f32472 Ivan “CLOVIS” Canet

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

3.2.1 0c591f1d Ivan “CLOVIS” Canet

Kotlin 2.3.10

### Dependencies - Kotlin 2.3.10

3.2.0 29b17168 Ivan “CLOVIS” Canet

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

3.1.1 584cd111 Ivan “CLOVIS” Canet

Fixed documentation website deployment

### Documentation - Fixed deployment to the new documentation website (!202)

3.1.0 b9b3769e Ivan “CLOVIS” Canet

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

3.0.0 13c02d79 Ivan “CLOVIS” Canet

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.

3.0.0-rc.1 93bab566 Ivan “CLOVIS” Canet

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

3.0.0-alpha.2 1bd03863 Ivan “CLOVIS” Canet

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)

3.0.0-alpha.1 f751e917 Ivan “CLOVIS” Canet

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

2.3.0 a4aee9ca Ivan “CLOVIS” Canet

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)

2.2.2 f567aabe Ivan “CLOVIS” Canet

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)

2.2.1 0914107a Ivan “CLOVIS” Canet

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)

2.2.0 50c581c9 Ivan “CLOVIS” Canet

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)

2.1.1 163cfa05 Ivan “CLOVIS” Canet

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)

2.1.0 823b1e1a Ivan “CLOVIS” Canet

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)

2.0.0 4738f165 Ivan “CLOVIS” Canet

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)

2.0.0-rc.12 4738f165 Ivan “CLOVIS” Canet

Fix MavenCentral publishing

2.0.0-rc.11 f6c9afc2 Ivan “CLOVIS” Canet

Fix MavenCentral publication

2.0.0-alpha.1 0b3118e7 Ivan “CLOVIS” Canet

Fix MavenCentral publication

2.0.0-rc.10 4fdb35df Ivan “CLOVIS” Canet

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.

2.0.0-rc.9 ed58443d Ivan “CLOVIS” Canet

LinuxX64 support

### Build and deployment - Support for the LinuxX64 platform (#115, !86) ### Cache - Explicitly specify which clock to use when using ExpirationCache (#111, !85)

2.0.0-rc.8 ae02a744 Ivan “CLOVIS” Canet

Fix MavenCentral publication

2.0.0-rc.7 88825f9d Ivan “CLOVIS” Canet

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)

2.0.0-rc.6 8bce3772 Ivan “CLOVIS” Canet

Documentation and Spine fixes

### State - Improved documentation (#98, !74) ### Spine - Do not crash when deserializing a malformed SpineFailure

2.0.0-rc.5 521e98c3 Ivan “CLOVIS” Canet

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)

2.0.0-rc.4 ae251480 Ivan “CLOVIS” Canet

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)

2.0.0-rc.3 0cc0c4b9 Ivan “CLOVIS” Canet

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)

2.0.0-rc.2 ab31754b Ivan “CLOVIS” Canet

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)

2.0.0-rc.1 b48efd5c Ivan “CLOVIS” Canet

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)

1.1.0 edfee274 Ivan “CLOVIS” Canet

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)

1.1.0-rc.2 58fa56e6 Ivan “CLOVIS” Canet

Release candidate 2 to check iOS library publishing

1.1.0-rc.1 d6361e8c Ivan “CLOVIS” Canet

Release candidate 1 to check iOS library building

1.0.2 ae00c1aa Ivan “CLOVIS” Canet

Failure debugging, ID serialization

### State - Better stacktraces for FailureException (#52, !43) ### Spine (experimental) - IDs are serialized as strings instead of objects (#55, !44)

1.0.1 39e31716 Ivan “CLOVIS” Canet

Pass coroutine context elements through the cache

### Cache - Implement the PassThroughContext interface to avoid being captured by the cache (#54, !42)

1.0.0 4d9033bd Ivan “CLOVIS” Canet

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.

1.0.0-rc1 a3ed50b7 Ivan “CLOVIS” Canet

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)

0.5.2 e916abdf Ivan “CLOVIS” Canet

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)

0.5.1 74ee6ea8 Ivan “CLOVIS” Canet

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)

0.5.0 6df5d3a9 Ivan “CLOVIS” Canet

State rewrite

Instead of using our own State type, we use Arrow's Either. We also decouple Progression from State.

0.4.4 f44705ad Ivan “CLOVIS” Canet

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)

0.4.3 49497c4c Ivan “CLOVIS” Canet

Bugs fixes

0.4.2 0bfde604 Ivan “CLOVIS” Canet

Syntax sugar for state management, failure logging

0.4.1 cf904df5 Ivan “CLOVIS” Canet

Bug fixes

0.4.0 497198a1 Ivan “CLOVIS” Canet

Identification rewrite

Value identification has been majorly simplified.

0.3.1 06fa8506 Ivan “CLOVIS” Canet

Publish the Spine module

0.3.0 2c446f39 Ivan “CLOVIS” Canet

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

0.2.1 b7208352 Ivan “CLOVIS” Canet

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)

0.2.0 648d8ca9 Ivan “CLOVIS” Canet

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)

0.1.3 b0215918 Ivan “CLOVIS” Canet

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

0.1.2 a0ec60ac Ivan “CLOVIS” Canet

Fixed missing publications

0.1.1 c6388c5f Ivan “CLOVIS” Canet

GitLab Maven Repository

Pedestal is now available on the GitLab Maven Repository.

0.1 5da5c73c Ivan “CLOVIS” Canet

Initial version