5 Tablecloth views
Raw Zulip messages — pulled via scicloj.zulipdata.pull — are nested maps with snake_case keys. Suitable for some uses but inconvenient for analysis. scicloj.zulipdata.views offers four projections that turn a sequence of raw messages into tablecloth datasets — flat, simple-valued, ready for grouping and plotting.
Two design choices worth knowing about:
Raw messages stay the source of truth. The views are computed on demand; nothing is cached at the dataset layer. Pulling once and re-projecting many times is cheap.
Each view is “long” by structure. One row per message in the timeline, one row per (message, reaction) in
reactions-long, and so on. That keeps latertc/group-bycalls straightforward.
(ns zulipdata-book.views
(:require
;; Zulipdata pull -- paginated, cached channel history
[scicloj.zulipdata.pull :as pull]
;; Zulipdata views -- tablecloth projections of raw messages
[scicloj.zulipdata.views :as views]
;; Kindly -- notebook rendering protocol
[scicloj.kindly.v4.kind :as kind]
;; Tablecloth -- dataset manipulation
[tablecloth.api :as tc]))What’s a Tablecloth dataset?
The four views below produce Tablecloth datasets — columnar tables backed by typed arrays, the Clojure equivalent of an R data frame or a Python pandas DataFrame. The core implementation is tech.ml.dataset; Tablecloth is a higher-level wrapper with ergonomic operations for filtering, grouping, and aggregating.
This chapter does not teach Tablecloth — see its documentation for that. The views are ordinary datasets: any Tablecloth operation works on them directly.
Setting up a sample
We use a small web-public sample throughout this chapter so the view contents — sender names, topic strings, message bodies — can be shown without leaking anything login-gated. Web-public means the channel is readable on clojurians.zulipchat.com without a Zulip account; see Web-public channels in the client chapter.
The channels are small enough to render quickly, varied enough that every view has non-empty rows, and have overlapping contributors so the cross-channel analyses in Narrative and Graph views are non-trivial. Later runs are served from the cache.
(def sample-channels
["clojurecivitas" "scicloj-webpublic" "gratitude" "events"])(def messages
(->> (pull/pull-channels! sample-channels)
(filter (fn [[k _]] (string? k)))
(mapcat (fn [[_ r]] (pull/all-messages r)))))(count messages)1096One row per message
messages-timeline is the primary view. One row per message, only simple-valued columns — no reactions list, no edit history, no nested topic-link records. Those live in their own views. For an anonymized parallel that drops sender names and message content, see anonymized-timeline.
(def timeline (views/messages-timeline messages))(tc/row-count timeline)1096The columns (sorted alphabetically):
(-> timeline tc/column-names sort)(:channel
:client
:content
:content-length
:edited
:id
:instant
:last-edit-ts
:sender
:sender-id
:stream-id
:subject
:timestamp)The whole dataset, freshest first. Inline emoji codes (:gratitude:, :pray:) and @**Real Name** mentions are how Zulip marks content; they pass through verbatim.
(-> timeline
(tc/order-by :instant :desc))_unnamed [1096 13]:
| :instant | :content | :last-edit-ts | :client | :channel | :stream-id | :edited | :content-length | :id | :sender | :sender-id | :timestamp | :subject |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2026-05-02T18:42:10Z | These days, we are exploring Babashka for data analysis and using Babqua for interactive data visualization. This time, we are looking into @**Gert Goet**’s Clojure Events Calendar Feed. | website | clojurecivitas | 528764 | false | 186 | 592473831 | Daniel Slutsky | 138175 | 1777747330 | Datavis in Babashka: analysing our calendar feed | |
| 2026-05-02T18:39:21Z | Datavis in Babashka: analysing our calendar feed | ZulipZapierApp | clojurecivitas | 528764 | false | 130 | 592473657 | Civitas | 942591 | 1777747161 | Datavis in Babashka: analysing our calendar feed | |
| by Daniel Slutsky | ||||||||||||
| 2026-05-02T16:31:38Z | lovely :smile: | ZulipElectron | clojurecivitas | 528764 | false | 14 | 592462084 | Timothy Pratley | 550430 | 1777739498 | Hello, Babashka | |
| 2026-05-02T15:01:33Z | Dark mode in mermaid works now, thanks @**Timothy Pratley**. | website | clojurecivitas | 528764 | false | 60 | 592454894 | Daniel Slutsky | 138175 | 1777734093 | Hello, Babashka | |
| 2026-05-01T17:15:48Z | https://github.com/scicloj/babqua/issues/1 | website | clojurecivitas | 528764 | false | 42 | 592324446 | Daniel Slutsky | 138175 | 1777655748 | Hello, Babashka | |
| 2026-05-01T17:13:13Z | :thumbs_up: | ZulipElectron | clojurecivitas | 528764 | false | 11 | 592323987 | Timothy Pratley | 550430 | 1777655593 | Hello, Babashka | |
| 2026-05-01T17:12:20Z | Kindly is handled in a very ad-hoc way at the moment: | website | clojurecivitas | 528764 | false | 130 | 592323846 | Daniel Slutsky | 138175 | 1777655540 | Hello, Babashka | |
| https://github.com/scicloj/babqua/blob/6f9f703/_extensions/bb/runtime.bb#L74 | ||||||||||||
| 2026-05-01T17:11:14Z | Oh, thanks. | website | clojurecivitas | 528764 | false | 11 | 592323688 | Daniel Slutsky | 138175 | 1777655474 | Hello, Babashka | |
| 2026-05-01T17:08:06Z | In dark mode the mermaid connection lines are not very visible. This might be fixed by adding the class “mermaid” (which is what happens here: https://clojurecivitas.org/scicloj/clay/mermaid.html) | ZulipElectron | clojurecivitas | 528764 | false | 911 | 592323242 | Timothy Pratley | 550430 | 1777655286 | Hello, Babashka | |
| “mermaid” and “js-plotly-plot” classes currently have their hue inverted for this purpose: | ||||||||||||
| https://github.com/ClojureCivitas/clojurecivitas.github.io/blob/68b5e81b4733aea601d0e5822eb88fa9b2adbdf6/site/styles.scss#L33 | ||||||||||||
| Alternatively this could be addressed by setting a background or using other properties to identify when hue should be inversed. In any case dark mode is just a minor issue but mentioning some details if you are curious. | ||||||||||||
| The tree of babashka icons looks really cool! | ||||||||||||
| How does kindly work? Is it using Clay or kindly-render or a custom implementation? | ||||||||||||
| Should we also hope for a Clojurqua? (Maybe Babashqua fills this need) | ||||||||||||
| Looking forward to hearing more details at the real-world-data meeting. | ||||||||||||
| 2026-05-01T16:51:39Z | amazing! | ZulipElectron | clojurecivitas | 528764 | false | 8 | 592320484 | Timothy Pratley | 550430 | 1777654299 | Hello, Babashka | |
| … | … | … | … | … | … | … | … | … | … | … | … | … |
| 2020-10-30T14:02:27Z | Title: Scicloj meeting: Clojure and Data Science in Healthcare | website | events | 262224 | false | 584 | 215098041 | Daniel Slutsky | 138175 | 1604066547 | 2020-11-01 Clojure and Data Science in Health Care | |
| Time: 2020-11-01T18:00 (local time) | ||||||||||||
| Description: This is our first in a series of public meetings about healthcare. | ||||||||||||
| In this meeting, the main theme will be knowledge management. | ||||||||||||
| Agenda: | ||||||||||||
| * @**Sivaram Arabandi** : “Biomedical Ontologies - Design Patterns and Applications” | ||||||||||||
| * Pier Federico Gherardini: “CANDEL: A platform for biological data science using Clojure, R, and Datomic” | ||||||||||||
| * Discussion | ||||||||||||
| Moderator: @**Joao Santiago** | ||||||||||||
| RSVP: https://tinyurl.com/yxl3xh7o | ||||||||||||
| 2020-10-29T19:48:44Z | Title: Practicallli Live: Solving Exercism.io code challenges with regular expressions | 1604226031 | ZulipElectron | events | 262224 | true | 419 | 215018579 | John Practicalli | 138822 | 1604000924 | 2020-10-31 Practicalli Live Coding broadcast |
| Time: 2020-10-31T09:00–10:00 (local time) | ||||||||||||
| Description: Live coding broadcast covering the “Bob” challenge from Exercise.io. Walking through several approaches to solve the chalky and using a lot of different regular expression patterns. | ||||||||||||
| RSVP: https://youtu.be/QKBZYSITkRc | ||||||||||||
| 2020-10-27T16:34:49Z | Let’s use this topic for IRC-style, pile on discussion | ZulipElectron | events | 262224 | false | 54 | 214726580 | Gert Goet | 137562 | 1603816489 | untopic | |
| 2020-10-27T16:27:46Z | This topic serves as a stream-description. Please use another topic to discuss this README, e.g. #events> or DM me. | 1769702859 | ZulipElectron | events | 262224 | true | 990 | 214725391 | Gert Goet | 137562 | 1603816066 | README |
| ## usage | ||||||||||||
| - users are encouraged to announce events that are interesting and (remotely) accessible to the wider Clojure community | ||||||||||||
| - in order for an event to show up in the ‘Clojurians Events’ ical-feed, use the events-cli | ||||||||||||
| - it can take up to 2 hours to show up in the calendar-feed, if nothing appears or things look off: DM me | ||||||||||||
| - the ical-feed powers the community events-page on clojure.org, there’s a webview and events show up in the sidebar on https://www.reddit.com/r/Clojure/ | ||||||||||||
| - users are invited to join the discussion in the event’s topic | ||||||||||||
| - any generic event-related discussion can go in other topics, or in #events> | ||||||||||||
| Enjoy! | ||||||||||||
| 2020-10-27T12:04:08Z | Title: Scicloj meeting: Clojure in Geography II – a meeting with Joanne Cheng | 1603800419 | ZulipElectron | events | 262224 | true | 411 | 214689967 | Gert Goet | 137562 | 1603800248 | 2020-11-21 Clojure in Geography (Joanne Cheng) |
| Time: 2020-11-21T16:00 (local time) | ||||||||||||
| Description: On our next public meeting in the short series about Clojure in Geography, we will hear a talk by Joanne Cheng. | ||||||||||||
| After the talk, we will have a discussion. | ||||||||||||
| The meeting will be 2 hours long. | ||||||||||||
| RSVP: https://tinyurl.com/yxoqj2mb | ||||||||||||
| 2020-10-27T11:59:36Z | Title: Scicloj meeting: Reveal – Read Eval Visualize Loop | 1603800432 | ZulipElectron | events | 262224 | true | 306 | 214689506 | Gert Goet | 137562 | 1603799976 | 2020-11-07 Reveal – Read Eval Visualize Loop |
| Time: 2020-11-07T20:00 (local time) | ||||||||||||
| Description: A meeting with Vlad Protsenko about Reveal – Read Eval Visualize Loop | ||||||||||||
| https://vlaaad.github.io/reveal/ | ||||||||||||
| RSVP: https://tinyurl.com/y2qj7m8k | ||||||||||||
| 2020-10-27T11:48:49Z | Title: Dark CIDER (by Bozhidar Batsov) | 1604325748 | ZulipElectron | events | 262224 | true | 832 | 214688628 | Gert Goet | 137562 | 1603799329 | 2020-11-17 Dark CIDER (Bozhidar Batsov) |
| Time: 2020-11-17T18:30 (local time) | ||||||||||||
| Description: Bozhidar Batsov (https://github.com/bbatsov) will show some of the lesser-known CIDER | ||||||||||||
| features. | ||||||||||||
| Bozhidar is the maintainer of CIDER, nREPL, and many Clojure libraries | ||||||||||||
| related to Clojure tooling. He’s also the editor of the community | ||||||||||||
| Clojure style guide. He is also very known in the Emacs world as the | ||||||||||||
| author Prelude Emacs, Projectile and many other Emacs packages. He | ||||||||||||
| loves the Lisp family of languages and the functional programming in | ||||||||||||
| general and Clojure in particular. He is a frequent conference speaker | ||||||||||||
| and he practices and promotes “Conference Driven Development” (the art | ||||||||||||
| of developing stuff to show off at conferences). | ||||||||||||
| RSVP: https://www.meetup.com/London-Clojurians/events/274159509/ | ||||||||||||
| 2020-10-27T11:43:49Z | Title: Discoverable Hypermedia-Driven RESTful Web Services in Clojure (HATEOAS) | 1603800481 | ZulipElectron | events | 262224 | true | 869 | 214688158 | Gert Goet | 137562 | 1603799029 | 2020-11-10 HATEOAS in Clojure |
| Time: 2020-11-10T18:30 (local time) | ||||||||||||
| Description: Daniel Zurawski (https://www.linkedin.com/in/daniel-zurawski-8b107a32) will be presenting | ||||||||||||
| Hypermedia as the Engine of Application State for microservice | ||||||||||||
| architectures, including a demonstration of how you can build a | ||||||||||||
| discoverable Hypermedia-Driven RESTful Web Service in Clojure using | ||||||||||||
| bidi, liberator, halboy, hype and OpenTelemetry. | ||||||||||||
| Daniel is a Senior Software Developer at Kroo, helping to build a new | ||||||||||||
| digital bank where money meets friends using Clojure. Previously | ||||||||||||
| Technical Lead at SuperAwesome (now part of Epic Games). Passionate | ||||||||||||
| about products & startups, functional programming, cloud | ||||||||||||
| infrastructure, and messy data. | ||||||||||||
| RSVP: https://www.meetup.com/London-Clojurians/events/274159868/ | ||||||||||||
| 2020-10-23T14:18:41Z | @_Gert Goet|137562 renamed stream meetups to events. | Internal | events | 262224 | false | 64 | 214319002 | Notification Bot | 100006 | 1603462721 | stream events | |
| 2020-10-21T17:59:54Z | Title: babashka and sci internals (by Michiel Borkent) | 1603800491 | ZulipElectron | events | 262224 | true | 673 | 214090081 | Gert Goet | 137562 | 1603303194 | 2020-12-01 babashka and sci internals (Michiel Borkent) |
| Time: 2020-12-01T18:30 (local time) | ||||||||||||
| Description: Michiel Borkent (https://github.com/borkdude) doesn’t really need introductions in our community. He is the main author of clj-kondo, babashka, jet and so many other Clojure tools. He can be found as @borkdude in various places on the web. | ||||||||||||
| In this talk, Michiel will tell us more about the internals of babashka and sci (Small Clojure Interpreter). A really good opportunity to gain a better understanding of how this increasingly popular tool is built. | ||||||||||||
| RSVP: https://www.meetup.com/London-Clojurians/events/274014078/ | ||||||||||||
| 2020-10-21T17:54:51Z | Stream created by @_Gert Goet|137562. | Internal | events | 262224 | false | 41 | 214089389 | Notification Bot | 100006 | 1603302891 | stream events |
The :instant column is a Java Instant derived from :timestamp (epoch seconds). Both are kept — :timestamp is good for arithmetic, :instant for display and time-zone work.
(-> timeline :instant first type)java.time.InstantThe :edited column is a structural derivation from the raw message — true exactly when :last_edit_timestamp is present:
(-> timeline (tc/select-rows :edited) tc/row-count)188One row per reaction
A message can have any number of reactions. reactions-long flattens them into a one-row-per-reaction dataset, with the message-level identifiers carried alongside.
(def reactions (views/reactions-long messages))reactions_unnamed [464 9]:
| :message-id | :channel | :user-id | :stream-id | :emoji-name | :message-ts | :emoji-code | :subject | :reaction-type |
|---|---|---|---|---|---|---|---|---|
| 538989269 | clojurecivitas | 550430 | 528764 | sunglasses | 1757657770 | 1f60e | licenses | unicode_emoji |
| 539107122 | clojurecivitas | 360348 | 528764 | eyes | 1757692816 | 1f440 | A browser based REPL+chart with Scittle Kitchen | unicode_emoji |
| 539269032 | clojurecivitas | 727865 | 528764 | +1 | 1757767746 | 1f44d | licenses | unicode_emoji |
| 539790735 | clojurecivitas | 550430 | 528764 | idea | 1758034149 | 1f4a1 | licenses | unicode_emoji |
| 539790735 | clojurecivitas | 550430 | 528764 | cherries | 1758034149 | 1f352 | licenses | unicode_emoji |
| 539790735 | clojurecivitas | 727865 | 528764 | idea | 1758034149 | 1f4a1 | licenses | unicode_emoji |
| 540372606 | clojurecivitas | 360348 | 528764 | eyes | 1758257686 | 1f440 | licenses | unicode_emoji |
| 540764004 | clojurecivitas | 360348 | 528764 | heart | 1758537161 | 2764 | licenses | unicode_emoji |
| 554351948 | clojurecivitas | 138175 | 528764 | thank_you | 1762529944 | 1f64f | slack channel | unicode_emoji |
| 556771814 | clojurecivitas | 360348 | 528764 | slight_smile | 1763368850 | 1f642 | clojure-like languages | unicode_emoji |
| … | … | … | … | … | … | … | … | … |
| 554570212 | events | 137562 | 262224 | eyes | 1762701468 | 1f440 | calendar feed viewer error | unicode_emoji |
| 554774781 | events | 138175 | 262224 | thank_you | 1762802516 | 1f64f | 2026-05-09 Dutch Clojure Days free conference | unicode_emoji |
| 554795363 | events | 138175 | 262224 | thank_you | 1762810283 | 1f64f | 2026-05-09 Dutch Clojure Days free conference | unicode_emoji |
| 554795363 | events | 137562 | 262224 | thank_you | 1762810283 | 1f64f | 2026-05-09 Dutch Clojure Days free conference | unicode_emoji |
| 562615145 | events | 459181 | 262224 | heart | 1765266041 | 2764 | 2025-12-12 Clojure real-world-data 36 | unicode_emoji |
| 562615145 | events | 979439 | 262224 | heart | 1765266041 | 2764 | 2025-12-12 Clojure real-world-data 36 | unicode_emoji |
| 573422332 | events | 899206 | 262224 | heart | 1770862096 | 2764 | 2026-02-11 Los Angeles Clojure Meetup: Clay | unicode_emoji |
| 573591121 | events | 550430 | 262224 | smiley | 1770920504 | 1f603 | 2026-02-11 Los Angeles Clojure Meetup: Clay | unicode_emoji |
| 573591121 | events | 202392 | 262224 | folded_hands | 1770920504 | 1f64f | 2026-02-11 Los Angeles Clojure Meetup: Clay | unicode_emoji |
| 581834590 | events | 760531 | 262224 | tada | 1774514202 | 1f389 | 2026-04-25 Clojure Community Check-In | unicode_emoji |
| 582024774 | events | 430507 | 262224 | heart | 1774554138 | 2764 | 2026-04-16 Clojure Documentary Premiere | unicode_emoji |
(-> reactions tc/column-names sort)(:channel
:emoji-code
:emoji-name
:message-id
:message-ts
:reaction-type
:stream-id
:subject
:user-id)Top emoji across the sample, by reaction count:
(-> reactions
(tc/group-by [:emoji-name])
(tc/aggregate {:n tc/row-count})
(tc/order-by [:n] [:desc])
(tc/head 5))_unnamed [5 2]:
| :emoji-name | :n |
|---|---|
| +1 | 124 |
| heart | 78 |
| tada | 68 |
| gratitude | 39 |
| thank_you | 20 |
One row per edit
Zulip stores an edit_history for every message that has been edited or moved. edits-long flattens those events. Note: an “edit” here may be a content edit, a topic move, or a stream move — :prev-content, :prev-subject, and :prev-stream indicate which by being non-nil.
(def edits (views/edits-long messages))edits_unnamed [337 8]:
| :message-id | :stream-id | :channel | :edit-ts | :edit-user-id | :prev-content | :prev-subject | :prev-stream |
|---|---|---|---|---|---|---|---|
| 538933920 | 528764 | clojurecivitas | 1757622002 | 550430 | Where should we discuss ClojureCivitas? | ||
| One option is to enable discussion on the site itself: | |||||||
| https://quarto.org/docs/output-formats/html-basics.html#commenting | |||||||
| 538950637 | 528764 | clojurecivitas | 1757633171 | 360348 | Things I know for sure about GPL: | ||
| - On your laptop you can do, from a GPL standpoint, whatever you want | |||||||
| - It never violates the GPL to publish source code | |||||||
| - GPL pertains to published “object-code”. An example for an “object-code” is a binary compiled from C source-code. | |||||||
| - It violates the GPL to publish a single “object-code” file which is generated from several source files which are partly GPL and partly Eclipse-EPL | |||||||
| - Dynamically linking a GPL “object-code” to a non-GPL “Systems library” is permissable under GPL. An example for a “Systems library” is the window-system of an operating system. | |||||||
| The above is what I know for sure. | |||||||
| I do not know for sure, but I think it is fair to say: | |||||||
A js-files compiled from a cljs-file (e.g. using shadow-cljs) is “object-code”. Thus it would clearly violate the GPL to publish a single file scittle.js that exposes both clojure.core (EPL) and Emmy (GPL). But we do not do that. |
|||||||
| My wishful thinking is: | |||||||
Since, in scittle-kitchen, Emmy is a plugin, Emmy is dynamically linked to a “Systems library”. The “Systems library” is the file https://cdn.jsdelivr.net/npm/scittle-kitchen/dist/scittle.js. |
|||||||
| But to be honest, I think my argument in my wishful thinking is a very weak one in favour of the view that including Emmy in scittle-kitchen is strictly GPL complient. | |||||||
| 539396600 | 528764 | clojurecivitas | 1757845220 | 360348 | @**Timothy Pratley** I do not know anyone at Juxt to get in touch with. It’s just that a post from 4 years ago popped up in my mind and I re-shared because getting opinion on licensing from a substantial source is hard to come by. Substantial also in view of the non-Juxt people mentioned at the end of the article who contributed. So: while I will not take further action, yes, certainly I would find it great if you got in touch with Juxt. | ||
| 539790735 | 528764 | clojurecivitas | 1758034537 | 360348 | @**Jarkko Saltiola** In re-reading your slack posts above, I think one short suggestion of yours has gone unnoticed: “use something like Squint/Cherry to output transpiled JS”. In this vain I think that compiling SCI+Scittle using Cherry (instead of currently used Shadow-CLJS) would be a huge step forward. Of course such a Cherry-compile is a long term goal given all the libraries of Scittle-kitchen. Nontheless… | ||
| … I’d like to clarify further: it is the Google-Closure compiler (not the EPL-licence of Clojure-core) that makes scittle-kitchen prone to violating the GPL. This is because it is Google-Closure’s idiomatic tree-shaking that makes theJavaScript files of Scittle-kitchen linked together in an unusually static way. | |||||||
| Using Cherry, all Scittle-kitchen components would be linked together in a less static and much more dynamical way. And with this thought, I think it makes sense to keep going with Scittle-kitchen, keep the Google-Closure issue at the back of one’s mind and keep an eye on Cherry. | |||||||
| 539790735 | 528764 | clojurecivitas | 1758034449 | 360348 | @**Jarkko Saltiola** In re-reading your slack posts above, I think one short suggestion of yours has gone unnoticed: “use something like Squint/Cherry to output transpiled JS”. In this vain I think that compiling SCI+Scittle using Cherry (instead of currently used Shadow-CLJS) would be a huge step forward. Of course such a Cherry-compile is a long term goal given all the libraries of Scittle-kitchen. Nontheless… | ||
| … I’d like to clarify further: it is the Google-Closure compiler (not the EPL-licence of Clojure-core) that makes scittle-kitchen prone to violating the GPL. This is because it is Google-Closure’s idiomatic tree-shaking that makes all JavaScript artefacts of Scittle-kitchen linked together in an unusually static way. | |||||||
| Using Cherry, all Scittle-kitchen components would be linked together in a less static and much more dynamical way. And with this thought, I think it makes sense to keep going with Scittle-kitchen, keep the Google-Closure issue at the back of one’s mind and keep an eye on Cherry. | |||||||
| 539790735 | 528764 | clojurecivitas | 1758034338 | 360348 | @**Jarkko Saltiola** In re-reading your slack posts above, I think one short suggestion of yours has gone unnoticed: “use something like Squint/Cherry to output transpiled JS”. In this vain I think that compiling SCI+Scittle using Cherry (instead of currently used Shadow-CLJS) would be a huge step forward. Of course such a Cherry-compile is a long term goal given all the libraries of Scittle-kitchen. Nontheless… | ||
| … I’d like to clarify further: it is the Google-Closure compiler (not the EPL-licence of Clojure-core) that makes scittle-kitchen prone to violating the GPL. This is because it is Google-Closure’s idiomatic tree-shaking that makes all components of Scittle-kitchen linked together in an unusually static way. | |||||||
| Using Cherry, all Scittle-kitchen components would be linked together in a less static and much more dynamical way. And with this thought, I think it makes sense to keep going with Scittle-kitchen, keep the Google-Closure issue at the back of one’s mind and keep an eye on Cherry. | |||||||
| 540372606 | 528764 | clojurecivitas | 1758257728 | 727865 | I noted this Juxt article earlier too. London Clojurians talk by Martin Clausen 2023 also discusses on issues with EPL-1.0 https://youtu.be/m478BHGR3XU?si=L8bHieqN_6I6KXxa&t=1678. | ||
| Few notes: | |||||||
| - Unclear why Clojure is kept EPL-1.0 (while EPL-2.0 could provide GPL compatibility). | |||||||
| - EPL-1.0 brings implications that people might not realize/know due to copyleft requirement. | |||||||
| - Definition of derivative work is unclear (situation leading to copyleft trigger), license FAQ page stating “You will need to seek advice of your own legal councel” (https://www.eclipse.org/legal/epl/faq/#DERIV). | |||||||
| 542872696 | 528764 | clojurecivitas | 1759470409 | 727865 | One more answer regarding the backgrounds: | ||
| > I will not be dual licensing with GPL or LGPL. Both licenses allow the creation of derived works under GPL, a license I cannot use in my work. Allowing derived works I cannot use is not reciprocal and make no sense for me. | |||||||
| – Rich (according to https://gist.github.com/reborg/dc8b0c96c397a56668905e2767fd697f#why-clojure-is-not-licensed-under-gpl-mit-etc) | |||||||
| Maybe retirement could change his thinking, we will see. | |||||||
| 542872696 | 528764 | clojurecivitas | 1759470366 | 727865 | One more answer regarding the backgrounds: | ||
| > I will not be dual licensing with GPL or LGPL. Both licenses allow the creation of derived works under GPL, a license I cannot use in my work. Allowing derived works I cannot use is not reciprocal and make no sense for me. | |||||||
| – Rich (according to https://gist.github.com/reborg/dc8b0c96c397a56668905e2767fd697f#why-clojure-is-not-licensed-under-gpl-mit-etc) | |||||||
| Maybe retirement could change his thinking, we will see. | |||||||
| 556686495 | 528764 | clojurecivitas | 1763300961 | 138175 | Hi @**Timothy Pratley**. | ||
| @**onbreath** and I started discussing how to support non-Clojure languages in Civitas. | |||||||
| … | … | … | … | … | … | … | … |
| 547808776 | 262224 | events | 1761770938 | 138175 | 2025-11-02 DSP in Clojure - meeting 1 | ||
| 547808776 | 262224 | events | 1761770932 | 138175 | Title: DSP in Clojure - meeting 1 | ||
| Start: 2025-11-02T15:00Z (local time) | |||||||
| End: 2025-11-02T17:00Z | |||||||
| Description: Once in a while, we will meet to learn about signal processing, following the Think DSP book by Allen B. Downey, and implementing things in Clojure. Our notes will be published at Clojure Civitas. | |||||||
| This will be the first meeting. | |||||||
| Please rsvp | |||||||
| Joining | |||||||
| Please let us know if you are planning to join, and whether you have any background in relevant topics. | |||||||
| Please mark your participation using the Your rsvp button at the top of this page (requires Clojureverse login). | |||||||
| Please join the Clojurians Zulip chat beforehand. | |||||||
| You can also use the Add to Calendar button to add the event to your calendar. | |||||||
| Zoom | |||||||
| Video meeting: Launch Meeting - Zoom - please do not share this link anywhere | |||||||
| Background | |||||||
| Clojure knowledge will be assumed. We will adapt the style and pace given the backgrounds of participants who let us know beforehand. | |||||||
| Chat | |||||||
| We will use the #dsp channel of the Clojurians Zulip Chat (requires login). Please join the Zulip chat before attending our meetings. | |||||||
| Length | |||||||
| The official session will run for 90 minutes. | |||||||
| Informal discussions may continue afterwards for those interested. | |||||||
| Recording | |||||||
| We will possibly share a recording internally in the Zulip chat. | |||||||
| URL: https://clojureverse.org/t/dsp-in-clojure-meeting-1/14765 | |||||||
| 554521757 | 262224 | events | 1762700889 | 138175 | Title: Clojure DSP Meeting 2025-11-09 | ||
| Start: 2025-11-09T20:30Z (local time) | |||||||
| End: 2025-11-09T22:30Z | |||||||
| Description: Once in a while, a few of the Scicloj freinds will meet to learn about signal processing, implement things in Clojure. | |||||||
| This will be the third meeting, a bit shorter this time. It is not too late to join – please reach out beforehand, and we will help you catch up. | |||||||
| Joining | |||||||
| Please let us know if you are planning to join by dropping a message at #dsp > meeting 2025-11-09 on the Clojurians Zulip Chat (require login). | |||||||
| Then, we will add you to the calendar event. | |||||||
| Text | |||||||
| We follow the very beginning of the Think DSP 2 draft notebooks that Allen B. Downey kindly shared with us. | |||||||
| Our notes will be published at Clojure Civitas. | |||||||
| Background | |||||||
| Clojure knowledge will be assumed. We will adapt the style and pace given the backgrounds of participants who let us know beforehand. | |||||||
| Chat | |||||||
| We will use the #dsp channel at the Zulip chat. | |||||||
| Length | |||||||
| The official session will run for 60 minutes this time. Informal discussions may continue afterwards for those interested. | |||||||
| Recording | |||||||
| We will possibly share a recording internally in the Zulip chat. | |||||||
| More info | |||||||
| See the group’s page. | |||||||
| URL: https://clojureverse.org/t/clojure-dsp-meeting-2025-11-09/14772 | |||||||
| 554570212 | 262224 | events | 1762701505 | 138175 | Hi @**eval2020**. | ||
| By the way, the calendar feed viewers seems broken: | |||||||
| https://invertisment.gitlab.io/cljcalendar/ | |||||||
| The error browser console hints that there may be some special formatting challenge with the Dutch Clojure Days event. | |||||||
| | | | | | | | | a {message: 'invalid line (no token ";" or ":") "After a four y…ition of the Dutch Clojure Days free conference!"', name: 'ParserError', stack: ' at new a (https://invertisment.gitlab.io/cljca…/cljcalendar/static/js/main.892933db.js:2:491357)'} | | | | | | | | | |
|||||||
| 554570212 | 262224 | events | 1762701475 | 138175 | calendar feed viewer | ||
| 554795363 | 262224 | events | 1762810295 | 207741 | > could you move the line with Location above the Description? |
||
| done | |||||||
| 554795363 | 262224 | events | 1762810290 | 207741 | > could you move the line with Location above the Description? |
||
| 556895972 | 262224 | events | 1763477236 | 138175 | Title: Clojure GIS meeting 2025-11-20 | ||
| Start: 2025-11-20T17:00Z (local time) | |||||||
| End: 2025-11-20T19:00Z | |||||||
| Description: Once in a while, a few of the Scicloj freinds will meet to discuss, explore, and document the use of Clojure for GIS. | |||||||
| A few of our friends are quite experienced in geospatial analysis, remote sensing, urban sensing, and more. Gladly, we found a time where we could meet and initiate some collaborations. | |||||||
| Joining | |||||||
| Please let us know if you are planning to join by dropping a message at the #gis > meeting 2025-11-20 topic thread on the Clojurians Zulip Chat (require login). | |||||||
| A Zoom link will be shared at that thread before the meeting. | |||||||
| For your convenience, you can also click Add to Calendar to add this event to your calendar. | |||||||
| Background | |||||||
| Clojure knowledge will be assumed. We will adapt the style and pace given the backgrounds of participants who let us know beforehand. | |||||||
| Chat | |||||||
| We will use the #gis channel at the Zulip chat. | |||||||
| Length | |||||||
| The official session will run for 120 minutes. Informal discussions may continue afterwards for those interested. | |||||||
| Recording | |||||||
| We will possibly share a recording internally in the Zulip chat. | |||||||
| URL: https://clojureverse.org/t/clojure-gis-meeting-2025-11-20/14777 | |||||||
| 574776932 | 262224 | events | 1771520145 | 1031400 | Hi everyone 👋 | ||
| It feels sad that offline Clojure events in Europe have almost disappeared. | |||||||
| As far as I can see, in 2026 we only have Dutch Clojure Days — and that’s it. | |||||||
| At Health Samurai, we’re thinking about organizing a Clojure conference in Portugal or Spain in early October 2026 — but only if there’s real interest from the community. | |||||||
| - Would you travel for it? | |||||||
| - What kind of content or format is currently missing? | |||||||
| React or comment below if this sounds interesting | |||||||
| If there’s enough interest, we’re ready to make it happen | |||||||
| 582024774 | 262224 | events | 1774554234 | 137753 | Title: Clojure Documentary Premiere | ||
| Start: 2026-04-16T00:00Z (local time) | |||||||
| End: 2026-04-17T00:00Z | |||||||
| Description: The official Clojure documentary premieres on April 16th, 2026! | |||||||
| This full-length film tells the story of Clojure from its unconventional beginnings through its adoption | |||||||
| by major technology companies. Featuring Rich Hickey, Alex Miller, and Stuart Halloway, the film exploresthe language’s origins, its community values, and its influence on software development practices. | |||||||
| Made possible through support from Nubank. | |||||||
| - 🎬 Official trailer: https://clojure.org/news/2026/03/26/documentary_trailer | |||||||
| - 🎥 ClojureTV: https://www.youtube.com/user/ClojureTV | |||||||
| URL: https://clojure.org/news/2026/03/26/documentary_trailer | |||||||
| 586186641 | 262224 | events | 1776448026 | 138175 | Meeting channel: #real-world-data>meeting 56 |
(-> edits tc/column-names sort)(:channel
:edit-ts
:edit-user-id
:message-id
:prev-content
:prev-stream
:prev-subject
:stream-id)One row per linked URL
Zulip auto-detects URLs in messages and records them in :topic_links. topic-links-long flattens those into a one-row-per-link dataset.
(def links (views/topic-links-long messages))links_unnamed [11 5]:
| :message-id | :stream-id | :channel | :link-text | :link-url |
|---|---|---|---|---|
| 572644003 | 528764 | clojurecivitas | ClojureCivitas.org | https://ClojureCivitas.org |
| 573999070 | 528764 | clojurecivitas | ClojureCivitas.org | https://ClojureCivitas.org |
| 215880207 | 262224 | events | Exercism.io | https://Exercism.io |
| 216010813 | 262224 | events | Exercism.io | https://Exercism.io |
| 217462254 | 262224 | events | Exercism.io | https://Exercism.io |
| 218125232 | 262224 | events | Exercism.io | https://Exercism.io |
| 323137351 | 262224 | events | Clojure.org | https://Clojure.org |
| 323204850 | 262224 | events | Clojure.org | https://Clojure.org |
| 323237728 | 262224 | events | Clojure.org | https://Clojure.org |
| 323255366 | 262224 | events | Clojure.org | https://Clojure.org |
| 323278107 | 262224 | events | Clojure.org | https://Clojure.org |
(tc/column-names links)(:message-id :stream-id :channel :link-text :link-url)The most-linked URL hosts:
(-> links
(tc/add-column :host
(fn [ds]
(mapv #(some-> %
(java.net.URI.)
.getHost)
(:link-url ds))))
(tc/group-by [:host])
(tc/aggregate {:n tc/row-count})
(tc/order-by [:n] [:desc])
(tc/head 5))_unnamed [3 2]:
| :host | :n |
|---|---|
| Clojure.org | 5 |
| Exercism.io | 4 |
| ClojureCivitas.org | 2 |
A note on join keys
All four views carry :message-id (or :id in the timeline) and :stream-id so you can join them back together when you need both a message’s content and its reactions, or both its content and its links. Each view is independently complete — joins are additional structure, not required structure.
Where to go next
Anonymized views —
scicloj.zulipdata.anonymizemirrorsmessages-timeline,reactions-long, andedits-longwith sender names and topic strings replaced by stable hash keys, and message content dropped. Use those for any artifact derived from non-web-public channels.Narrative — adds time columns, channel-lifecycle summaries, and newcomer-tracking helpers built on top of the timeline.
API Reference — every public function in one chapter, with docstrings and a worked example each.