announcements

Kirill Chernyshov 2025-11-24T09:34:05.267949Z

Announcing https://github.com/DotFox/edn.c - highly optimized EDN reader written in C. Highlights: • fast, SIMD accelerated where possible • zero-copy with centralized memory management design • no external dependencies • support custom readers for tagged literals • can be compiled into 3 main modifications (every feature can be also enabled/disabled separately): ◦ pure EDN spec ◦ clojure.edn with: ▪︎ ratio ▪︎ extended integers forms: hex, octal, binary and arbitrary radix ▪︎ map namespace syntax ▪︎ metadata ▪︎ characters missing from basic specification: \formfeed, \backspace and octal form \oNNN ◦ "human-readable EDN" aka. HEDN (highly experimental features not supported neither by clojure nor EDN specification) ▪︎ Java' https://docs.oracle.com/javase/8/docs/technotes/guides/language/underscores-literals.html: 1_000_000, 3.14_15, 0xFF_EC_DE_5E, 1_500e10, 07_77, 2r1010_1010, 36rZ_Z ▪︎ Java' https://openjdk.org/jeps/378 • WASM bindings to be used from Javascript (tested on Node and browser)

🆒 3
🔥 19
🦾 9
👌 2
🚀 2
🎉 34
Peter Taoussanis 2025-11-24T09:36:16.120409Z

Very cool! 🎸

1
👋 1
Kirill Chernyshov 2025-11-24T09:56:55.551039Z

there is also example TUI to visualize and navigate EDN compile it with

make clean tui EXTENDED_INTEGERS=1 RATIO=1 MAP_NAMESPACE_SYNTAX=1 EXTENDED_CHARACTERS=1 METADATA=1 TEXT_BLOCKS=1 EXTENDED_INTEGERS=1
then
./examples/edn_tui ./docs/showcase.edn

❤️ 3
dominicm 2025-11-25T11:15:00.452719Z

Completely a tangent, how does a SIMD extension look in code?

Kirill Chernyshov 2025-11-25T11:16:52.739929Z

https://github.com/DotFox/edn.c/blob/main/src/simd.c here and there are more in newline_finder and text_block parser

dominicm 2025-11-25T11:19:16.566799Z

Interesting, so very much looks like you're pretty much aware of the instruction set.

Kirill Chernyshov 2025-11-25T11:25:07.690179Z

frankly, I didn't know about their existence until I ran very first benchmark 🙂 then I start looking for performance improvements in optimised json parsers and did extensive research using LLMs. But I can't say I know them all and probably there are places that can have better/faster implementation. Yesterday I was shared with an absolutely wonderfully in-depth article about the details of SIMD instructions. reading it now https://developer.arm.com/community/arm-community-blogs/b/servers-and-cloud-computing-blog/posts/porting-x86-vector-bitmask-optimizations-to-arm-neon

2025-11-26T17:40:43.662449Z

@jeaye Jank could have the fastest EDN parser with this 👀

💯 2
jeaye 2025-11-26T19:33:43.930819Z

@emma.audrey.g Could be! We can do some benchmarking next year.

💛 1
maxweber 2025-11-24T09:35:16.246559Z

Announcing https://github.com/maxweber/dbval A proof of concept of a Datomic-like database library on top of Sqlite https://github.com/maxweber/dbval is a fork of https://github.com/tonsky/datascript and a proof-of-concept (aka 'do not use it in production') that you can implement a library that offers Datomic-like semantics on top of a mutable relational database like Sqlite. The most important goal is to serve the database as a value, meaning you can get the current database value and query it as long as you like without that it changes underneath you. You can also get the database as a value for any point in the past. Read the full story in the https://github.com/maxweber/dbval/blob/main/README.md At the moment dbval is a hobby project that I hack on in my very rare spare time. I would be very happy if a few people from the Clojure community would help me to turn this into something 'production-ready' 🚀

