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:

(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)
1096

One 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)
1096

The 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.Instant

The :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)
188

One 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 viewsscicloj.zulipdata.anonymize mirrors messages-timeline, reactions-long, and edits-long with 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.

source: notebooks/zulipdata_book/views.clj