Zulip 3.0: Threaded Open Source Team Chat
blog.zulip.com
blog.zulip.com
The topics model is fantastic, having proper markdown and LaTeX support is also killer.
The development team for Zulip is also really responsive and friendly. Coming from Slack, it was a breath of fresh air to be able to make an issue on their GitHub issue tracker and have fast, friendly thoughtful replies and quick action.
[1] https://julialang.zulipchat.com/#recent_topics if you wanna check it out
(Now if only discourse.julialang.org links would render without Javascript!)
It's mostly frequented by the infrastructure teams. :)
Apparently the compiler team is also >primarily< there: https://rust-lang.github.io/compiler-team/about/chat-platfor...
https://doc.rust-lang.org/cargo/reference/specifying-depende...
If I were to start a new community, I would absolutely go with Zulip.
And -- if there isn't, if any developer is interested in working on it, I'd possibly be willing to pay -- and we could probably release it as open source! maneesh@pavlok.com
https://monadical.com/posts/how-to-make-remote-work-part-two...
The mental model might take an hour or two to click, but you can think of it as Slack rooms where the only thing you can do is open new threads (can't post messages in the room itself, only in the threads).
I really really think everyone should try it, it's a big improvement.
I've used both Slack and Zulip, and I wouldn't describe it that way. Slack threads feel more "isolated" by default, hidden away from the conversation, and you have to go look at each one; a Slack channel where you can only create threads doesn't feel like it'd be as appealing a UI as Zulip. On Zulip, you can look at the entire stream to see messages from different threads in real-time, or you can look at just one thread and see only the messages from that thread.
Zulip is also one of the only apps I put on my iPhone, and it's straightforward and unobtrusive.
For some reason when I use Slack, the keys feel mushy. I think they're doing so much stuff in the background that my keystrokes get delayed.
I, frankly, cannot stand threads. I want a chat room, not a realtime forum. I understand why people would like that, but it still bothers the shit out of me.
I work for MS so we have to use Teams, but I'd prefer opt-in to threads vs. threads by default. I fully understand and accept that my way isn't going to be the way for everyone, but when looking for a community chat option for friends, we uninstalled zulip in less than a day and ended up going with matrix. That didn't work super well for us at the time so we went with Mattermost, which much closer aligns to our chat preferences.
The good news is there are tons of options for people to choose what fits best for them! That's super exciting!
Oh, were you editing the subject every time you commented, maybe? That's not indicated, you only edit the subject when you want to create a new thread. In our use case, threads were relatively infrequent and specific to a topic, e.g. "middle name database migration", and that's where the discussion for that happened.
Anyway, if Zulip isn't thread-first, then I guess it's less a competitor to Teams than I thought. The only way we found to make teams work for us and our very small team is to keep everything in a named joint chat and everyone utterly ignores the channels like the plague. It's always amusing when someone posts something to a channel for the first time in weeks/months and then people start responding thinking it's chat and every. single. response. becomes a new thread, because they didn't respond inside the original thread.
Zulip is thread-only, it's just that thread can be used as channels if you ignore the top level (streams).
Every message (other than PMs) is within a topic thread which is within a stream.
This can be structured by having ongoing social threads but users do need to know that they should respond to existing "broad topic ongoing" threads instead of creating a new micro-thread for every message.
We structure the Streams into roughly:
- company-wide announcements
- org streams
- team streams
- social
then within #social you could have ongoing topics like "books", "weekend", "music", etc...
You can also restrict stream access as needed (only team members can view the team stream).
Hmm. I’m not sure that’s a game I want to be forced to play.
For example I have a channel called #oil-discuss. It has a bunch of separate threads. If I put the focus on the left bar in #oil-discuss, then it shows me all the messages in chronological order, regardless of thread.
If you click on a thread, then you see only the messages in that thread. So I think it's the best of both worlds.
----
Unfortunately it doesn't go the other way around in my experience -- Slack can't emulate Zulip. I joined Slack to discuss a nascent Python project.
https://twitter.com/teoliphant/status/1217611221396082695?la...
The creator of the channel encouraged everyone to use Slack threads to keep the conversation organized. But the threading was so awkward -- it felt felt like my replies were getting "lost" on the side, outside the main flow.
Multiple people disliked the Slack threading and eventually we tried python-dev's nascent Zulip instance instead. Although I think the conversation died out in both places for other reasons.
If you're looking for a more real-time mailing list type behavior though, then Slack or MM would be a terrible, terrible, terrible choice imo.
Personally I'm finding it a bit of a nightmare, as just about every community I'm interested in seems to require a different tool to be installed. Same for work clients.
Worse than that, some communities are fragmented into different IM tool groups.
The plethora of IM and other tools needed to stay vaguely involved in the leading edge conversation in multiple communities is a right pain for usability.
What I really want is some way to see an overview of conversations in multiple communities I'm interested in and interact with them through that. A single tool would be nice, but some way of visually integrating similar tools would be ok as well.
I was pretty happy with Pidgin for this many years ago, as it worked with almost everything. But even then I needed Skype separately. I don't think libpurple is quite as universal now.
Matrix is an attempt, but by no means a solution.
That sucks in a different way, as the experience tends to be sub par, but at least it works (when on desktop - it's high friction when I've only got my phone to hand).
It's still much like having a different application for every community or work client though - only it's become a different tab for each of them, with the tabs organised by application rather than by usefulness (or there are too many tabs), which is a poor way to organise.
It also makes it difficult to organise information beyond the crude tools provided. Desktop notifications exist, yes, but I would find it so much more useful to be able to filter content and notify me of only relevant things, sort, pin, annotate, link and so on. And for this prioritisation and context management to mediate between different information sources globally, rather than having to use my own brain to do it manually, which I find to be a significant cognitive load.
Care to elaborate why you think so? (Obviously it's not there yet, but does anything make you think it won't?)
Eventually, maybe.
For now, I think using Matrix to bridge to every other service is quite daunting. Consider these instructions which seem to be needed to connect to a Telegram group:
https://wiki.calculate-linux.org/matrix_telegram_bridge
I'm lucky that I can easily follow those instructions if I want. But to do all that just for 1 group?
The next one uses Slack.
Then Mattermost.
Then Discord.
Then IRC/Freenode.
My client uses MSN.
My other client uses Yahoo.
My other other client uses Skype.
A recruiter contacts me through WhatsApp, when I didn't have installed.
Another contacts me through LinkedIn.
Another through Telegram.
A friend sent me a message over Facebook Messenger. Of course I didn't get the Facebook message for 6 months due to not logging in :-)
(A friend of mine received a message over WhatsApp and didn't know for 12 months because of not having it installed at all, only to find someone they thought had stopped talking to them was actually sending WhatsApp messages, assuming of course everyone uses it.)
And then there are those group chats on Zoom sometimes.
I haven't listed them all...
Matrix has a long way to go before it's reasonably low effort to use seamless integration with all contact points that are coming up in practice.
I looked at Matrix recently, and it's very impressive how much has been implemented!
I'm almost certainly going to start using Matrix soon, if only because some communities I want to follow are on matrix.org itself.
But seamless, easy, and confident integration with many third party channels seems like it may be a long way off. (I'd also worry about messages getting lost or something due to services not integrating well with third party clients, especially given the adversarial relationship some services have.)
The problem is that everything and its pets seem to be using different services, and some of those want to live in walled gardens.
Amidst this, to be honest, I don't even use IM much! I'm not the chatting type.
But for key people or teams I need to use whatever they use, and for community awareness on the internet I want to see conversation where other people are discussing what I'm interested in, and pick up on key items sufficiently close to real-time to participate if I want.
For starters, a thread is a personal idea. (I think this is what you mean by opt-in). My idea of a thread is probably not your idea of a thread. So the concept of shared thread (channel) is hard to fathom. Second, my thread is made of activities I need to complete for the task at hand. In the process, I will interact with as many people or as few as I see fit, all in the pursuit of my goal.
Not all the people I interact with (thread participants) are necessarily members of my team. This is where the rigidity is a real problem with the aforementioned products. I cannot know all the participants at the time of channel creation. And once involve a non-team-member user in the thread, they become unwitting recipients of noise, and they cant do a damn thing about it.
There's gotta be a better way.
The community is very helpful and for getting started with open source development, I can't recommend a better place. You get really high quality code reviews, get to participate in meaningful discussions on features and the development goals of the project, and developers constantly share lots of knowledge in streams like #learning about software development, tech, git, best practices and so on.
Also, the documentation is very detailed and the codebase is very high quality. It's really easy to get started.
You can find the github org here: https://github.com/zulip
In addition to coordinating development teams on three continents, we also use Zulip as an integration hub. git commits go in the #commits channel, jenkins build status to #builds, and run-time errors to #errors.
We use errbit (API-compatible Airbrake clone) for error reporting and Zulip didn't have an errbit integration.
So I wrote one, and they integrated it within a few days. The Zulip team was super-responsive and easy to work with. It certainly helped that they had excellent docs on how to write integrations, and tons of examples.
Go Zulip!
One of our goals as a project is to have a "teaching-quality" codebase, so this is no surprise. I think this is incredibly important and something every community open source project should strive for.
An analogy I like to use is to think about the experience of contributing to your open source project as a product, so you should:
* Do usability studies where you help a group of people try to get started with your product (I used to do this all the time at events like Python conference sprints pre-pandemic). The first few we did were eye-opening as nobody got anywhere without a lot of handholding, and I suspect that's common.
* Make the development environment tooling Just Work and have a good support experience.
* Write good documentation that thoughtfully explains the ideas one needs to understand to participate on your project. My strategy for this was to avoid explaining how things work to a contributor, and instead meet the need by spending a couple hours writing something like https://zulip.readthedocs.io/en/latest/subsystems/sending-me... and send it to them. That way, even if that contributor bounces (as the vast majority of new people who show up to any volunteer organization do), I still used my time well.
I'm planning a series of blog posts on building a successful open source community, since we've spent a lot of time thinking about how to make contributing to Zulip a great experience, and some ideas are subtle (E.g. the secret to being able to give high quality code reviews is equipping new contributors with the tooling and documentation to help them avoid problems before a reviewer even looks at it!), and I regret not having spent more time sharing that thinking.
That probably explains the healthy number of active developers for this project:
Based on my simple analytics that looks at the time between a contributors first and last commit, I'm getting 50 active contributors, which matches up with many of the other popular open source projects I've indexed.
Before I tried it, I was a little resistant to "yet another chat platform", and I didn't know how easily the threading model would work. Once I tried it, I got used to it very quickly, and started very much enjoying it. I'd highly recommend it.
I also think it works well with automation; bots can create threads, and do things in response to messages in those threads.
2019 https://news.ycombinator.com/item?id=19284321
2018 https://news.ycombinator.com/item?id=18400988
2018 https://news.ycombinator.com/item?id=17622987
2018 https://news.ycombinator.com/item?id=17622707
2018 https://news.ycombinator.com/item?id=16863675
2017 https://news.ycombinator.com/item?id=14506426
Does anyone know if there is a CLI client, and if E2E encryption is possible with Zulip? It does not seem like these are built-in, but maybe someone built these as add-ons somewhere.
I love XMPP, and OMEMO, but Profanity, and Conversations have some weird quirks when used together that we would rather avoid. And while we would love to just move to IRC, and WeeChat, lack of E2E encryption is a deal-breaker.
Now to look for E2E encryption support.
Like XMPP it supports federation, but Matrix is JSON instead of XML.
(Element, formerly Riot, is the client by the company founded by the founders of Matrix.)
Altough, it seems there is a plugin for WeeChat with E2E encryption[1]. Gotta take a look.
Since we do everything in the open, instead of needing something like XMPP for private conversations, and IRC for public conversations, we could simply have private rooms with E2E encryption for the team, and public rooms for everyone else.
I wish IRC had E2E encryption.
In the end, I think we might stay with XMPP with OMEMO for private conversations — or Matrix, depending on how well weechat-matrix work —, and use mailing lists for public discussions. We already use them for patches anyway.
Aside from that, I think it's biggest potential killer feature is tight issue thread integration: https://github.com/zulip/zulip/issues/12340
Very exciting project
Newsgroups (NNTP)?
(I don't know Zulip and I don't know what problems you have with e-mail, so that's just a guess.)
A thing I really like about how Zulip works is that a conversation can happen asynchronously just like email, as well as synchronously. And the same conversation can shift smoothly from one to the other and back. I work on Zulip, and we basically don't use email at all - it's all either in Zulip or on a GitHub thread. (And the interesting discussions, I increasingly try to make sure to do on Zulip because GitHub is such a frustrating place to have a conversation.)
Zulip is great for async communication because it surfaces unread messages in an easy to skim and non-overwhelming way.
After a day of not checking Zulip, the user can then open the chat and (before seeing any actual messages) see:
1) which streams have had activity.
2) which threads/topics within those streams have had activity.
then choose which topics to read in a "relevant to me, not relevant to me" quick skim.
Having the topics within streams also allows those topic discussions to persist over time without being lost in the deluge of other messages.
There might be thousands of other chat messages between when I ask a question in #frontend > supercool.js but a teammate will skim later, see
#frontend > supercool.js [1]
and think "hey I know about supercool.js, what's up?" then respond.
I can also search to see if there's already a supercool.js topic thread and catch up on what we've discussed in the past.
https://monadical.com/posts/how-to-make-remote-work-part-two...
Other than one-off q&as, I don't understand why email isn't still the best thing we have?
And this release addresses three of our biggest gripes.
We highly recommend.
I absolutely love Zulip but I’m afraid the design keeps folks from joining.
There was a recommendation for it to update their design to be more like Discord new light theme [1] or Twist [2].
Twist is the more fair comparable since they are both Thread based (like email subject line) it’s just that Twist isn’t open source.
[1] https://miro.medium.com/max/4050/1*iwfLW4rnn6U-mlUQpmBAfg.pn...
[2] https://get.twist.help/hc/article_attachments/115005750965/i...
Slack has an exchange rate adjusted pricing which is much cheaper (in dollar terms) for people paying from India.
What is Slack's adjusted pricing in India/Asia? I don't see it advertised on their website.
I've tried to get traction with it as a self hosted solution at a few orgs instead of cloud offerings, and often meet with resistance by ITS in party because of the pains of administering a lot of these products. However, one I have succeeded pushing it through the feedback has been, 'Great, it just worksout of the box. We don't have to deal with it regularly'.
https://medium.com/slack-design/threads-in-slack-a-long-desi...
Of course, people here have self-selected for favoring threads, but Slack's attention to the silent negatives is interesting and a lesson in product design.
In their testing, it does not seem like they prototyped an N-nested (indented) threading model like on Reddit or HN. I am not surprised that it would be hard to understand how all the replies fit together without such nesting.
The way it works in Zulip is quite different from Slack, though. Here's a description in another comment in this thread: https://news.ycombinator.com/item?id=23863588
Basically, for this you have to ask yourself why you want to split it and what would you split it to. If ultimately what we'll get is something like UserProfileA, UserProfileB, UserProfileC, then that's arguably worse than one long UserProfile.
My personal favorite thing about Zulip is the keyboard navigation and how much muscle memory you can build moving around threads/conversations. Of course there's also the actual markdown (not some weird variant).
There's also an archive tool at https://github.com/zulip/zulip-archive.
If I were to build a similar UI on some project, what's a good way to ensure good scrolling performance on the web?
Generally Zulip's scrolling and view-switching is very smooth and a ton of work has gone into it (my view is that if an app that you use all day isn't snappy it's going to waste tons of your time).
The short answer for how to make good scrolling performance (like any other performance work, really) is to profile, make sure you understand what's happening, and fix it. It can be hard to predict what makes things slow without doing so. (Fun fact: seemingly reasonable ways to use an emoji spritesheet with CSS can wreck scrolling performance).
Portions of Zulip's backend were used to power some Dropbox features in 2014-16, but the product itself wasn't further integrated.
In any case, I'm proud of how we handled the handoff to OSS and a sustainable independent stewardship org. I have https://ourincrediblejourney.tumblr.com/post/146708555778/zu... framed on my wall.
Zulip is promising but I think there's a little bit of a bubble around it here on HN. In the real world, its reception is much more mixed, and outside the context of software development, topic threads are awkward and difficult to manage.
Part of the reason is that Zulip's topics make it a lot easier for a part-time participant to use their limited time well (E.g. skimming or reading the conversations in most relevant to them in batch a few times a week). The Slack/Discord/IRC/etc. data model limits how effectively one can participate and benefit from a high-traffic organization without constantly watching it (and being in the organization's dominant time zone!).
More on the inclusivity issues with synchronous chat here:
Well, I have no users because there's no community yet, but I did set up a Zulip (cloud) for my Iron Arachne project.
I plan on linking to it from the website's main menu.
I am using Google Chat at work, and it is also threaded. I haven't used Zulip and was asking if it had a similar thread model.
I find the Google Chat thread model convenient and makes sense. But that is more or less the only good thing I can say about this product.
It has weird relationship with Hangouts. It was previously called "Hangouts Chat" but that was too confusing (doh) so they've changed it to "Google Chat"
When someone sends you a message there, it sometimes pops in your Gmail Hangouts widget... So a lot of people are not aware it exists.
This release removes Google Hangouts support (as Google killed it and rebranded it to Google Meet). Unfortunately, the Google Meet rebrand came with removing the API that was useful for third party tools like Zulip. I don't understand why they don't provide the brilliant API Jitsi has where you can just generate a URL containing a random meeting ID and everyone who clicks it gets the same meeting (which Google Hangouts did, at least if everyone was in the same G Suite team).
We also support Zoom (though note that Zulip Cloud is stuck in their marketplace approval process as it has been for months; supposedly it'll get approved any day now).
https://zulip.com/help/start-a-call
(And of course we're happy to integrate anything else that has a reasonable API)
Furthermore, they’ve changed the style of the “number of unread messages” badge on the favicon so that it’s bigger and less… neat, is probably the right word, having gone for the “write the number in a normal sort of a font on a semitransparent white background and sit that atop the original favicon” rather than writing the number in what’s essentially a small bitmap font without needing the semitransparent white bit; and given that style, it looks quite terrible on a dark background, which my tab bar is. It ends up looking like the icon is just a number on some indistinct mess, with no real substance of the logo left visible, where before it was a clearly-visible small number on a clear and distinct Zulip logo. It’s unfortunately fundamentally impossible to pull off the style they’ve changed to—you must know whether it’s going to be matted against a dark or light colour for it to work, and the web doesn’t give you that. (I really wish it did. Sure, there are a couple of workarounds like using the (prefers-color-scheme: dark) media query to guess that the tab bar is probably dark, and that if that doesn’t match it’s probably light, but that’s still wildly inaccurate and insufficient. It’s a big enough deal that I’d like browser manufacturers to come up with something.)
In all this I do say that I’m not fond of it yet. It’ll doubtless feel more acceptable after a few days. But comparing my reasons for disliking it with other occasions when I’ve not liked change (either at first or forever), I don’t think it’s going to grow on me as much as many do.
For the number-of-unreads bit: might I persuade you to make an account on chat.zulip.org and come give that feedback there? That way we can perhaps iterate on variations of it and you can discuss those too.
If you're curious to hear more, https://monadical.com/posts/how-to-make-remote-work-part-two... talks about this idea in more detail.
I also highly recommend making use of Zulip permalinks to conversations in issue trackers and other resources -- my anecdotal sense is most projects using Zulip do that a lot (the Zulip development team certainly does). Certainly the main feedback we've gotten on the zulip.com domain transition is "Will my permalinks keep working???". (Yes, they will).