👍 11
👏 1
4
🚀 5
🎉 21
dergutemoritz 2025-12-17T13:47:46.541689Z

FWIW when WAL mode is enabled, concurrent readers aren't blocked by writers: > Writers merely append new content to the end of the WAL file. Because writers do nothing that would interfere with the actions of readers, writers and readers can run at the same time. However, since there is only one WAL file, there can only be one writer at a time. https://www.sqlite.org/wal.html#concurrency

👍 1
Mateusz Mazurczak 2025-11-24T09:50:01.387599Z

Great to see Max, that you are pursuing your passion for developing database tech!

❤️ 1
tatut 2025-11-24T10:27:33.006779Z

could a WASM compiled sqlite be used in the browser?

tatut 2025-11-24T10:32:43.457039Z

very cool to see sqlite used like thsi

❤️ 1
maxweber 2025-11-24T10:34:42.955619Z

Yes, it could be used in a browser. There is a JS lib for the Tuple encoding: https://github.com/josephg/fdb-tuple

maxweber 2025-11-24T10:35:40.286519Z

ATM the CLJS part is broken, but it would also be very interesting to run it in Cloudflare Workers (which can do sync Sqlite reads)

maxweber 2025-11-24T10:38:47.427149Z

@tatut it would also work without Sqlite at all in the browser. Datascript's persistent-set could be used again and the data could be stored in IndexDB. Then you have something like Datascript but with database as a value semantics.

tatut 2025-11-24T12:42:19.201759Z

idk if you want to encourage people to use this (yet), but the README could use a quick start example of how to start it up

maxweber 2025-11-24T12:51:33.968299Z

atm I primarily want to check if anyone likes to invest some time to polish it to something that could be used for real-world applications. I added a quickstart note to the readme how to start hacking on the project: https://github.com/maxweber/dbval?tab=readme-ov-file#quickstart

👍 2
srihari 2025-11-24T14:57:05.672449Z

Very cool project! Would love to try it out sometime.

❤️ 1
Josh 2025-11-24T15:57:05.130909Z

This is very cool! I tried to port datascript to sqlite a few months ago but I ran into issues with my use case. Were you able to get db-with in memory "forks" of the database working?

❤️ 1
Josh 2025-11-24T16:00:03.942159Z

cljs in the browser is a pain because you have to make the whole codebase async.

maxweber 2025-11-24T19:34:01.828039Z

Regrettably, one of the trade-offs of using a mutable set is that forking is not free (no structural sharing). I had to adapt a lot of the Datascript tests where the db value was "forked". db-with will not be possible. At least copying the Sqlite file to do what-if modifications is more straight-forward in comparison to other relational databases.

Josh 2025-11-24T19:42:54.265119Z

ah that is what I ran into as well. I thought maybe you could maintain a separate table for every fork and merge the tables at query time, but at least for my use case having an in memory fork is ideal so I dropped the project.

tatut 2025-11-25T04:43:41.682239Z

wouldn't a speculative transaction keep a separate in-memory representation of the not-really-committed datoms, and merge those at query time?

fmjrey 2025-11-25T05:10:52.897589Z

what about creating views where t<=something and using INSTEAD_OF triggers for modifying them

maxweber 2025-11-25T06:56:51.104329Z

Probably, both possible. DataScript and therefore dbval only needs a sorted-set abstraction. Another sorted-set implementation could read from Sqlite and keep the what-if / db-with datoms in-memory.

👍 1
dominicm 2025-11-25T11:14:21.167649Z

Datascript does support other extensions for integrating other backend stores. Is this an async version of that API for working with JavaScript & Sqlite or something completely different?

maxweber 2025-11-25T18:31:48.240799Z

It's different, since my goal is to serve the database as a value (with time-travel) like Datomic does.

onetom 2025-12-12T17:59:19.881519Z

would a transaction work for speculation purposes?

