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,24 @@
# Zulip Asana integration
Get Zulip notifications for your Asana projects via Zapier!
{start_tabs}
1. {!create-an-incoming-webhook.md!}
1. Continue with step 3 of the [Zapier documentation][1] to finish
integrating Zulip with Asana.
!!! tip ""
You can repeat the above process and create Zaps for different projects
and/or different kinds of Asana events that you'd like to be notified
about in Zulip.
{end_tabs}
{!congrats.md!}
![](/static/images/integrations/asana/001.png)
[1]: ./zapier

View File

@@ -0,0 +1,36 @@
# Zulip Atolio integration
Index Zulip channels, topics, and messages in your Atolio knowledge base!
{start_tabs}
1. {!create-a-generic-bot.md!}
1. [Subscribe the bot][subscribe-channels] to the Zulip channels that you
want Atolio to index.
1. [Download the `zuliprc` file](/help/manage-a-bot#download-zuliprc-configuration-file)
for the bot you created above.
1. In Atolio, configure the Zulip connector using the following values
from the `zuliprc` file:
* **Domain**: Your Zulip organization URL.
* **Email**: The bot's email address.
* **Token**: The bot's API key.
1. Use the Atolio connector configuration to include or exclude specific
topics at the [`topic` resource level][content-filtering] using the
"channel name/topic name" format.
{end_tabs}
You're done! You should be able to index Zulip from Atolio.
### Related documentation
* [Atolio Zulip Connector documentation](https://docs.atolio.com/configure-sources/zulip/)
* [Channel permissions for bots](/help/bots-overview#channel-permissions-for-bots)
[subscribe-channels]: /help/manage-user-channel-subscriptions#subscribe-a-user-to-a-channel
[content-filtering]: https://docs.atolio.com/configure-sources/zulip/#:~:text=bot%20or%20user-,Content%20Filtering,-The%20Zulip%20connector

View File

@@ -0,0 +1,52 @@
# Use BigBlueButton as your call provider in Zulip
You can configure BigBlueButton as the call provider for your organization.
Users will be able to start a BigBlueButton call and invite others using the
**add video call** (<i class="zulip-icon zulip-icon-video-call"></i>) or
**add voice call** (<i class="zulip-icon zulip-icon-voice-call"></i>) button
[in the compose box](/help/start-a-call).
!!! warn ""
**Note:** This is currently only possible on self-hosted Zulip
installations, and you'll need a BigBlueButton server.
## Configure BigBlueButton as your call provider
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. You can configure Zulip to use BigBlueButton
as your call provider instead.
{start_tabs}
1. Run `bbb-conf --secret` on your BigBlueButton server to get
the hostname and shared secret for your BigBlueButton server.
1. In `/etc/zulip/zulip-secrets.conf`, set `big_blue_button_secret` to your
BigBlueButton server's shared secret.
1. In `/etc/zulip/settings.py`, set `BIG_BLUE_BUTTON_URL` to your
BigBlueButton server's hostname.
1. Restart the Zulip server with
`/home/zulip/deployments/current/scripts/restart-server`.
{settings_tab|organization-settings}
1. Under **Compose settings**, select BigBlueButton from the **Call provider**
dropdown.
1. Click **Save changes**.
{end_tabs}
### Related documentation
- [How to start a call](/help/start-a-call)
- [Jitsi Meet integration](/integrations/jitsi)
- [Zoom integration](/integrations/zoom)
- [Constructor Groups integration](/integrations/constructor-groups)
* [BigBlueButton server configuration](https://docs.bigbluebutton.org/administration/customize/#other-configuration-changes)
- [Nextcloud Talk integration](/integrations/nextcloud-talk)
- [Webex integration](/integrations/webex)

View File

@@ -0,0 +1,50 @@
# Zulip Capistrano Integration
Get Zulip notifications for your Capistrano deploys!
{start_tabs}
1. {!create-an-incoming-webhook.md!}
1. {!download-python-bindings.md!}
1. You can now send Zulip messages by calling the `zulip-send`
utility from your `deploy.rb` config file.
1. Here's some example code for sending a Zulip notification when a
deployment has completed:
after 'deploy', 'notify:humbug'
namespace :notify do
desc "Post a message to Zulip after deploy"
task :humbug do
run_locally "echo 'I just deployed to #{stage}! :tada:' | zulip-send \
--user capistrano-bot@{{ display_host }} --api-key a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5 \
--site={{ zulip_url }} \
--stream commits --subject deployments || true"
end
end
Use your bot's email address and [API key][3] for `--user` and
`--api-key` respectively.
{end_tabs}
{!congrats.md!}
![Capistrano bot message](/static/images/integrations/capistrano/001.png)
### Configuration Options
* Customize the notification trigger by replacing `deploy` in the above
example with [any stage][1] of your deployment process.
### Related documentation
* [Capistrano's Before/After Hooks][1]
* [Configuring the Python bindings][2]
[1]: https://capistranorb.com/documentation/getting-started/before-after/
[2]: https://zulip.com/api/configuring-python-bindings
[3]: https://zulip.com/api/api-keys#get-a-bots-api-key

View File

@@ -0,0 +1,120 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "integrations" %}
{% block customhead %}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% endblock %}
{% block hello_page_container %} hello-main{% endblock %}
{% block portico_content %}
{% include 'zerver/marketing_nav.html' %}
{% import 'zerver/integrations/macros.html' as integration_macros %}
<div class="portico-landing integrations">
<div class="main">
<div class="padded-content">
<div class="inner-content">
<div class="integration-main-text">
<header>
<h1 class="portico-page-heading">
Over {{ integrations_count_display }} native integrations.
</h1>
</header>
<p class="portico-page-subheading">
And hundreds more through
<a href="/integrations/zapier">Zapier</a>
and
<a href="/integrations/ifttt">IFTTT</a>.
</p>
</div>
<div id="integration-search">
<div class="searchbar">
<div class="searchbar-reset">
<i class="zulip-icon zulip-icon-search" aria-hidden="true"></i>
<input type="text" class="search_input" placeholder="Search integrations"/>
</div>
</div>
</div>
{% set dropdown_label = 'Filter by category' %}
{% if selected_category_slug != 'all' %}
{% set dropdown_label = categories_dict.get(selected_category_slug, dropdown_label) %}
{% endif %}
<div class="integration-categories-dropdown">
<div class="integration-toggle-categories-dropdown">
<h3 class="dropdown-category-label">{{ dropdown_label }}</h3>
<i class="fa fa-angle-down" aria-hidden="true"></i>
</div>
<div class="dropdown-list">
<a href="/integrations/" class="integration-category {% if selected_category_slug == 'all' %}selected{% endif %}" data-category="all">
All
</a>
{% for category in categories_dict.keys() %}
<a href="/integrations/category/{{ category }}" class="integration-category {% if selected_category_slug == category %}selected{% endif %}" data-category="{{ category }}">
{{ categories_dict[category] }}
</a>
{% endfor %}
<h3 class="heading">Custom integrations</h3>
<a href="https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html">
Incoming webhooks
</a>
<a href="/help/writing-bots">
Interactive bots
</a>
<a href="/api/rest">
REST API
</a>
</div>
</div>
<div class="catalog">
<div class="integration-categories-sidebar">
<h3>Categories</h3>
<a href="/integrations/" data-category="all" class="integration-category {% if selected_category_slug == 'all' %}selected{% endif %}">
All
</a>
{% for category in categories_dict.keys() %}
<a href="/integrations/category/{{ category }}" data-category="{{ category }}" class="integration-category {% if selected_category_slug == category %}selected{% endif %}">
{{ categories_dict[category] }}
</a>
{% endfor %}
<h3>Custom integrations</h3>
<a href="https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html">
Incoming webhooks
</a>
<a href="/help/writing-bots">
Interactive bots
</a>
<a href="/api/rest">
REST API
</a>
</div>
<div class="integration-lozenges">
{% for integration in visible_integrations %}
<a href="/integrations/{{ integration.name }}{% if selected_category_slug != 'all' %}?category={{ selected_category_slug }}{% endif %}">
{{ integration_macros.render_integration_lozenge(integration) }}
</a>
{% endfor %}
<div class="integration-request center">
<p>Don't see an integration you need? We'd love to help.</p>
<div class="hero-buttons center">
<a href="/api/integrations-overview" class="button">
Create your own
</a>
<a href="/help/request-an-integration" class="button">
Request an integration
</a>
</div>
</div>
</div>
</div>
</div> <!-- .inner-content -->
</div> <!-- .padded-content -->
</div> <!-- .main -->
</div> <!-- .portico-landing -->
{% endblock %}

View File

@@ -0,0 +1,59 @@
# Use Constructor Groups as your call provider in Zulip
You can configure [Constructor Groups][constructor-groups] as the call
provider for your organization. Users will be able to start a Constructor
Groups call and invite others using the **add video call**
(<i class="zulip-icon zulip-icon-video-call"></i>) button [in the compose
box](/help/start-a-call).
!!! warn ""
**Note:** This is currently only possible on self-hosted Zulip
installations, and requires a Constructor Groups account.
## Configure Constructor Groups as your call provider
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. You can configure Zulip to use
[Constructor Groups][constructor-groups] as your call provider instead.
{start_tabs}
1. Obtain your Constructor Groups [API credentials][constructor-groups-api-docs]
by going to your Constructor Groups dashboard. Select **Settings**, and
open the **Development** tab. Click the **Create new API Key** button,
fill the required fields, and click **Create**. Copy your **Access Key**
and **Secret Key** from the window that opens.
1. In `/etc/zulip/zulip-secrets.conf`, set `constructor_groups_access_key`
and `constructor_groups_secret_key` to the access key and secret key
created in the previous step.
1. In `/etc/zulip/settings.py`, set `CONSTRUCTOR_GROUPS_URL` to your
Constructor Groups API URL, e.g., `https://example.constructor.app/api/groups/xapi`.
1. Restart the Zulip server with
`/home/zulip/deployments/current/scripts/restart-server`.
{settings_tab|organization-settings}
1. Under **Compose settings**, select Constructor Groups from the
**Call provider** dropdown.
1. Click **Save changes**.
{end_tabs}
### Related documentation
- [Constructor Groups API documentation][constructor-groups-api-docs]
- [How to start a call](/help/start-a-call)
- [Jitsi Meet integration](/integrations/jitsi)
- [Zoom integration](/integrations/zoom)
- [BigBlueButton integration](/integrations/big-blue-button)
- [Nextcloud Talk integration](/integrations/nextcloud-talk)
- [Webex integration](/integrations/webex)
[constructor-groups-api-docs]: https://developer.perculus.com/v2-en
[constructor-groups]: https://constructor.tech/products/learning/groups

View File

@@ -0,0 +1,42 @@
# Zulip Discourse integration
Forward new Discourse posts to Zulip!
{start_tabs}
1. {!create-an-incoming-webhook.md!}
1. Install the Discourse [Chat Integration][chat-integration].
1. In your **Discourse site settings**, toggle
`chat_integration_zulip_enabled`, and fill in the following information:
* `chat_integration_zulip_server`: {{ zulip_url }}
* `chat_integration_zulip_bot_api_key`: your bot's API key
* `chat_integration_zulip_bot_email_address`: your bot's email
1. Go to the **Plugins** tab, click on **Chat Integration**. Select
**Zulip**, and click **Add Channel**.
1. Set **Stream** to the [channel](/help/create-a-channel) name that you'd
like to receive notifications in, set **Subject** to the topic name, and
click **Save Channel**.
1. To filter the posts you'd like to forward to Zulip,
[configure the rules][configuring-rules] in your Discourse forum's
**Chat Integrations** panel.
{end_tabs}
{!congrats.md!}
![](/static/images/integrations/discourse/001.png)
### Related documentation
- [Discourse Chat Integration][chat-integration]
- [Discourse's documentation on the Zulip integration][setup-instructions]
[setup-instructions]: https://meta.discourse.org/t/68501
[chat-integration]: https://meta.discourse.org/t/discourse-chat-integration/66522
[configuring-rules]: https://meta.discourse.org/t/discourse-chat-integration/66522#configuring-rules-4

View File

@@ -0,0 +1,48 @@
{% extends "zerver/portico.html" %}
{% set entrypoint = "integrations" %}
{% block customhead %}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% endblock %}
{% block hello_page_container %} hello-main{% endblock %}
{% block portico_content %}
{% include 'zerver/marketing_nav.html' %}
{% import 'zerver/integrations/macros.html' as integration_macros %}
<div class="portico-landing integrations">
<div class="main">
<div class="padded-content">
<div class="inner-content">
<div id="integration-instructions-group">
<div id="integration-instruction-block" class="integration-instruction-block">
{% if integration_categories %}
<div class="categories">
{% for slug, display_name in integration_categories %}
<a href="/integrations/category/{{ slug }}">
<h3 class="integration-category" data-category="{{ slug }}">
{{ display_name }}
</h3>
</a>
{% endfor %}
</div>
{% endif %}
{{ integration_macros.render_integration_lozenge(selected_integration, is_doc_view=true) }}
<a href="/integrations/{% if return_category_slug != 'all' %}category/{{ return_category_slug }}{% endif %}" id="integration-list-link">
<i class="zulip-icon zulip-icon-arrow-left" aria-hidden="true"></i><span class="integrations-back-label-long">Back to list</span><span class="integrations-back-label-short">Back</span>
</a>
</div>
<div id="{{ selected_integration.name }}" class="integration-instructions markdown show">
<div class="help-content">{{ integration_doc_html|safe }}</div>
{{ integration_macros.render_logos_disclaimer() }}
</div>
</div>
</div> <!-- .inner-content -->
</div> <!-- .padded-content -->
</div> <!-- .main -->
</div> <!-- .portico-landing -->
{% endblock %}

View File

@@ -0,0 +1,56 @@
<!-- Any changes to this file should be reflected in
starlight_help/src/content/docs/using-zulip-via-email.mdx
and vice versa. This file used to be a symlink to that file
before we converted it to mdx. -->
# Using Zulip via email
With Zulip, it is possible for some members of your organization to participate
from their email client, without opening the Zulip app after the initial
setup is complete.
## Subscribe a Zulip channel to a mailing list
{start_tabs}
1. Create a mailing list to use with Zulip, or use an existing one.
1. Create a Zulip channel that will receive mailing list traffic, or
use an existing one.
1. [Generate an email
address](/help/message-a-channel-by-email#message-a-channel-by-email_1) for
the channel you created.
1. Add the email address for the channel to the mailing list.
{end_tabs}
New emails sent to the email list will now be mirrored to the channel.
## Setup instructions for email users
If you want to interact with Zulip primarily (or entirely) via your email client:
{start_tabs}
1. [Subscribe](/help/introduction-to-channels#browse-and-subscribe-to-channels) to any channels you are
interested in.
{settings_tab|notifications}
1. In the **Notification triggers** table, make sure both of the checkboxes
under **Email** are checked.
1. Close the Zulip window. Zulip does not send email notifications
while you are actively engaging with the web application.
{end_tabs}
New Zulip messages will now be delivered to your email account. You
can reply directly to the emails coming from Zulip, and your replies
will be posted in the appropriate topic or direct message
conversation on Zulip.
## Related articles
* [Message a channel by email](/help/message-a-channel-by-email)

View File

@@ -0,0 +1,66 @@
# Zulip Errbot integration
Run your favorite chatbot in Zulip!
{start_tabs}
1. [Install errbot][install-errbot], and follow the instructions to set up a
`config.py`.
1. Clone the [Errbot integration package for Zulip][errbot-package]
repository somewhere convenient, and install the requirements listed in
`errbot-backend-zulip/requirements.txt`.
1. {!create-a-generic-bot.md!}
1. Edit your ErrBot's `config.py`. Use the following template for a minimal
configuration:
import logging
BACKEND = 'Zulip'
BOT_EXTRA_BACKEND_DIR = r'<path/to/errbot-backend-zulip>'
BOT_DATA_DIR = r'<path/to/your/errbot/data/directory>'
BOT_EXTRA_PLUGIN_DIR = r'<path/to/your/errbot/plugin/directory>'
BOT_LOG_FILE = r'<path/to/your/errbot/logfile.log>'
BOT_LOG_LEVEL = logging.INFO
BOT_IDENTITY = {
'email': '<your-bot@email.address>',
'key': '<api-key-of-your-bot>',
'site': '<your-zulip-organization-url>'
}
BOT_ADMINS = ('<your@email.address>',)
CHATROOM_PRESENCE = ()
BOT_PREFIX = '@**<your-bot-name>**'
Sections you need to edit are marked with `<>`. Replace the `<...>`
placeholders with your own values, removing the `<` and `>` brackets.
Use the details of the Zulip bot created above for the `BOT_IDENTITY`
and `BOT_PREFIX` sections.
1. [Start ErrBot][start-errbot].
!!! tip ""
ErrBot uses the term "Rooms" for Zulip channels.
{end_tabs}
{!congrats.md!}
![Errbot message](/static/images/integrations/errbot/001.png)
### Related documentation
- [Errbot Documentation](https://errbot.readthedocs.io/en/latest/)
- [Errbot integration package for Zulip][errbot-package]
- [Python bindings Configuration][config-python-bindings]
[install-errbot]: https://errbot.readthedocs.io/en/latest/user_guide/setup.html
[errbot-package]: https://github.com/zulip/errbot-backend-zulip
[start-errbot]: https://errbot.readthedocs.io/en/latest/user_guide/setup.html#starting-the-daemon
[config-python-bindings]: https://zulip.com/api/configuring-python-bindings

View File

@@ -0,0 +1,14 @@
# Zulip GIPHY GIF integration
Send animated GIFs with your message using GIPHY.
GIPHY is enabled by default in Zulip Cloud. Follow
[these instructions][configure-giphy] to configure GIPHY on a
**self-hosted** Zulip server.
### Related documentation
* [Using GIFs in Zulip][help-center-gifs]
[help-center-gifs]: /help/animated-gifs
[configure-giphy]: https://zulip.readthedocs.io/en/latest/production/gif-picker-integrations.html#giphy

View File

@@ -0,0 +1,76 @@
# Zulip GitHub Actions integration
Get Zulip notifications from GitHub Actions workflow runs!
{start_tabs}
{tab|send-channel-message}
1. {!create-a-generic-bot.md!}
1. Add the `zulip/github-actions-zulip/send-message@v1` action to your GitHub
Actions [workflow file][workflows]. The `content` template parameter supports Markdown
and [GitHub Actions expressions][expressions].
```
{% raw %}- name: Send a channel message
if: steps.backup.outcome == 'failure'
uses: zulip/github-actions-zulip/send-message@v1
with:
# Your bot's API key and email
api-key: ${{ secrets.ZULIP_API_KEY }}
email: "github-actions-generic-bot@example.com"
organization-url: "https://your-org.zulipchat.com"
type: "stream"
# Notification channel
to: "github-actions updates"
topic: "scheduled backups"
# Example: Notify if a previous GitHub Actions step with the ID "backup" fails.
content: "Backup [failed](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) at <time:${{ steps.backup.outputs.time }}>.\n>${{ steps.backup.outputs.error }}"{% endraw %}
```
{tab|send-dm}
1. {!create-a-generic-bot.md!}
1. Look up the ID of the recipient for DM notifications in their
[profile](https://zulip.com/help/view-someones-profile).
1. Add the `zulip/github-actions-zulip/send-message@v1` action to your GitHub
Actions [workflow file][workflows]. The `content` template parameter
supports Markdown and [GitHub Actions expressions][expressions].
```
{% raw %}- name: Send a channel message
if: steps.backup.outcome == 'failure'
uses: zulip/github-actions-zulip/send-message@v1
with:
# Your bot's API key and email
api-key: ${{ secrets.ZULIP_API_KEY }}
email: "github-actions-generic-bot@example.com"
organization-url: "https://your-org.zulipchat.com"
type: "private"
# Recipient's user ID
to: "295"
# Example: Notify if a previous GitHub Actions step with the ID "backup" fails.
content: "Backup [failed](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) at <time:${{ steps.backup.outputs.time }}>.\n>${{ steps.backup.outputs.error }}"{% endraw %}
```
{end_tabs}
{!congrats.md!}
![](/static/images/integrations/github-actions/001.png)
### Related documentation
* [Configuring the Send Message Action][README]
* [Zulip GitHub Actions repository][repo]
* [GitHub integration](/integrations/github)
[README]: https://github.com/zulip/github-actions-zulip/blob/main/send-message/README.md
[repo]: https://github.com/zulip/github-actions-zulip
[expressions]: https://docs.github.com/en/actions/reference/evaluate-expressions-in-workflows-and-actions
[workflows]: https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax

View File

@@ -0,0 +1,66 @@
# Zulip Hubot Integration
Use Hubot to execute scripts and commands within Zulip!
{start_tabs}
1. Follow the [**Getting Started with Hubot**][getting-started] guide
to create your Hubot. You'll have a new directory from which `bin/hubot`
starts a vanilla Hubot instance with the shell backend.
1. In your Hubot's directory, install the Zulip adapter by running:
`npm install --save hubot-zulip`
1. {!create-a-generic-bot.md!}
1. Hubot uses the following environment variables, set them using the
information of the bot you created, by running:
```
export HUBOT_ZULIP_SITE="{{ zulip_url }}"
export HUBOT_ZULIP_BOT="hubot-bot@{{ zulip_url }}"
export HUBOT_ZULIP_API_KEY="0123456789abcdef0123456789abcdef"
```
1. Run Hubot:
`bin/hubot --adapter zulip --name "<bot username>"`
!!! tip ""
Hubot automatically listens for commands on all public channels. Private
channels require an invitation. Hubot's access can be
[configured](#configuration-options).
{end_tabs}
To test your Hubot installation, send it an @-notification with a
basic command, e.g., `@Hubot pug me`, which should produce a
result like this:
![Hubot message](/static/images/integrations/hubot/001.png)
### Configuration options
* To make Hubot listen only on the channels that it is subscribed to, run:
`export HUBOT_ZULIP_ONLY_SUBSCRIBED_STREAMS`
### Related documentation
* [GitHub repository for Zulip Hubot adapter][hubot-zulip]
* Zulip Integrations using Hubot: [Assembla](/integrations/assembla) |
[Bonusly](/integrations/bonusly) |
[Chartbeat](/integrations/chartbeat) |
[Instagram](/integrations/instagram) |
[Google Translate](/integrations/google-translate) |
[MailChimp](/integrations/mailchimp) |
[YouTube](/integrations/youtube)
* [Other Hubot adapters][other-adapters]
[hubot-zulip]: https://github.com/zulip/hubot-zulip
[getting-started]: https://hubot.github.com/docs/#getting-started-with-hubot
[other-adapters]: https://github.com/search?q=topic%3Ahubot-adapter&type=Repositories

View File

@@ -0,0 +1,12 @@
# Zulip {{ integration_display_name }} integration
Get Zulip notifications from {{ integration_display_name }} via Hubot!
{start_tabs}
1. [Install Hubot](hubot), and test it to make sure it is working.
1. Follow [these instructions]({{ hubot_docs_url }}) to set up
the integration with {{ integration_display_name }}!
{end_tabs}

View File

@@ -0,0 +1,9 @@
Open `{{ config_file_path}}` with your favorite editor, and change the
following lines to specify the email address and API key for your
{{ integration_display_name }} bot:
```
ZULIP_USER = "{{ integration_name }}-bot@{{ display_host }}"
ZULIP_API_KEY = "0123456789abcdef0123456789abcdef"
ZULIP_SITE = "{{ zulip_url }}"
```

View File

@@ -0,0 +1,2 @@
You're done! Your {{ integration_display_name }} notifications may look like
this:

View File

@@ -0,0 +1,3 @@
[Create a bot](/help/add-a-bot-or-integration) for
{{ integration_display_name }}. Make sure that you select
**Generic bot** as the **Bot type**.

View File

@@ -0,0 +1,3 @@
[Create a bot](/help/add-a-bot-or-integration) for
{{ integration_display_name }}. Make sure that you select
**Incoming webhook** as the **Bot type**.

View File

@@ -0,0 +1,2 @@
[Create the channel](/help/create-a-channel) you'd like to use for
{{ integration_display_name }} notifications.

View File

@@ -0,0 +1,4 @@
Download and install our
[Python bindings and example scripts](/api/installation-instructions)
on the system where the {{ integration_display_name }} integration script
will be run from.

View File

@@ -0,0 +1,10 @@
### Filtering incoming events
The {{ integration_display_name }} integration supports
[filtering][event-filters] for the following events:
{% set comma = joiner(", ") %}
{% for event_type in all_event_types -%} {{- comma() -}} `{{ event_type }}` {%- endfor %}
[event-filters]: https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html#only-events-exclude-events

View File

@@ -0,0 +1,6 @@
You will be able to configure which of the following
{{ integration_display_name }} events trigger notifications:
{% set comma = joiner(", ") %}
{% for event_type in all_event_types -%} {{- comma() -}} `{{ event_type }}` {%- endfor %}

View File

@@ -0,0 +1,2 @@
Decide where to send {{ integration_display_name }} notifications, and
[generate the integration URL](/help/generate-integration-url).

View File

@@ -0,0 +1,3 @@
Decide where to send {{ integration_display_name }} notifications, and
[generate the integration URL](/help/generate-integration-url). You'll be
able to configure which branches you'll receive notifications from.

View File

@@ -0,0 +1,3 @@
Install the dependencies for the integration with:
`pip install -r {{ integration_path }}/requirements.txt`

View File

@@ -0,0 +1,13 @@
Construct the URL for the {{ integration_display_name }}
bot using the bot's API key and email address:
`{{ external_url_scheme }}bot_email:bot_api_key@{{ api_url_scheme_relative }}{{ integration_url }}`
Modify the parameters of the URL above, where `bot_email` is
the bot's URL-encoded email address and `bot_api_key` is the
bot's API key. To URL-encode the email address, you just need
to replace `@` in the bot's email address with `%40`.
You can also limit the branches you receive notifications for by
specifying them in a comma-separated list appended to the end of the
URL, e.g., `&branches=main,development`.

View File

@@ -0,0 +1,3 @@
* [Webhook URLs specification][incoming-webhook-urls]
[incoming-webhook-urls]: https://zulip.readthedocs.io/en/latest/webhooks/incoming-webhooks-overview.html#url-specification

View File

@@ -0,0 +1,59 @@
1. {!create-channel.md!}
1. {!create-an-incoming-webhook.md!}
1. Install the "Zulip" plugin by going to
**Manage Jenkins > Manage Plugins > Available**,
typing in **Zulip**, and clicking **Install without Restart**.
![Plugin installation](/static/images/integrations/jenkins/001.png)
1. Once the plugin is installed, configure it by going to
**Manage Jenkins > Configure System**. Scroll to the section
labeled **Zulip Notification Settings**, and specify your
Zulip server address, bot's email address and API key.
Optionally, you may configure a default stream or topic. You can also enable
smart notifications (i.e. only receive notifications when a build fails or
recovers from a failed state).
(If you don't see this option, you may first need to restart
Jenkins.)
![Plugin configuration](/static/images/integrations/jenkins/002.png)
1. Once you've done that, it's time to configure one of your
freestyle projects to use the Zulip notification plugin. On your
Jenkins project page, click **Configure** on the left sidebar. Scroll to
the bottom until you find the section labeled **Post-build
Actions**. Click the dropdown and select **Zulip Notification**.
It should look as shown below. If you'd rather not use the defaults from
the global configuration, you can set a custom stream and topic.
If you don't specify a custom topic, the project name will be used as the
topic instead. Then click **Save**.
![Post-build action configuration](/static/images/integrations/jenkins/003.png)
When your builds fail or succeed, you'll see a message as shown below.
{!congrats.md!}
![Jenkins bot message](/static/images/integrations/jenkins/004.png)
### Advanced use cases
Besides the **Zulip Notification** post-build action, this plugin
also supports the **Zulip Send** action.
To learn more, see the [plugin's README](https://github.com/jenkinsci/zulip-plugin).
### Troubleshooting
1. Did you set up a post-build action for your project?
1. Does the stream you picked (e.g., `jenkins`) already exist?
If not, create the stream and make sure you're subscribed to it.
1. Are your API key and email address correct? Test them
using [our curl API](/api/).
1. Configure a Jenkins log recorder for **jenkins.plugins.zulip**
and check why your messages fail to send.

View File

@@ -0,0 +1,37 @@
# Use Jitsi Meet as your call provider in Zulip
By default, Zulip integrates with [Jitsi Meet](https://jitsi.org/jitsi-meet/),
a fully-encrypted, 100% open source video conferencing solution. Users will be
able to start a Jitsi Meet call and invite others using the **add video call**
(<i class="zulip-icon zulip-icon-video-call"></i>) or **add voice call**
(<i class="zulip-icon zulip-icon-voice-call"></i>) button [in the compose
box](/help/start-a-call).
## Configure a self-hosted instance of Jitsi Meet
Zulip uses the [cloud version of Jitsi Meet](https://meet.jit.si/)
as its default video call provider. You can also use a self-hosted
instance of Jitsi Meet.
{start_tabs}
{settings_tab|organization-settings}
1. Under **Compose settings**, confirm **Jitsi Meet** is selected in the
**Call provider** dropdown.
1. Select **Custom URL** from the **Jitsi server URL** dropdown, and enter
the URL of your self-hosted Jitsi Meet server.
1. Click **Save changes**.
{end_tabs}
## Related documentation
- [How to start a call](/help/start-a-call)
- [Zoom integration](/integrations/zoom)
- [BigBlueButton integration](/integrations/big-blue-button)
- [Constructor Groups integration](/integrations/constructor-groups)
- [Nextcloud Talk integration](/integrations/nextcloud-talk)
- [Webex integration](/integrations/webex)

View File

@@ -0,0 +1,13 @@
# Zulip KLIPY GIF integration
Send animated GIFs with your message using KLIPY.
Follow [these instructions][configure-klipy] to configure KLIPY on a
**self-hosted** Zulip server.
### Related documentation
* [Using GIFs in Zulip][help-center-gifs]
[help-center-gifs]: /help/animated-gifs
[configure-klipy]: https://zulip.readthedocs.io/en/latest/production/gif-picker-integrations.html

View File

@@ -0,0 +1,27 @@
{% macro render_integration_lozenge(integration, is_doc_view=false) -%}
<div
class="integration-lozenge{% if is_doc_view %} without-category{% endif %} integration-{{ integration.name }}"
data-categories='{{ integration.categories|tojson }}'
data-name="{{ integration.name }}">
<img class="integration-logo" src="{{ integration.logo_url }}"
alt="{{ integration.display_name }} logo"/>
{% if integration.secondary_line_text %}
<h3 class="integration-name with-secondary" translate="no">{{ integration.display_name }}</h3>
<h4 class="integration-secondary-line-text">
{{ integration.secondary_line_text }}
</h4>
{% else %}
<h3 class="integration-name" translate="no">{{ integration.display_name }}</h3>
{% endif %}
<h4 class="integration-category">{{ integration.categories[0] }}</h4>
</div>
{%- endmacro %}
{% macro render_logos_disclaimer() -%}
<p class="logos_disclaimer">
Logos are trademarks of their respective owners.
None of the integrations on this page are created by,
affiliated with, or supported by the companies
represented by the logos.
</p>
{%- endmacro %}

View File

@@ -0,0 +1,40 @@
# Zulip Mastodon integration
Fetch public posts (sometimes called “toots”) of individual accounts or
federated hashtags from Mastodon in Zulip!
While Zulip doesn't integrate directly with ActivityPub or the overall
Fediverse, some ActivityPub servers, like
[Mastodon](https://joinmastodon.org/), publish RSS feeds that can be
followed in Zulip using the [Zapier][1] or [RSS][2] integrations.
!!! warn ""
Due to the complexities of Mastodon federation, following a hashtag on
one homeserver does not guarantee that all posts in the entire Fediverse
will be included in the feed. Rather, all public posts that have
federated to the instance in question will be included. This means you
may get different results for the same hashtag, depending on which
homeserver you choose to subscribe through.
{start_tabs}
1. Find the RSS feed for the account or hashtag you'd like to follow. Usually,
this means appending `.rss` to its Mastodon URL. For example:
- To follow Zulip's Mastodon account at `https://fosstodon.org/@zulip`,
you would use `https://fosstodon.org/@zulip.rss`.
- To follow the **#zulip** hashtag at `https://fosstodon.org/tags/zulip`,
you would use `https://fosstodon.org/tags/zulip.rss`.
1. Follow the [Zapier][1] integration guide (recommended) or the [plain RSS][2]
integration guide using this feed URL.
{end_tabs}
{!congrats.md!}
![Mastodon posts in Zulip via Zapier](/static/images/integrations/mastodon/001.png)
[1]: ./zapier
[2]: ./rss

View File

@@ -0,0 +1,39 @@
# Zulip n8n integration
n8n supports integrations with
[hundreds of popular products](https://n8n.io/integrations/). Use the Zulip
action node in n8n workflows to send notifications, manage messages, users,
and channels.
{start_tabs}
1. {!create-a-generic-bot.md!}
1. [Download the `zuliprc` file](/help/manage-a-bot#download-zuliprc-configuration-file)
for the bot you created above.
1. Open your n8n workflow, and add the **Zulip** action node.
1. Click **Set up credential**, and enter the **URL** for your Zulip
organization, the bot's **email address**, and **API key** from the
`zuliprc` file you downloaded above. Click **Save**, and close the
credentials modal.
1. Under **Resource**, select the Zulip resource type (message, user, or
channel). Under **Operation**, select the action to perform on the
selected resource, and fill out the corresponding parameters.
1. Click **Execute step** or **Execute workflow** to test it.
{end_tabs}
You're done! You should now be able to interact with your Zulip organization
via n8n workflows.
### Related documentation
- [n8n Zulip integration][n8n-zulip]
- [Zulip action node][zulip-node]
[n8n-zulip]: https://n8n.io/integrations/zulip/
[zulip-node]: https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.zulip/

View File

@@ -0,0 +1,66 @@
# Use Nextcloud Talk as your call provider in Zulip
You can configure Nextcloud Talk as the call provider for your organization.
Users will be able to start a Nextcloud Talk call and invite others using the
**add video call** (<i class="zulip-icon zulip-icon-video-call"></i>) button
[in the compose box](/help/start-a-call).
You'll need a Nextcloud server with the Talk app enabled.
!!! warn ""
**Note:** This integration is not available in Zulip Cloud.
## Configure Nextcloud Talk as your call provider
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. You can configure Zulip to use Nextcloud
Talk as your call provider instead.
!!! warn ""
**Note:** Zulip creates public Nextcloud Talk conversations with guest
access, allowing anyone to join by visiting a URL and entering their
name. This ensures that all Zulip users can join calls regardless of
whether they have Nextcloud accounts.
{start_tabs}
1. Log in to your Nextcloud server with the user account that will be
used for creating video call rooms. Using a dedicated account for
this purpose is recommended.
1. Generate an app password in Nextcloud Talk for API access:
- Go to your **Settings**, select **Personal Security** and navigate to
the **Devices & sessions** section.
- Set the **App name** to a name of your choice, such as `Zulip`.
- Click **Create new app password**, and copy the generated password.
1. In `/etc/zulip/zulip-secrets.conf`, set `NEXTCLOUD_TALK_USERNAME` to your
Nextcloud Talk username and `NEXTCLOUD_TALK_PASSWORD` to the app password
you generated in the previous step.
1. In `/etc/zulip/settings.py`, set `NEXTCLOUD_SERVER` to the URL of your
Nextcloud server.
1. Restart the Zulip server with
`/home/zulip/deployments/current/scripts/restart-server`.
{settings_tab|organization-settings}
1. Under **Compose settings**, select Nextcloud Talk from the
**Call provider** dropdown.
1. Click **Save changes**.
{end_tabs}
## Related documentation
- [How to start a call](/help/start-a-call)
- [Jitsi Meet integration](/integrations/jitsi)
- [Zoom integration](/integrations/zoom)
- [BigBlueButton integration](/integrations/big-blue-button)
- [Constructor Groups integration](/integrations/constructor-groups)
- [Webex integration](/integrations/webex)

View File

@@ -0,0 +1,22 @@
# Zulip Nextcloud integration
Send Nextcloud files to Zulip as uploaded files, public shared links,
or internal shared links.
{start_tabs}
1. {!create-a-generic-bot.md!}
1. [Download the `zuliprc` file](/help/manage-a-bot#download-zuliprc-configuration-file)
for the bot you created above.
1. Follow [the instructions in the Nextcloud app store][1] to connect the
bot to your Nextcloud account. You'll need the **URL** for your Zulip
organization, and the bot's **email address** and **API key** from the
`zuliprc` file you downloaded above.
{end_tabs}
You're done! You should be able to send Nextcloud files to Zulip.
[1]: https://apps.nextcloud.com/apps/integration_zulip

View File

@@ -0,0 +1,24 @@
# Zulip Notion integration
Get Zulip notifications for your Notion pages and databases via Zapier!
{start_tabs}
1. {!create-an-incoming-webhook.md!}
1. Continue with step 3 of the [Zapier documentation][1] to finish
integrating Zulip with Notion.
!!! tip ""
You can repeat the above process and create Zaps for different projects
and/or different kinds of Notion events that you'd like to be notified
about in Zulip.
{end_tabs}
{!congrats.md!}
![](/static/images/integrations/notion/001.png)
[1]: ./zapier

View File

@@ -0,0 +1,35 @@
# Zulip Onyx Integration
Export discussions from Zulip channels and topics to your Onyx knowledge
base!
{start_tabs}
1. {!create-a-generic-bot.md!}
1. [Subscribe the bot][subscribe-channels] to the Zulip channels that you
want to export.
1. [Download the `zuliprc` file](/help/manage-a-bot#download-zuliprc-configuration-file)
for the bot you created above.
1. In Onyx, open the **Admin Dashboard** and select the **Zulip Connector**.
1. Under **Provide Credentials**, paste the bot's **email address** and
**API key** from the `zuliprc` file you downloaded above. Click
**Update**.
1. Set **Realm name** to the name of your Zulip organization, set
**Realm URL** to `{{ zulip_url }}`, and click **Connect**.
{end_tabs}
You're done! You should be able to index Zulip from your Onyx **Connectors
Dashboard**!
### Related documentation
* [Zulip Connector documentation](https://docs.onyx.app/admins/connectors/official/zulip)
* [About Onyx Connectors](https://docs.onyx.app/admins/connectors/overview)
[subscribe-channels]: /help/manage-user-channel-subscriptions#subscribe-a-user-to-a-channel

View File

@@ -0,0 +1,10 @@
Zulip supports Puppet integration and can notify you when Puppet
runs fail (or when they happen at all).
1. Follow the instructions
[here](https://forge.puppetlabs.com/mbarr/puppet_zulip)
to get it set up.
{!congrats.md!}
![](/static/images/integrations/puppet/001.png)

View File

@@ -0,0 +1,13 @@
# Zulip Tenor GIF integration
Send animated GIFs with your message using Tenor.
Follow [these instructions][configure-tenor] to configure Tenor on a
**self-hosted** Zulip server.
### Related documentation
* [Using GIFs in Zulip][help-center-gifs]
[help-center-gifs]: /help/animated-gifs
[configure-tenor]: https://zulip.readthedocs.io/en/latest/production/gif-picker-integrations.html#tenor

View File

@@ -0,0 +1,82 @@
Fetch tweets from Twitter in Zulip! This is great for seeing and
discussing who is talking about you, friends, competitors, or
important topics in real time.
1. {!create-channel.md!}
1. {!create-an-incoming-webhook.md!}
The API keys for "Incoming webhook" bots are limited to only
sending messages via webhooks. Thus, this bot type lessens
the security risks associated with exposing the bot's API
key to third-party services.
1. Download your new bot's `zuliprc` configuration file.
1. {!download-python-bindings.md!}
1. The Twitter bot should be set up on a trusted machine, because your API
key is visible to local users through the command line or config
file.
1. Next, install **version 1.0 or later** of the `python-twitter`
library. If your operating system distribution doesn’t package a new
enough version, you can install the library from source from
[the GitHub repository](https://github.com/bear/python-twitter).
1. Next, set up Twitter authentication. This bot uses OAuth to
authenticate with Twitter, and in order to obtain a consumer key &
secret, you must register a new application under your Twitter
account:
1. Log in to <https://apps.twitter.com/>.
1. Click on `Create New App` and fill out the form.
1. Click on the application you created and click **create my access
token**. Fill in the requested values.
1. Create a `~/.zulip_twitterrc` with the following contents:
```
[twitter]
consumer_key =
consumer_secret =
access_token_key =
access_token_secret =
```
1. Place your bot's `zuliprc` in a directory of your choice (for the next step,
`~/zuliprc` is used).
1. Test the script by running it manually:
/usr/local/share/zulip/integrations/twitter/twitter-bot --search="@nprnews,quantum
physics" --config-file=~/zuliprc
/usr/local/share/zulip/integrations/twitter/twitter-bot --twitter-name="<@your-
twitter-handle>" --config-file=~/zuliprc
Note: `twitter-bot` may install to a different location on
your operating system distribution.
1. Configure a crontab entry for this script. A sample crontab entry
that will process tweets every minute is:
```
* * * * * /usr/local/share/zulip/integrations/twitter/twitter-bot --search="@nprnews,
quantum physics" --config-file=~/zuliprc
```
1. When someone tweets a message containing one of your search terms,
get a Zulip on your specified stream, with the search term as
the topic.
{!congrats.md!}
![Twitter bot message](/static/images/integrations/twitter/001.png)
Note that the Twitter search bot integration **just sends links to
tweets**; the pretty inline previews of tweets are generated by the
Twitter card rendering integration configured in
`/etc/zulip/settings.py` on the Zulip server.

View File

@@ -0,0 +1,79 @@
# Use Webex as your call provider in Zulip
You can configure Webex as the call provider for your organization. Users will be
able to start a Webex meeting and invite others using the **add video call** (<i
class="zulip-icon zulip-icon-video-call"></i>) button [in the compose
box](/help/start-a-call).
!!! warn ""
**Note:** This is currently only possible on self-hosted Zulip
installations.
## Configure Webex as your call provider
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. You can configure Zulip to use Webex as your
call provider instead.
!!! warn ""
For users in paid Webex organizations, which have the ability to create
public rooms that are visible to every member within that organization,
an ad-hoc meeting is created in Webex. Otherwise, for users of free
Webex organizations, a personal room meeting is created in Webex.
### Create a custom Webex integration
{start_tabs}
1. Visit the [New Integration](https://developer.webex.com/my-apps/new/integration)
page on the Webex developer portal.
1. Select "No" for "Will this integration use a mobile SDK?".
1. Fill in the **Integration name**, **Icon** and **App Hub Description**
according to your preferences.
1. For **Redirect URI(s)**, enter `https://zulip.example.com/calls/webex/complete`
replacing `zulip.example.com` with your Zulip organization's URL.
1. For **Scopes**, select `spark:all`, `meeting:schedules_read` and
`meeting:schedules_write`, and select **Add Integration**.
1. _optional_: You can submit the integration to the [Webex App Hub](https://apphub.webex.com/)
by following [this documentation](https://developer.webex.com/create/docs/app-hub-submission-process).
{end_tabs}
### Configure your Zulip server and organization
{start_tabs}
1. In `/etc/zulip/zulip-secrets.conf`, set `video_webex_client_secret`
to your app's "Client Secret".
1. In `/etc/zulip/settings.py`, set `VIDEO_WEBEX_CLIENT_ID` to your
app's "Client ID".
1. Restart the Zulip server with
`/home/zulip/deployments/current/scripts/restart-server`.
{settings_tab|organization-settings}
1. Under **Compose settings**, select Webex from the **Call provider**
dropdown.
1. Click **Save changes**.
{end_tabs}
## Related documentation
- [How to start a call](/help/start-a-call)
- [Webex's developer documentation](https://developer.webex.com/create/docs/integrations)
- [Jitsi Meet integration](/integrations/jitsi)
- [BigBlueButton integration](/integrations/big-blue-button)
- [Constructor Groups integration](/integrations/constructor-groups)
- [Nextcloud Talk integration](/integrations/nextcloud-talk)

View File

@@ -0,0 +1,44 @@
# Use Zoom as your call provider in Zulip
You can configure Zoom as the call provider for your organization. Users will be
able to start a Zoom call and invite others using the **add video call** (<i
class="zulip-icon zulip-icon-video-call"></i>) or **add voice call** (<i
class="zulip-icon zulip-icon-voice-call"></i>) button [in the compose
box](/help/start-a-call).
## Configure Zoom as your call provider
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. You can configure Zulip to use Zoom as your
call provider instead.
### Configure Zoom on Zulip Cloud
{start_tabs}
{settings_tab|organization-settings}
1. Under **Compose settings**, select Zoom from the **Call provider** dropdown.
1. Click **Save changes**.
{end_tabs}
Users will be prompted to log in to their Zoom account the first time they
join a call.
## Configure Zoom for a self-hosted organization
If you are self-hosting, you will need to [create a Zoom
application](https://zulip.readthedocs.io/en/latest/production/video-calls.html#zoom)
in order to use this integration.
## Related documentation
- [How to start a call](/help/start-a-call)
- [Jitsi Meet integration](/integrations/jitsi)
- [BigBlueButton integration](/integrations/big-blue-button)
- [Constructor Groups integration](/integrations/constructor-groups)
- [Nextcloud Talk integration](/integrations/nextcloud-talk)
- [Webex integration](/integrations/webex)