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)
Very cool! 🎸
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
Completely a tangent, how does a SIMD extension look in code?
https://github.com/DotFox/edn.c/blob/main/src/simd.c here and there are more in newline_finder and text_block parser
Interesting, so very much looks like you're pretty much aware of the instruction set.
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
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' 🚀
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
Great to see Max, that you are pursuing your passion for developing database tech!
could a WASM compiled sqlite be used in the browser?
very cool to see sqlite used like thsi
Yes, it could be used in a browser. There is a JS lib for the Tuple encoding: https://github.com/josephg/fdb-tuple
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)
@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.
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
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
Very cool project! Would love to try it out sometime.
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?
cljs in the browser is a pain because you have to make the whole codebase async.
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.
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.
wouldn't a speculative transaction keep a separate in-memory representation of the not-really-committed datoms, and merge those at query time?
what about creating views where t<=something and using INSTEAD_OF triggers for modifying them
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.
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?
It's different, since my goal is to serve the database as a value (with time-travel) like Datomic does.
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.or this option is not actually supported for sqlite?
@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.
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-bytes
• https://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
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
Special shout-out to @doppiaelle1999 for helping me with issue 1882!
Also, new CLJS release. Thanks @dnolen! https://clojurians.slack.com/archives/C03S1L9DN/p1764005908951239
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.