mrkeyoor.com_
Tue 08 Sept 16:09 UTC
Self-Hostedevaluationupdated 08 Sept 2026

zulip review

Zulip is an open-source team chat server organized around channels and topic-based threads, which keeps long-running discussions readable across time zones. Organizations can use Zulip Cloud or run the server themselves on supported Linux systems and connect through web, desktop, mobile, terminal, and API clients.

Verdict

Our Zulip checkout installed 2,231 pnpm packages and used 1,297 MB, but exposed no generic build or test target, so the lab result proves frontend dependency resolution rather than server readiness. Zulip remains the strongest open-source choice for teams that genuinely want topic-organized chat and can either use its cloud service or own a full production stack. Choose a flatter chat product if users will treat topics as paperwork, because the organizing idea only pays off when the team uses it.

We ran it

Lab card: what happened when we ran zulipScreenshot of zulip (zulip.com)
Install✓ · 53s2231 packages · 1297 MB
Buildn/ano build script
Testsn/ano test script
Repo8978 files~666,997 lines of source · 114.8 MB · 8 CI workflows

Answers from our run

Does zulip build from source?

Dependencies installed in 53 seconds (2231 packages), and the project has no separate build step. We cloned commit f8fb8ae into a clean Debian container with 3 CPUs and no project-specific setup.

Does zulip have tests you can run?

Not through a standard command: the project exposes no test script or target that our harness could run.

Who should not use zulip?

Teams that refuse topic-based posting and want every channel to be one undivided timeline: topics are Zulip's defining conversation model, not an optional view.

What are the alternatives to zulip?

Mattermost, Rocket.Chat, Synapse. Our Zulip checkout installed 2,231 pnpm packages and used 1,297 MB, but exposed no generic build or test target, so the lab result proves frontend dependency resolution rather than server readiness.

Setup2/52,231 frontend packages plus a dedicated multi-service server stack
Docs5/5Detailed production, upgrade, architecture, and contributor guides
Community5/525,863 stars with active September work and a large review queue
Maturity5/5Server 12.2 follows a documented major and maintenance release policy

Who it’s for

Distributed teams that mix live chat with discussions people will read hours or days later.
Open-source communities and large organizations that need many conversations without one flat channel becoming a firehose.
Administrators who want an Apache-licensed chat server and can operate its database, queues, email, HTTPS, backups, and upgrades.
Teams willing to make channel topics part of everyday writing and moderation.
Organizations that prefer a managed Zulip Cloud option when self-hosting is unnecessary.

Who it’s NOT for

Teams that refuse topic-based posting and want every channel to be one undivided timeline: topics are Zulip's defining conversation model, not an optional view.
Administrators seeking a small shared-host install: the production guide expects a dedicated Ubuntu or Debian machine and configures PostgreSQL, Redis, nginx, and other services for Zulip's use.
Self-hosters without DNS, HTTPS, or outgoing email credentials: all three are listed among the production requirements.
Migration teams that cannot schedule an isolated import window: open issue 39743 reports a realm-import deadlock with the full-text indexing worker and recommends stopping that worker as a workaround.
Organizations where current French password-reset behavior is a release blocker: issue 39649 reproduces failed reset email on Zulip Server 12.x when the user's language is French.

Setup reality

Our sandbox installed 2,231 pnpm packages in 53 seconds and used 1,297 MB. The 114.8 MB checkout held 8,978 files and about 666,997 lines of source. No root build or test script matched the generic harness, so both steps were skipped. We did not run Zulip's application test suites.

Production installation is a different workflow. The standard installer needs root access on a dedicated Ubuntu or Debian host, at least 2 GB of RAM, 10 GB of free disk, DNS, HTTPS, and SMTP credentials. It installs and configures services such as nginx, PostgreSQL, and Redis. Docker Compose and Helm are documented alternatives.

The root pnpm manifest covers only part of a Python and JavaScript monorepo. Python 3.10 or newer is declared, and the source tree has its own tools/test-*, web/tests, and zerver/tests paths despite no top-level tests directory. Zulip warns that Docker moderately increases maintenance and upgrade effort compared with its standard installer.

Server 12.2 makes topics the unit of conversation

Zulip Server 12.2 is built around channels and topics rather than a single scroll of replies. Every channel conversation can be separated by subject, so a reader can return later and follow one thread without absorbing the whole room. That model suits distributed engineering, research, and open-source communities where live discussion and asynchronous reading happen in the same place.

Topic organization is the buying decision, not a minor interface preference. Teams that already title email threads or maintain careful forum categories tend to understand it quickly. Groups that use chat mainly for rapid social updates may see the topic field as extra work. Zulip offers a cloud service for organizations that want the interaction model without server duties, while the Apache 2.0 codebase gives self-hosters control over application data and deployment.

The 1,297 MB pnpm tree covers only the frontend layer

Our sandbox installed 2,231 pnpm packages in 53 seconds and occupied 1,297 MB. The checked-out repository was another 114.8 MB, with 8,978 files and roughly 666,997 lines of source at commit f8fb8ae. Those are substantial numbers before a production database or uploaded files exist. The project is primarily Python, with a large browser client and tooling workspace, so a successful pnpm install confirms one dependency layer rather than a usable Zulip server.

