announcements

Filipe Silva 2026-04-06T12:59:27.882119Z

https://github.com/filipesilva/datomic-pro-manager#library-usage is out with support for starting Datomic from within your app:

(ns app
  (:require
   [datomic.api :as d]
   [filipesilva.datomic-pro-manager :as dpm]))

(defn start []
  (future (dpm/up))
  (dpm/wait-for-up)
  (d/create-database (dpm/db-uri "app"))
  (def conn (d/connect (dpm/db-uri "app"))))
dpm/db-uri takes a db name and returns the full Datomic URI for it. dpm/up downloads and starts the transactor if needed, and dpm/wait-for-up blocks until it's ready. You'll still need to add com.datomic/peer and org.xerial/sqlite-jbc (if using sqlite) to your deps.edn, get their versions from running dpm once if you're not sure.

❀️ 2
πŸŽ‰ 10
mpenet 2026-04-06T18:59:51.366779Z

Initial release of https://github.com/mpenet/k7 - A high-performance disk-backed queue for Clojure. https://github.com/mpenet/k7#performance (using :flush on Apple M1, JVM 20) β€’ Append-only log backed by preallocated mmap'd segment files β€’ Zero-copy reads β€” payloads are read-only ByteBuffer slices into the mmap β€’ Single writer, multiple independent consumer groups with crash-safe cursors persisted in their own mmap'd files β€’ Ack / nack / seek β€” at-least-once delivery, redelivery on nack, arbitrary seek; adaptive batching on poll! β€’ Crash recovery β€” segments are scanned on open; the last valid CRC32C-verified frame is found automatically β€’ Configurable fsync strategy per queue (`:async`, :flush, :sync) and per consumer group β€’ Low allocation β€” enqueue! is zero-alloc; poll! allocates only the read-only ByteBuffer slice per message

πŸš€ 3
πŸŽ‰ 22
2026-04-06T19:22:13.884639Z

wow, this is sick

😁 1
Jeremy 2026-04-13T09:51:37.083649Z

btw, I just tested the lib, and the Qs and CGs operations still work after close (macos).

mpenet 2026-04-13T10:07:31.293349Z

hi! No it's not really suited for super high number of queues: between fd, the commit thread (depending the fsync strategy), and memory requirement. It makes more sense to have dozens/hundreds of queues max

mpenet 2026-04-13T10:08:08.720539Z

2. file segments are cross platform

mpenet 2026-04-13T10:09:37.915899Z

3. we leave a single file on disk to hold cursor information per consumer group. So if you re-use consumer group ids you'd be fine, They are just a file ultimately you can just delete them

mpenet 2026-04-13T10:10:14.418229Z

there's no cleanup on this. the point is to have them survive, but you can delete them

mpenet 2026-04-13T10:10:33.217529Z

something I will add eventually is rolling strategies for segment files

mpenet 2026-04-13T10:10:49.222699Z

so that you don't fill up your disk, but that's also doable outside of the lib currently

mpenet 2026-04-13T10:11:09.990989Z

well ish. the consumer group currently holds a bit of state regarding that, but it's a minor change

mpenet 2026-04-13T10:12:13.564329Z

to go back to 1. the number of messages in a queue is not really an issue

mpenet 2026-04-13T10:14:42.383839Z

about close I'd have to check it, could be that it might seem it works, but doesn't fully

mpenet 2026-04-13T10:14:48.778929Z

could be a bug also

Jeremy 2026-04-13T10:15:26.001049Z

thanks. regarding #1, is there anyway to push past hundreds of Qs max? 1. if commit threads are used per Q, are they disposed after close? i can tolerate reading ~100 max concurrently. if not, i don't mind using fsync 2. regarding the mem requirement, can I simply use smaller segments?

mpenet 2026-04-13T10:17:20.045289Z

1. yes they are disposed of 2. yes! that's a good workaround

mpenet 2026-04-13T10:18:54.508079Z

if you use :flush strategy there's no commit thread also

mpenet 2026-04-13T10:19:09.217879Z

but you'll trade some durability

Jeremy 2026-04-13T10:20:26.085939Z

cool, thanks. i'd have claude run some tests and report back

πŸ‘ 1
Jeremy 2026-04-12T23:31:17.060389Z

awesome work. I've had several issues with various chronicle-queue-backed libs. a few questions, if you don't mind: 1. can it handle lots of queues? as in, 100k - 1 mil, each with 100k-1mil messages? 2. are the file segments cross-platform? i.e., can i expect the same set of bytes if i were to copy the files over from a mac or windows/linux. this isn't critical, I'm simply curious. 3. is there any disk cleanup regarding cursors? as in, i may want a process to always read all messages... if the cursors leave behind a bunch of bytes on the disk (whether for closed/unclosed CGs), is it a cause for concern if I may reopen the queue hundreds/thousands of times?

