c3kit: an open-source Clojure framework for full-stack apps — and Bucket just learned IndexedDB If you build ClojureScript applications and you've dealt with the pain of offline support, this one's for you. c3kit is a modular Clojure/ClojureScript framework we've been building and using in production at Clean Coders Studio. Four libraries, MIT-licensed, designed to work together or independently: Apron — The foundation. Schema validation and coercion, cross-platform time manipulation, logging, EDN/transit/CSV utilities, atom cursors. The things every Clojure app needs but nobody wants to write twice. All core modules are .cljc — they run on JVM, Babashka, and JS. Bucket — The data layer. A unified API (db/tx, db/find-by, db/entity) that works identically across Datomic, JDBC, in-memory stores, and — as of the latest release — IndexedDB in the browser. Write your data logic once. Swap the backend by changing configuration. Wire — The communication layer. AJAX, WebSocket support, asset fingerprinting, flash messages, drag-and-drop utilities. Everything you need to connect a ClojureScript client to a Clojure server. Scaffold — The build layer. ClojureScript compilation with watch mode, Garden CSS generation, environment-specific builds. The new IndexedDB addition is what prompted this post. Bucket now supports two strategies for browser-side persistence: - :primary — IndexedDB as the sole persistent store (think note-taking apps, local tools) - :cache — Server DB as authority, IndexedDB for offline resilience The :cache strategy handles the parts that make offline hard: dirty entity tracking that survives page refreshes, temporary negative IDs that get replaced with real server IDs on sync, deduplication to prevent duplicate writes, and optimistic updates with rollback. There's even service worker support for background sync when the browser closes. Alex Root-Roatch wrote a thorough walkthrough of the implementation, the sync lifecycle, and the current limitations (conflict resolution is last-write-wins for now — server-side detection is on you): https://cleancoders.com/blog/2026-04-07-lo-fi-clojurescript-making-local-first-applications-with-c3kit-bucket The code: https://github.com/cleancoders/c3kit-bucket The full framework: https://github.com/cleancoders/c3kit We'd love feedback from the community. PRs welcome.
Hi Ash! Sorry for the delayed response. our main website and internal apps all use stack and c3kit. http://cleancoders.com, http://cleancoders.com/studio, http://epic.cleancoders.com, http://poker.cleancoders.com. Those are all public and free to use.
Hi Gina, I'm just wondering if Clean Coders have published a small but runnable example application somewhere? E.g. a CLJS app sync-ing with a CLJ server. Thanks.