snapshot of https://github.com/zulip/zulip.git @ 48c69911c7dd4e03b20552eb3bd77ad8151c1357 (2026-09-15)
Some checks failed
Code scanning / CodeQL (push) Failing after 15s
Zulip production suite / Ubuntu 22.04 production build (push) Failing after 26s
Zulip production suite / Debian 12 production install with custom db name and user (push) Has been skipped
Zulip production suite / Ubuntu 22.04 production install and PostgreSQL upgrade with pgroonga (push) Has been skipped
Zulip production suite / Ubuntu 24.04 production install (push) Has been skipped
Zulip production suite / Ubuntu 26.04 production install (push) Has been skipped
Zulip production suite / Debian 13 production install (push) Has been skipped
Zulip production suite / 7.0 Version Upgrade (push) Has been skipped
Zulip production suite / 8.0 Version Upgrade (push) Has been skipped
Zulip production suite / 6.0 Version Upgrade (push) Has been skipped
Zulip production suite / 10.0 Version Upgrade (push) Has been skipped
Zulip production suite / 9.0 Version Upgrade (push) Has been skipped
Zulip production suite / 12.0 Version Upgrade (push) Has been skipped
Zulip production suite / 11.0 Version Upgrade (push) Has been skipped
GitHub Actions Security Analysis with zizmor / zizmor (push) Failing after 3s
Zulip CI / Debian 12 (Python 3.11, backend + documentation) (push) Failing after 26s
Zulip CI / Ubuntu 22.04 (Python 3.10, backend + frontend) (push) Failing after 3s
Zulip CI / Ubuntu 24.04 (Python 3.12, backend) (push) Failing after 25s
Zulip CI / Ubuntu 26.04 (Python 3.14, backend) (push) Failing after 25s
Zulip CI / Debian 13 (Python 3.13, backend) (push) Failing after 28s
Zulip production suite / Required jobs (push) Has been cancelled
Zulip CI / Required jobs (push) Has been cancelled
API Documentation Update Check / check-feature-level-updated (push) Has been cancelled
API Documentation Update Check / notify-if-api-docs-changed (push) Has been cancelled

This commit is contained in:
upstream-mirror
2026-09-15 15:05:30 +05:00
commit 64898b2c79
8999 changed files with 1757358 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
{% extends "zerver/base.html" %}
{% set entrypoint = "activity" %}
{# Template for installation activity pages #}
{% block title %}
<title>{{ title }} | Zulip analytics</title>
{% endblock %}
{% block content %}
<div class="activity-page">
{% if not is_home %}
<a class="show-all" href="/activity">Home</a>
<br />
{% endif %}
<div>
{{ data|safe }}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,43 @@
<h3>{{ data.title }} {% if data.title_link %}{{ data.title_link }}{% endif %}</h3>
{% if data.title == "Remote servers" %}
{% include "corporate/activity/remote_activity_key.html" %}
{% endif %}
{% if data.header %}
<div class="activity-header-information">
{% for entry in data.header %}
<p class="activity-header-entry"><b>{{ entry.name }}</b>: {{ entry.value }}</p>
{% endfor %}
</div>
{% endif %}
{{ data.rows|length}} rows
<table class="table sortable table-striped table-bordered analytics-table">
<thead class="activity-head">
<tr>
{% for col in data.cols %}
<th>{{ col }}</th>
{% endfor %}
</tr>
</thead>
<tbody>
{% for row in data.rows %}
<tr {% if row.row_class %}class="{{ row.row_class }}"{% endif %}>
{% for field in row.cells %}
<td sortable>{{ field }}</td>
{% endfor %}
</tr>
{% endfor %}
</tbody>
{% if data.totals %}
<tfoot class="activity-foot">
<tr>
{% for total in data.totals %}
<td>{{ total }}</td>
{% endfor %}
</tr>
</tfoot>
{% endif %}
</table>

View File

@@ -0,0 +1,164 @@
<h3 class="installation-activity-header">Installation activity: {{ num_active_sites }} active sites</h3>
<p class="installation-activity-header">{{ utctime }}</p>
<h4>Other views:</h4>
<ul>
<li><a href="/stats/installation">Server total /stats style graphs</a></li>
<li><a href="/activity/remote">Remote servers</a></li>
<li><a href="/activity/integrations">Integrations by client</a></li>
{% if not export %}
<li><a href="/activity?export=true">Export installation chart</a></li>
{% else %}
<li><a href="/activity">Non-export installation chart</a></li>
{% endif %}
</ul>
<h4>Counts chart key:</h4>
<ul>
<li><strong>active (site)</strong> - has ≥5 DAUs</li>
<li>sites are listed if ≥1 users active in last 2 weeks</li>
<li><strong>user</strong> - registered user, not deactivated, not a bot</li>
<li><strong>active (user)</strong> - sent a message, or advanced the pointer (reading messages doesn't count unless advances the pointer)</li>
<li><strong>ARR</strong> (Annual recurring revenue) - the number of users they are paying for * annual price/user.</li>
<li><strong>Rate</strong> - % of full price the customer pays, or will pay, if on a paid plan.</li>
<li><strong>Links</strong>
<ul>
<li><strong><i class="fa fa-home"></i></strong> - realm's Zulip</li>
<li><strong><i class="fa fa-pie-chart"></i></strong> - realm's stats page</li>
<li><strong><i class="fa fa-gear"></i></strong> - realm's support page</li>
</ul>
</li>
<li><strong>DAU</strong> (daily active users) - users active in last 24hr</li>
<li><strong>WAU</strong> (weekly active users) - users active in last 7 * 24hr</li>
<li><strong>Human message</strong> - message sent by non-bot user, and not with known-bot client</li>
</ul>
<div class="installation-activity-filter-container">
<h4>Current filter: {{ current_filter }}</h4>
<p>
<b>Filters:</b>
<a href="/activity?filter=all">All</a> |
<a href="/activity?filter=demo">Demo</a> |
<a href="/activity?filter=sponsored">100% sponsored</a> |
<a href="/activity?filter=free">On free plan</a> |
<a href="/activity?filter=paid">On paid plan</a>
</p>
</div>
<table class="table summary-table sortable table-striped table-bordered">
<thead class="activity-head">
<tr>
{% if not export %}
<th>Links</th>
{% endif %}
<th>Realm</th>
<th>Created (green if ≤12wk)</th>
{% if billing_enabled %}
<th>Plan type</th>
<th>ARR</th>
<th>Rate (%)</th>
{% endif %}
<th>Organization type</th>
<th>Referrer</th>
<th>DAU</th>
<th>WAU</th>
<th>Total users</th>
<th>Bots</th>
{% if not export %}
<th></th>
{% endif %}
<th colspan=8>Human messages sent, last 8 UTC days (today-so-far first)</th>
{% if export %}
<th>Admin emails</th>
{% endif %}
</tr>
</thead>
<tbody>
{% for row in rows %}
<tr>
{% if not export %}
<td>
{{ row.realm_url }}
{{ row.stats_link }}
{{ row.activity_link }}
</td>
{% endif %}
<td>
{{ row.support_link }}
</td>
<td {% if row.is_new %}
class="good" {% else %}
class="neutral" {% endif %} >
{{ row.date_created_day }}
</td>
{% if billing_enabled %}
<td>
{{ row.plan_type_string }}
</td>
<td class="number">
{% if row.arr %}
{{ row.arr }}
{% endif %}
</td>
<td class="number">
{% if row.effective_rate != "" %}
{{ row.effective_rate }}
{% endif %}
</td>
{% endif %}
<td>
{{ row.org_type_string }}
</td>
<td>
{{ row.how_realm_creator_found_zulip }}
</td>
<td class="number">
{{ row.dau_count }}
</td>
<td class="number">
{{ row.wau_count }}
</td>
<td class="number">
{{ row.user_profile_count }}
</td>
<td class="number">
{{ row.bot_count }}
</td>
{% if not export %}
<td>&nbsp;</td>
{% endif %}
{% if row.history %}
{{ row.history|safe }}
{% else %}
<td colspan=8></td>
{% endif %}
{% if export %}
<td>
{{ row.admin_emails }}
</td>
{% endif %}
</tr>
{% endfor %}
</tbody>
<tfoot class="activity-foot">
<tr>
{% for total in totals %}
<td>{{ total }}</td>
{% endfor %}
</tr>
</tfoot>
</table>

View File

@@ -0,0 +1,23 @@
<h4>Chart key:</h4>
<ul>
<li><strong>Server mobile pushes</strong>
<ul>
<li>Count of forwarded push notifications in last 7 days</li>
<li>Includes today's current count</li>
</ul>
</li>
<li><strong>ARR</strong> (annual recurring revenue)
<ul>
<li>If plan has a fixed price, displays that value</li>
<li>Otherwise, is an estimate based on the current users multiplied by annual price per user</li>
<li>Currently, does not account for first year, flat $20 discount per month</li>
<li>Plans with status of <strong>Free trial</strong> show estimated revenue for full year</li>
</ul>
</li>
<li><strong>Links</strong>
<ul>
<li><strong><i class="fa fa-pie-chart"></i></strong> - remote server's stats page</li>
<li><strong><i class="fa fa-gear"></i></strong> - remote server's support page</li>
</ul>
</li>
</ul>

View File

@@ -0,0 +1,68 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Download the Zulip app for your device" %}
{% set PAGE_DESCRIPTION = "Zulip has apps for every platform. Download the Zulip
app for macOS, Windows, Linux, Android, iOS or Terminal." %}
{% block marketing_content %}
<div class="portico-landing apps">
<div class="hero">
<div id="waves"></div>
<div class="inner-content">
<div class="info" hidden>
<div class="flex">
<div class="cta">
<h1>Zulip for <span class="platform"></span></h1>
<p class="description"></p>
<a class="button desktop-download-link no-action" hidden href=""><span class="button green">Download Zulip for <span class="platform"></span></span></a>
<a class="button download-from-google-play-store" hidden href=""><img src="{{ static('images/store-badges/google-play-badge.png') }}" alt=""/></a>
<a class="button download-from-apple-app-store" hidden href=""><img src="{{ static('images/store-badges/app-store-badge.svg') }}" alt=""/></a>
<span id="download-from-microsoft-store" hidden>or <a href="https://apps.microsoft.com/store/detail/XP8HN41S4PLGZ3">download from the Microsoft Store</a></span>
<span id="download-android-apk" hidden>or manually download APK for the <a class="android-apk-current" href="">current</a> or <a class="android-apk-legacy" href="">legacy</a> app</span>
<div id="download-mac-alt" hidden>
<div id="download-mac-alt-apple-silicon" hidden>or <a href="/apps/download/mac-arm64">download <strong>Apple Silicon</strong> build <i>(newer Macs)</i></a></div>
<div id="download-mac-alt-intel" hidden>or <a href="/apps/download/mac-intel">download <strong>Intel</strong> build <i>(older Macs)</i></a></div>
</div>
<p class="download-instructions"></p>
</div>
</div>
</div>
</div>
</div>
<div class="other-apps">
<h2>Apps for every platform.</h2>
<div class="apps">
<a class="app-option" href="/apps/mac">
<i class="icon fa fa-apple" data-label="macOS"></i>
</a>
<a class="app-option" href="/apps/windows">
<i class="icon fa fa-windows" data-label="Windows"></i>
</a>
<a class="app-option" href="/apps/linux">
<i class="icon fa fa-linux" data-label="Linux"></i>
</a>
<a class="app-option" href="/apps/android">
<i class="icon fa fa-android" data-label="Android"></i>
</a>
<a class="app-option" href="/apps/ios">
<i class="icon fa fa-mobile-phone" data-label="iOS"></i>
</a>
<a class="app-option" href="https://github.com/zulip/zulip-terminal#readme">
<i class="icon fa fa-terminal" data-label="Terminal (beta)"></i>
</a>
</div>
<div id="third-party-apps">
Zulip also works great in pinned
<a href="/help/supported-browsers">browser tabs</a>
and multi-protocol desktop chat apps
like <a href="https://rambox.pro">Rambox</a>
and <a href="https://ferdium.org/">Ferdium</a>.
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,42 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Website attributions | Zulip" %}
{% set PAGE_DESCRIPTION = "Attributions for the Zulip website." %}
{% set allow_search_engine_indexing = False %} <!-- Page is not indexed by search engines. -->
{% block marketing_content %}
<div class="portico-landing why-page">
<div class="hero empty-hero"></div>
<div class="main">
<div class="padded-content">
<div class="inner-content">
<h1>Website attributions</h1>
<ul>
<li>
<b>On <a href="/for/business/">/for/business/</a> page:</b>
<img alt="" src="{{ static('images/landing-page/companies/software-engineer.svg') }}" />
<p>"<a href="https://iconscout.com/illustration/software-engineer-2043023">Software engineer Illustration</a>" By <a href="https://iconscout.com/contributors/delesign/illustrations">Delesign Graphic</a> is licensed under <a href="https://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.</p>
</li>
<li>
<b>On <a href="/zulip-cloud/">/zulip-cloud/</a> page:</b>
<img alt="" src="{{ static('images/landing-page/zulip-cloud/support.svg') }}" />
<p><a href="https://storyset.com/work">Work illustrations by Storyset</a></p>
</li>
<li>
<b>On <a href="/role/engineers/">/role/engineers/</a> page:</b>
<img alt="" src="{{ static('images/landing-page/engineers/programmer.jpg') }}" />
<p><a href="https://pixabay.com/photos/woman-program-programming-glasses-3597101/">Programmer illustration by Pixabay</a></p>
</li>
<li>
<b>On <a href="/role/engineers/">/role/engineers/</a> page:</b>
<img alt="" src="{{ static('images/landing-page/engineers/focus.jpg') }}" />
<p><a href="https://pixabay.com/photos/dog-laptop-computer-glasses-2983021/">Dog in glasses with a laptop illustration by Pixabay</a></p>
</li>
</ul>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,654 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "billing" %}
{% block title %}
<title>{{ _("Billing") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div id="billing-page" class="register-account flex full-page" data-billing-base-url="{{ billing_base_url }}">
<div class="center-block new-style">
{% if admin_access and has_active_plan %}
{% if is_sponsorship_pending %}
<div class="alert alert-success billing-page-success" id="billing-sponsorship-pending-message-top">
This organization has requested sponsorship for a
{% if is_self_hosted_billing and sponsorship_plan_name != "Community" %}
discounted
{% endif %}
<a href="{{ billing_base_url }}/plans/">{{ sponsorship_plan_name }}</a> plan.<br/><a href="mailto:support@zulip.com">Contact Zulip support</a> with any questions or updates.
</div>
{% endif %}
{% if success_message %}
<div class="alert alert-success billing-page-success" id="billing-success-message-top">
{% if complimentary_access_next_plan_name and "PLAN_NAME" in success_message %}
Your organization will be upgraded to {{ complimentary_access_next_plan_name }} on {{ complimentary_access_plan_end_date }}.
{% else %}
{{ success_message.replace("PLAN_NAME", plan_name) }}
{% endif %}
</div>
{% endif %}
<div class="pitch">
<h1>
Zulip
{% if is_self_hosted_billing %}
{% else %}
Cloud
{% endif %}
billing for {{ org_name }}
</h1>
</div>
<div class="alert alert-danger" id="error-message-box"></div>
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
<div class="white-box">
<div id="billing-page-details">
<div class="input-box billing-page-field">
<h2 class="billing-section-title">Your plan</h2>
<div class="billing-section-content">
{% if free_trial or downgrade_at_end_of_free_trial %}
<a href="{{ billing_base_url }}/plans/">
{{ plan_name }} <i>(free trial)</i>
</a>
{% elif complimentary_access_plan %}
<a href="{{ billing_base_url }}/plans/">
{{ plan_name.replace(" (complimentary)", "") -}}
</a>
<i>(complimentary access)</i>
{% else %}
<a href="{{ billing_base_url }}/plans/">
{{ plan_name }}
</a>
{% endif %}
</div>
</div>
{% if complimentary_access_plan %}
<div class="input-box billing-page-field" id="complimentary-access-end-notice-wrapper">
<div id="complimentary-access-end-notice" class="not-editable-realm-field">
<i>Your complimentary access to Zulip Basic ends on {{ complimentary_access_plan_end_date }}.</i>
</div>
</div>
{% endif %}
<div class="input-box billing-page-field org-billing-frequency-wrapper"
data-current-billing-frequency="{{ billing_frequency }}"
{%if free_trial %}data-free-trial="true"{% endif %}
{%if downgrade_at_end_of_cycle %}data-downgrade-eoc="true"{% endif %}
{%if switch_to_monthly_at_end_of_cycle %}data-switch-to-monthly-eoc="true"{% endif %}
{%if switch_to_annual_at_end_of_cycle %}data-switch-to-annual-eoc="true"{% endif %}>
<h2 class="billing-section-title">Billing frequency</h2>
{% if downgrade_at_end_of_free_trial or downgrade_at_end_of_cycle or complimentary_access_plan or fixed_price_plan or (free_trial and not charge_automatically) %}
<div class="billing-section-content">
{{ billing_frequency }}
</div>
{% elif switch_to_annual_at_end_of_cycle %}
<select name="schedule" id="org-billing-frequency-annual" class="billing-frequency-select billing-section-content">
<option value="Monthly">Monthly</option>
<option value="Annual" selected>Annual</option>
</select>
<div class="billing-frequency-message not-editable-realm-field">
Your plan will switch to annual billing on {{ renewal_date }}.
</div>
{%elif switch_to_monthly_at_end_of_cycle %}
<select name="schedule" id="org-billing-frequency-monthly" class="billing-frequency-select billing-section-content">
<option value="Monthly" selected>Monthly</option>
<option value="Annual">Annual</option>
</select>
<div class="billing-frequency-message not-editable-realm-field">
Your plan will switch to monthly billing on {{ renewal_date }}.
</div>
{% else %}
<select name="schedule" id="org-billing-frequency-default" class="billing-frequency-select billing-section-content">
<option value="Monthly" {% if billing_frequency == "Monthly" %}selected{% endif %}>Monthly</option>
<option value="Annual" {% if billing_frequency == "Annual" %}selected{% endif %}>Annual</option>
</select>
{% endif %}
<button id="org-billing-frequency-confirm-button" class="hide">
<span class="billing-button-text">Update</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
<div id="org-billing-frequency-change-error" class="alert alert-danger billing-page-error"></div>
</div>
{% if complimentary_access_plan or fixed_price_plan %}
{% elif automanage_licenses %}
<div class="input-box billing-page-field">
<h2 class="billing-section-title">
Number of licenses
{% if is_self_hosted_billing %}
<a href="/help/self-hosted-billing#how-does-automatic-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% else %}
<a href="/help/zulip-cloud-billing#how-does-automatic-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% endif %}
</h2>
<div class="billing-section-content">
{{ licenses }}
<br />
Licenses are managed
<a href="/help/self-hosted-billing#how-does-automatic-license-management-work">automatically</a>.
You can
<a class="toggle-license-management" type="button">switch</a>
to manual license management.
</div>
</div>
{% else %}
{% if not (free_trial or downgrade_at_end_of_free_trial) %}
<div class="input-box billing-page-field input-box-number">
<h2 class="billing-section-title">
Number of licenses for current billing period
{% if is_self_hosted_billing %}
<a href="/help/self-hosted-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% else %}
<a href="/help/zulip-cloud-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% endif %}
</h2>
<div class="number-input-with-label">
<form id="current-license-change-form">
<input type="number" name="licenses" autocomplete="off" id="current-manual-license-count" class="short-width-number-input billing-section-content" data-original-value="{{ licenses }}" value="{{ licenses }}" {%if not exempt_from_license_number_check %}min="{{ seat_count }}"{% endif %} required/>
</form>
<span class="licence-count-in-use">licenses ({{ seat_count }} in use)</span>
<button id="current-manual-license-count-update-button" class="license-count-update-button hide">
<span class="billing-button-text">Update</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
<div id="current-license-change-error" class="alert alert-danger billing-page-error"></div>
<div class="not-editable-realm-field billing-page-license-management-description">
Licenses are managed
<a href="/help/self-hosted-billing#how-does-manual-license-management-work">manually</a>.
You can
<a class="toggle-license-management" type="button">switch</a>
to automatic license management.
</div>
</div>
{% endif %}
{% if not (downgrade_at_end_of_cycle or downgrade_at_end_of_free_trial) %}
<div class="input-box billing-page-field input-box-number">
<h2 class="billing-section-title">
Number of licenses for next billing period
{% if is_self_hosted_billing %}
<a href="/help/self-hosted-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% else %}
<a href="/help/zulip-cloud-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% endif %}
</h2>
<div class="number-input-with-label">
<form id="next-license-change-form">
<input type="number" name="licenses_at_next_renewal" autocomplete="off" id="next-manual-license-count" class="short-width-number-input billing-section-content" data-original-value="{{ licenses_at_next_renewal }}" value="{{ licenses_at_next_renewal }}" {%if not exempt_from_license_number_check %}min="{{ seat_count }}"{% endif %} required/>
</form>
<span class="licence-count-in-use">licenses ({{ seat_count }} in use)</span>
<button id="next-manual-license-count-update-button" class="license-count-update-button hide">
<span class="billing-button-text">Update</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
<div id="next-license-change-error" class="alert alert-danger billing-page-error"></div>
</div>
{% endif %}
{% endif %}
<form id="toggle-license-management-form">
<input name="toggle_license_management" type="hidden" value="true" />
</form>
<div id="toggle-license-management-error" class="alert alert-danger"></div>
<div class="input-box billing-page-field">
<h2 class="billing-section-title">Billing contact</h2>
<div class="billing-section-content">
<a href="mailto:{{ stripe_email }}">{{ stripe_email }}</a>
</div>
</div>
<div id="cardchange-error" class="alert alert-danger"></div>
<div class="input-box billing-page-field">
<h2 class="billing-section-title">Payment method</h2>
<div class="billing-section-content">
{{ payment_method }}
</div>
{% if charge_automatically %}
<div class="user-stripe-card-update input-box billing-page-field">
<button class="user-stripe-card-update-button" id="update-card-button">
<span class="billing-button-text">Update card</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
{% endif %}
<br />
<div class="stripe-customer-billing-portal not-editable-realm-field">
<a href="{{ billing_base_url }}/customer_portal/?return_to_billing_page=true">View and update</a> billing information that will be displayed on your next invoice and receipt.
</div>
</div>
<div class="input-box billing-page-field">
<div class="next-payment-info not-editable-realm-field">
{% if renewal_amount %}
{% if downgrade_at_end_of_cycle %}
{% if is_self_hosted_billing %}
Your organization will be downgraded to the <strong>Free</strong> plan at the end of the
current billing period ({{ renewal_date }}). You will lose access to the
<a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">benefits</a>
of your current plan. For organizations with more than 10 users, this
includes losing access to the
<a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile Push Notification Service</a>.
{% else %}
Your organization will be downgraded to <strong>Zulip Cloud Free</strong> at the end of the current billing
period (<strong>{{ renewal_date }}</strong>). You will lose access to unlimited search history and
<a href="{{ billing_base_url }}/plans/">other features</a> of your current plan.
{% endif %}
{% elif downgrade_at_end_of_free_trial %}
{% if is_self_hosted_billing %}
Your organization will be downgraded to the <strong>Free</strong> plan at the end of the free trial
({{ renewal_date }}). You will lose access to the
<a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">benefits</a>
of your current plan. For organizations with more than 10 users, this
includes losing access to the
<a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile Push Notification Service</a>.
{% else %}
Your organization will be downgraded to <strong>Zulip Cloud Free</strong> at the end of the free trial
(<strong>{{ renewal_date }}</strong>). You will lose access to unlimited search history and
<a href="{{ billing_base_url }}/plans/">other features</a> of your current plan.
{% endif %}
{% else %}
{% if fixed_price_plan %}
This is a fixed-price plan.
{% endif %}
{% if charge_automatically %}
{% if complimentary_access_plan %}
Your plan will automatically upgrade to {{ complimentary_access_next_plan_name }} on {{ complimentary_access_plan_end_date }}.
{% else %}
Your plan will automatically renew on <strong>{{ renewal_date }}</strong>.
{% endif %}
{% else %}
{% if free_trial %}
{% if has_paid_invoice_for_free_trial %}
You have no outstanding invoices. Your next plan renewal date is <b>{{ free_trial_next_renewal_date_after_invoice_paid }}</b>. An invoice will be sent to <b>{{ stripe_email }}</b> on the same day.
{% else %}
To ensure continuous access to {{ plan_name }}, please pay your <a href="{{ billing_base_url }}/invoices/">invoice</a> before the end of your trial.
Your free trial ends on <br /><strong>{{ renewal_date }}</strong>.
{% endif %}
{% else %}
Next invoice will be sent on <strong>{{ renewal_date }}</strong>.
{% endif %}
{% endif %}
<br />
{% if free_trial and not charge_automatically %}
{% else %}
<div class="input-box billing-page-field">
<h2 class="billing-section-title">Expected next charge</h2>
{% if not fixed_price_plan %}
<div class="billing-section-content">
${{ pre_discount_renewal_cents }} (${{ price_per_license }} x {{ licenses_at_next_renewal }} {{ 'user' if licenses_at_next_renewal == 1 else 'users' }} x
{% if switch_to_annual_at_end_of_cycle %}
12 months
{%- elif switch_to_monthly_at_end_of_cycle %}
1 month
{%- else %}
{{ "1 month" if billing_frequency == "Monthly" else "12 months" }}
{%- endif -%})
{% if discounted_months_left != 0 %}
<br />
<span class="flat-discount-minus-sign">−</span>
<span class="flat-discount-separator">${{ flat_discount }}/month off</span> <i class="billing-page-discount">({{ discounted_months_left }} {{ "month" if discounted_months_left == 1 else "months" }} remaining)</i>
{% endif %}
{% if discount_percent %}
<br />
<i class="billing-page-discount">Includes: {{ discount_percent }}% discount</i>
{% endif %}
</div>
{% endif %}
</div>
<h1>${{ renewal_amount }}</h1>
{% endif %}
{% if not fixed_price_plan and using_min_licenses_for_plan %}
<i>Minimum purchase for this plan: {{ min_licenses_for_plan }} licenses</i>
{% endif %}
{% endif %}
{% elif fixed_price_plan %}
This is a fixed-price plan. Your plan ends on <strong>{{ renewal_date }}</strong>.
You will be contacted by Zulip Sales a couple of months before <strong>{{renewal_date}}</strong> to discuss plan renewal.
{% else %}
Your plan ends on <strong>{{ renewal_date }}</strong>, and does not renew.
{% endif %}
</div>
</div>
<div class="input-box billing-page-field">
<h2 class="billing-section-title">Invoices</h2>
<div class="billing-section-content">
<a href="{{ billing_base_url }}/invoices/">
View invoices
</a>
</div>
</div>
{% if free_trial and not charge_automatically %}
<!--
We don't show cancel plan button for free trial with invoice payments to avoid confusion about the current status.
Plan automatically downgrades anyway if user fails to pay the invoice.
-->
{% else %}
<div id="planchange-error" class="alert alert-danger"></div>
<div id="planchange-input-section">
{% if free_trial and not downgrade_at_end_of_free_trial %}
<div class="end-free-trial plan-toggle-action input-box billing-page-field" id="end-free-trial">
<button class="end-free-trial-button plan-toggle-action-button">
<span class="billing-button-text">Cancel plan</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
{% elif downgrade_at_end_of_cycle or downgrade_at_end_of_free_trial %}
<div class="reactivate-current-plan plan-toggle-action input-box billing-page-field" id="reactivate-subscription">
<button class="reactivate-current-plan-button plan-toggle-action-button">
<span class="billing-button-text">
{% if downgrade_at_end_of_free_trial %}
Cancel downgrade
{% else %}
Reactivate subscription
{% endif %}
</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
{% elif complimentary_access_plan %}
<div class="plan-toggle-action input-box billing-page-field" id="cancel-complimentary-access-upgrade">
<button class="plan-toggle-action-button">
<span class="billing-button-text">Cancel upgrade</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
{% else %}
<div class="cancel-current-plan plan-toggle-action input-box billing-page-field" id="cancel-subscription">
<button class="plan-toggle-action-button {% if is_self_hosted_billing %}cancel-current-self-hosted-plan-button{% else %}cancel-current-cloud-plan-button{% endif %}">
<span class="billing-button-text">Cancel plan</span>
<object class="loader billing-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
{% endif %}
</div>
<form id="planchange-form">
{% if free_trial %}
<input name="status" type="hidden" value="{{ CustomerPlan.DOWNGRADE_AT_END_OF_FREE_TRIAL }}" />
{% elif downgrade_at_end_of_free_trial %}
<input name="status" type="hidden" value="{{ CustomerPlan.FREE_TRIAL }}" />
{% elif downgrade_at_end_of_cycle or complimentary_access_plan %}
<input name="status" type="hidden" value="{{ CustomerPlan.ACTIVE }}" />
{% else %}
<input name="status" type="hidden" value="{{ CustomerPlan.DOWNGRADE_AT_END_OF_CYCLE }}" />
{% endif %}
</form>
{% endif %}
</div>
</div>
<hr />
<div class="support-link">
<p>
To make changes to your plan or view your billing history <a href="mailto:support@zulip.com">contact Zulip support</a>.
</p>
</div>
{% else %}
<!-- For sponsored or sponsorship pending organizations we redirect to /sponsorship page. -->
<!-- For organizations on free plan we redirect to /plans page. -->
<div class="billing-status-page">
<div class="pitch">
<h1>Zulip Cloud billing for {{ org_name }}</h1>
</div>
<div class="white-box">
<p>
You do not have permission to view this page.
</p>
</div>
</div>
{% endif %}
</div>
</div>
<div id="confirm-end-free-trial" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-end-free-trial-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-end-free-trial-label" class="modal__title dialog_heading">
Downgrade {{ org_name }} to
{% if is_self_hosted_billing %}
Free plan?
{% else %}
Zulip Cloud Free?
{% endif %}
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
{% if is_self_hosted_billing %}
Your organization will be downgraded to the <strong>Free</strong> plan at the
end of your free trial ({{ renewal_date }}). You will lose access to the
<a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">benefits</a>
of your current plan. For organizations with more than 10 users, this
includes losing access to the
<a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile Push Notification Service</a>.
{% else %}
Your organization will be downgraded to <strong>Zulip Cloud Free</strong> at the end of your free trial
({{ renewal_date }}). You will lose access to unlimited search history and
<a href="{{ billing_base_url }}/plans/">other features</a>
of your current plan. Are you sure you want to continue?
{% endif %}
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Never mind') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Downgrade') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-licenses-modal-increase" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-licenses-modal-increase-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-licenses-modal-increase-label" class="modal__title dialog_heading">
Confirm adding licenses
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Are you sure you want to increase the number of licenses from
<b><span class="current_license_count_holder"></span></b> to
<b><span class="new_license_count_holder"></span></b>?
</p>
<p>
{% if payment_method == "Invoice" %}
You will receive an invoice for
{% else %}
You will be charged for
{% endif %}
<b><span class="difference_license_count_holder"></span></b> additional licenses.
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Cancel') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Confirm') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-licenses-modal-decrease" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-licenses-modal-decrease-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-licenses-modal-decrease-label" class="modal__title dialog_heading">
Confirm decreasing licenses
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Are you sure you want to decrease the number of licenses from
<b><span class="current_license_count_holder"></span></b> to
<b><span class="new_license_count_holder"></span></b>?
</p>
<p>
Your organization will be limited to at most
<b><span class="new_license_count_holder"></span></b> users.
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Cancel') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Confirm') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-cancel-cloud-subscription-modal" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-cancel-cloud-subscription-modal-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-cancel-cloud-subscription-modal-label" class="modal__title dialog_heading">
Downgrade {{ org_name }} to Zulip Cloud Free?
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Your organization will be downgraded to <strong>Zulip Cloud Free</strong> at the end of the current billing
period ({{ renewal_date }}). You will lose access to unlimited search history and
<a href="{{ billing_base_url }}/plans/">other features</a>
of your current plan. Are you sure you want to continue?
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Never mind') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Downgrade') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-cancel-self-hosted-subscription-modal" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-cancel-self-hosted-subscription-modal-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-cancel-self-hosted-subscription-modal-label" class="modal__title dialog_heading">
Downgrade {{ org_name }} to the Free plan?
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Your organization will be downgraded to the <strong>Free</strong> plan at the end of the
current billing period ({{ renewal_date }}). You will lose access to the
<a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">benefits</a>
of your current plan. For organizations with more than 10 users, this
includes losing access to the
<a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile Push Notification Service</a>.
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Never mind') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Downgrade') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-cancel-complimentary-access-upgrade-modal" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-cancel-complimentary-access-upgrade-modal-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-cancel-complimentary-access-upgrade-modal-label" class="modal__title dialog_heading">
Cancel scheduled upgrade of {{ org_name }}?
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Your organization will be not be upgraded to <strong>{{ complimentary_access_next_plan_name }}</strong>
on {{ complimentary_access_plan_end_date }}. If your organization has more than
10 users at that time, you will lose access to the
<a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile Push Notification Service</a>.
You will also not receive the <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">other benefits</a>
of the {{ complimentary_access_next_plan_name }} plan. Are you sure you want to continue?
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Never mind') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Cancel upgrade') }}</span>
</button>
</footer>
</div>
</div>
</div>
<div id="confirm-toggle-license-management-modal" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-toggle-license-management-modal-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-toggle-license-management-modal-label" class="modal__title dialog_heading">
Confirm switching to
{% if automanage_licenses %}
manual
{% else %}
automatic
{% endif %}
license management
</h1>
<div class="modal__subtitle">
Are you sure you want to switch to
<a href="/help/self-hosted-billing#how-does-automatic-license-management-work">
{% if automanage_licenses %}
manual
{% else %}
automatic
{% endif %}
license management
</a>?
</div>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Never mind') }}</button>
<button class="modal__button dialog_submit_button">
<span>{{ _('Confirm') }}</span>
</button>
</footer>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,31 @@
{% extends "zerver/portico.html" %}
{% block title %}
<title>Not available for demo organizations | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="app portico-page">
<div class="app-main portico-page-container center-block flex full-page account-creation new-style">
<div class="inline-block">
<div class="get-started">
<h1>Not available for demo organizations</h1>
</div>
<div class="white-box">
<p>
{% if upgrade_request %}
Demo organizations cannot be directly upgraded to a paid plan.
{% elif sponsorship_request %}
Demo organizations cannot apply for sponsorship.
{% endif %}
Please start by
<a href="/help/demo-organizations#convert-a-demo-organization-to-a-permanent-organization">
converting your demo organization
</a>
to a permanent Zulip Cloud organization.
</p>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,53 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "billing-event-status" %}
{% block title %}
<title>{{ _("Billing status") }} | Zulip</title>
{% endblock %}
{% block customhead %}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% endblock %}
{% block content %}
<div class="app portico-page">
<div class="billing-upgrade-page">
<div class="hero small-hero"></div>
<div class="page-content">
<div class="main">
<br />
<div id="data" data-stripe-session-id="{{ stripe_session_id}}" data-stripe-invoice-id="{{ stripe_invoice_id }}" data-billing-base-url="{{ billing_base_url }}"></div>
<div class="alert alert-success" id="webhook-success"></div>
<div class="alert alert-danger" id="webhook-error"></div>
<div id="webhook-loading">
<div class="zulip-loading-logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12">
<circle cx="386.56" cy="386.56" r="386.56"/>
<path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z"/>
</svg>
</div>
<div id="webhook_loading_indicator"></div>
</div>
<form id="restartsession-form">
<input type="hidden" name="stripe_invoice_id" value="{{ stripe_invoice_id }}" />
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
</form>
<div class="alert alert-success" id="restartsession-success">Redirecting to Stripe Checkout</div>
<div class="alert alert-danger" id="restartsession-error"></div>
<div id="restartsession-loading">
<div class="zulip-loading-logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 773.12 773.12">
<circle cx="386.56" cy="386.56" r="386.56"/>
<path d="M566.66 527.25c0 33.03-24.23 60.05-53.84 60.05H260.29c-29.61 0-53.84-27.02-53.84-60.05 0-20.22 9.09-38.2 22.93-49.09l134.37-120c2.5-2.14 5.74 1.31 3.94 4.19l-49.29 98.69c-1.38 2.76.41 6.16 3.25 6.16h191.18c29.61 0 53.83 27.03 53.83 60.05zm0-281.39c0 20.22-9.09 38.2-22.93 49.09l-134.37 120c-2.5 2.14-5.74-1.31-3.94-4.19l49.29-98.69c1.38-2.76-.41-6.16-3.25-6.16H260.29c-29.61 0-53.84-27.02-53.84-60.05s24.23-60.05 53.84-60.05h252.54c29.61 0 53.83 27.02 53.83 60.05z"/>
</svg>
</div>
<div id="restartsession_loading_indicator"></div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,56 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "billing_auth" %}
{% set PAGE_TITLE = "Authenticate server for Zulip plan management" %}
{% block portico_content %}
<div id="server-login-page" class="register-account flex full-page">
<div class="center-block new-style">
<div class="pitch">
<h1>Authenticate server<br/>for Zulip plan management</h1>
</div>
<div class="white-box">
<div id="server-login-page-details">
{% if error_message %}
<div id="server-login-error" class="alert alert-danger">{{ error_message }}</div>
{% endif %}
<div id="server-login-input-section">
<form id="server-login-form" method="post" action="/serverlogin/">
{{ csrf_input }}
{% if next_page %}
<input type="hidden" name="next_page" value="{{ next_page }}" />
{% endif %}
<div id="server-login-form-title" class="input-box server-login-form">
<div class="not-editable-realm-field">
To access plan management for a Zulip
server, first enter <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html#plan-management-for-an-entire-zulip-server">your server's credentials</a>.
</div>
</div>
<div class="input-box server-login-form-field">
<label for="zulip-org-id" class="inline-block label-title">
zulip_org_id
</label>
<input id="zulip-org-id" name="zulip_org_id" class="required" type="text"/>
<div class="alert alert-danger server-login-form-field-error zulip_org_id-error"></div>
</div>
<div class="input-box server-login-form-field">
<label for="password" class="inline-block label-title">zulip_org_key</label>
<input id="password" name="zulip_org_key" class="required" type="password"/>
<div class="alert alert-danger server-login-form-field-error zulip_org_key-error"></div>
</div>
<div id="server-login-page-button-container">
<button type="submit" id="server-login-button" class="stripe-button-el invoice-button">
<span class="server-login-button-text">Continue</span>
<img class="loader remote-billing-button-loader" src="{{ static('images/loading/loader-white.svg') }}" alt="" />
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,52 @@
{% extends "zerver/portico_signup.html" %}
{% set entrypoint = "billing_auth" %}
{% block title %}
{% if remote_server_hostname %}
<title>Enter log in email | Zulip</title>
{% else %}
<title>Enter email | Zulip</title>
{% endif %}
{% endblock %}
{% block portico_content %}
<div class="register-account flex full-page" id="remote-billing-confirm-email">
<div class="center-block new-style">
<div class="pitch">
{% if remote_server_hostname %}
<h1>Enter log in email</h1>
{% else %}
<h1>Enter email</h1>
{% endif %}
</div>
<div class="white-box">
<form id="remote-billing-confirm-email-form" method="post" action="{{ action_url }}">
{{ csrf_input }}
{% if next_page %}
<input type="hidden" name="next_page" value="{{ next_page }}" />
{% endif %}
<div class="input-box server-login-form-field" id="remote-billing-confirm-email-intro">
<div class="not-editable-realm-field">
{% if remote_server_hostname %}
Enter the email address of the person who is logging in to manage plans and billing for this server (yourself or someone else). They will receive an email from Zulip with a log in link.
{% else %}
Enter the email address you want to use for Zulip plan management. You will receive a one-time confirmation email.
{% endif %}
</div>
</div>
<div class="input-box server-login-form-field">
<label for="email" class="inline-block label-title">Email</label>
<input id="email" name="email" type="email" class="required" {% if email %}value="{{ email }}"{% endif %} />
<div id="server-login-form-email-error" class="alert alert-danger server-login-form-field-error email-error"></div>
</div>
<div class="upgrade-button-container">
<button type="submit" id="remote-billing-confirm-email-button" class="stripe-button-el invoice-button">
<span class="server-login-button-text">Continue</span>
<img class="loader remote-billing-button-loader" src="{{ static('images/loading/loader-white.svg') }}" alt="" />
</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,41 @@
{% extends "zerver/portico_signup.html" %}
{% set entrypoint = "billing_auth" %}
{% block title %}
{% if remote_server_hostname %}
<title>Log in link sent | Zulip</title>
{% else %}
<title>Confirm your email address | Zulip</title>
{% endif %}
{% endblock %}
{% block portico_content %}
<div class="app portico-page">
<div class="app-main portico-page-container center-block flex full-page account-creation account-email-confirm-container new-style">
<div class="inline-block">
<div class="get-started">
{% if remote_server_hostname %}
<h1>Log in link sent</h1>
{% else %}
<h1>Confirm your email address</h1>
{% endif %}
</div>
<div class="white-box">
{% if remote_server_hostname %}
<p>We have sent <span class="user_email semi-bold">{{ email }}</span> a log in link for Zulip plan management. This link will expire in 24 hours.</p>
{% else %}
<p>To finish logging in, check your email account (<span class="user_email semi-bold">{{ email }}</span>) for a confirmation email from Zulip.</p>
{% endif %}
{% include 'zerver/dev_env_email_access_details.html' %}
</div>
</div>
</div>
</div>
{% endblock %}
{% block customhead %}
{{ super() }}
{% endblock %}

View File

@@ -0,0 +1,81 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "billing_auth" %}
{% block title %}
<title>
{% if next_page and next_page == "deactivate" %}
Log in to deactivate registration for {{ host }} | Zulip
{% else %}
Log in to Zulip plan management for {{ host }} | Zulip
{% endif %}
</title>
{% endblock %}
{% block portico_content %}
<div id="remote-billing-confirm-login-page" class="register-account flex full-page">
<div class="center-block new-style">
<div class="pitch">
{% if next_page and next_page == "deactivate" %}
<h1>Log in to deactivate registration for<br/>{{ host }}</h1>
{% else %}
<h1>Log in to Zulip plan management for<br/>{{ host }}</h1>
{% endif %}
</div>
<div class="white-box">
<form id="remote-billing-confirm-login-form" method="post" action="{{ action_url }}">
{{ csrf_input }}
<div class="input-box remote-billing-confirm-login-form-field">
<label for="full_name" class="inline-block label-title">Name</label>
{% if not user_full_name %}
<input id="full_name" name="full_name" class="required" type="text" />
<div id="remote-billing-confirm-login-form-full_name-error" class="alert alert-danger remote-billing-confirm-login-form-field-error full_name-error"></div>
{% else %}
<div class="not-editable-realm-field">
{{ user_full_name }}
</div>
{% endif %}
</div>
<div class="input-box remote-billing-confirm-login-form-field">
<label for="user-email" class="inline-block label-title">
Email
</label>
<div id="user-email" class="not-editable-realm-field">
{{ user_email }}
</div>
</div>
<!-- user_full_name is not present only when user first logs in which also perfect to set email preferences -->
{% if (not user_full_name) and (not (next_page and next_page == "deactivate")) %}
<div class="input-group remote-billing-confirm-email-subscription-form-field">
<label for="enable-major-release-emails" class="checkbox">
<input id="enable-major-release-emails" name="enable_major_release_emails" type="checkbox" value="true" checked="checked" />
<span class="rendered-checkbox"></span>
Sign me up for emails about <strong>major Zulip releases</strong> and other big announcements (a few times a year)
</label>
<label for="enable-maintenance-release-emails" class="checkbox">
<input id="enable-maintenance-release-emails" name="enable_maintenance_release_emails" type="checkbox" value="true" checked="checked" />
<span class="rendered-checkbox"></span>
Sign me up for emails about <strong>all Zulip releases</strong>, including security and maintenance releases (recommended for server administrators)
</label>
</div>
{% endif %}
{% if tos_consent_needed %}
<div class="input-group terms-of-service remote-billing-confirm-login-form-field" id="remote-billing-confirm-login-tos-wrapper">
<label for="remote-billing-confirm-login-tos" class="checkbox">
<input id="remote-billing-confirm-login-tos" name="tos_consent" class="required" type="checkbox" value="true" />
<span class="rendered-checkbox"></span>
I agree to the <a href="{{ root_domain_url }}/policies/terms" target="_blank" rel="noopener noreferrer">Terms of Service</a>.
</label>
<div id="remote-billing-confirm-login-form-tos_consent-error" class="alert alert-danger remote-billing-confirm-login-form-field-error tos_consent-error"></div>
</div>
{% endif %}
<div class="upgrade-button-container">
<button type="submit" id="remote-billing-confirm-login-button" class="stripe-button-el invoice-button">
<span class="remote-billing-confirm-login-button-text">Continue</span>
<img class="loader remote-billing-button-loader" src="{{ static('images/loading/loader-white.svg') }}" alt="" />
</button>
</div>
</form>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,55 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "billing_auth" %}
{% block title %}
<title>{{ _("Deactivate server registration?") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div id="server-deactivate-page" class="register-account account-deactivation flex full-page">
<div class="new-style">
<div class="pitch">
<h1>
Deactivate registration for<br />{{ server_hostname }}?
</h1>
</div>
<div class="white-box">
<div id="server-deactivate-details">
{% if show_existing_plan_error %}
<div id="server-deactivate-error" class="alert alert-danger">
Could not deactivate registration. You must first
<a href="https://zulip.com/help/self-hosted-billing#cancel-paid-plan">cancel</a>
all paid plans associated with this server, including scheduled plan upgrades.
</div>
{% endif %}
<form id="server-deactivate-form" method="post" action="{{ action_url }}">
{{ csrf_input }}
<div id="server-deactivate-form-top-description" class="input-box server-deactivate-form-field">
<div class="not-editable-realm-field">
You are about to deactivate this server's
registration with
the <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Zulip
Mobile Push Notification Service</a>. This
will disable delivery of mobile push
notifications for all organizations hosted
on <b>{{ server_hostname }}</b>.
</div>
</div>
<input type="hidden" name="confirmed" value="true" />
<div class="upgrade-button-container">
<button type="submit" id="server-deactivate-button" class="stripe-button-el invoice-button">
<span class="server-deactivate-button-text">Deactivate registration</span>
<img class="loader remote-billing-button-loader" src="{{ static('images/loading/loader-white.svg') }}" alt="" />
</button>
</div>
</form>
<div class="input-box upgrade-page-field">
<div class="support-link not-editable-realm-field">
Questions? Contact <a href="mailto:support@zulip.com">support@zulip.com</a>.
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,32 @@
{% extends "zerver/portico_signup.html" %}
{% set entrypoint = "billing_auth" %}
{% block title %}
<title>Server registration deactivated | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="register-account flex full-page" id="account-deactivated-success-page">
<div class="center-block new-style">
<div class="pitch">
<h1>
Registration deactivated for<br />{{ server_hostname }}
</h1>
</div>
<div class="white-box">
<div id="account-deactivated-success-page-details">
<div class="input-box account-deactivated-success-page-field" id="account-deactivated-success-page-top-message">
<div class="not-editable-realm-field">
Your server's registration has been deactivated.
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}
{% block customhead %}
{{ super() }}
{% endblock %}

View File

@@ -0,0 +1,30 @@
{% extends "zerver/portico_error_pages/portico_error_page.html" %}
{% block title %}
<title>{{ _("Plan management not available") }} | Zulip</title>
{% endblock %}
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %} Plan management is not available for this
organization, because your Zulip server is already on a
{{ server_plan_name }} plan, which covers all
organizations on this server. See the <b>Server-level billing</b> tab of the
<a href="https://zulip.com/help/self-hosted-billing#log-in-to-billing-management">log
in instructions</a> to administer the plan for your
Zulip server.
{% endtrans %}
</p>
<p>
{% trans %} To move the plan from the server to this
organization, or for other questions, <a href="mailto:{{
support_email }}">contact support</a>.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,26 @@
{% extends "zerver/portico_error_pages/portico_error_page.html" %}
{% block title %}
<title>{{ _("Plan management not available") }} | Zulip</title>
{% endblock %}
{% block error_page_content %}
<img src="{{ static('images/errors/400art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Plan management not available") }}</h1>
<p>
{% trans %}
Plan management for this server is not available because at least one organization
hosted on this server already has an active plan.
{% endtrans %}
</p>
<p>
{% trans %}
<a href="https://zulip.com/help/self-hosted-billing#manage-billing">Log in</a> to plan management for your
organization instead, or <a href='mailto:{{ support_email }}'>contact support</a> with any questions.
{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,19 @@
{% extends "zerver/portico_error_pages/portico_error_page.html" %}
{% block title %}
<title>{{ _("Rate limit exceeded") }} | Zulip</title>
{% endblock %}
{% block error_page_content %}
<img src="{{ static('images/errors/500art.svg') }}" alt=""/>
<div class="errorbox">
<div class="errorcontent">
<h1 class="lead">{{ _("Rate limit exceeded.") }}</h1>
<p>
{% trans %}Your server has exceeded the limit for how
often this action can be performed.{% endtrans %}
{% trans %}You can try again in {{retry_after_string}}.{% endtrans %}
</p>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,42 @@
{% extends "zerver/portico.html" %}
{% block title %}
<title>Required metadata missing | Zulip</title>
{% endblock %}
{% block portico_content %}
<div class="center-block flex full-page account-creation new-style">
<div class="inline-block">
<div class="get-started">
<h1>Error: Server not uploading basic metadata</h1>
</div>
<div class="white-box">
<p>
Managing your Zulip plan requires your server to upload
up-to-date
<a
href="https://zulip.readthedocs.io/en/latest/production/mobile-push-notifications.html#uploading-basic-metadata">basic
metadata</a>. This data is not being uploaded successfully.
</p>
{% if remote_realm_session %}
<p>
If your Zulip server's administrator is not able to fix this, <a
href="mailto:support@zulip.com">contact Zulip support</a>.
</p>
{% elif supports_remote_realms %}
<p>
If your Zulip server's administrator is not able to fix this, <a
href="mailto:support@zulip.com">contact Zulip support</a>.
</p>
{% else %}
<p>
Your Zulip server's administrator can fix this issue by <a
href="https://zulip.readthedocs.io/en/stable/production/upgrade.html">upgrading</a>
the server to Zulip 8.0+, or <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html#uploading-usage-statistics">enabling the
<code>SUBMIT_USAGE_STATISTICS</code> setting</a>.
</p>
{% endif %}
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,188 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "sponsorship" %}
{% block title %}
<title>
{% if is_sponsored or is_sponsorship_pending %}
Zulip
{% if is_remotely_hosted %}
{% else %}
Cloud
{% endif %}
billing for {{ org_name }}
{% else %}
Request Zulip
{% if is_remotely_hosted %}
{% else %}
Cloud
{% endif %} sponsorship
{% endif %}
</title>
{% endblock %}
{% block portico_content %}
{% if is_sponsored or is_sponsorship_pending %}
<div class="register-account flex full-page sponsorship-status-page">
<div class="center-block new-style">
<div class="alert alert-success sponsorship-page-success" id="sponsorship-status-success-message-top">
{% if is_sponsored %}
Zulip is sponsoring a free <a href="{{ billing_base_url }}/plans/">{{ sponsorship_plan_name }}</a> plan for this organization. 🎉
{% else %}
This organization has requested sponsorship for a
{% if is_remotely_hosted and sponsorship_plan_name != "Community" %}
discounted
{% endif %}
<a href="{{ billing_base_url }}/plans/">{{ sponsorship_plan_name }}</a> plan.<br/><a href="mailto:support@zulip.com">Contact Zulip support</a> with any questions or updates.
{% endif %}
</div>
<div class="pitch">
<h1>
Zulip
{% if is_remotely_hosted %}
{% else %}
Cloud
{% endif %}
billing for {{ org_name }}
</h1>
</div>
<div class="white-box">
<div id="sponsorship-status-page-details">
<div class="input-box sponsorship-form-field">
<label for="sponsored-org-current-plan" class="inline-block label-title">Your plan</label>
<div id="sponsored-org-current-plan" class="not-editable-realm-field">
{% if is_sponsored %}
<a href="{{ billing_base_url }}/plans/">{{ sponsorship_plan_name }}</a>
{% elif complimentary_access %}
<a href="{{ billing_base_url }}/plans/">Zulip Basic</a> <i>(complimentary access)</i>
{% else %}
<a href="{{ billing_base_url }}/plans/">{{ plan_name }}</a>
{% endif %}
</div>
</div>
</div>
</div>
{% if is_sponsored %}
<hr />
<div class="support-link">
<p>
To make changes to your plan or view your billing history <a href="mailto:support@zulip.com">contact Zulip support</a>.
</p>
</div>
{% endif %}
</div>
</div>
{% else %}
<div class="register-account flex full-page sponsorship-page">
<div class="center-block new-style">
<div class="pitch">
<h1>
Request Zulip
{% if is_remotely_hosted %}
{% else %}
Cloud
{% endif %} sponsorship
</h1>
</div>
<div class="white-box">
<div id="sponsorship-error" class="alert alert-danger"></div>
<div id="sponsorship-input-section">
<form id="sponsorship-form" method="post" data-billing-base-url="{{ billing_base_url }}" data-is-remotely-hosted="{{ is_remotely_hosted }}">
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
<div class="input-box sponsorship-form-field">
<label for="org-name" class="inline-block label-title">Organization</label>
<div id="org-name" class="not-editable-realm-field">{{ org_name }}</div>
</div>
<div class="input-box sponsorship-form-field">
<div class="inline-block relative">
<select name="organization_type" id="organization-type" class="sponsorship-form-select">
{% for org_type in sorted_org_types %}
{% if not org_type[1].hidden %}
<option data-string-value="{{ org_type[0] }}"
{% if org_type[1].id == realm_org_type %}selected{% endif %}
value="{{ org_type[1].id }}">
{{ _(org_type[1].name) }}
</option>
{% endif %}
{% endfor %}
</select>
</div>
<label for="organization_type" class="inline-block label-title">
Organization type
{% if is_remotely_hosted %}
<a href="/help/self-hosted-billing#free-community-plan" target="_blank" rel="noopener noreferrer">
<i class="fa fa-question-circle-o" aria-hidden="true"></i>
</a>
{% endif %}
</label>
</div>
<p id="sponsorship-discount-details"></p>
{% if is_remotely_hosted %}
<div class="input-box sponsorship-form-field">
<div class="inline-block relative">
<select name="requested_plan" id="organization-requested-plan" class="sponsorship-form-select">
<option value="Community" selected>
Community
</option>
<option value="Basic">
Basic (discounted)
</option>
<option value="Business">
Business (discounted)
</option>
</select>
</div>
<label for="organization-requested-plan" class="inline-block label-title">Requested plan</label>
</div>
{% endif %}
<div class="input-box sponsorship-form-field">
<label for="org-website" class="inline-block
label-title">Organization website (if any)</label>
<input id="org-website" name="website" type="text"/>
<div id="sponsorship-org-website-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="input-box sponsorship-form-field">
<label for="description" class="inline-block
label-title">Description of your organization</label>
<textarea id="description" name="description" cols="100" rows="5"></textarea>
<div id="sponsorship-description-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="input-box sponsorship-form-field">
<label for="plan-to-use-zulip" class="inline-block
label-title">How do you plan to use Zulip?</label>
<textarea id="plan-to-use-zulip" name="plan_to_use_zulip" cols="100" rows="2"></textarea>
<div id="sponsorship-plan-to-use-zulip-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="input-box sponsorship-form-field">
<label for="expected-total-users" class="inline-block label-title">Expected number of users (approximate range)</label>
<input id="expected-total-users" name="expected_total_users" type="text" />
<div id="sponsorship-expected-total-users-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="input-box sponsorship-form-field">
<label for="paid-users-count" class="inline-block label-title">How many paid staff does your organization have?</label>
<input id="paid-users-count" name="paid_users_count" type="text"/>
<div id="sponsorship-paid-users-count-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="input-box sponsorship-form-field">
<label for="paid-users-description" class="inline-block
label-title">Description of paid staff (if any)</label>
<textarea id="paid-users-description" name="paid_users_description" cols="100" rows="2"></textarea>
<div id="sponsorship-paid-users-description-error" class="alert alert-danger sponsorship-field-error"></div>
</div>
<div class="upgrade-button-container">
<button type="submit" id="sponsorship-button" class="stripe-button-el invoice-button">
<span class="sponsorship-button-text">Submit</span>
<object class="loader sponsorship-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
</div>
</form>
</div>
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,365 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "upgrade" %}
{% block title %}
<title>{{ _("Upgrade") }} | Zulip</title>
{% endblock %}
{% block portico_content %}
<div id="upgrade-page" class="register-account flex full-page">
<div class="center-block new-style">
{% if is_self_hosting_management_page and is_sponsorship_pending %}
<div class="alert alert-success billing-page-success" id="upgrade-page-sponsorship-pending-message-top">
This organization has requested sponsorship for a
{% if sponsorship_plan_name == "Business" %}
discounted
{% endif %}
<a href="{{ page_params.billing_base_url }}/plans/">{{ sponsorship_plan_name }}</a> plan.<br/><a href="mailto:support@zulip.com">Contact Zulip support</a> with any questions or updates.
</div>
{% endif %}
{% if success_message %}
<div class="alert alert-success billing-page-success" id="upgrade-success-message-top">
{{ success_message }}
</div>
{% endif %}
<div class="pitch">
<h1>
{% if page_params.free_trial_days %}
Start free trial of
{% else %}
Upgrade {{ customer_name }} to
{% endif %}
<a href="{{ page_params.billing_base_url }}/plans/">
{{ plan }}
</a>
</h1>
</div>
<div class="white-box">
<div id="upgrade-page-details">
{% if pay_by_invoice_payments_page %}
<div class="input-box top-of-page-notice upgrade-page-field">
<div class="not-editable-realm-field">
{% if is_free_trial_invoice_expired_notice %}
Your free trial of {{ free_trial_invoice_expired_notice_page_plan_name }} has expired.
<a href="{{ pay_by_invoice_payments_page }}" target="_blank" rel="noopener noreferrer">An invoice</a>
for ${{ scheduled_upgrade_invoice_amount_due }} has been sent to <b>{{ stripe_email }}</b>.
To reactivate your {{ free_trial_invoice_expired_notice_page_plan_name }} plan, please pay the amount due.
Once the invoice has been paid, reload this page to see billing details.
{% else %}
<a href="{{ pay_by_invoice_payments_page }}" target="_blank" rel="noopener noreferrer">An invoice</a>
{% if fixed_price_plan %}
for $<span class="due-today-price"></span>
{% endif %}
{% if scheduled_upgrade_invoice_amount_due %}
for ${{ scheduled_upgrade_invoice_amount_due }}
{% endif %}
has been sent to <b>{{ stripe_email }}</b>.
To complete the plan upgrade process, please pay the amount due. Once the invoice has been paid, reload this page to see billing details.
{% endif %}
</div>
</div>
{% else %}
<input type="hidden" name="csrfmiddlewaretoken" value="{{ csrf_token }}" />
<form id="autopay-form">
<input type="hidden" name="seat_count" value="{{ seat_count }}" />
<input type="hidden" name="signed_seat_count" value="{{ signed_seat_count }}" />
<input type="hidden" name="salt" value="{{ salt }}" />
{% if page_params.setup_payment_by_invoice %}
<input type="hidden" name="billing_modality" value="send_invoice" />
{% else %}
<input type="hidden" name="billing_modality" value="charge_automatically" />
{% endif %}
<input type="hidden" name="tier" value="{{ page_params.tier }}" />
<div id="free-trial-top-banner" class="input-box upgrade-page-field">
{% if page_params.free_trial_days %}
<div class="not-editable-realm-field">
{% if page_params.setup_payment_by_invoice %}
An invoice will immediately be sent to <b>{{ stripe_email }}</b>. To ensure continuous access to Zulip Basic,
please pay your invoice before your free trial ends on {{ free_trial_end_date }}.
{% else %}
Add a credit card to start your <b>{{ page_params.free_trial_days }}-day free trial</b> of
{{ plan }}. Your card will not be charged if you
cancel in the first {{ page_params.free_trial_days }} days.
{% endif %}
</div>
{% endif %}
</div>
{% if page_params.free_trial_days and not page_params.setup_payment_by_invoice %}
<input type="hidden" name="schedule" value="monthly" />
{% else %}
<div class="input-box upgrade-page-field">
<select name="schedule" id="payment-schedule-select">
{% if fixed_price_plan %}
<option value="monthly">Pay monthly</option>
<option value="annual">Pay annually</option>
{% else %}
<option value="monthly" id="autopay_monthly_price"></option>
<option value="annual" id="autopay_annual_price_per_month"></option>
{% endif %}
</select>
<label for="payment-schedule-select">Payment schedule</label>
</div>
{% endif %}
{% if complimentary_access_plan_end_date %}
<div class="input-box upgrade-page-field">
<select name="remote_server_plan_start_date" id="remote-server-plan-start-date-select">
<option value="billing_cycle_end_date">{{ complimentary_access_plan_end_date }}</option>
<option value="today">Today</option>
</select>
<label for="remote-server-plan-start-date-select">Plan start date</label>
</div>
{% endif %}
{% if manual_license_management %}
<div class="input-box upgrade-page-field" id="upgrade-manual-license-count-wrapper">
<label for="licenses" class="inline-block label-title">Number of licenses {% if not exempt_from_license_number_check %}(minimum {{ seat_count }}){% endif %}</label>
<input type="number" name="licenses" autocomplete="off" {% if not exempt_from_license_number_check %}min="{{ seat_count }}" value="{{ seat_count }}"{% endif %} autocomplete="off" id="manual_license_count" required/>
<div id="upgrade-licenses-change-error" class="alert alert-danger upgrade-page-error"></div>
</div>
<input type="hidden" name="license_management" value="manual" />
{% else %}
<input type="hidden" name="license_management" value="automatic" />
{% endif %}
{% if complimentary_access_plan_end_date %}
<div class="input-box upgrade-page-field" id="due-today-for-future-update-wrapper">
<label for="due-today-for-future-update" class="inline-block label-title">
Due today
</label>
<div id="due-today-for-future-update" class="not-editable-realm-field">
<h1>$0</h1>
</div>
</div>
{% endif %}
<div class="input-box upgrade-page-field">
<label for="due-today" class="inline-block label-title">
{% if complimentary_access_plan_end_date %}
<span id="due-today-remote-server-title">
Due {{ complimentary_access_plan_end_date }}
</span>
{% endif %}
<span id="due-today-title">
Due
{% if page_params.free_trial_days %}
on {{ free_trial_end_date }}
{% else %}
today
{% endif %}
</span>
</label>
<div id="due-today" class="not-editable-realm-field">
{% if fixed_price_plan %}
<h1>$<span class="due-today-price"></span></h1>
{% else %}
$<span id="pre-discount-renewal-cents"></span>
($<span class="due-today-unit-price"></span> x
{% if not manual_license_management %}
{{ seat_count }}
{% else %}
<span class="due-today-license-count">{{ seat_count }}</span>
{% endif %}
<span class="due-today-license-count-user-plural">
{{ 'user' if seat_count == 1 else 'users' }}
</span> x
<span class="due-today-duration"></span>)
{% if page_params.flat_discounted_months > 0 %}
<br/>
<span class="flat-discount-minus-sign">−</span>
<span class="flat-discount-separator">$<span class="flat-discounted-price"></span>/month off</span> <i class="billing-page-discount">({{ page_params.flat_discounted_months }} {{ "month" if page_params.flat_discounted_months == 1 else "months" }} remaining)</i>
{% else %}
<br/>
<i class="billing-page-discount hide">Includes: <span class="billing-page-selected-schedule-discount"></span>% discount</i>
{% endif %}
<h1>$<span class="due-today-price"></span></h1>
{% if page_params.free_trial_days and not manual_license_management %}
<i>Your actual bill will depend on the number of
active users in your organization.</i>
{% endif %}
{% if not manual_license_management and using_min_licenses_for_plan %}
<i>Minimum purchase for this plan: {{ min_licenses_for_plan }} licenses</i>
{% endif %}
{% endif %}
</div>
</div>
{% if page_params.free_trial_days %}
{% else %}
<div id="license-management-details" class="input-box upgrade-page-field license-management-section">
{% if fixed_price_plan %}
<p class="not-editable-realm-field">
This is a fixed-price plan. You will be contacted by Zulip Sales a couple of months before the plan ends to discuss plan renewal.
</p>
{% elif not manual_license_management %}
<p class="not-editable-realm-field">
Your subscription will renew automatically. Your bill will vary based on the number of active users in your organization.
You can also <a href="{{ page_params.billing_base_url }}/upgrade/?manual_license_management=true&tier={{ page_params.tier }}">purchase a fixed number of licenses</a> instead.
{% if is_self_hosting_management_page %}
See <a href="/help/self-hosted-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% else %}
See <a href="/help/zulip-cloud-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% endif %}
</p>
<input type="hidden" name="licenses" id="automatic_license_count" value="{{ seat_count }}" />
{% else %}
<p class="not-editable-realm-field">
Your subscription will renew automatically. You will be able to manage the number of licenses on your organization's billing page.
{% if not page_params.setup_payment_by_invoice %}
You can also <a href="{{ page_params.billing_base_url }}/upgrade/?tier={{ page_params.tier }}">choose automatic license management</a> instead.
{% if is_self_hosting_management_page %}
See <a href="/help/self-hosted-billing#how-does-automatic-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% else %}
See <a href="/help/zulip-cloud-billing#how-does-automatic-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% endif %}
{% else %}
{% if is_self_hosting_management_page %}
See <a href="/help/self-hosted-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% else %}
See <a href="/help/zulip-cloud-billing#how-does-manual-license-management-work" target="_blank" rel="noopener noreferrer">here</a> for details.
{% endif %}
{% endif %}
</p>
{% endif %}
</div>
{% endif %}
<div {% if page_params.setup_payment_by_invoice %} id="update-invoice-billing-info" {% elif payment_method %} id="upgrade-payment-info"{% endif %}>
{% if page_params.setup_payment_by_invoice %}
{% elif payment_method %}
<div class="input-box upgrade-page-field" id="upgrade-payment-method-wrapper">
<label for="customer-payment-method-for-upgrade" class="inline-block label-title">Payment method</label>
<div id="customer-payment-method-for-upgrade" class="not-editable-realm-field">
{{ payment_method }}
</div>
</div>
{% endif %}
<div id="upgrade-payment-method-container" class="upgrade-add-card-container input-box upgrade-page-field">
<button id="upgrade-add-card-button" {% if page_params.setup_payment_by_invoice %}class="update-billing-information-button"{% elif payment_method %}class="update-card-button"{% endif %}>
<span id="upgrade-add-card-button-text">
{% if page_params.setup_payment_by_invoice %}
Update billing information
{% elif payment_method %}
Update card
{% else %}
Add card
{% endif %}
</span>
<object class="loader upgrade-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
{% if not fixed_price_plan %}
<span class="not-editable-realm-field" id="upgrade-payment-by-invoice-container">
{% if page_params.setup_payment_by_invoice %}
or <a href="{{ page_params.billing_base_url }}/upgrade/?tier={{ page_params.tier }}">pay by card</a>
{% else %}
or <a href="{{ page_params.billing_base_url }}/upgrade/?manual_license_management=true&tier={{ page_params.tier }}&setup_payment_by_invoice=true" id="upgrade-payment-by-invoice-link" data-tippy-content="Requires purchasing a fixed number of licenses" data-tippy-placement="right">pay by invoice</a>
{% endif %}
</span>
{% endif %}
</div>
{% if not page_params.free_trial_days and payment_method %}
<div class="stripe-billing-information not-editable-realm-field">
{% if not manual_license_management %}
<a href="{{ page_params.billing_base_url }}/customer_portal/?tier={{ page_params.tier }}">View and update</a> billing information that will be displayed on your invoice and receipt.
{% else %}
<a href="{{ page_params.billing_base_url }}/customer_portal/?manual_license_management=true&tier={{ page_params.tier }}">View and update</a> billing information that will be displayed on your invoice and receipt.
{% endif %}
</div>
{% endif %}
<div id="upgrade-cardchange-error" class="alert alert-danger upgrade-page-error"></div>
</div>
<div class="upgrade-button-container input-box upgrade-page-field" >
<button id="org-upgrade-button" {% if not page_params.setup_payment_by_invoice and not payment_method %}disabled{% endif %}>
<span id="org-upgrade-button-text">
{% if complimentary_access_plan_end_date %}
<span id="org-future-upgrade-button-text-remote-server">
Schedule upgrade to {{ plan }}
</span>
{% endif %}
<span id="org-today-upgrade-button-text">
{% if page_params.free_trial_days %}
Start {{ page_params.free_trial_days }}-day free trial
{% elif page_params.setup_payment_by_invoice %}
Send invoice
{% else %}
Purchase {{ plan }}
{% endif %}
</span>
</span>
<object class="loader upgrade-button-loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
<div id="autopay-error" class="alert alert-danger upgrade-page-error hide"></div>
</div>
</form>
<form id="upgrade-cardchange-form">
{% if manual_license_management %}
<input type="hidden" name="manual_license_management" value="true" />
{% endif %}
<input type="hidden" name="tier" value="{{ page_params.tier }}" />
</form>
{% endif %}
<div class="input-box upgrade-page-field">
<div class="support-link not-editable-realm-field">
{% if pay_by_invoice_payments_page %}
If you have questions or need to make any changes, please contact <a href="mailto:sales@zulip.com">sales@zulip.com</a>.
{% else %}
Questions? Contact <a href="mailto:sales@zulip.com">sales@zulip.com</a>.
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
{% if page_params.setup_payment_by_invoice %}
<div id="confirm-send-invoice-modal" class="micromodal" aria-hidden="true">
<div class="modal__overlay" tabindex="-1">
<div class="modal__container" role="dialog" aria-modal="true" aria-labelledby="confirm-send-invoice-modal-label">
<header class="modal__header">
<div class="modal__header-content">
<h1 id="confirm-send-invoice-modal-label" class="modal__title dialog_heading">
{% if page_params.free_trial_days %}
Start free trial for {{ plan }}
{% else %}
Send invoice for {{ plan }}
{% endif %}
</h1>
</div>
<button type="button" class="modal__close" aria-label="{{ _('Close modal') }}" tabindex="0" data-micromodal-close>
<i class="zulip-icon zulip-icon-close" aria-hidden="true"></i>
</button>
</header>
<main class="modal__content">
<p>
Please be sure to
<a href="{{ page_params.billing_base_url }}/customer_portal/?manual_license_management=true&tier={{ page_params.tier }}&setup_payment_by_invoice=true" target="_blank" rel="noopener noreferrer">configure</a>
your billing details if you have not done so already. This information will appear on your invoice and receipt.
<br />
{% if page_params.free_trial_days %}
<br />
Starting free trial will immediately send an invoice to <b>{{ stripe_email }}</b>.
This is your last chance to update the billing information on your invoice.
{% else %}
Your invoice will be sent to <b>{{ stripe_email }}</b>.
{% endif %}
</p>
</main>
<footer class="modal__footer">
<button class="modal__button dialog_exit_button" aria-label="{{ '(Close this dialog window)' }}" data-micromodal-close>{{ _('Cancel') }}</button>
<button class="modal__button dialog_submit_button">
<span>
{% if page_params.free_trial_days %}
{{ _('Send invoice and start free trial') }}
{% else %}
{{ _('Send invoice') }}
{% endif %}
</span>
</button>
</footer>
</div>
</div>
</div>
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Asciidoctor open-source community | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip became the heart of the Asciidoctor
community by enabling organized, inclusive and thoughtful discussion." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Asciidoctor <br /> open-source community</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for<br /> <a href="/for/open-source/">open
source projects</a> and <a href="/for/communities/">communities</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/asciidoctor-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,199 @@
## Asciidoctor: An active open-source community building software to share knowledge
Started in 2012, the [Asciidoctor](https://asciidoctor.org) community develops
an [open-source](https://github.com/asciidoctor) text processor for parsing
AsciiDoc content, enriching it, and converting it to formats such as HTML 5,
DocBook, PDF, and many others.
For years, the project struggled to find a way to bring the community together
in one place. Thanks to recommendations from leaders at other open-source
communities, the Asciidoctor project leads decided to give Zulip a try to see if
it could solve those challenges. “Moving to Zulip transformed our dialogue,
making it organized, inclusive, and thoughtful in a way it never was before,”
says project lead [Dan Allen](https://github.com/mojavelinux). “We finally had a
home base. Zulip has been a game changer for our community.”
> Zulip has been a game changer for our community.
>
> — Project lead Dan Allen
## A decade-long search for a communication platform to bring the community together
“In the early days, we started out only communicating using the GitHub issue
tracker,” Dan Allen recalls, “but we could see that it wasn’t going to scale. It
doesn’t provide a channel for general dialogue.” The project tried IRC, but it
was unapproachable for newcomers and lacked modern chat and moderation features.
Asciidoctor set up a discussion list, but that wasn’t a good fit either.
Contacting hundreds of people over email to ask a simple question always felt
inappropriate, and the lack of real-time interaction ended up making
conversations take longer.
Looking for a web-based chat solution, Asciidoctor tapped into Gitter in 2014.
“Gitter certainly looks modern and approachable. However, we quickly learned
that the single, running thread of the channel was both chaotic and stressful,”
Dan says. And the platform had mostly stagnated.
Many users in the community pleaded for threads, but Gitter’s threading feature
(finally added in 2020), only made the situation more problematic for the
community. “Threads buried the replies. You had to either navigate to threads
using notifications, or scroll back multiple pages to find the little ‘see
replies’ link and rediscover the thread. It was just so tedious,” Dan recalls.
> The conversations in Gitter were becoming more about Gitter and its
> limitations and less about the project itself.
>
> — Project lead Dan Allen
While Gitter allows users to create new rooms, what the project really needed
was a single community space with “socially distanced” conversations going on.
They needed a new model. And that’s exactly what they found in Zulip.
## Asciidoctor moves to Zulip: “All the anxiety and stress was gone”
With the community continuing to grow, Dan and fellow maintainers decided it was
time to seek out a better solution. Drawing on advice from leaders of other
open-source communities, the project decided to give Zulip a try in early 2021.
[Zulip’s channels and topics model](/why-zulip/) immediately clicked. “Channels
partition the community without making it feel divided. When someone has a
question, they can find the most relevant channel and either make a new topic or
contribute to an existing one.” This paradigm was a game-changer. “Literally the
day we moved to Zulip, all the anxiety and stress of keeping up with the
discourse was gone,” Dan says.
With Zulip, Dan has developed a comfortable workflow for catching up on
conversations after being away. “When I start my day, I open up the [Recent
topics](/help/recent-conversations) page and work through the topics that have
activity on-by-one,” Dan describes. More casual community participants can [skim
the topic list](/help/reading-strategies) to find interesting discussions, and
mark topics they don’t care about as read with a single click.
## Powerful moderation tools help keep conversations on track
Zulip’s topic model helps discussions stay focused. “Zulip starts the
conversation out on the right foot by giving it its own space as a topic,” Dan
explains. “As a result, conversations don’t have to be branched from an
arbitrary spot, and the discussion is much more likely to stay focused and
succinct.”
> Zulip starts the conversation out on the right foot by giving it its own
> space as a topic.
>
> — Project lead Dan Allen
If a topic starts in the wrong place or veers off course, Zulip’s [moderation
tools](/help/moderating-open-organizations) make it easy to fix. Community
moderators can keep the dialogue organized by reclassifying topics and posts
without disrupting the ongoing conversation. “If someone accidentally posts to
the wrong channel or topic, Zulip allows me to [move those messages
around](/help/move-content-to-another-channel) so they land in the right spot,”
Dan says. “Moving messages also sends a subtle hint to the person posting about
where to post the next time. And I can use [topic
references](/help/link-to-a-message-or-conversation#link-to-a-topic-within-zulip)
to link to the new topic location, or to a related topic. That’s incredibly
powerful,” Dan says.
The ability to [mark topics as resolved](/help/resolve-a-topic) helps moderators
see at a glance which topics require their attention. “Many topics reach a
logical conclusion when the initial question has been answered, and the initial
poster will typically express that they’re satisfied. At that point, one of us
marks the topic as resolved,” Dan explains. “When I’m looking for topics that
need my attention, I can focus on the ones that aren’t yet resolved and try to
help get them to that state.” Later on, community members can use resolved
topics [as a reference source](#zulip-makes-information-easy-to-find).
## Zulip enables organized, inclusive and thoughtful discussion
After a successful launch of the Asciidoctor community on Zulip, Asciidoctor’s
sibling project [Antora](https://antora.org) adopted it as well. For both
projects, using Zulip has been night and day compared to other platforms. “I can
manage hundreds of participants across two communities extremely efficiently,
and I don’t feel stressed,” says Dan. “I used it for my company chat as well.
Zulip is calm and organized. I can immediately see what people are asking
and jump to respond when I need to.”
> I can manage hundreds of participants across two communities extremely
> efficiently.
>
> — Project lead Dan Allen
The sense of space created by Zulip’s topic model has made the community more
inclusive. “Using Zulip gives space to a much broader range of voices.
We’re seeing people participating who never participated before,” Dan says.
“People who are less extroverted, who don’t speak English natively, or just
can’t type as quickly now all have a chance to be part of the dialogue. Zulip
offers a more manageable pace.”
> We’re seeing people participating who never participated before.
>
> — Project lead Dan Allen
Even the tone of conversation has shifted, becoming more respectful and
thoughtful. “People are more relaxed. They can think and take their time to
reply. Topics give people space. People don’t feel like they are trying to talk
over someone else. That means you can have more constructive dialogue because
the volume level is lower,” says Dan. At the same time, Zulip enables
lightweight interactions. “Often times, I participate just [using
emoji](/help/emoji-reactions). I must use the 👍 and 🎉 reactions dozens of
times a day,” Dan says.
Channels have also helped the community get to know one another better. “When we
created the instance, we set up a #social channel. We seeded it with the topic
‘introduce yourself’, and new members took full advantage of it,” Dan says. The
social channel has brought a more personal touch to the community. “In real life,
no one just walks in and starts asking questions out of the blue,” Dan points
out. “In the social channel, we’ve talked about non-technical topics like TV
series, screen setups, and holiday wishes just to get to know the people behind
the screen name and enrich each other’s lives in other ways. What we learned?
Everyone enjoys a lot of British TV. ;)”
## Zulip makes information easy to find
As a community grows, its conversation history becomes a trove of reference
information. However, this history provides value only if the information is
findable. “Once a conversation went out of view in Gitter, it was essentially
lost,” Dan says. “The search was global across the whole Gitter instance, and it
only returned excerpts with no sense of context. It was often faster to just
scroll through the history in an attempt to try to find where the conversation
happened than it was to search.”
In contrast, Zulip offers a [faceted search](/help/search-for-messages) that
lets you find past discussions with pinpoint accuracy. “You can narrow the
search to a channel or topic (with autocomplete!),” Dan points out. The results
are presented with topic headings, making it easier to see whether the message
is relevant. “You can click the topic to see the message in context,” Dan says.
“It’s not only a great way to search, but it’s a great way to catch up on
messages too. You can also search for all messages you sent, which turns out to
be a great navigation tool and a memory saver!”
## “Zulip is the heart of our community”
Dan is passionate about supporting Zulip’s development. “If we don’t sponsor the
open source projects we love, we’ll have no one else to blame if we live in a
world of proprietary software,” Dan says. “We truly feel heard by Zulip
developers when we provide feedback. We also love that Zulip is [truly open
source](https://blog.zulip.com/2021/04/28/why-zulip-is-on-github-sponsors/), not
open core like some alternatives. And we very much appreciate Zulip supporting
open source by hosting our Zulip instances.”
“Zulip is the heart of our community, and nearly everyone who participates
absolutely loves it,” Dan says. “It really does provide [everything we
need](/features/) to manage the discourse, including topic-based threads,
mentions, faceted search, moderation controls, polls, and emoji.” Speaking on
behalf of the Asciidoctor and Antora projects, Dan wholeheartedly recommends
that other communities give it a try. “Many communities have been strained to
the limits during the pandemic,” says Dan. “Zulip brings health back to these
communities.”
---
Check out our guide on using Zulip for [open source](/for/open-source/), and
learn how Zulip [helps communities scale](/for/communities/)!

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Atolio | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip helps create an open communication
culture at Atolio, a distributed tech startup." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Atolio</h1>
<p>Distributed startup</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/atolio-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,120 @@
Founded in 2019 by a seasoned team of engineering and sales leaders, Atolio is a
small startup with big ambitions to radically improve the way people deal with
information at work. They have deep expertise in what it takes to [empower teams
to collaborate effectively](/why-zulip/), and have thought hard about how to
enable effective collaboration for their own team.
> The first-class threads in Zulip are absolutely critical to how we work. As
> a fully distributed company, we needed a modern way to support the different
> ways people work, while ensuring that everyone can find the current and
> historical topics that are important to them. So many people on Hacker News
> talk about using Zulip - I'm so glad we joined them!
>
> — David Lanstein, co-founder and CEO of [Atolio](https://www.atolio.com/)
## Taking the opportunity to pick the best collaboration tools
Atolio’s founders set out to build a fully distributed company from the get-go,
and they knew how important it would be to choose the right set of collaboration
tools. “We had all used Slack, Jira and Confluence before, but we didn’t want to
default to those options,” says Atolio’s co-founder and CTO Gareth Watts. “We
wanted to take the opportunity to pick the best tools for our future team.”
As past users of Slack’s team chat, Atolio’s founders were well aware of its
downsides. "Slack is an extremely noisy environment. It’s very difficult to keep
up with what your colleagues are doing, and it’s hard to separate chitchat from
what’s important,” says Atolio’s CTO Gareth Watts. “Information in Slack’s
threads ends up being even more hidden than other messages.”
Thus the search was on to find a team chat tool that would truly serve Atolio’s
needs. “We didn’t want Slack,” Gareth says. “We wanted a tool designed for
asynchronous distributed communication, and Zulip seemed to fit the bill.”
> Slack is an extremely noisy environment. It’s very difficult to keep up with
> what your colleagues are doing.
>
> — Gareth Watts, co-founder and CTO of [Atolio](https://www.atolio.com/)
## Trying out Zulip’s open-source team chat
Beyond Zulip’s [topic-based threading model](/why-zulip/), Atolio’s team felt
confident that they could [count on Zulip in the coming years](/values/) as they
built out their company. “We liked that Zulip is an open-source tool with a
[huge community](/team/) around it,” Atolio’s CTO Gareth Watts explains. “We are
using Zulip Cloud, but if we want, we can export our data and
[self-host](/self-hosting/) our own Zulip server. So we know Zulip will always
be there for us.”
Having decided to test out Zulip, Atolio’s founders realized that they should go
all-in on a trial period. “We decided to turn off all other chat tools and try
Zulip for a full month,” Gareth says. This way, the team could really see how
Zulip would fit into the company’s communication patterns and workflows after an
initial adjustment period. “After that, we could discuss if it wasn’t working
out,” says Gareth. “But as it turned out, we never looked back.”
> We decided to turn off all other chat tools and try Zulip for a full month…
> We never looked back.
>
> — Gareth Watts, co-founder and CTO of [Atolio](https://www.atolio.com/)
## “Zulip is at the core of our business”
Since February 2020, Zulip has been the primary tool for internal communication
at Atolio. “Zulip is at the core of our business,” Atolio’s CTO Gareth Watts
explains. The team has always been able to rely on this crucial piece of company
infrastructure. “The Zulip Cloud hosting has been bulletproof — we haven’t had
any down time,” says Gareth.
Zulip’s organized team chat has enabled Atolio to create the open communication
culture the founders wanted. “Zulip lets us have conversations in public, not
behind closed doors,” Gareth explains. “In Slack, two thirds of communication is
not in public just to avoid noise. In Zulip, you can talk about what you want —
you just give everything its own topic.”
> In Zulip, it’s super easy to find things 24 hours later if you weren’t online
> when a discussion happened.
>
> — Gareth Watts, co-founder and CTO of [Atolio](https://www.atolio.com/)
Atolio’s distributed team also uses Zulip to build personal connections. With
each conversation getting its own space in a dedicated topic, team members can
share pictures of their cats or GIPHY memes without disrupting serious work
discussions. And if a topic ever goes off on a tangent, it’s easy to split it in
two and continue from there.
When new team members join the company, the onboarding process welcomes them to
Zulip and the company’s communication culture. An internal Wiki introduces
Zulip’s [topic-based threading](/help/introduction-to-topics), [search
tools](/help/search-for-messages), and some handy [keyboard
shortcuts](/help/keyboard-shortcuts), with pointers to [Zulip’s help
center](/help/) for more information. Gareth hasn’t seen much difference between
onboarding to Zulip compared to other team chat tools: “If someone hasn’t used
Slack before, they need onboarding too.”
> Zulip lets us have conversations in public, not behind closed doors.
>
> — Gareth Watts, co-founder and CTO of [Atolio](https://www.atolio.com/)
## Easy to integrate
To make Zulip a central hub for updates about what’s happening, Atolio has
integrated Zulip with its engineering tools. In a #tickets channel, a topic is
created automatically for each ticket, so there is a dedicated space to discuss
the issue at hand. There are topics in other Zulip channels for automated
deployment announcements, and for bot posts when pull requests are opened or
merged.
Atolio has also [connected Zulip](https://www.atolio.com/connectors/) to their
own unified search product. “Writing against the [Zulip APIs](/api/) has not
been hard,” Gareth says. “And since it’s open-source, we can always [read the
source code](https://github.com/zulip/zulip#readme) if we find the docs
confusing.”
---
Check out our guide on [using Zulip for business](/for/business/). You can also
learn how Zulip is being used at the InsurTech startup
[Semsee](/case-studies/semsee/), the [iDrift AS](/case-studies/idrift/) company,
the [End Point Dev](/case-studies/end-point/) software consultancy, and the [GUT
contact](/case-studies/gut-contact/) support agency.

View File

@@ -0,0 +1,28 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case studies | Zulip" %}
{% set PAGE_DESCRIPTION = "Real-world examples of Zulip in use for business, education, research, open-source projects, and communities." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case studies</h1>
</div>
<div class="hero-text">
Does choosing Zulip really make a difference? Read about how Zulip has transformed communication across industries and use cases.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/case-studies.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,75 @@
Zulip’s organized team chat app makes communication dramatically more efficient
than other popular apps like Slack and Microsoft Teams, which push teams towards
chaotic and disruptive communication patterns.
But don't just take our word for it. Across diverse, demanding organizations
in [business](#business), [education and research](#education-and-research),
and [open-source projects and communities](#open-source-projects-and-communities),
the case studies below feature Zulip users describing in detail how Zulip supports
and transforms communication for the better.
## Business
- ### [Efficient distributed team management at iDrift AS](/case-studies/idrift/)
While Slack worked reasonably well for real-time chat, busy Slack channels
hindered async discussions. iDrift AS evaluated and adopted Zulip in 2020.
- ### [Easy communication for 1000 agents at GUT contact](/case-studies/gut-contact/)
GUT contact offers flexibility to work from one of 10 offices across 3 countries,
or from home. Zulip keeps teams in sync across all job functions.
- ### [Managing hundreds of projects at End Point Dev](/case-studies/end-point/)
For nearly a decade, Zulip has been a virtual office for End Point’s distributed
team. Discussing projects in Zulip channels keeps everyone informed.
- ### [Worldwide operations and AI at WindBorne](/case-studies/windborne/)
Zulip is WindBorne's irreplaceable hub for coordinating work ranging from
balloon launches around the globe to developing state-of-the-art AI models.
- ### [More efficient communication than Slack at Semsee](/case-studies/semsee/)
New Semsee employees adapt easily to Zulip’s organized conversations. They quickly
develop an intuition for when to start a new topic, and what topic names work well.
- ### [Open distributed communication at Atolio](/case-studies/atolio/)
Since February 2020, Zulip’s organized team chat has enabled the open
communication culture Atolio’s founders wanted.
## Education and research
- ### [Organized chat for 1000s of students at TUM](/case-studies/tum/)
Prior to adopting Zulip, instructors had cycled through product after product
in search of a way to effectively manage communication among their 30-50
person course staff and 1400-2000 students at a time.
- ### [Communication hub across 6 continents at UCSD](/case-studies/ucsd/)
With students logging in at all hours of the day, Zulip’s topic model is key for
finding materials and participating in discussions. Zulip’s rich functionality
smoothed out many aspects of remote communication.
- ### [Connecting across generations at the National University of Córdoba](/case-studies/university-of-cordoba/)
The Mathematics, Astronomy, Physics and Computing (FAMAF) department tried moving
to Slack. However, without a software budget, the 90-day message history limit on
Slack’s free plan was a major frustration.
- ### [Research collaboration at scale in the Lean mathematical community](/case-studies/lean/)
Zulip’s unique combination of topic-based organization with a casual chat app feel
helps the Lean community create a welcoming environment for newcomers.
## Open-source projects and communities
- ### [Inclusive discussion in the open-source Asciidoctor community](/case-studies/asciidoctor/)
If a topic starts in the wrong place or veers off course, Zulip’s moderation
tools make it easy to fix. Community moderators can keep the dialogue
organized by reclassifying topics and posts without disrupting the ongoing
conversation.
- ### [Faster decision-making in the Rust language community](/case-studies/rust/)
In contrast to other chat tools, Zulip makes it pleasant to have multiple
conversations at once. Zulip’s thread-based organization creates a clear record
of past discussions, documenting the decision-making process.
- ### [Platform for a worldwide community since 2013 at Recurse Center](/case-studies/recurse-center/)
The Recurse Center was an early adopter of Zulip. They began to use the product
in January 2013, when it was still in private beta. Even then, Zulip’s
thoughtful design made it stand out.
- ### [Professional community support at Rush Stack](/case-studies/rush-stack/)
To make the transition, Rush Stack imported the project’s full chat history from
Gitter into Zulip, making it an easily searchable resource. Enabling Zulip’s
feature for logging in with GitHub meant that users didn’t have to make new
accounts.
- ### [Collaboration drives innovation at Mixxx](/case-studies/mixxx/)
Zulip has proven perfectly suited to support Mixxx’s worldwide community: It has
made collaboration easier, and community engagement has grown as a result. Zulip’s
threading model works well for occasional participants in the community, and
world-public channels make it possible to view discussions without even creating
an account.

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: End Point Dev software consultancy | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip takes the pain out of remote
collaboration in a distributed company with hundreds of ongoing projects." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: End Point Dev</h1>
<p>Software consultancy</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/end-point-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,145 @@
## Organizing the flow of information
Founded in 1995, [End Point Dev](https://www.endpointdev.com/about/) is a
full-service software consultancy, with a diverse set of customers: from
startups, to giants like Google, NASA, Oracle, and Morgan Stanley. The company
employs a team of 65 or so software developers, data organizers, and security
experts distributed all around the globe. Each project brings together talented
individuals with the right mixture of skills, wherever they might be located.
For the past six years, End Point has been using Zulip to stay connected as a
team. “Other apps like Slack would struggle with organizing the flow of
information in a complex organization like ours,” says End Point CTO [Jon
Jensen](https://www.endpointdev.com/team/jon-jensen/). “Zulip’s UI makes it easy
to access all the information you need, without being too cluttered.”
> Zulip’s UI makes it easy to access all the info you need.
>
> — [Jon Jensen](https://www.endpointdev.com/team/jon-jensen/), CTO of End Point
## Legacy software challenges
In 2005, looking to improve on email and phone communication, the company set up
an IRC chat server. Many team members loved IRC’s realtime chat experience. As
the company evolved, however, IRC’s limited feature set (for example, there were
no file uploads), became a growing concern.
By 2017, while most of the company was still on IRC, one division had moved to
Flowdock, and another team that had joined in an acquisition was using Slack.
The company’s collaboration tools were no longer helping everyone stay
connected. “Having multiple chat systems was bad for our culture,” says End
Point’s CTO [Jon Jensen](https://www.endpointdev.com/team/jon-jensen/). “Some
people were always cut out of the conversation.”
## Choosing Zulip: A modern feature set with a snappy UI
It was time to find a team chat solution that would bring the company back
together. Unfortunately, none of the tools already in use would do the job.
“Slack’s interface was too slow and clunky,” [Jon
Jensen](https://www.endpointdev.com/team/jon-jensen/) explains, “And the more
channels you’re in, the harder it is to use,” which was a show-stopper for a
consulting company with hundreds of ongoing projects.
> Slack’s interface was too slow and clunky, and the more channels you’re in,
> the harder it is to use.
>
> — [Jon Jensen](https://www.endpointdev.com/team/jon-jensen/), CTO of End Point
Inclined to go with a self-hosted solution, Jon and some of his co-workers
explored all the leading open-source team chat products. They found that while
Mattermost and Rocket.Chat were similar to Slack (but felt less polished), Zulip
stood out. “Zulip had all the modern features we were looking for, like
reliable, flexible notifications. At the same time, the [extensive keyboard
shortcuts](/help/keyboard-shortcuts) and the ‘All messages’
view offered a UI that the IRC fans loved.”
When End Point moved to Zulip, it was an immediate improvement over the
hodge-podge of tools previously in use. “Choosing topics in Zulip felt like a
hurdle at first,” Jon recalls, “but the team got used to it pretty quickly.” Not
entering a topic is always an option, and Zulip’s topics help users read their
messages more efficiently. “It’s nice to be able to [mute](/help/mute-a-topic)
busy topics,” Jon says.
## “Zulip is our virtual office”
For the past six years, the Zulip chat has been a virtual office for End Point’s
distributed team, a place to show up and be present at work. Discussing projects
in Zulip channels keeps everyone informed.
“Zulip is my lifeline,” says [Joanne
Tipton](https://www.endpointdev.com/team/joanne-tipton/), a senior team manager
at End Point. “I’m on it all day. I need to have an idea of all the things that
are going on, so the [desktop notifications](/help/desktop-notifications) are
invaluable.” There are 130 channels in the organization, and managers are
subscribed to most of them. Joanne takes advantage of per-channel flexibility for
notifications, turning on notification sounds just for low-traffic channels where
every message is important.
> Zulip is my lifeline.
>
> — [Joanne Tipton](https://www.endpointdev.com/team/joanne-tipton/), Senior Team Manager at End Point
[Alejandro Ramon](https://www.endpointdev.com/team/alejandro-ramon/), who leads
the Immersive & Geospatial division, joined End Point the day before the move to
Zulip. Zulip has always been a core tool for his work at End Point, and he has
built his workflows on Zulip’s [integrations](/integrations/). “With the
[Jenkins CI integration](/integrations/jenkins), I can see when a job has
finished building and is ready to deploy,” Alejandro says. “I use this 100s of
times per week.”
> I use Zulip’s Jenkins CI integration 100s of times per week.
>
> — [Alejandro Ramon](https://www.endpointdev.com/team/alejandro-ramon/),
> Director of Immersive & Geospatial division at End Point
Zulip also enables real-time system monitoring, with error alerts sent into a
dedicated channel for each system. Alejandro relies on Zulip’s clear record of
what’s been happening with each installation, which combines automated alerts
with discussion by the team. “I use [search](/help/search-for-messages) quite a
bit,” Alejandro says. “Being able to filter by user and search term, and look at
a date range, is very helpful.”
Zulip is conveniently accessible no matter where Alejandro is working from. “The
[mobile apps](/apps/) work well when I need to connect from a customer site,”
Alejandro explains.
## Taking the pain out of team chat
End Point’s client companies use a wide variety of chat tools to communicate
with their collaborators at EndDev, from modern team chat tools like Slack and
Microsoft Teams, to tools designed primarily for 1:1 communication like Google
Chat and Skype. End Point’s CTO [Jon
Jensen](https://www.endpointdev.com/team/jon-jensen/) has experienced them all.
“It is amazing that companies would use Teams in its current state,” Jon says, a
bit exasperated. “The UI is slow and inconsistent, and you have to do so much
clicking to get anywhere. Compared to Zulip, it’s missing key features like the
‘All messages’ view and topics.”
> It is amazing that companies would use Teams in its current state. The UI is
> slow and inconsistent, and compared to Zulip, it’s missing key features.
>
> — [Jon Jensen](https://www.endpointdev.com/team/jon-jensen/), CTO of End Point
In Jon’s view, any communication tool imposes some cost on the team. “When
you’re choosing a team chat tool, you’re deciding how much pain are you
requiring your staff to undergo,” Jon explains. “And if your remote tools are
painful to use, you marginalize remote staff,” as conversations move from chat
to offices and hallways. Thankfully, this is not a problem at End Point, Jon
says. “Zulip removes much of the pain that makes people not want to use team
chat apps. We love it."
> Zulip removes much of the pain that makes people not want to use team chat
> apps. We love it.
>
> — [Jon Jensen](https://www.endpointdev.com/team/jon-jensen/), CTO of End Point
---
Check out our guide on [using Zulip for business](/for/business/). You can also
learn how Zulip is being used at the [iDrift AS](/case-studies/idrift/) company,
the [GUT contact](/case-studies/gut-contact/) support agency, and the startups
[Semsee](/case-studies/semsee/) and [Atolio](/case-studies/atolio/).

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: GUT contact | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip makes communication easy for 1000
agents at GUT contact, a support agency." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: GUT contact</h1>
<p>Support agency</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/gut-contact-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,114 @@
For over 20 years, GUT contact has been offering premium customer support,
outbound sales and other German-language services. The company achieves top
performance by putting employees in a productive and motivating environment.
Company leadership makes mindful choices about the tools employees use to get
their work done, and has successfully scaled the team to over 1000 agents.
Agents at GUT contact use Zulip every day to communicate with their team leads.
“Most of our agents are in their 60s or 70s, so the software must be as simple
as possible. That’s why we love Zulip,” says [Erik
Dittert](https://gutcontact.de/unternehmen/team/erik-dittert/), who’s been
leading GUT contact’s IT team for the past 20 years.
> The software must be as simple as possible. That’s why we love Zulip.
>
> — Erik Dittert, [Head of
> IT](https://gutcontact.de/unternehmen/team/erik-dittert/) at [GUT
> contact](https://gutcontact.de/)
## “Our agents don’t need email accounts”
GUT contact relies on team chat for written communication within the company.
“Our agents don’t need email accounts,” says Erik Dittert, GUT Contact’s Head of
IT. “If someone has an email, they’ll get spam.” Instead, under Erik’s
leadership, GUT contact has been self-hosting open-source team chat applications
for years, upgrading as technology has evolved.
The company started with IRC, used an XMPP chat client for a while, and in 2019
moved to Rocket.Chat. “Rocket.Chat was a little bit better than our XMPP
server,” Erik says. However, when Erik learned about Zulip, he was excited to
check it out. “I installed Zulip, and the IT team played with the app. We loved
it. The UI was just cleaner, easier,” Erik says.
Zulip’s topic-based threading model was transformative. With other chat apps,
“the first person has a question about something, the next person has a question
about something else. You answer the first person, and the second person is
confused,” Erik explains. This doesn’t happen with Zulip’s topics.
> Topic-based communication is a big big big feature we love in Zulip.
>
> — Erik Dittert, [Head of
> IT](https://gutcontact.de/unternehmen/team/erik-dittert/) at [GUT
> contact](https://gutcontact.de/)
## Smooth transition to Zulip
Erik showed Zulip to his boss and others at the company, and in October 2022,
GUT contact made the switch.
“Zulip was quite easy to set up, and worked instantly. 1000 people — no
problem,” Erik recalls. “I hooked up the Zulip server to LDAP, and our agents
loved not having to remember a separate username and password.” Erik considered
importing data from Rocket.Chat into Zulip, but in the end it was decided that
the messy conversation history was not worth preserving.
Erik put training videos on the company’s intranet to explain the switching
process, and to give an overview of key new features. Employees were encouraged
to play around with Zulip, create channels, and chat with each other. After a
month of running Zulip in parallel with Rocket.Chat, the old system was turned
off.
> Zulip was quite easy to set up, and worked instantly. 1000 people — no
> problem.
>
> — Erik Dittert, [Head of
> IT](https://gutcontact.de/unternehmen/team/erik-dittert/) at [GUT
> contact](https://gutcontact.de/)
## Easy for anyone to use
GUT contact offers employees the flexibility to work from one of 10 offices
across 3 countries, or from their home office. This makes Zulip a critical
communication tool across all job functions. There is a channel for each
department (IT, human resources, etc.), as well as a dedicated channel for each
customer, where team leaders post daily updates.
For agents, many of whom are not fully comfortable with modern software, Zulip
being easy to use is invaluable. "We checked out Microsoft Teams and Mattermost,
and most of our users didn’t like these programs, because they didn’t know how
to work with them,” Erik says. “In Zulip, agents love the “All messages” view,”
which combines direct messages and channel messages into a single feed. “Unlike
other chat apps, you don’t have to click on each channel separately to see
unreads,” Erik explains.
## Functionality for the most technical users
Members of the IT team use Zulip to collaborate from around the world. “We share
code all the time, and the formatting and syntax highlighting is great,” Erik
says. When they need to jump on a call, “The Jitsi integration is perfect. We
don’t have to deal with emailing a calendar invite.”
Outside of office hours, Erik uses the mobile app to check on his message inbox.
It’s easy to skim the list of topics to check if anything requires timely
attention. “I love the clean mobile app and the push notifications,” Erik says.
“The app is extremely fast — you click, and messages show up instantly.”
Erik meets up regularly with other technologists to “have a beer and talk about
cool software.” In this 50-person group, “Zulip is quite a big theme right now,”
Erik says.
> I love Zulip. I use it every day, every night.
>
> — Erik Dittert, [Head of
> IT](https://gutcontact.de/unternehmen/team/erik-dittert/) at [GUT
> contact](https://gutcontact.de/)
---
Check out our guide on [using Zulip for business](/for/business/). You can also
learn how Zulip is being used at the [iDrift AS](/case-studies/idrift/) company,
the [End Point Dev](/case-studies/end-point/) software consultancy, and the
startups [Semsee](/case-studies/semsee/) and [Atolio](/case-studies/atolio/).

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: iDrift AS, distributed tech company | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn why using Zulip significantly increases the
size of the team for which a manager can meaningfully know what’s going on." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: iDrift AS</h1>
<p>Distributed tech company</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/idrift-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,119 @@
## A distributed team
For the past 20 years, iDrift AS has been offering infrastructure and security
support for small businesses. iDrift AS is a distributed organization, operating
from six offices across Norway. As such, this 30-person company has always
depended on team chat to coordinate and support each other’s efforts.
iDrift AS co-founder and owner Gaute Lund had long been frustrated with the
limitations of the company’s collaboration tools. “When I learned about Zulip it
was an absolute revelation,” says Gaute Lund. “Zulip’s threading model makes it
so much easier to manage my team. As a leader, in just a few minutes I can get
an overview over what's going on and see where my attention is needed.”
## Async communication is a challenge
From its founding, iDrift AS relied on IRC for internal communication, but the
lack of a modern user interface proved to be a barrier for participation for
management and non-technical members of the team. iDrift AS therefore moved from
IRC to Slack in October 2016.
“In terms of functionality, Slack is just souped-up IRC — there is no conceptual
difference,” says iDrift AS owner Gaute Lund. “It doesn’t add anything
significant other than the UI.”
While Slack worked reasonably well for real-time communication, the busy Slack
channels at iDrift AS were not effective for asynchronous discussions. “It was
almost impossible to catch up on a conversation, or get an overview of what you
missed while on vacation,” Gaute Lund says.
> Slack is just souped-up IRC — there is no conceptual difference.
>
> — Gaute Lund, co-founder and owner of iDrift AS
## Easy transition to Zulip
When a team member recommended Zulip, Gaute Lund understood the potential of
[Zulip’s threading model](/why-zulip/) to dramatically improve
async collaboration at iDrift AS. The company evaluated Zulip in the summer of
2020, and decided to make the move.
The team took easily to Zulip’s topic-based threading paradigm. “Once people
start using Zulip, it quickly becomes obvious why it’s better,” says Gaute Lund.
The transition also went smoothly from a technical perspective. “It was not a
lot of work to move everything over from Slack to Zulip,” says Gaute Lund. “The
export/import tool worked really well to ensure that we had logs of all the
prior conversations.”
Chat integrations for operational systems and alerts are a crucial part of the
workflow at iDrift AS. Zulip offers a [Slack-compatible
interface](/integrations/slack_incoming), so many integrations could be
simply moved over. “For a handful of integrations where Zulip didn’t meet our
needs, it was easy to [create our own
integration](/api/integrations-overview#write-your-own-integration) or improve
the existing one. It wasn’t a problem,” Gaute Lund says.
iDrift AS decided to self-host its own Zulip server. Because Zulip is
[100% open source](https://github.com/zulip/zulip), this option offers
the same functionality as a [Zulip Cloud Standard](/plans/)
subscription. “Zulip is very stable, and easy to run and to upgrade,”
says Senior IT Consultant Tor Hveem.
> Once people start using Zulip, it quickly becomes obvious why it’s better.
>
> — Gaute Lund, co-founder and owner of iDrift AS
## Zulip helps leaders scale
The move to Zulip transformed Gaute Lund’s day-to-day experience as a leader.
“Using Zulip significantly increases the size of the team for which a manager
can meaningfully know what’s going on,” says Gaute Lund. “There are 25 people
for whom I have a very good grip on their work, whereas previously it was no
more than a handful”.
> Using Zulip significantly increases the size of the team for which a manager
> can meaningfully know what’s going on.
>
> — Gaute Lund, co-founder and owner of iDrift AS
As a Microsoft shop, iDrift AS uses Microsoft Teams for file sharing, scheduling
and video calls. Would they use it for team chat? “For technical people, the
chat experience in Teams is abhorrent,” says Gaute. “It’s almost impossible to
get an overview of what’s happening. Only a small number of messages fit on the
screen, and the discussions hidden inside threads make it even harder to see
what’s going on.”
In contrast, Zulip’s topic-based threading lets Gaute review conversations in
batches, without being constantly interrupted by chat messages. Every few hours,
Gaute looks through the list of recent Zulip topics to find discussions that may
require his attention, and offers feedback as needed. Catching up is fast:
“Updating myself on an incident might take a few seconds,” Gaute Lund says.
## Efficient team communication
With Zulip, the team can discuss everything from customer issues to major design
decisions. “Zulip lets people focus on conversations where they can contribute,
whether or not they happen to be online when the conversation starts,” says
Gaute Lund.
The Zulip chat also serves as a knowledge base for the history of the
organization. “We have a very stable customer base, and Zulip search makes it
easy to review past interactions,” Gaute Lund says.
> Zulip lets people focus on conversations where they can contribute.
>
> — Gaute Lund, co-founder and owner of iDrift AS
---
Check out our guide on [using Zulip for business](/for/business/). You can also
learn how Zulip is being used at the [End Point Dev](/case-studies/end-point/)
software consultancy, the [GUT contact](/case-studies/gut-contact/) support
agency, and the startups [Semsee](/case-studies/semsee/) and
[Atolio](/case-studies/atolio/).

View File

@@ -0,0 +1,29 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Lean theorem prover community | Zulip" %}
{% set PAGE_DESCRIPTION = "Zulip enables collaboration at scale: “We could never do what we’re doing on Slack or Discord.”" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: <br/>Lean theorem prover community</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/research/">research</a><br/>
and <a href="/for/open-source/">open source</a> communities.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/lean-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,137 @@
## Collaboration at the cutting edge of mathematics
Modern mathematical research is an incredibly complex and specialized endeavor.
Novel proofs may require years of dedicated study to understand, making it very
difficult for the mathematical community to fully validate each other’s
research. To enlist the help of computers for verifying mathematical theorems,
mathematicians and computer scientists are [collaborating on an ambitious
project](https://leanprover-community.github.io/) to develop the [Lean theorem
prover](https://leanprover.github.io/) mathematics library.
The Lean prover project was [featured in Nature magazine in June
2021](https://www.nature.com/articles/d41586-021-01627-2), when the interactive
theorem prover was successfully used to [verify a result at the cutting edge of
mathematical
research](https://www.quantamagazine.org/lean-computer-program-confirms-peter-scholze-proof-20210728/).
This accomplishment was the result of a deep multi-month collaboration between
the [Lean Prover community](https://leanprover-community.github.io/) [on
Zulip](https://leanprover.zulipchat.com/login/) and [Peter
Scholze](https://www.hcm.uni-bonn.de/people/faculty/profile/peter-scholze/), a
[world-famous mathematician](https://en.wikipedia.org/wiki/Peter_Scholze)
working to “[rebuild much of modern
mathematics](http://nature.com/articles/d41586-021-01627-2)”.
“I joined the Zulip chat to answer any mathematical questions that may arise,
but also as an interested spectator,” wrote Peter Scholze in a [blog post
describing the
project](https://xenaproject.wordpress.com/2021/06/05/half-a-year-of-the-liquid-tensor-experiment-amazing-developments/).
“It was exactly the interactions via the Zulip chat that convinced me that a
proper verification was going on,” he commented.
> It was exactly the interactions via the Zulip chat that convinced me that a
> proper verification was going on.
>
> — [Peter Scholze](https://www.hcm.uni-bonn.de/people/faculty/profile/peter-scholze/),
> professor at the [University of
> Bonn](https://en.wikipedia.org/wiki/University_of_Bonn) and director at the
> [Max Planck Institute for
> Mathematics](https://en.wikipedia.org/wiki/Max_Planck_Institute_for_Mathematics)
> ([source](https://xenaproject.wordpress.com/2021/06/05/half-a-year-of-the-liquid-tensor-experiment-amazing-developments/))
“I have never seen this kind of collaboration before,” says [Kevin
Buzzard](https://www.imperial.ac.uk/people/k.buzzard), Professor of Pure
Mathematics at Imperial College London, who took part in Lean community’s
verification effort. In mathematics, papers are generally coauthored by 2-3
people who have known each other for years. The verification project is
breaking new ground, with 10 authors, most of whom have never met, scattered
across the world. “Zulip has completely changed the way I work, and very much
for the better,” says Kevin Buzzard, who also leads the [Xena
project](https://xenaproject.wordpress.com/what-is-the-xena-project/) to
formalize undergraduate mathematics with Lean and thereby transform how college
mathematics is taught.
## Unified library of mathematics developed by a diverse community
Lean is an interactive theorem prover and a programming language. Like C++ or
Python, it would be impossible to use in practice without a library of
pre-defined components — imagine writing a function from scratch every time you
need to sort a list! The functions that make it possible to “program” in Lean
are being developed as
[*mathlib*](https://github.com/leanprover-community/mathlib), a unified
open-source library of mathematics.
The mathlib development effort brings together a uniquely large and diverse
group of contributors, ranging from renowned researchers to undergraduate
students just starting their mathematical journey. The Zulip chat has been vital
to attracting and growing the mathlib community, which has been the foundation
of mathlib’s success.
> A number of people have cited the accessibility of [the Zulip] chat room as a
> reason for deciding to use Lean.
>
> — “The Lean Mathematical Library”, by the
> [mathlib](https://github.com/leanprover-community/mathlib) community
> ([arXiv:1910.09336v2](https://arxiv.org/abs/1910.09336v2) **[cs.LO])**
Now numbering hundreds of active participants, the Lean community did not start
out this way. [Launched in 2013](https://leanprover.github.io/about/), Lean was
for many years developed by a small, tight-knit group, which exchanged ideas on
a mailing list. Looking to have faster-paced interactions, the user community
moved to Gitter in 2017, but it felt chaotic. Seeking a platform that would
truly help the community to scale, the Lean community adopted Zulip in February
2018.
“When we moved to Zulip, it was instantly clear that the problems we were seeing
on Gitter had gone away completely,” says [Kevin
Buzzard](https://www.imperial.ac.uk/people/k.buzzard), Professor of Pure
Mathematics at Imperial College London. “Zulip was incredibly intuitive to use.
It just worked.”
> Zulip is incredibly intuitive.
>
> — [Kevin
> Buzzard](https://www.imperial.ac.uk/people/k.buzzard), Professor of Pure
> Mathematics at Imperial College London
## Accessible and efficient like no other chat platform
Zulip’s unique combination of [topic-based
organization](/why-zulip/) with a casual chat app feel helps
the Lean community create a welcoming environment for newcomers. By [browsing
recent conversations](/help/recent-conversations), newcomers can see what’s
being discussed without being overwhelmed. They can start a new topic to ask
basic questions without worrying about interrupting other conversations. Zulip’s
threading model makes managing conversations incredibly efficient, allowing more
senior community members to collaborate on research and library development, and
jump in to help newer community members as time allows.
> We could never do what we’re doing on Slack or Discord.
>
> — [Kevin Buzzard](https://www.imperial.ac.uk/people/k.buzzard), Professor of
> Pure Mathematics at Imperial College London
“Zulip has been fantastic,” says [Robert Y. Lewis](https://robertylewis.com/),
Brown University lecturer and
[mathlib](https://github.com/leanprover-community/mathlib)
[maintainer](https://github.com/leanprover-community/mathlib#maintainers). “I
use Slack at work, and it works fine for 10-15 people, but I can’t imagine it
working at Lean’s scale.”
> I can’t imagine the Lean community without Zulip.
>
> — [Robert Y. Lewis](https://robertylewis.com/), Brown University lecturer and
> [mathlib](https://github.com/leanprover-community/mathlib)
> [maintainer](https://github.com/leanprover-community/mathlib#maintainers)
---
Check out our guides on using Zulip for [research](/for/research/)
and [open source](/for/open-source/), and learn how Zulip
[helps communities grow](/for/communities/)!

View File

@@ -0,0 +1,30 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Mixxx open-source community | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how collaboration in Zulip drives innovation
for a community of passionate DJs and programmers from all over the world." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Mixxx <br /> open-source community</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for<br /> <a href="/for/open-source/">open
source projects</a> and <a href="/for/communities/">communities</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/mixxx-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,125 @@
[Mixxx](https://mixxx.org/) is open-source DJing software built by a community
of passionate DJs and programmers from all over the world. In their nights and
weekends, and without centralized planning or deadlines, they’ve created free
software that [rivals](https://cdm.link/mixxx-2-4-2/) commercial alternatives
*and* [respects](https://www.digitaldjtips.com/reviews/mixxx-2-5-1-dj-software/)
its users.
Mixxx aims to offer DJs creative freedom that can’t be found in other software.
In the Mixxx community, collaboration between users and developers drives
product innovation. A simple question from a user can spark a clever solution.
“Zulip has become a solid foundation of our community: a place where developers,
translators, designers, and testers meet and collaborate,” core Mixxx developer
Daniel Schürmann explains in a [blog
post](https://mixxx.org/news/2025-11-17-zulip-3000_members/) occasioned by the
Mixxx Zulip community reaching 3,000 members.
<figure class="markdown-image-with-caption">
<img src="/static/images/landing-page/case-studies/Mixxx-UI.png" alt="Mixxx software interface">
<figcaption class="markdown-image-caption">Mixxx software</figcaption>
</figure>
## Needed: A platform to keep conversations organized and accessible
Founded in 2001, the Mixxx community originally communicated on a Mailman
mailing list and an IRC chat channel. But by 2018, these platforms were no
longer serving the community’s needs.
"As the project and number of contributors grew, we needed a platform that could
keep conversations organized and accessible to everyone,” Daniel explains on the
Mixxx blog. “Zulip… convinced us after a short evaluation period. Its unique
thread system was the ideal solution to replace structured email threads and
instant chat rooms.”
> [Zulip’s] unique thread system was the ideal solution to replace structured
> email threads and instant chat rooms.
>
> — [Mixxx blog](https://mixxx.org/news/2025-11-17-zulip-3000_members/)
## Supporting asynchronous collaboration with structure and focus
Zulip has proven perfectly suited to support Mixxx’s worldwide community: It has
made collaboration easier, and community engagement has grown as a result.
“Zulip works particularly well for open-source projects where many topics run in
parallel, and where structure and focus are key to success,” Daniel explains.
Being able to move messages between threads helps keep conversations tidy, which
is critical for a distributed volunteer community like Mixxx: “[It] makes it
possible to collaborate asynchronously across time zones without missing
important context,” Daniel’s writes on the blog.
> Whenever a topic drifts, we can split it into a new thread, so conversations
> stay focused and are easy to follow.
>
> — [Mixxx blog](https://mixxx.org/news/2025-11-17-zulip-3000_members/)
The Mixxx community has dedicated channels for development, support,
socializing, and introductions. New members are encouraged to introduce
themselves in a dedicated topic with their name, where the community can welcome
them.
## Informed, but not stressed
Daniel, too, contributes to Mixxx in his spare time. Given the demands of his
day job, family and friends, “I’m not the person who can always hang around in
the chat,” he explains. “With Zulip, there’s no *need* to hang around in chat
rooms to avoid missing an important conversation.”
> With Zulip, I feel informed, but not stressed by all the messages.
>
> — Daniel Schürmann, core Mixxx developer
Zulip’s threading model also works well for occasional participants in the
community, and world-public channels make it possible to view discussions
without even creating an account.
Daniel squeezes in some Mixxx time on his commute: “The smart phone app recently
received a major update, and is very nice,” he says.
## Creative collaboration between users and developers
A creative partnership between users and developers is core to the Mixxx
development process. Zulip supports detailed, specific discussion of any problem
reported by a user, with video and image uploads, syntax-highlighted code
blocks, and convenient quoting functionality. Everyone can keep track of
conversations in their [inbox](/help/inbox), and automatically
[follow](/help/follow-a-topic) topics they’ve participated in.
> Collaboration in the Mixxx Zulip community propels the creative process to
> the next level.
>
> — Evelynne Veys, core Mixxx developer
## One of the best tools, built with love
Daniel uses Microsoft Teams in his day job, and greatly prefers Zulip: “You can
experience that there’s a lot of love in Zulip,” he explains. From the smooth,
snappy interactions, to helpful touches like global times, polls, and pronouns,
it adds up.
> You can experience that there’s a lot of love in Zulip.
>
> — Daniel Schürmann, core Mixxx developer
Other community members feel it too: “Some new contributors who were skeptical
at first later told us that they consider Zulip one of the best tools for
managing communication across projects,” Daniel says.
With Zulip, the Mixxx community isn’t reliant on proprietary software built by a
mega-corporation. Daniel and other community members are glad that the Mixxx
community has found an excellent communication tool that also aligns with their
FOSS values.
> I highly recommend Zulip to other communities… Slack is a no-go for many due
> to not being FLOSS, and I’m concerned about vendor lock-in if they were to
> stop being so generous. Slack’s threading model is much worse than Zulip’s
> IMO. The channels/topics flow is an incredibly intuitive way to keep track of
> everything that is going on.
>
> — RJ Ryan, core Mixxx developer
---
Check out our guide on using Zulip for [open source](/for/open-source/), and
learn how Zulip [helps communities scale](/for/communities/)!

View File

@@ -0,0 +1,32 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Recurse Center | Zulip" %}
{% set PAGE_DESCRIPTION = "“Switching to Zulip has turned out to be one of the
best decisions we’ve made,” says Recurse Center co-founder and CEO Nick
Bergson-Shilcock." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Recurse Center</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for
<br/><a href="/for/communities/">communities</a> and <a href="/for/education/">education</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/recurse-center-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,243 @@
[The Recurse Center](https://www.recurse.com/about) (RC for short) offers
educational retreats for anyone who wants to get dramatically better at
programming. Since its founding in 2011, [over 2000
participants](https://www.recurse.com/10-years) have attended the program,
either in person in New York City or (since the start of the Covid-19 pandemic)
remotely from anywhere in the world. Participants range from experienced
professional programmers to new programmers transitioning into the industry. The
retreats are free for everyone, and RC is funded entirely through its
[integrated recruiting agency](https://www.recurse.com/hire).
[A major highlight](https://www.recurse.com/why) of RC’s program is its active
online community of current participants and alumni. “The core of the Recurse
Center is the community, and the core of our online community is Zulip,”
[writes](https://www.recurse.com/blog/112-how-rc-uses-zulip) Recurse Center
[co-founder and CEO](https://www.recurse.com/team) Nick Bergson-Shilcock.
“Switching to Zulip has turned out to be one of the best decisions we’ve made,
and it’s impossible to imagine RC today without it.”
> The core of the Recurse Center is the community, and the core of our online
> community is Zulip… Switching to Zulip has turned out to be one of the best
> decisions we’ve made, and it’s impossible to imagine RC today without it.
>
> — [Nick Bergson-Shilcock](https://github.com/nicholasbs), Recurse Center
> [co-founder and CEO](https://www.recurse.com/team)
## Choosing Zulip in 2013: “One of the best decisions we’ve made”
The Recurse Center was an early adopter of Zulip. They began to use the product
in January 2013, when it was still in private beta. Even then, Zulip’s
thoughtful design made it stand out. “We wanted a private chat system that was
persistent, easily searchable, and which supported syntax highlighting for code
snippets,“ says Recurse Center co-founder and CEO Nick Bergson-Shilcock. “Zulip
gave us all the benefits above, along with a slew of others we hadn’t expected.”
When the startup building Zulip was [acquired by Dropbox in early
2014](https://zulip.com/history/), Zulip product development was put on hold for
a year and a half. Because of Zulip’s advantages over the alternatives, Recurse
Center continued using Zulip all through that time: “We strongly prefer Zulip to
other options for several reasons – its message threading being a key one,”
[wrote](https://www.recurse.com/blog/90-zulip-supporting-oss-at-the-recurse-center)
RC CEO Nick Bergson-Shilcock in 2015.
From the early days, the RC community has been passionate about Zulip. When
Dropbox generously decided to [release Zulip as open source
software](https://blogs.dropbox.com/tech/2015/09/open-sourcing-zulip-a-dropbox-hack-week-project/)
in 2015, Recurse Center alumni [flew out to San
Francisco](https://www.recurse.com/blog/90-zulip-supporting-oss-at-the-recurse-center)
for a week to help make it happen. Since then, Zulip has built the most active
open-source development community of any team chat software, with [75
people](https://zulip.com/team/) who’ve contributed 100+ commits.
> It’s not an exaggeration to say Zulip has made RC a stronger community.
>
> — [Nick Bergson-Shilcock](https://github.com/nicholasbs), Recurse Center
> [co-founder and CEO](https://www.recurse.com/team)
## Zulip becomes the backbone of a worldwide community
For years, the Zulip chat been the backbone of the Recurse Center community.
“Zulip is an integral part of the Recurse Center experience,” says Rachel
Petacat, [Head of Retreat](https://www.recurse.com/team) at Recurse Center, and
RC’s Director of Operations from 2014 to 2021.
Zulip serves as a collaboration hub for the current participants and alumni.
“Participants use Zulip to ask and answer questions, get code review, and
coordinate pairing sessions, reading groups, informal seminars, and countless
other forms of collaboration. Zulip is even more essential for our alumni, who
are in over 100 cities around the world but remain heavily involved thanks to
Zulip,” [writes](https://www.recurse.com/blog/112-how-rc-uses-zulip) RC CEO Nick
Bergson-Shilcock.
> [In the first ten years](https://www.recurse.com/10-years) since the Recurse
> Center was founded, the community sent **2.52 million** Zulip messages.
[Zulip’s threading model](https://zulip.com/why-zulip/) makes it easy to have
focused technical discussions. It also perfectly accommodates participants at
different levels of engagement. Current RC members can immerse themselves in the
ongoing discussions, occasionally muting topics they don’t want to follow. RC
leaders monitor the community asynchronously, reviewing the ongoing
conversations a few times a day and jumping in as needed. Finally, alumni can
drop by on occasion to skim [recent conversations](/help/recent-conversations),
catch up on their friends’ update threads, or search the discussion history for
a topic of interest.
“Our community is 10 years old and spans continents,” RC’s Head of Retreat
Rachel Petacat says. “Zulip provides the continuity that lets us maintain our
culture over time.”
## A welcoming environment for all community members
When new participants join the Recurse Center, Zulip becomes their port of entry
into the community. “With Zulip’s threading, new folks can get the full context
for a conversation, which makes the community feel welcoming,” Head of Retreat
Rachel Petacat says.
> Zulip is more friendly to new users than Discord or Slack.
>
> — Rachel Petacat, Recurse Center [Head of Retreat](https://www.recurse.com/team)
Threading also gives each conversation its own space, which means that community
members never have to feel like they are interrupting when they speak up.
“Threading makes it easy for anyone to jump in,” Rachel explains. ”Folks don’t
feel like they’re stepping onto someone’s conversation.”
Over the years, the Recurse Center has used Zulip’s customization features and
powerful, well-documented APIs to set up a space that really feels like a home
for the community. “We use so many custom emoji,” says Rachel Petacat.
A whole crew of bots is on hand to help out, from Chatbot for quick chat intros,
to [RSVPBot](https://github.com/wtfcarlos/RSVPBot#readme) for creating and
managing calendar events, to
[Blaggeregator](https://github.com/recursecenter/blaggregator#readme), which
aggregates blog posts for the RC community.
## “I can’t imagine being able to operate Recurse Center without Zulip”
Rachel Petacat is a long-time member of RC’s leadership team. Her job requires
keeping up with the ~45 members in the current batch, making sure they have what
they need to get the most out of their RC experience.
To juggle everything she needs to get done, Rachel takes full advantage of the
flexibility between synchronous and asynchronous discussions that Zulip offers.
Realtime chat on Zulip is perfect for coordinating with other members of the
leadership team. “Zulip is one of the first tabs I open at the start of the work
day,” Rachel says. “I can check what’s happening, and plan my day. Other
organizers and I tag each other on Zulip if we need any help.”
Rachel uses Zulip to follow the ongoing conversations, and help out as needed.
Zulip’s threading model makes it easy to review discussion threads every few
hours, and respond in context. “I read the discussions on Zulip once in the
morning and again in the afternoon, chiming in where I need to,” says Rachel.
With Zulip, Rachel is able to manage the community without her focus being
interrupted by the need to jump in before the moment has passed. “I can’t
imagine being able to operate the Recurse Center without Zulip,” Rachel says.
## An alum experience: Staying connected since 2015
One of the benefits of participating in RC is the opportunity to stay connected
with the community. “You'll be able to participate in the RC community online
forever,” the RC website [explains](https://www.recurse.com/why). “Almost 30% of
the RC community is regularly active [on
Zulip](https://www.recurse.com/blog/112-how-rc-uses-zulip),” an incredible
statistic for a 6-12 week program with many alumni who attended years ago. Many
alums drop in on Zulip to chat, pair-program, and host events.
John Hergenroeder first attended RC back in 2015. In the Recurse Center, John (a
software engineer by profession) found the inclusive and welcoming programming
community he was looking for.
Even with everyone sitting in the same room, Zulip served as a social hub for
John’s RC cohort. “People had different schedules, so we used Zulip to leave
questions, work artifacts, demos — anything you thought was interesting,” John
says. This let participants engage with the content asynchronously, and created
a lasting record for the community. “We even used a Zulip topic to coordinate
for lunch, to let people have their uninterrupted focus time,” John says.
Since 2015, John has stayed connected with the RC alumni community on Zulip. “We
have a channel for alumni check-ins, where each alum uses a dedicated topic to
post updates,” John explains. Some alums drop by weekly, while others might come
around once a year. “You can leave a note, and it’s OK if your friend reads it
a few months later,” John says. “Compare that with Slack, where if someone
doesn’t see a message in some channel on that day, they’ll *never* see it.”
Without dedicating a lot of time, John is able to stay involved in the community
on Zulip, and share his expertise where relevant. “I scan [recent
topics](/help/recent-conversations) for places where I could help, and rely on
email notifications for private messages,” John explains. The experience of
keeping up on Zulip is in sharp contrast with Slack, which John uses at work:
“It’s so hard to keep up with the Slack firehose.”
> Zulip allows people who are engaging with the community at different paces to connect.
>
> — John Hergenroeder, Recurse Center alum
## Zulip’s open-source ethos
Zulip is developed as open-source software, with an active and growing
community; over 1100 people have contributed code to the project. As a long-time
Zulip user, John Hergenroeder appreciates the many thoughtfully designed
[features](https://zulip.com/features/) unique to Zulip.
“[Choosing](https://zulip.com/help/mention-a-user-or-group#silently-mention-a-user)
whether or not a mention notifies people is really handy,” John says. “[Global
times](https://zulip.com/help/format-your-message-using-markdown#global-times)
are great for organizing events, and
[spoilers](https://zulip.com/help/format-your-message-using-markdown#spoilers)
were perfect for chatting about the Advent of Code puzzles.”
And if Zulip is missing some feature? “We can file an issue, or even go and make
it happen,” says John. Over the years, John has filed [11
issues](https://github.com/zulip/zulip/issues?q=is%3Aissue+author%3Ajdherg+is%3Aclosed)
in the Zulip issue tracker that have been resolved, and dozens of Recursers have
contributed code to Zulip. It’s a radically different experience from trying to
give feedback to a corporation building a closed-source product. When he
encounters issues with Slack, John has his strategy: “When I come across a Slack
bug, I try to find someone I know who works there, because I have no idea if
anyone will pay attention if I go through support.”
## Going virtual: “For a while, Zulip *was* RC”
Prior to 2020, the Recurse Center offered an immersive in-person retreat
experience in the heart of New York City. This paradigm was shattered when the
Covid-19 pandemic hit New York in March 2020, and the Recurse Center made the
difficult decision to [move all operations
online](https://www.recurse.com/blog/152-RC-is-online-only-until-at-least-May).
Over time, the Recurse Center built out a custom virtual world (integrated with
Zulip) for online participants. But in the early days of the pandemic, it was
Zulip that replaced the physical space where RC participants had spent time
together and helped each other out. “At the time, all we had was Zulip, email,
our website, Zoom, and a rarely used forum,” recalls RC’s Head of Retreat Rachel
Petacat. “For a while, Zulip *was* RC.”
## An invaluable knowledge base
Edith, who works as a technical writer, participated in virtual RC in 2020. Two
years later, she still uses Zulip every day to stay connected.
Zulip’s combination of powerful search and topic-based threading makes prior
discussions both findable and useful. “It’s easier to build context with Zulip
than any other tool,” Edith says. “With other messaging services, information
tends to get lost. In Zulip, I often look something up from a while ago —
anything from discussion of niche programming topics, to whether anyone has
commented on a book I’m thinking about reading.”
“You really feel that you’re joining a group of 2000 people who’ve been doing
this for 10 years,” says Rachel Petacat. “You can find someone who trod the same
path 6 years ago!”
---
Check out our guides on using Zulip for [education](/for/education/) and
[events](/for/events/), and learn how Zulip [helps communities
grow](/for/communities/)!

View File

@@ -0,0 +1,32 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Rush Stack open-source community | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip makes it easy for the Rush Stack
community to provide the level of support required for mission-critical
enterprise tools." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Rush Stack <br /> open-source community</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for<br /> <a href="/for/open-source/">open
source projects</a> and <a href="/for/communities/">communities</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/rush-stack-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,117 @@
[Rush Stack](https://rushstack.io/) is an open-source collection of specialized
tooling for working with the world's largest source code repositories.
Providing support is often a challenge for open-source projects, especially when
maintainers are juggling internal investigations at work alongside their
open-source correspondence. Yet to be successful, the Rush Stack community
needs to systematically handle questions and feedback.
Zulip makes it easy for the Rush Stack community to provide the level of support
required for mission-critical enterprise tools. “With Zulip, we have a system
that feels professional, where once a topic is opened, we can make sure that it
gets resolved,” says Rush Stack maintainer [Pete
Gonzalez](https://github.com/octogonz).
> With Zulip, we have a system that feels professional.
>
> — Rush Stack maintainer Pete Gonzalez
## Choosing a chat product? Focus on the features that matter.
Pete Gonzalez started researching chat platform options for the Rush Stack
community in early 2020, looking to replace Gitter. “I had worked on
[Yammer](https://en.wikipedia.org/wiki/Viva_Engage), and even wrote my own
client, so I was thinking about chat apps very deeply,” Pete recalls. “Although
chat apps may seem similar, there are actually many subtle design tradeoffs
whose combination determines whether an app will work well for a particular use
case.”
Rush Stack needed a space for maintainers and community members to have serious,
long-running conversations. “Rush Stack discussions have the character of
support tickets,” Pete explains. “Someone can ask a question that might take two
years to finally solve.”
Pete identified Zulip as the best fit for the needs of the community. With
Zulip’s topic-based organization, conversations can run their course, with the
full context of the discussion easily at hand when someone has a new idea.
“Zulip gives you control,” Pete points out. “You can edit or move messages to
fix anything that might be incorrect or confusing, which is important for
long-running discussions.”
> Zulip gives you control.
>
> — Rush Stack maintainer Pete Gonzalez
To make the transition, Rush Stack imported the project’s full chat history from
Gitter into Zulip, making it an easily searchable resource. Enabling Zulip’s
feature for logging in with GitHub meant that users didn’t have to make new
accounts. Users could also control how their messages looked with familiar
Markdown formatting.
## “Zulip has better features for the way we use it”
Over the years, Pete had continued to keep an eye on the evolution of team chat
products. “Compared to Discord, Slack, GitHub discussions… Zulip has better
features for the way we use it,” he says.
Pete has seen open-source maintainers struggle to manage a Discord community:
“There are all these people asking questions… If an important question scrolls
out of view, how would you follow up? Maintainers end up giving up on community
management, leaving casual participants to sort things out on their own.”
Slack’s paid plans, which start at $8.75/user/month, are unaffordable for
community use. “You have to pay a lot for Slack history, and users can’t log in
with their GitHub account,” Pete says. On the free plan, communities have access
to just 90 days of message history, which is unworkable for a community with a
large knowledge base and long-running investigations.
> Of all the apps I tested, Zulip’s approach stood out as the best fit for how
> we work.
>
> — Rush Stack maintainer Pete Gonzalez
## Software that’s built in the open and always improving
Pete has been impressed by how Zulip handles user feedback. “I can go into the
development community to talk to them, and often the tech lead of the team will
reply,” he notes. “Even if their answer is that my request is a lower priority
right now, there is context to understand that. New features are always being
added, and with the team’s daily discussions being public, I can see what they
are working on and why. It’s a really different dynamic from trying to make
feature requests or bug reports for a closed source product with an invisible
engineering team.”
> New features are always being added, and with the team’s daily discussions
> being public, I can see what they are working on and why.
>
> — Rush Stack maintainer Pete Gonzalez
Pete was pleased to learn that organizations can now allow [public
access](/help/public-access-option) to channels. It lowers the bar for people to
view Zulip discussions that are linked from Rush Stack GitHub issues.
Pete has also seen Zulip’s onboarding experience transform over the past few
years. “In the past, Zulip was optimized for daily users, and so had a bit of a
learning curve for occasional Rush Stack participants. But the UX has improved a
lot in this regard. The [recent conversations](/help/recent-conversations) view
that’s been added has largely addressed the challenge for new users,” Pete says.
This view lists the topics being discussed, and is also the go-to for Pete to
check in on what’s happening.
> The folks who make Zulip listen to customers, and the product continues to
> improve.
>
> — Rush Stack maintainer Pete Gonzalez
---
Check out our guide on using Zulip for [open source](/for/open-source/), and
learn how Zulip [helps communities scale](/for/communities/)!

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Rust programming language community | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn why Rust development would not be moving at the
pace that it has been without Zulip, and the organized, searchable conversations it enables." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Rust<br/>programming language community</h1>
</div>
<div class="hero-text">
Learn more about using Zulip for<br /> <a href="/for/open-source/">open
source projects</a> and <a href="/for/communities/">communities</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/rust-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,167 @@
## Rust: A popular programming language built by 1000s of contributors
[Rust](https://www.rust-lang.org/) is a popular modern programming language,
designed for performance, reliability and productivity, and used by hundreds of
companies around the world. Organized into teams and working groups, the Rust
project is led by [over 100 team members](https://www.rust-lang.org/governance)
who oversee the work of [more than 6000
contributors](https://thanks.rust-lang.org/).
## Rust moves to Zulip, one team at a time
Each Rust team decides independently how to organize itself and what
communication tools to use. Every major Rust team has chosen Zulip as their chat
platform, including the
[Compiler](https://www.rust-lang.org/governance/teams/compiler),
[Language](https://www.rust-lang.org/governance/teams/lang),
[Library](https://www.rust-lang.org/governance/teams/library) and
[Infrastructure](https://www.rust-lang.org/governance/teams/infra) teams. Some
Rust teams have migrated between collaboration tools two or even three times in
search of an effective solution. No team has moved away from Zulip after trying
it.
“Zulip lets us move faster, connect with each other better, and have interactive
technical discussions that are organized, recorded, and welcoming to other
people,” says [Rust Language
team](https://www.rust-lang.org/governance/teams/lang) co-lead [Josh
Triplett](https://joshtriplett.org/).
> Zulip lets us have focused conversations at scale.
>
> — [Rust compiler team](https://www.rust-lang.org/governance/teams/compiler) co-lead [Felix
> Klock](https://github.com/pnkfelix)
## The Language team moves from Discord to Zulip: “It’s better in all the ways I care about”
Let’s take a closer look at the story of the Rust Language team, which works on
designing and helping to implement new language features. The team started out
by using Gitter, but moved to Discord in 2018 in search of a more stable
solution.
Some community members advocated for trying out Zulip, but the team leadership
was reluctant to make another change. “Everyone in our community who was
familiar with Zulip seemed thrilled with it,” says [Language
team](https://www.rust-lang.org/governance/teams/lang) co-lead [Josh
Triplett](https://joshtriplett.org/), “but moving our team seemed like too much
of a pain.”
Eventually, Josh had to sign up for Zulip in order to get in touch with another
Rust team. “After a day of using Zulip, I became an advocate myself,” he says.
“Zulip is wildly simpler than most other tools I’ve worked with.” The team made
the move in November 2019 and has never looked back.
“I’m personally ecstatically happy with Zulip,” says Josh, who also uses the
Zulip instances for the [Bytecode Alliance](https://bytecodealliance.org/),
[Rust for Linux](https://github.com/Rust-for-Linux), and
[http-rs](https://github.com/http-rs/tide) Zulip communities. “It’s better in
all the ways I care about and a joy to use.”
> Zulip is wildly simpler than most other tools I’ve worked with.
>
> — [Rust Language team](https://www.rust-lang.org/governance/teams/lang) co-lead
> [Josh Triplett](https://joshtriplett.org/)
## Zulip enables organized, searchable conversations
Zulip’s threading model provides a two-layer organizational hierarchy. It offers
the advantages of a forum or a mailing list, reimagined in the context of a
modern chat tool.
In contrast with other chat tools, Zulip makes it pleasant to have **multiple
conversations** going on at once, with each conversation being easy to follow.
“Slack and Discord both suffer when trying to collaborate with others at scale —
you end up with conversations happening across each other,” says [David
Wood](https://davidtw.co/), member of the [Rust compiler
team](https://www.rust-lang.org/governance/teams/compiler). “In Zulip, I can
instantly see the context for each message.”
Afterwards, Zulip’s thread-based organization creates a **clear record** of
past discussions, documenting the decision-making process. “Zulip creates a
transparent record of what we do,” says Josh. It’s **easy to link** to Zulip
threads from other tools in order to provide background context. “We link to
Zulip threads all the time on GitHub, Twitter, email, Discourse, and from other
Zulip messages,” [Josh Triplett](https://joshtriplett.org/) says.
> Slack and Discord feel opaque. Zulip feels like an open room.
>
> — [Rust Language team](https://www.rust-lang.org/governance/teams/lang) co-lead
> [Josh Triplett](https://joshtriplett.org/)
Because information on Zulip is **well-organized**, one can easily find and
review earlier conversations, even if months have passed. The organization’s
**rich history** continues to provide value indefinitely. “I can find and
re-read old conversations,” says [Rust Language
team](https://www.rust-lang.org/governance/teams/lang) co-lead [Niko
Matsakis](https://github.com/nikomatsakis). “If I send someone a link to a
discussion, they can jump right in; this would be impossible in other chat tools
I’ve used.”
Unlike other chat tools, a discussion on Zulip can even be revived after weeks
or months have passed if new information or ideas come to light, with no loss of
**surrounding context**.
Catching up works great, whether you were away for hours, days, or even weeks.
“When I come back after a break, I don’t feel overwhelmed: I can skim topics
looking for the ones that seem important, and scroll briefly through the rest,”
says [Rust Language team](https://www.rust-lang.org/governance/teams/lang)
co-lead [Niko Matsakis](https://github.com/nikomatsakis).
> When I come back after a break, I don’t feel overwhelmed.
>
> — [Rust Language team](https://www.rust-lang.org/governance/teams/lang)
> co-lead [Niko Matsakis](https://github.com/nikomatsakis)
## Zulip makes the Rust community more agile
In addition to being well-organized, Zulip interactions are
**conversational**, enabling **faster decision-making**. GitHub issues about
controversial Rust language decisions can devolve into incomprehensible comment
threads with [several](https://github.com/rust-lang/rust/issues/57640)
[hundred](https://github.com/rust-lang/rust/issues/34511)
[messages](https://github.com/rust-lang/rust/issues/28237). “Some decisions
that were blocked for months on GitHub were resolved within 24 hours by starting
the right conversation on Zulip,” says [Rust Language
team](https://www.rust-lang.org/governance/teams/lang) co-lead [Josh
Triplett](https://joshtriplett.org/).
> Some decisions that were blocked for months on GitHub were resolved within 24
> hours on Zulip.
>
> — [Rust Language team](https://www.rust-lang.org/governance/teams/lang) co-lead
> [Josh Triplett](https://joshtriplett.org/)
With the features and feel of a **modern chat tool**, Zulip makes it easy to
have quick, light-weight, friendly conversations to get work done. “Zulip
strikes just the right balance between ephemeral and permanent,” [Josh
Triplett](https://joshtriplett.org/) says. The [mobile
applications](/apps/) make it easy to participate wherever you
are. “The Android app is extremely functional,” says Josh. “It’s easy to set
notification preferences, and the default level of notifications is just right.”
Adopting Zulip has been transformational for how the Rust community makes
progress. “Rust development would not be moving at the pace that it has been
without Zulip,” says [Rust Language
team](https://www.rust-lang.org/governance/teams/lang) co-lead [Josh
Triplett](https://joshtriplett.org/). “Without Zulip, the Rust community would
be more stuck, more slow-moving, less agile, and a little less human.”
> Rust development would not be moving at the pace that it has been without
> Zulip.
>
> — [Rust Language team](https://www.rust-lang.org/governance/teams/lang) co-lead
> [Josh Triplett](https://joshtriplett.org/)
---
Check out our guide on using Zulip for [open source](/for/open-source/), and
learn how Zulip [helps communities scale](/for/communities/)!

View File

@@ -0,0 +1,32 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Semsee | Zulip" %}
{% set PAGE_DESCRIPTION = "“I don't like going back to Slack now. It's just not
as efficient a way to organize communication.” Learn how Zulip is used at
InsurTech startup Semsee." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Semsee</h1>
<p>InsurTech Startup</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/semsee-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,88 @@
[Semsee](https://semsee.com/) is a technology startup in the commercial
insurance space, building intelligent software that digitizes slow manual
processes. Originally based out of an office in New York, Semsee moved to a
remote-work model during the pandemic, and now has several satellite teams
across the US.
Semsee adopted Zulip early on in its journey. “We didn’t plan to be remote,”
says James van Lommel, [Director of
Engineering](https://www.linkedin.com/in/james-v-91a65219/) at Semsee. “But now
that we are remote, it’s good to have a communication tool that really backs
that up.”
> Now that we are remote, it’s good to have a communication tool that really
> backs that up.
>
> — James van Lommel, Director of Engineering at [Semsee](https://semsee.com/)
## Looking for something better than Slack
James van Lommel joined Semsee in 2018 to lead the engineering team. At the
time, the company was using Slack. James knew his choice of communication
platform would have broad implications: “Communication helps feed the type of
culture you have at a company,” James says.
James had used Slack extensively in his prior work experience. “Seeing how Slack
gets used, especially as a company grows larger, I knew I wanted something
better,” he recalls. “If you are not using Slack *all the time*, you can’t keep
up with what’s happening.” James wanted a chat tool that would create breathing
room for focused work, in-person conversations, and different work schedules.
> Seeing how Slack gets used, especially as a company grows larger, I knew I
> wanted something better.
>
> — James van Lommel, Director of Engineering at [Semsee](https://semsee.com/)
In addition, as a security expert, James was interested in a self-hosted
solution. “There is so much sensitive data that goes into a chat tool,” he says.
“When we self-host, the messages don’t live on anyone else’s cloud.”
When James discovered Zulip, the topic-based threading model piqued his
interest. “I didn’t want Mattermost or another self-hosted Slack clone,” he
says. James quickly set up a Zulip server — he found that the instructions for
self-hosting were easy to follow, and worked without a hitch. After trying Zulip
for a few days with some coworkers, James was convinced that Zulip was the right
choice for Semsee. “We need our employees to be able to come to the right place,
and have a conversation about one thing,” he says. “Zulip solves that pain
point.”
## An efficient way to organize communication
These days, Zulip is at the core of company communication at Semsee. Email is
rarely used for internal communications. For jumping on a call, Zulip’s native
call integration is an easy starting point. System monitoring and software
development processes are integrated with Zulip via the API. For example, a
custom integration sends logging data from Semsee’s product into Zulip, with a
channel and topic configured based on the deployed environment.
New employees adapt easily to Zulip’s organized conversations. By reading
ongoing discussions, they quickly get an intuition for when to start a new
topic, and what kinds of topic names work well. “Once they get used to Zulip,
they are just rolling with it, and I don’t hear any complaints,” says James.
With conversations organized by topic, “people don’t have to scroll through and
cherry-pick out the messages they need to read,” James says.
Semsee invites customers to join the company Zulip chat as guests. “Our
customers just see one channel with one or two topics, so it’s very easy for
them,” James explains. On the flip side, when Semsee employees are invited to
join customers’ Slack chats, they miss Zulip. “I don’t like going back to Slack
now. It’s just not as efficient a way to organize communication,” says James. “A
few users from an extensive Slack background have told me: ‘Zulip is just
better.’"
> I don’t like going back to Slack now. It’s just not as efficient a way to
> organize communication.
>
> — James van Lommel, Director of Engineering at [Semsee](https://semsee.com/)
---
Check out our guide on [using Zulip for business](/for/business/). You can also
learn how Zulip is being used at the [Atolio](/case-studies/atolio/) startup,
the [iDrift AS](/case-studies/idrift/) company, the [End Point
Dev](/case-studies/end-point/) software consultancy, and the [GUT
contact](/case-studies/gut-contact/) support agency.

View File

@@ -0,0 +1,30 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: Technical University of Munich Department of Informatics | Zulip" %}
{% set PAGE_DESCRIPTION = "How do you teach computer science to 1400 freshmen?
“Zulip is the only app that makes hundreds of conversations manageable.”" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: Technical University of Munich <br /> Department of Informatics</h1>
</div>
<div class="hero-text">
Learn more about <a href="/for/education/">Zulip for Education</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/tum-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,89 @@
## How do you teach 1400+ students?
The [Technical University of Munich](https://www.tum.de/en/) (TUM) is
one of Europe’s top universities. Every year, its Department of
Informatics ([ranked #1 in Germany][tum-ranking]) welcomes over a
thousand freshmen to the undergraduate program.
Teaching introductory computer science courses to 1400-2000 students
at a time is a massive undertaking. Just answering student questions
easily takes 1500+ messages *per homework exercise*. Instructors have
cycled through product after product in search of a way to manage
communication with students, and among the 30-50 person course staff.
## Communication platform is key
[Tobias Lasser](https://ciip.in.tum.de/people/lasser.html), lecturer
at the TUM Department of Informatics, set out to teach an introductory
algorithms class with 1400 students in April 2020, as the COVID-19
pandemic was sweeping across Europe. With instruction moving online,
he knew that finding an effective communication platform was more
important than ever.
“Our default teaching platform is Moodle, which is fine for
announcements, but does not scale for discussions,” Tobias says. “Our
university also hosts Rocket.Chat, but when some colleagues tried it
for a large class, it was a complete mess.” Due to strict European
regulations, cloud-only solutions like Piazza, Slack and Discord were
non-starters for data privacy reasons. “I checked Mattermost and
Element, but wasn’t happy with the user interface for either.” That’s
when Tobias came across Zulip.
## “Better user experience than Slack”
Tobias evaluated Zulip by [visiting the Zulip development
community](/development-community/) to see it in action. “It takes a bit of
time to get used to, but Zulip has the best user experience of all the
chat apps I’ve tried,” Tobias says. “With the discussion organized by
topic within each channel, Zulip is the only app that makes hundreds of
conversations manageable.”
Despite initially asking to use Slack, students came to love Zulip’s
model. “Many students commented how great Zulip was on the course
evaluation forms,” Tobias says.
## Word about Zulip spreads
Word about Tobias’s success with teaching with Zulip quickly spread
throughout the department. One year later, the department’s Zulip
organization is used by 4400 students and educators. “I’m working to
establish Zulip as the new default communication platform for teaching
in the department, for classes of all sizes”, Tobias says.
Other instructors have loved using Zulip as well. “I consider Zulip to
be the best tool in terms of privacy and usability, and try to
implement it in all courses where I collaborate,” says Johannes Stöhr,
teaching assistant for multiple courses at the department.
## A welcoming open-source community
Robert Imschweiler, an undergraduate at the TUM, is responsible for
maintaining the department’s Zulip server. “Our chat needs to be
self-hosted to comply with European laws about protecting student
data,” Robert says. “Zulip has been extremely stable and requires no
maintenance beyond installing updates.”
When questions arise, Robert stops by the Zulip development community to ask for
advice. “Right before exams, we had over 1000 students online at once, and I
was worried that the CPU usage was high. The community investigated my
problem immediately, and a couple of days later they [shared a patch]
[czo-patch-thread] that resolved it.” This patch to improve performance at
scale was released to all users as part of [Zulip 4.0][zulip-4-blog].
Since then, Robert has built several Zulip customizations for the
department, and has had them merged to the upstream project. “I feel
very welcomed as a new contributor and am glad that I’ve been able to
contribute a few patches of my own,” Robert says.
---
Learn more about [Zulip for Education](/for/education/), and how
Zulip is being used at the [University of California San
Diego](/case-studies/ucsd/) and the [National University of Córdoba](/case-studies/university-of-cordoba/).
You can also check out our guides on using Zulip for [conferences](/for/events/)
and [research](/for/research/)!
[tum-ranking]: https://www.in.tum.de/en/the-department/profile-of-the-department/facts-figures/facts-and-figures-2020/
[czo-patch-thread]: https://chat.zulip.org/#narrow/channel/3-backend/topic/Tornado.20performance/near/1111686
[zulip-4-blog]: https://blog.zulip.com/2021/05/13/zulip-4-0-released/

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: University of California San Diego | Zulip" %}
{% set PAGE_DESCRIPTION = "How do you teach graduate-level mathematics to
students across six continents? “I chose Zulip especially for the threaded model
and the TeX integration.”" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: University of California San Diego</h1>
</div>
<div class="hero-text">
Learn more about <a href="/for/education/">Zulip for Education</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/ucsd-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,96 @@
## Making the best of a tough year
[University of California San Diego
(UCSD)](https://ucsd.edu/about/index.html) is recognized as one of the
top universities worldwide. The UCSD math department offers
prestigious graduate and undergraduate programs, with course topics
ranging from foundational material to cutting-edge research.
In response to the COVID-19 pandemic, UCSD instruction moved online early
in 2020. As instructors scrambled to figure out online education,
Kiran Kedlaya, Professor of Mathematics at UCSD, gave himself a bigger
challenge: “Seeing the unique opportunity, I decided to open my
classes up to the world,” Kiran says.
## Communication is key
Kiran knew that an effective chat platform would be key for
communicating with students. He had prior experience with Slack,
Discord and Zulip. “I chose Zulip for several reasons, especially the
threaded model (which I find sorely lacking in other chat apps), and
the TeX integration.”
From Spring 2020 through Spring 2021, the [Zulip
Standard](/for/education/#feature-pricing) plan was free for all educators,
as we did our part to help make the transition to online education a
little easier. Having set up Zulip Cloud for his three graduate-level
courses, Kiran felt confident in the communication platform, and was
ready to make his classes open to all.
## Teaching students across six continents
Students worldwide jumped on the opportunity to take a course with
Kiran. “Of the 350 students in my classes, no more than 15% were local
to UCSD,” Kiran says. A Zulip poll showed participants from as far as
the Middle East, Southeast Asia and Oceania.
“Zulip became a central hub for asynchronous Q&A and posting Zoom
links for lectures, whiteboard PDFs, and announcements,” Kiran says.
With students logging in at all hours of the day, Zulip’s topic model
was key to making sure everyone could find the materials they needed
and participate in the discussions. “Zulip’s topics, and the ability
to change the topic of someone else's message, has made it much easier
for me to keep things coherent,” says Kiran.
## Zulip has what you need
Beyond topics, Zulip’s rich functionality smoothed out made many
aspects of remote communication. Here is what Kiran has to say about
the benefits of just a few of Zulip’s features:
- **Discussing math**: “The
[**TeX**](/help/format-your-message-using-markdown#latex)
made it super easy to discuss material from the course using
proper mathematical notation, and was one of the reasons I chose
Zulip in the first place.”
- **Quick pulse-checks**: “[**Emoji
reactions**](/help/emoji-reactions) were a nice way
to collect RSVPs for office hours or acknowledge typo corrections
for my lecture notes.”
- **Hiding answers**:
“[**Spoilers**](/help/format-your-message-using-markdown#spoilers)
are a great way to answer questions about homework without depriving
students of a chance to keep thinking about the problem on their
own.”
- **Scheduling**: “With [**global
times**](/help/format-your-message-using-markdown#global-times),
I could announce office hours or outside lectures without having to
worry about confusion for students in different time zones.”
## Education beyond coursework
What happens once classes return to campus? “I intend to continue to
use Zulip as the main communication platform for my in-person classes
this coming year,” Kiran says.
Zulip is also helping Kiran organize events for students, and create
communities for education and research. “I used Zulip as the
communication hub for a 200-person undergraduate conference that was
held virtually for the first time,” Kiran says. “I’ve also started a
Zulip for the number theory research group at UCSD, where graduate
students and postdocs can connect to discuss reading courses, social
events, conferences of interest, etc.”
---
Learn more about [Zulip for Education](/for/education/), and how
Zulip is being used at the [Technical University of Munich](/case-studies/tum/)
and the [National University of Córdoba](/case-studies/university-of-cordoba/).
You can also check out our guides on using Zulip for [conferences](/for/events/)
and [research](/for/research/)!

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: National University of Córdoba FAMAF | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip connects faculty with students at the
National University of Córdoba, crossing the generational divide." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: National University of Córdoba</h1>
<p>Faculty of Mathematics, Astronomy, Physics and Computing (FAMAF)</p>
</div>
<div class="hero-text">
Learn more about <a href="/for/education/">Zulip for Education</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/university-of-cordoba-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,78 @@
Founded in 1613, the National University of Córdoba is the second largest
university in Argentina, with tuition-free enrollment for all. The university’s
Faculty of Mathematics, Astronomy, Physics and Computing (FAMAF) teaches classes
to over 5000 undergraduates from all over the country.
“Zulip is a key piece of how we run classes in our department,” says Nicolás
Wolovick, a professor at FAMAF and director of the computer science career
track. “If we didn’t have Zulip, I really don’t know how we’d manage it.”
## Sponsored hosting for a modern team chat app
For a while, FAMAF used Moodle’s course management software to communicate with
students, but “it was a pain,” Nicolás recalls. The department tried moving to
Slack. However, without a software budget, the message history limit on Slack’s
free plan was a major frustration.
In search of an alternative, a faculty member reached out to request a sponsored
Zulip Cloud Standard plan. With the request approved the very next day, the
department moved over to Zulip starting in Fall 2020.
Looking back, being pushed off Slack by its search history limit ended up being
for the best: “I think Zulip is a great tool, much better than Slack,” says
Miguel Pagano, professor at FAMAF.
> I think Zulip is a great tool, much better than Slack.
>
> — Miguel Pagano, professor at FAMAF of the National University of Córdoba
## Zulip becomes a knowledge base
Zulip has become part of the core flow of how faculty at FAMAF run their
classes. Instructors create channels for the classes they teach each semester.
For lab classes, instructors make private channels for communication with each
project group. “I use pinned channels to focus on the two subjects I’m teaching
right now,” Nicolás notes.
Discussions from prior semesters are available for easy reference, so
instructors can simply point students to past conversations for answers to their
questions. “Zulip acts as a knowledge database of what we did in each subject,”
Nicolás explains. “The search is perfect.”
> We can find messages from five years ago — it’s very convenient.
>
> — Miguel Pagano, professor at FAMAF of the National University of Córdoba
## A cross-generational app for instructors and students
Many members of the faculty prefer familiar tools, and sometimes find the UI of
apps like Discord overwhelming. So it matters that Zulip has a clean interface,
with channels and conversations inside channels clearly presented. There are
also some friendly touches: “I love using Markdown for message formatting, and
that you can copy-paste formatted text, and it translates accurately,” Nicolás
notes.
> The UI is spartan, simple, clear — I like that. It reminds me of what Google
> used to be.
>
> — Nicolás Wolovick, professor at FAMAF of the National University of Córdoba
And while students hardly use email, Nicolás and other faculty appreciate being
able to send messages to Zulip by replying to email notifications.
At the same time, Zulip offers fun features for the students. “We have a whole
subculture of custom emoji,” Nicolás says. “Students love to use them to
customize the space and express themselves.”
Still, the overall vibe is professional, and moderation has never been an issue.
“I’ve never had to ban anyone or even delete a message,” Nicolás says. Students
keep their Zulip account after graduation, which provides a way for faculty and
alumni to stay connected.
---
Learn more about [Zulip for Education](/for/education/), and how Zulip is being
used at the [Technical University of Munich](/case-studies/tum/) and the
[University of California San Diego](/case-studies/ucsd/). You can also check
out our guides on using Zulip for [conferences](/for/events/) and
[research](/for/research/)!

View File

@@ -0,0 +1,32 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Case study: WindBorne | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip became the irreplaceable hub for
coordinating work at WindBorne, from balloon launches around the globe to
building state-of-the-art AI models." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page case-study-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Case study: WindBorne</h1>
<p>Tech startup with worldwide operations</p>
</div>
<div class="hero-text">
Learn more about using Zulip for <a href="/for/business/">business</a>.
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/case-studies/windborne-case-study.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,136 @@
How can a scrappy startup help mitigate the most immediately destructive aspects
of climate change? [WindBorne](https://windbornesystems.com/) is advancing
humanity's ability to predict the weather — from hurricanes to heatwaves — and
thus manage its impacts.
Zulip has been WindBorne's irreplaceable hub for coordinating work
that ranges from balloon launches around the globe to developing
state-of-the-art AI models.
> All our digital communication flows through Zulip… We have three deep
> learning channels, each with twenty active topics a day. No other chat system
> could support that.
>
> — John Dean, co-founder and CEO of WindBorne
<figure class="markdown-image-with-caption">
<img src="/static/images/landing-page/case-studies/WindBorne-constellation.png" alt="Atlas, the largest balloon constellation in the world">
<figcaption class="markdown-image-caption">WindBorne Atlas, the largest balloon constellation in the world</figcaption>
</figure>
## “We were addicted to Slack”
When WindBorne co-founders started the company in 2019, Slack was the obvious
choice for their team chat. The team had met as Stanford undergrads, launching
high-altitude balloons with the [SSI](https://www.stanfordssi.org/) engineering
student group. “All the WindBorne cofounders were addicted to SSI's Slack — we
loved it,” says John Dean, WindBorne's co-founder and CEO.
The delight didn't last. The company's 12-person team was trying to use chat for
serious technical discussions, and Slack's user experience didn't feel so great
for that purpose. “With overlapping conversations, there was no way to make it
work. Slack threads are trying to solve a real problem, but solving it in a bad
way,” says John.
“Over 2019 and 2020, Slack got worse and worse,” John recalls. “I was using it
in Firefox on Linux, and things would just hang.” When Slack had outages, the
entire team's work would be disrupted for hours.
## “Oh my god, this is awesome”
When John discovered Zulip, its topic-based threading felt like the right
solution to Slack's messiness. After giving the app a try [in the Zulip
development community](https://chat.zulip.org/?show_try_zulip_modal), WindBorne
opted to host their own Zulip instance. (Never again will they have to rely on
an external vendor to manage their critical communication infrastructure.)
“After a couple of days, I thought: `Oh my god, this is awesome. How on earth
would you *not* use Zulip?'” John says. “It was so much easier to communicate.”
> How on earth would you not use Zulip?
>
> — John Dean, co-founder and CEO of WindBorne
Zulip's threading model was transformative, but John also appreciated other
touches. “[Zulip linkifiers](https://zulip.com/help/add-a-custom-linkifier) are
amazing,” John says. In WindBorne's Zulip, “W-” followed by a balloon's ID
number auto-links to that balloon's mission page, and “/live” goes to a live
map of balloon locations.
WindBorne's Head of Global Launch Operations Nathan Kaplan experienced a similar
revelation when he joined the company in 2023. “My previous company used Slack,
and they required threads for everything. It was a complete mess,” Nathan says.
“Zulip took some getting used to, but after two weeks, it was so much better
than anything I'd used before.”
> I love the application, and couldn't dream of going back to anything else.
> Slack and Discord just pale in comparison.
>
> — Nathan Kaplan, Head of Global Launch Operations
## Communication hub for coordinating dozens of contractors worldwide
<div class="text-image-in-row">
<p class="text-image-in-row-text">
Nathan travels around the world to manage WindBorne's balloon
launch sites — he's onboarded dozens of international contractors
who run WindBorne's launch operations.
<br/><br/>
Nathan designed a streamlined experience for coordinating contractors, with Zulip as the hub.
<br/><br/>
“80 to 90 percent of the work a contractor does happens within their launch
support channel on Zulip,” Nathan explains. “A big “aha” moment for them is
knowing what they need to launch based on messages in the “launch planning”
topic from the last few days, without having to do a bunch of scrolling.”
</p>
<figure>
<!-- Set custom width to reduce image height so that it doesn't overflow text. -->
<img
class="text-image-in-row-image windborne-alaska-image"
src="/static/images/landing-page/case-studies/Alaska-balloon.jpg"
alt="Balloon launch in Alaska"
>
<figcaption class="markdown-image-caption">Balloon launch in Alaska</figcaption>
</figure>
</div>
> Zulip organizes ideas in such a clean and simple way. You get easy
> readability over months, not just hours like in other apps.
>
> — Nathan Kaplan, Head of Global Launch Operations
Zulip also serves as a rapid prototyping platform to try out and refine
workflows before implementing them in WindBorne's dedicated launch management
product. Last year, Nathan used Zulip to develop a workflow for uploading photos
of balloon sensor bags. Only once requirements were clear did the team kick off
a major engineering project to build uploads into the launch management app.
> Zulip offers us so much more than anything else really could — especially for
> the contractor onboarding experience, and how we manage the entire team.
>
> — Nathan Kaplan, Head of Global Launch Operations
## The perfect platform for LLM bots
Zulip is a communal playground for WindBorne's team to try out new ideas. Using
Zulip's [bot API](https://zulip.com/api/running-bots), they built bots that
provide daily conversation summaries, post pull request reviews, and (more
whimsically) generate images of landscapes with balloons.
Zulip has been perfect for managing context for LLM bots: “If you integrate an
LLM bot into Slack, you can't manage its context window — off-topic messages can
poison the context,” John explains. “With Zulip, you can always just start a new
topic, and move messages around as needed.” John even uses a personal Zulip
instance as a note-taking app with integrated LLMs.
The team can experiment freely together without disrupting anyone's work: it's
easy to [mute](https://zulip.com/help/mute-a-topic) bot conversations you aren't
interested in. WindBorne
[allows](https://zulip.com/help/restrict-message-editing-and-deletion#configure-message-deletion-permissions)
any employee to delete messages to clear out experiments that didn't work out.
(Server administrators can review the activity log to make sure this permission
is not abused.)
> Zulip allows me to build the culture I want.
>
> — John Dean, co-founder and CEO of WindBorne

View File

@@ -0,0 +1,86 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "communities" %}
{% set PAGE_TITLE = "Open communities directory | Zulip" %}
{% set PAGE_DESCRIPTION = "Zulip communities that are open to the public, and
have opted in to be listed." %}
{% block hello_page_container %} hello-main{% endblock %}
{% block portico_content %}
{% include 'zerver/marketing_nav.html' %}
<div class="portico-landing integrations communities">
<div class="main">
<div class="padded-content">
<div class="inner-content">
<div class="integration-main-text">
<header>
<h1 class="portico-page-heading">
{% trans %}Open communities directory{% endtrans %}
</h1>
<p class="portico-page-subheading">
These Zulip communities are open to the public, and have
<a href="/help/communities-directory">opted in to be listed</a>.
</p>
</header>
</div>
<div class="integration-categories-dropdown">
<div class="integration-toggle-categories-dropdown">
<h3 class="dropdown-category-label">{% trans %}Filter by category{% endtrans %}</h3>
<i class="fa fa-angle-down" aria-hidden="true"></i>
</div>
<div class="dropdown-list">
<a href="#all" class="realm-category selected" data-category="all">
{% trans %}All{% endtrans %}
</a>
{% for org_type in org_types.keys() %}
<a href="#{{ org_type }}" class="realm-category" data-category="{{ org_type }}">
{{ org_types[org_type]["name"] }}
</a>
{% endfor %}
</div>
</div>
<div class="catalog">
<div class="integration-categories-sidebar">
<h3>{% trans %}Categories{% endtrans %}</h3>
<a href="#all" data-category="all" class="realm-category selected">
{% trans %}All{% endtrans %}
</a>
{% for org_type in org_types.keys() %}
<a href="#{{ org_type }}" data-category="{{ org_type }}" class="realm-category">
{{ org_types[org_type]["name"] }}
</a>
{% endfor %}
</div>
<div class="eligible_realms">
{% for eligible_realm in eligible_realms %}
<a class="eligible_realm" data-org-type="{{ eligible_realm.org_type_key }}" href="{{ eligible_realm.realm_url }}">
<img class="eligible_realm_logo" src="{{ eligible_realm.logo_url }}" alt="{{ eligible_realm.name }} logo"/>
<div class="eligible_realm_details">
<h3 class="eligible_realm_name">{{ eligible_realm.name }}</h3>
<h4 class="eligible_realm_description">
{{ eligible_realm.description }}
</h4>
</div>
</a>
{% endfor %}
<hr />
<div class="eligible_realm_end_notice">
<p>Learn how Zulip can be a <a href="/for/communities/">home for your community</a>.</p>
</div>
</div>
</div>
</div> <!-- .inner-content -->
</div> <!-- .padded-content -->
</div> <!-- .main -->
</div> <!-- .portico-landing -->
{% endblock %}

View File

@@ -0,0 +1,130 @@
<div class="zulip-plans-comparison education-features-comparison">
<div class="text-header">
<div class="text-content">
<h1 class="for-education-plans-heading">Zulip: The most complete communication hub for your class.</h1>
</div>
</div>
<!-- comparison-table-top is important to observe sticky table header -->
<div class="comparison-table-top"></div>
<table class="comparison-table">
<thead>
<tr>
<th class="comparison-table-feature">
<span class="label-features">Feature</span>
</th>
<th class="zulip-cell"><span class="label-zulip">Zulip</span></th>
<th class="competitor-cell">Slack</th>
<th class="competitor-cell">Discord</th>
<th class="competitor-cell">Piazza</th>
<th class="competitor-cell">Campus<wbr/>Wire</th>
</tr>
</thead>
<tbody>
<tr>
<td class="comparison-table-feature">Rich, modern chat</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Apps for every platform</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Self-hosting option for full control over data</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Dedicated account</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Topic-based threading</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Resolve topics/questions</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Move topics/questions</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Native LaTeX support</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Built-in spoilers</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Emoji reactions</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">@-mention groups</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature">Scales to 10,000s of users</td>
<td class="zulip-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-positive"><i class="icon icon-check"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
<td class="competitor-cell comparison-value-negative"><i class="icon icon-x"></i></td>
</tr>
<tr>
<td class="comparison-table-feature"># supported languages</td>
<td class="zulip-cell comparison-value-positive number">23 <span class="bottom-border"></span></td>
<td class="competitor-cell comparison-value-positive number">13</td>
<td class="competitor-cell comparison-value-positive number">30</td>
<td class="competitor-cell comparison-value-warning number one">1</td>
<td class="competitor-cell comparison-value-warning number one">1</td>
</tr>
</tbody>
</table>
</div>

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,60 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Development community | Zulip" %}
{% set PAGE_DESCRIPTION = "Join the Zulip development community to contribute,
ask questions, or provide feedback to the creators of Zulip. Everyone is
welcome!" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">{% trans %}The Zulip development community{% endtrans %}</h1>
</div>
<div class="hero-text">
Join today! The buttons below provide customized channel subscriptions.
</div>
<div class="hero-buttons center">
<a href="https://chat.zulip.org/join/t5crtoe62bpcxyisiyglmtvb/" class="button">
{{ _('Join as a user') }}
</a>
<a href="https://chat.zulip.org/join/wnhv3jzm6afa4raenedanfno/" class="button">
{{ _('Join as a self-hoster') }}
</a>
<a href="https://chat.zulip.org/join/npzwak7vpmaknrhxthna3c7p/" class="button">
{{ _('Join as a contributor') }}
</a>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/development-community.md') }}
</div>
</div>
</div>
<div class="feature-end">
<div class="bottom-register-buttons extra_margin_before_footer">
<h1>
Join today!
</h1>
<div class="hero-buttons center">
<a href="https://chat.zulip.org/join/t5crtoe62bpcxyisiyglmtvb/" class="button">
{{ _('Join as a user') }}
</a>
<a href="https://chat.zulip.org/join/wnhv3jzm6afa4raenedanfno/" class="button">
{{ _('Join as a self-hoster') }}
</a>
<a href="https://chat.zulip.org/join/npzwak7vpmaknrhxthna3c7p/" class="button">
{{ _('Join as a contributor') }}
</a>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,321 @@
The primary communication forum for the Zulip community is the Zulip
server hosted at [chat.zulip.org](https://chat.zulip.org/):
- **Users** and **administrators** of Zulip organizations stop by to
ask questions, offer feedback, and participate in product design
discussions.
- **Contributors to the project**, including the **core Zulip
development team**, discuss ongoing and future projects, brainstorm
ideas, and generally help each other out.
Everyone is welcome to [sign up](https://chat.zulip.org/) and
participate — we love hearing from our users! Public channels in the
community receive thousands of messages a week. We recommend signing
up using the special invite links for
[users](https://chat.zulip.org/join/t5crtoe62bpcxyisiyglmtvb/),
[self-hosters](https://chat.zulip.org/join/wnhv3jzm6afa4raenedanfno/)
and
[contributors](https://chat.zulip.org/join/npzwak7vpmaknrhxthna3c7p/)
to get a curated list of initial channel subscriptions.
To get help in real time, you will have the best luck finding core
developers during daylight hours in North America (roughly between
15:00 UTC and 1:00 UTC), but the sun never sets on the Zulip
community. Most questions get a reply within minutes to a few hours.
Before posting your first message, please read the [community
norms](#community-norms) section below in its entirety. It explains how to
engage with the Zulip community.
You can also [read conversations](https://chat.zulip.org/) in the community
without creating an account. If you are evaluating using Zulip for your
organization, check out these [tips](https://chat.zulip.org/?show_try_zulip_modal)
for exploring the product in action in the development community.
<br/>
# Community norms
## How we communicate
- Use **informal language**; there’s no need for titles like “Sir” or “Madam”.
- Use **[gender-neutral
language](https://en.wikipedia.org/wiki/Gender-neutral_language)**. For
example:
- **Good**: Does anyone need a review on **their** PR?
- **Not good**: Does anyone need a review on **his** PR?
- Aim to **communicate professionally**, using full sentences with correct spelling
and grammar.
- **Do not post AI-generated messages** -- we want to read your own genuine
expression of your thoughts. It's fine to use whatever tools you like for help
with spelling, grammar, or translation.
- Follow the community **[code of
conduct](https://zulip.readthedocs.io/en/latest/code-of-conduct.html)**.
Read the [guide on how we
communicate](https://zulip.readthedocs.io/en/latest/contributing/how-we-communicate.html)
to learn more.
## How to ask for help
- Formulate a **clear question**, which includes an appropriate amount of context
and a specific request for help. Link to **relevant references** (e.g., GitHub
issues, Zulip's documentation, etc.).
- When relevant, include the **full traceback** in a [code
block](/help/code-blocks) (not a screenshot).
- If working on a code contribution, **try to solve your own problem first**,
including reading through relevant documentation and code. Identify and
describe the precise point on which you feel stuck.
Moderators read every public channel, and make sure that questions are
addressed. To avoid disrupting work in the community:
- **Never ask the same question in multiple places**.
- If you are new to the community, **default to never using @-mentions**.
Unnecessary mentions make it harder for Zulip's maintainers to see and respond
to urgent messages. You can use Zulip's [silent
mentions](https://zulip.com/help/mention-a-user-or-group#silently-mention-a-user)
to refer to a user without notifying them.
## How to give feedback
If you have ideas for how to make Zulip better, we’d love to hear from you!
Learn how to [report
bugs](https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html),
[suggest features and
improvements](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html),
and [share your
experience](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html#evaluation-and-onboarding-feedback)
with Zulip.
## Where to post
- **Ask questions in channels**, rather than DMing core contributors. You’ll get
answers faster since more people can help, and others will be able to benefit
from the discussion.
- **Start a [new topic](/help/introduction-to-topics)** unless you’re replying
to an existing conversation.
- If you like, **introduce yourself** in the [#new members
channel](https://chat.zulip.org/#narrow/channel/95-new-members), using your
name as the topic. Tells us what brings you to the community!
- **Test messages** should only be sent to the [#test
here](https://chat.zulip.org/#narrow/channel/7-test-here) channel, or as DMs
to yourself.
The section below gives a detailed overview of the channels in the Zulip
community — take a look there to learn more.
<br/>
# Where do I send my message?
This section describes popular public channels on chat.zulip.org. Kick
off the discussion by starting a [new topic](/help/introduction-to-topics)
in the appropriate channel! Don’t stress too much about picking the
right place if you’re not sure; anyone in the community can edit a
topic name, and [moderators](/help/user-roles) can [move a
topic to a different channel](/help/move-content-to-another-channel).
## Channels for everyone
- [#feedback](https://chat.zulip.org/#narrow/channel/137-feedback) is
for posting feedback on Zulip, including feature requests, suggestions for
improvements to the UI or existing features, or anything else! We also
appreciate hearing about how Zulip is used in your organization.
- [#integrations](https://chat.zulip.org/#narrow/channel/127-integrations)
is for bug reports or questions about integrations.
- [#issues](https://chat.zulip.org/#narrow/channel/9-issues) is for reporting
bugs (or possible bugs) in the Zulip web app or server implementation.
- [#mobile](https://chat.zulip.org/#narrow/channel/48-mobile),
[#desktop](https://chat.zulip.org/#narrow/channel/16-desktop), and
[#zulip-terminal](https://chat.zulip.org/#narrow/channel/206-zulip-terminal)
are the best places to post bug reports or questions about Zulip's apps. Note
that [#desktop](https://chat.zulip.org/#narrow/channel/16-desktop) should only
be used for issues specific to the desktop app, which shares most of its UI
and implementation with the web app.
- Everyone is welcome to introduce themselves in [#new
members](https://chat.zulip.org/#narrow/channel/95-new-members). Posting
here with your name as the topic is a great option if you’re
uncertain where to start a conversation.
- [#test here](https://chat.zulip.org/#narrow/channel/7-test-here) is
for sending test messages without inconveniencing other users :). We
recommend muting this channel when not using it.
## Channels for Zulip users and administrators
- [#user questions](https://chat.zulip.org/#narrow/channel/138-user-questions) is
for questions about how to configure your Zulip organization, and accomplish
your goals with Zulip. You can also refer to the [Zulip help center](/help)
for detailed documentation.
- [#production help](https://chat.zulip.org/#narrow/channel/31-production-help) is
for all questions related to [self-hosting
Zulip](/self-hosting/).
- [#zulip
cloud](https://chat.zulip.org/#narrow/channel/387-zulip-cloud) is for
all conversations about the [Zulip Cloud](https://zulip.com/plans/)
service.
## Channels for code contributors
### All codebases
- [#git help](https://chat.zulip.org/#narrow/channel/44-git-help) is
for help with using Git.
- [#code review](https://chat.zulip.org/#narrow/channel/91-code-review)
is for getting feedback on your work. We encourage all developers to
comment on work posted here, even if you’re new to the Zulip
project; reviewing other PRs is a great way to develop experience,
and even just manually testing a proposed new feature and posting
feedback is super helpful. Note that GitHub is our primary system
for managing code reviews.
- [#api design](https://chat.zulip.org/#narrow/channel/378-api-design)
is a low-traffic channel for discussing and coordinating changes to
the [Zulip API](https://zulip.com/api/rest), with all stakeholders
present.
- [#documentation](https://chat.zulip.org/#narrow/channel/19-documentation)
is the right place for general conversations about work on
documentation (including design discussions, questions, updates on a
project, or anything else).
### Server and web app
- [#development help](https://chat.zulip.org/#narrow/channel/49-development-help)
is for asking for help with any Zulip server/web app development work.
- [#provision help](https://chat.zulip.org/#narrow/channel/21-provision-help)
is for help specifically on setting up the server/web app development
environment. [#tools](https://chat.zulip.org/#narrow/channel/18-tools)
is other conversations about the server/web app developer tooling.
- [#backend](https://chat.zulip.org/#narrow/channel/3-backend) and
[#frontend](https://chat.zulip.org/#narrow/channel/6-frontend) are
the right place for general conversations about work on the Zulip
server and web app respectively (including design discussions,
questions, updates on a project, or anything else).
- [#design](https://chat.zulip.org/#narrow/channel/101-design) is the
place to discuss the detailed UI and UX design of a change you're
working on, meaning how it looks and how it behaves as seen by the
user. (Technical discussions, including how the code itself is
designed, go in one of the other channels above.)
- [#automated
testing](https://chat.zulip.org/#narrow/channel/43-automated-testing)
is primarily used for automated notifications about [CI
failures](https://zulip.readthedocs.io/en/latest/testing/continuous-integration.html),
but is also a good place to discuss projects to improve Zulip’s
automated testing infrastructure.
### Mobile app
- [#mobile-dev-help](https://chat.zulip.org/#narrow/channel/516-mobile-dev-help)
is for asking for help with any development work on the Zulip mobile app.
- [#mobile-team](https://chat.zulip.org/#narrow/channel/243-mobile-team)
is the right place for general conversations about work on the
mobile app (including technical design discussions, questions,
updates on a project, or anything else).
- [#mobile-design](https://chat.zulip.org/#narrow/channel/530-mobile-design)
is the place to discuss the detailed UI and UX design of a change
you're working on, meaning how it looks and how it behaves as seen
by the user. (Technical discussions, including how the code itself
is designed, go in one of the other channels above.)
- [#mobile](https://chat.zulip.org/#narrow/channel/48-mobile) is
primarily for user feedback and issue reports, not work on the code.
### Desktop and terminal apps
- [#desktop](https://chat.zulip.org/#narrow/channel/16-desktop) and
[#zulip-terminal](https://chat.zulip.org/#narrow/channel/206-zulip-terminal)
are for discussing work on the Zulip desktop and terminal apps
respectively.
## Channels for translators
- [#translation](https://chat.zulip.org/#narrow/channel/58-translation)
is for discussing [Zulip’s
translations](https://zulip.readthedocs.io/en/latest/translating/translating.html).
- Some languages have channels named like
[#translation/fr](https://chat.zulip.org/#narrow/channel/371-translation.2Ffr)
and
[#translation/zh_tw](https://chat.zulip.org/#narrow/channel/377-translation.2Fzh_tw)
to coordinate translation work for that language.
## Channels for anyone spending time in the community
- [#announce](https://chat.zulip.org/#narrow/channel/1-announce) is our
low-traffic channel for project announcements (releases, etc.).
- [#checkins](https://chat.zulip.org/#narrow/channel/65-checkins) is
for progress updates on what you’re working on and its status;
usually folks post with their name as the topic. Everyone is welcome
to participate!
- [#design](https://chat.zulip.org/#narrow/channel/101-design) and
[#mobile-design](https://chat.zulip.org/#narrow/channel/530-mobile-design)
are where we discuss UI and feature design and collect feedback on
potential design changes. We love feedback, so take a look at the
active discussions and don’t hesitate to speak up!
<br><p>These "design" channels are primarily intended for discussing
changes the community is actively working on. For starting a topic
to propose a new design change, the best place is
[#feedback](https://chat.zulip.org/#narrow/channel/137-feedback) or
[#mobile](https://chat.zulip.org/#narrow/channel/48-mobile).</p>
- [#discussions](https://chat.zulip.org/#narrow/channel/277-discussions)
is where we do fun community conversations like “Ask Me Anything”
Q&A sessions with project members.
- [#documentation](https://chat.zulip.org/#narrow/channel/19-documentation)
and
[#api documentation](https://chat.zulip.org/#narrow/channel/412-api-documentation)
are where we discuss improving Zulip’s user, sysadmin, API, and
developer documentation.
- [#general](https://chat.zulip.org/#narrow/channel/2-general) is for
all topics of general interest.
- [#learning](https://chat.zulip.org/#narrow/channel/92-learning) is
for posting great learning resources one comes across.
- [#off topic](https://chat.zulip.org/#narrow/channel/97-off-topic) is
is for occasional conversations not related to Zulip, usually things
of general interest to open-source communities.
You can always find the description for the channel you’re reading at
the top of the Zulip app.
<br/>
# Anything else to keep in mind?
## Don’t try to read *everything*
Keeping up with **everything** happening in the Zulip project is both
difficult and rarely a useful goal. To make the best use of your time,
we highly recommend that you unsubscribe from channels that you aren’t
interested in, mute channels that are only of occasional interest, and
make use of [Zulip’s skimming features](/help/reading-strategies),
like Recent conversations, to spend your time on topics that interest
you.
## Searching for past conversations
To look for previous threads about something, we recommend using the
following [search filters](/help/search-for-messages#search-filters):
`streams:public <your keyword(s)>`.
This will search the full history of all public channels for `<your
keyword(s)>`, including messages sent before you joined and messages
on public channels you’re not subscribed to.
## Linking to GitHub issues and pull requests
We've set up [custom linkifiers](/help/add-a-custom-linkifier)
so that it's easy to link to issues and pull requests in Zulip
project repositories when composing a message or starting a
[new topic](/help/introduction-to-topics). Here are examples for linking
to issue 1234 in the main Zulip project repositories:
- [Server and web app][server-web-repository]: `#1234`
- [Flutter mobile client][flutter-repository]: `#F1234`
- [Terminal client][terminal-repository]: `#T1234`
- [Desktop client][desktop-repository]: `#D1234`
## New features are tested here
We [continuously test out new features or ideas][release-lifecycle] on
chat.zulip.org before rolling them out to Zulip Cloud or including
them in a Zulip Server release (or deciding not to!). Please report in
[#issues](https://chat.zulip.org/#narrow/channel/9-issues) anything you
notice that seems broken! It’s likely you’ve found a bug in an upcoming
feature.
[release-lifecycle]: https://zulip.readthedocs.io/en/latest/overview/release-lifecycle.html
[server-web-repository]: https://github.com/zulip/zulip
[flutter-repository]: https://github.com/zulip/zulip-flutter
[terminal-repository]: https://github.com/zulip/zulip-terminal
[desktop-repository]: https://github.com/zulip/zulip-desktop

View File

@@ -0,0 +1,31 @@
{% extends "zerver/marketing_page.html" %}
{% set entrypoint = "plans-page" %}
{% set PAGE_TITLE = "Features | Zulip" %}
{% set PAGE_DESCRIPTION = "From highly configurable notifications, to powerful
formatting and flexible administration, Zulip has you covered." %}
{% block content %}
{% include 'zerver/marketing_nav.html' %}
<div class="portico-pricing features-page showing-cloud">
<div class="body-bg">
<div class="body-bg__layer"></div>
</div>
<h1>Organized team chat solution</h1>
<div class="h1-subheader">
From small teams to organizations with thousands of users, Zulip has you
covered. See <a href="/plans/">plans and pricing</a>.
</div>
<div class="main">
{% include "corporate/comparison_table_integrated.html" %}
</div>
</div>
{% include 'zerver/footer.html' %}
{% endblock %}

View File

@@ -0,0 +1,600 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for business" %}
{% set PAGE_DESCRIPTION = "Zulip offers efficient communication for your
business. Learn how organized team chat will make your team more productive." %}
{% block marketing_content %}
<div class="portico-landing plans why-page solutions-page for-companies">
<div class="hero bg-companies">
<div class="bg-dimmer"></div>
<h1 class="center">Efficient communication for your business.</h1>
<p>Learn how organized team chat will <br/>make your team more productive.</p>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/request-demo/" class="button">
{{ _('Get a demo') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="feature-intro">
<h1 class="center">Communication efficiency represents <br /> a massive opportunity.</h1>
<p>
Communication consumes a <a href="https://blog.rescuetime.com/slack-and-email-cost/">huge fraction of time</a> for managers and knowledge workers, and the workplace chat revolution has done nothing to reduce communication load.
</p>
<div class="intro_quote">
<blockquote>
Ironically, for some, email has now become the place for well-thought-out communications while workplace [chat] software has been inundated by thoughtless meme and emoji sharing.
<div class="author">
&mdash; “<a href="https://www.vox.com/recode/2019/5/1/18511575/productivity-slack-google-microsoft-facebook">The productivity pit: how Slack is ruining work</a>” by <a href="https://www.vox.com/recode"><em>Recode</em> (Vox)</a>
</div>
</blockquote>
</div>
<p>Worse, chat communication on Slack or Microsoft Teams is disruptive, chaotic, and ephemeral.</p>
<div class="intro_quote">
<blockquote>
The [chat] software goes from helping you work to making it impossible to get work done.
<div class="author">
&mdash; “<a href="https://www.vox.com/recode/2019/5/1/18511575/productivity-slack-google-microsoft-facebook">The productivity pit: how Slack is ruining work</a>” by <a href="https://www.vox.com/recode"><em>Recode</em> (Vox)</a>
</div>
</blockquote>
</div>
<p>Zulip’s unique topic-based threading combines the best of email and chat to finally make efficient communication possible.
</p>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Use topics to organize the discussion
</h1>
<ul>
<li>
<div class="list-content">
Like email threads, <a href="/help/introduction-to-topics">Zulip topics</a> create a separate space for each discussion, so different conversations will never get in each other’s way.
</div>
</li>
<li>
<div class="list-content">
Save time by reading the topics you care
about, and skimming or skipping the rest.
</div>
</li>
<li>
<div class="list-content">
See each message in context — no more scrolling up and down through dozens of messages to track down the topic of conversation.
</div>
</li>
<li>
<div class="list-content">
Important messages won’t be missed, no matter what else is happening, and whether the thread is old or new.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
In fact now it seems strange to me to just fire off messages in Slack with no subject – that's chaos, madness. The genius of subject lines is that you can quickly and easily catch up on the messages you missed in your off-hours... This feature alone saves me hours a week.
</blockquote>
<div class="author">
&mdash; <a href="https://www.theregister.com/2021/07/28/zulip_open_source_chat_collaboration_software/">Zulip review in <em>The Register</em></a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/organized-conversations.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/software-engineer.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Focus work without disruptions
</h1>
<ul>
<li>
<div class="list-content">
Maintain focus, pay attention in meetings,
or work from another time zone. You can
always reply in context even if you've
been away from the conversation for hours
or days.
</div>
</li>
<li>
<div class="list-content">
Busy leaders and experts can participate on their
own time, without incessant @-mentions
clamoring for their attention.
</div>
</li>
<li>
<div class="list-content">
Let others know whether you're around with <a
href="/help/status-and-availability#statuses">emoji
statuses</a> and <a href="/help/status-and-availability#availability">availability</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Zulip’s threading model makes it so much easier to
manage my team. As a leader, in just a few minutes I can
get an overview over what's going on and see where my
attention is needed.
</blockquote>
<div class="author">
&mdash; Gaute Lund, co-founder and owner of iDrift AS
</div>
</div>
<a class="case-study-link" href="/case-studies/idrift/"
target="_blank" rel="noopener noreferrer" >Learn more about how the iDrift AS company uses Zulip
↗</a>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/software-engineer.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Chat as a knowledge repository
</h1>
<ul>
<li>
<div class="list-content">
With conversations organized by topic, you
can review old discussions to
understand past work, explanations, and decisions.
</div>
</li>
<li>
<div class="list-content">
<a href="/help/link-to-a-message-or-conversation#link-to-zulip-from-anywhere">Link
to a Zulip conversation</a> from emails,
docs, issue trackers, code comments, or anywhere else.
</div>
</li>
<li>
<div class="list-content">
Topics make it easy to find the right conversation with Zulip's <a href="/help/search-for-messages">powerful full-text search</a>.
</div>
</li>
<li>
<div class="list-content">
Topic auto-complete lets you know when your idea or question has been discussed in the past.
</div>
</li>
<li>
<div class="list-content">
Keep discussions organized by <a href="/help/rename-a-topic">moving</a> or <a href="/help/move-content-to-another-topic">splitting</a> topics when conversations digress.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Coupled with a culture of using Zulip in an organized
way, it’s difficult to overstate the impact it has on
knowledge management... It is the essence of good UX
design.
</blockquote>
<div class="author">
&mdash; Max McCrea, co-founder of Monadical
</div>
</div>
<a class="case-study-link" href="https://monadical.com/posts/how-to-make-remote-work-part-two-zulip.html"
target="_blank" rel="noopener noreferrer">Learn more on the Monadical blog
↗</a>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/integrations_with_border.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Effective workflows with integrations
</h1>
<ul>
<li>
<div class="list-content">
Native integrations for GitHub, Jira,
PagerDuty, Sentry
and <a href="/integrations/">hundreds of
other tools</a> can initiate new topics,
creating lightweight discussion spaces for
each issue.
</div>
</li>
<li>
<div class="list-content">
Bots can also use a dedicated topic to avoid
crowding out conversations.
</div>
</li>
<li>
<div class="list-content">
Use topics to manage support workflows, answer questions, and collaborate to investigate issues. <a href="/help/resolve-a-topic">Mark the topic ✓ resolved</a> when done!
</div>
</li>
<li>
<div class="list-content">
<a href="/help/add-a-custom-linkifier">Customize
Zulip’s markup with linkifiers</a>, so that
“JIRA-1234” and “ZD-1234” automatically
link to issues or tickets in the tools you use.
</div>
</li>
<li>
<div class="list-content">
Connect to thousands of other products
using <a href="https://zapier.com/apps/zulip/integrations">Zapier</a>.
Integrations written for Slack can post
into Zulip via
the <a href="https://zulip.com/integrations/slack_incoming">Slack
compatible webhook</a>.
</div>
</li>
<li>
<div class="list-content">
Build your own integrations with Zulip’s
easy-to-use <a href="/api/">RESTful
API</a>, <a href="/api/installation-instructions">client
bindings</a>, <a href="https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html">incoming
webhooks</a>, <a href="/help/outgoing-webhooks">outgoing
webhooks</a>
and <a href="/help/running-bots">interactive
bot framework</a>.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/integrations_with_border.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Powerful formatting
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/code-blocks">Zulip code blocks</a>
come with syntax highlighting for over 250 languages, and integrated <a href="/help/code-blocks#code-playgrounds">code playgrounds.</a>
</div>
</li>
<li>
<div class="list-content"><a href="/help/format-your-message-using-markdown#latex">Type LaTeX</a> directly into your Zulip message, and see it beautifully rendered.</div>
</li>
<li>
<div class="list-content">Enjoy inline image, video and website previews.</div>
</li>
<li>
<div class="list-content">
If you made a mistake, no worries! You
can <a href="/help/edit-a-message">edit your
message</a>, or move it to a
different <a href="/help/move-content-to-another-topic">topic</a>
or <a href="/help/move-content-to-another-channel">channel</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Zulip’s unique threading saves me well over an hour a day in working with our distributed team of engineers and PMs across 7+ time zones. We tried Slack, Mattermost, and other team chat products that claim to support threading, and nothing handles synchronous and asynchronous communication so intuitively.
</blockquote>
<div class="author">
&mdash; Jacinda Shelly, CTO, <a href="https://www.doctorondemand.com/">Doctor on Demand</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-top.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-bottom.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Interactive messaging
</h1>
<ul>
<li>
<div class="list-content">
Start a <a href="/help/start-a-call">video
call</a> with the click of a button, or
make plans for later without worrying
about time zones
using <a href="/help/format-your-message-using-markdown#global-times">global times</a>.
</div>
</li>
<li>
<div class="list-content">
Use <a href="/help/emoji-reactions">emoji
reactions</a> for lightweight
interactions. Have fun
with <a href="/help/custom-emoji">custom
emoji</a> and gather feedback
with <a href="/help/create-a-poll">polls</a>.
</div>
</li>
<li><div class="list-content">Share files or images with <a href="/help/share-and-upload-files">drag-and-drop uploads</a>.</div></li>
<li><div class="list-content">Enjoy animated GIFs with Zulip's <a href="/help/animated-gifs">native integration</a>.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The software must be as simple as possible. That’s why
we love Zulip.
</blockquote>
<div class="author">
&mdash; Erik Dittert, Head of IT at GUT contact
</div>
</div>
<a class="case-study-link" href="/case-studies/gut-contact/"
target="_blank" rel="noopener noreferrer" >Learn more about how GUT contact uses Zulip
↗</a>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-bottom.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Flexible administration and permissions
</h1>
<ul>
<li>
<div class="list-content">
Restrict sign-up by email domain, use a
single sign-on solution, or send
invitations by
email. <a href="https://zulip.readthedocs.io/en/latest/production/authentication-methods.html">Supported
authentication providers</a> include LDAP,
SAML, OIDC, Google, GitHub, GitLab, Apple,
and more.
</div>
</li>
<li><div class="list-content">Automatically subscribe users to channels <a href="/help/set-default-channels-for-new-users">when they join</a>, subscribe a <a href="/help/user-groups">group of users</a>, or copy membership from another channel. Add users to the right channels for their team and role with <a href="/help/invite-new-users#create-a-reusable-invitation-link">custom invitation links</a>.</div></li>
<li>
<div class="list-content">Manage your organization with
<a href="/help/manage-permissions">fine-grained
permission settings</a> you can assign
to <a href="/help/user-roles">user
roles</a>, <a href="/help/user-groups">user
groups</a>,
and <a href="/help/introduction-to-users">individual
users</a>.
</div>
</li>
<li>
<div class="list-content">Customize <a href="/help/channel-permissions">viewing</a>
and <a href="/help/channel-posting-policy">posting</a>
permissions for channels
and <a href="/help/restrict-direct-messages">direct
messages</a>.
</div>
</li>
<li>
<div class="list-content">
Add partners, vendors and temporary contractors as <a href="/help/guest-users">guest users</a>.
</div>
</li>
<li><div class="list-content">Use Zulip as your employee directory. Sync names, <a href="/help/user-roles">roles</a>, avatars, and <a href="/help/custom-profile-fields">custom profile fields</a> from LDAP or SAML.</div></li>
<li>
<div class="list-content">Manage compliance with flexible <a
href="/help/message-retention-policy">message retention
policies</a>
and <a href="/help/export-your-organization#compliance-export">custom
data exports</a>.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/privacy.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Enterprise grade security, reliability and control
</h1>
<ul>
<li>
<div class="list-content">
Zulip Cloud is built with <a href="/policies/privacy">privacy</a> and <a href="/security/">security</a> in mind, and is used by some of the most security-conscious organizations in the world.
</div>
</li>
<li><div class="list-content">Zulip is <a href="https://github.com/zulip">100% open-source software</a>, with no "open core" catch. We work hard to make it <a href="https://zulip.readthedocs.io/en/latest/production/install.html">easy to set up</a>, <a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups">back up</a>, and <a href="https://zulip.readthedocs.io/en/stable/production/upgrade.html">maintain</a> a self-hosted Zulip installation, where you have full control of your data.</div></li>
<li><div class="list-content">Move your data with our high quality <a href="/help/export-your-organization">export</a> and <a href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a> tools; you are never locked into a proprietary tool.</div></li>
<li><div class="list-content">Zulip is built for scale and works reliably for organizations with thousands of users online at once with <a href="https://zulip.readthedocs.io/en/stable/production/requirements.html#scalability">modest hardware</a>.</div></li>
<li>
<div class="list-content">
Zulip has by far the <a href="/team/">most active open-source
development community</a> of any team chat
software. The paid team provides
leadership, expertise and support for the
project in addition to operating the Zulip
Cloud service.
</div>
</li>
<li>
<div class="list-content">
Zulip is sustainably funded and designed
for maintainability to ensure that we can
serve our customers for years to come.
</div>
</li>
<li>
<div class="list-content">
Customize Zulip with your organization’s branding.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/privacy.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
When and how you want it
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/apps/">apps for every
platform</a>, you can check Zulip at your computer or on your
phone. Zulip works great in a browser, so no download is
required.
</div>
</li>
<li><div class="list-content">Zulip alerts you about timely messages with <a href="/help/channel-notifications">fully customizable</a> mobile, email and desktop notifications.</div></li>
<li>
<div class="list-content">
Mention <a href="/help/mention-a-user-or-group">users</a>, <a href="/help/user-groups">groups
of users</a>
or <a href="/help/dm-mention-alert-notifications#wildcard-mentions">everyone</a>
when you need their attention.
</div>
</li>
<li><div class="list-content">Use Zulip in your language of choice, with translations into <a href="https://hosted.weblate.org/projects/zulip/">23 languages</a>.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
I love the application, and couldn't dream of going back
to anything else. Slack and Discord just pale in
comparison.
</blockquote>
<div class="author">
&mdash; Nathan Kaplan, Head of Global Launch Operations
at WindBorne
</div>
</div>
<a class="case-study-link" href="/case-studies/windborne/"
target="_blank" rel="noopener noreferrer">Learn more about how WindBorne uses Zulip
↗</a>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-end">
<div class="description">
<h1>
Make the move today
</h1>
<p>Getting started or moving from another platform is easy! Import your existing organization from <a href="/help/import-from-slack">Slack</a>, <a href="/help/import-from-mattermost">Mattermost</a>, or <a href="/help/import-from-rocketchat">Rocket.Chat</a>.</p>
<p>To get more insight into how Zulip can help your organization, read how the <a href="/case-studies/idrift/">iDrift AS</a> company, the <a href="/case-studies/gut-contact/">GUT contact</a> support agency, the <a href="/case-studies/end-point/">End Point Dev</a> software consultancy, and the startups <a href="/case-studies/semsee/">Semsee</a> and <a href="/case-studies/atolio/">Atolio</a> are using Zulip.</p>
<p>If you have any questions, please contact us at <a href="mailto:sales@zulip.com">sales@zulip.com</a>. You can also drop by our <a href="/development-community/">friendly development community at chat.zulip.org</a> to ask for help or suggest improvements!</p>
<div class="intro_quote">
<blockquote>
Zulip is everything Slack is, but it's smarter and more powerful.
<div class="author">
&mdash; <a href="https://www.theregister.com/2021/07/28/zulip_open_source_chat_collaboration_software/">Zulip review in <em>The Register</em></a>
</div>
</blockquote>
</div>
</div>
</div>
<div class="portico-pricing showing-cloud">
{% include "corporate/pricing_model.html" %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,76 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for communities" %}
{% set PAGE_DESCRIPTION = "Zulip is designed with communities in mind, including
open-source projects, research collaborations, and volunteer organizations.
Reach out for a sponsorship!" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<h1 class="center">Zulip for communities</h1>
<p>
Volunteer organizations &nbsp;•&nbsp; Professional communities
&nbsp;•&nbsp; Local groups &nbsp;•&nbsp; Support groups
&nbsp;•&nbsp; Creator communities &nbsp;•&nbsp; Hobby groups
&nbsp;•&nbsp; Alumni communities &nbsp;•&nbsp; Friends and family
<br />
</p>
<div class="hero-text">
Learn how the <a href="/case-studies/recurse-center/">Recurse
Center</a>, <a href="/case-studies/rust/">Rust language</a>,
<a href="/case-studies/asciidoctor/">Asciidoctor</a>, and&nbsp;<a
href="/case-studies/lean/">Lean math </a>
communities are using Zulip.
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/for/communities.md') }}
</div>
</div>
</div>
<div class="bottom-register-buttons extra_margin_before_footer">
<div class="bottom-text-large">
<p>
See Zulip in action in the <a
href="https://chat.zulip.org/?show_try_zulip_modal">Zulip
development community</a>, or in other open communities that
have <a href="/help/communities-directory">opted in</a> to be
listed in our
<a href="/communities/">directory</a>. Please contact <a
href="mailto:sales@zulip.com">sales@zulip.com</a> with any
questions.
</p>
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,256 @@
Zulip connects communities of all kinds by making it easy to chat real-time or
async. Why are communities choosing Zulip over Discord, WhatsApp, Slack,
Facebook, and other apps you might consider? Zulip provides:
- A platform that helps [community members to
connect](#encourage-all-community-members-to-connect-real-time-or-async) and
[communities to grow](#grow-your-community).
- A comprehensive [moderation
toolkit](#a-moderation-toolkit-that-offers-everything-you-need).
- Control over [how to sign up](#as-public-as-you-want-it-to-be), and a [public
access option](#as-public-as-you-want-it-to-be).
- [An open-source platform](#open-source-platform-where-your-data-is-yours),
where your data is yours.
- [A free version, discounted pricing, and full
sponsorships](#free-version-discounted-pricing-and-full-sponsorships-available).
> The core of the Recurse Center is the community, and the core of our online
> community is Zulip… Switching to Zulip has turned out to be one of the best
> decisions we’ve made, and it’s impossible to imagine RC today without it. No
> other tool has a user experience that scales to a community of our size.
>
> — Nick Bergson-Shilcock, founder and CEO, [Recurse
> Center](https://www.recurse.com/); [learn how the Recurse Center uses
> Zulip](/case-studies/recurse-center/)
If you're considering Zulip for [an open-source project](/for/open-source/) or
[research collaboration](/for/research), check out our dedicated guides.
## Encourage all community members to connect, real-time or async
When people are online at the same time, a lightweight real-time chat experience
encourages active participation, and makes interactions feel more personal.
![](/static/images/landing-page/research/interactive_messaging_day_2.png)
But community participants are often online only for a short while each day, or
they drop by every week or two to check on what's happening. A forum-style
experience makes it easier for them to participate async.
<div class="text-image-in-row">
<p class="text-image-in-row-text">
With conversations organized by topic, Zulip combines the best of both worlds.
You get seamless real-time communication, with a chronological feed of messages
in each conversation, typing notifications, presence indicators, status emoji
— everything you might expect from a modern chat experience.
<br/><br/>
At the same time, community members can read one conversation at a time, so
it's easy to circle back to a topic hours later, the next day, or next week.
</p>
<img class="text-image-in-row-image" src="/static/images/landing-page/research/streams_and_topics_day.png" alt="Illustration of channels and topics list in Zulip">
</div>
> When we made the switch to [@zulip](https://twitter.com/zulip) a few months
> ago for chat, never in my wildest dreams did I imagine it was going to become
> the beating heart of the community, and so quickly. It&#39;s a game changer.
> 🧑‍💻🗨️👩‍💻
> — Dan Allen (@mojavelinux), [June 29,
2021](https://twitter.com/mojavelinux/status/1409702273400201217) &nbsp;
## A moderation toolkit that offers everything you need
Zulip's [moderation toolkit](/help/moderating-open-organizations) lets you:
- Skim the [combined message feed](/help/combined-feed) or [browse
conversations](/help/recent-conversations) to find where moderator attention
is needed.
- Keep discussions organized by [moving](/help/move-content-to-another-channel)
conversations, or [splitting](/help/move-content-to-another-topic) them when
they digress.
- Address bad behavior, for example by
[banning](/help/deactivate-or-reactivate-a-user) the offender and
[deleting](/help/delete-a-message) their messages.
- Fight spam in an open community, for example by [prohibiting disposable email
addresses](/help/restrict-account-creation#dont-allow-disposable-domains).
- [Restrict permissions](/help/restrict-permissions-of-new-members) for new
users.
Community members can [mute](/help/mute-a-user) anyone who's bothering them.
### Delegate moderation responsibilities
Permissions in Zulip can be granted to any combination of
[roles](/help/user-roles), [groups](/help/user-groups), and individual
[users](/help/introduction-to-users), so trusted community members can help
moderate. In larger communities, different people can
[administer](/help/configure-who-can-administer-a-channel) different channels.
## Grow your community
### Lots of activity, but no chaos
On Zulip, dozens of discussions can happen in parallel,
without getting in each other's way: Zulip's
[channels](/help/introduction-to-channels) and
[topics](/help/introduction-to-topics) create dedicated spaces for each
conversation.
Participants can ask a question or kick off a new discussion without having to worry
about interrupting.
> Zulip helped the FHIR community grow from a tiny group of dreamers to 500
> active users sending 6000 messages per month, all driving the creation of
> better healthcare standards. Zulip’s topic-based threading helps us manage
> simultaneous discussions with clarity, ensuring the right people can pay
> attention to the right messages. This makes our large-group discussion far
> more manageable than what we’ve experienced with Skype and Slack.
> — Grahame Grieve, founder, FHIR health care standards body
### Occasional participants welcome
Community members often have just a bit of time to participate, and folks
with the deepest expertise might also be the most busy. To stay connected with your
group, they need to quickly discover conversations that are interesting to them
when they drop by.
With traditional chat tools like Discord or WhatsApp, occasional participants
usually skim just the last few messages. If those messages don't spark interest,
they'll bounce for the day, and eventually stop coming by altogether.
Zulip's list of [recent conversations](/help/recent-conversations) offers a
quick overview of what's been happening in your community. It's easy to scan the
list of topics to find which ones you want to dive into.
> I had never engaged with the Changelog podcast community in Slack because I
> always got too overwhelmed with the linear flow of conversations. Topic based
> systems are such a fresh breath of air.
> — [Siddhartha Golu](https://www.siddharthagolu.com/),
> [Changelog](https://changelog.com/podcast) community member
### Many ways to participate
You can use Zulip from the browser, a [desktop app](/apps), and Android and iOS
mobile devices. If you prefer a [Terminal
app](https://github.com/zulip/zulip-terminal#readme) or just want to use it
[from your email](/help/using-zulip-via-email), you can do that too.
Zulip's apps offer lots of ways to customize your experience, including [dark
and light themes](/help/dark-theme), flexible [font size](/help/font-size) and
[line spacing](/help/line-spacing), configurable [notification
options](/help/channel-notifications), and much more. There are convenient
[keyboard shortcuts](/help/keyboard-shortcuts) for all the common actions.
Zulip's UI is translated into over two dozen [languages](/help/change-your-language).
## As public as you want it to be
Your community can require an invitation to join, or you can [allow anyone to
create an
account](/help/restrict-account-creation#set-whether-invitations-are-required-to-join).
You can use:
- [Private channels](/help/channel-permissions#private-channels) for
conversations only some community members should have access to (e.g.,
discussions among organizers).
- [Public channels](/help/channel-permissions#public-channels) for
conversations all community members can see.
- [Web-public channels](/help/channel-permissions#web-public-channels) for
discussions anyone on the internet should be able to read without logging in.
Posting always requires log in.
## Open-source platform, where your data is yours
Zulip is [100% open-source software](https://github.com/zulip), so you always
know what you're running. There are no ads, and we [don't sell your
data](https://zulip.com/policies/privacy#how-we-share-your-personal-data), or
[feed it to AI
models](https://blog.zulip.com/2024/05/23/self-hosting-keeps-your-private-data-out-of-ai-models/).
If you're looking for a simple, reliable SaaS solution, it only takes
a minute to [sign up for Zulip Cloud](https://zulip.com/new/). It's
professionally operated and is always up to date with the latest
features.
For full control over your data, follow our simple [installation
instructions](https://zulip.readthedocs.io/en/stable/production/install.html) to
host Zulip yourself. If you like, you can develop [custom
integrations](https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html)
and [features](https://zulip.readthedocs.io/en/stable/production/modify.html). If
your needs change, you can always move [from self-hosting to Zulip
Cloud](/help/move-to-zulip-cloud) or [the other
way](https://zulip.readthedocs.io/en/stable/production/export-and-import.html#import-into-a-new-zulip-server).
> We just moved the Lichess team (~100 persons) to <a
> href="https://twitter.com/zulip">@zulip</a>, and I&#39;m loving it. The topics
> in particular make it vastly superior to slack &amp; discord, when it comes to
> dealing with many conversations. Zulip is also open-source!
> — <a href="https://twitter.com/ornicar">Thibault D (@ornicar)</a>
## Free version, discounted pricing, and full sponsorships available
We sponsor over 1,500 organizations, and most non-business uses of Zulip are
eligible for discounted pricing or full sponsorship.
- **Zulip Cloud:** Many communities that are working towards the public good are
eligible for a fully sponsored [Zulip Cloud Standard plan](/plans/#cloud).
Other community groups pay a highly discounted rate, or use [Zulip Cloud
Free](/plans/#cloud). [Learn
more.](/help/zulip-cloud-billing#free-and-discounted-zulip-cloud-standard)
- **Self-hosting**: Communities and personal organizations (clubs,
groups of friends, volunteer groups, etc.) are eligible for our
[Community plan](/help/self-hosted-billing#free-community-plan) for
self-hosted organizations.
## Other apps you might consider
We’ve talked to hundreds of people about their experiences with
community chat. Here are some reasons why folks choose Zulip over
other apps you might consider for hosting your community.
> Zulip makes all my Slack and Discord communities feel tedious by comparison.
>
> — AJ Kerrigan, [Changelog](https://changelog.com/podcast) community member
### Group chat apps (WhatsApp, Telegram, Signal, Messenger, etc.)
Group chat apps can be convenient for small or low-activity groups,
but managing an active community quickly becomes unwieldy. Having more
than one conversation at a time in a single group chat feels chaotic,
and membership management is a big pain if you try to solve that by
using several group chats.
### Discord
In Discord, only the latest messages are easy to read and reply
to. Many less frequent participants will miss much of what's
happening in an active community.
You're also subjecting community members to intrusive in-app
advertising, even if they purchase Discord's paid plans.
### Slack
Like Discord, Slack doesn't work well for less frequent participants in an
active community. Additionally, on Slack's free plan, messages are hidden after
90 days, and are permanently deleted after a year. Slack's paid plans are
generally unaffordable for community use.
### Facebook
On Facebook, your relationship with your community is mediated by
algorithms: even replies to a user's own post are by default resorted
and partially hidden from them. From Meta's perspective, advertisers
are the customers, and your attention is the product being sold.
> I highly recommend Zulip to other communities… Slack is a no-go for many due
> to not being FLOSS, and I’m concerned about vendor lock-in if they were to
> stop being so generous. Slack’s threading model is much worse than Zulip’s
> IMO. The channels/topics flow is an incredibly intuitive way to keep track of
> everything that is going on.
>
> — RJ Ryan, Mixxx Developer

View File

@@ -0,0 +1,405 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for education" %}
{% set PAGE_DESCRIPTION = "Make Zulip the communication hub for your class.
Online, in-person, and anything in between. Free for most classes!" %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Teach a course with Zulip.</h1>
<p>Online, in-person, and anything in between. <br/><a href="#feature-pricing">Free</a> for most classes!</p>
</div>
<div class="hero-text">
Learn how <a href="/case-studies/tum/">Technical University of Munich</a>,
<br /><a href="/case-studies/ucsd/">University of California San Diego</a>,
<br />and <a href="/case-studies/recurse-center/">Recurse Center</a> are using Zulip.
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="#feature-pricing" class="button">
{{ _('Education pricing') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="feature-intro">
<h1 class="center"> Make Zulip the communication hub for your class. </h1>
<p>
Zulip is the <a href="/why-zulip/">organized team chat</a> app that is ideal for both live and asynchronous conversations. Post lecture notes and announcements, answer students’ questions, and coordinate with teaching staff all in one place.
</p>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Use topics to organize the discussion
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/introduction-to-topics">Zulip topics</a> create a separate space for each discussion.
</div>
</li>
<li><div class="list-content"> Questions and answers are easy to find, so each question is only asked once.</div></li>
<li><div class="list-content">Refer to relevant points by <a href="/help/link-to-a-message-or-conversation">linking to a message or a topic.</a></div></li>
<li><div class="list-content">Keep discussions orderly by <a href="/help/rename-a-topic">moving</a> or <a href="/help/move-content-to-another-topic">splitting</a> topics when conversations digress.</div></li>
<li><div><a href="/help/resolve-a-topic">Mark the topic ✓ resolved</a> when done!</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Zulip has the best user experience of all the chat apps I’ve tried. With the discussion organized by topic within each channel, Zulip is the only app that makes hundreds of conversations manageable.
</blockquote>
<div class="author">
&mdash; <a href="https://ciip.in.tum.de/people/lasser.html">Tobias Lasser</a>, lecturer at the Technical University of Munich Department of Informatics
</div>
</div>
<a class="case-study-link" href="/case-studies/tum/" target="_blank">Learn more about how TUM uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image topics-image">
<img alt="" src="{{ static('images/landing-page/education/streams_and_topics_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/message_formatting_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/message_formatting_day_2.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Powerful formatting
</h1>
<ul>
<li><div class="list-content"><a href="/help/format-your-message-using-markdown#latex">Type LaTeX</a> directly into your Zulip message, and see it beautifully rendered.</div></li>
<li><div class="list-content">Structure your points with bulleted and numbered <a href="/help/format-your-message-using-markdown#lists">lists</a>.</div></li>
<li><div class="list-content"><a href="/help/code-blocks">Zulip code blocks</a> come with syntax highlighting for over 250 languages, and integrated <a href="/help/code-blocks#code-playgrounds">code playgrounds.</a></div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
[Zulip] is far more efficient than using the communication tools in Canvas, and the mobile app is great… Plus there is fantastic support for Markdown, code blocks, images and videos, etc.
</blockquote>
<div class="author">
&mdash; <a href="https://www.capterra.com/p/197945/Zulip/#Capterra___6617015">Ryan S., Associate Professor</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/message_formatting_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/message_formatting_day_2.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Interactive messaging
</h1>
<ul>
<li>
<div class="list-content">
Use <a href="/help/emoji-reactions">emoji
reactions</a> for lightweight
interactions. Have fun
with <a href="/help/custom-emoji">custom
emoji</a> and gather feedback
with <a href="/help/create-a-poll">polls</a>.
</div>
</li>
<li><div class="list-content">Hide answers behind <a href="/help/format-your-message-using-markdown#spoilers">spoilers</a>, letting students think before they read.</div></li>
<li><div class="list-content">Share lecture notes and reading materials with <a href="/help/share-and-upload-files">drag-and-drop file uploads</a>.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Participants across six continents signed up for my graduate-level classes when I decided to open them up to the world during the pandemic. Zulip became a central hub for asynchronous Q&A and posting Zoom links for lectures, whiteboard PDFs, and announcements. Zulip’s topics, and the ability to change the topic of someone else's message, has made it much easier for me to keep things coherent. It’s super easy to discuss technical material using the TeX integration, and spoilers are a great way to answer questions about homework without depriving students of a chance to keep thinking about the problem on their own.
</blockquote>
<div class="author">
&mdash; <a href="https://kskedlaya.org/">Kiran S. Kedlaya</a>, Professor of Mathematics at University of California San Diego
</div>
</div>
<a class="case-study-link" href="/case-studies/ucsd/" target="_blank">Learn more about how UCSD uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half">
<div class="message-screenshot message-starred">
<img alt="" src="{{ static('images/landing-page/education/interactive_messaging_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/interactive_messaging_day_2.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/education/interactive_messaging_day_3.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Flexible administration and moderation
</h1>
<ul>
<li><div class="list-content">Zulip offers dozens of features for <a href="/help/moderating-open-organizations">moderating discussions.</a></div></li>
<li>
<div class="list-content">Assign permissions to course staff with <a
href="/help/manage-permissions">fine-grained settings</a> for <a
href="/help/user-roles">user roles</a>, <a
href="/help/user-groups">user groups</a> (like TAs), and <a
href="/help/introduction-to-users">individual
users</a>.
</div>
</li>
<li><div class="list-content">Make an announcement channel where only course staff <a href="/help/channel-posting-policy">can post messages</a>.</div></li>
<li><div class="list-content">Quickly add staff and students to the right channels. Automatically subscribe users <a href="/help/set-default-channels-for-new-users">when they join</a>, subscribe a <a href="/help/user-groups">group of users</a>, or copy membership from another channel.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
I think Zulip is a great tool, much better than Slack… We can find messages from five years ago — it’s very convenient.
</blockquote>
<div class="author">
&mdash; Miguel Pagano, professor at the National University of Córdoba
</div>
</div>
<a class="case-study-link" href="/case-studies/university-of-cordoba/" target="_blank">Learn more about how the National University of Córdoba uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Maintain student privacy
</h1>
<ul>
<li>
<div class="list-content">
Zulip Cloud is built with <a href="/policies/privacy">privacy</a> and <a href="/security/">security</a> in mind. We will never sell data or ads.
</div>
</li>
<li><div class="list-content">Zulip is <a href="https://github.com/zulip">100% open source</a>. We work hard to make it <a href="https://zulip.readthedocs.io/en/latest/production/install.html">easy to set up</a> and run a self-hosted Zulip installation, where you have full control of the data.</div></li>
<li><div class="list-content">Email addresses <a href="/help/configure-email-visibility">can be hidden</a>, and students <a href="/help/status-and-availability#disable-updating-availability">don’t have to share</a> when they are online.</div></li>
<li><div class="list-content">Students can <a href="/help/mute-a-user">mute</a> anyone they'd rather not interact with.</div></li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/privacy.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Never miss a beat
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/apps/">apps for every platform</a>, you can check Zulip at your computer or on your phone.
</div>
</li>
<li>
<div class="list-content">
Zulip alerts you about timely messages with
<a href="/help/channel-notifications">fully customizable</a> mobile, email and desktop notifications.
</div>
</li>
<li>
<div class="list-content">Mention <a href="/help/mention-a-user-or-group">users</a>, <a href="/help/user-groups">groups of users</a> or <a href="/help/dm-mention-alert-notifications#wildcard-mentions">everyone</a> when you need their attention.</div>
</li>
<li>
<div class="list-content">Use Zulip in your language of choice, with translations into <a href="https://hosted.weblate.org/projects/zulip/">23 languages</a>.</div>
</li>
<li>
<div class="list-content">Zulip works reliably for organizations with thousands of users online at once.</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
We are a public university that offers free education to
33,000 students across 13 cities in Brazil. We started
using Zulip in early 2020, and it works perfectly for
our needs. Zulip’s interface is simple and intuitive.
</blockquote>
<div class="author">
&mdash; Rafael Cordeiro, head of IT at <a href="https://www.utfpr.edu.br/">UTFPR</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-end education-feature-end">
<div class="feature-pricing" id="feature-pricing">
<h1 class="for-education-plans-heading"> Zulip Cloud for Education plans </h1>
<div class="for-education-pricing-model">
<div class="padded-content">
<div class="pricing-container">
<div class="price-box" id="for-education-free-price-box" tabindex="-1">
<div class="text-content">
<h2>Free</h2>
<div class="description">
Recommended for a typical class.
</div>
<hr />
<ul class="feature-list">
<li>All features on this page</li>
<li>10,000 messages of search history</li>
<li>File storage up to 5 GB total</li>
<li><a href="/features/">Complete</a> team chat solution</li>
<li><a href="/integrations/">Hundreds of integrations</a></li>
<li>Advanced <a href="/help/user-roles">roles</a> and <a href="/help/manage-permissions">permissions</a></li>
<li><a href="/help/guest-users">Guest</a> accounts</li>
</ul>
</div>
<div class="bottom">
<div class="text-content free-text">
<div class="pricing-details">
Free
</div>
<a href="/new/" class="button green">
Create organization
</a>
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Standard for Education</h2>
<div class="description">
For large classes and departments.
</div>
<hr />
<ul class="feature-list">
<li>Unlimited search history</li>
<li>File storage up to 5 GB per user</li>
<li><a href="/help/message-retention-policy">Message retention policies</a></li>
<li>Brand Zulip with your logo</li>
<li>Priority commercial support</li>
<li><a href="/help/public-access-option">Public access option</a></li>
<li>Additional legal agreements</li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
<p>Education (for-profit)</p>
<div class="price">1</div>
<div class="details">
<span class="pricing-period">per user per month</span>
<br />
with annual billing discount
<br />
$1.20/month billed monthly
</div>
</div>
<div class="standard-price-box">
<p>Education (non-profit)</p>
<div class="price">0<span class="price-cents">.67</span></div>
<div class="details">
<span class="pricing-period">per user per month</span>
<br />
with annual billing discount
<br />
$0.80/month billed monthly
</div>
</div>
<a href="/accounts/go/?next=/sponsorship/" class="button green standard-register-button">
Request education pricing
</a>
</div>
</div>
</div>
</div>
</div>
</div>
<p class="price-asterisk hero-fine-print">
<a href="/help/zulip-cloud-billing#education-pricing">Learn
more</a> about education pricing, or contact <a
href="mailto:sales@zulip.com">sales@zulip.com</a> with any
questions.
</p>
</div>
<p class="hero-fine-print">
Learn about using Zulip
for <a href="/for/events/">conferences</a> and
<a href="/for/research/">research communities</a>. If you have any
questions or feedback, please contact us
at <a href="mailto:sales@zulip.com">sales@zulip.com</a>. You
can also drop by
our <a href="/development-community/">friendly development
community at chat.zulip.org</a> to ask for help or suggest
improvements!
</p>
{% include "corporate/compare-education.html" %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,313 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for events and conferences" %}
{% set PAGE_DESCRIPTION = "Make Zulip the communication hub for your
conference, workshop, hackathon, or other event. In-person, online, and anything
in between." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-events">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Zulip for conferences and events</h1>
<p>Conferences, workshops, hackathons. In-person, online, and anything in between.
<br/><a href="/plans/">Zulip Cloud Standard</a> is free for
academic conferences and most other non-profit events!
</p>
</div>
<div class="hero-text">
Learn how the <a href="/case-studies/recurse-center/">Recurse Center</a> is using Zulip.
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="feature-intro">
<h1 class="center"> Make Zulip the communication hub for your event. </h1>
<p>
Zulip is the <a href="/why-zulip/">organized team chat</a> app that is ideal for both live and asynchronous conversations. Post presentations and announcements, host Q&A sessions, and coordinate among organizers.
</p>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Use topics to organize the discussion
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/introduction-to-topics">Zulip
topics</a> create a separate space for
each discussion or question.
</div>
</li>
<li>
<div class="list-content">
Make your event more inclusive by lowering the barriers
for participants to ask questions, share ideas, and learn from experts.
</div>
</li>
<li>
<div class="list-content">
Take time to think. Discussions work great
in real time or async, and conversations
evolve into collaborations.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Discussions at conferences often happen in small groups — most
people are not able to participate because they are not present,
or are too intimidated to join. In the conferences we organized
with Zulip, questions or ideas were spread openly. Anybody could
get a chance to contribute, and to benefit from new ideas and
opportunities for collaboration.
<br/> <br/>
Zulip turned out to be a great asset that we plan to keep even
when we go back to face-to-face events.
</blockquote>
<div class="author">
&mdash; <a href="https://perso.univ-rennes1.fr/christophe.ritzenthaler/">Christophe Ritzenthaler</a>, <cite>Executive Director of <a href="https://www.cimpa.info/">CIMPA</a>
and Professor at Rennes 1 University</cite>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image topics-image">
<img alt="" src="{{ static('images/landing-page/events/streams_and_topics_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot message-starred">
<img alt="" src="{{ static('images/landing-page/events/your_communication_hub_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/events/your_communication_hub_day_2.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Your communication hub
</h1>
<ul>
<li>
<div class="list-content">
Share the agenda and presentations with
<a href="/help/share-and-upload-files">drag-and-drop file uploads</a>.
</div>
</li>
<li>
<div class="list-content">Use <a href="/help/emoji-reactions">emoji reactions</a> for lightweight interactions. Have fun with <a href="/help/custom-emoji">custom emoji</a>, or get feedback with a <a href="/help/create-a-poll">poll</a>.</div>
</li>
<li>
<div class="list-content">Announce the schedule without worrying about time zones using <a href="/help/format-your-message-using-markdown#global-times">global times</a>.</div>
</li>
<li>
<div class="list-content">Make a <a href="/help/start-a-call">video call</a> with the click of a button.</div>
</li>
<li>
<div class="list-content">Use Zulip in your language of choice, with translations into <a href="https://hosted.weblate.org/projects/zulip/">23 languages</a>.</div>
</li>
</ul>
</div>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The fact that the chat serves as a repository of the scientific /
academic exchanges is a big unanticipated bonus. Participants tend
to log in after the event, sometimes repeatedly, to consult the
messages and get in touch with others.
</blockquote>
<div class="author">
&mdash; Marianne Mandl, <a href="https://conference-service.com/">COMS | Conference Management Software</a>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot message-starred">
<img alt="" src="{{ static('images/landing-page/events/your_communication_hub_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/events/your_communication_hub_day_2.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Lasting knowledge repository
</h1>
<ul>
<li>
<div class="list-content">
Make the Q&amp;A a permanent resource for participants.
</div>
</li>
<li>
<div class="list-content">
<a href="/help/link-to-a-message-or-conversation#link-to-zulip-from-anywhere">Permanently link</a>
to a Zulip conversation or a message in context
from emails, talk slides, or on the website
for your event.
</div>
</li>
<li><div class="list-content">Information is at your fingertips with Zulip’s <a href="/help/search-for-messages">powerful full-text search</a>.</div></li>
<li><div class="list-content"><a href="https://github.com/zulip/zulip-archive">Publish</a> discussions on the web, or move your data with our high quality <a href="/help/export-your-organization">export</a> and <a href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a> tools.</div></li>
<li><div class="list-content">Zulip is <a href="https://github.com/zulip">100% free and open-source software</a>, so you are never locked into a proprietary tool.</div></li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/events/message_formatting_day.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Powerful formatting
</h1>
<ul>
<li><div class="list-content"><a href="/help/format-your-message-using-markdown#latex">Type LaTeX</a> directly into your Zulip message, and see it beautifully rendered.</div></li>
<li><div class="list-content"><a href="/help/code-blocks">Zulip code blocks</a> come with syntax highlighting for over 250 languages, and integrated <a href="/help/code-blocks#code-playgrounds">code playgrounds.</a></div></li>
<li><div class="list-content">Structure your ideas with bulleted and numbered <a href="/help/format-your-message-using-markdown#lists">lists</a>.</div></li>
<li><div class="list-content">If you made a mistake, no worries! You can <a href="/help/edit-a-message">edit your message</a>, or move it to a different <a href="/help/move-content-to-another-topic">topic</a> or <a href="/help/move-content-to-another-channel">channel</a>.</div></li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/events/message_formatting_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Set everything up ahead of time
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/help/invite-new-users">multi-use invite links</a>, there’s no need to create individual Zulip invitations.
</div>
</li>
<li><div class="list-content">Signing up for Zulip is quick and easy. Participants can make an account, or <a href="/help/logging-in">log in</a> with Google, Apple, etc.</div></li>
<li><div class="list-content">Automatically subscribe members to channels <a href="/help/set-default-channels-for-new-users">when they join</a>, subscribe a <a href="/help/user-groups">group of users</a>, or copy membership from another channel.</div></li>
<li><div class="list-content">Make an announcement channel where only organizers <a href="/help/channel-posting-policy">can post messages</a>. Use <a href="/help/channel-permissions#private-channels">private channels</a> to plan the event.</div></li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Never miss a beat
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/apps/">apps for every
platform</a>, check Zulip at your computer or on your
phone. Zulip works great in a browser, so no download is
required.
</div>
</li>
<li><div class="list-content">Zulip alerts participants about timely messages with <a href="/help/channel-notifications">fully customizable</a> mobile, email and desktop notifications.</div></li>
<li><div class="list-content">Mention <a href="/help/mention-a-user-or-group">users</a>, <a href="/help/user-groups">groups of users</a> or <a href="/help/dm-mention-alert-notifications#wildcard-mentions">everyone</a> when you need their attention.</div></li>
<li>
<div class="list-content">
Zulip works reliably for organizations
with thousands of users online at once.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-end">
<div class="bottom-register-buttons">
<h1>
<a href="/plans/">Zulip Cloud Standard</a> is free for academic conferences and
most other non-profit events!
</h1>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<p>
Learn about using Zulip for <a href="/for/education/">teaching</a>
and <a href="/for/research/">research communities</a>. If you have any
questions, please contact us
at <a href="mailto:sales@zulip.com">sales@zulip.com</a>. You can also drop by
our <a href="/development-community/">friendly development community at
chat.zulip.org</a> to ask for help or suggest improvements!
</p>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,755 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for open-source projects" %}
{% set PAGE_DESCRIPTION = "Grow your community with thoughtful and inclusive
discussion, using the organized team chat app that is ideal for both live
and asynchronous conversations." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Zulip for open source projects</h1>
<p>
Grow your community with thoughtful and inclusive discussion.
<br/><a href="/plans/">Zulip Cloud Standard</a> is free for open-source
projects!
</p>
</div>
<div class="hero-text">
Learn how the <a href="/case-studies/rust/">Rust language</a>,
<a href="/case-studies/lean/">Lean theorem prover</a>,
<a href="/case-studies/asciidoctor/">Asciidoctor</a>, <a
href="/case-studies/rush-stack/">Rush&nbsp;Stack</a>, and&nbsp; <a
href="/case-studies/mixxx/">Mixxx</a> communities are
using Zulip.
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="feature-intro">
<h1 class="center"> Make Zulip the communication hub for your open-source community. </h1>
<p>
Zulip is the <a href="/why-zulip/">organized team chat</a> app that is ideal for both
live and asynchronous conversations. Discuss issues, pull requests
and feature ideas, engage with users, answer questions, and
onboard new contributors.
</p>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Rust development would not be moving at the pace that it has been without Zulip.
</blockquote>
<div class="author">
&mdash; <a href="https://www.rust-lang.org/governance/teams/lang">Rust Language team</a>
co-lead <a href="https://joshtriplett.org/">Josh Triplett</a>
</div>
</div>
<a class="case-study-link" href="/case-studies/rust/"
target="_blank">How the Rust language community uses Zulip ↗</a>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Use topics to organize the discussion
</h1>
<ul>
<li>
<div class="list-content">
Like email threads,
<a href="/help/introduction-to-topics">Zulip topics</a>
create a separate space for each discussion, so
different conversations will never get in each
other’s way.
</div>
</li>
<li>
<div class="list-content">
Find active conversations, or see what happened while you were away,
with the <a href="/help/recent-conversations">Recent conversations</a>
view. Read the topics you care about, and skip the rest.
</div>
</li>
<li>
<div class="list-content">
Keep discussions orderly
by <a href="/help/rename-a-topic">moving</a>
or <a href="/help/move-content-to-another-topic">splitting</a>
topics when conversations digress.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
We just moved the Lichess team (~100 persons) to <a href="https://twitter.com/zulip">@zulip</a>, and I&#39;m loving it. The topics in particular make it vastly superior to slack &amp; discord, when it comes to dealing with many conversations.<br />Zulip is also open-source!
</blockquote>
<div class="author">
— <a href="https://twitter.com/ornicar">Thibault D (@ornicar)</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image topics-image">
<img alt="" src="{{ static('images/landing-page/open_source/streams_and_topics_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Lasting knowledge repository
</h1>
<ul>
<li>
<div class="list-content">
Maintain access to your organization's entire
message history with free <a href="/plans/">Zulip
Cloud Standard</a> hosting. Information is at your
fingertips with Zulip's <a
href="/help/search-for-messages">powerful full-text
search</a>.
</div>
</li>
<li>
<div class="list-content">
<a href="/help/link-to-a-message-or-conversation#link-to-zulip-from-anywhere">Permanently link</a>
to a Zulip conversation or a message in context
from your issue tracker, forum, or anywhere else.
</div>
</li>
<li>
<div class="list-content">
With the <a href="/help/public-access-option">public
access option</a>, anyone can view, browse, and
search your organization's public content — no
account required.
</div>
</li>
<li>
<div class="list-content">
Conversations are organized by topic, so you can
review old discussions to understand past work,
explanations, and decisions.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The core of the Recurse Center is the community, and the
core of our online community is Zulip… Switching to
Zulip has turned out to be one of the best decisions
we’ve made, and it’s impossible to imagine RC today
without it. No other tool has a user experience that
scales to a community of our size.
</blockquote>
<div class="author">&mdash; Nick Bergson-Shilcock, founder and CEO,
<a href="https://www.recurse.com/">Recurse Center</a></div>
</div>
<a class="case-study-link" href="/case-studies/recurse-center/"
target="_blank">How the Recurse Center
community uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Build inclusive communities
</h1>
<ul>
<li>
<div class="list-content">
Conversations in Zulip can
continue for hours or days, enabling effective
discussions between community members around the
world.
</div>
</li>
<li>
<div class="list-content">
Core contributors can answer a question when they
have a few minutes, without digging through dozens
of messages.
</div>
</li>
<li>
<div class="list-content">
Part-time participants <a href="/help/finding-a-conversation-to-read">
quickly zero in</a> on the conversations they care
about. This is not possible with other chat tools
like Slack or Discord.
</div>
</li>
<li>
<div class="list-content">
Topics provide a safe space to ask a question without
interrupting other conversations.
</div>
</li>
<li>
<div class="list-content">
Zulip offers dozens of features
for <a href="/help/moderating-open-organizations">
moderating discussions</a>. Members can
also <a href="/help/mute-a-user">mute</a> anyone
they'd rather not interact with.
</div>
</li>
<li>
<div class="list-content">
Check out <a href="/for/communities/">Zulip for
communities</a>
to learn more about how Zulip facilitates
contributor engagement and inclusion.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
When we made the switch to <a href="https://twitter.com/zulip">@zulip</a> a few months ago for chat, never in my wildest dreams did I imagine it was going to become the beating heart of the community, and so quickly. It&#39;s a game changer. 🧑‍💻🗨️👩‍💻
</blockquote>
<div class="author">
&mdash; Dan Allen (@mojavelinux), <a href="https://twitter.com/mojavelinux/status/1409702273400201217">June 29, 2021</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/open_source/build_inclusive_communities.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/software-engineer.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Open ecosystem
</h1>
<ul>
<li>
<div class="list-content">
Zulip is <a href="https://github.com/zulip">100%
open-source software</a>, with no "open core"
catch. We work hard to make it <a href="https://zulip.readthedocs.io/en/latest/production/install.html">easy to set up</a>,
<a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups">backup</a>,
and <a href="https://zulip.readthedocs.io/en/stable/production/upgrade.html">maintain</a>
a self-hosted Zulip installation, where you
have full control of your data.
</div>
</li>
<li>
<div class="list-content">
Our high quality <a href="/help/export-your-organization">export</a>
and <a href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a>
tools ensure that you can always move from
<a href="/plans/">Zulip Cloud</a> hosting to your
own servers. There is no lock-in.
</div>
</li>
<li>
<div class="list-content">
Zulip's <a href="https://chat.zulip.org/api/rest">open API</a>
is shared by the official web/desktop, mobile, and terminal
clients, with a <a href="https://chat.zulip.org/api/changelog">complete
API changelog</a> and
<a href="https://zulip.readthedocs.io/en/latest/overview/release-lifecycle.html#compatibility-and-upgrading">
backwards-compatibility policy</a> designed to support
developers of third-party clients.
</div>
</li>
<li>
<div class="list-content">
Zulip supports mirroring channels with
<a href="/integrations/irc">IRC</a>,
<a href="/integrations/slack">Slack</a>, and
<a href="/integrations/matrix">Matrix</a>, and
you can connect to other modern chat protocols using
<a href="https://github.com/42wim/matterbridge">Matterbridge</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The Lean community switched from Gitter to Zulip in early 2018,
and never looked back. Zulip’s model of conversations labeled with topics has been
essential for organising research work and simultaneously
onboarding newcomers as our community scaled. My experience with
both the app and the website is extremely positive!
</blockquote>
<div class="author">
&mdash; <a href="https://www.imperial.ac.uk/people/k.buzzard">Kevin Buzzard</a>, Professor of Pure Mathematics at <a href="https://www.imperial.ac.uk/">Imperial College London</a>
</div>
</div>
<a class="case-study-link" href="/case-studies/lean/"
target="_blank">How the Lean prover
community uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/software-engineer.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Powerful formatting
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/code-blocks">Zulip code blocks</a> come with
syntax highlighting for over 250 languages, ability to
<a href="/help/code-blocks#default-code-block-language">set a default language</a>,
and integrated <a href="/help/code-blocks#code-playgrounds">code playgrounds.</a>
</div>
</li>
<li>
<div class="list-content">
<a href="/help/format-your-message-using-markdown#latex">Type LaTeX</a>
directly into your Zulip message, and see it beautifully rendered.
</div>
</li>
<li>
<div class="list-content">
Enjoy inline image, video and website previews.
</div>
</li>
<li>
<div class="list-content">
If you made a mistake, no worries! You
can <a href="/help/edit-a-message">edit your
message</a>, or move it to a
different <a href="/help/move-content-to-another-topic">topic</a>
or <a href="/help/move-content-to-another-channel">channel</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
At rust-lang, at Ferrous Systems, and now at Near,
Zulip is absolutely invaluable for making technical
discussion work!
</blockquote>
<div class="author">
&mdash; <a href="https://github.com/matklad/">Aleksey Kladov</a>,
Senior software engineer, NEAR Protocol
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-top.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-bottom.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Interactive messaging
</h1>
<ul>
<li>
<div class="list-content">
Start a <a href="/help/start-a-call">video
call</a> with the click of a button, or
plan events without worrying
about time zones
using
<a
href="/help/format-your-message-using-markdown#global-times">global times</a>.
</div>
</li>
<li>
<div class="list-content">
Use <a href="/help/emoji-reactions">emoji
reactions</a> for lightweight
interactions. Have fun
with <a href="/help/custom-emoji">custom
emoji</a> and gather feedback
with <a href="/help/create-a-poll">polls</a>.
</div>
</li>
<li>
<div class="list-content">
Share files or images with <a href="/help/share-and-upload-files">drag-and-drop
uploads</a>.
</div>
</li>
<li>
<div class="list-content">
Enjoy animated GIFs with Zulip's <a href="/help/animated-gifs">native integration</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Wikimedia uses Zulip for its participation in open
source mentoring programs. Zulip’s threaded discussions
help busy organization administrators and mentors stay
in close communication with students during all phases
of the programs.
</blockquote>
<div class="author">
&mdash; Srishti Sethi, Developer Advocate, <a href="https://wikimediafoundation.org/">Wikimedia Foundation</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/companies/message-formatting-bottom.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Effective workflows with integrations
</h1>
<ul>
<li>
<div class="list-content">
Use topics to manage support workflows, answer
questions, and collaborate to investigate issues.
<a href="/help/resolve-a-topic">Mark the topic ✓
resolved</a> when done!
</div>
</li>
<li>
<div class="list-content">
<a href="/help/add-a-custom-linkifier">Customize
Zulip’s markup with linkifiers</a>, so that
“TRAC-1234” and “#1234” automatically
link to issues or tickets in the tools you use.
</div>
</li>
<li>
<div class="list-content">
Native integrations for GitHub, Jira, Twitter, Sentry
and <a href="/integrations/">hundreds of
other tools</a> can initiate new topics,
creating lightweight discussion spaces for
each issue.
</div>
</li>
<li>
<div class="list-content">
Bots can also use a dedicated topic to avoid
crowding out conversations.
</div>
</li>
<li>
<div class="list-content">
Connect to thousands of tools
using <a href="https://zapier.com/apps/zulip/integrations">Zapier</a>.
Integrations written for Slack can post
into Zulip via
the <a href="/integrations/slack_incoming">Slack
compatible webhook</a>.
</div>
</li>
<li>
<div class="list-content">
Build your own integrations with Zulip’s
easy-to-use <a href="/api/">RESTful
API</a>, <a href="/api/installation-instructions">client
bindings</a>, <a href="https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html">incoming
webhooks</a>, <a href="/help/outgoing-webhooks">outgoing
webhooks</a>
and <a href="/help/running-bots">interactive
bot framework</a>.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/companies/integrations_with_border.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Flexible administration and moderation
</h1>
<ul>
<li>
<div class="list-content">
Invite new members with <a href="/help/invite-new-users">multi-use invite links</a>,
or make your community open for anyone to
<a href="/help/restrict-account-creation#set-whether-invitations-are-required-to-join">join without an invitation</a>.
</div>
</li>
<li>
<div class="list-content">
Allow (or require) users to authenticate with
<a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html">
single sign-on options</a> like
<a href="/help/configure-authentication-methods">GitHub or GitLab</a>,
instead of with a username and password.
</div>
</li>
<li>
<div class="list-content">
Automatically subscribe members to
channels <a href="/help/set-default-channels-for-new-users">when
they join.</a>
</div>
</li>
<li>
<div class="list-content">
Manage your community with <a
href="/help/manage-permissions">fine-grained
permission settings</a> you can assign to <a
href="/help/user-roles">user roles</a>,
<a href="/help/user-groups">user groups</a>, and <a
href="/help/introduction-to-users">individual users</a>.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
When and how you want it
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/apps/">apps for every
platform</a>, you can check Zulip at your computer or on your
phone. Zulip works great in a browser, so no download is
required.
</div>
</li>
<li><div class="list-content">Zulip alerts you about timely messages with <a href="/help/channel-notifications">fully customizable</a> mobile, email and desktop notifications.</div></li>
<li>
<div class="list-content">
Mention <a href="/help/mention-a-user-or-group">users</a>, <a href="/help/user-groups">groups
of users</a>
or <a href="/help/dm-mention-alert-notifications#wildcard-mentions">everyone</a>
when you need their attention.
</div>
</li>
<li>
<div class="list-content">
Use Zulip in your language of choice, with translations into
<a href="https://hosted.weblate.org/projects/zulip/">23 languages</a>.
</div>
</li>
<li>
<div class="list-content">
Zulip is built for scale and works reliably for open organizations
with 10,000s of users, with
<a href="https://zulip.readthedocs.io/en/stable/production/requirements.html#scalability">
modest hardware</a>.
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The Zulip threading model is <i>fantastic</i> and
<i>game-changing</i>, and you are doing your community a
disservice if you choose Slack or Discord over Zulip.
</blockquote>
<div class="author">
&mdash; <a href="https://github.com/jni">Juan
Nunez-Iglesias</a>, <a href="https://napari.org/">napari
project</a> co-founder and
<a href="https://scikit-image.org/">scikit-image</a>
core developer
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Make the move today
</h1>
<ul>
<li>
<div class="list-content">
The Zulip core developers have decades of combined
experience leading and growing open source
communities, and we love helping other communities
reach their potential.
</div>
</li>
<li>
<div class="list-content">
Getting started or moving
from another platform is easy! Import your existing
organization from <a href="/help/import-from-slack">
Slack</a>, <a href="/help/import-from-mattermost">
Mattermost</a>, or <a href="/help/import-from-rocketchat">
Rocket.Chat</a>.
</div>
</li>
<li>
<div class="list-content">
See how <a href="/communities/">other open
communities</a> are using Zulip, and learn about <a
href="/help/moderating-open-organizations">best
practices</a> for moderating an open Zulip
organization.
</div>
</li>
<li>
<div class="list-content">
If you have any questions,
please contact us at <a href="mailto:sales@zulip.com">
sales@zulip.com</a>. You can also drop by our
<a href="/development-community/">friendly development
community at chat.zulip.org</a> to ask for help or
suggest improvements!
</div>
</li>
</ul>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The Zulip threading model is <i>fantastic</i> and
<i>game-changing</i>, and you are doing your community a
disservice if you choose Slack or Discord over Zulip.
</blockquote>
<div class="author">
&mdash; <a href="https://github.com/jni">Juan
Nunez-Iglesias</a>, <a href="https://napari.org/">napari
project</a> co-founder and
<a href="https://scikit-image.org/">scikit-image</a>
core developer
</div>
</div>
</div>
</div>
</div>
</div>
<div class="bottom-register-buttons extra_margin_before_footer">
<h1>
<a href="/plans/">Zulip Cloud Standard</a> is free for open-source projects!
</h1>
<p class="call-to-action-subhead">Join the hundreds of open-source projects we sponsor.</p>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,477 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Zulip for researchers and academics" %}
{% set PAGE_DESCRIPTION = "Make Zulip the communication hub for your research
group, department or scientific field. Organized team chat ideal for both
live and asynchronous conversations." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-education">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Zulip for research</h1>
<p>
Chat for your project, research group, department or scientific
field. <br/><a href="/plans/">Zulip Cloud Standard</a> is free for academic
research!
</p>
</div>
<div class="hero-text">
Learn how the <a href="/case-studies/lean/">Lean theorem prover
community</a> is using Zulip.
</div>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="feature-intro">
<h1 class="center"> Make Zulip the communication hub for your research community. </h1>
<p>
Zulip is the <a href="/why-zulip/">organized team chat</a> app that is ideal for both live and asynchronous conversations. Coordinate with collaborators, post questions and ideas, and learn from others in your field.
</p>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Use topics to organize the discussion
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/introduction-to-topics">Zulip
topics</a> create a separate space for each
discussion.
</div>
</li>
<li>
<div class="list-content">
Find active conversations, or see what happened while you were away,
with the <a href="/help/recent-conversations">Recent conversations</a> view.
</div>
</li>
<li>
<div class="list-content">
Keep discussions orderly
by <a href="/help/rename-a-topic">moving</a>
or <a href="/help/move-content-to-another-topic">splitting</a>
topics when conversations digress.
</div>
</li>
<li>
<div class="list-content">
Check out <a href="/for/communities/">Zulip for communities</a>
to learn how Zulip empowers welcoming communities by making it
easy to participate on your own time.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
The Lean community switched from Gitter to Zulip in early 2018,
and never looked back. Zulip’s model of conversations labeled with topics has been
essential for organising research work and simultaneously
onboarding newcomers as our community scaled. My experience with
both the app and the website is extremely positive!
</blockquote>
<div class="author">
&mdash; <a href="https://www.imperial.ac.uk/people/k.buzzard">Kevin Buzzard</a>,
Professor of Pure Mathematics at
<a href="https://www.imperial.ac.uk/">Imperial College London</a>
</div>
</div>
<a class="case-study-link" href="/case-studies/lean/"
target="_blank">How the Lean prover
community uses Zulip ↗</a>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image topics-image">
<img alt="" src="{{ static('images/landing-page/research/streams_and_topics_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Lasting knowledge repository
</h1>
<ul>
<li>
<div class="list-content">
Maintain access to your organization's entire
message history with free <a href="/plans/">Zulip
Cloud Standard</a> hosting. Information is at your
fingertips with Zulip's <a
href="/help/search-for-messages">powerful full-text
search</a>.
</div>
</li>
<li>
<div class="list-content">
<a href="/help/link-to-a-message-or-conversation#link-to-zulip-from-anywhere">Permanently link</a>
to a Zulip conversation or a message in context
from emails, notes, talk slides, or anywhere else.
</div>
</li>
<li>
<div class="list-content">
With the <a href="/help/public-access-option">public
access option</a>, anyone can view, browse, and
search your organization's public content — no
account required.
</div>
</li>
<li>
<div class="list-content">
Zulip is <a href="https://github.com/zulip">100%
free and open-source software</a>, so you are never
locked into a proprietary tool. You can move your
data with our high quality <a
href="/help/export-your-organization">export</a> and
<a
href="https://zulip.readthedocs.io/en/latest/production/export-and-import.html">import</a>
tools.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Zulip has been a game changer for our group’s collaboration. It combines the immediacy of chat with the structure of email, allowing complex projects and parallel discussions to stay organized without chaos. We no longer lose context between meetings; every idea, file, and decision is easy to find and build on.
</blockquote>
<div class="author">
&mdash; <a href="https://www.capterra.com/p/197945/Zulip/#Capterra___7038289">Cole B., Associate Professor of Pediatrics</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/knowledge-repository.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Powerful formatting
</h1>
<ul>
<li>
<div class="list-content">
<a href="/help/format-your-message-using-markdown#latex">Type LaTeX</a>
directly into your Zulip message, and see it beautifully rendered.
</div>
</li>
<li>
<div class="list-content">
<a href="/help/code-blocks">Zulip code blocks</a>
come with syntax highlighting for over 250 languages, and integrated
<a href="/help/code-blocks#code-playgrounds">code playgrounds.</a>
</div>
</li>
<li><div class="list-content">Structure your points with bulleted and numbered <a href="/help/format-your-message-using-markdown#lists">lists</a>.</div></li>
<li>
<div class="list-content">
If you made a mistake, no worries! You
can <a href="/help/edit-a-message">edit your
message</a>, or move it to a
different <a href="/help/move-content-to-another-topic">topic</a>
or <a href="/help/move-content-to-another-channel">channel</a>.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
Several research communities I’m a part of use Zulip very effectively. Great for math/code, very well structured and keeps up with hundreds of users (across many countries/nationalities).
</blockquote>
<div class="author">
&mdash; <a href="https://www.reddit.com/r/AskAcademia/comments/1kvp1cc/comment/mucgbwy/">u/techowl8 on Reddit</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/events/message_formatting_day.png') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/research/interactive_messaging_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/research/interactive_messaging_day_2.png') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Interactive messaging
</h1>
<ul>
<li>
<div class="list-content">
Start a <a href="/help/start-a-call">video
call</a> with the click of a button, or
make plans for later without worrying
about time zones
using <a href="/help/format-your-message-using-markdown#global-times">global
times</a>.
</div>
</li>
<li>
<div class="list-content">
Use <a href="/help/emoji-reactions">emoji
reactions</a> for lightweight
interactions. Have fun
with <a href="/help/custom-emoji">custom
emoji</a> and gather feedback
with <a href="/help/create-a-poll">polls</a>.
</div>
</li>
<li><div class="list-content">Share papers, presentations or images with <a href="/help/share-and-upload-files">drag-and-drop file uploads</a>.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
For more than a year, Zulip has been the cornerstone of our online
Category Theory community. We greatly appreciate the seamless
integration of Latex in every message as well as being able to get
sidetracked (which, let's face it, happens a lot with
mathematicians) without compromising an entire conversation: we
can simply create a new topic for every tangent! Moreover, the
flexible channels-and-topics system greatly helps us navigate
through the constant influx of messages, as it is simple to tell
if a message is relevant to one's interests.
<br />
<br />
All in all, Zulip
enabled us to create an unprecedentedly extensive, active and
vibrant community for all category theory enthusiasts out there.
</blockquote>
<div class="author">
&mdash; <a
href="https://www8.cs.fau.de/people/stelios/">Stelios
Tsampas</a>, postdoctoral researcher at <a href="https://www.fau.eu/">FAU</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/research/interactive_messaging_day_1.png') }}" />
</div>
<div class="message-screenshot">
<img alt="" src="{{ static('images/landing-page/research/interactive_messaging_day_2.png') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Flexible administration and moderation
</h1>
<ul>
<li><div class="list-content">Invite new members with <a href="/help/invite-new-users">multi-use invite links</a>, or allow anyone to <a href="/help/restrict-account-creation#set-whether-invitations-are-required-to-join">join without an invitation</a>.</div></li>
<li>
<div class="list-content">
Automatically subscribe members to
channels <a href="/help/set-default-channels-for-new-users">when
they join.</a>
</div>
</li>
<li>
<div class="list-content">
Manage your community with <a
href="/help/manage-permissions">fine-grained
permission settings</a> you can assign to <a
href="/help/user-roles">user roles</a>,
<a href="/help/user-groups">user groups</a>, and <a
href="/help/introduction-to-users">individual users</a>.
</div>
</li>
<li>
<div class="list-content">
Zulip offers dozens of features
for <a href="/help/moderating-open-organizations">moderating
discussions</a>. Members can
also <a href="/help/mute-a-user">mute</a> anyone they'd rather
not interact with.
</div>
</li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
I have used Zulip for 7 years and whenever I have to use another platform it always results in frustration… The organization and storage of messages has enhanced the productivity of myself and colleagues for years.
</blockquote>
<div class="author">
&mdash; <a href="https://www.capterra.com/p/197945/Zulip/#Capterra___6648868">Christina P., Assistant Professor</a>
</div>
</div>
</div>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
When and how you want it
</h1>
<ul>
<li>
<div class="list-content">
With <a href="/apps/">apps for every
platform</a>, you can check Zulip at your computer or on your
phone. Zulip works great in a browser, so no download is
required.
</div>
</li>
<li><div class="list-content">Zulip alerts you about timely messages with <a href="/help/channel-notifications">fully customizable</a> mobile, email and desktop notifications.</div></li>
<li>
<div class="list-content">
Mention <a href="/help/mention-a-user-or-group">users</a>, <a href="/help/user-groups">groups
of users</a>
or <a href="/help/dm-mention-alert-notifications#wildcard-mentions">everyone</a>
when you need their attention.
</div>
</li>
<li><div class="list-content">Use Zulip in your language of choice, with translations into <a href="https://hosted.weblate.org/projects/zulip/">23 languages</a>.</div></li>
</ul>
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
As a research consortium spread across 14 locations in
Germany, we use Zulip to communicate with each other in
a low-threshold manner, without the overhead of email.
Even with more than 200 users across different
institutions, Zulip’s model of topic-labeled
conversations makes it easy for our team members to keep
up-to-date on what's relevant, and work productively
together.
</blockquote>
<div class="author">
&mdash; Christina Schüttler, IT department Team Lead, University
Hospital Erlangen
</div>
</div>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-image">
<img alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Make the move today
</h1>
<ul>
<li>
<div class="list-content">
Zulip's founder is a former MIT PhD student, and we love
helping academics succeed. Learn about using Zulip
for <a href="/for/education/">teaching</a> and
<a href="/for/events/">conferences</a>.
</div>
</li>
<li><div class="list-content">Getting started or moving from another platform is easy! Import your existing organization from <a href="/help/import-from-slack">Slack</a>, <a href="/help/import-from-mattermost">Mattermost</a>, or <a href="/help/import-from-rocketchat">Rocket.Chat</a>.</div></li>
<li><div class="list-content">If you have any questions, please contact us at <a href="mailto:sales@zulip.com">sales@zulip.com</a>. You can also drop by our <a href="/development-community/">friendly development community at chat.zulip.org</a> to ask for help or suggest improvements!</div></li>
</ul>
</div>
</div>
<div class="feature-half">
<div class="feature-image">
<div class="quote">
<div class="quote-with-attribution">
<blockquote>
I have to use Slack for some other research groups
I collaborate with, but my own graduate students
voted to switch to Zulip a few years ago and it's
just vastly better.
</blockquote>
<div class="author">
&mdash; <a href="https://cs.stanford.edu/~keithw/">Keith Winstein</a>, Assistant Professor of Computer Science at <a href="https://www.stanford.edu/">Stanford University</a>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="feature-end">
<div class="bottom-register-buttons extra_margin_before_footer">
<h1>
<a href="/plans/">Zulip Cloud Standard</a> is free for
academic research!
</h1>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/accounts/go/?next=/sponsorship/" class="button">
{{ _('Request sponsorship') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,37 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Use cases and customer stories | Zulip" %}
{% set PAGE_DESCRIPTION = "Learn how our customers are using Zulip." %}
{% block marketing_content %}
<div class="portico-landing plans why-page solutions-page for-companies">
<div class="hero bg-companies">
<div class="bg-dimmer"></div>
<h1 class="center">Use cases and customer stories</h1>
<p>Learn how our customers are using Zulip.</p>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/plans/" class="button">
{{ _('View pricing') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/for/use-cases.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,34 @@
## Use cases
* [Business](/for/business/)
* [Education](/for/education/)
* [Research](/for/research/)
* [Events and conferences](/for/events/)
* [Open source projects](/for/open-source/)
* [Communities](/for/communities/)
## Customer stories
### Business
* [iDrift AS company](/case-studies/idrift/)
* [GUT contact support agency](/case-studies/gut-contact/)
* [End Point Dev software consultancy](/case-studies/end-point/)
* [WindBorne startup](/case-studies/windborne/)
* [Semsee InsurTech startup](/case-studies/semsee/)
* [Atolio startup](/case-studies/atolio/)
### Education and research
* [Technical University of Munich](/case-studies/tum/)
* [University of California San Diego](/case-studies/ucsd/)
* [National University of Córdoba](/case-studies/university-of-cordoba/)
* [Lean theorem prover community](/case-studies/lean/)
### Open source and communities
* [Asciidoctor open-source community](/case-studies/asciidoctor/)
* [Rust language community](/case-studies/rust/)
* [Recurse Center](/case-studies/recurse-center/)
* [Rush Stack](/case-studies/rush-stack/)
* [Mixxx open-source community](/case-studies/mixxx/)

View File

@@ -0,0 +1,306 @@
{% extends "zerver/base.html" %}
{% set entrypoint = "landing-page-hello" %}
{% set PAGE_TITLE = "Zulip — organized team chat" %}
{% set PAGE_DESCRIPTION = "Zulip is an organized team chat app for distributed
teams of all sizes." %}
{% block content %}
{% include 'zerver/marketing_nav.html' %}
<div class="portico-hello-page">
<div class='body-bg'>
<div class='body-bg__layer'></div>
</div>
<div class="screen-1">
<h1>Organized chat for distributed&nbsp;teams</h1>
<div class='appshot-1'>
<picture>
<!-- dark theme is only with webp images, since webp support was at the same time or earlier than prefers-color-scheme https://caniuse.com/?search=prefers-color-scheme https://caniuse.com/webp -->
<source class='appshot-1__img'
type="image/webp"
srcset="{{ static('images/landing-page/hello/generated/screen-1-dark-2x.webp') }}"
media="(min-width: 941px) and (prefers-color-scheme: dark)"/>
<source class='appshot-1__img'
type="image/webp"
srcset="{{ static('images/landing-page/hello/generated/screen-1-mobile-dark-2x.webp') }}"
media="(max-width: 940px) and (prefers-color-scheme: dark)"/>
<source width="1095" height="496" class='appshot-1__img'
type="image/webp"
srcset="{{ static('images/landing-page/hello/generated/screen-1-2x.webp') }}"
media="(min-width: 941px)"/>
<source class='appshot-1__img'
type="image/webp"
srcset="{{ static('images/landing-page/hello/generated/screen-1-mobile-2x.webp') }}"
media="(max-width: 940px)"/>
<source class='appshot-1__img'
srcset="{{ static('images/landing-page/hello/generated/screen-1-mobile-2x.jpg') }}"
media="(max-width: 940px)"/>
<img alt="" width="1095" height="496" class='appshot-1__img' src="{{ static('images/landing-page/hello/generated/screen-1-2x.jpg') }}"/>
</picture>
<div class="cta-buttons">
<a href="{{ 'https://chat.zulip.org' if not development_environment}}/?show_try_zulip_modal">
See how we use Zulip
<div class="cta-desc">No account needed</div>
</a>
<a href="/new/">
Create an organization
<div class="cta-desc">Anonymously if you like</div>
</a>
<a href="/request-demo/">
Contact sales
<div class="cta-desc">Talk to a helpful human</div>
</a>
</div>
</div>
<div class="client-logos">
<div class='client-logos-div client-logos__logo_pilot'></div>
<div class='client-logos-div client-logos__logo_linux_foundation'></div>
<div class='client-logos-div client-logos__logo_tum'></div>
<div class='client-logos-div client-logos__logo_wikimedia'></div>
<div class='client-logos-div client-logos__logo_rust'></div>
<div class='client-logos-div client-logos__logo_dr_on_demand'></div>
</div>
</div>
<div class="screen-2">
<div class="screen-2__container">
<div>
<h2 class="screen-2__header">Designed for async conversations.</h2>
<div class="screen-2__subtitle">Here's what it looks like in action.</div>
</div>
<div class="screen-2__tabs">
<input type="radio" id="screen-2__tab1" name="screen-2__tabs-radio" class="screen-2__tab-input" checked />
<input type="radio" id="screen-2__tab2" name="screen-2__tabs-radio" class="screen-2__tab-input" />
<input type="radio" id="screen-2__tab3" name="screen-2__tabs-radio" class="screen-2__tab-input" />
<input type="radio" id="screen-2__tab4" name="screen-2__tabs-radio" class="screen-2__tab-input" />
<input type="radio" id="screen-2__tab5" name="screen-2__tabs-radio" class="screen-2__tab-input" />
<ul>
<li>
<label for="screen-2__tab1">
Get an overview of conversations with unread messages in your inbox.
</label>
</li>
<li>
<label for="screen-2__tab2">
Focus on one conversation at a time, no matter how many others are happening.
</label>
</li>
<li>
<label for="screen-2__tab3">
Reply to each conversation in context.
</label>
</li>
<li>
<label for="screen-2__tab4">
Conversations continue seamlessly over time.
</label>
</li>
<li>
<label for="screen-2__tab5">
Start a new conversation by giving it a brief topic.
</label>
</li>
</ul>
<div class="screen-2__tabs-content">
<div class="screen-2__tab-image">
<picture>
<source
srcset="{{ static('images/landing-page/hello/generated/01-tab-cont-dark-2x.jpg') }}"
media="(prefers-color-scheme: dark)" />
<img alt="" src="{{ static('images/landing-page/hello/generated/01-tab-cont-2x.jpg') }}"/>
</picture>
</div>
<div class="screen-2__tab-image">
<picture>
<source
srcset="{{ static('images/landing-page/hello/generated/02-tab-cont-dark-2x.jpg') }}"
media="(prefers-color-scheme: dark)" />
<img alt="" src="{{ static('images/landing-page/hello/generated/02-tab-cont-2x.jpg') }}"/>
</picture>
</div>
<div class="screen-2__tab-image">
<picture>
<source
srcset="{{ static('images/landing-page/hello/generated/03-tab-cont-dark-2x.jpg') }}"
media="(prefers-color-scheme: dark)" />
<img alt="" src="{{ static('images/landing-page/hello/generated/03-tab-cont-2x.jpg') }}"/>
</picture>
</div>
<div class="screen-2__tab-image">
<picture>
<source
srcset="{{ static('images/landing-page/hello/generated/04-tab-cont-dark-2x.jpg') }}"
media="(prefers-color-scheme: dark)" />
<img alt="" src="{{ static('images/landing-page/hello/generated/04-tab-cont-2x.jpg') }}"/>
</picture>
</div>
<div class="screen-2__tab-image">
<picture>
<source
srcset="{{ static('images/landing-page/hello/generated/05-tab-cont-dark-2x.jpg') }}"
media="(prefers-color-scheme: dark)" />
<img alt="" src="{{ static('images/landing-page/hello/generated/05-tab-cont-2x.jpg') }}"/>
</picture>
</div>
</div>
</div>
</div>
</div>
<div class="screen-3">
<div class="screen-3__container">
<div class="screen-3__content">
<h2 class="screen-3__header">Zulip empowers remote and flexible work.</h2>
<div class="screen-3__subtitle">Check out these <a href="/case-studies/">case studies</a> to see the impact.</div>
<div class='screen-3__quotes'>
<a class="quote" href="/case-studies/atolio/">
<div class="quote__text">
<h4>Work better together</h4>
The first-class threads in Zulip are <strong>absolutely critical to how we work</strong>. So many people on Hacker News talk about using Zulip — I'm so glad we joined them!
</div>
<div class="quote__source">
<strong>David Lanstein</strong>, <i>co-founder and CEO of Atolio</i>
</div>
</a>
<a class="quote" href="/case-studies/idrift/">
<div class="quote__text">
<h4>Empower leaders</h4>
Using Zulip significantly <strong>increases the size of the team</strong> for which a manager can meaningfully know what’s going on.
</div>
<div class="quote__source">
<strong>Gaute Lund</strong>, <i>co-founder of iDrift AS</i>
</div>
</a>
<a class="quote" href="/case-studies/rust/">
<div class="quote__text">
<h4>Make decisions faster</h4>
Some decisions that were blocked for months on
GitHub were <strong>resolved within 24 hours</strong> on Zulip.
</div>
<div class="quote__source">
<strong>Josh Triplett</strong>, <i>Rust Language team co-lead</i>
</div>
</a>
<a class="quote" href="https://monadical.com/posts/how-to-make-remote-work-part-two-zulip.html">
<div class="quote__text">
<h4>Simplify knowledge management</h4>
Using Zulip in a way that feels natural creates
an <strong>organized repository</strong> of knowledge <i>as a
side effect</i>.
</div>
<div class="quote__source">
<strong>Max McCrea</strong>, <i>Co-founder of Monadical</i>
</div>
</a>
<a class="quote" href="/case-studies/end-point/">
<div class="quote__text">
<h4>Organize 100s of workstreams</h4>
Other apps like Slack would struggle with
organizing the flow of information in a complex
organization like ours. Zulip’s UI makes it easy
to <strong>access all the information you need</strong>.
</div>
<div class="quote__source">
<strong>Jon Jensen</strong>, <i>CTO of End Point
Dev</i>
</div>
</a>
<a class="quote" href="/case-studies/gut-contact/">
<div class="quote__text">
<h4>Communicate with efficiency</h4>
I don’t like going back to Slack now. It’s just
not as efficient a way to <strong>organize
communication</strong>.
</div>
<div class="quote__source">
<strong>James van Lommel</strong>, <i>Director of Engineering at Semsee</i>
</div>
</a>
</div>
</div>
</div>
</div>
<div class="screen-4">
<div class="screen-4__container">
<div class="screen-4__content">
<img alt="" class="switch-diagram mirror-image" loading="lazy" width="300"
src="{{ static('images/landing-page/education/privacy.svg') }}"
/>
<div class="screen-4__desc">
<h2 class="screen-4__header">You own your data</h2>
<p>
Escape corporate vendor lock-in. You can <a
href="/self-hosting/">self-host</a> Zulip’s 100% <a
href="https://github.com/zulip/zulip#readme">open-source</a>
software for full data sovereignty, or start
with a convenient <a href="/plans">cloud
solution</a> and <a
href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#import-into-a-new-zulip-server">move</a>
any time.
</p>
<p>
We make it easy to switch from <a
href="/help/moving-from-slack">Slack</a>, <a
href="/help/moving-from-teams">Teams</a> and <a
href="/help/migrating-from-other-chat-tools">other
tools</a>.
</p>
</div>
</div>
</div>
<div class="badges">
<a class="badge-getapp" href="https://www.getapp.com/collaboration-software/web-collaboration/category-leaders">
<img alt="" src="https://brand-assets.getapp.com/badge/05c62fe0-cb84-41bf-ae2d-cd0105373a2c.svg"/>
</a>
<a class="badge-capterra" href="https://www.capterra.com/p/197945/Zulip/">
<img alt="" src="https://brand-assets.capterra.com/badge/d5bcfca3-94a5-496d-90f2-4ffc71c51eb7.svg"/>
</a>
</div>
</div>
<div class="screen-5">
<div class="screen-5__container">
<h2 class="screen-5__header">Curious to learn more?</h2>
<div class="screen-5__subtitle">Dive into our detailed guide for organizations like yours.</div>
<div class="screen-5__cards">
<a href="/for/business/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Business</h4>
Organizations from small businesses to enterprises communicate more efficiently.
</div>
</a>
<a href="/for/research/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Research</h4>
For your group, lab, department or scientific field.
</div>
</a>
<a href="/for/education/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Education</h4>
Communication hub for classes, in-person or online.
</div>
</a>
<a href="/for/open-source/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Open-source</h4>
Grow and engage your community.
</div>
</a>
<a href="/for/communities/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Non-profits, Governments</h4>
Free or highly-discounted plans are available for most non-business uses.
</div>
</a>
<a href="/for/events/" class="card">
<div class="card__text">
<h4 class="right-arrow-icon">Events and conferences</h4>
For organizers and attendees at your conference, workshop, or hackathon.
</div>
</a>
</div>
</div>
</div>
</div>
{% include 'zerver/footer.html' %}
{% endblock %}

View File

@@ -0,0 +1,49 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "History of the Zulip project" %}
{% set PAGE_DESCRIPTION = "Learn how Zulip grew from a small startup to become a
foundation-stewarded project with the most active open-source development
community of any team chat software." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page">
<div class="hero bg-pycon">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">History of the Zulip project</h1>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="photo-description">
Zulip at the PyCon Sprints in Portland, Oregon.
Over seventy-five people sprinted during the four day event.
</div>
<div class="inner-content markdown">
{{ render_markdown_path('corporate/history.md') }}
</div>
<div class="inner-content history markdown">
<div class="sponsors">
<div class="sponsor-picture">
<a href="https://seedfund.nsf.gov/">
<img src="{{ static('images/landing-page/history/nsf-logo.png') }}" alt="" />
</a>
</div>
<div class="sponsor-picture">
<a href="https://summerofcode.withgoogle.com/">
<img src="{{ static('images/landing-page/history/gsoc-logo.png') }}" alt="" />
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,354 @@
## Startup inspired by MIT's messaging system
Zulip was originally created by Zulip, Inc., a small startup in Cambridge,
Massachusetts. Zulip, Inc. was founded in August 2012 by the
[MIT](https://www.mit.edu/) alumni team that previously created the
[Ksplice](https://www.ksplice.com) software for live-patching a running Linux
kernel. Zulip was inspired by the [BarnOwl](https://barnowl.mit.edu/) client
for the [Zephyr](https://en.wikipedia.org/wiki/Zephyr_(protocol)) instant
messaging protocol, and the incredible community that Zephyr supported at MIT.
## Early acquisition by Dropbox
Zulip, Inc. was acquired by [Dropbox](https://www.dropbox.com/) in
early 2014, while the product was still in private beta, which put
Zulip development on hold. However, because they loved Zulip's
topic-based threading experience, Zulip's early customers [continued
using Zulip all through that time](/case-studies/recurse-center/).
> We strongly prefer Zulip to other options for several reasons – its message
> threading being a key one.
>
> — [Nick Bergson-Shilcock](https://github.com/nicholasbs), Recurse Center
> [co-founder and CEO](https://www.recurse.com/team), September 2015
## Zulip released as open source!
In 2015, a year and a half after the acquisition, Dropbox generously decided to
[release Zulip as open-source software](https://blogs.dropbox.com/tech/2015/09/open-sourcing-zulip-a-dropbox-hack-week-project/).
A group of Zulip's developers [and early
users](https://www.recurse.com/blog/90-zulip-supporting-oss-at-the-recurse-center)
spent Dropbox's Hack Week preparing Zulip's code base for release. The
entire product, including the server, Android and iOS mobile apps, and
desktop apps for Mac, Linux and Windows, was released [under the Apache
2 license](https://github.com/zulip/zulip/blob/main/LICENSE) with
complete version control history.
The Zulip community is incredibly grateful to both Dropbox and those
enthusiastic early users for making the Zulip open source project possible.
Dropbox has no ongoing relationship with the Zulip project.
## Zulip's second founding
At first, the [Zulip open-source project](https://github.com/zulip/zulip#readme)
was maintained by the project's founder and leader [Tim
Abbott](/team/#the-core-team) on nights and weekends. In the months following
the open-source release, the project quickly gained contributors and users.
It soon became clear that guiding the contributor community in developing a
world-class team chat product would require leadership from a dedicated team.
Thus, in April 2016, Tim Abbott founded a [mission-driven](/values/) company,
Kandra Labs, to steward and financially sustain Zulip’s development.
Incorporating as a business has helped Zulip attract top talent, and has made
Zulip eligible for [large innovation grants](https://seedfund.nsf.gov/) from the
US National Science Foundation, which Kandra Labs was awarded in 2017 and 2018.
## Early days as an open-source company
In its early days, the Zulip community was focused on three main goals:
- Turning an innovative product (that had been in private beta when its
development was put on hold) into a **polished application**, complete with
enterprise-ready features like [single sign-on
options](/help/configure-authentication-methods) and [hundreds of
integrations](/integrations/).
- Making Zulip more **widely available**. In mid-2017, Kandra Labs
launched two products: a hosted [Zulip Cloud](/plans/) service, and
an enterprise support offering for [self-hosted](/self-hosting/)
deployments. Zulip’s original customers were migrated from Dropbox’s
servers to the new Zulip Cloud offering, fully preserving their chat
history. Despite the acquisition by Dropbox, Zulip's customers have
thus [enjoyed uninterrupted
service](https://blog.zulip.com/2021/12/17/why-zulip-will-stand-the-test-of-time/)
since 2013.
- **Building a vibrant community around the project**, with effort and
care dedicated to making it [easy to get
started](https://zulip.readthedocs.io/en/latest/overview/contributing.html)
contributing to Zulip. The Zulip development community gathered at
PyCon sprints [in
2016](https://blog.zulip.org/2016/10/13/static-types-in-python-oh-mypy/),
and led the largest PyCon sprint ever [in
2017](https://us.pycon.org/2017/community/sprints/), with over 75
developers contributing to Zulip over course of the 4-day event. By
late 2016, [more than 150
people](https://github.com/zulip/zulip/graphs/contributors) from all
over the world had contributed almost 1000 pull requests to the
software, and the Zulip project was moving faster than when the
original startup employed 11 full-time engineers. Zulip also began
mentoring [Google Summer of
Code](https://developers.google.com/open-source/gsoc/) contributors
in 2016, and continues to [mentor 15-20 outreach program
participants](https://zulip.readthedocs.io/en/latest/outreach/overview.html)
every year.
We are proud to have achieved those early goals for the
project.
## Zulip continues to thrive
These days, we regularly hear from users that they prefer Zulip's user
experience to that of team chat products produced by some of the
world's largest companies. More than 1000 people have contributed a
total of over 60,000 commits to the Zulip project, which has more than
16 thousand stars on GitHub.
In 2020, Zulip experienced an extraordinary increase in usage as a result of
the Covid-19 pandemic changing how people work. During this extremely difficult
time, we found joy in hearing from users about how Zulip has helped them make
[remote work](/for/business/), [research collaborations](/for/research/),
[teaching](/for/education/), and [events and conferences](/for/events/)
successful.
Starting August 2022, [Slack’s free plan change caused an
exodus](https://blog.zulip.com/2022/08/26/why-slacks-free-plan-change-is-causing-an-exodus/)
of open-source projects, researchers, and a wide variety of other
negatively impacted communities to Zulip and other chat
platforms. [Data imports](/help/import-from-slack) from Slack into
Zulip Cloud increased an incredible 40x in the month after Slack’s
[announcement](https://slack.com/blog/news/pricing-and-plan-updates).
In 2023, Zulip earned first place in [GetApp’s Collaboration Software Category
Leaders
report](https://www.getapp.com/collaboration-software/web-collaboration/category-leaders/).
With over 100 reviews on Capterra, Zulip's 4.8 star rating beat out reviews for
other team chat apps, earning Capterra's [Best Value
badge](https://www.capterra.com/p/197945/Zulip/).
Since then, Zulip has continued to provide a user-respecting
[alternative](https://blog.zulip.com/2024/11/04/choosing-a-team-chat-app/) to
team chat apps developed by mega-corporations.
## The Zulip Foundation
In 2026, we [announced the
creation](https://blog.zulip.com/2026/05/15/announcing-zulip-foundation/) of a
nonprofit, independent
Zulip Foundation, which became the new steward of the Zulip project. Kandra
Labs is now fully owned by the Zulip Foundation, and remains committed to being
a trustworthy, transparent vendor for all our customers.
The new structure provides stability, a renewed commitment to our
[values](/values), and opportunities for charitable fundraising to support our
mission.
## Press highlights
- June 2025: Zulip's head of product is interviewed about how we’ve built a
welcoming open-source community around Zulip [on the Business of Open Source
podcast](https://open.spotify.com/episode/3KMLGk4buv8zfDxTjVnChw).
- September 2024: An in-depth interview with Zulip’s head of product [on The
Changelog podcast](https://changelog.com/podcast/607): *“We talk about Zulip’s
origins, how it’s open source, the way it’s led, no VC funding, what makes it
different/better, how you can self-host it or use their cloud, moving to
Zulip, contributing and being a part of the community… all the things.”*
- June 2024: An in-depth [review of
Zulip](https://www.hostingadvice.com/blog/emerging-open-source-team-chat-app-set-to-rival-slack/)
is published on [HostingAdvice.com](https://www.hostingadvice.com/).
> An excellent solution for teams collaborating across different time zones.
>
> — [Zulip
> review](https://www.hostingadvice.com/blog/emerging-open-source-team-chat-app-set-to-rival-slack/)
> on *HostingAdvice.com*
- March 2023: A long-form [video
interview](https://www.youtube.com/watch?v=cbj59mVwErg) with Zulip’s founder
and project leader about Zulip’s history, our goals for the product and how we
approach its design, Zulip’s engineering philosophy, and more produced by
[FUTO](https://futo.org/).
- March 2022:
[Deep-dive](https://opensource.com/article/22/3/open-source-chat-zulip) into
how one open-source community uses Zulip published on
[opensource.com](https://opensource.com/).
- June 2021: Zulip is covered in a [VentureBeat
article](https://venturebeat.com/2021/06/18/cutting-slack-when-open-source-and-team-chat-tools-collide/)
about open-source Slack alternatives.
- February 2021: TechRadar publishes a [Zulip overview and installation
walkthrough](https://www.techradar.com/how-to/set-up-your-own-slack-like-chat-system-on-linux).
- July 2021: An in-depth [review of
Zulip](https://www.theregister.com/2021/07/28/zulip_open_source_chat_collaboration_software/)
is published in *[The Register](https://www.theregister.com)*.
> In fact now it seems strange to me to just fire off messages in Slack with no
> subject – that's chaos, madness. The genius of subject lines is that you can
> quickly and easily catch up on the messages you missed in your off-hours...
> This feature alone saves me hours a week.
>
> — [Zulip
> review](https://www.theregister.com/2021/07/28/zulip_open_source_chat_collaboration_software/)
> in *The Register*
- [July
2021](https://www.quantamagazine.org/lean-computer-program-confirms-peter-scholze-proof-20210728/)
and [October
2020](https://www.quantamagazine.org/building-the-mathematical-library-of-the-future-20201001/):
Zulip earns mentions in Quanta Magazine articles about the [formalization of
mathematics](/case-studies/lean/).
> Every day, dozens of like-minded mathematicians gather on an online forum
> called Zulip to build what they believe is the future of their field.
>
> — *Quanta Magazine*, [“Building the Mathematical Library of the
> Future”](https://www.quantamagazine.org/building-the-mathematical-library-of-the-future-20201001/)
- November 2020: An interview with Tim Abbott is [featured in Linux
Format](https://linuxformat.com/archives?issue=269).
- September 2020: [TFiR](https://www.tfir.io/) publishes an [in-depth video
interview](https://www.tfir.io/zulip-is-slack-for-busy-project-managers/) with
Zulip founder and lead developer Tim Abbott.
- July 2017: Podcast [interview with Tim
Abbott](https://www.pythonpodcast.com/zulip-chat-with-tim-abbott-episode-118/)
is featured on the Python podcast
[Podcast.__init__](https://www.pythonpodcast.com/about/).
## Major server releases and product announcements
- April 2026: [Zulip Server 12.0
released](https://blog.zulip.com/2026/04/27/zulip-12-0-released/), with almost
5500 new commits. 160 people contributed commits to Zulip since the 11.0
release.
- August 2025: [Zulip Server 11.0
released](https://blog.zulip.com/2025/08/13/zulip-11-0-released/), with over
3300 new commits. 76 people contributed commits to Zulip since the 10.0
release.
- June 2025: Zulip’s next-generation mobile app for Android and iOS, built on
Flutter,
[becomes](https://blog.zulip.com/2025/06/17/flutter-mobile-app-launched/) the
official mobile app.
- March 2025: [Zulip Server 10.0
released](https://blog.zulip.com/2025/03/20/zulip-10-0-released/), with over
5200 new commits. 121 people contributed commits to Zulip since the 9.0
release.
- March 2025: Zulip
[announces](https://blog.zulip.com/2025/03/20/flexible-permissions-management/)
a new flexible system for permissions management. Zulip users can now grant
permissions across the app to any combination of roles, groups, and individual
users.
- July 2024: [Zulip Server 9.0
released](https://blog.zulip.com/2024/07/25/zulip-9-0-released/), with over
5300 new commits. 124 people contributed commits to Zulip since the 8.0
release.
- December 2023: [Zulip Server 8.0
released](https://blog.zulip.com/2023/12/15/zulip-8-0-released/), with over
4700 new commits. 116 people contributed commits to Zulip since the 7.0
release. Zulip announces new [plans](/plans#self-hosted) for self-hosted
customers.
- May 2023: [Zulip Server 7.0
released](https://blog.zulip.com/2023/05/31/zulip-7-0-released/), with over
3800 new commits. 107 people contributed commits to Zulip since the 6.0
release.
- November 2022: [Zulip Server 6.0
released](https://blog.zulip.com/2022/11/17/zulip-6-0-released/), with over
3400 new commits. 118 people contributed commits to Zulip since the 5.0
release.
- May 2022: Zulip
[announces](https://blog.zulip.com/2022/05/05/public-access-option/) the
general availability of a [public access option](/help/public-access-option).
Open-source projects and other open communities can now offer one-click access
(no login required!) to part or all of their Zulip chat.
- March 2022: [Zulip Server 5.0
released](https://blog.zulip.com/2022/03/29/zulip-5-0-released/), with over
7000 new commits. 157 people contributed commits to Zulip since the 4.0
release.
- July 2021: In response to [interest from educators](/case-studies/ucsd/),
Zulip
[launches](https://blog.zulip.com/2021/07/26/zulip-for-education-launch/) a
dedicated [Zulip for Education](/for/education/) offering.
> Zulip has the best user experience of all the chat apps I’ve tried. With the
> discussion organized by topic within each channel, Zulip is the only app that
> makes hundreds of conversations manageable.
>
> — [Tobias Lasser](https://ciip.in.tum.de/people/lasser.html), lecturer at the
> Technical University of Munich Department of Informatics [[customer
> story](/case-studies/tum/)]
- May 2021: [Zulip Server 4.0
released](https://blog.zulip.com/2021/05/13/zulip-4-0-released/), with over 4300
new commits by 137 contributors.
> This has been an unusually long release cycle, because I took a few months off
> work on Zulip to welcome my new daughter Zoe. Coming back to work was a great
> stress-test of Zulip’s asynchronous model: I received over 20,000 messages in
> chat.zulip.org during my paternity leave. I really enjoyed reading everything
> and replying to the hundreds of topics where I had something to contribute or
> someone to thank. Systematically reading months of history would have been
> impossible with any other tool!
>
> —Tim Abbott, Zulip founder and lead developer, [Zulip 4.0 release blog
> post](https://blog.zulip.com/2021/05/13/zulip-4-0-released/)
- July 2020: [Zulip Server 3.0
released](https://blog.zulip.com/2020/07/16/zulip-3-0-released/), with 4100
new commits by 110 contributors.
- March 2019: [Zulip Server 2.1
released](https://blog.zulip.com/2019/12/13/zulip-2-1-released/), with 3190
new commits by 123 contributors.
- March 2019: [Zulip Server 2.0
released](https://blog.zulip.com/2019/03/01/zulip-2-0-released/), with 1900
new commits by 87 contributors.
- November 2018: [Zulip Server 1.9
released](https://blog.zulip.com/2018/11/07/zulip-1-9-released/), with 3300
new commits by 81 contributors.
- April 2018: [Zulip Server 1.8
released](https://blog.zulip.com/2018/04/18/zulip-1-8-released/), with over
3500 new commits by 131 contributors.
- October 2017: [Zulip Server 1.7
released](https://blog.zulip.com/2017/10/25/zulip-server-1-7-released/), with 3675
new commits by about 100 contributors.
- June 2017: [Zulip Server 1.6
released](https://blog.zulip.com/2017/06/06/zulip-server-1-6-released/), with
over 3100 new commits by more than 150 contributors.
## Support
- Zulip is on [GitHub Sponsors](https://github.com/sponsors/zulip),
[Patreon](https://www.patreon.com/zulip), and [Open
Collective](https://opencollective.com/zulip). Our [blog
post](https://blog.zulip.com/2021/04/28/why-zulip-is-on-github-sponsors/)
explains Zulip’s values-driven approach and why we ask for support.
- Kandra Labs has been supported by nearly $1M in <a
href="https://seedfund.nsf.gov/">SBIR grants</a> from the US National Science
Foundation.
- Zulip has benefited enormously from the work of over 100 contributors
supported by [Google Summer of Code](https://summerofcode.withgoogle.com/).

View File

@@ -0,0 +1,188 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Jobs | Zulip" %}
{% set PAGE_DESCRIPTION = "We're hiring! Learn about our openings and how to
apply." %}
{% block marketing_content %}
<div class="portico-landing jobs why-page">
<div class="hero bg-pycon drone">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Work with us</h1>
<p>We're 100% open source, and we're hiring.</p>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
<div class="open-positions">
<h1 id="open-positions">Open positions</h1>
<p>
To apply for an open position, please send your <b>resume</b>
and a brief <b>cover letter</b> (which can be in the
body of your email) to the email provided in the
description for the opening. Your cover letter should
explain what makes you excited about working at Zulip in
the role you're applying for. Applications without a
cover letter will not be considered.
</p>
<p>
If you are an experienced
engineer, and you believe that your background would be
a great fit for Zulip, please email us at <a
href="mailto:jobs+engineer@zulip.com">jobs+engineer@zulip.com</a>
with your resume and cover letter even if you don't see
an open role that looks like the right fit.
</p>
<p>
<i>All openings are remote.</i>
</p>
<hr/>
<h2 id="leader">Leadership team roles</h2>
<p>
<a href="/">Zulip</a> is an open-source team chat
application designed for seamless remote and hybrid
work. With conversations organized by topic, Zulip is <a
href="/why-zulip">ideal</a> for both live and
asynchronous communication. Zulip’s 100% open-source
software is available as a <a href="/plans/#cloud">cloud
service</a> or a
<a href="/self-hosting">self-hosted solution</a>, and is
used by thousands of organizations around the world.
Zulip is a <a
href="https://zulip.com/values/">values-focused</a>
organization stewarded by the nonprofit <a
href="https://blog.zulip.com/2026/05/15/announcing-zulip-foundation/">Zulip
Foundation</a>.
</p>
<p>
We are looking for experienced leaders familiar with Zulip
with strengths in the following areas. A single candidate is
not expected to cover all these areas.
</p>
<ul>
<li>
<strong>Technical</strong>: Technical leadership for a complex product (with web, desktop, and mobile apps) designed for reliability and maintainability.
</li>
<li>
<strong>Business</strong>: Business strategy and operations (finance, legal, payroll, etc.).
</li>
<li>
<strong>Management</strong>: Thoughtfully managing a remote team.
</li>
<li>
<strong>Marketing</strong>: B2B marketing strategy and execution.
</li>
<li>
<strong>Sales</strong>: Inbound sales and partnership negotiations.
</li>
<li>
<strong>Product</strong>: Managing a complex product that’s part of users’ daily workflows.
</li>
</ul>
<p>
We anticipate posting full job descriptions and
starting to interview candidates in June or July of
2026.
</p>
<p>
<em>Email us at <a
href="mailto:jobs+leader@zulip.com">jobs+leader@zulip.com</a>
with your resume and cover letter if you're interested,
and we’ll be in touch. Or learn more about <a
href="https://zulip.com/jobs/#how-we-work">how we
work</a>.</em>
</p>
<hr/>
</div>
<div class="how-we-work">
<h1 id="how-we-work">
How we work
</h1>
<p>
<strong>Open source.</strong> The Zulip software is 100%
free and open source. We're <a href="/team/">an
open-source project</a> first, and we’re building an
independent <a href="/values">sustainable business</a>
as a means to support the project's growth and long-term
future. We provide the same open-source code to our
largest customers as to anyone with <code>git clone</code>.
</p>
<p>
<strong>Open project.</strong> The Zulip project is one where people
really do show up through the Internet and start making real changes.
That doesn’t happen by accident; it takes work and thoughtfulness. Most
of us work remotely, and we discuss our code and our plans in public, in
writing, primarily asynchronously, using Zulip and GitHub.
</p>
<p>
<strong>Inclusive community.</strong> The Zulip community is made up of a
mixture of volunteers and professionals from all walks of life. Diversity is
one of our strengths, and we strive to be a community that welcomes and
supports people of all backgrounds and identities from anywhere in the world.
</p>
<p>
<strong>Globally distributed.</strong> Our company is
headquartered in San Francisco, CA, but like our
community, our ~15 person team works from around the
world. We communicate primarily async, in the <a
href="/development-community">Zulip development
community</a> and <a href="https://github.com/zulip">on
GitHub</a>. Our roles are open to all applicants without
regard for location.
</p>
<p>
<strong>Maintainable software.</strong> Great
software over time depends on a team’s shared
understanding of a system and how to change it, as
much as on the code itself. Beyond writing our
code so it works today, we put equal effort into
writing code, tests, comments, commit history,
and <a href="https://zulip.readthedocs.io/en/latest/">documentation</a>
clearly, to share with each other and future
contributors our understanding of how and why it
works, so we can build on it tomorrow.
</p>
</div>
</div>
</div>
</div>
<div class="what-were-building">
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
<h1 id="what-were-building">
What we're building
</h1>
<p>
People working together need to communicate with their teammates, and they
also need to tune out the conversation to get work done. Teams tired of
wasting time in meetings move discussion to email; tired of waiting all
day for email replies, move to a team chat like Slack or
Microsoft Teams; and then
team chat becomes an always-on meeting, leaving people constantly
distracted, missing out on important conversations, or both.
</p>
<p>
Zulip is reinventing chat so teams can accomplish more together. We've
created a place where a conversation can shift seamlessly from the
immediacy of chat to the reply-whenever efficiency of email, and back;
where you can participate in the conversations that matter to you and
efficiently tune out the rest, no matter whether you're there in real
time, coming online after a morning hard at work, or returning from a
vacation away from it.
</p>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,88 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Partner program | Zulip" %}
{% set PAGE_DESCRIPTION = "Zulip works with a variety of partners to deliver the
product to customers, and integrate it with other tools in their workplace
suite." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page partners-page">
<div class="hero bg-pycon partners">
<div class="bg-dimmer"></div>
<h1 class="center">Partner program</h1>
<p>Zulip works with a variety of partners to deliver the product,<br />
and integrate it with other tools in the customer's workplace
suite.
</p>
<div class="hero-buttons center">
<a href="https://docs.google.com/forms/d/e/1FAIpQLScBoUMw8Nm2pWwh2RcNa_t_X-V9gXcuhAl-UVR_FxCReXHg4g/viewform?usp=sharing" class="button">
Become a partner
</a>
</div>
</div>
<div class="feature-grid">
<div class="feature-row">
<div class="feature-box">
<div class="feature-text">
<h1>
Resellers
</h1>
<p>
Help customers discover how Zulip can address their
needs. Our partner onboarding kit helps you get started.
</p>
</div>
</div>
<div class="feature-box">
<div class="feature-text">
<h1>
Value Added Resellers (VARs)
</h1>
<p>
Support customer deployments. Build custom integrations
with our <a href="/api">easy-to-use APIs</a>.
</p>
</div>
</div>
</div>
<div class="feature-row">
<div class="feature-box">
<div class="feature-text">
<h1>
Managed Service Providers
</h1>
<p>
Host and manage Zulip deployments, and customize Zulip's
open-source software.
</p>
</div>
</div>
<div class="feature-box">
<div class="feature-text">
<h1>
Hosting providers
</h1>
<p>
Host Zulip's secure, easy to deploy software. Efficient
multi-tenant hosting available.
</p>
</div>
</div>
</div>
<div class="feature-end">
<div class="bottom-register-buttons extra_margin_before_footer">
<div class="hero-buttons center">
<a href="https://docs.google.com/forms/d/e/1FAIpQLScBoUMw8Nm2pWwh2RcNa_t_X-V9gXcuhAl-UVR_FxCReXHg4g/viewform?usp=sharing" class="button">
Become a partner
</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,223 @@
{% extends "zerver/base.html" %}
{% set entrypoint = "plans-page" %}
{% set PAGE_TITLE = "Plans and pricing | Zulip" %}
{% set PAGE_DESCRIPTION = "Sign up for a managed cloud solution, or self-host our 100\x25 open-source software. Get started for free." %}
{% block content %}
{% if not is_self_hosted_realm %}
{% include 'zerver/marketing_nav.html' %}
{% endif %}
<div class="portico-pricing plans {% if is_self_hosted_realm %} showing-self-hosted {% else %} showing-cloud {% endif %}">
<div class="body-bg">
<div class="body-bg__layer"></div>
</div>
<div class="main">
{% include "corporate/pricing_model.html" %}
</div>
<!-- This is the subsection that displays with cloud plans. -->
<div class="additional-pricing-information cloud-additional-pricing">
<div id="cloud-sponsorships" class="discounts-section">
<header>
<h2>Sponsorship and discounts</h2>
<p>
We sponsor over 1500 organizations.
</p>
</header>
<div class="text-content">
<div class="discounted-community-plan">
<h3>Free Standard plan <a href="/help/zulip-cloud-billing#free-and-discounted-zulip-cloud-standard">eligibility</a>
</h3>
<ul>
<li>
<span><a href="/for/open-source/">Open-source projects</a></span>
</li>
<li>
<span><a href="/for/research/">Research</a> in an academic setting</span>
</li>
<li>
<span>Academic conferences and other non-profit <a href="/for/events/">events</a></span>
</li>
<li>
<span>Most small non-profit organizations</span>
</li>
<li>
<span>Most <a href="/for/communities/">communities</a> when the Free plan is not an option</span>
</li>
</ul>
</div>
<div class="discounted-business-plan">
<h3>Special <a href="/help/zulip-cloud-billing#free-and-discounted-zulip-cloud-standard">discounted pricing</a></h3>
<ul>
<li>
<span><a href="/for/education/#feature-pricing">Education</a></span>
</li>
<li>
<span>Organizations based in the developing world</span>
</li>
<li>
<span>Most large non-profit organizations</span>
</li>
<li>
<span>Many organizations with special circumstances that make regular pricing unaffordable</span>
</li>
</ul>
<a href="{{ sponsorship_url }}" class="button sponsorship-button">Apply here</a>
<p class="contact-note">
Wondering if your organization will qualify, but not
ready to request sponsorship yet? E-mail us at <a
href="mailto:sales@zulip.com">sales@zulip.com</a>.
</p>
</div>
</div>
</div>
<div class="questions-section">
<header>
<h2>Other questions?</h2>
<p>
See our <a href="/help/zulip-cloud-billing">billing help page</a> for
additional details.
</p>
</header>
<div class="text-content">
<ul>
<li>
<span><a href="/help/trying-out-zulip">How can I try out Zulip for free?</a></span>
</li>
<li>
<span><a href="/help/zulip-cloud-or-self-hosting">How do I choose between Zulip Cloud and self-hosting?</a></span>
</li>
<li>
<span><a href="/help/migrating-from-other-chat-tools">Can I import data from other chat tools?</a></span>
</li>
<li>
<span><a href="/help/zulip-cloud-billing#temporary-users-and-guests">Are there discounts for guest users?</a></span>
</li>
<li>
<span><a
href="/help/zulip-cloud-billing#how-does-having-10000-messages-of-search-history-on-zulip-cloud-free-work">How does limited search history on the Free plan work?</a></span>
</li>
</ul>
<p>
To discuss <b>enterprise pricing and services</b>, or for
any other questions, contact
<a href="mailto:sales@zulip.com">sales@zulip.com</a>.
</p>
</div>
</div>
</div>
<!-- This is the subsection that displays with self-hosted plans. -->
<div class="additional-pricing-information self-hosted-additional-pricing">
<div id="self-hosted-sponsorships" class="discounts-section">
<header>
<h2>Sponsorship and discounts</h2>
<p>
Contact <a href="mailto:sales@zulip.com">sales@zulip.com</a>
with any questions.
</p>
</header>
<div class="text-content">
<div class="discounted-community-plan">
<h3>Community plan <a href="/help/self-hosted-billing#free-community-plan">eligibility</a></h3>
<ul>
<li>
<span><a href="/for/open-source/">Open-source projects</a></span>
</li>
<li>
<span><a href="/for/research/">Research</a> in an academic setting</span>
</li>
<li>
<span>Academic conferences and other non-profit <a href="/for/events/">events</a></span>
</li>
<li>
<span>Many <a href="/for/education/">education</a> and non-profit organizations</span>
</li>
<li>
<span><a href="/for/communities/">Communities</a>
and personal organizations (clubs, groups of
friends, volunteer groups, etc.)</span>
</li>
</ul>
<div class="discounted-business-plan">
<h3>Special <a href="/help/self-hosted-billing#paid-plan-discounts">discounted pricing</a></h3>
<ul>
<li>
<span>Special <a href="/help/self-hosted-billing#education-pricing">education</a> and <a href="/help/self-hosted-billing#non-profit-pricing">non-profit</a> pricing</span>
</li>
<li>
<span>Organizations based in the developing world</span>
</li>
<li>
<span>Organizations where many users are not paid staff</span>
</li>
<li>
<span>Many organizations with special circumstances that make regular pricing unaffordable</span>
</li>
</ul>
{% if is_self_hosted_realm %}
<a href="{{ sponsorship_url }}" class="button sponsorship-button">Apply here</a>
{% else %}
<a href="/help/self-hosted-billing#free-community-plan" class="button sponsorship-button">
Log in to apply
</a>
{% endif %}
</div>
</div>
</div>
</div>
<div class="questions-section">
<header>
<h2>Other questions?</h2>
<p>
See our <a href="/help/self-hosted-billing">billing help page</a> for
additional details.
</p>
</header>
<div class="text-content">
<ul>
<li>
<span><a href="/help/trying-out-zulip">How can I try out Zulip for free?</a></span>
</li>
<li>
<span><a href="/help/zulip-cloud-or-self-hosting">How do I choose between Zulip Cloud and self-hosting?</a></span>
</li>
<li>
<span><a href="/help/self-hosted-billing#paid-plan-details-and-upgrades">How
do I upgrade to a paid plan?</a></span>
</li>
<li>
<span><a
href="/help/self-hosted-billing#free-community-plan">How do I apply for the Community plan?</a></span>
</li>
<li>
<span><a href="/help/migrating-from-other-chat-tools">Can I import data from other chat tools?</a></span>
</li>
</ul>
<p>
Contact <a href="mailto:sales@zulip.com">sales@zulip.com</a>
with further questions or to discuss Enterprise pricing.
</p>
</div>
</div>
</div>
<div id="feature-comparison-table">
{% include "corporate/comparison_table_integrated.html" %}
</div>
</div>
{% if not is_self_hosted_realm %}
{% include 'zerver/footer.html' %}
{% endif %}
{% endblock %}

View File

@@ -0,0 +1,64 @@
# Age of consent by country
Our [Terms of Service](/policies/terms) state, in part:
> “if you are a child under the age of thirteen (13) or below the minimum age of
> consent in your country, please do not attempt to register for or otherwise
> use the Services or send us any personal information”
As a convenience, we provide a reference below of age of consent by country where it
is higher than our minimal requirement of 13 years of age.
## Asia
* Hong Kong: 18
* South Korea: 14
* Vietnam: 16
## Caribbean
* Aruba: 16
* Caribbean Netherlands: 16
* Curaçao: 16
* Sint Maarten: 16
## Europe
* Austria: 14
* Bulgaria: 14
* Croatia: 16
* Cyprus: 14
* Czech Republic: 15
* France: 15
* Germany: 16
* Greece: 15
* Hungary: 16
* Ireland: 16
* Italy: 14
* Lithuania: 16
* Luxembourg: 16
* Netherlands: 16
* Poland: 16
* Portugal: 16
* Romania: 16
* Russia: 18
* San Marino: 16
* Serbia: 15
* Slovakia: 16
* Slovenia: 16
* Spain: 14
## Pacific
* Australia: 16
* Indonesia: 18
* Malaysia: 18
* Philippines: 18
## South America
* Brazil: 18
* Chile: 14
* Colombia: 14
* Peru: 14
* Venezuela: 14

View File

@@ -0,0 +1 @@
sidebar_index.md

View File

@@ -0,0 +1 @@
No such page.

View File

@@ -0,0 +1,207 @@
# Privacy Policy (prior to 2022)
!!! warn ""
Starting January 1, 2022, this policy is replaced by the updated
[Privacy Policy](/policies/privacy).
As you use our services, we want you to be clear how we’re using
information.
Our Privacy Policy explains:
* What information we collect and why we collect it.
* How we use that information.
## Information we collect
We collect information to provide better services to all of our users.
We collect information in two ways:
* **Information you give us.** For example, many of our services
require you to sign up for a Kandra Labs Zulip Account. When you do,
we’ll ask for personal information, like your name, email address, or
telephone number.
* **Information we get from your use of our services.** We may collect
information about the services that you use and how you use them, like
when you interact with our content. This information includes:
* **Device information.** We may collect device-specific
information (such as your hardware model, operating system
version, and unique device identifiers). Kandra Labs may associate
your device identifiers with your Kandra Labs Zulip Account.
* **Log information.** When you use our services or view content
provided by Kandra Labs, we may automatically collect and store
certain information in server logs. This may include:
* details of how you used our service.
* Internet protocol address.
* device event information such as crashes, system activity,
hardware settings, browser type, browser language, the date
and time of your request and referral URL.
* cookies that may uniquely identify your browser or your
Kandra Labs Zulip Account.
* **Unique application numbers.** Certain services include a
unique application number. This number and information about your
installation (for example, the operating system type and
application version number) may be sent to Kandra Labs when you
install or uninstall that service or when that service
periodically contacts our servers, such as for automatic
updates.
* **Local storage.** We may collect and store information
(including personal information) locally on your device using
mechanisms such as browser web storage (including HTML 5) and
application data caches.
* **Cookies and anonymous identifiers.** We use various
technologies to collect and store information when you visit our
Zulip service, and this may include sending one or more cookies or
anonymous identifiers to your device. We may also use cookies and
anonymous identifiers when you interact with services we offer to
our partners, such as Zulip features that may appear on other
sites.
## How we use information we collect
We use the information we collect from all of our services to provide,
maintain, protect and improve them, to develop new ones, and to protect Kandra Labs
and our users.
We may use the name you provide for your Kandra Labs Zulip Account across all of the
services we offer that require an account. In addition, we may replace
past names associated with your account so that you are represented
consistently across all our services. We may show other users your publicly
visible account information, such as your name.
When you contact Kandra Labs, we may keep a record of your communication to help
solve any issues you might be facing. We may use your email address to inform
you about our services, such as letting you know about upcoming changes or
improvements.
We use information collected from cookies and other technologies to improve
your user experience and the overall quality of our services.
We may combine personal information from one service with information,
including personal information, from other Kandra Labs services.
Kandra Labs processes personal information on our servers in many countries
around the world. We may process your personal information on a server located
outside the country where you live.
## Accessing and updating your personal information
Whenever you use our services, we aim to provide you with access to your
personal information. If that information is wrong, we strive to give you ways
to update it quickly or to delete it – unless we have to keep that information
for legitimate business or legal purposes. When updating your personal
information, we may ask you to verify your identity before we can act on your
request.
We may reject requests that are unreasonably repetitive, require
disproportionate technical effort (for example, developing a new system or
fundamentally changing an existing practice), risk the privacy of others, or
would be extremely impractical (for instance, requests concerning information
residing on backup tapes).
Where we can provide information access and correction, we will do so for
free, except where it would require a disproportionate effort. We aim to
maintain our services in a manner that protects information from accidental or
malicious destruction. Because of this, after you delete information from our
services, we may not immediately delete residual copies from our active servers
and may not remove information from our backup systems.
## Information we share
We do not share personal information with companies, organizations and
individuals outside of Kandra Labs unless one of the following circumstances
apply:
* **With your consent.** We will share personal information with
companies, organizations or individuals outside of Kandra Labs when we
have your consent to do so. We require opt-in consent for the sharing
of any sensitive personal information.
* **With domain administrators.** If your Kandra Labs Zulip Account is
managed for you by a domain administrator then your domain
administrator and resellers who provide user support to your
organization will have access to your account information (including
your email and other data). Your domain administrator may be able to:
* view statistics regarding your account.
* change your account password.
* suspend or terminate your account access.
* access or retain information stored as part of your account.
* receive your account information in order to satisfy applicable
law, regulation, legal process or enforceable governmental
request.
* restrict your ability to delete or edit information or settings.
Please refer to your domain administrator’s privacy policy for
more information.
* **For external processing.** We provide personal information to our
affiliates or other trusted businesses or persons to process it for
us, based on our instructions and in compliance with our Privacy
Policy.
* **For legal reasons.** We will share personal information with
companies, organizations or individuals outside of Kandra Labs if we,
in our sole discretion, determine that that access, use, preservation
or disclosure of the information is necessary to:
* meet any applicable law, regulation, legal process or
enforceable governmental request.
* enforce applicable Terms of Service, including investigation of
potential violations.
* detect, prevent, or otherwise address fraud, security or
technical issues.
* protect against harm to the rights, property or safety of Kandra
Labs, our users or the public as required or permitted by law.
We may share aggregated, non-personally identifiable information publicly
and with our partners. For example, we may share information publicly to show
trends about the general use of our services.
We may share personal information in connection with an acquisition, merger,
or sale of all or a substantial portion of our business, with or to another
company. In any such event, you will receive notice if your data is transferred
and becomes subject to a substantially different privacy policy.
## Application
Our Privacy Policy applies to all of the services offered by Kandra Labs, Inc.
and its affiliates, including services offered on other sites, but excludes
services that have separate privacy policies that do not incorporate this
Privacy Policy.
Our Privacy Policy does not apply to services offered by other companies or
individuals, sites that may include Zulip services, or other sites linked from
our services. Our Privacy Policy does not cover the information practices of
other companies and organizations who advertise our services, and who may use
cookies, pixel tags and other technologies to serve and offer relevant ads.
## Data Protection Officer
To communicate with our Data Protection Officer, please email
data-protection-officer@zulipchat.com.
## GDPR Compliance
See the article on [Zulip's GDPR compliance](/help/gdpr-compliance)
for details on how Kandra Labs and Zulip comply with the General Data
Protection Regulation.
## Changes
Our Privacy Policy may change from time to time. We will post the latest
version of our privacy policy on this page.
Last modified: May 7, 2021

View File

@@ -0,0 +1,619 @@
# Privacy Policy
**Effective date: January 1, 2022.** View [change history][changes-privacy].
[changes-privacy]: https://github.com/zulip/zulip/commits/main/templates/corporate/policies/privacy.md
At Kandra Labs, Inc. (“Zulip”), we take your privacy seriously. Please read this
Privacy Policy to learn how we treat your personal data. **By using or accessing
our Services in any manner, you acknowledge that you accept the practices and
policies outlined below, and you hereby consent that we will collect, use and
share your information as described in this Privacy Policy.**
Remember that your use of Zulip's Services is at all times subject to our [Terms
of Service](/policies/terms), which incorporates this Privacy Policy.
Any terms we use in this Policy without defining them have the definitions given
to them in the Terms of Service.
You may print a copy of this Privacy Policy by clicking
[here](javascript:window.print()).
## Summary of our Privacy Policy
We know, privacy policies are no fun. Here at Zulip, our goal is to help make
team collaboration and communication easier for you. In the course of providing
our Services, we will collect certain information about you, which is necessary
for us to best achieve that goal. Our intent is to only collect the information
we need to provide our Services to you. We will only share your data with third
parties to help make our Services a reality. We will not sell your personal
information to third parties.
## Privacy Policy Table of Contents
* [What this Privacy Policy Covers](#what-this-privacy-policy-covers)
* [Personal Data](#personal-data)
- [Categories of Personal Data We Collect](#categories-of-personal-data-we-collect)
- [Categories of Sources of Personal Data](#categories-of-sources-of-personal-data)
- [Our Commercial or Business Purposes for Collecting Personal Data](#our-commercial-or-business-purposes-for-collecting-personal-data)
* [How We Share Your Personal Data](#how-we-share-your-personal-data)
* [Tracking Tools and Opt-Out](#tracking-tools-and-opt-out)
* [Data Security and Retention](#data-security-and-retention)
* [Personal Data of Children](#personal-data-of-children)
* [California Resident Rights](#california-resident-rights-under-ccpa)
* [Other State Law Privacy Rights](#other-state-law-privacy-rights)
* [European Union Data Subject Rights](#european-union-data-subject-rights)
* [Changes to this Privacy Policy](#changes-to-this-privacy-policy)
* [Contact Information](#contact-information)
## What this Privacy Policy Covers
This Privacy Policy covers how we treat Personal Data that we gather when you
access or use our Services. “Personal Data” means any information that
identifies or relates to a particular individual and also includes information
referred to as “personally identifiable information” or “personal information”
under applicable data privacy laws, rules or regulations. This Privacy Policy
does not cover the practices of companies we don’t own or control, or people we
don’t manage.
## Personal Data
### Categories of Personal Data We Collect
This chart details the categories of Personal Data that we may collect and may
have collected from or about you over the past 12 months. Please note that many
of these categories of Personal Data will only be collected if you choose to
provide them to us:
| **Category of Personal Data** | **Examples of Personal Data We Collect** | **Categories of Third Parties With Whom We Share this Personal Data:** |
| ----------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Profile or Contact Data** | - Display name<br>- Email address<br>- Phone number<br>- Profile photo | - Service Providers<br>- Parties You Authorize, Access or Authenticate |
| **Payment Data** | - Payment card type<br>- Payment card number <br>- Billing name, address, phone number, and email | - This information is directly processed by our Service Providers (specifically our payment processing partner, currently Stripe, Inc.). We do not process or store your entire payment card number. |
| **Device/IP Data** | - IP address<br>- Host name<br>- Type of device/operating system/browser used to access the Services | - Service Providers<br>- Analytics Partners |
| **Web Analytics** | - Web page interactions<br>- Referring webpage/source through which you accessed the Services<br>- Statistics associated with the interaction between device or browser and the Services | - Service Providers<br>- Analytics Partners |
| **Social Network Data** | - Email address<br>- User name | - Service Providers |
| **Geolocation Data** | - IP-address-based coarse location information | - Service Providers<br>- Analytics Partners |
| **Other Identifying Information that You Voluntarily Choose to Provide** | - Identifying information in emails, letters, Zulip messages or support communications you send us<br>- Zulip messages, uploaded files, channel descriptions, and other content you provide using our Services (e.g., in a Zulip client) <br>- Values of custom profile fields configured by your Zulip Organization, where you might choose to enter your phone number, job title, birthday, or other biographical details. | - Service Providers<br>- Parties You Authorize, Access or Authenticate |
| **Other Identifying Information that Another User Chooses to Provide to You** | - Messages or other content that other Zulip users may send you. <br>- Messages or content that any Zulip Organization Administrator of a Zulip community that you may join may provide about you. | - Service Providers<br>- Parties You Authorize, Access or Authenticate |
### Categories of Sources of Personal Data
We collect Personal Data about you from the following categories of sources:
- **You**
- When you provide such information directly to us.
- When you create an account or use our interactive tools and Services.
- When you voluntarily provide information in free-form text
boxes through the Services or through responses to surveys
or questionnaires.
- When you send us an email or otherwise contact us.
- When you use the Services and such information is collected automatically.
- Through Cookies (defined in the “Tracking Tools and Opt-Out”
section below).
- If you download a Zulip application such as our mobile and
desktop apps, or interact with the Services over a network
using a web browser or other client, we may receive and
collect information about your device and your network
connection (e.g., your IP address).
- If you download a Zulip application such as our mobile and
desktop apps, or interact with the Services over a network
using a web browser or other client, we may receive and
collect information transmitted from your computing device
for the purpose of providing you the relevant Services, such
as information regarding when you are logged on and
available to receive updates or alert notices.
- **Third Parties**
- Vendors
- We may use analytics providers to analyze how you interact
and engage with the Services, or third parties may help us
provide you with customer support.
- When you submit Payment Data to our payment processing
partner Stripe, Inc. (“Stripe”).
- Social Networks
- If you provide your social network account credentials to us
or otherwise sign in to the Services through a third-party
site or service, some content and/or information in those
accounts may be transmitted into your account with us.
- Zulip integrations
- You or other Zulip users may connect an integration that
sends data from a third-party service into Zulip.
- Other Zulip users
- Other Zulip users may send messages or otherwise upload content containing Personal Data.
- Other Zulip users, such as Zulip Organization
Administrators, may import data into the Services via
Zulip’s API or data import tools.
- Please note that if you upload Personal Data about any other
Zulip User, the Rules of Use require that you acknowledge
and represent that you have authority to provide such
information on behalf of such user.
### Our Commercial or Business Purposes for Collecting Personal Data
- **Providing, Customizing and Improving the Services**
- Creating and managing your account or other user profiles.
- Processing orders or other transactions; billing.
- Providing you with the products, services, or information you request.
- Meeting or fulfilling the reason you provided the information to us.
- Providing support and assistance for the Services.
- Improving the Services, including testing, research, internal analytics,
and product development.
- Personalizing the Services, website content, and communications based on
your preferences.
- Doing fraud protection, security, abuse prevention, and debugging.
- Carrying out other business purposes stated when collecting your Personal
Data or as otherwise set forth in applicable data privacy laws, such as
the California Consumer Privacy Act (the “CCPA”).
- **Marketing the Services**
- Marketing and selling the Services.
- **Corresponding with You**
- Responding to correspondence that we receive from you, contacting you when
necessary or requested, and sending you information about Zulip or the
Services.
- Sending emails, mobile notifications, and other communications according
to your preferences or that display content that we think will interest
you.
- **Meeting Legal Requirements and Enforcing Legal Terms**
- Fulfilling our legal obligations under applicable law, regulation, court
order or other legal process, such as preventing, detecting and
investigating security incidents and potentially illegal or prohibited
activities.
- Protecting the rights, property or safety of you, Zulip or another party.
- Enforcing any agreements with you.
- Responding to claims that any posting or other content violates
third-party rights.
- Resolving disputes.
We will not collect additional categories of Personal Data or use the Personal
Data we collected for materially different, unrelated or incompatible purposes
without providing you notice.
### How We Share Your Personal Data
We disclose your Personal Data to the categories of service providers and other
parties listed in this section. We do not sell Personal Data.
- **Service Providers.** These parties help us provide the Services or perform
business functions on our behalf. They include:
- Hosting, technology and communications providers.
- Analytics providers.
- Security and fraud prevention consultants.
- Support and customer service vendors.
- Payment processors.
- Our payment processing partner Stripe, Inc. (“Stripe”) collects your
voluntarily-provided payment card information necessary to process
your payment.
- Please see Stripe’s terms of service and privacy policy for
information on its use and storage of your Personal Data.
- **Parties You Authorize, Access or Authenticate.** These parties could
include:
- Other Zulip users. When you send a message to another Zulip user or
otherwise provide data to Zulip, it may be shared with some or all other
users in that Zulip Organization. Please note that some Zulip channels [may
be accessible to the general
public](/help/channel-permissions#web-public-channels), in addition to the
channel’s current subscribers. For more information, please review our
[Terms of Service](/policies/terms).
- Zulip Organization Administrators may export all Zulip data for a Zulip
Organization for archival/backup purposes, to import the data into a
self-hosted Zulip server, or for any other purpose consistent with the
Terms of Service. Please note that password hashes are not included in
data exports.
- Other parties that you may authorize, such as third-party Zulip clients or
third-party services to which you provide Zulip credentials, such as your
Zulip API key.
- **Analytics Partners.** These parties provide analytics on web traffic or
usage of the Services. They include:
- Companies that track how users found or were referred to the Services.
- Companies that track how users interact with the Services.
- **Business Partners.** These parties may include:
- Businesses that provide third-party services that you or your Zulip
Organization have integrated with our Services.
### Legal Obligations
We may share any Personal Data that we collect with third parties in conjunction
with any of the activities set forth under “Meeting Legal Requirements and
Enforcing Legal Terms” in the “Our Commercial or Business Purposes for
Collecting Personal Data” section above.
### Business Transfers
All of your Personal Data that we collect may be transferred to a third party if
we undergo a merger, acquisition, bankruptcy or other transaction in which that
third party assumes control of our business (in whole or in part). Should one of
these events occur, we will make reasonable efforts to notify you before your
information becomes subject to different privacy and security policies and
practices.
### Data that is Not Personal Data
We may create aggregated, de-identified or anonymized data from the Personal
Data we collect, including by removing information that makes the data
personally identifiable to a particular user. We may use such aggregated,
de-identified or anonymized data and share it with third parties for our lawful
business purposes, including to analyze, build and improve the Services and
promote our business, provided that we will not share such data in a manner that
could identify you.
## Tracking Tools and Opt-Out
The Services use cookies and similar technologies to enable our servers to
recognize your web browser, tell us how and when you visit and use our Services,
analyze trends, learn about our user base and operate and improve our Services.
Cookies are small pieces of data – usually text files – placed on your computer,
tablet, phone or similar device when you use that device to access our Services.
We may also supplement the information we collect from you with information
received from third parties, including third parties that have placed their own
cookies on your device(s). Please note that because of our use of cookies, the
Services do not support the [“Do Not Track” setting](https://allaboutdnt.com/)
available in some browsers. We use the following types of cookies:
- **Essential Cookies.** Essential cookies are required for providing you with
features or services that you have requested. For example, certain cookies
enable you to log into secure areas of our Services. Disabling these cookies
may make certain features and services unavailable.
- **Performance/Analytical Cookies.** Performance/Analytical cookies allow us to
understand how visitors use our Services. They do this by collecting
information about the number of visitors to the Services, what pages visitors
view on our Services and how long visitors are viewing pages on the Services.
Performance/Analytical cookies also help us measure the performance of our
advertising campaigns in order to help us improve our campaigns and the
Services’ content for those who engage with our advertising. For example,
Google LLC (“Google”) uses cookies in connection with its Google Analytics
services. Google’s ability to use and share information collected by Google
Analytics about your visits to the Services is subject to the Google Analytics
Terms of Service and the Google Privacy Policy. You have the option to opt-out
of Google’s use of cookies by visiting the Google advertising opt-out page at
<https://www.google.com/privacy_ads.html> or the Google Analytics Opt-out
Browser Add-on at <https://tools.google.com/dlpage/gaoptout/>.
You can decide whether or not to accept cookies through your internet browser’s
settings. Most browsers have an option for turning off the cookie feature, which
will prevent your browser from accepting new cookies, as well as (depending on
the sophistication of your browser software) allow you to decide on acceptance
of each new cookie in a variety of ways. You can also delete all cookies that
are already on your device. If you do this, however, you may have to manually
adjust some preferences every time you visit our website and some of the
Services and functionalities may not work.
To explore what cookie settings are available to you, look in the “preferences”
or “options” section of your browser’s menu. To find out more information about
cookies, including information about how to manage and delete cookies, please
visit <http://www.allaboutcookies.org/> or
<https://ico.org.uk/for-the-public/online/cookies/> if you are located in the
European Union.
## Data Security and Retention
We seek to protect your Personal Data from unauthorized access, use and
disclosure using appropriate physical, technical, organizational and
administrative security measures based on the type of Personal Data and how we
are processing that data. You should also help protect your data by
appropriately selecting and protecting your password and/or other sign-on
mechanism; limiting access to your computer or device and browser; and signing
off after you have finished accessing your account. Although we work to protect
the security of your account and other data that we hold in our records, please
be aware that no method of transmitting data over the internet or storing data
is completely secure.
We retain Personal Data about you for as long as you have an open account with
us or as otherwise necessary to provide you with our Services. In some cases we
retain Personal Data for longer, if doing so is necessary to comply with our
legal obligations, resolve disputes or collect fees owed, or is otherwise
permitted or required by applicable law, rule or regulation. We may further
retain information in an anonymous or aggregated form where that information
would not identify you personally.
## Personal Data of Children
As noted in the Terms of Service, we do not knowingly collect or solicit
personally identifiable information from children under thirteen (13) years of
age and children below the [minimum age of consent in their
country](/policies/age-of-consent); if you are a
child under the age of thirteen (13) or below the minimum age of consent in your
country, please do not attempt to register for or otherwise use the Services or
send us any personal information. If we learn we have collected personal
information from a child under thirteen (13) years of age or below the minimum
age of consent in their country, we will delete that information as quickly as
possible. If you believe that a child under the age of thirteen (13) or below
the minimum age of consent in their country may have provided us personal
information, please contact us at [privacy@zulip.com](mailto:privacy@zulip.com).
## California Resident Rights under CCPA
If you are a California resident, you have the rights set forth in this section.
Please see the “Exercising Your Rights” section below for instructions regarding
how to exercise these rights. Please note that we may process Personal Data of
our customers’ end users or employees in connection with our provision of
certain services to our customers. If we are processing your Personal Data as a
service provider, you should contact the entity that collected your Personal
Data in the first instance to address your rights with respect to such data.
If there are any conflicts between this section and any other
provision of this Privacy Policy and you are a California resident,
the portion that is more protective of Personal Data shall control to
the extent of such conflict. If you have any questions about this
section or whether any of the following rights apply to you, please
contact us at [privacy@zulip.com](mailto:privacy@zulip.com).
### Access
You have the right to request certain information about our collection, use, and
disclosure of your Personal Data over the past 12 months. In response, we will
provide you with the following information:
- The categories of Personal Data that we have collected about you.
- The categories of sources from which that Personal Data was collected.
- The business or commercial purpose for collecting, using, or disclosing your
Personal Data.
- The categories of third parties with whom we have shared your Personal Data,
along with a reminder that we do not sell Personal Data.
- The specific pieces of Personal Data that we have collected about you.
### Deletion
You have the right to request that we delete the Personal Data that we have
collected about you. Under the CCPA, this right is subject to certain
exceptions: for example, we may need to retain your Personal Data to provide you
with the Services or complete a transaction or other action you have requested.
If your deletion request is subject to one of these exceptions, we may deny your
deletion request. Please note that we will not be able to delete messages or
other content that you have sent to another Zulip user. If you request deletion
of your account, all such messages and content will be associated with a
“Deleted User.” In addition, please note that anyone that you send messages or
other content to (or who may otherwise have access to such messages or content
through a Zulip Organization or channel) may have downloaded or copied such
messages or content. Zulip will not be able to delete such downloaded or copied
messages or content.
### Exercising Your Rights
To exercise the rights described above, you or your Authorized Agent (defined
below) must send us a request that (1) provides sufficient information to allow
us to verify that you are the person about whom we have collected Personal Data,
which may include proof of ownership of the email address associated with your
Zulip account, and (2) describes your request in sufficient detail to allow us
to understand, evaluate and respond to it. Each request that meets both of these
criteria will be considered a “Valid Request.” We may not respond to requests
that do not meet these criteria. We will only use Personal Data provided in a
Valid Request to verify your identity and complete your request. You do not need
an account to submit a Valid Request. We will work to respond to your Valid
Request within 45 days of receipt. We will not charge you a fee for making a
Valid Request unless your Valid Request(s) is excessive, repetitive or
manifestly unfounded. If we determine that your Valid Request warrants a fee, we
will notify you of the fee and explain that decision before completing your
request. You may submit a Valid Request using the following methods:
- Email us at: [privacy@zulip.com](mailto:privacy@zulip.com).
- Complete this form on our website: <https://zulip.com/support>.
You may also authorize an agent (an “Authorized Agent”) to exercise your rights
on your behalf. To do this, you must provide your Authorized Agent with written
permission to exercise your rights on your behalf, and we may require you to
confirm to us that you did so.
### Personal Data Sales Opt-Out and Opt-In
We will not sell your Personal Data, and have not done so over the last 12
months.
### We Will Not Discriminate Against You for Exercising Your Rights Under the CCPA
We will not discriminate against you for exercising your rights under the CCPA.
We will not deny you our goods or services, charge you different prices or
rates, or provide you a lower quality of goods and services if you exercise your
rights under the CCPA.
## Other State Law Privacy Rights
### California Resident Rights
Under California Civil Code Sections 1798.83-1798.84, California residents are
entitled to contact us to prevent disclosure of Personal Data to third parties
for such third parties’ direct marketing purposes In order to submit such a
request, please contact us at [privacy@zulip.com](mailto:privacy@zulip.com).
Zulip does not disclose Personal Data to any third parties for the purpose of
such parties’ direct marketing. However, please note that your Zulip display
name, email address, avatar, and other profile information may be shared with
other users within any Zulip Organization that you join. You can confirm or
change these settings in your
[profile](/accounts/go/?next=%23settings%2Fprofile), and [account and
privacy](/accounts/go/?next=%23settings%2Faccount-and-privacy) settings.
### Nevada Resident Rights
As noted above, we do not sell Personal Data.
If you are a resident of Nevada, you have the right to opt-out of the
sale of certain Personal Data to third parties who intend to license
or sell that Personal Data. You can exercise this right by contacting
us at [privacy@zulip.com](mailto:privacy@zulip.com) with the subject
line “Nevada Do Not Sell Request” and providing us with your name and
the email address associated with your account.
## European Union Data Subject Rights
### EU Residents
If you are a resident of the European Union (“EU”), United Kingdom,
Lichtenstein, Norway or Iceland, you may have additional rights under the EU
General Data Protection Regulation (the “GDPR”) with respect to your Personal
Data, as outlined below.
For this section, we use the terms “Personal Data” and “processing” as they are
defined in the GDPR, but “Personal Data” generally means information that can be
used to individually identify a person, and “processing” generally covers
actions that can be performed in connection with data such as collection, use,
storage and disclosure. Zulip will be the controller of your Personal Data
processed in connection with the Services.
If there are any conflicts between this section and any other
provision of this Privacy Policy, the provision or portion that is
more protective of Personal Data shall control to the extent of such
conflict. If you have any questions about this section or whether any
of the following applies to you, please contact us at
[privacy@zulip.com](mailto:privacy@zulip.com). Note that we may also
process Personal Data of our customers’ end users or employees in
connection with our provision of certain services to customers, in
which case we are the processor of Personal Data. If we are the
processor of your Personal Data (i.e., not the controller), please
contact the controller party in the first instance to address your
rights with respect to such data.
### Personal Data We Collect
The “Categories of Personal Data We Collect” section above details the Personal
Data that we collect from you.
### Personal Data Use and Processing Grounds
The “Our Commercial or Business Purposes for Collecting Personal Data” section
above explains how we use your Personal Data.
We will only process your Personal Data if we have a lawful basis for doing so.
Lawful bases for processing include consent, contractual necessity and our
“legitimate interests” or the legitimate interest of others, as further
described below.
- **Contractual Necessity**: We process the following categories of Personal
Data as a matter of “contractual necessity”, meaning that we need to process
the data in order to carry out our obligations under the Terms of Service,
including providing the Services. When we process data due to contractual
necessity, failure to process such Personal Data will result in your or other
Zulip users’ inability to use some or all portions of the Services that
require such data.
- Profile or Contact Data
- Payment Data
- Other Identifying Information You Voluntarily Choose to Provide
- Other Identifying Information Another User Chooses to Provide to You
- **Legitimate Interest**: We process the following categories of Personal Data
when we believe it furthers the legitimate interest of us or third parties:
- Device/IP Data
- Web Analytics
- Geolocation Data
- Other Identifying Information Another User Chooses to Provide to You
- We may also de-identify or anonymize Personal Data to further our
legitimate interests. Examples of these legitimate interests include:
- Providing, customizing and improving the Services
- Marketing the Services
- Corresponding with you
- Meeting legal requirements and enforcing legal terms
- Completing corporate transactions
- **Consent**: In some cases, we process Personal Data based on the consent you
expressly grant to us at the time we collect such data. When we process
Personal Data based on your consent, it will be expressly indicated to you at
the point and time of collection. This information may include:
- Social Network Data
- **Other Processing Grounds**: From time to time we may also need to process
Personal Data to comply with a legal obligation, if it is necessary to protect
the vital interests of you or other data subjects, or if it is necessary for a
task carried out in the public interest.
### Sharing Personal Data
The “How We Share Your Personal Data” section above details how we share your
Personal Data with third parties.
### EU and UK Data Subject Rights
You have certain rights with respect to your Personal Data, including
those set forth below. For more information about these rights, or to
submit a request, please email us at
[privacy@zulip.com](mailto:privacy@zulip.com). Please note that in
some circumstances, we may not be able to fully comply with your
request, such as if it is frivolous or extremely impractical, if it
jeopardizes the rights of others, or if it is not required by law, but
in those circumstances, we will still respond to notify you of such a
decision. In some cases, we may also need you to provide us with
additional information, which may include Personal Data, if necessary
to verify your identity and the nature of your request.
- **Access**: You can request more information about the Personal Data we hold
about you and request a copy of such Personal Data. You can also access
certain of your Personal Data by logging on to your account.
- **Rectification**: If you believe that any Personal Data we are holding about
you is incorrect or incomplete, you can request that we correct or supplement
such data. You can also correct some of this information directly by logging
on to your account in the Zulip web application.
- **Erasure**: You can request that we erase some or all of your Personal Data
from our systems. Please note that we will not be able to delete messages or
other content that you have sent to another Zulip user. If you request
deletion of your account, all such messages and content will be associated
with a “Deleted User.” In addition, please note that anyone that you send
messages or other content to (or who may otherwise have access to such
messages or content through a Zulip Organization or channel), may have
downloaded or copied such messages or content. Zulip will not be able to
delete such downloaded or copied messages or content.
- **Withdrawal of Consent**: If we are processing your Personal Data based on
your consent (as indicated at the time of collection of such data), you have
the right to withdraw your consent at any time. Please note, however, that if
you exercise this right, you may have to then provide express consent on a
case-by-case basis for the use or disclosure of certain of your Personal Data,
if such use or disclosure is necessary to enable you to utilize some or all of
our Services.
- **Portability**: You can ask for a copy of your Personal Data in a
machine-readable format. You can also request that we transmit the data to
another controller where technically feasible.
- **Objection**: You can contact us to let us know that you object to the
further use or disclosure of your Personal Data for certain purposes, such as
for direct marketing purposes.
- **Restriction of Processing**: You can ask us to restrict further processing
of your Personal Data.
- **Right to File Complaint**: You have the right to lodge a complaint about
Zulip's practices with respect to your Personal Data with the supervisory
authority of your country or EU Member State. A list of Supervisory
Authorities is available here:
<https://edpb.europa.eu/about-edpb/board/members_en>.
### Transfers of Personal Data
The Services are hosted and operated in the United States (“U.S.”) through Zulip
and its service providers, and if you do not reside in the U.S., laws in the
U.S. may differ from the laws where you reside. By using the Services, you
acknowledge that any Personal Data about you, regardless of whether provided by
you or obtained from a third party, is being provided to Zulip in the U.S. and
will be hosted on U.S. servers, and you authorize Zulip to transfer, store and
process your information to and in the U.S., and possibly other countries.
## Changes to this Privacy Policy
We’re constantly trying to improve our Services, so we may need to change this
Privacy Policy from time to time. When we do so, we will alert you to any such
changes by placing a notice on the Zulip website, by sending you an email and/or
by some other means. Please note that if you’ve opted not to receive legal
notice emails from us (or you haven’t provided us with your email address),
those legal notices will still govern your use of the Services, and you are
still responsible for reading and understanding them. We will generally aim to
provide such notice about Privacy Policy changes at least 14 days in advance of
the new Privacy Policy taking effect. If you use the Services after any changes
to the Privacy Policy have come into effect, that means you agree to all of the
changes. Use of information we collect is subject to the Privacy Policy in
effect at the time such information is collected.
## Contact Information
If you have any questions or comments about this Privacy Policy, the ways in
which we collect and use your Personal Data, or your choices and rights
regarding such collection and use, please do not hesitate to contact us at:
- <https://zulip.com/support>
- [privacy@zulip.com](mailto:privacy@zulip.com)
- Kandra Labs, Inc., 584 Castro St #3175, San Francisco, CA 94114
If you are located in the European Union or United Kingdom, you may use our
contact information above, or contact our European-based representative:
- European Union Representative: George Barry, 4 St Christopher's Rd, Montenotte, Cork, T23 E9TR, Ireland
- UK Representative: S. Alec Lawton, Graigwen, Plasycoed road, Pontypool Torfaen, NP4 6QH, UK

View File

@@ -0,0 +1,142 @@
# Zulip Rules of Use
**Last updated: December 13, 2021.** View [change history][changes-rules].
[changes-rules]: https://github.com/zulip/zulip/commits/main/templates/corporate/policies/rules.md
Zulip is designed to help thoughtful people work on difficult problems together,
whether they work from a shared office or from all over the world. Zulip offers
an ideal platform for businesses, as well as communities of all types, including
open-source projects, research collaborations, volunteer organizations, and
other groups of people who share a common pursuit.
This document lays out rules of appropriate behavior that apply to all Zulip
organizations. Owners of Zulip organizations are expected to manage their
organizations to help avoid problematic behavior. Open organizations are
additionally encouraged to write a Code of Conduct and link to it from their
[organization profile](/help/create-your-organization-profile), to provide
further guidance on expected behavior in their communities.
If you encounter a Zulip message or behavior by a Zulip user that appears to
violate these rules, please [report it to us](/support/). We aim to be thoughtful
and judicious in handling reported content. Depending on the severity and scope
of the problem, our response may include issuing a warning, removing the
content, deactivating user accounts or organizations, and/or reporting the
behavior to law enforcement. Capitalized terms used below but not defined in
these rules have the meaning set forth in the [Terms of Service](/policies/terms).
## Safety
You may not engage in, promote, organize, incite, induce, encourage, or support
any of the following:
- **Violence, including terrorism, violent extremism, animal cruelty,
suicide, and self-harm**.
- **Bullying, abuse, or harassment** of any individual or group of people. This
includes threatening anyone or wishing or hoping that someone experiences
physical harm.
- **Distribution of content that violates the privacy rights of any other
person.** This includes personal information about any other person that you
do not have permission to share (“doxxing”).
- **Hateful content.** You may not attack, threaten, or harass any individual or
group on the basis of attributes such as their race, ethnicity, national
origin, caste, religious affiliation, sexual orientation, gender or gender
identity, age, disability, or disease.
- **Harmful misinformation.** This includes misinformation that has the
potential to cause imminent physical harm, or that is defamatory. Deceptively
sharing synthetic or manipulated media is also prohibited.
- **Human trafficking and exploitation, including child sexual exploitation.**
This includes sharing content or links which depict minors in a pornographic,
sexually suggestive, or violent manner, and includes illustrated or digitally
altered pornography that depicts minors. If we become aware of apparent child
exploitation, we will report it to the National Center for Missing and
Exploited Children (NCMEC).
- **Sexually explicit content and pornography as well as commercial sexual
services.** This includes requesting, offering, or asking for rates for
sexual or escort services.
- **Fraud and deception**, including financial scams such as fake loans,
multi-level marketing schemes, get-rich-quick schemes, money-laundering
schemes, gambling scams, insurance scams, and “money mule” businesses.
- **Distribution of content that violates the intellectual property rights,
privacy rights, or other rights of anyone else (including Zulip).**
- **Cybercrime, hacking, cracking, or distribution of pirated software or stolen
accounts.**
- **The sale of banned or dangerous goods** such as weapons, drugs, or other
illegal substances. Attempting to provide material support or resources (or to
conceal or disguise the nature, location, source, or ownership of material
support or resources) to any organization(s) designated by the United States
government as a foreign terrorist organization pursuant to section 219 of the
Immigration and Nationality Act or other laws and regulations concerning
national security, defense or terrorism is strictly prohibited.
- **Any other illegal behavior.** Activities that violate any applicable law,
including, but not limited to, all intellectual property, data, privacy, and
export control laws and regulations promulgated by any government agencies,
including, but not limited to, the U.S. Securities and Exchange Commission,
and any rules of any national and other securities exchanges, are prohibited.
## Security
- **Do not attempt to compromise the security of other users of the Services,**
such as attempting to obtain the password or other security information of any
other user, or to gain access to their account**.**
- **Do not attempt to compromise the security of the Services themselves.** This
includes violating the security of any computer network or system, cracking
any passwords or encrypted communications, or compromising, breaking, or
circumventing any of the technical processes or security measures associated
with the Services. Do not attempt to test for vulnerabilities in our systems
or networks without explicit prior consent.
- **Do not exceed or circumvent rate limits,** run automated processes that
interfere with the proper working of the Services, place an unreasonable load
on the Services’ infrastructure, or otherwise cause excess or abusive usage.
- **Do not permit any third party to access your account** or the authentication
credentials you use to access the Services. This includes selling, reselling,
sublicensing, or time-sharing Zulip accounts.
- **Do not share viruses or malware**, or attempt to hack, phish, or DDoS
others.
- **Do not automatically create or access accounts** for the Services (a.k.a.
“scraping”) by means other than our publicly supported interfaces. If you wish
to embed Zulip as the chat backend for your own product, you must self-host
your own Zulip server, rather than using Zulip Cloud.
## Spam and deception
- **Do not send spam**, including unsolicited communications, promotions, or
advertisements.
- **Do not target other accounts with notification spam** by mentioning someone
or sending them direct messages that they do not want.
- **Do not use other accounts to contact a user who has muted you** or create a
new account in an organization that has deactivated your account for abusive
behavior**.** Do not circumvent features we offer to enable users to protect
themselves from abusive behavior.
- **Do not impersonate someone else** (individuals, groups, organizations, Zulip
staff or organization administrators, or other users) in a manner that is
intended to or does mislead, confuse, or deceive anyone, such as “spoofing” or
“phishing”.
- **Do not submit false reports** of abusive behavior by other users.
- **Do not contact users outside of the Services** using contact information
obtained from the Services (including email addresses) without their consent.
Do not create or distribute mailing lists or other collections of contact or
user profile information for use outside of the Services.
## Third-party clients
Zulip is 100% open-source software, and we welcome third-party clients that work
with Zulip’s API or that allow Zulip users to connect to Zulip as well as other
chat services from a single client. Developers of third-party clients marketed
as working with the Zulip Cloud service are required to follow these additional
rules to protect our users:
- **Third-party clients must comply with global privacy laws**, including GDPR and
CCPA, in their processing of any user data, including telemetry and
error-reporting data.
- **Use security best practices** to protect Zulip users who use your client. For
example, if your client uses the Electron browser framework, you should
implement the [Electron Security
guidelines](https://www.electronjs.org/docs/latest/tutorial/security).
Projects that are early in development and potentially not yet secure must be
advertised as insecure and not intended for general use.
- **Do not sell data** collected from Zulip users to third parties.
- **Do not sell third-party advertisements** for display within a Zulip client.
If you have any questions about the Zulip Rules of Use or would like to report a
violation, please contact us at [support@zulip.com](mailto:support@zulip.com).

View File

@@ -0,0 +1,13 @@
## Policies
* [Index](/policies/)
* [Terms of Service](/policies/terms)
* [Privacy Policy](/policies/privacy)
* [Rules of Use](/policies/rules)
* [Age of consent](/policies/age-of-consent)
* [Data Processing Addendum](/static/images/policies/Zulip-Data-Processing-Addendum.pdf)
* [Subprocessors for Zulip Cloud](/policies/subprocessors)
## Archive
* [Terms of Service in 2021](/policies/terms-before-2022)
* [Privacy Policy in 2021](/policies/privacy-before-2022)

View File

@@ -0,0 +1,38 @@
# Subprocessors for Zulip Cloud
[Learn about GDPR compliance with Zulip.](/help/gdpr-compliance)
To support delivery of our Services, Kandra Labs, Inc. may engage and
use data processors with access to certain Customer Data (each, a
"Subprocessor"). This section provides important information about
the identity, location and role of each Subprocessor. Terms used on
this page but not defined have the meaning set forth in Zulip's Terms
of Service or superseding written agreement between Customer and
Kandra Labs (the "Agreement").
### Third parties
Zulip currently uses third party Subprocessors to provide
infrastructure services, and to help us provide customer support and
email notifications. Prior to engaging any third party Subprocessor,
we perform diligence to evaluate their privacy, security and
confidentiality practices.
**Subprocessors**
Zulip Cloud may use the following Subprocessors to host Customer Data
or provide infrastructure that helps with delivery and operation of
our Services:
* [Amazon Web Services, Inc.](https://aws.amazon.com/compliance/gdpr-center/)
for cloud infrastructure.
* [DigitalOcean, LLC](https://www.digitalocean.com/security/gdpr/)
for cloud infrastructure.
* [FrontApp, Inc.](https://community.frontapp.com/t/x1p4mw/is-front-compliant-with-gdpr)
for customer support.
* [Functional Software, Inc. d/b/a Sentry](https://blog.sentry.io/2018/03/14/gdpr-sentry-and-you)
for error tracking.
* [Google LLC](https://privacy.google.com/businesses/compliance/) for
cloud infrastructure and services.
* [Mailgun Technologies, Inc.](https://www.mailgun.com/gdpr) for email processing.
* [Stripe, Inc.](https://stripe.com/guides/general-data-protection-regulation) for payment processing.

View File

@@ -0,0 +1,249 @@
# Terms of Service for the Zulip service by Kandra Labs (prior to 2022)
!!! warn ""
Starting January 1, 2022, these terms are replaced by the updated
[Terms of Service](/policies/terms).
### Welcome to Zulip!
Thanks for using our products and services ("Services"). The Services are
provided by Kandra Labs, Inc. ("Kandra Labs"), located at
450 Townsend Street, San Francisco, CA 94107, United States.
By using our Services, you are agreeing to these terms. Please read them
carefully.
The Services are not intended for use by you if you are under 13 years of
age. By agreeing to these terms, you are representing to us that you are over
13.
### Using our Services
You must follow any policies made available to you within the Services.
Don't misuse our Services. For example, don't interfere with our Services or
try to access them using a method other than the interface and the instructions
that we provide. You may use our Services only as permitted by law, including
applicable export and re-export control laws and regulations. We may suspend or
stop providing our Services to you if you do not comply with our terms or
policies or if we are investigating suspected misconduct.
Using our Services does not give you ownership of any intellectual property
rights in our Services or the content you access. You may not use content from
our Services unless you obtain permission from its owner or are otherwise
permitted by law. These terms do not grant you the right to use any branding or
logos used in our Services. Don't remove, obscure, or alter any legal notices
displayed in or along with our Services.
Our Services display some content that does not belong to Kandra Labs. This content is the
sole responsibility of the entity that makes it available. We may review
content to determine whether it is illegal or violates our policies, and we may
remove or refuse to display content that we reasonably believe violates our
policies or the law. But that does not necessarily mean that we review content,
so please don't assume that we do.
In connection with your use of the Services, we may send you service
announcements, administrative messages, and other information. You may opt out
of some of those communications.
### Your Kandra Labs Zulip Account
You may need a Kandra Labs Zulip Account ("Account") in order to use some of our Services. You may
create your own Account, or your Account may be assigned to you
by an administrator, such as your employer or educational institution. If you
are using an Account assigned to you by an administrator, different or
additional terms may apply and your administrator may be able to access or
disable your account.
If you learn of any unauthorized use of your password or account, contact
[support@zulipchat.com](mailto:support@zulipchat.com).
### Privacy and Copyright Protection
The Kandra Labs [privacy policy](/policies/privacy) explains how we treat your
personal data and protect your privacy when you use our Services. By using our
Services, you agree that Kandra Labs can use such data in accordance with our
privacy policy.
We respond to notices of alleged copyright infringement and terminate
accounts of repeat infringers according to the process set out in the U.S.
Digital Millennium Copyright Act.
Our designated agent for notice of alleged copyright infringement on the
Services is:
> Copyright Agent
> Kandra Labs, Inc.
> 450 Townsend Street
> San Francisco, CA 94107
> [copyright@zulipchat.com](mailto:copyright@zulipchat.com)
### Your Content in our Services
Some of our Services allow you to submit content. You retain ownership of
any intellectual property rights that you hold in that content. In short, what
belongs to you stays yours.
When you upload or otherwise submit content to our Services, you give Kandra Labs
(and those we work with) a worldwide license to use, host, store, reproduce,
modify, create derivative works (such as those resulting from translations,
adaptations or other changes we make so that your content works better with our
Services), communicate, publish, perform, display and distribute such content.
The rights you grant in this license are for the limited purpose of operating
and improving our Services, and to develop new ones. This license continues
even if you stop using our Services (for example, so that we can deliver a
message that you sent to another Account before you stopped using our
Services). Some Services may offer you ways to access and remove content that
has been provided to that Service. Also, in some of our Services, there may be
terms or settings that narrow the scope of our use of the content submitted in
those Services. Make sure you have the necessary rights to grant us this
license for any content that you submit to our Services. If you use the
Services to share content with others, anyone you've shared content with
(including the general public, in certain circumstances) may have access to the
content.
In order to provide the Services, our servers save a record of the messages
received by each Account (the "Received Message Information" for the
account). If you are using our Services on behalf of a business and a
representative of that business sends [data@zulipchat.com](mailto:data@zulipchat.com)
a request to delete all of your business' accounts with us, then within a
commercially reasonable period of time, we will close all of your business'
accounts with us and delete the Received Message Information for each such
account by removing pointers to the information on our active servers and
overwriting it over time. Notwithstanding the foregoing, deleting the Received
Message Information for your business' accounts will not require deleting any
information about messages that were sent or received by any Accounts that
are not one of your business' accounts with us (such as system-wide announcement
messages or any messages corresponding with the Kandra Labs support team).
You can find more information about how Kandra Labs uses and stores content in
the privacy policy. If you submit feedback or suggestions about our Services,
we may use your feedback or suggestions without obligation to you.
### About Software in our Services
When a Service requires or includes downloadable software, this software may
update automatically on your device once a new version or feature is available.
Some Services may let you adjust your automatic update settings.
Kandra Labs gives you a personal, worldwide, royalty-free, non-assignable and
non-exclusive license to use the software provided to you by Kandra Labs as part of
the Services. This license is for the sole purpose of enabling you to use and
enjoy the benefit of the Services as provided by Kandra Labs, in the manner
permitted by these terms. You may not copy, modify, distribute, sell, or lease
any part of our Services or included software, nor may you reverse engineer or
attempt to extract the source code of that software, unless laws prohibit those
restrictions or you have our written permission.
Some software used in our Services may be offered under an open source
license that we will make available to you. There may be provisions in the
open source license that expressly override some of these terms.
### Modifying and Terminating our Services
We are constantly changing and improving our Services. We may add or remove
functionalities or features, and we may suspend or stop a Service
altogether.
You can stop using our Services at any time, although we'll be sorry to see
you go. Kandra Labs may also stop providing Services to you, or add or create new
limits to our Services at any time.
We believe that you own your data and preserving your access to such data is
important. If we discontinue a Service, we will, if it is practical in our sole
discretion, give you reasonable advance notice and a chance to get information
out of that Service.
### Our Warranties and Disclaimers
We hope that you will enjoy using our Services, but there are certain things
that we don't promise about our Services.
OTHER THAN AS EXPRESSLY SET OUT IN THESE TERMS, NEITHER KANDRA LABS NOR ITS
SUPPLIERS OR DISTRIBUTORS MAKE ANY SPECIFIC PROMISES ABOUT THE SERVICES. FOR
EXAMPLE, WE DON'T MAKE ANY COMMITMENTS ABOUT THE CONTENT WITHIN THE SERVICES,
THE SPECIFIC FUNCTION OF THE SERVICES, OR THEIR RELIABILITY, AVAILABILITY, OR
ABILITY TO MEET YOUR NEEDS. WE PROVIDE THE SERVICES "AS IS".
SOME JURISDICTIONS PROVIDE FOR CERTAIN WARRANTIES, LIKE THE IMPLIED WARRANTY
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. TO
THE EXTENT PERMITTED BY LAW, WE EXCLUDE ALL WARRANTIES.
### Liability for our Services
WHEN PERMITTED BY LAW, KANDRA LABS, AND KANDRA LABS'S SUPPLIERS AND DISTRIBUTORS, WILL
NOT BE RESPONSIBLE FOR LOST PROFITS, REVENUES, OR DATA, FINANCIAL LOSSES OR
INDIRECT, SPECIAL, CONSEQUENTIAL, EXEMPLARY, OR PUNITIVE DAMAGES.
TO THE EXTENT PERMITTED BY LAW, THE TOTAL LIABILITY OF KANDRA LABS, AND ITS
SUPPLIERS AND DISTRIBUTORS, FOR ANY CLAIM UNDER THESE TERMS, INCLUDING FOR ANY
IMPLIED WARRANTIES, IS LIMITED TO THE GREATER OF FIVE DOLLARS ($5) OR THE
AMOUNT PAID BY YOU TO KANDRA LABS FOR THE PAST THREE MONTHS OF THE SERVICES IN
QUESTION.
IN ALL CASES, KANDRA LABS, AND ITS SUPPLIERS AND DISTRIBUTORS, WILL NOT BE LIABLE
FOR ANY LOSS OR DAMAGE THAT IS NOT REASONABLY FORESEEABLE.
### Business uses of our Services
If you are using our Services on behalf of a business, that business accepts
these terms. It will hold harmless and indemnify Kandra Labs and its affiliates,
officers, agents, and employees from any claim, suit or action arising from or
related to the use of the Services or violation of these terms, including any
liability or expense arising from claims, losses, damages, suits, judgments,
litigation costs and attorneys' fees.
You agree that we, in our sole discretion, may use your trade names,
trademarks, service marks, logos, domain names and other distinctive brand
features in presentations, marketing materials, customer lists, financial
reports and Web site listings (including links to your website) for the purpose
of advertising or publicizing your use of our products or services.
### Export Compliance
If you are located outside of the United States or are not a U.S. person,
you certify that you do not reside in Cuba, Iran, North Korea, Sudan, or Syria,
and you certify the following: "We certify that this beta test software will
only be used for beta testing purposes, and will not be rented, leased, sold,
sublicensed, assigned, or otherwise transferred. Further, we certify that we
will not transfer or export any product, process, or service that is the direct
product of the beta test software."
### About these Terms
If it turns out that a particular term is not enforceable, this will not
affect any other terms.
If you do not comply with these terms, and we don't take action right away,
this doesn't mean that we are giving up any rights that we may have (such as
taking action in the future).
These terms control the relationship between Kandra Labs and you. They do not
create any third party beneficiary rights.
The laws of California, U.S.A., excluding California's conflict of
laws rules, will apply to any disputes arising out of or relating to these
terms or the Services. All claims arising out of or relating to these terms or
the Services will be litigated exclusively in the applicable federal or state
courts of California, and you and Kandra Labs consent to personal jurisdiction in
those courts.
Kandra Labs reserves the right to amend or modify these terms at any time and in
any manner by providing reasonable notice to you. You agree that reasonable
notice may be provided by posting on Kandra Labs's web site, email, or other written
notice. By continuing to access or use the Services after revisions become
effective, you agree to be bound by the revised terms. If you do not agree to
the new terms, please stop using the Services.
These terms constitute the whole legal agreement between you and Kandra Labs, and
completely replace any prior agreements between you and Kandra Labs in relation to
the Services.
Last modified: May 7, 2021

View File

@@ -0,0 +1,734 @@
# Terms of Service
**Effective date: February 7, 2022.** View [change history][changes-terms].
[changes-terms]: https://github.com/zulip/zulip/commits/main/templates/corporate/policies/terms.md
Welcome to Zulip. Please read on to learn the rules and restrictions that govern
your use of our website(s), products, services and applications (the
“Services”). If you have any questions, comments, or concerns regarding these
terms or the Services, please contact us at:
* Email: [support@zulip.com](mailto:support@zulip.com)
* Address: Kandra Labs, Inc., 584 Castro St #3175, San Francisco, CA 94114
These Terms of Service (the “Terms”) are a binding contract between
you and **KANDRA LABS, INC.** (“Zulip,” “we” and “us”). Your use of
the Services in any way means that you agree to all of these Terms,
and these Terms will remain in effect while you use the
Services. These Terms include the provisions in this document as well
as those in the [Privacy Policy](/policies/privacy), [Rules of
Use](/policies/rules), and, if applicable, [Data Processing
Addendum](/static/images/policies/Zulip-Data-Processing-Addendum.pdf).
**Please read these Terms carefully.** They cover important information about
Services provided to you and any charges, taxes, and fees we bill you. **These
Terms include information about future changes to these Terms, automatic
renewals, limitations of liability, a class action waiver and resolution of
disputes by arbitration instead of in court. PLEASE NOTE THAT YOUR USE OF AND
ACCESS TO OUR SERVICES ARE SUBJECT TO THE FOLLOWING TERMS; IF YOU DO NOT AGREE
TO ALL OF THE FOLLOWING, YOU MAY NOT USE OR ACCESS THE SERVICES IN ANY MANNER.**
**ARBITRATION NOTICE AND CLASS ACTION WAIVER:** EXCEPT FOR CERTAIN TYPES OF
DISPUTES DESCRIBED IN THE ARBITRATION AGREEMENT SECTION BELOW, YOU AGREE THAT
DISPUTES BETWEEN YOU AND US WILL BE RESOLVED BY BINDING, INDIVIDUAL ARBITRATION
AND YOU WAIVE YOUR RIGHT TO PARTICIPATE IN A CLASS ACTION LAWSUIT OR CLASS-WIDE
ARBITRATION.
## Will these Terms ever change?
We are constantly trying to improve our Services, so these Terms may
need to change along with our Services. We reserve the right to change
the Terms at any time, but if we do, we will place a notice on our
site located at [https://zulip.com/policies/terms](/policies/terms),
send you an email, and/or notify you by some other means. We will
generally aim to provide such notice about changes to the Terms at
least 14 days in advance of the new Terms taking effect.
If you don’t agree with the new Terms, you are free to reject them;
unfortunately, that means you will no longer be able to use the Services. If you
use the Services in any way after a change to the Terms is effective, that means
you agree to all of the changes.
Except for changes by us as described here, no other amendment or modification
of these Terms will be effective unless in writing and signed by both you and
us.
## What about my privacy?
Zulip takes the privacy of its users very seriously; see our [Privacy
Policy](/policies/privacy) for details.
### Children’s Online Privacy Protection Act
The Children’s Online Privacy Protection Act (“COPPA”) requires that
online service providers obtain parental consent before they knowingly
collect personally identifiable information online from children who
are under thirteen (13). We do not knowingly collect or solicit
personally identifiable information from children under thirteen (13)
years of age and children below the minimum [minimum age of consent in
their country](/policies/age-of-consent); if you are a child under the
age of thirteen (13) or below the minimum age of consent in your
country, please do not attempt to register for or otherwise use the
Services or send us any personal information. If we learn we have
collected personal information from a child under thirteen (13) years
of age or below the minimum age of consent in their country, we will
delete that information as quickly as possible. If you believe that a
child under the age of thirteen (13) or below the minimum age of
consent in their country may have provided us personal information,
please contact us at [privacy@zulip.com](mailto:privacy@zulip.com).
## What are the basics of using Zulip?
To use some of the Services, you may be required to sign up for an account,
select a password and display name (“Zulip Display Name”), and provide us with
certain information or data, such as your email address. You agree that you are
solely responsible for ensuring that your registration information, including
your email address, is accurate, complete and up to date. You may not select as
your Zulip Display Name a name that you do not have the right to use, or another
person’s name with the intent to impersonate that person. You may not transfer
your account to anyone else without our prior written permission.
Additionally, you may be able to access certain parts or features of the
Services by using your account credentials from third party services (“Third
Party Accounts”), such as those offered by Google and Apple. By using the
Services through a Third Party Account, you permit us to access certain
information from such account for use by the Services. You are ultimately in
control of how much information is accessible to us and may exercise such
control by adjusting your privacy settings on your Third Party Account.
You represent and warrant that you are an individual of legal age to form a
binding contract (or if not, you’ve received your parent’s or guardian’s
permission to use the Services and have gotten your parent or guardian to agree
to these Terms on your behalf). If you’re agreeing to these Terms on behalf of
an organization or entity or creating or administering an organization or group
in use of the Services (each such organization, entity, or group, a “Zulip
Organization”, and each administrator of a Zulip Organization, a “Zulip
Organization Administrator”), you represent and warrant that you are authorized
to agree to these Terms on such Zulip Organization’s behalf and bind them to
these Terms (in which case, the references to “you” and “your” in these Terms,
except for in this sentence, refer to that Zulip Organization).
You will only use the Services for your own internal, personal use, and not on
behalf of or for the benefit of any third party, and only in a manner that
complies with all laws that apply to you. If your use of the Services is
prohibited by applicable laws, then you aren’t authorized to use the Services.
We can’t and won’t be responsible for your using the Services in a way that
breaks the law.
You will not share your Zulip account or password with anyone, and you must
protect the security of your Zulip account, your password, and any other access
tools or credentials. You’re responsible for any activity associated with your
Zulip account.
## What about notifications?
As part of the Services, you may receive communications through the Services,
including notifications that Zulip sends you (for example, via email or SMS).
When signing up for the Services, you will receive a welcome notification and
instructions on how to stop receiving notifications. **By signing up for the
Services and providing us with your wireless number, you confirm that you want
Zulip to send you information regarding your account or transactions with us,
which may include Zulip using automated dialing technology to text you at the
wireless number you provided, and you agree to receive communications from
Zulip, and you represent and warrant that each person you register for the
Services or for whom you provide a wireless phone number has consented to
receive communications from Zulip.** You agree to indemnify and hold Zulip
harmless from and against any and all claims, liabilities, damages (actual and
consequential), losses and expenses (including attorneys’ fees) arising from or
in any way related to any breach of the foregoing on your part.
## What are my rights in the Services?
The materials displayed or performed or available on or through the Services,
including, but not limited to, text, graphics, data, articles, photos, images,
illustrations, User Submissions (as defined below) and so forth (all of the
foregoing, the “Content”) are protected by copyright and/or other intellectual
property laws. You promise to abide by all copyright notices, trademark rules,
information, and restrictions contained in any Content you access through the
Services, and you won’t use, copy, reproduce, modify, translate, publish,
broadcast, transmit, distribute, perform, upload, display, license, sell,
commercialize or otherwise exploit for any purpose any Content not owned by you
in a way that violates someone else’s (including Zulip's) rights.
Subject to these Terms, we grant each user of the Services a worldwide,
non-exclusive, non-sublicensable and non-transferable license to:
- Use (i.e., to download and display locally) Content solely for purposes of
using the Services.
- Export Content via the official Zulip API and distribute such Content for
legitimate purposes (e.g., a public archive or mirror which is approved by
organization owners).
Use, reproduction, modification, distribution or storage of any Content for any
purpose other than using the Services is expressly prohibited without prior
written permission from us.
You understand that Zulip owns the Services. You won’t modify, publish,
transmit, participate in the transfer or sale of, reproduce (except as expressly
provided in this Section), create derivative works based on, or otherwise
exploit any of the Services. You will also not upload to, or transmit from, the
Services any data, file, software, or link that contains or redirects to a
virus, Trojan horse, worm, or other harmful component or a technology that
unlawfully accesses or downloads content or information stored within the
Services. The Services may allow you to copy or download certain Content, but
please remember that even where these functionalities exist, all the
restrictions in this section still apply.
## What about anything I contribute to the Services? Do I have to grant any licenses to Zulip or to other users?
### User Submissions
Anything you post, upload, share, store, or otherwise provide through the
Services is your “User Submission”. Some User Submissions may be viewable by
other users or by anyone on the Internet. You are solely responsible for all
User Submissions you contribute to the Services. You represent that all User
Submissions submitted are not false, deceptive, or misleading, and are in
compliance with all applicable laws, rules and regulations.
### Licenses
Your User Submissions remain yours. These Terms don’t give us any ownership in
your User Submissions, or any rights to them except the limited rights set forth
below.
To provide the Services, we need your permission to do things like storing your
User Submissions and showing them to the people you send messages to, or who
otherwise have permission to see them (for example, any member of your Zulip
Organization for a message you send to a public channel.) Our Services also
provide you with features like sharing and searching. To provide these and other
features, Zulip may access, use, store, copy, process, adapt, distribute,
perform, export, and display your User Submissions. Note that the following
licenses are subject to our [Privacy Policy](/policies/privacy) to the extent
they relate to User Submissions that are also your personally-identifiable
information.
You give us permission to do these things only as reasonably necessary (a) to
deliver the Services; (b) to prevent or address service, security, support,
abuse or technical issues; or (c) as required by law. This license is
non-exclusive, worldwide, perpetual, royalty-free, fully paid, sublicensable and
transferable to use, edit, modify, truncate, aggregate, reproduce, distribute,
prepare derivative works of, display, perform, and otherwise fully exploit the
User Submissions in connection with the Services and extends to our affiliates
and trusted third parties we work with.
Other people may have access to your User Submissions through the Services, and
you also give those people a non-exclusive, worldwide permission to do these
things, only as permitted by the functionality of the Services and these Terms.
For example:
- People you send a Zulip message to may view the message through the Services.
- Your Zulip Organization Administrators may [export the Zulip Organization’s
data](/help/export-your-organization) for archival or backup purposes, or to
import the data into a self-hosted Zulip server.
- Messages on a web-public channel may be viewed by anyone on the Internet.
When you delete your Zulip account, we will stop displaying your User
Submissions in association with your account, if applicable. You understand that
User Submissions may still be viewable in association with a “deleted user”
after you delete your Zulip account. You understand and agree that it may not be
possible to completely delete that content from Zulip's records, and that your
User Submissions may remain viewable elsewhere to the extent that they were
copied or stored by other users.
We welcome feedback, but note that by sending any feedback, you grant us an
irrevocable, non-exclusive, royalty-free, perpetual, worldwide license to use,
modify, prepare derivative works from, publish, distribute and sublicense any
such feedback, and we may incorporate into our products and services any
feedback, comments, or suggestions without any obligation or compensation to
you.
## Are there restrictions in how I can use the Services?
You represent, warrant, and agree that you will not provide or contribute
anything, including any Content or User Submission, to the Services, or
otherwise use or interact with the Services, in a manner that is not consistent
with the [Zulip Rules of Use](/policies/rules). A violation of any of the Zulip
Rules of Use is grounds for termination of your right to use or access the
Services.
## What if I see something on the Services that infringes my copyright?
In accordance with the DMCA, we’ve adopted the following policy toward copyright
infringement. We reserve the right to (1) block access to or remove material
that we believe in good faith to be copyrighted material that has been illegally
copied and distributed by any of our advertisers, affiliates, content providers,
members or users and (2) remove and discontinue service to repeat offenders.
* **Procedure for Reporting Copyright Infringements**. If you believe that
material or content residing on or accessible through the Services infringes
your copyright (or the copyright of someone whom you are authorized to act on
behalf of), please send a notice of copyright infringement containing the
following information to Zulip's Designated Agent to Receive Notification of
Claimed Infringement (our “Designated Agent,” whose contact details are
listed below):
* (a) A physical or electronic signature of a person authorized to act on behalf
of the owner of the copyright that has been allegedly infringed;
* (b) Identification of works or materials being infringed;
* (c) Identification of the material that is claimed to be infringing including
information regarding the location of the infringing materials that the
copyright owner seeks to have removed, with sufficient detail so that we
are capable of finding and verifying its existence;
* (d) Contact information about the notifier including address, telephone number
and, if available, email address;
* (e) A statement that the notifier has a good faith belief that the material
identified in (c) is not authorized by the copyright owner, its agent,
or the law; and
* (f) A statement made under penalty of perjury that the information provided is
accurate and the notifying party is authorized to make the complaint on
behalf of the copyright owner.
* **Once Proper Bona Fide Infringement Notification is Received by the
Designated Agent**. Upon receipt of a proper notice of copyright
infringement, we reserve the right to:
* (a) remove or disable access to the infringing material;
* (b) notify the content provider who is accused of infringement that we have
removed or disabled access to the applicable material; and
* (c) terminate such content provider's access to the Services if they are a
repeat offender.
* **Procedure to Supply a Counter-Notice to the Designated Agent**. If the
content provider believes that the material that was removed (or to which
access was disabled) is not infringing, or the content provider believes that
it has the right to post and use such material from the copyright owner, the
content provider may send us a counter-notice containing the following
information to the Designated Agent:
* (a) A physical or electronic signature of the content provider;
* (b) Identification of the material that has been removed or to which access
has been disabled and the location at which the material appeared before
it was removed or disabled;
* (c) A statement under penalty of perjury that the content provider has a
good faith belief that the material was removed or disabled as a result
of mistake or misidentification of the material; and
* (d) Content provider's name, address, telephone number, and, if available,
email address, and a statement that the content provider consents to the
jurisdiction of the Federal Court for the judicial district in which the
content provider’s address is located, or, if the content provider's
address is located outside the United States, for any judicial district
in which Company is located, and that the content provider will accept
service of process from the person who provided notification of the
alleged infringement or an agent of such person.
If a counter-notice is received by the Designated Agent, Company may, in its
discretion, send a copy of the counter-notice to the original complaining party
informing that person that Company may replace the removed material or cease
disabling it in 10 business days. Unless the copyright owner files an action
seeking a court order against the content provider accused of committing
infringement, the removed material may be replaced or access to it restored 10
business days or more after receipt of the counter-notice, at Company's
discretion.
Please contact Zulip's Designated Agent at the following address:
Kandra Labs, Inc.<br/>
Attn: DMCA Designated Agent<br/>
584 Castro St #3175<br/>
San Francisco, CA 94114
## Who is responsible for what I see and do on the Services?
Any information or Content publicly posted or privately transmitted through the
Services is the sole responsibility of the person from whom such Content
originated, and you access all such information and Content at your own risk,
and we aren’t liable for any errors or omissions in that information or Content
or for any damages or loss you might suffer in connection with it. We cannot
control and have no duty to take any action regarding how you may interpret and
use the Content or what actions you may take as a result of having been exposed
to the Content, and you hereby release us from all liability for you having
acquired or not acquired Content through the Services. We can’t guarantee the
identity of any users with whom you interact in using the Services and are not
responsible for which users gain access to the Services.
You are responsible for all Content you contribute, in any manner, to the
Services, and you represent and warrant you have all rights necessary to do so,
in the manner in which you contribute it.
The Services may contain links or connections to third-party websites or
services that are not owned or controlled by Zulip. When you access third-party
websites or use third-party services, you accept that there are risks in doing
so, and that Zulip is not responsible for such risks.
Zulip has no control over, and assumes no responsibility for, the content,
accuracy, privacy policies, or practices of or opinions expressed in any
third-party websites or by any third party that you interact with through the
Services. In addition, Zulip will not and cannot monitor, verify, censor or edit
the content of any third-party site or service. We encourage you to be aware
when you leave the Services and to read the terms and conditions and privacy
policy of each third-party website or service that you visit or utilize. By
using the Services, you release and hold us harmless from any and all liability
arising from your use of any third-party website or service.
Your interactions with Zulip Organizations and/or individuals found on or
through the Services, including payment and delivery of goods or services, and
any other terms, conditions, warranties or representations associated with such
dealings, are solely between you and such organizations and/or individuals. You
should make whatever investigation you feel necessary or appropriate before
proceeding with any online or offline transaction with any of these third
parties. You agree that Zulip shall not be responsible or liable for any loss or
damage of any sort incurred as the result of any such dealings.
If there is a dispute between participants on this site or Services, or between
users and any third party, you agree that Zulip is under no obligation to become
involved. In the event that you have a dispute with one or more other users, you
release Zulip, its directors, officers, employees, agents, and successors from
claims, demands, and damages of every kind or nature, known or unknown,
suspected or unsuspected, disclosed or undisclosed, arising out of or in any way
related to such disputes and/or our Services. You shall and hereby do waive
California Civil Code Section 1542 or any similar law of any jurisdiction, which
says in substance: “A general release does not extend to claims that the
creditor or releasing party does not know or suspect to exist in his or her
favor at the time of executing the release and that, if known by him or her,
would have materially affected his or her settlement with the debtor or released
party.”
## Will Zulip ever change the Services?
We’re always trying to improve our Services, so they may change over time. We
may suspend or discontinue any part of the Services, or we may introduce new
features or impose limits on certain features or restrict access to parts or all
of the Services. We reserve the right to remove any Content from the Services at
any time, for any reason (including, but not limited to, if someone alleges you
contributed that Content in violation of these Terms), in our sole discretion,
and without notice.
## Do the Services cost anything?
The Services may be free or we may charge a fee for using the Services. If you
are using a free version of the Services, we will notify you before any Services
you are then using begin carrying a fee, and if you wish to continue using such
Services, you must pay all applicable fees for such Services. Note that if you
elect to receive text messages through the Services, data and message rates may
apply. Any and all such charges, fees or costs are your sole responsibility. You
should consult with your wireless carrier to determine what rates, charges, fees
or costs may apply to your use of the Services.
* (a) **Paid Services**. Certain of our Services may be subject to payments now or
in the future (the “Paid Services”). Please see our Paid Services page:
<https://zulip.com/plans/> for a description of the current Paid Services.
Please note that any payment terms presented to you in the process of using
or signing up for a Paid Service are deemed part of these Terms.
* (b) **Billing**. We use a third-party payment processor (the “Payment Processor”)
to bill you through a payment account linked to your account on the Services
(your “Billing Account”) for use of the Paid Services. The processing of
payments will be subject to the terms, conditions and privacy policies of the
Payment Processor in addition to these Terms. Currently, we use Stripe, Inc.
as our Payment Processor. You can access Stripe’s Terms of Service at
<https://stripe.com/us/checkout/legal> and their Privacy Policy at
<https://stripe.com/us/privacy>. We are not responsible for any error by, or
other acts or omissions of, the Payment Processor. By choosing to use Paid
Services, you agree to pay us, through the Payment Processor, all charges at
the prices then in effect for any use of such Paid Services in accordance
with the applicable payment terms, and you authorize us, through the Payment
Processor, to charge your chosen payment provider (your “Payment Method”).
You agree to make payment using that selected Payment Method. We reserve the
right to correct any errors or mistakes that the Payment Processor makes even
if it has already requested or received payment.
* (c) **Payment Method**. The terms of your payment will be based on your Payment
Method and may be determined by agreements between you and the financial
institution, credit card issuer or other provider of your chosen Payment
Method. If we, through the Payment Processor, do not receive payment from
you, you agree to pay all amounts due on your Billing Account upon demand.
* (d) **Recurring Billing**. Some of the Paid Services may consist of an initial
period, for which there is a one-time charge, followed by recurring period
charges as agreed to by you. By choosing a recurring payment plan, you
acknowledge that such Services have an initial and recurring payment feature
and you accept responsibility for all recurring charges prior to
cancellation. WE MAY SUBMIT PERIODIC CHARGES (E.G., MONTHLY) WITHOUT FURTHER
AUTHORIZATION FROM YOU, UNTIL YOU PROVIDE PRIOR NOTICE (RECEIPT OF WHICH IS
CONFIRMED BY US) THAT YOU HAVE TERMINATED THIS AUTHORIZATION OR WISH TO
CHANGE YOUR PAYMENT METHOD. SUCH NOTICE WILL NOT AFFECT CHARGES SUBMITTED
BEFORE WE REASONABLY COULD ACT. TO TERMINATE YOUR AUTHORIZATION OR CHANGE
YOUR PAYMENT METHOD, GO TO YOUR [BILLING SETTINGS](/billing/).
* (e) **Current Information Required**. YOU MUST PROVIDE CURRENT, COMPLETE AND
ACCURATE INFORMATION FOR YOUR BILLING ACCOUNT. YOU MUST PROMPTLY UPDATE ALL
INFORMATION TO KEEP YOUR BILLING ACCOUNT CURRENT, COMPLETE AND ACCURATE (SUCH
AS A CHANGE IN BILLING ADDRESS, CREDIT CARD NUMBER, OR CREDIT CARD EXPIRATION
DATE), AND YOU MUST PROMPTLY NOTIFY US OR OUR PAYMENT PROCESSOR IF YOUR
PAYMENT METHOD IS CANCELED (E.G., FOR LOSS OR THEFT) OR IF YOU BECOME AWARE
OF A POTENTIAL BREACH OF SECURITY, SUCH AS THE UNAUTHORIZED DISCLOSURE OR USE
OF YOUR USER NAME OR PASSWORD. CHANGES TO SUCH INFORMATION CAN BE MADE IN
YOUR [BILLING SETTINGS](/billing/). IF YOU FAIL TO PROVIDE ANY OF THE
FOREGOING INFORMATION, YOU AGREE THAT WE MAY CONTINUE CHARGING YOU FOR ANY
USE OF PAID SERVICES UNDER YOUR BILLING ACCOUNT UNLESS YOU HAVE TERMINATED
YOUR PAID SERVICES AS SET FORTH ABOVE.
* (f) **Change in Amount Authorized**. If the amount to be charged to your Billing
Account varies from the amount you preauthorized (other than due to the
imposition or change in the amount of sales taxes), you have the right to
receive, and we shall provide, notice of the amount to be charged and the
date of the charge before the scheduled date of the transaction. Any
agreement you have with your payment provider will govern your use of your
Payment Method. You agree that we may accumulate charges incurred and submit
them as one or more aggregate charges during or at the end of each billing
cycle.
* (g) **Auto-Renewal for Paid Services**. Unless you opt out of auto-renewal, which
can be done through your [billing settings](/billing/), any Paid Services you
have signed up for will be automatically extended for successive renewal
periods of the same duration as the subscription term originally selected, at
the then-current non-promotional rate. To change or resign your Paid Services
at any time, go to your [billing settings](/billing/). If you terminate a
Paid Service, you may use your subscription until the end of your
then-current term, and your subscription will not be renewed after your
then-current term expires. However, you will not be eligible for a prorated
refund of any portion of the subscription fee paid for the then-current
subscription period. IF YOU DO NOT WANT TO CONTINUE TO BE CHARGED ON A
RECURRING BASIS, YOU MUST CANCEL THE APPLICABLE PAID SERVICE THROUGH YOUR
[BILLING SETTINGS](/billing/) OR TERMINATE YOUR ZULIP ACCOUNT BEFORE THE END
OF THE RECURRING TERM. PAID SERVICES CANNOT BE TERMINATED BEFORE THE END OF
THE PERIOD FOR WHICH YOU HAVE ALREADY PAID, AND EXCEPT AS EXPRESSLY PROVIDED
IN THESE TERMS, ZULIP WILL NOT REFUND ANY FEES THAT YOU HAVE ALREADY PAID.
* (h) **Reaffirmation of Authorization**. Your non-termination or continued use of
a Paid Service reaffirms that we are authorized to charge your Payment Method
for that Paid Service. We may submit those charges for payment and you will
be responsible for such charges. This does not waive our right to seek
payment directly from you. Your charges may be payable in advance, in
arrears, per usage, or as otherwise described when you initially selected to
use the Paid Service.
* (i) **Free Trials and Other Promotions**. Any free trial or other promotion that
provides access to a Paid Service may only be used within the specified time
of the trial. You must stop using a Paid Service before the end of the trial
period in order to avoid being charged for that Paid Service. If you cancel
prior to the end of the trial period and are inadvertently charged for a Paid
Service, please contact us at [support@zulip.com](mailto:support@zulip.com).
## What if I want to stop using the Services?
You’re free to stop using the Services at any time by contacting us at
[support@zulip.com](mailto:support@zulip.com); please refer to our [Privacy
Policy](/policies/privacy), as well as the licenses above, to understand how we
treat information you provide to us after you have stopped using our Services.
Zulip is also free to terminate (or suspend access to) your use of the Services
or your account for any reason at our sole discretion, including your breach of
these Terms. Zulip has the sole right to decide whether you are in violation of
any of the restrictions set forth in these Terms.
Account termination may result in destruction of any Content associated with
your account, so keep that in mind before you decide to terminate your account.
We will try to provide advance notice to you prior to our terminating your
account so that you are able to retrieve any important User Submissions you may
have stored in your account (to the extent allowed by law and these Terms), but
we may not do so if we determine it would be impractical, illegal, not in the
interest of someone’s safety or security, or otherwise harmful to the rights or
property of Zulip or third parties.
If you have deleted your account by mistake, contact us immediately at
[support@zulip.com](mailto:support@zulip.com) – we will try to help, but
unfortunately, we can’t promise that we can recover or restore anything.
Provisions that, by their nature, should survive termination of these Terms
shall survive termination. By way of example, all of the following will survive
termination: any obligation you have to pay us or indemnify us, any limitations
on our liability, any terms regarding ownership or intellectual property rights,
and terms regarding disputes between us, including without limitation the
arbitration agreement.
## What about Mobile Applications?
You acknowledge and agree that the availability of our mobile application is
dependent on the third party stores from which you download the application,
e.g., the App Store from Apple or the Play Store from Google (each an “App
Store”). Each App Store may have its own terms and conditions to which you must
agree before downloading mobile applications from such store, including the
specific terms relating to Apple App Store set forth below. You agree to comply
with, and your license to use our application is conditioned upon your
compliance with, such App Store terms and conditions. To the extent such other
terms and conditions from such App Store are less restrictive than, or otherwise
conflict with, the terms and conditions of these Terms of Service, the more
restrictive or conflicting terms and conditions in these Terms of Service apply.
### I use the Zulip App available via the Apple App Store – should I know anything about that?
These Terms apply to your use of all the Services, including our iOS
applications (the “Application”) available via the Apple, Inc. (“Apple”) App
Store, but the following additional terms also apply to the Application:
* (a) Both you and Zulip acknowledge that the Terms are concluded between you and
Zulip only, and not with Apple, and that Apple is not responsible for the
Application or the Content;
* (b) The Application is licensed to you on a limited, non-exclusive,
non-transferable, non-sublicensable basis, solely to be used in connection
with the Services for your private, internal, personal use, subject to all
the terms and conditions of these Terms as they are applicable to the
Services;
* (c) You will only use the Application in connection with an Apple device that you
own or control;
* (d) You acknowledge and agree that Apple has no obligation whatsoever to furnish
any maintenance and support services with respect to the Application;
* (e) In the event of any failure of the Application to conform to any applicable
warranty, including those implied by law, you may notify Apple of such
failure; upon notification, Apple’s sole warranty obligation to you will be
to refund to you the purchase price, if any, of the Application;
* (f) You acknowledge and agree that Zulip, and not Apple, is responsible for
addressing any claims you or any third party may have in relation to the
Application;
* (g) You acknowledge and agree that, in the event of any third-party claim that
the Application or your possession and use of the Application infringes that
third party’s intellectual property rights, Zulip, and not Apple, will be
responsible for the investigation, defense, settlement and discharge of any
such infringement claim;
* (h) You represent and warrant that you are not located in a country subject to a
U.S. Government embargo, or that has been designated by the U.S. Government
as a “terrorist supporting” country, and that you are not listed on any U.S.
Government list of prohibited or restricted parties;
* (i) Both you and Zulip acknowledge and agree that, in your use of the
Application, you will comply with any applicable third-party terms of
agreement which may affect or be affected by such use; and
* (j) Both you and Zulip acknowledge and agree that Apple and Apple’s subsidiaries
are third-party beneficiaries of these Terms, and that upon your acceptance
of these Terms, Apple will have the right (and will be deemed to have
accepted the right) to enforce these Terms against you as the third-party
beneficiary hereof.
## What else do I need to know?
*Warranty Disclaimer.* Zulip and its licensors, suppliers, partners, parent,
subsidiaries or affiliated entities, and each of their respective officers,
directors, members, employees, consultants, contract employees, representatives
and agents, and each of their respective successors and assigns (Zulip and all
such parties together, the “Zulip Parties”) make no representations or
warranties concerning the Services, including without limitation regarding any
Content contained in or accessed through the Services, and the Zulip Parties
will not be responsible or liable for the accuracy, copyright compliance,
legality, or decency of material contained in or accessed through the Services
or any claims, actions, suits, procedures, costs, expenses, damages or
liabilities arising out of use of, or in any way related to your participation
in, the Services. The Zulip Parties make no representations or warranties
regarding suggestions or recommendations of services or products offered or
purchased through or in connection with the Services. THE SERVICES AND CONTENT
ARE PROVIDED BY ZULIP (AND ITS LICENSORS AND SUPPLIERS) ON AN “AS-IS” BASIS,
WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT
LIMITATION, IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
PURPOSE, NON-INFRINGEMENT, OR THAT USE OF THE SERVICES WILL BE UNINTERRUPTED OR
ERROR-FREE. SOME STATES DO NOT ALLOW LIMITATIONS ON HOW LONG AN IMPLIED WARRANTY
LASTS, SO THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.
*Limitation of Liability*. TO THE FULLEST EXTENT ALLOWED BY APPLICABLE LAW,
UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY (INCLUDING, WITHOUT LIMITATION,
TORT, CONTRACT, STRICT LIABILITY, OR OTHERWISE) SHALL ANY OF THE ZULIP PARTIES
BE LIABLE TO YOU OR TO ANY OTHER PERSON FOR (A) ANY INDIRECT, SPECIAL,
INCIDENTAL, PUNITIVE OR CONSEQUENTIAL DAMAGES OF ANY KIND, INCLUDING DAMAGES FOR
LOST PROFITS, BUSINESS INTERRUPTION, LOSS OF DATA, LOSS OF GOODWILL, WORK
STOPPAGE, ACCURACY OF RESULTS, OR COMPUTER FAILURE OR MALFUNCTION, (B) ANY
SUBSTITUTE GOODS, SERVICES OR TECHNOLOGY, (C) ANY AMOUNT, IN THE AGGREGATE, IN
EXCESS OF THE GREATER OF (I) ONE-HUNDRED ($100) DOLLARS OR (II) THE AMOUNTS PAID
AND/OR PAYABLE BY YOU TO ZULIP IN CONNECTION WITH THE SERVICES IN THE TWELVE
(12) MONTH PERIOD PRECEDING THIS APPLICABLE CLAIM OR (D) ANY MATTER BEYOND OUR
REASONABLE CONTROL. SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF
INCIDENTAL OR CONSEQUENTIAL OR CERTAIN OTHER DAMAGES, SO THE ABOVE LIMITATION
AND EXCLUSIONS MAY NOT APPLY TO YOU.
*Indemnity*. To the fullest extent allowed by applicable law, you agree to
indemnify and hold the Zulip Parties harmless from and against any and all
claims, liabilities, damages (actual and consequential), losses and expenses
(including attorneys’ fees) arising from or in any way related to any claims
relating to (a) your use of the Services (including any actions taken by a third
party using your account), and (b) your violation of these Terms.
*Assignment*. You may not assign, delegate or transfer these Terms or your
rights or obligations hereunder, or your Services account, in any way (by
operation of law or otherwise) without Zulip's prior written consent. We may
transfer, assign, or delegate these Terms and our rights and obligations without
consent.
*Choice of Law*. These Terms are governed by and will be construed under the
Federal Arbitration Act, applicable federal law, and the laws of the State of
California, without regard to the conflicts of laws provisions thereof.
*Arbitration Agreement.* Please read the following ARBITRATION AGREEMENT
carefully because it requires you to arbitrate certain disputes and claims with
Zulip and limits the manner in which you can seek relief from Zulip. Both you
and Zulip acknowledge and agree that for the purposes of any dispute arising out
of or relating to the subject matter of these Terms, Zulip's officers,
directors, employees and independent contractors (“Personnel”) are third-party
beneficiaries of these Terms, and that upon your acceptance of these Terms,
Personnel will have the right (and will be deemed to have accepted the right) to
enforce these Terms against you as the third-party beneficiary hereof.
* (a) *Arbitration Rules; Applicability of Arbitration Agreement*. The parties
shall use their best efforts to settle any dispute, claim, question, or
disagreement arising out of or relating to the subject matter of these Terms
directly through good-faith negotiations, which shall be a precondition to
either party initiating arbitration. If such negotiations do not resolve the
dispute, it shall be finally settled by binding arbitration in San Francisco
County, California. The arbitration will proceed in the English language, in
accordance with the JAMS Streamlined Arbitration Rules and Procedures (the
“Rules”) then in effect, by one commercial arbitrator with substantial
experience in resolving intellectual property and commercial contract
disputes. The arbitrator shall be selected from the appropriate list of JAMS
arbitrators in accordance with such Rules. Judgment upon the award rendered by
such arbitrator may be entered in any court of competent jurisdiction.
* (b) *Costs of Arbitration*. The Rules will govern payment of all arbitration
fees. Zulip will pay all arbitration fees for claims less than seventy-five
thousand ($75,000) dollars. Zulip will not seek its attorneys’ fees and costs
in arbitration unless the arbitrator determines that your claim is frivolous.
* (c) *Small Claims Court; Infringement*. Either you or Zulip may assert claims,
if they qualify, in small claims court in San Francisco County, California or
any United States county where you live or work. Furthermore, notwithstanding
the foregoing obligation to arbitrate disputes, each party shall have the
right to pursue injunctive or other equitable relief at any time, from any
court of competent jurisdiction, to prevent the actual or threatened
infringement, misappropriation or violation of a party's copyrights,
trademarks, trade secrets, patents or other intellectual property rights.
* (d) *Waiver of Jury Trial*. YOU AND ZULIP WAIVE ANY CONSTITUTIONAL AND
STATUTORY RIGHTS TO GO TO COURT AND HAVE A TRIAL IN FRONT OF A JUDGE OR JURY.
You and Zulip are instead choosing to have claims and disputes resolved by
arbitration. Arbitration procedures are typically more limited, more
efficient, and less costly than rules applicable in court and are subject to
very limited review by a court. In any litigation between you and Zulip over
whether to vacate or enforce an arbitration award, YOU AND ZULIP WAIVE ALL
RIGHTS TO A JURY TRIAL, and elect instead to have the dispute be resolved by a
judge.
* (e) *Waiver of Class or Consolidated Actions*. ALL CLAIMS AND DISPUTES WITHIN
THE SCOPE OF THIS ARBITRATION AGREEMENT MUST BE ARBITRATED OR LITIGATED ON AN
INDIVIDUAL BASIS AND NOT ON A CLASS BASIS. CLAIMS OF MORE THAN ONE CUSTOMER OR
USER CANNOT BE ARBITRATED OR LITIGATED JOINTLY OR CONSOLIDATED WITH THOSE OF
ANY OTHER CUSTOMER OR USER. If however, this waiver of class or consolidated
actions is deemed invalid or unenforceable, neither you nor Zulip is entitled
to arbitration; instead all claims and disputes will be resolved in a court as
set forth in (g) below.
* (f) *Opt-out*. You have the right to opt out of the provisions of this
Arbitration Agreement by sending written notice of your decision to opt out to
the following address: 584 Castro St #3175, San Francisco, CA 94114 postmarked
within thirty (30) days of first accepting these Terms. You must include (i)
your name and residence address, (ii) the email address and/or telephone
number associated with your account, and (iii) a clear statement that you want
to opt out of these Terms’ arbitration agreement.
* (g) *Exclusive Venue*. If you send the opt-out notice in (f), and/or in any
circumstances where the foregoing arbitration agreement permits either you or
Zulip to litigate any dispute arising out of or relating to the subject matter
of these Terms in court, then the foregoing arbitration agreement will not
apply to either party, and both you and Zulip agree that any judicial
proceeding (other than small claims actions) will be brought in the state or
federal courts located in, respectively, San Francisco County, California, or
the federal district in which that county falls.
* (h) *Severability*. If the prohibition against class actions and other claims
brought on behalf of third parties contained above is found to be
unenforceable, then all of the preceding language in this Arbitration
Agreement section will be null and void. This arbitration agreement will
survive the termination of your relationship with Zulip.
*Miscellaneous*. You will be responsible for paying, withholding, filing, and
reporting all taxes, duties, and other governmental assessments associated with
your activity in connection with the Services, provided that Zulip may, in its
sole discretion, do any of the foregoing on your behalf or for itself as it sees
fit. The failure of either you or us to exercise, in any way, any right herein
shall not be deemed a waiver of any further rights hereunder. If any provision
of these Terms are found to be unenforceable or invalid, that provision will be
limited or eliminated, to the minimum extent necessary, so that these Terms
shall otherwise remain in full force and effect and enforceable. You and Zulip
agree that these Terms are the complete and exclusive statement of the mutual
understanding between you and Zulip, and that these Terms supersede and cancel
all previous written and oral agreements, communications and other
understandings relating to the subject matter of these Terms. You hereby
acknowledge and agree that neither these Terms nor your use of the Services
makes you an employee, agent, partner, or joint venture of Zulip, and you do not
have any authority of any kind to bind Zulip in any respect whatsoever.
Except as expressly set forth in the sections above regarding the Apple
Application and the arbitration agreement, you and Zulip agree there are no
third-party beneficiaries intended under these Terms.

View File

@@ -0,0 +1,418 @@
<div id="plans-and-pricing" class="pricing-model {% if is_self_hosted_realm %}is-self-hosted-realm{% endif %}">
<div class="padded-content">
{% if is_self_hosted_realm %}
<h1>Choose a plan</h1>
{% else %}
<h1>Zulip plans and pricing</h1>
<div class="h1-subheader">
You can <a href="https://zulip.com/help/zulip-cloud-or-self-hosting">move
freely</a> between <a href="/zulip-cloud/">Zulip Cloud</a>
hosting and your own servers with our high quality <a
href="/help/export-your-organization">export</a> and
<a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html">import
</a> tools.
</div>
{% endif %}
<div class="pricing-container">
{% if is_self_hosted_realm %}
<div class="cloud-plan-title inactive-pricing-tab">
<h2>Zulip Cloud</h2>
<p>
<a href="https://zulip.com/plans/">View Zulip Cloud plans and pricing</a>.
</p>
</div>
{% else %}
<div id="cloud" class="cloud-plan-title pricing-tab">
<h2>Zulip Cloud</h2>
<p>
Simple managed solution.<br />Always up to date.
</p>
</div>
{% endif %}
<div class="pricing-pane-scroll-container cloud-scroll">
<div class="cloud-plan-pricing pricing-pane">
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Free</h2>
<ul class="feature-list">
<li><span>10,000 messages of search history</span></li>
<li><span>File storage up to 5 GB total</span></li>
<li><span><a href="{{ billing_base_url }}/plans/#cloud-plan-comparison">Complete</a> team chat solution</span></li>
<li><span><a href="/integrations/">Hundreds of integrations</a></span></li>
<li><span>Advanced <a href="/help/user-roles">roles</a> and <a href="/help/manage-permissions">permissions</a></span></li>
<li><span><a href="/help/guest-users">Guest</a>
accounts</span></li>
<li><span>Many organizations are eligible for a <a href="{{ billing_base_url }}/plans/#cloud-sponsorships">free Standard plan</a></span></li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
{% if is_cloud_realm and on_free_tier %}
<div class="pricing-details"></div>
<a href='/upgrade/' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
Current plan
</a>
{% elif not is_cloud_realm or is_new_customer %}
<a href="/new/" class="button get-started-button">
Create organization
</a>
{% endif %}
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Standard</h2>
<ul class="feature-list">
<li><span>Unlimited search history</span></li>
<li><span>File storage up to 5 GB per user</span></li>
<li><span>Flexible permissions with <a href="/help/user-groups">custom groups</a></span></li>
<li><span><a href="/help/message-retention-policy">Message retention policies</a></span></li>
<li><span>Brand Zulip with your logo</span></li>
<li><span>Priority commercial support</span></li>
<li><span><a href="/help/public-access-option">Public access option</a></span></li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
<div class="price"><span class="currency-symbol">$</span>6.67</div>
<div class="details">
<p>
/user/month billed annually
or&nbsp;<b>$8</b>&nbsp;billed monthly
</p>
</div>
</div>
{% if is_cloud_realm and on_free_tier and not sponsorship_pending %}
<a href="/upgrade/?tier={{ tier_cloud_standard }}" class="button upgrade-button">
{% if free_trial_days %}
Start {{ free_trial_days }}-day free trial
{% else %}
Upgrade to Standard
{% endif %}
</a>
<!-- Sponsored realm may not have customer plan. -->
{% elif (is_cloud_realm and is_sponsored) or (customer_plan and customer_plan.tier == customer_plan.TIER_CLOUD_STANDARD) %}
<a href='/billing' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
{% if on_free_trial %}
Current plan (free trial)
{% else %}
Current plan
{% endif %}
</a>
{% elif is_cloud_realm and sponsorship_pending %}
<a href="/billing/" class="button current-plan-button" type="button">
Sponsorship requested
</a>
{% elif customer_plan and customer_plan.tier != customer_plan.TIER_CLOUD_STANDARD %}
<a href="mailto:sales@zulip.com" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Contact sales
</a>
{% else %}
<a href="/upgrade/?tier={{ tier_cloud_standard }}" class="button upgrade-button">
{% if free_trial_days %}
Start {{ free_trial_days }}-day free trial
{% else %}
Upgrade to Standard
{% endif %}
</a>
{% endif %}
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2 class="with-fine-print">Plus <small>10 users minimum</small></h2>
<ul class="feature-list">
<li><span>All Standard plan features</span></li>
<li><span>File storage up to 25 GB per user</span></li>
<li><span><a href="/help/saml-authentication">SSO with SAML</a> (Okta, OneLogIn, etc.)</span></li>
<li><span><a href="/help/scim">SCIM user and group sync</a></span></li>
<li><span><a href="/help/change-organization-url">Custom domain</a></span></li>
<li><span>Limit user list access for <a href="/help/guest-users">guests</a></span></li>
<li><span>Priority commercial support</span></li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
<div class="price"><span class="currency-symbol">$</span>10</div>
<div class="details">
<p>
/user/month billed annually
<br />
or&nbsp;<b>$12</b>&nbsp;billed monthly
</p>
</div>
</div>
{% if customer_plan and customer_plan.tier == customer_plan.TIER_CLOUD_PLUS %}
<a href='/billing' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
Current plan
</a>
{% elif customer_plan and customer_plan.tier != customer_plan.TIER_CLOUD_PLUS %}
<a href="mailto:sales@zulip.com" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Contact sales
</a>
{% else %}
<a href="/upgrade/?tier={{ tier_cloud_plus }}" class="button upgrade-button">
Upgrade to Plus
</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
<div id="self-hosted" class="self-hosted-plan-title pricing-tab">
<h2>Self-hosted</h2>
<p>
Retain full control over your data.<br />100% open-source software.
</p>
</div>
<div class="pricing-pane-scroll-container self-hosted-scroll">
<div class="self-hosted-plan-pricing pricing-pane">
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Free</h2>
<ul class="feature-list">
<li><span>Complete team chat solution, with <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">all Zulip features</a> included</span></li>
<li><span><a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile notifications</a> without limitation for eligible communities</span></li>
<li><span><a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">Mobile notifications</a> for up to 10&nbsp;users for other organizations</span></li>
</ul>
<a href="/help/self-hosted-billing#free-community-plan">Register now</a> for unlimited notifications:
<em>grassroots communities</em> · <em><a href="/for/open-source/">open-source projects</a></em> · <em>academic <a href="/for/research/">research</a></em> ·
<em>small non-profits</em> · <em>non-profit <a href="/for/events/">events</a></em> · <em>families & friends</em>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
<div class="price">Free</div>
</div>
{% if is_self_hosted_realm and customer_plan and customer_plan.tier == customer_plan.TIER_SELF_HOSTED_LEGACY %}
<span class="button current-plan-descriptor" type="button">
<i class="icon current-plan-icon"></i>
Unlimited push notifications<br />until {{ customer_plan.end_date.strftime('%d %B, %Y') }}
</span>
{% elif not is_self_hosted_realm %}
{% if rendering_page == 'self_hosting' %}
<a href="https://zulip.readthedocs.io/en/stable/production/install.html" class="button get-started-button">
Install a Zulip server
</a>
{% else %}
<a href="/self-hosting/" class="button get-started-button">
Self-host Zulip
</a>
{% endif %}
{% else %}
<div class="button-placeholder"></div>
{% endif %}
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Basic</h2>
<ul class="feature-list">
<li><span>Complete team chat solution, with <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">all Zulip features</a> included</span></li>
<li><span>Unlimited <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">mobile notifications</a></span></li>
<li><span><a href="/help/self-hosted-billing#how-paid-plans-support-the-zulip-project">Support</a> Zulip's open-source development</span></li>
</ul>
<em>85+% <a href="/help/self-hosted-billing#paid-plan-discounts">discount</a> for non-workplace users!</em>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
{% if (has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BASIC)
or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Basic")
or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%}
<div class="price"><span class="currency-symbol">$</span>3.50</div>
<div class="details">
<p>
/user/month billed monthly
</p>
</div>
{% else %}
<div class="price"><span class="currency-symbol">$</span>3.50</div>
<div class="details">
<p>
/user/month billed monthly
</p>
</div>
<div class="discount">
<b>$20/month off</b> for the first year!
</div>
{% endif %}
</div>
{% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BASIC %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled
</a>
{% elif is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Business" %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_basic }}" class="button current-plan-button" type="button">
Sponsorship requested
</a>
{% elif is_self_hosted_realm and on_free_tier and not sponsorship_pending %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_basic }}" class="button upgrade-button">
{% if free_trial_days %}
Start {{ free_trial_days }}-day free trial
{% else %}
Upgrade to Basic
{% endif %}
</a>
{% elif is_self_hosted_realm and customer_plan and customer_plan.tier == customer_plan.TIER_SELF_HOSTED_BASIC %}
<a href='{{ billing_base_url }}/billing' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
{% if on_free_trial %}
Current plan (free trial)
{% else %}
Current plan
{% endif %}
</a>
{% elif is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY %}
<a href="mailto:sales@zulip.com" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Contact sales
</a>
{% elif is_self_hosted_realm %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_basic }}" class="button upgrade-button">
{% if free_trial_days %}
Start {{ free_trial_days }}-day free trial
{% else %}
Upgrade to Basic
{% endif %}
</a>
{% else %}
<a href="/help/self-hosted-billing" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Log in to upgrade
</a>
{% endif %}
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2 class="with-fine-print">Business <small>25 users minimum</small></h2>
<ul class="feature-list">
<li><span>Complete team chat solution, with <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">all Zulip features</a> included</span></li>
<li><span>Unlimited <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">mobile notifications</a></span></li>
<li class="support-note"><span>Email and chat support for:</span></li>
<li><span><a href="/help/saml-authentication">SSO with SAML, Microsoft Entra ID</a></span></li>
<li><span><a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html">AD/LDAP user sync </a></span></li>
<li><span><a href="/help/guest-users">Guests</a> with configurable access</span></li>
<li><span><a href="/help/export-your-organization">Full</a> and <a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#compliance-exports">compliance</a> data exports</span></li>
<li><span><a href="/help/message-retention-policy">Data retention policies</a></span></li>
<li class="comparison-table-pointer"><span>And <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">much more</a>!</span></li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
<div class="standard-price-box">
{% if (has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BUSINESS)
or (is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Business")
or (is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY)%}
<div class="price"><span class="currency-symbol">$</span>6.67</div>
<div class="details">
<p>
/user/month billed annually
or&nbsp;<b>$8</b>&nbsp;billed monthly
</p>
</div>
{% else %}
<div class="price"><span class="currency-symbol">$</span>6.67</div>
<div class="details">
<p>
/user/month billed annually
or&nbsp;<b>$8</b>&nbsp;billed monthly
</p>
</div>
<div class="discount">
<b>$20/month off</b> for the first year!
</div>
{% endif %}
</div>
{% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_BUSINESS %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled
</a>
{% elif is_self_hosted_realm and sponsorship_pending and requested_sponsorship_plan == "Business" %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_business }}" class="button current-plan-button" type="button">
Sponsorship requested
</a>
{% elif is_self_hosted_realm and on_free_tier and not sponsorship_pending %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_business }}" class="button upgrade-button">
Upgrade to Business
</a>
{% elif is_self_hosted_realm and customer_plan and customer_plan.tier == customer_plan.TIER_SELF_HOSTED_BUSINESS %}
<a href='{{ billing_base_url }}/billing' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
{% if on_free_trial %}
Current plan (free trial)
{% else %}
Current plan
{% endif %}
</a>
{% elif is_self_hosted_realm and customer_plan and customer_plan.tier != customer_plan.TIER_SELF_HOSTED_LEGACY %}
<a href="mailto:sales@zulip.com" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Contact sales
</a>
{% elif is_self_hosted_realm %}
<a href="{{ billing_base_url }}/upgrade/?tier={{ tier_self_hosted_business }}" class="button upgrade-button">
Upgrade to Business
</a>
{% else %}
<a href="/help/self-hosted-billing" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Log in to upgrade
</a>
{% endif %}
</div>
</div>
</div>
<div class="price-box" tabindex="-1">
<div class="text-content">
<h2>Enterprise</h2>
<ul class="feature-list">
<li><span>Complete team chat solution, with <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">all Zulip features</a> included</span></li>
<li><span>Unlimited <a href="https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html">mobile notifications</a></span></li>
<li class="support-note"><span>Email, chat and phone support for:</span></li>
<li><span><a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#openid-connect">SSO with OpenID Connect</a></span></li>
<li><span><a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html">AD/LDAP</a>, <a href="https://zulip.readthedocs.io/en/latest/production/authentication-methods.html#synchronizing-group-membership">SAML and OpenID Connect</a> group sync</span></li>
<li><span><a href="/help/scim">SCIM user and group sync</a></span></li>
<li><span>Implementation consulting</span></li>
<li><span>Custom feature development</span></li>
<li><span>Advanced deployment options</span></li>
<li class="comparison-table-pointer"><span>And <a href="{{ billing_base_url }}/plans/#self-hosted-plan-comparison">much more!</a></span></li>
</ul>
</div>
<div class="bottom">
<div class="text-content">
{% if has_scheduled_upgrade and scheduled_upgrade_plan.tier == scheduled_upgrade_plan.TIER_SELF_HOSTED_ENTERPRISE %}
<a href="{{ billing_base_url }}/billing/" class="button current-plan-button">
Upgrade is scheduled
</a>
{% elif is_self_hosted_realm and customer_plan and customer_plan.tier == customer_plan.TIER_SELF_HOSTED_ENTERPRISE %}
<a href='{{ billing_base_url }}/billing' class="button current-plan-button" type="button">
<i class="icon current-plan-icon"></i>
Current plan
</a>
{% else %}
<a href="mailto:sales@zulip.com" target="_blank" rel="noopener noreferrer" class="button upgrade-button">
Contact sales
</a>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -0,0 +1,568 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Why engineers love Zulip" %}
{% set PAGE_DESCRIPTION = "Learn why engineers love Zulip organized team chat." %}
{% block marketing_content %}
<div
id="engineers-love-zulip-page"
class="portico-landing why-page solutions-page self-hosting-page zulip-cloud-page"
>
<div class="hero bg-pycon programmer">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Why engineers love Zulip</h1>
</div>
<div class="hero-buttons center">
<a href="/for/business/" class="button">
{{ _('Zulip for business') }}
</a>
<a href="/for/open-source/" class="button">
{{ _('Zulip for open source') }}
</a>
</div>
</div>
<div class="alternative-features">
<!-- Chat that helps engineers focus -->
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>Chat that helps engineers focus (really!)</h1>
<p>
Rather than task-switching each time a new message comes
in, <a href="/why-zulip/">Zulip's threading model</a>
lets you focus on your work for a few hours, and then
<strong>respond asynchronously</strong>. Your messages
won’t interrupt newer discussions or get missed in a
side thread.
</p>
<p>
You can have
<strong>substantive conversations over chat</strong>,
instead of interrupting your flow with meetings.
</p>
<p>
<a
href="/help/mention-a-user-or-group#silently-mention-a-user"
>
Silent mentions
</a>
<b>tune down the noise</b> for non-urgent matters, and you can
<a href="/help/follow-a-topic">follow</a>
particular topics to get notified just where your timely
attention is needed.
</p>
</div>
</div>
<div class="feature-half">
<div class="feature-icon">
<img
class="image man-mobile-image grey-border"
alt='{{ _("Dog in glasses with a laptop") }}'
src="{{ static('images/landing-page/engineers/focus.jpg') }}"
/>
</div>
</div>
</div>
<!-- Understand the context behind decisions -->
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Screenshot of Zulip conversation") }}'
src="{{ static('images/landing-page/engineers/context.png') }}"
/>
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Understand the context behind technical and product
decisions
</h1>
<p>
<b>Context is right at hand</b> when you
<a
href="/help/link-to-a-message-or-conversation#link-to-zulip-from-anywhere"
>
link to Zulip conversations
</a>
from your issue tracker, design docs, emails, code
comments, etc.
</p>
<p>
With conversations
<a href="/help/introduction-to-topics"
>organized by topic</a
>, you can ask <b>follow-up questions in the same space</b>,
even months later.
</p>
<div class="intro_quote quote-in-feature-text">
<blockquote>
Zulip organizes ideas in such a clean and simple
way. You get <b>easy readability over months</b>, not just
hours like in other apps.
<div class="author">
&mdash; Nathan Kaplan, Head of Global Launch
Operations at <a
href="/case-studies/windborne/">WindBorne</a>
</div>
</blockquote>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Screenshot of Zulip conversation") }}'
src="{{ static('images/landing-page/engineers/context.png') }}"
/>
</div>
</div>
</div>
<!-- Monitor production systems -->
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Monitor production systems (without making your chat a
mess)
</h1>
<p>
Zulip’s native
<a href="/integrations/category/monitoring">
monitoring tool integrations
</a>
give you the updates you need <b>without disrupting human
conversations</b>.
</p>
<p>
High-volume automations can send messages to a
<strong>dedicated topic</strong> in your team’s channel.
(Your PM and designer can
<a href="/help/mute-a-topic">mute</a> this one. 😉)
There's no separate channel to keep track of.
</p>
<p>
Or use a
<strong>separate topic for each error or incident</strong>,
automatically creating a lightweight discussion space
for each problem your team needs to solve.
</p>
</div>
</div>
<div class="feature-half">
<div class="message-screenshot">
<img
class="image"
alt='{{ _("Screenshot of Zulip conversation with sentry bot") }}'
src="{{ static('images/landing-page/engineers/exceptions.png') }}"
/>
</div>
</div>
</div>
<!-- Stop stressing about missing important messages -->
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Screenshot of Zulip inbox") }}'
src="{{ static('images/landing-page/engineers/inbox.png') }}"
/>
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>Stop stressing about missing important messages</h1>
<p>
Ever miss a message because it got buried or lost in a
side thread? 🤦
</p>
<p>
In Zulip, new messages will pop their thread to the top,
making <b>updates easy to keep track of</b> in your
<a href="/help/inbox">inbox</a>,
<a href="/help/recent-conversations"
>recent conversations</a
>, and <a href="/help/left-sidebar">sidebar</a>.
</p>
<div class="intro_quote quote-in-feature-text">
<blockquote>
Literally the day we moved to Zulip, all the
anxiety and stress of keeping up… was gone.
<div class="author">
&mdash; Dan Allen, <a
href="/case-studies/asciidoctor/">Asciidoctor</a>
project lead
</div>
</blockquote>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Screenshot of Zulip inbox") }}'
src="{{ static('images/landing-page/engineers/inbox.png') }}"
/>
</div>
</div>
</div>
<!-- Team chat as an organized knowledge base -->
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>Team chat becomes an organized knowledge base</h1>
<p>
With conversations organized by topic, it’s easy to
<a href="/help/search-for-messages">find</a> discussions
that help you <b>understand past work</b>, expert
opinions, and decisions, and to <b>onboard</b> new team
members.
</p>
<div class="intro_quote quote-in-feature-text">
<blockquote>
Using Zulip in a way that feels natural creates an
organized repository of knowledge as a side effect.
<div class="author">
&mdash; Max McCrea, Co-founder of
<a
href="https://monadical.com/posts/how-to-make-remote-work-part-two-zulip.html"
>
Monadical
</a>
</div>
</blockquote>
</div>
<p>
Zulip lets you <b>keep discussions organized</b> by
<a href="/help/move-content-to-another-channel">moving</a> or
<a href="/help/move-content-to-another-topic"
>splitting</a
>
topics when conversations digress.
</p>
</div>
</div>
<div class="feature-half">
<div class="feature-icon">
<img
class="mirror-image man-mobile-image grey-border"
alt='{{ _("Open laptop with book inside") }}'
src="{{ static('images/landing-page/engineers/knowledge-base.jpg') }}"
/>
</div>
</div>
</div>
<!-- Open-source platform you can help make better -->
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Two hands assembling puzzle") }}'
src="{{ static('images/landing-page/hands.jpg') }}"
/>
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Open-source platform <em>you</em> can help make even better
</h1>
<p>
We are a <a href="/values/">values-focused</a> startup,
not a faceless mega-corporation.
</p>
<p>
You can
<a
href="https://zulip.readthedocs.io/en/stable/contributing/reporting-bugs.html"
>
report bugs
</a>
and
<a
href="https://zulip.readthedocs.io/en/stable/contributing/suggesting-features.html"
>
give product feedback
</a>
<b>directly to the product and engineering team</b> in
the
<a href="/development-community/">
Zulip development community </a
>.
</p>
<p>
<a
href="https://zulip.readthedocs.io/en/latest/contributing/reviewable-prs.html"
>
Submit a pull request
</a>
or
<a
href="https://zulip.readthedocs.io/en/latest/production/modify.html"
>
run a fork
</a>
to <b>fix anything</b> that’s bugging you.
</p>
<p>
Our support is staffed by
<em>thoughtful people</em> whose job is to actually
<b>solve your problems.</b>
</p>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-icon">
<img
class="image grey-border"
alt='{{ _("Two hands assembling puzzle") }}'
src="{{ static('images/landing-page/hands.jpg') }}"
/>
</div>
</div>
</div>
<div class="quote">
<div class="triangle"></div>
<blockquote>
I don’t like going back to Slack now. It’s just not as efficient
a way to organize communication.
<div class="author">
&mdash; James van Lommel, Director of Engineering at Semsee /
<a href="/case-studies/semsee/">Case study</a>
</div>
</blockquote>
</div>
<div class="feature-grid">
<div class="feature-end">
<h1>
Fan favorite features:
</h1>
</div>
<div class="feature-row">
<!-- Powerful Markdown formatting -->
<div class="feature-box">
<div class="feature-icon">
<img
src="{{ static('images/landing-page/engineers/message-square-code.svg') }}"
alt='{{ _("Message with code") }}'
/>
</div>
<div class="feature-text">
<h1>Powerful Markdown formatting</h1>
<ul>
<li>
<a href="/help/code-blocks"
>Zulip code blocks</a
>
come with <b>syntax highlighting</b> for over 250
languages, and integrated
<a href="/help/code-blocks#code-playgrounds"
><b>code playgrounds</b></a
>.
</li>
<li>
Code spans, media uploads, spoilers, GIFs,
lists, and more — <b>you control</b> how your
message looks.
</li>
<li>
Type
<a
href="/help/format-your-message-using-markdown#latex"
><b>LaTeX</b></a
>
directly into messages, and see it beautifully
rendered.
</li>
</ul>
</div>
</div>
<!-- Lightning fast -->
<div class="feature-box">
<div class="feature-icon">
<img
src="{{ static('images/landing-page/engineers/zap.svg') }}"
alt='{{ _("Lightning") }}'
/>
</div>
<div class="feature-text list-content">
<h1>Lightning fast</h1>
<ul>
<li>
Zulip is engineered to make every interaction
<b>snappy</b>.
</li>
<li>
Dozens of
<a href="/help/keyboard-shortcuts"
><b>keyboard shortcuts</b></a
>
let you add and upvote emoji reactions, jump to
the next unread conversation, reply, and more.
</li>
<li>
Adjust
<a href="/help/font-size">font size</a> and
<a href="/help/line-spacing">line spacing</a> to
<b>make reading feel pleasant</b>, and <b>fit as much
information</b> as you like.
</li>
</ul>
</div>
</div>
</div>
<div class="feature-row">
<div class="intro_quote quote-in-feature-text">
<blockquote>
The app is extremely fast — you click, and messages
show up instantly.
<div class="author">
— Erik Dittert, Head of IT at GUT contact / <a href="/case-studies/gut-contact/">Case study</a>
</div>
</blockquote>
</div>
</div>
<div class="feature-row">
<!-- Connect with other tools -->
<div class="feature-box">
<div class="feature-icon">
<img
src="{{ static('images/landing-page/engineers/link.svg') }}"
alt='{{ _("Link") }}'
/>
</div>
<div class="feature-text">
<h1>Connect with other tools</h1>
<ul>
<li>
<a href="/help/add-a-custom-linkifier"><b>Configure
linkifiers</b></a> for issues (e.g, “JIRA-1234”
or “#1234”), documentation pages, websites, and
more.
</li>
<li>
<b>Native integrations</b> for GitHub, Jira, and
<a href="/integrations/"
>hundreds of other tools</a
>
can initiate new topics, creating lightweight
discussion spaces for each issue.
</li>
<li>
For a <b>smooth transition</b>, integrations
written for Slack can post into Zulip via the
<a href="/integrations/slack_incoming"
>Slack compatible webhook</a
>.
</li>
</ul>
</div>
</div>
<!-- You've got control -->
<div class="feature-box">
<div class="feature-icon">
<img
src="{{ static('images/landing-page/engineers/ship-wheel.svg') }}"
alt='{{ _("Ship wheel") }}'
/>
</div>
<div class="feature-text">
<h1>You've got control</h1>
<ul>
<li>
Make Zulip <b>suit your preferences</b> with
flexible settings for <a
href="/help/channel-notifications">notifications</a>,
<a
href="/help/review-your-settings#review-your-privacy-settings">privacy</a>,
and <a
href="/help/review-your-settings">more</a>. You
can <a
href="/help/configure-default-new-user-settings">configure
default settings</a> for new users.
</li>
<li>
Easily write <a
href="/api/integrations-overview"><b>custom
integrations</b></a> with simple, intuitive and
stable <a href="/api/">APIs</a>. Pull message
history into an LLM without arbitrary API use
restrictions.
</li>
<li>
Keep full control of your data when you <a
href="/self-hosting/">self-host</a>.
</li>
</ul>
</div>
</div>
</div>
<div class="feature-row">
<div class="intro_quote quote-in-feature-text">
<blockquote>
If you integrate an LLM bot into Slack, you can't
manage its context window — off-topic messages can
poison the context. With Zulip, you can always just
start a new topic, and move messages around as needed.
<div class="author">
— John Dean, Co-founder and CEO of WindBorne / <a href="/case-studies/windborne/">Case study</a>
</div>
</blockquote>
</div>
</div>
</div>
<div class="feature-end">
<p>
Learn how engineers at
<a href="/case-studies/end-point/">End Point Dev</a>,
<a href="/case-studies/atolio">Atolio</a>, and
<a href="/case-studies/rust/">the Rust language community</a>
are using Zulip. Please reach out to
<a href="mailto:sales@zulip.com">sales@zulip.com</a> with any
questions, or drop by our
<a href="/development-community/"
>friendly development community</a
>.
</p>
<div class="bottom-register-buttons">
<h1>Join other engineers who love using Zulip!</h1>
<div class="hero-buttons center">
<a href="/new/" class="button">
{{ _('Create organization') }}
</a>
<a href="/for/business/" class="button">
{{ _('Zulip for business') }}
</a>
<a href="/self-hosting/" class="button">
{{ _('Self-host Zulip') }}
</a>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,30 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Security | Zulip" %}
{% set PAGE_DESCRIPTION = "Making sure your information stays protected is our
highest priority. Learn how Zulip’s security strategy covers all aspects of our
product and business." %}
{% block marketing_content %}
<div class="portico-landing why-page">
<div class="hero bg-pycon security">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Zulip security</h1>
<p></p>
</div>
</div>
<div class="main">
<div class="padded-content">
<div class="inner-content markdown">
{{ render_markdown_path('corporate/security.md') }}
</div>
</div>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,228 @@
We take the trust our users put in Zulip extremely seriously. Our security model
is designed to be:
- **Secure by default**: Your data is protected out-of-the-box.
- **Well-documented** and **easy to understand**, so that you’re never caught by
surprise.
- **Flexible**, so that you can configure Zulip according to your organization’s
needs.
This page will walk you Zulip's security tools and practices:
- [Compliance support](#zulip-serves-your-compliance-needs)
- [Data encryption](#data-is-encrypted-for-your-protection)
- [Tools to protect your data when you self-host](#self-hosting-we-give-you-the-tools-to-protect-your-data)
- [How we keep your organization secure on Zulip Cloud](#zulip-cloud-we-keep-your-organization-secure)
- [Zulip's robust 100% open-source system](#robust-100-open-source-system)
- [Highly configurable access controls](#highly-configurable-access-controls)
- [Our responsible vulnerability disclosure program](#responsible-disclosure-program)
---
## Zulip serves your compliance needs
- [GDPR and CCPA compliant](https://zulip.com/help/gdpr-compliance)
- Self-hosting facilitates HIPAA and FERPA compliance
- [Message editing and deletion policies](/help/restrict-message-editing-and-deletion)
- [Global and per-channel data retention policies](/help/message-retention-policy)
- Detailed audit log of administrative actions
- [Complete data exports](/help/export-your-organization)
- [Compliance exports](https://zulip.readthedocs.io/en/stable/production/export-and-import.html#compliance-exports)
---
## Data is encrypted for your protection
### Secure data transmission
All Zulip clients require [TLS
encryption](https://zulip.readthedocs.io/en/stable/production/ssl-certificates.html)
and authentication over HTTPS for data transmission to and from the server, both
on LAN and the Internet.
### End-to-end encryption (E2EE) for push notification content
[Zulip's E2EE
protocol](https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html#security-and-privacy)
ensures that message **content** and **metadata** (including the sender's and
recipient's names, or channel and topic where the message was sent) are not
visible to Apple, Google, or Zulip's [Mobile Push Notification
Service](https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html).
### Secure integrations
[Integrations](/integrations/) use TLS encryption and authentication over HTTPS
for data transmission. Administrators can browse,
[manage](https://zulip.com/help/manage-a-bot), and
[deactivate](https://zulip.com/help/deactivate-or-reactivate-a-bot)
integrations.
---
## Self-hosting: We give you the tools to protect your data
### Support for encryption in transit and at rest
Encrypt your database, uploads, and backups at rest on infrastructure you
control. All connections between parts of the Zulip system are secured
out-of-the-box with encryption, a protected network like a local socket, or
both. All of the inter-service connections are also authenticated, to provide a
defensive-by-default security posture, and prevent SSRF attacks.
### Firewalled and air-gapped deployments
Zulip can be hosted entirely behind your firewall, or on an air-gapped network.
### Custom security policies
- [Configurable](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#email-and-password)
password strength requirements.
- Administrators can revoke and reset any user’s credentials.
- Configurable [session
length](https://github.com/zulip/zulip/search?q=SESSION_COOKIE_AGE&type=code)
and [idle
timeouts](https://github.com/zulip/zulip/search?q=SESSION_EXPIRE_AT_BROWSER_CLOSE&type=code).
- Configurable log rotation policies.
- [Configurable rate
limits](https://zulip.readthedocs.io/en/stable/production/securing-your-zulip-server.html#understand-zulip-s-rate-limiting-system)
for API endpoints and authentication attempts.
---
## Zulip Cloud: We keep your organization secure
- All customer data is encrypted in transit and at rest.
- [Strong
passwords](https://zulip.readthedocs.io/en/stable/production/password-strength.html)
are required with the zxcvbn password strength checker.
- Users can [rotate](https://zulip.com/help/protect-your-account) their account
credentials.
- To protect your privacy, error handling systems exclude user message content
in reports.
- Data and server access is limited to a very small number of staff.
---
## Robust 100% open-source system
Your security team and independent security researchers have access to [Zulip’s
entire codebase](https://github.com/zulip), and can thus fully audit the system
for security issues. We are proud of our industry-leading efforts to prevent
security issues from being introduced in Zulip.
### Development process
- **Comprehensive automated testing**: The Zulip server has an remarkably
complete automated test suite, including [complete test
coverage](https://app.codecov.io/gh/zulip/zulip/tree/main/zerver) in
security-sensitive code paths.
- **Stable, carefully audited APIs**: All clients share a common, highly stable
[API](https://zulip.com/api/). API changes are carefully reviewed for security
and necessity, and documented in a [readable API
changelog](https://zulip.com/api/changelog).
- **Disciplined code review:** Zulip is known for its unusually disciplined
[code review
process](https://zulip.readthedocs.io/en/latest/contributing/review-process.html),
ensuring that all changes are carefully verified by our maintainer team.
### System design
- **Static typing**: The Zulip server
[pioneered](https://blog.zulip.org/2016/10/13/static-types-in-python-oh-mypy/)
statically typed Python. Extensive use of both standard and custom linters
helps prevent several classes of common security bugs.
- **Access control**: Access to user data (messages, channels, uploaded files,
etc.) in the Zulip server is mediated through carefully-audited core libraries
that consistently validate access controls.
- **Minimizing supply chain risk:** Dependencies are evaluated for quality,
maintainability, and necessity before being integrated into the system.
---
## Highly configurable access controls
### Identity management your way
- [Email authentication](/help/invite-users-to-join), with option to [restrict
email
domains](/help/restrict-account-creation#configuring-email-domain-restrictions)
- [OAuth social logins](/help/configure-authentication-methods) (Google, GitHub,
GitLab, Apple)
- SSO with [SAML](/help/saml-authentication) (Including Okta and OneLogin),
[Microsoft Entra
ID](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#microsoft-entra-id),
[OpenID
Connect](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#openid-connect)
- [AD/LDAP user and group
sync](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#ldap-including-active-directory)
- [SAML user and group sync](/help/saml-authentication)
- [SCIM user and group sync](/help/scim)
- Configure whether users can change their
[names](/help/restrict-name-and-email-changes), [email
addresses](/help/restrict-name-and-email-changes), and
[avatars](/help/restrict-profile-picture-changes)
- [Minimum app
version](https://zulip.readthedocs.io/en/latest/overview/release-lifecycle.html#desktop-app)
for the desktop app
- [100+ authentication
options](https://python-social-auth.readthedocs.io/en/latest/backends/index.html#social-backends)
with python-social-auth (self-hosted)
### Configure data access and messaging policies
- [Private channels with shared history](/help/channel-permissions#private-channels)
- [Private channels with private history](/help/channel-permissions#private-channels)
- [Channel posting permissions](/help/channel-posting-policy)
- [Direct messaging permissions](/help/restrict-direct-messages)
- [Customize permissions by channel](/help/channel-permissions)
- Authenticated access to uploaded files
- [Custom terms of service and privacy
policy](https://zulip.readthedocs.io/en/stable/production/settings.html#terms-of-service-and-privacy-policy)
- [Configurable waiting period](/help/restrict-permissions-of-new-members) for new users
### Custom permissions with comprehensive audit log
- [Role-based access control](/help/user-roles)
- Control access by [roles](/help/user-roles), [custom
groups](/help/user-groups), and user accounts
- Grant [permissions](/help/manage-permissions) to roles, custom groups, and
individual users
- [Control](/help/manage-permissions) who can create channels, subscribe and
unsubscribe users, add custom emoji and integrations, and more
- Permissions for [editing](/help/restrict-message-editing-and-deletion),
[deleting](/help/restrict-message-editing-and-deletion) and
[moving](/help/restrict-moving-messages) messages, and an audit history of
these actions
- Permanent long-term audit log of important actions (e.g., changes to
passwords, email addresses, and channel subscriptions)
### Tightly controlled guest accounts for vendors, partners, and customers
[Guest users](/help/guest-users) cannot see any channels, unless they have been
specifically subscribed, and can never invite new users. You can limit guests’
ability to see other users, and warn users when they are DMing a guest to
prevent accidental disclosures.
---
## Responsible disclosure program
- We operate a private HackerOne vulnerability disclosure program, and credit
reporters for issues that were not discovered internally. See the [Zulip
security reporting policy](https://github.com/zulip/zulip/security/policy).
- We publish security releases for all security vulnerabilities, and publicly
disclose them [on our blog](https://blog.zulip.com/tag/security/) with CVE
numbers for tracking.
- Zulip Server security and maintenance releases are carefully engineered to
minimize the inherent risks of upgrading software, so there is never a reason
to run an insecure version. Announcements of serious vulnerabilities
[include](https://blog.zulip.com/2025/07/02/zulip-server-10-4-security-release/)
applicable mitigation guidance.
- We responsibly report vulnerabilities we discover in our upstream
dependencies.
---
## Learn more
For more information, check out our [guide on securing your Zulip
server](https://zulip.readthedocs.io/en/stable/production/securing-your-zulip-server.html).

View File

@@ -0,0 +1,287 @@
{% extends "zerver/marketing_page.html" %}
{% set PAGE_TITLE = "Self-host Zulip" %}
{% set PAGE_DESCRIPTION = "Open-source team chat with enterprise-grade
reliability and security. Take charge of your mission-critical communication
platform." %}
{% block marketing_content %}
<div class="portico-landing why-page solutions-page self-hosting-page">
<div class="hero bg-pycon security">
<div class="bg-dimmer"></div>
<div class="content">
<h1 class="center">Self-host Zulip today.</h1>
<p>Open-source team chat with enterprise-grade reliability and security.</p>
</div>
<div class="hero-buttons center">
<a href="/request-demo/" class="button">
{{ _('Get a demo') }}
</a>
<a href="https://zulip.readthedocs.io/en/stable/production/install.html" class="button">
Install Zulip Server {{ latest_release_version }}
</a>
<a href="/for/business/" class="button">
{{ _('Zulip for business') }}
</a>
</div>
</div>
<div class="alternative-features">
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
100% open-source software.
</h1>
<p>
When you self-host Zulip, you get <a href="https://github.com/zulip/zulip#readme">
the same software</a> as our <a href="/plans/">Zulip Cloud</a> customers.
</p>
<p>
Unlike the competition, you don't pay for
<a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html">SAML
authentication</a>, <a href="https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#synchronizing-data">LDAP
sync</a>, or advanced <a href="/help/user-roles">roles</a> and <a href="/help/manage-permissions">permissions</a>. There
is no “open core” catch — just freely available world-class software.
</p>
</div>
</div>
<div class="feature-half">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/open_source/build_inclusive_communities.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-icon">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/privacy.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Enterprise-grade security and compliance.
</h1>
<p>
Protect your sensitive conversations and simplify
compliance by self-hosting Zulip behind your
firewall.
</p>
<p>
Zulip's <a
href="/help/configure-authentication-methods">authentication</a>
and <a
href="/help/manage-permissions">permissions</a>
systems are designed to flexibly support every
organization's security tools and policies.
</p>
<p>Making sure your information stays protected is <a href="https://zulip.com/security/">our highest priority</a>.</p>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-icon">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/privacy.svg') }}" />
</div>
</div>
</div>
<div class="feature-container">
<div class="feature-half">
<div class="feature-text">
<h1>
Take charge of your mission-critical communication platform.
</h1>
<p>
Keep full control of your data and avoid <a
href="https://www.theverge.com/2021/9/30/22702876/slack-is-down-outage-morning-disruption-work-chat">
unpredictable downtime</a>
from <a
href="https://www.theverge.com/2021/4/27/22405300/microsoft-teams-down-outage-worldwide-issues">SaaS
team chat vendors</a> by hosting Zulip on
your own infrastructure.
</p>
<p>
Our extensive <a
href="https://zulip.readthedocs.io/en/stable/production/settings.html">
configuration options</a> let you set up Zulip
to suit the needs of your organization.
Zulip offers <a
href="/integrations/">over one hundred native
integrations</a>, and hundreds more via third-party
extensions.
</p>
</div>
</div>
<div class="feature-half">
<div class="feature-icon">
<img class="mirror-image" alt="" src="{{ static('images/landing-page/education/mobile.svg') }}" />
</div>
</div>
</div>
<div class="feature-container alternate-grid">
<div class="feature-half md-hide">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
<div class="feature-half">
<div class="feature-text">
<h1>
Installation and upgrades that Just Work.
</h1>
<p>
Our well-documented scripts help you
<a href="https://zulip.readthedocs.io/en/stable/production/install.html">set up</a>,
<a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html#backups">back up</a>, and
<a href="https://zulip.readthedocs.io/en/stable/production/upgrade.html">upgrade</a>
your self-hosted Zulip installation. Migrate your
<a href="/help/migrating-from-other-chat-tools">data</a>
and <a href="/integrations/slack_incoming">integrations</a>
from other chat tools for a smooth transition.
</p>
<p>
Self-host Zulip directly on Ubuntu or Debian Linux,
in <a href="https://github.com/zulip/docker-zulip">Docker</a>,
or with prebuilt images for <a href="https://marketplace.digitalocean.com/apps/zulip">Digital Ocean</a>
and <a href="https://render.com/docs/deploy-zulip">Render</a>.
</p>
<div class="intro_quote quote-in-feature-text">
<blockquote>
Zulip was quite easy to set up, and worked instantly. 1000 people — no problem.
<div class="author">
&mdash; Erik Dittert, Head of IT at <a href="/case-studies/gut-contact/">GUT contact</a>
</div>
</blockquote>
</div>
</div>
</div>
<div class="feature-half md-display">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/education/flexible-administration.svg') }}" />
</div>
</div>
</div>
</div>
<div class="quote">
<div class="triangle"></div>
<blockquote>
Zulip has been extremely stable and requires no maintenance beyond installing updates.
<div class="author">
&mdash; Robert Imschweiler, <a href="/case-studies/tum/">Technical University of Munich</a>
</div>
</blockquote>
</div>
<div class="feature-grid">
<div class="feature-row">
<div class="feature-box">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/self-hosting/growth.png') }}" />
</div>
<div class="feature-text">
<h1>
Rock-solid reliability at scale.
</h1>
<p>
Zulip is engineered to make every interaction snappy and
efficient, even for organizations with 10,000s of users,
with a simple deployment on
<a href="https://zulip.readthedocs.io/en/stable/production/requirements.html#scalability">
modest hardware</a>.
</p>
<p>
With a user experience designed to work great at any
size, organizations that send <a
href="/case-studies/rust/">thousands</a> of <a
href="/case-studies/tum/">messages</a> per week <a
href="/case-studies/lean/">thrive on Zulip</a>.
</p>
</div>
</div>
<div class="feature-box">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/self-hosting/database.png') }}" />
</div>
<div class="feature-text">
<h1>
No lock-in.
</h1>
<p>
You can <a href="https://zulip.com/help/zulip-cloud-or-self-hosting">move
freely</a> between <a href="/plans/">Zulip Cloud</a>
hosting and your own servers with our high quality <a
href="/help/export-your-organization">export</a> and
<a href="https://zulip.readthedocs.io/en/stable/production/export-and-import.html">import
</a> tools.
</p>
<p>
Zulip also supports exporting your organization's
message history to a <a
href="https://github.com/zulip/zulip-archive">static
HTML archive</a>.
</p>
</div>
</div>
</div>
<div class="feature-row">
<div class="feature-box">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/self-hosting/fork.png') }}" />
</div>
<div class="feature-text">
<h1>
Yours to customize.
</h1>
<p>
<a href="https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html">Creating custom integrations</a>
is a breeze with our well-documented <a href="/api/">REST API</a>.
</p>
<p>
Zulip makes it easy to
<a href="https://zulip.readthedocs.io/en/stable/production/modify.html">
maintain a fork</a> with customized features, with 225,000 words of documentation for
system administrators and developers.
</p>
</div>
</div>
<div class="feature-box">
<div class="feature-icon">
<img alt="" src="{{ static('images/landing-page/self-hosting/help.png') }}" />
</div>
<div class="feature-text">
<h1>
Amazing support experience.
</h1>
<p>
We love getting feedback! Stop by <a href="/development-community/">our friendly
development community</a> to ask for help or suggest
improvements.
</p>
<p>
A variety of support services are available for Zulip
Business and Zulip Enterprise customers. Contact <a
href="mailto:sales@zulip.com">sales@zulip.com</a> with
any questions.
</p>
</div>
</div>
</div>
</div>
<div class="portico-pricing showing-self-hosted">
{% with %}
{% set rendering_page="self_hosting" %}
{% include "corporate/pricing_model.html" %}
{% endwith %}
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,4 @@
<b>Organization type</b>: {{ get_org_type_display_name(realm.org_type) }}<br />
<b>Plan type</b>: {{ get_plan_type_name(realm.plan_type) }}<br />
<b>Non-guest user count</b>: {{ user_data.non_guest_user_count }}<br />
<b>Guest user count</b>: {{ user_data.guest_user_count }}<br />

View File

@@ -0,0 +1,38 @@
<div class="current-plan-information">
<p class="support-section-header">
{% if plan_data.stripe_customer_url %}
<a target="_blank" rel="noopener noreferrer" href="{{ plan_data.stripe_customer_url }}"><i class="fa fa-credit-card"></i></a>
{% else %}
<i class="fa fa-credit-card"></i>
{% endif %}
Current plan information:
</p>
{% if plan_data.warning %}
<div class="current-plan-data-missing">
<b>{{ plan_data.warning }}</b><br />
</div>
{% endif %}
<b>Plan name</b>: {{ plan_data.current_plan.name }}<br />
<b>Status</b>: {{ plan_data.current_plan.get_plan_status_as_text() }}<br />
{% if plan_data.current_plan.tier == plan_data.current_plan.TIER_SELF_HOSTED_COMMUNITY %}
<!-- Any data below doesn't makes sense for sponsored organizations. -->
{% else %}
{% if plan_data.current_plan.discount %}
<b>Discount</b>: {{ plan_data.current_plan.discount }}%<br />
{% endif %}
{% if plan_data.is_complimentary_access_plan %}
<b>End date</b>: {{ plan_data.current_plan.end_date.strftime('%d %B %Y') }}<br />
{% else %}
<b>Licenses</b>: {{ plan_data.licenses_used }}/{{ plan_data.licenses }} ({% if plan_data.current_plan.automanage_licenses %}Automatic{% else %}Manual{% endif %})<br />
<b>Billing schedule</b>: {% if plan_data.current_plan.billing_schedule == plan_data.current_plan.BILLING_SCHEDULE_ANNUAL %}Annual{% else %}Monthly{% endif %}<br />
{% if plan_data.current_plan.price_per_license %}
<b>Price per license</b>: ${{ dollar_amount(plan_data.current_plan.price_per_license) }}<br />
{% elif plan_data.current_plan.fixed_price %}
<b>Plan type</b>: Fixed price<br />
{% endif %}
<b>Annual recurring revenue</b>: ${{ dollar_amount(plan_data.annual_recurring_revenue) }}<br />
<b>Start of next billing cycle</b>: {{ plan_data.next_billing_cycle_start.strftime('%d %B %Y') }}<br />
{% endif %}
<a target="_blank" rel="noopener noreferrer" href="/activity/plan_ledger/{{ plan_data.current_plan.id }}/">License ledger entries</a><br />
{% endif %}
</div>

View File

@@ -0,0 +1,37 @@
<form method="POST" class="support-form">
<b>Billing collection method</b><br />
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<select name="billing_modality" class="billing-modality-select" required>
<option value="charge_automatically" {% if current_plan.charge_automatically %}selected{% endif %}>Charge automatically</option>
<option value="send_invoice" {% if not current_plan.charge_automatically %}selected{% endif %}>Pay by invoice</option>
</select>
<button type="submit" class="support-submit-button">Update</button>
</form>
{% if current_plan.status == current_plan.ACTIVE %}
<form method="POST" class="support-form">
<b>Plan end date</b><br />
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<input type="date" name="plan_end_date" {% if current_plan.end_date %}
value="{{ current_plan.end_date.date().isoformat() }}" {% endif %} required />
<button type="submit" class="support-submit-button">Update</button>
</form>
{% endif %}
<form method="POST" class="support-form">
<b>Modify current plan</b><br />
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<select name="modify_plan" class="modify-plan-method-select" required>
<option disabled value="" selected>-- select --</option>
<option value="downgrade_at_billing_cycle_end">Downgrade at the end of current billing cycle</option>
<option value="downgrade_now_without_additional_licenses">Downgrade now without creating additional invoices</option>
<option value="downgrade_now_void_open_invoices">Downgrade now and void open invoices</option>
{% if not remote_support_view and not current_plan.fixed_price %}
<option value="upgrade_plan_tier">Upgrade to the Plus plan</option>
{% endif %}
</select>
<button type="submit" class="support-submit-button">Modify</button>
</form>

View File

@@ -0,0 +1,26 @@
<div class="deactivation-information">
{% if remote_support_view %}
<p class="support-section-header">♻️ Reactivate server:</p>
{% else %}
<p class="support-section-header">❌ Scrub realm:</p>
{% endif %}
{% if deactivation_data %}
<b>Deactivation audit log data:</b><br />
<ul>
<li><b>Event time (UTC)</b>: {{ format_optional_datetime(deactivation_data.event_time, True) }}</li>
{% if deactivation_data.acting_user %}
<li><b>Acting user</b>: {{ deactivation_data.acting_user.delivery_email}} (ID: {{ deactivation_data.acting_user.id }})</li>
{% else %}
<li><b>Acting user</b>: Not in audit log data</li>
{% endif %}
{% if deactivation_data.billing_user %}
<li><b>Billing user</b>: {{ deactivation_data.billing_user.email}} (ID: {{ deactivation_data.billing_user.id }})</li>
{% endif %}
{% if deactivation_data.reason %}
<li><b>Deactivation reason</b>: {{ deactivation_data.reason }}</li>
{% else %}
<li><b>Deactivation reason</b>: Not in audit log data</li>
{% endif %}
</ul>
{% endif %}
</div>

View File

@@ -0,0 +1,109 @@
{% extends "zerver/portico_signup.html" %}
{% set PAGE_TITLE = "Request a demo | Zulip" %}
{% block portico_content %}
<div class="register-account flex full-page">
<div class="center-block new-style">
<div class="pitch">
<h1>Request a demo</h1>
</div>
<form method="post" class="white-box" id="registration">
{{ csrf_input }}
<fieldset class="support-request">
<div class="input-box support-form-field">
<label for="request_demo_form_full_name" class="inline-block label-title">Full name</label>
<input id="request_demo_form_full_name" class="required" type="text" name="full_name" maxlength="{{ MAX_INPUT_LENGTH }}" value="{{ form.full_name.value() or '' }}" required />
{% for error in form.full_name.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_email" class="inline-block label-title">Email</label>
<input id="request_demo_form_email" class="required" type="email" name="email" value="{{ form.email.value() or '' }}" required />
{% for error in form.email.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_role" class="inline-block label-title">Your role</label>
<input id="request_demo_form_role" class="required" type="text" name="role" maxlength="{{ MAX_INPUT_LENGTH }}" value="{{ form.role.value() or '' }}" required />
{% for error in form.role.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_organization_name" class="inline-block label-title">Organization name</label>
<input id="request_demo_form_organization_name" class="required" type="text" name="organization_name" maxlength="{{ MAX_INPUT_LENGTH }}" value="{{ form.organization_name.value() or '' }}" required />
{% for error in form.organization_name.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_organization_type" class="inline-block label-title">Organization type</label>
<select id="request_demo_form_organization_type" name="organization_type" class="required">
{% for org_type in SORTED_ORG_TYPE_NAMES %}
<option
value="{{ org_type }}"
{% if form.organization_type.value() == org_type %}selected{% endif %}>
{{ org_type }}
</option>
{% endfor %}
</select>
{% for error in form.organization_type.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_organization_website" class="inline-block label-title">Organization website</label>
<input id="request_demo_form_organization_website" class="required" type="url" name="organization_website" value="{{ form.organization_website.value() or '' }}" required />
{% for error in form.organization_website.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_expected_user_count" class="inline-block label-title">Expected number of users (approximate range)</label>
<input id="request_demo_form_expected_user_count" class="required" type="text" name="expected_user_count" maxlength="{{ MAX_INPUT_LENGTH }}" value="{{ form.expected_user_count.value() or '' }}" required />
{% for error in form.expected_user_count.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_type_of_hosting" class="inline-block label-title">Are you interested in Zulip Cloud (SaaS) or self-hosting Zulip?</label>
<select id="request_demo_form_type_of_hosting" name="type_of_hosting" class="required">
<option value="" disabled {% if not form.type_of_hosting.value() %}selected{% endif %}>Select an option</option>
{% for hosting_option in TYPE_OF_HOSTING_OPTIONS %}
<option
value="{{ hosting_option }}"
{% if form.type_of_hosting.value() == hosting_option %}selected{% endif %}>
{{ hosting_option }}
</option>
{% endfor %}
</select>
{% for error in form.type_of_hosting.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="input-box support-form-field">
<label for="request_demo_form_message" class="inline-block label-title">How can we help?</label>
<textarea id="request_demo_form_message" name="message" cols="100" rows="5" required>{{ form.message.value() or '' }}</textarea>
{% for error in form.message.errors %}
<p class="help-inline text-error">{{ error }}</p>
{% endfor %}
</div>
<div class="register-button-box {% if 'captcha' in form.fields %}altcha-button-box{% endif %}">
<button class="register-button support-submit-button" type="submit">
<span>Submit</span>
<object class="loader" type="image/svg+xml" data="{{ static('images/loading/loader-white.svg') }}"></object>
</button>
{% include 'zerver/altcha_form_field.html' %}
</div>
</fieldset>
</form>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,28 @@
<div class="next-plan-information">
<p class="support-section-header">⏱️ Next plan information:</p>
<b>Plan name</b>: {{ plan_data.next_plan.name }}<br />
<b>Status</b>: {{ plan_data.next_plan.get_plan_status_as_text() }}<br />
{% if plan_data.next_plan.price_per_license %}
<b>Start date</b>: {{ plan_data.next_plan.billing_cycle_anchor.strftime('%d %B %Y') }}<br />
<b>Billing schedule</b>: {% if plan_data.next_plan.billing_schedule == plan_data.next_plan.BILLING_SCHEDULE_ANNUAL %}Annual{% else %}Monthly{% endif %}<br />
{% if plan_data.next_plan.discount %}
<b>Discount</b>: {{ plan_data.next_plan.discount }}%<br />
{% endif %}
<b>Price per license</b>: ${{ dollar_amount(plan_data.next_plan.price_per_license) }}<br />
<b>Estimated billed licenses</b>: {{ plan_data.current_plan.licenses_at_next_renewal() }}<br />
{% elif plan_data.next_plan.fixed_price %}
<b>Plan has a fixed price.</b><br />
{% if plan_data.next_plan.sent_invoice_id %}
<b>Payment pending for Invoice ID</b>: {{plan_data.next_plan.sent_invoice_id}}<br />
{% endif %}
{% endif %}
<b>Estimated annual revenue</b>: ${{ dollar_amount(plan_data.estimated_next_plan_revenue) }}<br />
{% if plan_data.next_plan.fixed_price %}
<form method="POST" class="delete-next-fixed-price-plan-form">
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<input type="hidden" name="delete_fixed_price_next_plan" value="true" />
<button type="submit" class="delete-next-fixed-price-plan-button">Delete configured fixed price next plan</button>
</form>
{% endif %}
</div>

View File

@@ -0,0 +1,24 @@
<p class="support-section-header">⏱️ Schedule plan:</p>
<form method="POST" class="support-form">
<b>Configure fixed price plan:</b><br />
{% if not plan_data.is_current_plan_billable %}
<i>Enter Invoice ID only if the customer chose to pay by invoice.</i><br />
{% endif %}
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<input type="number" name="fixed_price" placeholder="Annual amount in dollars" required />
{% if not plan_data.is_current_plan_billable %}
<input type="text" name="sent_invoice_id" placeholder="Sent invoice ID" />
{% endif %}
<button type="submit" class="support-submit-button">Schedule</button>
</form>
{% if not plan_data.current_plan and remote_support_view %}
<form method="POST" class="support-form">
<b>Configure complimentary access plan:</b><br />
<i>Once created, the end date for the complimentary access plan can be extended.</i><br />
{{ csrf_input }}
<input type="hidden" name="{{ remote_type }}" value="{{ remote_id }}" />
<input type="date" name="complimentary_access_plan" required />
<button type="submit" class="support-submit-button">Create</button>
</form>
{% endif %}

View File

@@ -0,0 +1,6 @@
<div class="push-notification-status">
<p class="support-section-header">📶 Push notification status:</p>
<b>Can push</b>: {{ status.can_push }}<br />
<b>Expected end</b>: {{ format_optional_datetime(status.expected_end, True) }}<br />
<b>Message</b>: {{ status.message }}<br />
</div>

View File

@@ -0,0 +1,251 @@
{% set demo_organization_deletion = realm.demo_organization_scheduled_deletion_date %}
<div class="realm-support-information">
<span class="cloud-label">Cloud realm</span>
{% if realm.deactivated %}
<span class="deactivated-label">DEACTIVATED</span>
{% endif %}
{% if demo_organization_deletion %}
<span class="demo-label">DEMO ORGANIZATION</span>
{% endif %}
<h3><img src="{{ realm_icon_url(realm) }}" class="support-realm-icon" /> {{ realm.name }}</h3>
{% if realm.deactivated %}
{% if realm.scheduled_deletion_date %}
<p class="support-section-header">Scheduled data deletion on {{ realm.scheduled_deletion_date.strftime('%B, %d %Y') }} ⏰</p>
{% else %}
<p class="support-section-header">No scheduled data deletion date ⛔</p>
{% endif %}
{% endif %}
{% if realm.plan_type == SPONSORED_PLAN_TYPE %}
<p class="support-section-header">On 100% sponsored Zulip Standard Free 🎉</p>
{% endif %}
{% if realm_support_data[realm.id].sponsorship_data.has_discount %}
<p class="support-section-header">Has a discount 💸</p>
{% endif %}
{% if demo_organization_deletion %}
<p class="support-section-header">Demo data deletion on {{ demo_organization_deletion.strftime('%B %d, %Y') }} 🗑️</p>
{% endif %}
{% set realm_is_scrubbed = realm_support_data[realm.id].is_scrubbed %}
{% if realm_is_scrubbed %}
<b>Realm has been scrubbed</b>
{% elif realm.deactivated_redirect %}
<b>Placeholder realm</b><br />
<b>Redirects to</b>: {{ realm.deactivated_redirect }}
<a title="Copy URL" class="copy-button" data-clipboard-text="{{ realm.deactivated_redirect }}">
<i class="fa fa-copy"></i>
</a>
{% else %}
<b>URL</b>: <a target="_blank" rel="noopener noreferrer" href="{{ realm.url }}">{{ realm.url }}</a> |
<a target="_blank" rel="noopener noreferrer" href="/stats/realm/{{ realm.string_id }}/">stats</a> |
<a target="_blank" rel="noopener noreferrer" href="/realm_activity/{{ realm.string_id }}/">activity</a><br />
<b>Date created</b>: {{ realm.date_created|timesince }} ago<br />
{% set first_human_user = realm.get_first_human_user() %}
{% if demo_organization_deletion and first_human_user.delivery_email == "" %}
<b>Demo organization owner has not configured an email address.</b>
<br />
{% else %}
{% set owner_emails_string = get_realm_owner_emails_as_string(realm) %}
<b>Owners</b>: {{ owner_emails_string }}
{% if owner_emails_string %}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ owner_emails_string }}">
<i class="fa fa-copy"></i>
</a>
{% endif %}
<br />
{% set admin_emails_string = get_realm_admin_emails_as_string(realm) %}
<b>Admins</b>: {{ admin_emails_string }}
{% if admin_emails_string %}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ admin_emails_string }}">
<i class="fa fa-copy"></i>
</a>
{% endif %}
<br />
{% if first_human_user %}
<b>First human user</b>: {{ first_human_user.delivery_email }}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ first_human_user.delivery_email }}">
<i class="fa fa-copy"></i>
</a>
<br />
{% else %}
<b>First human user</b>:
<br />
{% endif %}
{% set billing_admins = realm.get_billing_admins_delivery_email() %}
{% if billing_admins %}
<b>Billing admins</b>: {{ billing_admins }}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ billing_admins }}">
<i class="fa fa-copy"></i>
</a>
<br />
{% else %}
<b>Billing admins</b>:
<br />
{% endif %}
{% endif %}
<br />
{% with %}
{% set realm = realm %}
{% set user_data = realm_support_data[realm.id].user_data %}
{% include 'corporate/support/basic_realm_data.html' %}
{% endwith %}
<br />
<b>File upload usage</b>: {{ realm_support_data[realm.id].file_upload_usage }}<br />
{% endif %}
</div>
{% if realm_is_scrubbed %}
{% elif not realm.deactivated_redirect %}
<div>
<div class="realm-management-actions">
<p class="support-section-header">🛠️ Realm management:</p>
{% if realm.deactivated %}
<form method="POST" class="support-form">
<b>Reactivate</b>:<br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<input type="hidden" name="status" value="active" />
<button type="submit" class="support-submit-button">Send reactivation email to owners</button>
</form>
{% else %}
<form method="POST" class="support-form">
<b>Deactivate</b>: (select reason)<br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<input type="hidden" name="status" value="deactivated" />
<select name="deactivation_reason" id="deactivation_reason">
{% for reason in DEACTIVATION_REASONS %}
{% if reason == "owner_request" %}
<option value="{{ reason }}" selected>{{ reason }}</option>
{% else %}
<option value="{{ reason }}">{{ reason }}</option>
{% endif %}
{% endfor %}
</select>
<button type="submit" class="support-submit-button">Deactivate realm</button>
</form>
<form method="POST" class="support-form">
<b>Organization type</b>:<br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<select name="org_type" id="org_type">
{% for organization_type in ORGANIZATION_TYPES %}
{% if realm.org_type == organization_type.id %}
<option value="{{ organization_type.id }}" selected>{{ organization_type.name }}</option>
{% else %}
<option value="{{ organization_type.id }}">{{ organization_type.name }}</option>
{% endif %}
{% endfor %}
</select>
<button type="submit" class="support-submit-button">Update</button>
</form>
<form method="POST" class="support-form">
<b>Plan type</b>: <i class="fa fa-question-circle-o" data-tippy-content="
Will also update maximum daily invitations to be the default value for the new plan type.
" data-tippy-maxWidth="auto"></i><br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<select name="plan_type">
{% for plan_type in REALM_PLAN_TYPES %}
{% if realm.plan_type == plan_type.value %}
<option value="{{ plan_type.value }}" selected>{{ plan_type.name }}</option>
{% else %}
<option value="{{ plan_type.value }}">{{ plan_type.name }}</option>
{% endif %}
{% endfor %}
</select>
<button type="submit" class="support-submit-button">Update</button>
</form>
<form method="POST" class="support-form">
<b>Maximum daily invitations</b>: <i class="fa fa-question-circle-o" data-tippy-content="
Setting to zero will attempt to reset this to the default maximum for the current plan type.
" data-tippy-maxWidth="auto"></i><br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<input type="number" name="max_invites" value="{{ realm.max_invites }}" min="0" required />
<button type="submit" class="support-submit-button">Update</button>
</form>
<form method="POST" class="support-form">
<b>New subdomain</b>: (max 40 characters)<br />
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<input type="text" id="new_subdomain" name="new_subdomain" placeholder="lowercase letters, numbers, and '-'s" required />
<span class="support-add-redirect-url-section">
<input type="checkbox" id="add_redirect_url" name="add_redirect_url" value="true" checked />
<label class="support-redirect-url-label" for="add_redirect_url">Redirect to new subdomain?</label>
</span>
<button type="submit" class="support-submit-button">Update</button>
</form>
{% endif %}
</div>
{% if not demo_organization_deletion %}
{% if realm.deactivated %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = realm_support_data[realm.id].sponsorship_data %}
{% set dollar_amount = dollar_amount %}
{% include 'corporate/support/sponsorship_details.html' %}
{% endwith %}
</div>
{% elif realm.plan_type != SPONSORED_PLAN_TYPE %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = realm_support_data[realm.id].sponsorship_data %}
{% set PLAN_TYPES = REALM_PLAN_TYPES_FOR_DISCOUNT %}
{% set remote_id = realm.id %}
{% set remote_type = "realm_id" %}
{% include 'corporate/support/sponsorship_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if realm_support_data[realm.id].plan_data.current_plan %}
<div class="current-plan-container">
{% with %}
{% set plan_data = realm_support_data[realm.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% include 'corporate/support/current_plan_details.html' %}
{% endwith %}
{% with %}
{% set current_plan = realm_support_data[realm.id].plan_data.current_plan %}
{% set remote_id = realm.id %}
{% set remote_type = "realm_id" %}
{% include 'corporate/support/current_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if realm_support_data[realm.id].plan_data.next_plan %}
<div class="next-plan-container">
{% with %}
{% set plan_data = realm_support_data[realm.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% set remote_id = realm.id %}
{% set remote_type = "realm_id" %}
{% include 'corporate/support/next_plan_details.html' %}
{% endwith %}
</div>
{% elif not realm.deactivated %}
<div class="next-plan-container">
{% with %}
{% set plan_data = realm_support_data[realm.id].plan_data %}
{% set remote_id = realm.id %}
{% set remote_type = "realm_id" %}
{% include 'corporate/support/next_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% endif %}
{% if realm.deactivated %}
<div class="deactivation-information-container">
{% with %}
{% set deactivation_data = realm_support_data[realm.id].deactivation_data %}
{% include 'corporate/support/deactivation_data.html' %}
{% endwith %}
<form method="POST" class="scrub-realm-form support-form">
{{ csrf_input }}
<input type="hidden" name="realm_id" value="{{ realm.id }}" />
<input type="hidden" name="scrub_realm" value="true" />
<button data-string-id="{{realm.string_id}}" class="scrub-realm-button">Scrub realm (danger)</button>
</form>
</div>
{% endif %}
</div>
{% endif %}

View File

@@ -0,0 +1,106 @@
<div class="remote-realm-container">
<div class="remote-realm-information">
<span class="remote-label">Remote realm</span>
<h3>{{ remote_realm.name }}</h3>
{% if remote_realm.realm_locally_deleted %}
<p class="support-section-header">Remote realm is locally deleted 🛑</p>
{% endif %}
{% if remote_realm.registration_deactivated %}
<p class="support-section-header">Remote realm registration deactivated 🛑</p>
{% endif %}
{% if remote_realm.realm_deactivated %}
<p class="support-section-header">Remote realm is deactivated on remote server 🛑</p>
{% endif %}
{% if remote_realm.plan_type == SPONSORED_PLAN_TYPE %}
<p class="support-section-header">On 100% sponsored Zulip Community plan 🎉</p>
{% endif %}
{% if support_data[remote_realm.id].sponsorship_data.has_discount %}
<p class="support-section-header">Has a discount 💸</p>
{% endif %}
<b>Remote realm host:</b> {{ remote_realm.host }}<br />
{% set billing_emails_string = get_remote_realm_billing_user_emails(remote_realm) %}
<b>Billing users</b>: {{ billing_emails_string }}
{% if billing_emails_string %}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ billing_emails_string }}">
<i class="fa fa-copy"></i>
</a>
{% endif %}
<br />
<b>Date created</b>: {{ support_data[remote_realm.id].date_created.strftime('%d %B %Y') }}<br />
<b>UUID</b>: {{ remote_realm.uuid }}<br />
<br />
{% with %}
{% set realm = remote_realm %}
{% set user_data = support_data[remote_realm.id].user_data %}
{% include 'corporate/support/basic_realm_data.html' %}
{% endwith %}
<br />
<b>Mobile user count</b>: {{ support_data[remote_realm.id].mobile_push_data.total_mobile_users }}<br />
<b>7-day mobile pushes count</b>: {{ support_data[remote_realm.id].mobile_push_data.mobile_pushes_forwarded }}<br />
<b>Last push notification date</b>: {{ support_data[remote_realm.id].mobile_push_data.last_mobile_push_sent }}<br />
</div>
{% with %}
{% set status = support_data[remote_realm.id].mobile_push_data.push_notification_status %}
{% include 'corporate/support/push_status_details.html' %}
{% endwith %}
{% if remote_server_deactivated %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = support_data[remote_realm.id].sponsorship_data %}
{% set dollar_amount = dollar_amount %}
{% include 'corporate/support/sponsorship_details.html' %}
{% endwith %}
</div>
{% elif remote_realm.plan_type != SPONSORED_PLAN_TYPE %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = support_data[remote_realm.id].sponsorship_data %}
{% set PLAN_TYPES = REMOTE_PLAN_TIERS %}
{% set remote_id = remote_realm.id %}
{% set remote_type = "remote_realm_id" %}
{% set has_fixed_price = support_data[remote_realm.id].plan_data.has_fixed_price %}
{% include 'corporate/support/sponsorship_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if support_data[remote_realm.id].plan_data.current_plan %}
<div class="current-plan-container">
{% with %}
{% set plan_data = support_data[remote_realm.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% include 'corporate/support/current_plan_details.html' %}
{% endwith %}
{% with %}
{% set current_plan = support_data[remote_realm.id].plan_data.current_plan %}
{% set remote_id = remote_realm.id %}
{% set remote_type = "remote_realm_id" %}
{% include 'corporate/support/current_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if support_data[remote_realm.id].plan_data.next_plan %}
<div class="next-plan-container">
{% with %}
{% set plan_data = support_data[remote_realm.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% set remote_id = remote_realm.id %}
{% set remote_type = "remote_realm_id" %}
{% include 'corporate/support/next_plan_details.html' %}
{% endwith %}
</div>
{% elif not remote_server_deactivated %}
<div class="next-plan-container">
{% with %}
{% set plan_data = support_data[remote_realm.id].plan_data %}
{% set remote_id = remote_realm.id %}
{% set remote_type = "remote_realm_id" %}
{% include 'corporate/support/next_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
</div>

View File

@@ -0,0 +1,214 @@
{% extends "zerver/base.html" %}
{% set entrypoint = "support" %}
{# Remote servers. #}
{% block title %}
<title>Remote servers</title>
{% endblock %}
{% block content %}
<div class="container">
<form class="support-search-form">
<center>
<input type="text" name="q" class="input-xxlarge search-query" placeholder="hostname, UUID or contact email" value="{{ request.GET.get('q', '') }}" autofocus />
<button type="submit" class="support-search-button">Search</button>
</center>
</form>
{% if error_message %}
<div class="alert alert-danger">
<center>
{{ error_message }}
</center>
</div>
{% elif success_message %}
<div class="alert alert-success">
<center>
{{ success_message }}
</center>
</div>
{% endif %}
<div id="remote-server-query-results">
{% for remote_server in remote_servers %}
{% if remote_server.deactivated %}
{% set remote_server_query_result_class = "remote-support-query-result remote-server-deactivated" %}
{% else %}
{% set remote_server_query_result_class = "remote-support-query-result" %}
{% endif %}
<div class="{{ remote_server_query_result_class }}">
<div class="remote-server-section">
<div class="remote-server-information">
<span class="remote-label">Remote server{% if remote_server.deactivated %}: deactivated{% endif %}</span>
<h3>{{ remote_server.hostname }} {{ server_analytics_link(remote_server.id ) }}</h3>
{% if remote_server.plan_type == SPONSORED_PLAN_TYPE %}
<p class="support-section-header">On 100% sponsored Zulip Community plan 🎉</p>
{% endif %}
{% if remote_servers_support_data[remote_server.id].sponsorship_data.has_discount %}
<p class="support-section-header">Has a discount 💸</p>
{% endif %}
<b>Contact email</b>: {{ remote_server.contact_email }}
<a title="Copy email" class="copy-button" data-clipboard-text="{{ remote_server.contact_email }}">
<i class="fa fa-copy"></i>
</a>
<br />
{% set billing_emails_string = get_remote_server_billing_user_emails(remote_server) %}
<b>Billing users</b>: {{ billing_emails_string }}
{% if billing_emails_string %}
<a title="Copy emails" class="copy-button" data-clipboard-text="{{ billing_emails_string }}">
<i class="fa fa-copy"></i>
</a>
{% endif %}
<br />
<b>UUID</b>: {{ remote_server.uuid }}<br />
<b>Date created</b>: {{ remote_servers_support_data[remote_server.id].date_created.strftime('%d %B %Y') }}<br />
<b>Zulip version</b>: {{ remote_server.last_version }}<br />
<b>Has remote realms</b>: {{ remote_realms[remote_server.id] != [] }}<br />
<br />
<b>Max monthly messages</b>: {{ remote_server_to_max_monthly_messages[remote_server.id] }}<br />
{% if remote_servers_support_data[remote_server.id].has_stale_audit_log %}
<span class="stale-audit-log"><b>Last audit log update (UTC)</b>: {{ format_optional_datetime(remote_server.last_audit_log_update, True) }}</span><br />
{% else %}
<span class="current-audit-log"><b>Last audit log update (UTC)</b>: {{ format_optional_datetime(remote_server.last_audit_log_update, True) }}</span><br />
{% endif %}
<b>Plan type</b>: {{ get_plan_type_name(remote_server.plan_type) }}<br />
<b>Non-guest user count</b>: {{ remote_servers_support_data[remote_server.id].user_data.non_guest_user_count }}<br />
<b>Guest user count</b>: {{ remote_servers_support_data[remote_server.id].user_data.guest_user_count }}<br />
<a target="_blank" rel="noopener noreferrer" href="/activity/remote/logs/server/{{ remote_server.uuid }}/">View audit logs</a><br />
<br />
<b>Total mobile user count</b>: {{ remote_servers_support_data[remote_server.id].mobile_push_data.total_mobile_users }}<br />
{% if remote_realms[remote_server.id] != [] %}
<b>Uncategorized mobile user count:</b> {{ remote_servers_support_data[remote_server.id].mobile_push_data.uncategorized_mobile_users }}<br />
{% endif %}
<b>7-day mobile pushes count</b>: {{ remote_servers_support_data[remote_server.id].mobile_push_data.mobile_pushes_forwarded }}<br />
<b>Last push notification date</b>: {{ remote_servers_support_data[remote_server.id].mobile_push_data.last_mobile_push_sent }}<br />
</div>
{% with %}
{% set status = remote_servers_support_data[remote_server.id].mobile_push_data.push_notification_status %}
{% include 'corporate/support/push_status_details.html' %}
{% endwith %}
{% if remote_server.deactivated %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = remote_servers_support_data[remote_server.id].sponsorship_data %}
{% include 'corporate/support/sponsorship_details.html' %}
{% endwith %}
</div>
{% elif remote_server.plan_type != SPONSORED_PLAN_TYPE %}
<div class="support-sponsorship-container">
{% with %}
{% set sponsorship_data = remote_servers_support_data[remote_server.id].sponsorship_data %}
{% set PLAN_TYPES = REMOTE_PLAN_TIERS %}
{% set remote_id = remote_server.id %}
{% set remote_type = "remote_server_id" %}
{% set has_fixed_price = remote_servers_support_data[remote_server.id].plan_data.has_fixed_price %}
{% include 'corporate/support/sponsorship_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if remote_servers_support_data[remote_server.id].plan_data.current_plan %}
<div class="current-plan-container">
{% with %}
{% set plan_data = remote_servers_support_data[remote_server.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% include 'corporate/support/current_plan_details.html' %}
{% endwith %}
{% with %}
{% set current_plan = remote_servers_support_data[remote_server.id].plan_data.current_plan %}
{% set remote_id = remote_server.id %}
{% set remote_type = "remote_server_id" %}
{% include 'corporate/support/current_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if remote_servers_support_data[remote_server.id].plan_data.next_plan %}
<div class="next-plan-container">
{% with %}
{% set plan_data = remote_servers_support_data[remote_server.id].plan_data %}
{% set dollar_amount = dollar_amount %}
{% set remote_id = remote_server.id %}
{% set remote_type = "remote_server_id" %}
{% include 'corporate/support/next_plan_details.html' %}
{% endwith %}
</div>
{% elif not remote_server.deactivated %}
<div class="next-plan-container">
{% with %}
{% set plan_data = remote_servers_support_data[remote_server.id].plan_data %}
{% set remote_id = remote_server.id %}
{% set remote_type = "remote_server_id" %}
{% include 'corporate/support/next_plan_forms_support.html' %}
{% endwith %}
</div>
{% endif %}
{% if remote_server.deactivated %}
<div class="deactivation-information-container">
{% with %}
{% set deactivation_data = remote_servers_support_data[remote_server.id].deactivation_data %}
{% include 'corporate/support/deactivation_data.html' %}
{% endwith %}
<form method="POST" class="reactivate-remote-server-form">
{{ csrf_input }}
<input type="hidden" name="remote_server_id" value="{{ remote_server.id }}" />
<input type="hidden" name="remote_server_status" value="active" />
<button class="reactivate-remote-server-button"><b>Reactivate</b>: {{ remote_server.hostname }}</button>
</form>
</div>
{% else %}
<div class="deactivation-information-container">
<p class="support-section-header">⚠️ Deactivate remote server:</p>
<form method="POST" class="deactivate-remote-server-form">
{{ csrf_input }}
<input type="hidden" name="remote_server_id" value="{{ remote_server.id }}" />
<input type="hidden" name="remote_server_status" value="deactivated" />
<b>Deactivation reason</b>:<br />
<select name="remote_server_deactivation_reason" id="remote_server_deactivation_reason">
{% for reason in DEACTIVATION_REASONS %}
{% if reason == "owner_request" %}
<option value="{{ reason }}" selected>{{ reason }}</option>
{% else %}
<option value="{{ reason }}">{{ reason }}</option>
{% endif %}
{% endfor %}
</select>
<br />
<button class="deactivate-remote-server-button"><b>Deactivate</b>: {{ remote_server.hostname }}</button>
</form>
</div>
{% endif %}
</div>
<div class="remote-realms-section">
{% if remote_realms[remote_server.id] == [] %}
<div>
<span class="remote-label">Remote realm</span>
<h3>None</h3>
</div>
{% else %}
{% for remote_realm in remote_realms[remote_server.id] %}
<div>
{% with %}
{% set remote_server_deactivated = remote_server.deactivated %}
{% set support_data = remote_realms_support_data %}
{% set get_plan_type_name = get_plan_type_name %}
{% set format_optional_datetime = format_optional_datetime %}
{% set dollar_amount = dollar_amount %}
{% include "corporate/support/remote_realm_details.html" %}
{% endwith %}
</div>
{% endfor %}
{% endif %}
</div>
</div>
{% endfor %}
</div>
</div>
{% endblock %}

Some files were not shown because too many files have changed in this diff Show More