roklenarcic 2026-04-08T18:07:02.538059Z

how does it compare to https://github.com/mpenet/tape

roklenarcic 2026-04-08T18:07:58.965809Z

seems to be targeting the same niche

mpenet 2026-04-08T18:23:28.989119Z

yep, they are very similar. k7 is inspired by chronicle-queue but it removes some of the stuff I didn't like about it. β€’ k7 has 0 dependency (just clj and core.async), tape has tons (via chronicle-queue) β€’ k7 is more barebones, some things are left to the user to decide (threading/locking, serialization etc) β€’ k7 is a lot faster writing to the queue, like 5x faster on some of the benchmarks I ran (using custom serialization on tape to be fair, since k7 just deals with bytes). β€’ tape is a bit faster to read from queues, but I think I can close that gap, but they are withing 20% of each other, it's quite minimal β€’ on "large" payloads, k7 is a lot faster, ~2x for 64kb on roundtrips (write+read) Then k7 is ~700loc, 100% clojure (in very java'esque style), chronicle-queue is quite a bit larger :)

mpenet 2026-04-08T18:24:47.351459Z

under the hood they are quite similar, I think the differences are just down to tradeoffs for various usecases

mpenet 2026-04-08T18:29:27.678399Z

then I ran simple benchmarks, both chronicle-queue and k7 have tons of little details that can move the needle one way or the other, like fsync strategies & whatnot, I didn't do some deep analysis of chronicle-queue internals to do a benchmark that matches it super accurately. The underlying idea is the same, mmap'ed segment files, limiting allocs, etc... As long as one is careful not to be wasteful outside of this part the rest is just left to the OS to deal with and the differences are just in high level plumbing. Regardless I think the performance of both make them usable for almost any context.

mpenet 2026-04-08T18:37:35.784329Z

then chronicle-queue is old/established. k7 is a few evenings of fun-experiment, one-man-show πŸ™‚ But it works, so...

leifericf 2026-04-06T20:13:55.764329Z

I've had an idea mulling around in the back of my mind for quite a few years now. Today, I finally got around to prototyping it: > "Eido is a declarative, EDN-based language for creating graphics. Describe the image as data, not drawing instructions." You can find it here: https://eido.leifericf.com

πŸ†’ 7
❀️ 17
😍 2
πŸŽ‰ 33
8
leifericf 2026-04-11T07:45:34.286529Z

That's awesome! Thanks for letting me know. I wanted to create the best possible tool for generative art that I've always wanted for myself. And I honestly didn't even consider it could be useful for data visualization as well πŸ˜… Very cool.

leifericf 2026-04-11T07:58:34.287239Z

I've done a massive push this week to get it to β€œfeature complete” with optimized output for plotters, mills and CNC machines. And optimized output for print, etc.

✨ 1
leifericf 2026-04-11T07:58:44.285349Z

And to stabilize the API.

leifericf 2026-04-11T07:59:12.792769Z

Now I’m doing more extensive testing, bug fixing and polishing to remove the β€œBeta” tag.

leifericf 2026-04-11T08:00:46.148499Z

After that, I’ll see if it’s possible to squeeze out more performance without introducing GPU compute.

leifericf 2026-04-07T11:58:03.023559Z

Now Eido also has some basic 3D capabilities. See https://github.com/leifericf/eido?tab=readme-ov-file#3d-gallery. Still 100% Clojure with no external dependencies, as it's all CPU-based rendering.

🀩 2
πŸŽ‰ 5
leifericf 2026-04-07T13:59:48.568539Z

And now Eido also has some basic particle effects (https://github.com/leifericf/eido?tab=readme-ov-file#particle-gallery) πŸ™‚

seancorfield 2026-04-07T14:28:09.661479Z

Maybe post repeated follow-ups in #releases so you don't keep posting in the main #announcements channel?

leifericf 2026-04-07T14:28:36.242499Z

Sure

seancorfield 2026-04-07T14:28:45.387669Z

#announcements is intended for once-a-month cadence or just major releases, like your original post. Thanks.

πŸ‘ 1
leifericf 2026-04-07T14:28:50.894659Z

I wasn't aware of #releases Thanks for letting me know! And sorry for spamming.

πŸ‘πŸ» 1
Daniel Slutsky 2026-04-10T20:52:37.361299Z

Hi @leif.eric.fredheim, this is so inspiring! Today we played a bit with Eido in the https://scicloj.github.io/docs/community/groups/real-world-data/ (that meets regularly every week). We tried a few examples and looked into integrating them in the https://clojurecivitas.org/ blog. The session is recorded as unlisted video and shared internally in the Zulip chat (requires login): https://clojurians.zulipchat.com/#narrow/channel/315077-real-world-data/topic/recordings/near/584751580 recordings @ πŸ’¬>

πŸ‘ 1