Zulip
zulip.comOpen source team chat organized around topic-based threading, which keeps busy conversations easier to follow than channel-only tools. Can be self-hosted, or used as a paid cloud service. The threading model takes some getting used to.
- Homepage: zulip.com
- GitHub: github.com/zulip/zulip
- Privacy: zulipchat.com/privacy
- iOS App: apps.apple.com/us/app/zulip/id1203036395
- Android App: play.google.com/.../com.zulipmobile
- Web info: web-check.xyz/check/zulip.com
Zulip Source Code
Author
Description
Zulip server and web application. Open-source team chat that helps teams stay productive and focused.
Homepage
https://zulip.comLicense
Apache-2.0
Created
25 Sept 15
Last Updated
20 Jun 26
Latest version
Primary Language
Python
Size
634,087 KB
Stars
25,382
Forks
9,882
Watchers
25,382
Language Usage
Star History
Top Contributors
-
@timabbott (10895)
-
@showell (5766)
-
@andersk (5321)
-
@amanagr (3253)
-
@alexmv (3071)
-
@sahil839 (2503)
-
@laurynmm (1741)
-
@hackerkid (1712)
-
@mateuszmandera (1442)
-
@karlstolley (1399)
-
@rishig (1332)
-
@evykassirer (1320)
-
@zbenjamin (1103)
-
@alya (1064)
-
@shubham-padia (918)
-
@prakhar1144 (817)
-
@jesstess (776)
-
@brockwhittaker (772)
-
@umairwaheed (745)
-
@eeshangarg (720)
-
@gnprice (716)
-
@adnrs96 (706)
-
@wdaher (704)
-
@lfranchi (670)
-
@sayamsamal (616)
-
@lfaraone (605)
-
@PIG208 (556)
-
@synicalsyntax (533)
-
@HarshitOnGitHub (405)
-
@sharmaeklavya2 (404)
-
@rht (400)
-
@YJDave (378)
-
@Niloth-p (346)
-
@aero31aero (342)
-
@apoorvapendse (329)
-
@drrosa (316)
-
@roberthoenig (303)
-
@PieterCK (303)
-
@shubhamdhama (292)
-
@YashRE42 (269)
-
@neiljp (268)
-
@pratik-pc (256)
-
@priyank-p (245)
-
@abhijeetbodas2001 (243)
-
@rheaparekh (238)
-
@N-Shar-ma (237)
-
@vrongmeal (228)
-
@YagoGG (226)
-
@sidforreal (213)
-
@kevinmehall (203)
-
@majordwarf (199)
-
@punchagan (191)
-
@Vector73 (187)
-
@lonerz (186)
-
@tommyip (182)
-
@m-e-l-u-h-a-n (173)
-
@allenrabinovich (169)
-
@chdinesh1089 (167)
-
@armooo (161)
-
@ganpa3 (152)
-
@shameondev (152)
-
@Hypro999 (150)
-
@jbarnold (150)
-
@Lalit3716 (147)
-
@pragatiagrawal31 (145)
-
@shuklamaneesh23 (143)
-
@graue (127)
-
@thedeveloperr (126)
-
@cory2067 (124)
-
@LaPulgaaa (116)
-
@Riken-Shah (114)
-
@ryanreh99 (114)
-
@akshatdalton (111)
-
@kuv2707 (109)
-
@sbansal1999 (109)
-
@vaidap (108)
-
@aryanshridhar (106)
-
@jackrzhang (104)
-
@rwbarton (102)
-
@roanster007 (91)
-
@orientor (89)
-
@akashnimare (88)
-
@MSurfer20 (87)
-
@brainwane (86)
-
@Ddharmani3 (85)
-
@afeefuddin (85)
-
@arpit551 (84)
-
@Joelute (83)
-
@Lyla-Fischer (79)
-
@akashaviator (78)
-
@palashb01 (76)
-
@ligmitz (74)
-
@yogesh-sirsat (71)
-
@sumanthvrao (70)
-
@sanchi-t (69)
-
@abhijeetkaur (65)
-
@Ujjawal3 (62)
-
@taranjeet (62)
-
@whilstsomebody (61)
-
@kennethnrk (61)
Recent Commits
-
Evy Kassirer (19 Jun 26)
echo: Recompute mention booleans when locally re-rendering edits. When locally echoing a content-only edit, `edit_locally` re-rendered the Markdown and stored the resulting `flags` array, but never derived the content-driven boolean fields (`mentioned`, `mentioned_me_directly`, etc.) from it. Those booleans stayed stale until the server's `update_message` event arrived. `message_list_view` colors a row from both `mentioned_me_directly` and a re-parse of the rendered content for a non-silent self mention. So editing away a personal mention left `mentioned_me_directly` stale at `true` while the freshly rendered content no longer matched, which selected the group-mention background: the row flashed from the purple direct-mention color through the teal group-mention color before settling on the default once the server event corrected the booleans. Other windows, which skip the local-echo step, updated cleanly. Derive the booleans via `message_store.update_booleans`, the same helper used by the send-echo and message-edit-event paths, so the local echo matches the new content immediately. Storing `flags` on the message was also inconsistent with how processed messages are represented elsewhere, where `flags` is dropped in favor of the booleans. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Pratik Chanda (09 Mar 26)
message_list: Ignore moved messages in the trailing bookend. The trailing "You subscribed/unsubscribed" bookend was driven by last_message_historical, a monkey-patched MessageList field holding the raw `historical` flag of the newest rendered message. Like the inline dividers fixed in the previous commit, that flag is meaningless for a message moved here from another channel, so a channel whose newest messages were moved in could show a spurious "You subscribed" bookend to a long-subscribed user, or claim "You unsubscribed" based on another channel's history. Replace the field with a get_boundary_message_info_with_meaningful_historical view method that returns the newest rendered message whose historical flag is meaningful in this channel, dropping the duplicated state and its reset bookkeeping. When no rendered message has a meaningful flag the method returns undefined and the bookend claims no subscription change. Fixes part of #39216. Co-Authored-By: Aman Agrawal <[email protected]> Co-Authored-By: Claude Fable 5 <[email protected]>
-
Pratik Chanda (13 Jun 26)
message_list_view: Drop now-unused subscription_markers parameter. Now that set_subscription_dividers_and_markers assigns the bookend markers to each group directly, the subscription_markers parameter of populate_group_from_message is undefined at every call site. Drop the parameter and the spread that consumed it, and update the callers, including the message-preview builder in message_report. This is a pure cleanup with no behavior change.
-
Pratik Chanda (13 Jun 26)
message_list_view: Ignore moved messages for subscription dividers. Subscription-status dividers and group bookends (e.g. "You subscribed to #channel") are derived from the `historical` flag changing between adjacent messages: a flip implies the user (un)subscribed between them. A message moved here from another channel carries the `historical` flag from its original channel, so it produced a spurious divider or bookend in the channel it was moved to. Detect such messages from their stream-move edit history and skip them in set_subscription_dividers_and_markers: a moved message never gets a divider, and the pointer tracking the latest meaningful flag does not advance past it, so a real transition between the meaningful messages around a moved one is preserved rather than hidden. At a group boundary the change is shown as a bookend rather than an inline divider, so the boundary against already-rendered messages picks the representation based on whether its first meaningful message starts a group. This intentionally only suppresses the incorrect divider, matching the scope agreed on chat.zulip.org; surfacing that a message was moved from a channel you aren't subscribed to is tracked separately. In realms that hide message edit history, the client cannot detect moved messages, so the incorrect dividers remain there. Fixes part of #39216. Co-Authored-By: Aman Agrawal <[email protected]> Co-Authored-By: Claude Opus 4.8 <[email protected]> Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Pratik Chanda (13 Jun 26)
message_list_view: Consolidate subscription bookends into divider pass. Following the previous commit, which moved inline subscription dividers into set_subscription_dividers, we now compute the group-level subscription bookend markers there as well and rename the method to set_subscription_dividers_and_markers. Previously the markers were computed in two places: deterministic group boundaries within freshly built groups were filled in by build_message_groups, while the boundary against already-rendered content was handled by join_message_groups after the join decision. Both depend only on whether the historical flag flips across the boundary, which is exactly what the divider pass already walks, so we set the markers there instead. The boundary group's marker is set speculatively, mirroring the inline divider: if the groups end up joined, the group holding the speculative marker is discarded by merge_message_groups, so no explicit clearing is needed. get_possible_group_subscription_markers now takes the previous message's historical flag rather than the whole message, matching the state the divider pass already threads through. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Pratik Chanda (18 Jun 26)
message_list_view: Compute subscription dividers in a dedicated pass. want_subscription_status_divider was computed inline while building message groups, interleaved with the date-divider logic in get_message_divider_data. That coupling makes subscription dividers hard to reason about on their own, which later commits need in order to also handle group bookends and messages moved between channels. Move the computation into a new set_subscription_dividers method that render() runs over the freshly built groups before merging them, walking the message containers and setting each one's flag. The date-only helpers left behind are renamed get_date_divider_data and update_date_divider to match their narrowed responsibility. The rendered dividers are unchanged; this only moves where they are computed. Co-Authored-By: Aman Agrawal <[email protected]> Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Pratik Chanda (18 Jun 26)
message_list_view: Extract wants_subscription_divider helper. The inline check that sets want_subscription_status_divider -- whether the `historical` flag flips between two adjacent messages, meaning the user (un)subscribed between them -- is about to be needed from a new dedicated pass, separate from the date-divider logic it currently lives inside. Pull the boolean into a wants_subscription_divider helper, called from get_message_divider_data exactly as before. Pure refactor with no behavior change. Co-Authored-By: Aman Agrawal <[email protected]> Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Pratik Chanda (18 Jun 26)
message_list_view: Type render's `where` parameter as a union. render()'s `where` argument is always "top" or "bottom" but was typed as the looser `string`. Narrow it to a "top" | "bottom" union, so its domain is explicit and the dedicated subscription-divider pass added in the following commits can take the same precise type. No functional change. Co-Authored-By: Aman Agrawal <[email protected]> Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Agnish Bauri (22 May 26)
upload: Resolve avatar upload content type in the callers. API clients that send a multipart avatar upload without a Content-Type on the file part end up with an empty content type, which the avatar endpoints passed straight to the THUMBNAIL_ACCEPT_IMAGE_TYPES check, rejecting valid images as "Invalid image format" -- most visibly, zulip-api-py's client.call_endpoint("users/me/avatar", "POST", files=[fp]) could not upload an avatar. Resolve the content type in upload_avatar_image's callers instead: the avatar views use get_file_info (as realm icon, logo, and emoji uploads already do), and the remaining callers -- a few tests, the add_mock_conversation management command, and the two screenshot tools -- pass an explicit type. upload_avatar_image now takes a required content_type: str and no longer guesses from the filename, matching upload_icon_image and upload_logo_image.
-
Mateusz Mandera (11 May 26)
migrations: Backfill some missing USER_CREATED/DEACTIVATED audit logs. Migration to fix up the records for users who were imported from 3rd party tools and thus are affected by the bug fixed in the prior commit.
-
Mateusz Mandera (11 May 26)
import_realm: Create USER_CREATED/DEACTIVATED audit logs when needed. Third party exports such as Slack don't include audit log entries. We already create necessary subscription events in such cases - but we've forgotten that for sanity of our records, USER_CREATED and USER_DEACTIVATED are also needed. The Message count in test_slack_import_to_existing_database decreases because one of the Slack users is turned to be deactivated in this patch - and our import system, in send_zulip_initial_messages_after_import, only does send_initial_direct_messages_to_user to users that were imported as active. So there's one less message generated now.
-
Mateusz Mandera (21 May 26)
models: Fix analogical->analogous in a comment. Minor tweak to a comment to use the correct word.
-
Evy Kassirer (17 Jun 26)
filter: Resolve a digit-leading channel name to its id. When a channel is typed by name, `Filter.parse` converts the name to the channel's id, but it skipped that conversion for any operand starting with a digit. So a channel whose name starts with a digit, like "7th", was left as the literal operand "7th" and never narrowed to the channel the way a normally-named channel does. Only skip the conversion when the operand is entirely digits (a bare stream id like `channel:7`); otherwise look the name up. Now `channel:7th` resolves to the channel named "7th". Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Evy Kassirer (17 Jun 26)
util: Add is_numeric_string and use it for digit-string checks. Several call sites test whether a string is entirely ASCII digits with an inline `/^\d+$/` regex. Extract that into `is_numeric_string` and convert the existing duplicates so the check has one name and one definition. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Evy Kassirer (17 Jun 26)
stream_data: Don't read a digit-leading channel name as a stream id. `get_sub_by_id_string` resolved its operand with `Number.parseInt`, so a digit-leading channel name like "7th floor" was read as the unrelated stream 7. Searching `channel:7th` then surfaced (and narrowed to) whichever channel happened to have id 7, instead of treating the operand like any other string that isn't a real channel. Require the operand to be exactly the canonical decimal form of an id before treating it as one. A digit-leading name then no longer resolves, so `Filter.is_valid_canonical_term` rejects it and the search code routes it to free text via the same path as a non-existent name. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
-
Alex Vandiver (22 Apr 26)
migrations: Delete orphan Recipient and DirectMessageGroup rows. Existing servers have accumulated Recipient rows for streams whose Stream cascade-deleted with a hard-deleted realm, and DirectMessageGroup rows left with only cross-realm bot Subscriptions from that same path. The do_delete_realm fix stops further accumulation; this migration sweeps the ones that are already there. Delete Recipient objects that are currently dangling.
-
Alex Vandiver (22 Apr 26)
do_delete_realm: Clean up orphan Stream Recipients too. A Stream's Recipient has no FK back to Stream (only the type_id int), so when realm.delete() cascades away the Stream, its Recipient row is left behind. Unlike the DMG case there's no surviving Subscription to make the stranded row visible to discovery queries -- it's a cosmetic leak rather than a functional one -- but the shape is the same and it's trivial to sweep alongside the DMG cleanup.
-
Alex Vandiver (22 Apr 26)
do_delete_realm: Clean up orphan DirectMessageGroups. DirectMessageGroup and its Recipient have no FK to Realm -- a DMG can involve cross-realm system bots, so no one realm owns it -- so realm.delete() leaves them behind, along with the bot's surviving Subscription. Since human-to-human cross-realm DMs aren't possible, every DMG our users were in becomes orphan on realm.delete(), and can be swept wholesale. Recipient.delete() cascades the dependent Subscription and Message rows; the DMG row needs an explicit delete because DirectMessageGroup.recipient is SET_NULL.
-
Alex Vandiver (22 Apr 26)
realm_settings: Extract a common do_delete_realm.
-
Sairam Bisoyi (14 Apr 26)
custom_profile_fields: Send event on dropdown choice deletion. Fixes a bug where deleting a dropdown profile field option did not send a realm_user update event to users who had that option selected. Without this event, the UI wouldn't update and users had to reload the page to see their profile data clear. This adds logic to fetch the CustomProfileFieldValue records and dispatch a custom profile data update event for each user before the records are deleted from the database. Also adds test coverage in test_events.py.
-
Sairam Bisoyi (16 Apr 26)
custom_profile_fields: Rename internal "select" identifiers. Renames internal identifiers that still used "select" terminology to names that better reflect what the code does. Two categories: Dropdown-specific identifiers, only used by the `DROPDOWN` field type, are renamed with the `dropdown` prefix for consistency with `CustomProfileField.DROPDOWN`: * `SELECT_FIELD_TYPE_DATA` -> `DROPDOWN_FIELD_TYPE_DATA` * `SELECT_FIELD_VALIDATORS` -> `DROPDOWN_FIELD_VALIDATORS` * `validate_select_field` -> `validate_dropdown_field` * `is_select_field` -> `is_dropdown_field` in frontend UI logic and templates * `test_create_select_field`, `test_update_invalid_select_field`, `test_update_select_field_successfully`, `test_removing_option_from_select_field` -> corresponding `*_dropdown_field` names Shared identifiers, used by code that handles choice options for multiple field types, are renamed to make their domain clearer: * `select_field_data_schema` -> `custom_profile_field_choices_schema` * `read_select_field_data_from_form` -> `read_custom_profile_field_choices_from_form` * `set_up_select_field` -> `set_up_custom_profile_field_choices` * `set_up_select_field_edit_form` -> `set_up_custom_profile_field_choices_edit_form` * `edit_select_field_modal_callback` -> `edit_custom_profile_field_modal_callback` * `validate_select_field_data` -> `validate_custom_profile_field_choices`
-
Sairam Bisoyi (25 May 26)
custom_profile_fields: Add opacity for disabled choice inputs. In the edit custom profile field modal, existing choice options render as disabled inputs. Adds `--opacity-disabled-profile-field- choice-input` (0.7 in light, 0.5 in dark) and applies it along with `--color-text-default` so disabled inputs are visually distinct from active ones in both themes.
-
Sairam Bisoyi (25 May 26)
custom_profile_fields: Delay tooltip on delete-choice button. The delete-choice button in the profile field choices editor previously used `tippy-zulip-tooltip`, which displays the tooltip immediately on hover. This switches the button to `tippy-zulip-delayed-tooltip` so that the tooltip appears after the standard delay, matching the behavior of similar icon buttons elsewhere.
-
Sairam Bisoyi (10 Apr 26)
user_profile: Fix return type of get_human_profile_data. The get_human_profile_data function extracts standard profile field values using jQuery's `.val()`, which returns a string, but its TypeScript return signature was missing the string type. This commit updates it to 'string | number[]'.
-
Sairam Bisoyi (08 Apr 26)
settings: Remove unused template variables for profile fields. In `web/src/settings_profile_fields.ts`, the `modifier_html` function calculates and passes context variables to the `admin_profile_field_list.hbs` template. Previously, it was passing `is_select_field`, `is_external_account_field`, and `choices`. However, looking at that template, none of these are actually used. This commit removes those unused context variables, along with the now-dead `choices` computation (which parsed the field's choice data only to never reference the result).
-
sandeep (07 Mar 26)
compose: Add Ctrl+]/[ shortcuts for list indent/unindent Add keyboard shortcuts to increase or decrease the indentation level of Markdown list items in the compose textarea. Pressing Ctrl+] increases indentation and Ctrl+[ decreases indentation for the current line or selected lines if they are valid list items. Non-list lines are ignored. This change also updates the keyboard shortcuts UI, documentation, and adds tests for the new functionality. Fixes #37738
-
Aman Agrawal (11 Jun 26)
info_overlay: Add printing support for informational overlays. Fixes #10214
-
apoorvapendse (10 Jan 26)
copy: Append/prepend ellipsis when partially selecting messages. Signed-off-by: apoorvapendse <[email protected]>
-
apoorvapendse (23 Dec 25)
copy_paste: Update formating for multi-message paste. Changes: - Two newlines are inserted before every message header, except the first. - The message recipient text uses bold text followed by "| <date>". - A newline is inserted after a message header, before the sender name. - The sender name uses bold text. - A newline is inserted after the sender name, before the message content. - Two newlines separate consecutive messages from the same recipient, so each message's body and the next message's sender name are split by a blank line. Discussion: https://chat.zulip.org/#narrow/channel/101-design/topic/Multiple.20message.20paste.20formatting/with/2333459. Signed-off-by: apoorvapendse <[email protected]> Co-authored-by: Shubham Padia <[email protected]>
-
apoorvapendse (23 Dec 25)
compose_paste: Update regex to match only list elements. The previous version incorrectly matched with and replaced parts of strings like "\n\n\n**hello**". Signed-off-by: apoorvapendse <[email protected]>
Zulip Security
Security Advisories (32)
- medium Patched
CVE-2026-40300 Message edit history visible in "moves only" policy through /api/v1/messages/{id}/history
- medium Unpatched CVSS 6.1
CVE-2026-26058 Path Traversal in Import
- high Patched CVSS 7.1
CVE-2026-25741 Modification of Payment Method (Stripe Default Card) by Non-Billing Users
- medium Unpatched CVSS 5.3
CVE-2026-25742 Anonymous File Access After Disabling Spectator Access
- low Patched
CVE-2026-24050 Stored XSS in user profile modal
- medium Patched CVSS 6.8
CVE-2025-52559 XSS in digest preview URL
- medium Patched
CVE-2025-47930 Access control bypass for restrictions on creation of specific channel types
- high Patched CVSS 8.2
CVE-2025-31478 Authentication backend configuration bypass
- low Patched CVSS 2.7
CVE-2025-30368 Organization exports can be deleted by administrators of a different organization
- low Patched CVSS 2.7
CVE-2025-30369 Custom profile fields can be deleted by administrators of a different organization
- medium Patched
CVE-2025-27149 "Public data" administrative data exports can leak metadata for non-exported messages and client user agent strings
- medium Patched CVSS 4.3
CVE-2025-25195 Events can leak private channel names
- medium Patched
CVE-2024-56136 /api/v1/jwt/fetch_api_key endpoint can leak if an email address has an account
- high Patched
CVE-2024-27286 Moving messages from public to private streams may leave them accessible
- medium Patched CVSS 4.3
CVE-2024-21630 Non-admins can invite new users to streams they would not otherwise be able to add existing users to
- medium Patched CVSS 4.3
CVE-2023-47642 Invalid metadata access for formerly subscribed streams.
- high Patched CVSS 8.2
CVE-2023-33186 Cross-site scripting vulnerability in Zulip Server development branch via topic tooltip
- medium Patched CVSS 4.3
CVE-2023-32677 Users who can send invitations can add users to streams during invitation, even if they cannot add users to streams at other times
- high Patched CVSS 7.5
CVE-2023-28623 Unauthorized user can register an account in specific configurations involving LDAP and another external authentication backend
- medium Patched CVSS 5.4
CVE-2023-22735 User uploads proxied from S3 lack `Content-Security-Policy` headers, may be served with `Content-Disposition: inline`
- medium Patched CVSS 6.5
CVE-2023-32678 Insufficient authorization check for edition/deletion of messages and topics in private streams by former subscribers
- medium Patched CVSS 4.8
CVE-2022-41914 Non-constant-time SCIM token comparison in Zulip Server
- medium Patched CVSS 4.3
CVE-2022-36048 IP address leak via image proxy bypass in Zulip Server
- medium Patched CVSS 5.4
CVE-2022-31168 Insufficient authorization check for changing bot roles in Zulip Server
- medium Patched CVSS 4.9
CVE-2022-31134 Public data export contains attachments that are non-public
- low Patched CVSS 2
CVE-2022-31017 Zulip Server exposes edit events for old messages to new subscribers in protected-history streams
- low Patched
CVE-2022-24751 Race condition in user deactivation allows continued API access
- medium Patched CVSS 4.6
CVE-2022-23656 Cross-site scripting vulnerability in Zulip Server development branch via tooltip
- high Patched CVSS 7.2
CVE-2022-21706 Multi-use invitations can grant access to other organizations
- high Patched CVSS 8.6
CVE-2021-43799 RabbitMQ exposes ports with weak default secrets
- medium Patched
CVE-2021-43791 Ineffective expiration validation for invitation links
- medium Patched CVSS 4.3
CVE-2021-41115 Regular expression denial-of-service in linkifiers
Zulip Website
Website
Zulip โ organized team chat
Zulip is an organized team chat app for distributed teams of all sizes.
Redirects
Does not redirect
Security Checks
All 65 security checks passed
Server Details
- IP Address 34.225.147.149
- Hostname ec2-34-225-147-149.compute-1.amazonaws.com
- Location Ashburn, Virginia, United States of America, NA
- ISP Amazon Technologies Inc.
- ASN AS16509
Associated Countries
-
US -
CA
Safety Score
Website marked as safe
100%
Blacklist Check
zulip.com was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
Zulip Android App
APK Info
- App Zulip
- Creation Date 04 May 24
- Last Updated 14 Jul 24
- Current Version 27.227
- Privacy Report View on Exodus โ
De-Googled Compatibility
Zulip Reviews
More Team Collaboration
-
Privacy-focused messenger using the Matrix protocol. The Element client allows for group chat rooms, media sharing voice and video group calls.
-
An IRC-based solution is another option, being decentralized there is no point of failure, and it's easy to self-host. However it's important to keep security in mind while configuring your IRC instance and ensure that channels are properly encrypted - IRC tends to be better for open communications. There's a variety of clients to choose from - popular options include: The Longe (Web-based), HexChat (Linux), Pidgin (Linux), WeeChat (Linux, terminal-based), IceChat (Windows), XChat Aqua (MacOS), Palaver (iOS) and Revolution (Android).
-
Mattermost has an open source edition, which can be self-hosted. It makes a good Slack alternative, with native desktop, mobile and web apps and a wide variety of integrations.
-
Easy-to-deploy, self-hosted team collaboration platform with stable, feature-rich cross-platform client apps. The UI is fast, good looking and intuitive, so very little technical experience is needed for users of the platform. Rocket.Chat's feature set is similar to Slack's, making it a good replacement for any team looking to have greater control over their data.
About the Data: Zulip
Change History
- Added #636
API
You can access Zulip's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/zulip The REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share Zulip
Help your friends compare Team Collaboration, and pick
privacy-respecting software and services.
Share Zulip and Awesome Privacy with your network!