Chronos meets Prologue.
Kairos is a chronos-based HTTP server that plugs into Prologue as a backend. If you're in the chronos ecosystem and want to use Prologue, this makes that possible.
asyncdispatch has historically had its share of issues. chronos has gone well beyond the stdlib: raises tracking for compile-time exception verification, proper cancellation support, faster OS-specific timer primitives, and a cleaner API with transports and async synchronization primitives (AsyncLock, AsyncEvent, AsyncQueue). It's actively developed and battle-tested in production at Status (libp2p, nimbus, nim-eth).
Rather than spinning up yet another Nim web framework, we chose to support Prologue. It's the most popular actively maintained Nim web framework (~1.3k stars on GitHub, with Jester abandoned), and it's a proper full-featured MVC framework — middleware, routing, sessions, templates — familiar to anyone coming from Rails, Django, or Flask. No reason to reinvent that.
The backend swap is done via nimble features:
requires "prologue#head[kairos]" # chronos backend. Notice #head is needed until a release of prologue is made
requires "kairos[ws]" # opt-in websocket support via websock
Your app code stays (mostly) the same — just import chronos instead of std/asyncdispatch.
Example repo: https://github.com/jmgomez/prologue-kairos-example
$ nim -v
Nim Compiler Version 2.2.8 [Linux: amd64]
Compiled at 2026-02-23
Copyright (c) 2006-2026 by Andreas Rumpf
git hash: 4f500679b196fad944caa50a753f5bbfaefda001
active boot switches: -d:release
$ nimble install "nimble@#head"
Building nimble/nimble using c backend
Info: compiling nim package using /home/chris/.nimble/bin/nim
Nim Output /home/chris/.nimble/pkgcache/githubcom_nimlangnimble_#head/src/nimblepkg/options.nim(900, 12) Warning: Provide auth in url instead; newProxy is deprecated [Deprecated]
... /home/chris/.nimble/pkgcache/githubcom_nimlangnimble_#head/src/nimblepkg/downloadnim.nim(51, 12) Warning: Provide auth in url instead; newProxy is deprecated [Deprecated]
Warning: Symlink already exists in /home/chris/.nimble/bin/nimble. Replacing.
$ nimble -v
nimble v0.20.0 compiled at 2026-04-01 17:09:24
git hash: cea763192c5a195527c866ea74550b2347f1787d
$ nimble install
Downloading https://github.com/jmgomez/kairos using git
Warning: Package prologue_kairos_example lists an underspecified version of prologue (#head)
Downloading https://github.com/planety/logue using git
Building logue/logue using c backend
Info: compiling nim package using /home/chris/.nimble/bin/nim
Downloading https://github.com/jmgomez/kairos using git
Downloading https://github.com/planety/cookiejar using git
Building logue/logue using c backend
Info: compiling nim package using /home/chris/.nimble/bin/nim
Warning: Symlink already exists in /home/chris/.nimble/bin/logue. Replacing.
Building prologue_kairos_example/app using c backend
Info: compiling nim package using /home/chris/.nimble/bin/nim
Nim Output /home/chris/.nimble/pkgs2/prologue-0.6.10-16a3600d47c8095399fe843c3506a3cc7cd53e52/prologue/websocket/websocket.nim(16, 12) Error: Please use `logue extension websocketx` to install!
Tip: 504 messages have been suppressed, use --verbose to show them.
nimble.nim(418) buildFromDir
Error: Build failed for the package: prologue_kairos_example
$ logue extension websocketx
Executing task websocketx in /home/chris/.nimble/pkgs2/prologue-0.6.10-16a3600d47c8095399fe843c3506a3cc7cd53e52/prologue.nimble
Downloading https://github.com/ringabout/websocketx using git
$ nimble install
Warning: Package prologue_kairos_example lists an underspecified version of prologue (#head)
Building prologue_kairos_example/app using c backend
Info: compiling nim package using /home/chris/.nimble/bin/nim
Nim Output /home/chris/.nimble/pkgs2/prologue-0.6.10-16a3600d47c8095399fe843c3506a3cc7cd53e52/prologue/websocket/websocket.nim(16, 12) Error: Please use `logue extension websocketx` to install!
Tip: 31 messages have been suppressed, use --verbose to show them.
nimble.nim(418) buildFromDir
Error: Build failed for the package: prologue_kairos_examplenimble v0.20.0 compiled
You still using an old version of nimble. Likely you have another nimble in your path
To elaborate a bit on why it fails:
Nim Output /home/chris/.nimble/pkgs2/prologue-0.6.10-16a3600d47c8095399fe843c3506a3cc7cd53e52/prologue/websocket/websocket.nim(16, 12) Error: Please use logue extension websocketx to install!
Prologue has a compile time check on making sure their dependency on the websocket library used is there. Thats part of the asyncdispatch code path, which shouldnt be trigger at all. The issue is that activating features in transitive deps (kairos[ws] is not a direct dep of the example project, but of prologue) is not supported by that version of nimble (from the root package is) but since we are using an optional code path (ws), it triggers.