(next.jdbc/with-transaction [tx "jdbc:sqlite:/tmp/x.sqlite" {:rollback-only true}]
    ,,,)
i think transactions are not nestable, though, but d/with is also not officially supported inside transaction functions, iirc.

onetom 2025-12-12T17:59:59.316029Z

or this option is not actually supported for sqlite?

maxweber 2025-12-16T07:26:11.215159Z

@onetom using a Sqlite transaction would work, but Sqlite is a single writer system, so all other transactions would be blocked, which might be okay for some use cases.

👍 1
borkdude 2025-11-24T19:17:39.798009Z

Babashka https://github.com/babashka/fs: file system utility library for Clojure 0.5.26 - 0.5.29 (2025-11-24) • https://github.com/babashka/fs/issues/165: zip now excludes zip-file from zip-file (https://github.com/lread) • https://github.com/babashka/fs/issues/167: add root fn which exposes Path getRoot (https://github.com/lread) • https://github.com/babashka/fs/issues/166: copy-tree now fails fast on attempt to copy parent to child (https://github.com/lread) • https://github.com/babashka/fs/issues/152: an empty-string path "" is now (typically) understood to be the current working directory (as per underlying JDK file APIs) (https://github.com/lread) • https://github.com/babashka/fs/issues/155: fs/with-temp-dir clj-kondo linting refinements (https://github.com/lread) • https://github.com/babashka/fs/issues/162: unixify no longer expands into absolute path on Windows (potentially BREAKING) • Add return type hint to read-all-byteshttps://github.com/babashka/fs/issues/147: fs/unzip should allow selective extraction of files (https://github.com/sogaiu) • Improve documentation of create-sym-link and create-link • Fix wrong type hint in private function u+wx • Doc improvements (https://github.com/gaverhae) • https://github.com/babashka/fs/issues/145: fs/modified-since works only with ms precision but should support the precision of the filesystem

😍 4
🎉 23
borkdude 2025-11-24T19:45:33.212479Z

Special shout-out to @lee for helping a lot with fs!

❤️ 5
borkdude 2025-11-24T19:44:23.250559Z

And a new bb! https://github.com/babashka/babashka: Native, fast starting Clojure interpreter for scripting 1.12.210 (2025-11-24) • Fix https://github.com/babashka/babashka/issues/1882: support for reifying java.time.temporal.TemporalField (https://github.com/EvenMoreIrrelevance) • Bump Selmer to 1.12.65 • SCI: sci.impl.Reflector was rewritten into Clojure • dissoc on record with non-record field should return map instead of record • Bump edamame to 1.5.35 • Bump core.rrb-vector to 0.2.0 • Migrate detecting of executable name for self-executing uberjar executable from ProcessHandle to to native image ProcessInfo to avoid sandbox errors • Bump cli to 0.8.67 • Bump fs to 0.5.29 • Bump nextjournal.markdown to 0.7.201 Most of the included library bumps have been mentioned in #releases in the past few weeks/days. Thanks to all users, contributors and clojurists-together github-dark sponsors gratitude for keeping bb alive! babashka

13
❤️ 17
🎉 1
borkdude 2025-11-24T19:45:53.865859Z

Special shout-out to @doppiaelle1999 for helping me with issue 1882!

borkdude 2025-11-24T19:51:03.091419Z

Also, new CLJS release. Thanks @dnolen! https://clojurians.slack.com/archives/C03S1L9DN/p1764005908951239

40
🔥 2
🎉 6
2025-11-24T21:49:43.585689Z

I am announcing the release of a repository template showcasing how a FastAPI Basilisp (= python) REST server can be called from Clojure. https://github.com/behrica/dual This is one more scenario of using Python libraries from Clojure. It's devcontainer driven, so quick setup guarantied when using VSCode. Similar setups can of course be done using R / Julia / Rust / C++ or any other non-JVM language.

10
🙏 3
🐍 6
🎉 1