The current source declares Python 3.10 or newer and pins its package manager separately for JavaScript work. Backend dependencies include Django, PostgreSQL bindings, Redis, RabbitMQ clients, memcached support, Tornado, email tooling, image processing, authentication libraries, and integrations. This breadth explains why the project has its own development environment and task scripts. Installing the root JavaScript manifest alone does not configure databases, queues, web serving, email, or a test organization.

What happened when we ran it

Our run completed the pnpm install in 53 seconds, adding 2,231 packages and consuming 1,297 MB on disk. The generic harness then found no root build script or target and skipped the build step. It found no root test script or target and skipped tests as well. There is no pass or failure count to report, and we did not run the application, backend suite, browser suite, or deployment installer.

The harness recorded 8 CI workflow files, no Dockerfile, no top-level tests directory, and a monorepo workspace layout for the reviewed commit. The real source tree uses other conventions: tools/test-all coordinates checks, while web/tests, web/e2e-tests, zerver/tests, and tools/tests contain test code. Production Docker assets live in a separate zulip/docker-zulip repository. A Node-only detector missing those entrypoints is a limit of our run, not evidence that Zulip lacks tests.

A production host starts at 2 GB of RAM

Zulip's production guide calls for a dedicated machine or VM with at least 2 GB of RAM and 10 GB of free space. Hosts with less than 5 GB need swap, and installations expecting more than 100 users start at 4 GB of RAM and 2 CPUs. Supported native systems are Ubuntu 22.04, 24.04, and 26.04, plus Debian 12 and 13 on x86-64 or aarch64. Other platforms can use the official Docker route.

The standard installer expects root access and a mostly empty host. It uses apt and configures nginx, PostgreSQL, Redis, and related services for Zulip. Administrators also need a hostname, an SSL certificate, and SMTP credentials for confirmation and reset mail. Incoming HTTPS and outgoing web access are normal, while mobile push registration has separate terms and metadata settings. Backups, upgrades, monitoring, mail delivery, and database capacity remain the operator's responsibility after installation.

Two major releases a year keep self-hosters busy

Stable server majors arrive about 2 times per year, with maintenance releases roughly monthly. Official clients support server releases from the previous 18 months, and servers older than that display upgrade warnings. The project usually backports only security or critical fixes to older series. This policy is predictable, but it rules out installing once and ignoring the machine. An administrator should subscribe to release announcements, rehearse backups, and budget recurring operating-system and application upgrades.

Two open production bugs deserve acceptance tests

Zulip Server 12.x issue 39743 describes a realm import deadlocking with the full-text indexing worker during user-message insertion. The issue gives stopping process-fts-updates during import as the current workaround and was marked in progress when checked. Anyone migrating from Slack, Mattermost, Rocket.Chat, or another Zulip server should rehearse the import on a restored copy, record the maintenance sequence, and verify search indexing before scheduling the final cutover.

Internationalized deployments need their own cases. Issue 39649 reports that password-reset email worked in English but failed for a French user because of the encoded sender name. Issue 23595 separately tracks topic typeahead interfering with Chinese IME composition, although its original reproduction used an older development build. These reports are specific, not a claim that all translated flows fail. Test login recovery, invitation mail, topic editing, and the languages your organization actually uses on Server 12.2.

September 8 activity supports a mature choice

GitHub recorded a push on September 8, 2026, and Server 12.2 was released on August 10. The repository had 25,863 stars and 2,008 open issues and pull requests when fetched. That combined queue is large, yet daily code activity and a defined release lifecycle matter more than the raw count. The project began on GitHub in 2015, and its production documentation covers capacity, security releases, reverse proxies, imports, backups, and supported operating systems in unusual depth.

Zulip is mature software with a deliberately different conversation habit. Our 53-second dependency install says little about whether a team will adopt that habit or whether an administrator can maintain the server. Pilot the hosted product with real discussions before provisioning anything. If topics make missed conversations easier to recover, the 2,231-package frontend and multi-service backend may be a worthwhile operating cost. If users keep posting everything under one vague subject, Mattermost or Rocket.Chat will fit their behavior better.

Alternatives

ProjectWhat it isPick it when
Mattermost gh↗A self-hostable collaboration platform aimed heavily at software and operations teams.pick this instead when a conventional channel timeline and developer-workflow integrations matter more than topic-first discussion.
Rocket.Chat gh↗A self-hosted communications platform with team messaging and customer-facing use cases.pick this instead when omnichannel or external-customer messaging is central to the deployment.
SynapseA Matrix homeserver for federated messaging across compatible clients and servers.pick this instead when federation and the wider Matrix client ecosystem are requirements.

What people are saying

  1. [velocity-scout] zulip/zulip

Sources

  1. Zulip README
  2. Zulip Server 12.2 release
  3. Zulip production requirements
  4. Zulip production installation guide
  5. Zulip release lifecycle
  6. Issue 39743: realm import deadlock
  7. Issue 39649: French password reset email
  8. Issue 23595: topic editing with IME

More self-hosted reviews

FlClash · mediamtx · toolhive · HAMi · filebrowser · remux · the whole board →