Release Notes

2.23.0

11 March 2026

New Features

  • Simplify logic and speed up the write step on sites with lots of files (#43 by kevinrenskers)

Simplifies Saga’s internal architecture by removing four internal types (FileContainer, ProcessStep<M>, AnyProcessStep, ItemBox<M>) and replacing them with simpler data structures.

  • File tracking: FileContainer class replaced by a tuple array [(path: Path, relativePath: Path)] with a Set<Path> for handled state and a [String: String] dict for content hashes.
  • Pipeline steps: Type-erased wrapper classes replaced by closure pairs (read: ReadStep, write: WriteStep) stored directly on Saga.
  • Writer context: Writer.run now takes a WriterContext<M> struct instead of 6 individual parameters.
  • Resource lookup: Per-item linear scan of all files replaced by a precomputed dictionary, resulting in a ~2.5x faster write phase on file-heavy sites (it saves 0.5 seconds on loopwerk.io).
  • Added a new convenience groupedWriter, a version of partitionedWriter that takes a key path. yearWriter now uses it under the hood.

The public API is unchanged.

2.22.0

11 March 2026

New Features

  • Add @preconcurrency to silence warnings for Swift 5.10 users

2.21.0

11 March 2026

New Features

  • Moved to Swift 6
    • Solved the SendableMetatype warnings for Swift 6 projects.
    • Add Sendable conformances and @Sendable annotations throughout.
    • While Saga now uses the Swift 6 toolchain, backwards compatibility with Swift 5 projects is maintained.
    • Users still on Swift 5 will most likely get warnings about “Converting non-Sendable function value to @Sendable”. This is unfortunate, but it’s not feasible to make Saga compatible and crash-free with Swift 6 while also not introducing these warnings for Swift 5 users. Please upgrade your Package.swift to use swift-tools-version:6.0.

BREAKING CHANGES

  • Switched from loopwerk/PathKit to loopwerk/SagaPathKit due to name clashes with projects (such as Stencil) that depends on kylef/PathKit. If your code uses import PathKit, you’ll need to change this to import SagaPathKit.
  • Removed all deprecated methods and properties.
  • Removed the old watch command. Please use the new saga cli.

2.20.0

10 March 2026

New Features

  • Add @Sendable annotations and refactor postProcess/reader pipeline Refactor postProcess to use a postProcessors array, fixing createPage not applying post-processors.

2.19.0

9 March 2026

New Features

  • Switched from kylef/PathKit to loopwerk/PathKit The original project seems unmaintained. My fork updated the minimum Swift version to 5.10, added Swift 6 support with Sendable, added Decodable support, and fixed all the unit tests (they didn’t run at all).

2.18.9

9 March 2026

Improvements

  • Full support for Swift 6

Changes

  • Updated the minimum Swift version to 5.10

Bugfixes

  • Restored Swift 5.10 compatibility
  • Fixed all compiler warnings, both when running in Swift 5 and when using it in a Swift 6 project
  • Pin swift-asn1 to 1.4.x for Swift 5 compatiblity

Notes

  • Releases 2.18.1 to 2.18.8 were removed since they all fixed the same issues

2.18.0

5 March 2026

New Features

  • Added an itemProcessor property to the register(fetch) method

2.17.0

3 March 2026

New Features

  • Removed the Saga CLI from this package, and into its own repository This should make dependency resolution quicker for Saga users, pulling in fewer dependencies.

2.16.1

3 March 2026

Bugfixes

  • Fixed the date formatting as part of the printed log messages
  • Only depend on swift-crypto when building on Linux; on macOS, the system CryptoKit framework is used (zero compile time)

2.16.0

2 March 2026

New Features

  • Add postProcess step for transforming written output
  • Add isDev flag, set SAGA_DEV in dev and watch commands
  • Add hashed() for cache-busting asset URLs

2.15.0

27 February 2026

Renames

  • Renamed filteredOutItemsAreHandled to claimExcludedItems. The old version has been marked as deprecated and will be removed in the next major version.

2.14.1

24 February 2026

Bugfixes

  • Copy the static files before running the write phase, so that we’re sure the static folders exist for use during custom register steps

2.14.0

24 February 2026

New Features

2.12.0

23 February 2026

New Features

Documentation Changes

  • Example app has a new page showing how to programmatically load content from an API
  • Added proper documentation for the nested subfolder processing feaure

2.11.0

14 February 2026

New Features

  • A brand new saga CLI with init, dev and build commands, installable via Homebrew and Mint (#39 by kevinrenskers)

2.10.0

12 February 2026

New Features

  • Make it possible to override the item sorting (closes #37)
  • Support nested subfolder processing as separate steps by using a glob syntax (foldername/**)
  • Add previous/next properties to ItemRenderingContext (closes #36)

Documentation Changes

  • Big README rewrite
  • Massively improved Example app with a new design and much nicer photo albums, that now also show a page per photo
  • Added Moon to the example project to show server-side syntax highlighting with Prism

2.9.0

22 January 2026

New Features

  • Add support to the Atom feed writer for article images via <media:content>

2.8.2

18 January 2026

Bugfixes

  • The file change watcher now ignores .DS_Store files

2.8.1

12 January 2026

Bugfixes

  • Fix running tests on Linux

2.8.0

12 January 2026

New Features

  • Much improved file watcher logic and watch command arguments

You can now run it like this:

$ swift run watch --watch content --watch Sources --ignore input.css --output deploy

2.7.0

15 September 2025

New Features

  • Added an explicit created property to Item

2.6.0

11 September 2025

New Features

  • Make it possible to supply a dateKeyPath for the Atom feed, which determines how theelement gets its value

2.5.0

16 July 2025

New Features

  • Added a new filteredOutItemsAreHandled option

2.4.0

23 June 2025

New Features

  • Renderers can now optionally be async

2.3.1

23 June 2025

Documentation Changes

  • Docs are now automatically generated via a GH Action and don’t need to live in the main branch any longer

Tests

  • Fix flaky tests in CI
  • Make Reader.convert public so that plugins can use this to write unit tests

2.3.0

16 June 2025

New Features

Bugfixes

  • Saga is now compatible with Swift 5.5 as well as Swift 6

2.2.0

15 April 2025

New Features

  • Improve the atom feed writer, always include the full body text

2.1.2

7 April 2025

Bugfixes

  • Always add the link element to entries when generating the Atom feed

Tests

  • Add testDateFromFrontMatter

2.1.1

28 February 2025

Bugfixes

  • Restore Saga 1.x behavior where the item title defaults to the file name (without the extension)

2.1.0

28 February 2025

New Features

  • Make some Path extensions public instead of internal

2.0.3

21 February 2025

Bugfixes

  • There is no reason for Reader to have the generic type M any longer

2.0.2

19 February 2025

Bugfixes

  • Go back to XMLElement instead of string interpolation for the atom feed generation, but in a way that works on Linux

2.0.1

18 February 2025

Bugfixes

  • Fix linux compatibility (#25)

Tests

  • Fix tests

2.0.0

18 February 2025

New Features

  • Include an Atom feed helper function with Saga itself (#23)
  • Get rid of the Codextended dependency
  • Clean up Item dates (#22)

BREAKING CHANGES

  • Item.published has been renamed to Item.date