zulip/templates/zerver/integrations.html

2461 lines
114 KiB
HTML

{% extends "zerver/portico.html" %}
{# API information page #}
{% block os_announcement %}
{% if zulip_com %}
<div class="os-headline-container">
<img src="/static/images/logo/zballoon.png" class="os-illustration" alt="Zulip balloon" />
<div class="main-headline-text">
<span class="tagline os-tagline">
Zulip has been released as open source software!
</span>
<span class="footnote os-footnote">
Read the <a href="https://blogs.dropbox.com/tech/2015/09/open-sourcing-zulip-a-dropbox-hack-week-project" target="_blank">announcement</a> or go to <a href="https://www.zulip.org" target="_blank">the Zulip open source project website</a>.
</span>
</div>
</div>
{% endif %}
{% endblock %}
{% block portico_content %}
<div class="portico-page-header"><a href="#"><i class="icon-vector-gears portico-page-header-icon"></i>Integrations</a></div>
<p class="portico-large-text">With Zulip integrations, your team
can stay up-to-date on code changes, issue tickets, build system
results, tweets about your project, and much more.</p>
<p>Many of these integrations require creating a Zulip bot. You
can do so on your <a href="/#settings">Zulip settings page</a>. Be
sure to note its username and API key.</p>
<p>If an integration you want isn't available yet, you
can <a href="http://zulip.readthedocs.io/en/latest/integration-guide.html">contribute
an integration</a>
or <a href="https://github.com/zulip/zulip/issues/new">open an
issue on GitHub</a> and tag it with the "integrations" label (so
you can get notified when that integration becomes available).</p>
<div id="integration-instruction-block" class="integration-instruction-block">
<a href="#" id="integration-list-link"><i class="icon-vector-circle-arrow-left"></i>&nbsp;Back to list</a>
</div>
<div class="integration-lozenges">
<div class="integration-lozenge integration-airbrake">
<a class="integration-link integration-airbrake" href="#airbrake">
<img class="integration-logo" src="/static/images/integrations/logos/airbrake.png" alt="Airbrake logo" />
<span class="integration-label">Airbrake</span>
</a>
</div>
<div class="integration-lozenge integration-asana">
<a class="integration-link integration-asana" href="#asana">
<img class="integration-logo" src="/static/images/integrations/logos/asana.png" alt="Asana logo" />
<span class="integration-label">Asana</span>
</a>
</div>
<div class="integration-lozenge integration-basecamp">
<a class="integration-link integration-basecamp" href="#basecamp">
<img class="integration-logo" src="/static/images/integrations/logos/basecamp.png" alt="Basecamp logo" />
<span class="integration-label">Basecamp</span>
</a>
</div>
<div class="integration-lozenge integration-beanstalk">
<a class="integration-link integration-beanstalk" href="#beanstalk">
<img class="integration-logo" src="/static/images/integrations/logos/beanstalk.png" alt="Beanstalk logo" />
<span class="integration-label">Beanstalk</span>
</a>
</div>
<div class="integration-lozenge integration-bitbucket">
<a class="integration-link integration-bitbucket" href="#bitbucket">
<img class="integration-logo" src="/static/images/integrations/logos/bitbucket.png" alt="Bitbucket logo" />
<span class="integration-label">Bitbucket</span>
</a>
</div>
<div class="integration-lozenge integration-capistrano">
<a class="integration-link integration-capistrano" href="#capistrano">
<img class="integration-logo" src="/static/images/integrations/logos/capistrano.png" alt="Capistrano logo" />
<span class="integration-label">Capistrano</span>
</a>
</div><div class="integration-lozenge integration-circleci">
<a class="integration-link integration-circleci" href="#circleci">
<img class="integration-logo" src="/static/images/integrations/logos/circleci.png" alt="CircleCI logo" />
<span class="integration-label">CircleCI</span>
</a>
</div>
<div class="integration-lozenge integration-codebase">
<a class="integration-link integration-codebase" href="#codebase">
<img class="integration-logo" src="/static/images/integrations/logos/codebase.png" alt="Codebase logo" />
<span class="integration-label">Codebase</span>
</a>
</div>
<div class="integration-lozenge integration-codeship">
<a class="integration-link integration-codeship" href="#codeship">
<img class="integration-logo" src="/static/images/integrations/logos/codeship.png" alt="Codeship logo" />
<span class="integration-label">Codeship</span>
</a>
</div>
<div class="integration-lozenge integration-crashlytics">
<a class="integration-link integration-crashlytics" href="#crashlytics">
<img class="integration-logo" src="/static/images/integrations/logos/crashlytics.png" alt="Crashlytics logo" />
<span class="integration-label">Crashlytics</span>
</a>
</div>
<div class="integration-lozenge integration-deskcom">
<a class="integration-link integration-deskcom" href="#deskcom">
<img class="integration-logo" src="/static/images/integrations/logos/deskcom.png" alt="Desk.com logo" />
<span class="integration-label">Desk.com</span>
</a>
</div>
{% if email_integration_enabled %}
<div class="integration-lozenge integration-email">
<a class="integration-link integration-email" href="#email">
<img class="integration-logo" src="/static/images/integrations/logos/email.png" alt="email" />
<span class="integration-label">Email</span>
</a>
</div>
{% endif %}
<div class="integration-lozenge integration-freshdesk">
<a class="integration-link integration-freshdesk" href="#freshdesk">
<img class="integration-logo" src="/static/images/integrations/logos/freshdesk.png" alt="Freshdesk logo" />
<span class="integration-label">Freshdesk</span>
</a>
</div>
<div class="integration-lozenge integration-git">
<a class="integration-link integration-git" href="#git">
<img class="integration-logo" src="/static/images/integrations/logos/git.png" alt="Git logo" />
<span class="integration-label">Git</span>
</a>
</div>
<div class="integration-lozenge integration-github">
<a class="integration-link integration-github" href="#github">
<img class="integration-logo" src="/static/images/integrations/logos/github.png" alt="Github logo" />
<span class="integration-label">GitHub</span>
</a>
</div>
<div class="integration-lozenge integration-hubot">
<a class="integration-link integration-hubot" href="#hubot">
<img class="integration-logo" src="/static/images/integrations/logos/hubot.png" alt="Hubot logo" />
<span class="integration-label">Hubot</span>
</a>
</div>
<div class="integration-lozenge integration-ifttt">
<a class="integration-link integration-ifttt" href="#ifttt">
<img class="integration-logo" src="/static/images/integrations/logos/ifttt.png" alt="IFTTT logo" />
<span class="integration-label">IFTTT</span>
</a>
</div>
<div class="integration-lozenge integration-jenkins">
<a class="integration-link integration-jenkins" href="#jenkins">
<img class="integration-logo" src="/static/images/integrations/logos/jenkins.png" alt="Jenkins logo" />
<span class="integration-label" style="padding-top: 0px; padding-bottom: 0px;">Jenkins</span>
<span class="integration-label-secondary">(or Hudson)</span>
</a>
</div>
<div class="integration-lozenge integration-jira">
<a class="integration-link integration-jira" href="#jira">
<img class="integration-logo" src="/static/images/integrations/logos/jira.png" alt="JIRA logo" />
<span class="integration-label" style="padding-top: 0px; padding-bottom: 0px;">JIRA</span>
<span class="integration-label-secondary">(hosted or v5.2+)</span>
</a>
</div>
<div class="integration-lozenge integration-jira-plugin">
<a class="integration-link integration-jira" href="#jira-plugin">
<img class="integration-logo" src="/static/images/integrations/logos/jira.png" alt="JIRA logo" />
<span class="integration-label" style="padding-top: 0px; padding-bottom: 0px;">JIRA</span>
<span class="integration-label-secondary">(locally installed)</span>
</a>
</div>
<div class="integration-lozenge integration-mercurial">
<a class="integration-link integration-mercurial" href="#mercurial">
<img class="integration-logo" src="/static/images/integrations/logos/mercurial.png" alt="Mercurial logo" />
<span class="integration-label">Mercurial (hg)</span>
</a>
</div>
<div class="integration-lozenge integration-nagios">
<a class="integration-link integration-nagios" href="#nagios">
<img class="integration-logo" src="/static/images/integrations/logos/nagios.png" alt="Nagios logo" />
<span class="integration-label">Nagios</span>
</a>
</div>
<div class="integration-lozenge integration-newrelic">
<a class="integration-link integration-newrelic" href="#newrelic">
<img class="integration-logo" src="/static/images/integrations/logos/newrelic.png" alt="New Relic logo" />
<span class="integration-label">New Relic</span>
</a>
</div>
<div class="integration-lozenge integration-pagerduty">
<a class="integration-link integration-pagerduty" href="#pagerduty">
<img class="integration-logo" src="/static/images/integrations/logos/pagerduty.png" alt="Pagerduty logo" />
<span class="integration-label">Pagerduty</span>
</a>
</div>
<div class="integration-lozenge integration-perforce">
<a class="integration-link integration-perforce" href="#perforce">
<img class="integration-logo" src="/static/images/integrations/logos/perforce.png" alt="Perforce logo" />
<span class="integration-label">Perforce</span>
</a>
</div>
<div class="integration-lozenge integration-phabricator">
<a class="integration-link integration-phabricator" href="#phabricator">
<img class="integration-logo" src="/static/images/integrations/logos/phabricator.png" alt="Phabricator logo" />
<span class="integration-label">Phabricator</span>
</a>
</div>
<div class="integration-lozenge integration-pingdom">
<a class="integration-link integration-pingdom" href="#pingdom">
<img class="integration-logo" src="/static/images/integrations/logos/pingdom.png" alt="Pingdom logo" />
<span class="integration-label">Pingdom</span>
</a>
</div>
<div class="integration-lozenge integration-pivotal">
<a class="integration-link integration-pivotal" href="#pivotal">
<img class="integration-logo" src="/static/images/integrations/logos/pivotal.png" alt="Pivotal logo" />
<span class="integration-label">Pivotal Tracker</span>
</a>
</div>
<div class="integration-lozenge integration-puppet">
<a class="integration-link integration-puppet" href="#puppet">
<img class="integration-logo" src="/static/images/integrations/logos/puppet.png" alt="Puppet logo" />
<span class="integration-label">Puppet</span>
</a>
</div>
<div class="integration-lozenge integration-redmine">
<a class="integration-link integration-redmine" href="#redmine">
<img class="integration-logo" src="/static/images/integrations/logos/redmine.png" alt="Redmine logo" />
<span class="integration-label">Redmine</span>
</a>
</div>
<div class="integration-lozenge integration-rss">
<a class="integration-link integration-rss" href="#rss">
<img class="integration-logo" src="/static/images/integrations/logos/rss.png" alt="RSS logo" />
<span class="integration-label">RSS</span>
</a>
</div>
<div class="integration-lozenge integration-semaphore">
<a class="integration-link integration-semaphore" href="#semaphore">
<img class="integration-logo" src="/static/images/integrations/logos/semaphore.png" alt="Semaphore logo" />
<span class="integration-label">Semaphore</span>
</a>
</div>
<div class="integration-lozenge integration-stash">
<a class="integration-link integration-stash" href="#stash">
<img class="integration-logo" src="/static/images/integrations/logos/stash.png" alt="Stash logo" />
<span class="integration-label">Stash</span>
</a>
</div>
<div class="integration-lozenge integration-subversion">
<a class="integration-link integration-subversion" href="#subversion">
<img class="integration-logo" src="/static/images/integrations/logos/subversion.png" alt="Subversion logo" />
<span class="integration-label">Subversion</span>
</a>
</div>
<div class="integration-lozenge integration-taiga">
<a class="integration-link integration-taiga" href="#taiga">
<img class="integration-logo" src="/static/images/integrations/logos/taiga.png" alt="Taiga logo" />
<span class="integration-label">Taiga</span>
</a>
</div>
<div class="integration-lozenge integration-teamcity">
<a class="integration-link integration-teamcity" href="#teamcity">
<img class="integration-logo" src="/static/images/integrations/logos/teamcity.png" alt="Teamcity logo" />
<span class="integration-label">Teamcity</span>
</a>
</div>
<div class="integration-lozenge integration-trac">
<a class="integration-link integration-trac" href="#trac">
<img class="integration-logo" src="/static/images/integrations/logos/trac.png" alt="Trac logo" />
<span class="integration-label">Trac</span>
</a>
</div>
<div class="integration-lozenge integration-transifex">
<a class="integration-link integration-transifex" href="#transifex">
<img class="integration-logo" src="/static/images/integrations/logos/transifex.png" alt="Transifex logo" />
<span class="integration-label">Transifex</span>
</a>
</div>
<div class="integration-lozenge integration-travis">
<a class="integration-link integration-travis" href="#travis">
<img class="integration-logo" src="/static/images/integrations/logos/travis.png" alt="Travis CI logo" />
<span class="integration-label">Travis CI</span>
</a>
</div>
<div class="integration-lozenge integration-trello">
<a class="integration-link integration-trello" href="#trello">
<img class="integration-logo" src="/static/images/integrations/logos/trello.png" alt="Trello logo" />
<span class="integration-label">trello</span>
</a>
</div>
<div class="integration-lozenge integration-twitter">
<a class="integration-link integration-twitter" href="#twitter">
<img class="integration-logo" src="/static/images/integrations/logos/twitter.png" alt="Twitter logo" />
<span class="integration-label">Twitter</span>
</a>
</div>
<div class="integration-lozenge integration-updown">
<a class="integration-link integration-updown" href="#updown">
<img class="integration-logo" src="/static/images/integrations/logos/updown.png" alt="Updown logo" />
<span class="integration-label">Updown</span>
</a>
</div>
<div class="integration-lozenge integration-yo-app">
<a class="integration-link integration-yo-app" href="#yo-app">
<img class="integration-logo" src="/static/images/integrations/logos/yo-app.png" alt="Yo App logo" />
<span class="integration-label">Yo App</span>
</a>
</div>
<div class="integration-lozenge integration-zendesk">
<a class="integration-link integration-zendesk" href="#zendesk">
<img class="integration-logo" src="/static/images/integrations/logos/zendesk.png" alt="Zendesk logo" />
<span class="integration-label">Zendesk</span>
</a>
</div>
</div>
<div class="portico-page-header extra" id="hubot-integrations"><a href="#"><i class="icon-vector-gears portico-page-header-icon"></i>Integrations available via Hubot</a></div>
<p class="portico-large-text extra">The official <a class="integration-link integration-hubot" href="#hubot"><span class="integration-label">Hubot</span></a>
integration provides an extension point for additional Zulip integrations. </p><p class="portico-large-text extra"> A non-comprehensive list of integrations available through
<a class="integration-link integration-hubot" href="#hubot"><span class="integration-label">Hubot</span></a> follows below:</p>
<div class="integration-lozenges">
<div class="integration-lozenge integration-assembla">
<a class="integration-link integration-assembla" href="https://github.com/hubot-scripts/hubot-assembla" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/assembla.png" alt="Assembla logo" />
<span class="integration-label">Assembla</span>
</a>
</div>
<div class="integration-lozenge integration-bonusly">
<a class="integration-link integration-bonusly" href="https://github.com/hubot-scripts/hubot-bonusly" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/bonusly.png" alt="Bonusly logo" />
<span class="integration-label">Bonusly</span>
</a>
</div>
<div class="integration-lozenge integration-chartbeat">
<a class="integration-link integration-chartbeat" href="https://github.com/hubot-scripts/hubot-chartbeat" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/chartbeat.png" alt="Chartbeat logo" />
<span class="integration-label">Chartbeat</span>
</a>
</div>
<div class="integration-lozenge integration-darksky">
<a class="integration-link integration-darksky" href="https://github.com/hubot-scripts/hubot-darksky" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/darksky.png" alt="Dark Sky logo" />
<span class="integration-label">Dark Sky</span>
</a>
</div>
<div class="integration-lozenge integration-hangouts">
<a class="integration-link integration-hangouts" href="https://github.com/hubot-scripts/hubot-google-hangouts" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/hangouts.png" alt="Hangouts logo" />
<span class="integration-label">Hangouts</span>
</a>
</div>
<div class="integration-lozenge integration-instagram">
<a class="integration-link integration-instagram" href="https://github.com/hubot-scripts/hubot-instagram" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/instagram.png" alt="Instagram logo" />
<span class="integration-label">Instagram</span>
</a>
</div>
<div class="integration-lozenge integration-mailchimp">
<a class="integration-link integration-mailchimp" href="https://github.com/hubot-scripts/hubot-mailchimp" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/mailchimp.png" alt="MailChimp logo" />
<span class="integration-label">MailChimp</span>
</a>
</div>
<div class="integration-lozenge integration-translate">
<a class="integration-link integration-translate" href="https://github.com/hubot-scripts/hubot-google-translate" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/translate.png" alt="Google Translate logo" />
<span class="integration-label">Translate</span>
</a>
</div>
<div class="integration-lozenge integration-youtube">
<a class="integration-link integration-youtube" href="https://github.com/hubot-scripts/hubot-youtube" target="_blank">
<img class="integration-logo" src="/static/images/integrations/logos/youtube.png" alt="YouTube logo" />
<span class="integration-label">YouTube</span>
</a>
</div>
</div>
<div id="integration-instructions-group">
<div id="airbrake" class="integration-instructions">
<p>Get Zulip notifications for your Airbrake bug tracker!</p>
<p>First, create the stream you'd like to use for Airbrake notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>airbrake</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip
settings page</a>, create an Airbrake bot. Construct the URL for
the Airbrake bot using the API key and stream name:
<code>{{ external_api_uri }}/v1/external/airbrake?api_key=abcdefgh&amp;stream=airbrake</code>
</p>
<p>Now, go to your project's settings on the Airbrake site. Click
on the <code>Integration</code> section.
Choose <code>Webhook</code>, provide the above URL,
check <code>Enabled</code>, and save. Your Webhook
configuration should look similar to:
</p>
<img class="screenshot" src="/static/images/integrations/airbrake/001.png" />
<p><b>Congratulations! You're done!</b><br /> Your messages may look like:</p>
<img class="screenshot" src="/static/images/integrations/airbrake/002.png" />
</div>
<div id="asana" class="integration-instructions">
<p>Get Zulip notifications for your Asana tasks!</p>
<p>First, create the stream you'd like to use for Asana notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>asana</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create an Asana bot. Please note the bot name and API key.</p>
<p>Then:</p>
<ol>
<li>
<p>Download and install our <a href="/api">Python bindings</a> on the
server where the Asana mirroring script will live. The Asana
integration will be installed to a location
like <code>/usr/local/share/zulip/integrations/asana/</code>.</p>
</li>
<li>
<p>Visit your <a href="https://app.asana.com/-/account_api">Asana
account settings page</a> and retrieve your API key.</p>
<p>Edit <code>asana/zulip_asana_config.py</code> and
change the following lines to configure the integration:</p>
<div class="codehilite">
<pre>
<span class="n">ASANA_API_KEY</span> <span class="o">=</span> <span class="s">0123456789abcdef0123456789abcdef</span>
<span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"asana-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre>
</div>
<p>If you are using a stream other than <code>asana</code>,
set <code>ZULIP_STREAM_NAME</code> to the chosen stream name.</p>
</li>
<li>
<p>Test your configuration by running the mirror with <code>python
asana/zulip_asana_mirror</code>. It will print some informational
messages and process any recently created or completed tasks.</p>
</li>
<li>
<p>This mirror is intended to be a long-running processing and should be
hooked into your infrastructure for keeping services running (for
example, auto-restarting through <code>supervisord</code>).</p>
<p>Please
contact <a href="mailto:zulip-devel@googlegroups.com?subject=Asana%20integration%20question">zulip-devel@googlegroups.com</a>
if you'd like assistance with maintaining this integration.
</p>
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When team members create and
complete tasks in Asana, you'll get a Zulip notification that looks like
this:</p>
<img class="screenshot" src="/static/images/integrations/asana/001.png" />
</div>
<div id="basecamp" class="integration-instructions">
<p>First, create the stream you'd like to use for Basecamp notifications,
and subscribe all interested parties to this stream. We recommend the
name <code>basecamp</code>.</p>
<p>Next, download and install our <a href="/api">Python
bindings and example scripts</a> on the computer you'd like to run this mirroring script from.</p>
<p>You will need your Basecamp account ID. You can find it as a sequence of numbers in the URL when you log in:</p>
<img class="screenshot" src="/static/images/integrations/basecamp/001.png" />
<p>Edit the Basecamp and Zulip credentials in <code>integrations/basecamp/zulip_basecamp_config.py</code> using
your favorite editor:</p>
<div class="codehilite">
<pre><span class="n">BASECAMP_ACCOUNT_ID</span> <span class="o">=</span> <span class="s">"1234567"</span>
<span class="n">BASECAMP_USERNAME</span> <span class="o">=</span> <span class="s">"foo@example.com"</span>
<span class="n">BASECAMP_PASSWORD</span> <span class="o">=</span> <span class="s">"p455w0rd"</span>
<span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"basecamp-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre>
</div>
<p>Before your first run of the script, you may optionally choose to
configure it to mirror some number of hours of Basecamp activity:</p>
<div class="codehilite">
<pre><span class="n">BASECAMP_INITIAL_HISTORY_HOURS</span> <span class="o">=</span> <span class="s">10</span></pre>
</div>
<p>Now, simply run the <code>api/integrations/basecamp/zulip_basecamp_mirror</code> script.
If needed, this script may be restarted, and it will automatically resume from when
it was last running.</p>
<p><b>Congratulations! You're done!</b><br /> Whenever you create a new project,
calendar event, comment, message, or more, you'll get a notification in your selected stream
with the project or calendar as the topic.</p>
<img class="screenshot" src="/static/images/integrations/basecamp/002.png" />
</div>
<div id="beanstalk" class="integration-instructions">
<p>Zulip supports both SVN and Git notifications from Beanstalk.</p>
<p>First, create the stream <code>commits</code> and subscribe all
interested parties to this stream.</p>
<p>Next, in the Beanstalk web application, go to the Setup page and choose the Integrations tab.
Choose the <code>Webhooks</code> integration from the list presented. Make sure to replace the <code>@</code> in the bot's email address with <code>%40</code>,
as Beanstalk's website will incorrectly refuse to parse a username containing a <code>@</code>.</p>
<p>In the URL field, enter <code>{{ external_uri_scheme }}bot_email:bot_api_key@{{ external_api_path }}/v1/external/beanstalk</code>:</p>
<img class="screenshot" src="/static/images/integrations/beanstalk/001.png" />
<p><b>Congratulations! You're done!</b><br /> Whenever you do a
deployment, you'll get an automated notification that looks like
this:</p>
<img class="screenshot" src="/static/images/integrations/beanstalk/002.png" />
</div>
<div id="bitbucket" class="integration-instructions">
<p>Zulip supports both Git and Mercurial notifications from Bitbucket.</p>
<p>First, create the stream you'd like to use for Bitbucket notifications,
and subscribe all interested parties to this stream. The integration will
use the default stream <code>commits</code> if no stream is supplied in the
hook; you still need to create the stream even if you are using this
default.</p>
<p>Next, from your repository's web page, go to the Administration page and choose Hooks on the left-hand side.
Choose the <code>POST</code> hook from the list presented and click "Add hook." Make sure to replace the <code>@</code> in the bot's email address with <code>%40</code>,
as Bitbucket will not execute the hook if the username contains a <code>@</code>.</p>
<p>In the URL field, enter <code>{{ external_uri_scheme }}bot_email:bot_api_key@{{ external_api_path }}/v1/external/bitbucket</code>:</p>
<img class="screenshot" src="/static/images/integrations/bitbucket/001.png" />
<p>By default, notifications are sent to the <code>commits</code> stream.
To send notifications to a different stream,
append <code style="white-space: nowrap;">?stream=stream_name</code> to
the URL.</p>
<p><b>Congratulations! You're done!</b><br /> Whenever you push code to your repository,
you'll get an automated notification that looks like this:</p>
<img class="screenshot" src="/static/images/integrations/bitbucket/002.png" />
</div>
<div id="capistrano" class="integration-instructions">
<p>First, download and install our <a href="/api">Python
bindings and example scripts</a> on your Capistrano server.
Once you've done that, you'll use the <code>zulip-send</code>
utility to notify you when certain events happen.</p>
<p>Here's some example code for sending a Zulip notification
after a deployment has completed:</p>
<div class="codehilite"><pre><span class="n">after</span> <span class="s1">'deploy'</span><span class="p">,</span> <span class="s1">'notify:humbug'</span>
<span class="n">namespace</span> <span class="ss">:notify</span> <span class="k">do</span>
<span class="n">desc</span> <span class="s2">"Post a message to Zulip that we've deployed"</span>
<span class="n">task</span> <span class="ss">:humbug</span> <span class="k">do</span>
<span class="c1"># this will post to Zulip as the user defined in
# ~/.zuliprc if you omit --user and --api-key</span>
<span class="n">run_locally</span> <span class="s2">"echo ':beers: I just deployed to </span><span class="si">#{</span><span class="n">stage</span><span class="si">}</span><span class="s2">! :beers:' | zulip-send \
--user capistrano-bot@example.com --api-key a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5 \
{% if api_site_required %} --site={{ external_api_uri }} \
{% endif %} --stream commits --subject deployments || true"</span>
<span class="k">end</span>
<span class="k">end</span>
</pre></div>
<p>Some notes:</p>
<ul>
<li>If you prefer not to use <code>--user</code> and <code>--api-key</code> above, you can fill out <code>~/.zuliprc</code> on your Capistrano
machine. For instructions on how to write that file, see <a href="/api">the API page</a>.</li>
<li>You may need to change the <code>deploy</code> above to
another step of your deployment process, if you'd like the
notification to fire at a different time.</li>
</ul>
<em></em>
<p><b>Congratulations! You're done!</b><br /> Whenever you do a
deployment, you'll get an automated notification that looks like
this:</p>
<img class="screenshot" src="/static/images/integrations/capistrano/001.png" />
<p><small>Thanks to Wes of TurboVote for <a href="https://gist.github.com/cap10morgan/5100822">submitting this integration</a>!</small></p>
</div>
<div id="circleci" class="integration-instructions">
<p>Zulip supports integration with CircleCI and can notify you of
your build statuses.</p>
<p>First, create the stream you'd like to use for CircleCI notifications,
and subscribe all interested parties to this stream. We
recommend the name <code>circleci</code>.</p>
<p><code>{{ external_api_uri }}/v1/external/circleci?api_key=abcdefgh&amp;stream=circleci</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>
Next, modify your <code>circle.yml</code> as described
<a href="https://circleci.com/docs/configuration/#notify">here</a>.
</p>
<p><b>Congratulations! You're done!</b><br /> When a build is done,
you'll get a notification like this:</p>
<img class="screenshot" src="/static/images/integrations/circleci/001.png" />
</div>
<div id="codebase" class="integration-instructions">
<p>First, create the streams you'd like to use for Codebase notifications. There will be two types of
messages: commit-related updates and issue-related updates. After creating these streams (we suggest naming
them <code>codebase commits</code> and <code>codebase issues</code>), make sure to subscribe all interested parties.</p>
<p>Next, download and install our <a href="/api">Python
bindings and example scripts</a> on the computer you'd like to run this mirroring script from.</p>
<p>You will need your Codebase API Username. You can find it in the settings page of your account, under
<code>API Credentials</code>.</p>
<p>Edit the Codebase and Zulip credentials in <code>integrations/codebase/zulip_codebase_config.py</code> using
your favorite editor:</p>
<div class="codehilite">
<pre><span class="n">CODEBASE_API_USERNAME</span> <span class="o">=</span> <span class="s">"zulip-inc/leo-franchi-15"</span>
<span class="n">CODEBASE_API_KEY</span> <span class="o">=</span> <span class="s">0123456789abcdef0123456789abcdef</span>
<span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"codebase-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre>
</div>
<p>Before your first run of the script, you may optionally choose to
configure it to mirror some number of hours of prior Codebase activity:</p>
<div class="codehilite">
<pre><span class="n">CODEBASE_INITIAL_HISTORY_HOURS</span> <span class="o">=</span> <span class="s">10</span></pre>
</div>
<p>Now, simply run the <code>api/integrations/codebase/zulip_codebase_mirror</code> script.
If needed, this script may be restarted, and it will automatically resume from when
it was last running.</p>
<p><b>Congratulations! You're done!</b><br /> Whenever you create a new project,
commit, issue, deployment, or more, you'll get notifications in your selected streams
with the associated information.</p>
<img class="screenshot" src="/static/images/integrations/codebase/001.png" />
</div>
<div id="codeship" class="integration-instructions">
<p>Zulip supports integration with Codeship and can notify you of
your build statuses.</p>
<p>First, create the stream you'd like to use for Codeship notifications,
and subscribe all interested parties to this stream. We
recommend the name <code>codeship</code>.</p>
<p><code>{{ external_api_uri }}/v1/external/codeship?api_key=abcdefgh&amp;stream=codeship</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Next, go to your project settings - notification settings
page. The url should look like the following:</p>
<p><code>https://codeship.com/projects/PROJECT_ID/configure_notifications</code></p>
<p>where <code>PROJECT_ID</code> is the id of your project in Codeship.</p>
<p>Scroll to the <code>Webhook</code> section and fill out the form as follows:</p>
<img class="screenshot" src="/static/images/integrations/codeship/001.png" />
<p><b>Congratulations! You're done!</b><br /> When a build is
triggered, you'll get a notification like this:</p>
<img class="screenshot" src="/static/images/integrations/codeship/002.png" />
</div>
<div id="crashlytics" class="integration-instructions">
<p>Zulip supports integration with Crashlytics and can notify you
about Crashlytics issues.</p>
<p>First, create the stream you'd like to use for Crashlytics notifications,
and subscribe all interested parties to this stream. We
recommend the name <code>crashlytics</code>.</p>
<p><code>{{ external_api_uri }}/v1/external/crashlytics?api_key=abcdefgh&amp;stream=crashlytics</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Click on the app in
your <a href="https://fabric.io/settings/apps">Crashlytics settings panel</a>.
Next, on the integrations subpage, click “Web Hook,” enter the URL we created above and click
<code>Verify</code>.</p>
<p><b>Congratulations! You're done!</b><br /> When an issue occurs,
you'll get a notification like this:</p>
<img class="screenshot" src="/static/images/integrations/crashlytics/001.png" />
</div>
<div id="deskcom" class="integration-instructions">
<p>First, create the stream you'd like to use for Desk.com notifications,
and subscribe all interested parties to this stream. We recommend the
stream name <code>desk</code>. Keep in mind you still need to
create the stream first even if you are using this recommendation.</p>
<p>Next, in Desk.com, open your Admin view via the top-left corner
dropdown. In the Admin view, click on Apps, then click Install under
"Custom Action":</p>
<img src="/static/images/integrations/desk/001.png" />
<p>From there, click "Install Custom Action" and accept the terms. Fill
in the form like this:</p>
<ul>
<li><b>Name</b>: Zulip</li>
<li><b>Authentication Method</b>: Basic Auth</li>
<li><b>URL</b>: <code>{{ external_api_uri }}/v1/external/desk</code></li>
<li><b>User name</b>: <em>your bot's user name, e.g.</em> <code>desk-bot@yourdomain.com</code></li>
<li><b>Password</b>: <em>your bot's API key</em></li>
</ul>
<img src="/static/images/integrations/desk/002.png" />
<p>From here, add a new action. You'll do this for every action you
want a notification on Zulip for:</p>
<img src="/static/images/integrations/desk/003.png" />
<p>Let's say you want a notification each time a case is updated. Put
in a descriptive name like "Announce case update", and copy-paste
this to the "Appended URL path":</p>
{% raw %}
<p><code>?stream=desk&amp;topic={{case.id}}:+{{case.subject}}</code></p>
{% endraw %}
<p>The "appended URL path" will be the same for every notification —
it makes sure the notification goes to the appropriate stream and topic
within Zulip. Next, copy this template Zulip message into "Message to
POST":</p>
{% raw %}
<pre><code
>Case [{{case.id}}, {{case.subject}}]({{case.direct_url}}), was updated.
* Status: {{case.status.name}}
* Priority: {{case.priority}}
* Customer: {{customer.name}}
* Company: {{customer.company}}
* Description: {{case.description}}</code></pre>
<p>You don't need to edit that. All the funny-looking stuff inside
<code>{{</code> and <code>}}</code>
will be filled in by Desk.com for each event. The dialog should look
like this:</p>
{% endraw %}
<img src="/static/images/integrations/desk/004.png" />
<p>Save it, and then click "On" next to the action to enable it. This
is important — actions are turned off by default!</p>
<p>Now you need to create a rule that triggers this action. Desk.com's
support center has a
<a href="https://support.desk.com/customer/portal/articles/1376">lengthy
article on rules</a>, but in short, click on "Cases" up at the top,
"Rules" on the left side, and then the specific event you want to notify
on — in our example, "Case Updated". Add a rule with a name like "Notify
Zulip of case update". Click on "Add Action", select "Trigger an App
Action", and select "Zulip: Announce case update". Set "Enabled" to
"Yes". The rule should look like this:</p>
<img src="/static/images/integrations/desk/005.png" />
<p>Finally, click Update.</p>
<p><b>Congratulations! You're done!</b><br /> When a case is updated,
you'll see a notification like the following, to the stream
<code>desk</code>, with a topic that matches the case's subject name:</p>
<img class="screenshot" src="/static/images/integrations/desk/006.png" />
</div>
{% if email_integration_enabled %}
<div id="email" class="integration-instructions">
<p>You can send emails to Zulip! This is useful:</p>
<ul>
<li>If you use a service that can send emails but does not easily lend
itself to more direct integration</li>
<li>If you have an email that you want to discuss on Zulip</li>
<li>As a structured, searchable, commentable archive for mailing list
traffic</li>
</ul>
<p>To send an email to a Zulip stream:</p>
<ol>
<li>visit your <a target="_blank" href="../#subscriptions">subscriptions
page</a> and click on the stream row to expand it.</li>
<li>Copy the stream email address
(e.g. <code>{{ email_gateway_example }}</code>). If the stream
name contains special characters, we've transformed the name so it is a
safe email recipient.</li>
<li>Send an email (To, CC, and BCC all work) to the stream email
address. The email subject will become the stream topic, and the email
body will become the Zulip message content.</li>
</ol>
<p>Please note that it may take up to one minute for the message to show up
in Zulip.</p>
</div>
{% endif %}
<div id="freshdesk" class="integration-instructions">
<h4>Freshdesk</h4>
<p>See customer support interactions right in Zulip, with our Freshdesk
integration! Note that this integration must be set up by an administrator
for your Freshdesk instance.</p>
<p>First, create the stream you'd like to use for Freshdesk notifications,
and subscribe all interested parties to this stream. We recommend the
stream name <code>freshdesk</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create a Freshdesk bot.</p>
<p>Now we can set up the Freshdesk events that will trigger
Zulips. Freshdesk provides separate triggering mechanisms for ticket
creation and ticket changes, so we'll set up these triggers in two
parts.</p>
<h4>Part 1: Zulip notifications for new Freshdesk tickets</h4>
<ol>
<li>
<p>Visit your Freshdesk admin page. Under the <b>"Helpdesk
Productivity"</b> section, click the <b>"Dispatch'r"</b> icon:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/001.png" />
<p>Click the <b>"New rule"</b> button to create a new Dispatch'r rule
that will send notifications to Zulip when Freshdesk tickets are
opened.</p>
</li>
<li>
<p>On the Dispatch'r rule creation page, give the rule a name and
description. Next, we need to specify the conditions under which to
trigger Zulip notifications. There isn't a shortcut for "always
generate a notification on ticket creation", so we'll instead fake it
by picking two complementary conditions: when the source <b>is
email</b>, and when the source <b>is not email</b>:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/002.png" />
</li>
<li>
<p>In the <b>"Action"</b> section, add a new action of
type <b>"Trigger Webhook"</b>. Set the <b>"Request Type"</b>
to <b>"POST"</b>. Set the following <b>"Callback URL"</b>, replacing
the Zulip stream with your desired stream:</p>
<p><code>{{ external_api_uri }}/v1/external/freshdesk?stream=<font color="#00A26F">freshdesk</font></code></p>
<p>Check the <b>"Requires Authentication"</b> box, and supply the bot
e-mail address and API key.</p>
<p>The Action section should look like this so far:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/003.png" />
</li>
<li>
<p>Select <b>"JSON"</b> for the <b>"Encoding"</b>. Under the encoding, select
<b>"Advanced"</b>. Paste the following JSON into the <b>"Content"</b>
box:</p>
<pre>{"freshdesk_webhook":
{
"triggered_event":"&#123;&#123;triggered_event&#125;&#125;",
"ticket_id":"&#123;&#123;ticket.id&#125;&#125;",
"ticket_url":"&#123;&#123;ticket.url&#125;&#125;",
"ticket_type":"&#123;&#123;ticket.ticket_type&#125;&#125;",
"ticket_subject":"&#123;&#123;ticket.subject&#125;&#125;",
"ticket_description":"&#123;&#123;ticket.description&#125;&#125;",
"ticket_status":"&#123;&#123;ticket.status&#125;&#125;",
"ticket_priority":"&#123;&#123;ticket.priority&#125;&#125;",
"requester_name":"&#123;&#123;ticket.requester.name&#125;&#125;",
"requester_email":"&#123;&#123;ticket.requester.email&#125;&#125;",
}
}</pre>
<p>These ticket details are what will be forwarded to Zulip. The
pasted JSON should look like this:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/004.png" />
</li>
<li>
<p>Save your new Dispatch'r rule. The next time a Freshdesk ticket is
opened, the team will get a notification in Zulip!</p>
</li>
</ol>
<p>If you only want to receive Zulip notifications on ticket creation,
stop here, you're done! If you also want notifications on important ticket
changes, please continue to the next section.</p>
<h4>Part 2: Zulip notifications on ticket changes</h4>
<ol>
<li>
<p>Visit your Freshdesk admin page. Under the <b>"Helpdesk
Productivity"</b> section, click the <b>"Observer"</b> icon:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/005.png" />
<p>Click the <b>"New rule"</b> button to create a new Observer rule
that will send notifications to Zulip when Freshdesk tickets are
updated.</p>
</li>
<li>
<p>On the Observer rule creation page, give the rule a name and
description. Under <b>"When Any Of These Events Occur"</b>, create
these new rules:</p>
<ul>
<li><p>Priority is changed, from Any Priority, to Any Priority</p></li>
<li><p>Status is changed, from Any Status, to Any Status</p></li>
<li><p>Note is added, Type Any</p></li>
</ul>
<p>If you do not want to receive Zulip notifications on one or more of
these events, leave out the rule for that event.</p>
<p>Under <b>"And The Events Are Performed By"</b>,
select <b>"Anyone"</b>.</p>
<p>So far, the rule should look like this:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/006.png" />
</li>
<li>
<p>Next, we need to specify the types of tickets that will trigger
Zulip notifications. There isn't a shortcut for "always generate a
notification on ticket update", so as before we'll instead fake it by
picking two complementary conditions: when the source <b>is email</b>,
and when the source <b>is not email</b>:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/007.png" />
</li>
<li>
<p>Under <b>"Perform These Actions"</b>, add a new action of
type <b>"Trigger Webhook"</b>. Set the <b>"Request Type"</b>
to <b>"POST"</b>. Set the following <b>"Callback URL"</b>, replacing
the Zulip stream with your desired stream:</p>
<p><code>{{ external_api_uri }}/v1/external/freshdesk?stream=<font color="#00A26F">freshdesk</font></code></p>
<p>Check the <b>"Requires Authentication"</b> box, and supply the bot
e-mail address and API key.</p>
<p>The Action section should look like this so far:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/008.png" />
</li>
<li>
<p>Select <b>"JSON"</b> for the <b>"Encoding"</b>. Under the encoding,
select <b>"Advanced"</b>. Paste the following JSON into
the <b>"Content"</b> box:</p>
<pre>{"freshdesk_webhook":
{
"triggered_event":"&#123;&#123;triggered_event&#125;&#125;",
"ticket_id":"&#123;&#123;ticket.id&#125;&#125;",
"ticket_url":"&#123;&#123;ticket.url&#125;&#125;",
"ticket_type":"&#123;&#123;ticket.ticket_type&#125;&#125;",
"ticket_subject":"&#123;&#123;ticket.subject&#125;&#125;",
"ticket_description":"&#123;&#123;ticket.description&#125;&#125;",
"ticket_status":"&#123;&#123;ticket.status&#125;&#125;",
"ticket_priority":"&#123;&#123;ticket.priority&#125;&#125;",
"requester_name":"&#123;&#123;ticket.requester.name&#125;&#125;",
"requester_email":"&#123;&#123;ticket.requester.email&#125;&#125;",
}
}</pre>
<p>These ticket details are what will be forwarded to Zulip. The
pasted JSON should look like this:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/009.png" />
</li>
<li>
<p>Save your new Observer rule. The next time a Freshdesk ticket is
updated, the team will get a notification in Zulip!</p>
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> You'll now see support
progress in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/freshdesk/010.png" />
</div>
<div id="git" class="integration-instructions">
<p>First, download and install our <a href="/api">Python
bindings and example scripts</a> on your Git server.</p>
<p>Next, create the stream you'd like to use for Git notifications, and
subscribe all interested parties to this stream. The integration will use
the default stream <code>commits</code> if no stream is supplied in the
hook; you still need to create the stream even if you are using this
default.</p>
<p>Next, open <code>integrations/git/zulip_git_config.py</code>
in your favorite editor, and change the following lines to
specify the email address and API key for your Git bot:</p>
<div class="codehilite"><pre><span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"git-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre></div>
<p>You can also specify which pushes will result in
notifications and to what stream the notifications will be sent
by modifying the <code>commit_notice_destination</code> function
in <code>zulip_git_config.py</code>. By default, pushes to
the <code>master</code> and <code>test-post-receive</code>
branches will result in a notification to
stream <code>commits</code>.</p>
<p>Save <code>integrations/git/zulip_git_config.py</code> to
the <code>.git/hooks</code> directory of your git
repository.</p>
<p>Symlink
<code>/usr/local/share/zulip/integrations/git/post-receive</code>
into the <code>.git/hooks</code> directory of your git repository.</p>
<p><b>Congratulations! You're done!</b><br /> Whenever you make
a push to the <code>master</code> branch of your git repository
(or whatever you configured above), the Zulip git plugin will
send an automated notification that looks like this:</p>
<img class="screenshot" src="/static/images/integrations/git/001.png" />
<p><b>Testing</b><br />You can test the plugin without changing
your <code>master</code> branch by pushing to
the <code>test-post-receive</code> branch.</p>
</div>
<div id="github" class="integration-instructions">
<p>First, create the stream you'd like to use for GitHub notifications,
and subscribe all interested parties to this stream. The integration will
use the default stream <code>commits</code> if no stream is supplied in
the hook; you still need to create the stream even if you are using this
default.</p>
<p>Next, go to your repository page and click <b>"Settings"</b>:</p>
<p><img src="/static/images/integrations/github/001.png" /></p>
<p>From there, select <b>"Webhooks &amp; Services"</b>:</p>
<p><img src="/static/images/integrations/github/002.png" /></p>
<p>To find the Zulip hook, you have to click on <b>Configure services</b>.</p>
<p><img class="screenshot" src="/static/images/integrations/github/003.png" /></p>
<p>Select <b>"Zulip"</b> from the list of service hooks. Fill in the API
key and email address for your bot and check the <b>"active"</b>
checkbox. You can optionally supply the Zulip stream (the default
is <code>commits</code>) and restrict Zulip notifications to a specified
set of branches.</p>
<p>Further configuration is possible. By default, commits traffic (pushes, commit comments),
Github issues traffic, and pull requests are enabled. You can exclude certain types of traffic
via the checkboxes. If you want commit traffic, issue traffic, and pull requests to go to
different places, you can use the <b>Commit Stream</b> and <b>Issue Stream</b> overrides;
otherwise, it is safe to leave these fields blank and just have it default to the <b>Stream</b>
setting.</p>
<p>Click the <b>"Update settings"</b> button to complete the
configuration:</p>
<p><img src="/static/images/integrations/github/004.png" /></p>
<p><b>Congratulations! You're done!</b><br /> When team members push to
your repository, you'll get a Zulip notification that looks like this:</p>
<p><img class="screenshot" src="/static/images/integrations/github/005.png" /></p>
</div>
<div id="hubot" class="integration-instructions">
<ol>
<li><p>Follow the "Getting Started with Hubot" section of the <a href="https://hubot.github.com/docs/#getting-started-with-hubot">Hubot README</a> to create your Hubot. You'll have a new directory from which <code>bin/hubot</code> starts a vanilla Hubot instance with the shell backend.</p></li>
<li>In your Hubot's directory, install the Zulip adapter. Run:
<pre><code>npm install --save hubot-zulip</code></pre>
</li>
<li><p>On your <a href="/#settings">Zulip settings page</a>, create a bot account. Note its username, API key and full name; you will use them on the next step.</p></li>
<li>To run Hubot locally, use:
<pre><code>HUBOT_ZULIP_BOT=hubot-bot@example.com HUBOT_ZULIP_API_KEY=your_key bin/hubot --adapter zulip --name "myhubot"</code></pre>
</li>
</ol>
<p>The bot account email address and API key are passed to Hubot via environment variables <code>HUBOT_ZULIP_BOT</code> and <code>HUBOT_ZULIP_API_KEY</code>. The <code>--name</code> parameter must match the name you gave the bot on the settings page.</p>
<p>
Hubot will automatically listen for commands on all public streams. You can also invite Hubot to invite-only streams.
</p>
<p>
To test your Hubot installation, send it an @-notification with a basic command, for example <code>@Hubot pug me</code>, which should produce a result like this:
</p>
<img class="screenshot" src="/static/images/integrations/hubot/001.png" />
<p><a href='https://github.com/zulip/hubot-zulip'>Source code for the hubot-zulip adapter is available on GitHub</a>.</p>
<p><a href="#hubot-integrations">Check out additional Zulip integrations available via Hubot</a></p>
</div>
<div id="jenkins" class="integration-instructions">
<p>First, create the stream you'd like to use for Jenkins or Hudson
notifications, and subscribe all interested parties to this stream. We
recommend the name <code>jenkins</code> or <code>hudson</code>.</p>
<p><strong>Install the plugin</strong><br /> Install the "Zulip"
plugin by going to <code>Manage Jenkins > Manage Plugins >
Available</code>, typing in "Zulip", and clicking "Install
without restart". (For historical reasons, the plugin will be
named "Humbug Plugin")</p>
<img class="screenshot" src="/static/images/integrations/jenkins/001.png" />
<p><strong>Configure the plugin</strong><br /> Once the plugin
is installed, configure it by going to <code>Manage Jenkins >
Configure System</code>. Scroll to the section labeled "Zulip
Notification Settings", and specify your bot's email address,
API key, the stream receiving the notifications, and whether you'd
like a notification on every build, or only when the build fails
(Smart Notification).</p>
<p>(If you don't see this option, you may first need to restart
Jenkins.)</p>
<img src="/static/images/integrations/jenkins/002.png" />
<p><strong>Configure a post-build action for your project</strong><br />
Once you've done that, it's time to configure one of your
projects to use the Zulip notification plugin. From your
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 below. Then click "Save".</p>
<img src="/static/images/integrations/jenkins/003.png" />
<p><b>Congratulations! You're done!</b><br /> When your builds
fail or succeed, you'll see a commit message like the following
with a topic that matches the project name (in this case
"SecretProject"):</p>
<img class="screenshot" src="/static/images/integrations/jenkins/004.png" />
<p><b>Troubleshooting</b><br />
<ul>
<li>Did you set up a post-build action for your project?</li>
<li>Does the stream you picked (e.g. <code>jenkins</code>) already exist? If not, add yourself to it and try again.</li>
<li>Are your access key and email address correct? Test them using <a href="/api">our curl API</a>.</li>
<li>Still stuck? Email <a href="mailto:zulip-devel@googlegroups.com?subject=Jenkins">zulip-devel@googlegroups.com</a>.</li>
</ul>
</p>
</div>
<div id="ifttt" class="integration-instructions">
<p>Get notifications from every event supported by IFTTT.</p>
<p>First, create the stream you'd like to use for IFTTT notifications,
and subscribe all interested parties to this stream.</p>
<p><code>{{ external_api_uri }}/v1/external/ifttt?api_key=abcdefgh&amp;stream=ifttt</code></p>
<p>Next, create an IFTTT recipe, picking the service you'd like
to receive notifications from as <code>this</code>,
and <code>Maker</code> as <code>that</code>.</p>
<img class="screenshot" src="/static/images/integrations/ifttt/001.png" />
<p>Choose the <code>Make a web request</code> action, and
configure it as follows:</p>
<ul>
<li><code>URL</code> is the url we created above</li>
<li><code>method</code> is POST</li>
<li><code>Content Type</code> is <code>application/json</code></li>
</ul>
<p>Finally, configure the request body. You need to construct a JSON
object with two parameters: <code>body</code>
and <code>subject</code>.<br />
Example:
<code>{"body": "message content", "subject": "message subject"}</code>
<br/>
</p>
<p>You will most likely want to specify some IFTTT
"Ingredients" (click the beaker to see the available
options) to customize the subject and body of your
messages; the below screenshot uses ingredients available
if <code>this</code> is IFTTT's incoming email service.
</p>
<p>Example configuration:
<img class="screenshot" src="/static/images/integrations/ifttt/002.png" />
</p>
<p>You're done! Example message:</p>
<img class="screenshot" src="/static/images/integrations/ifttt/003.png" />
</div>
<div id="jira" class="integration-instructions">
<p><em>If you are running JIRA version 5.2 or greater, or if you are
using the hosted JIRA provided by Atlassian, you can use the built-in
web-hook support to connect to Zulip &mdash; read on. For older,
self-hosted JIRA installs, you can use our <a
href="#jira-plugin">JIRA Plugin</a>.</em></p>
<p>First, create the stream you'd like to use for JIRA notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>jira</code>.</p>
<p>In your JIRA administration control panel, go to the Webhooks page. If you are using the OnDemand
hosted JIRA, follow the instructions <a href="https://developer.atlassian.com/display/JIRADEV/JIRA+Webhooks+Overview#JIRAWebhooksOverview-WhereistheJIRAAdministrationUIforwebhooks?">
on the Atlassian wiki</a> for locating the Webhook UI.
</p>
<p>Give your new web hook a name, and for the URL provide the following:</p>
<p>
<code>{{ external_api_uri }}/v1/external/jira?api_key=abcdefgh&amp;stream=jira</code>
</p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Next, go back to Zulip and set up a stream called "jira," if it does not already exist.
(If you prefer your JIRA notifications to go to a stream other than "jira," then change the URL above to match it.)</p>
<p><b>Congratulations! You're done!</b><br />
Updates from JIRA will be sent to the Zulip stream you specified in the JIRA web-hook.
</p>
<img class="screenshot" src="/static/images/integrations/jira/001.png" />
</div>
<div id="jira-plugin" class="integration-instructions">
<p><em>If you are running JIRA version 5.2 or greater, or using the
hosted JIRA provided by Atlassian, we recommend using the <a
href="#jira">web-hook method</a> above instead. This plugin
supports older versions of JIRA.</em></p>
<p>First, create the stream you'd like to use for JIRA notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>jira</code>.</p>
<h5>Plugin mechanism</h5>
Next, download and install our <a href="/api">Python bindings and example scripts</a>.
<p><b>Plugin Installation</b></p>
The JIRA integration plugin requires two JIRA plugins. Please install
the following plugins using the Universal Plugin Manager in your JIRA
installation:
<ul>
<li><a href="https://marketplace.atlassian.com/plugins/com.onresolve.jira.groovy.groovyrunner">Script Runner Plugin</a></li>
<li><a href="https://marketplace.atlassian.com/plugins/com.atlassian.jira.plugin.jirasslplugin">SSL Plugin</a></li>
</ul>
<p><b>SSL Setup</b></p>
As Zulip is using a StartCOM SSL certificate that is not recognized by default in the Java installation shipped with JIRA,
you will need to tell JIRA about the certificate. Navigate to <code>Administration > System > Configure SSL</code> and in
the <code>Import SSL Certificates</code> field, enter <code>{{ external_api_uri }}</code>. After clicking <code>Save Certificates</code>,
follow the on-screen instructions and restart JIRA for it to recognize the proper certificates.
<p><b>Zulip Integration</b></p>
Copy the folder <code>integrations/jira/org/</code> (from the tarball you downloaded above) to your JIRA <code>classes</code> folder.
For self-contained JIRA installations, this will be <code>atlassian-jira/WEB-INF/classes/</code>, but this may be different in your deployment.
Edit the constants at the top of <code>org/zulip/jira/ZulipListener.groovy</code>
and fill them with the appropriate values:
<div class="codehilite"><pre><span class="n">String</span> <span class="n">zulipEmail</span> <span class="o">=</span> <span class="s2">"jira-notifications-bot@example.com"</span>
<span class="n">String</span> <span class="n">zulipAPIKey</span> <span class="o">=</span> <span class="s2">"0123456789abcdef0123456789abcdef"</span>
<span class="n">String</span> <span class="n">zulipStream</span> <span class="o">=</span> <span class="s2">"JIRA"</span>
<span class="n">String</span> <span class="n">issueBaseUrl</span> <span class="o">=</span> <span class="s2">"https://jira.COMPANY.com/browse/"</span>
</pre></div>
<p>In the Administrators page, navigate to <code>Plugins > Other > Script Listeners</code>. In the <code>Add Listener</code> section, click on
the <code>Custom Listener</code> option. Select the events you wish the Zulip integration to fire for, and the projects you wish Zulip to be notified for.
In the <code>Name of groovy class</code> field, enter <code>org.zulip.jira.ZulipListener</code>.
</p>
<p>Click <code>Add Listener</code>, and JIRA will now notify your Zulip of changes to your issues!</p>
<p><b>Congratulations! You're done!</b><br />
Updates from JIRA will be sent to the stream you've configured, as below.</p>
<img class="screenshot" src="/static/images/integrations/jira/001.png" />
</div>
<div id="mercurial" class="integration-instructions">
<p>Get Zulip notifications when you <code>hg push</code>!</p>
<p>First, create the stream you'd like to use for Mercurial notifications,
and subscribe all interested parties to this stream. We recommend the
name <code>commits</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create a Mercurial bot.</p>
<p>Then:</p>
<ol>
<li>
<p>Download and install our <a href="/api">Python bindings</a> on the
server where the master Mercurial repository lives.</p>
</li>
<li>
<p>Edit the <code>hg/.hgrc</code> configuration file for this master
Mercurial repository and add the following sections, using the
credentials for your Mercurial bot and setting the appropriate path to
the integration hook if it installs in a different location on this
system:</p>
<pre>[hooks]
changegroup = python:/usr/local/share/zulip/integrations/hg/zulip-changegroup.py:hook
[zulip]
email = "hg-bot@example.com"
api_key = "0123456789abcdefg"
stream = "commits"
{% if api_site_required %}site = {{ external_api_uri }}{% endif %}</pre>
</li>
</ol>
<p>That's all it takes for the basic setup! On the next <code>hg
push</code>, you'll get a Zulip update for the changeset.</p>
<h3>More configuration options</h3>
<p>The Mercurial integration also supports:</p>
<ul>
<li>linking to changelog and revision URLs for your repository's web
UI</li>
<li>branch whitelists and blacklists</li>
</ul>
<h4>Web repository links</h4>
<p>If you've set up your repository to
be <a href="http://mercurial.selenic.com/wiki/QuickStart#Network_support">browsable
via the web</a>, add a <code>web_url</code> configuration option to
the <code>zulip</code> section of your master <code>.hg/hgrc</code> to get
changelog and revision links in your Zulip notifications:</p>
<pre><font color="#B6B6B4">[zulip]
email = "hg-bot@example.com"
api_key = "0123456789abcdefg"
stream = "commits"</font>
web_url = "http://hg.example.com:8000/"
{% if api_site_required %}site = {{ external_api_uri }}{% endif %}</pre>
<h4>Branch whitelists and blacklists</h4>
<p>By default, this integration will send Zulip notifications for
changegroup events for all branches. If you'd prefer to only receive Zulip
notifications for specified branches, add a <code>branches</code>
configuration option to the <code>zulip</code> section of your
master <code>.hg/hgrc</code>, containing a comma-separated list of the
branches that should produce notifications:</p>
<pre><font color="#B6B6B4">[zulip]
email = "hg-bot@example.com"
api_key = "0123456789abcdefg"
stream = "commits"</font>
branches = "prod,master"</pre>
<p>You can also exclude branches that you don't want to cause
notifications. To do so, add an <code>ignore_branches</code> configuration
option to the <code>zulip</code> section of your
master <code>.hg/hgrc</code>, containing a comma-separated list of the
branches that should be ignored:</p>
<pre><font color="#B6B6B4">[zulip]
email = "hg-bot@example.com"
api_key = "0123456789abcdefg"
stream = "commits"</font>
ignore_branches = "noisy,even-more-noisy"</pre>
<p><b>Congratulations! You're done!</b><br /> When team members push new
changesets with <code>hg push</code>, you'll get a Zulip notification that
looks like this:</p>
<img class="screenshot" src="/static/images/integrations/hg/001.png" />
</div>
<div id="nagios" class="integration-instructions">
<p>First, create the stream you'd like to use for Nagios notifications,
and subscribe all interested parties to this stream. The integration will
use the default stream <code>nagios</code> if no stream is supplied in the
configuration; you still need to create the stream even if you are using
this default.</p>
<p>Next, download and install our <a href="/api">Python
bindings and example scripts</a> on your Nagios server.</p>
<p>Next, open <code>integrations/nagios/zuliprc.example</code>
in your favorite editor, and change the following lines to
specify the email address and API key for your Nagios bot,
saving it to <code>/etc/nagios3/zuliprc</code> on your Nagios
server:</p>
<div class="codehilite"><pre>[api]
email = NAGIOS_BOT_EMAIL_ADDRESS
key = NAGIOS_BOT_API_KEY
{% if api_site_required %}site = {{ external_api_uri }}{% endif %}</pre></div>
<p>Copy <code>integrations/nagios/zulip_nagios.cfg</code>
to <code>/etc/nagios3/conf.d</code> on your Nagios server.</p>
<p>Finally, add <code>zulip</code> to the <code>members</code>
list for one or more of the contact groups in the <code>CONTACT
GROUPS</code> section
of <code>/etc/nagios3/conf.d/contacts.cfg</code>, doing
something like:
</p>
<div class="codehilite"><pre>define contactgroup{
contactgroup_name admins
alias Nagios Administrators
members monitoring<span class="na">, zulip</span>
}
</pre></div>
Once you've done that, reload your Nagios configuration
using <code>/etc/init.d/nagios3 reload</code>.
<p><b>Congratulations! You're done!</b><br /> When your Nagios
system makes an alert, you'll see a message like the following,
to the stream <code>nagios</code> (to change this, edit the
arguments to <code>nagios-notify-zulip</code>
in <code>/etc/nagios3/conf.d/zulip_nagios.cfg</code>) with a
topic indicating the service with an issue:</p>
<img class="screenshot" src="/static/images/integrations/nagios/001.png" />
<p><b>Testing</b><br />If you
have <a href="http://nagios.sourceforge.net/docs/3_0/extcommands.html">external
commands enabled in Nagios</a>, you can generate a test notice
from your Nagios instance by visiting using the <code>Send
custom service notification</code> command in
the <code>Service Commands</code> section of any individual
service's page on your Nagios instance.</p>
<p><b>Troubleshooting</b><br />You can confirm whether you've
correctly configured Nagios to run the Zulip plugin by looking
for <code>SERVICE NOTIFICATION</code> lines mentioning zulip
in <code>/var/log/nagios3/nagios.log</code>. You can confirm
whether you've configured the Zulip plugin code correctly by
running <code>/usr/local/share/zulip/integrations/nagios/nagios-notify-zulip</code>
directly.</p>
</div>
<div id="newrelic" class="integration-instructions">
<p>New Relic can send messages to a Zulip stream for alerts and
deploys.</p>
<p>First, create the stream you'd like to use for New Relic
notifications, and subscribe all interested parties to this stream. We
recommend the name <code>newrelic</code>.</p>
<p>Next, in your New Relic Account Settings page, click
"Integrations", then "Alerting notifications". On the "Webhook"
tab, enter the following webhook URL:</p>
<p><code>{{ external_api_uri }}/v1/external/newrelic?api_key=abcdefgh&amp;stream=newrelic</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<img class="screenshot" src="/static/images/integrations/newrelic/001.png" />
<p><b>Congratulations! You're done!</b><br /> Your New Relic events will
appear in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/newrelic/002.png" />
</div>
<div id="pagerduty" class="integration-instructions">
<p>First, create the stream you'd like to use for Pagerduty notifications,
and subscribe all interested parties to this stream. We recommend the
stream name <code>pagerduty</code>. Keep in mind you still need to create
the stream first even if you are using this recommendation.</p>
<p>Next, in Pagerduty, select Services under Configuration on the top
of the page.</p>
<img class="screenshot" src="/static/images/integrations/pagerduty/001.png" />
<p>Now navigate to the service you want to integrate with Zulip. From
there, click "Add a webhook". Fill in the form like this:</p>
<ul>
<li><b>Name</b>: Zulip</li>
<li><b>Endpoint URL</b>: <code>{{ external_api_uri }}/v1/external/pagerduty?api_key=abcdefgh&amp;stream=pagerduty</code></li>
</ul>
<img class="screenshot" src="/static/images/integrations/pagerduty/002.png" />
</div>
<div id="perforce" class="integration-instructions">
<p>Zulip supports integration with Perforce as a
<a href="http://www.perforce.com/perforce/doc.current/manuals/p4sag/chapter.scripting.html">trigger</a>
that fires once a changelist is submitted and committed. To do this:</p>
<ol>
<li>Download and install our <a href="/api">Python bindings</a> on the
server that hosts your Perforce depot. The Perforce trigger will be
installed to a location like
<code>/usr/local/share/zulip/integrations/perforce</code></li>
<li>Open <code>integrations/perforce/zulip_perforce_config.py</code> in
your favorite editor and change the <code>ZULIP_USER</code> and
<code>ZULIP_API_KEY</code> variables at the top of the file to the
credentials for the bot you'd like to use for this integration.</li>
<li>Edit your
<a href="http://www.perforce.com/perforce/doc.current/manuals/p4sag/chapter.scripting.html#d0e14583">trigger table</a>
with <code>p4 triggers</code> and add an entry something like the
following:
<pre>notify_zulip change-commit //depot/... "python /usr/local/share/zulip/integrations/perforce/zulip_change-commit.py %change% %changeroot%"</pre>
</li>
<li>By default, this hook will send to streams of the form
<code>depot_subdirectory-commits</code>. So, a changelist that modifies
files in <code>//depot/foo/bar/baz</code> will result in a message to
stream <code>foo-commits</code>. Messages about changelists that modify
files in the depot root or files in multiple direct subdirectories of
the depot root will be sent to <code>depot-commits</code>. If you'd
prefer different behavior, such as all commits across your depot going
to one stream, change it now in <code>zulip_perforce_config.py</code>.
Make sure that everyone interested in getting these post-commit Zulips
is subscribed to the relevant streams!</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When you commit to your
Perforce depot the team can see updates in real time in
Zulip:</p>
<img class="screenshot" src="/static/images/integrations/perforce/001.png" />
</div>
<div id="phabricator" class="integration-instructions">
<p>Zulip supports integration with Phabricator and can notify you of the
latest items in your Phabricator feed.</p>
<p>You can follow the instructions at
<a href="https://github.com/zulip/phabricator-to-zulip">
https://github.com/zulip/phabricator-to-zulip
</a>
to get it set up.
</p>
</div>
<div id="pingdom" class="integration-instructions">
<p>Zulip supports integration with Pingdom and can notify you of
uptime status changes from your Pingdom dashboard.</p>
<p>First, create the stream you'd like to use for Pingdom notifications,
and subscribe all interested parties to this stream. We
recommend the name <code>pingdom</code>.</p>
<p><code>{{ external_api_uri }}/v1/external/pingdom?api_key=abcdefgh&amp;stream=pingdom</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Next, under following url: </p>
<p><code>https://my.pingdom.com/reports/integration/settings</code></p>
<p>create your integration by clicking on <code>Add Integration</code> button and filling form as following:</p>
<img class="screenshot" src="/static/images/integrations/pingdom/001.png" />
<p>Last, during creating or editing your check, scroll down to <code>Connect Integrations</code>
section and ensure your integration is checked</p>
<p><b>Congratulations! You're done!</b><br /> Example Zulip notification
looks like this:</p>
<img class="screenshot" src="/static/images/integrations/pingdom/002.png" />
</div>
<div id="pivotal" class="integration-instructions">
<p>Zulip supports integration with Pivotal Tracker and can notify you of changes
to the stories in your Pivotal Tracker project.</p>
<p>First, create the stream you'd like to use for Pivotal Tracker
notifications, and subscribe all interested parties to this stream. We
recommend the name <code>pivotal</code>.</p>
<p>Next, in the Settings page for your project, choose the Integrations
tab. Scroll down to the <code>Activity Web Hook</code> section, and enter
the following url:</p>
<p><code>{{ external_api_uri }}/v1/external/pivotal?api_key=abcdefgh&amp;stream=pivotal</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Choose version 5 of the API. Zulip supports both version 3 and version 5, but
version 5 contains more information that lets Zulip format more useful messages.</p>
<img class="screenshot" src="/static/images/integrations/pivotal/001.png" />
<p><b>Congratulations! You're done!</b><br /> When you make changes in Pivotal Tracker they will be reflected in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/pivotal/002.png" />
</div>
<div id="puppet" class="integration-instructions">
<p>Zulip supports Puppet integration and can notify you when Puppet runs fail (or when they happen at all).</p>
<p>You can follow the instructions at
<a href="https://forge.puppetlabs.com/mbarr/puppet_zulip">
https://forge.puppetlabs.com/mbarr/puppet_zulip
</a>
to get it set up.
</p>
<p><small>Thanks to Matt from Kensho for submitting this integration!</small></p>
</div>
<div id="redmine" class="integration-instructions">
<p>Get information on new or updated Redmine issues right in
Zulip with our Zulip Redmine plugin! Note: this setup must be
done by a Redmine Administrator.</p>
<p>First, create the stream you'd like to use for Redmine notifications,
and subscribe all interested parties to this stream. We recommend the
name <code>redmine</code>.</p>
<p>Then:</p>
<ol>
<li>
<p>Clone
the <a href="https://github.com/zulip/zulip-redmine-plugin">Zulip
Redmine plugin repository</a> by running:</p>
<pre>git clone https://github.com/zulip/zulip-redmine-plugin</pre>
</li>
<li>
<p>Follow
the <a href="http://www.redmine.org/projects/redmine/wiki/Plugins">Redmine
plugin installation guide</a> to install
the <code>zulip_redmine</code> plugin directory, which is a
subdirectory of the <code>zulip-redmine-plugin</code> repository
directory. In a nutshell, the steps are:</p>
<ol type="A">
<li>
<p>Copy the <code>zulip_redmine</code> directory to
the <code>plugins</code> directory of your Redmine
instance.</p></li>
<li>
<p>Update the Redmine database by running (for Rake 2.X, see the
guide for instructions for older versions):</p>
<pre>rake redmine:plugins:migrate RAILS_ENV=production</pre>
</li>
<li>
<p>Restart your Redmine instance.</p>
</li>
</ol>
<p>The Zulip plugin is now registered with Redmine!</p>
</li>
<li>
<p>On your <a href="/#settings" target="_blank">Zulip settings
page</a>, create a new Redmine bot.</p>
</li>
<li>
<p>To configure Zulip notification settings that apply to many
projects in one go, in Redmine click the "Administration" link in
the top left. Click the "Plugins" link on the Administration page,
and click the "Configure" link to the right of the Zulip plugin
description. In the "Projects" section, select all projects to which
you want these settings to apply.</p>
<p>To configure Zulip notifications for a particular Redmine project,
visit the project's Settings page.</p>
<p>
In either case, fill out the bot email address and API key, and the
Zulip stream that should receive notifications. Apply your changes.
</p>
</li>
<li>
<p>To test the plugin, create an issue or update an existing issue in
a Redmine project that has Zulip notifications configured (any
project, if you've configured global settings).</p>
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When you update issues in
Redmine, the team can see these updates in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/redmine/001.png" />
</div>
<div id="rss" class="integration-instructions">
<h4>RSS</h4>
<p>Get service alerts, news, and new blog posts right in Zulip with our
RSS integration!</p>
<p>First, create the stream you'd like to use for RSS notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>rss</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create an RSS bot.</p>
<p>Then, download and install our <a href="/api">Python bindings</a> on
the server where the RSS bot will live. The RSS integration will be
installed to a location
like <code>/usr/local/share/zulip/integrations/rss/rss-bot</code>.</p>
<p>Follow the instructions in the <code>rss-bot</code> script for
configuring the bot, adding your subscriptions, and setting up a cron job
to run the bot.</p>
<p><b>Congratulations! You're done!</b><br /> When new items appear in
your feeds, the team can see these updates in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/rss/001.png" />
</div>
<div id="semaphore" class="integration-instructions">
<h4>Semaphore</h4>
<p>See build and deploy statuses on Semaphore right in Zulip with the Zulip
Semaphore plugin!</p>
<p>First, create the stream you'd like to use for Semaphore notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>builds</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create a Semaphore bot.</p>
<p>Then, log into your account on <a href="http://semaphoreci.com">semaphoreci.com</a>, and:</p>
<ol>
<li>
<p>Visit the "Project Settings" page for the project for which you'd like to generate
Zulip notifications. Click the "Notifications" tab in the left sidebar,
click on "Webhooks" in the resulting menu, and then click on "+ Add Webhook".</p>
<img class="screenshot" src="/static/images/integrations/semaphore/001.png" />
</li>
<li>
<p> You should now see a form that looks like this: </p>
<p> <img class="screenshot" style="border:1px solid #000000" src="/static/images/integrations/semaphore/002.png" /> </p>
<p> Enter the following webhook URI, replacing the bot email address,
bot API key, and Zulip stream with the appropriate
information. <b>Note:</b> the <code>@</code>-sign in the bot e-mail
address must be escaped to <code>%40</code>:</p>
<p><code>{{ external_uri_scheme }}<font color="#00A26F">semaphore-bot%40example.com</font>:<font color="#00A26F">api_key</font>@{{ external_api_path }}/v1/external/semaphore?stream=<font color="#00A26F">builds</font></code></p>
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When you push to Semaphore, the
team can see these updates in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/semaphore/003.png" />
</div>
<div id="stash" class="integration-instructions">
<h4>Stash</h4>
<p>See what the team is committing to Stash right in Zulip with the Zulip
Stash plugin!</p>
<p>First, create the stream you'd like to use for Stash notifications, and
subscribe all interested parties to this stream. We recommend the
name <code>commits</code>.</p>
<p>Next, on your <a href="/#settings" target="_blank">Zulip settings
page</a>, create a Stash bot.</p>
<p>Then:</p>
<ol>
<li>
<p>Visit the Settings page for the Project that you'd like to generate
Zulip notifications. Click the "Hooks" option in the left sidebar, and
click "Add Hook" on the resulting page. Click the "Search for hook
plugins" link:</p>
<img class="screenshot" src="/static/images/integrations/stash/001.png" />
</li>
<li>
<p>On the search results page, look for and install the "Post-Receive
WebHook for Stash" plugin:</p>
<img class="screenshot" src="/static/images/integrations/stash/002.png" />
</li>
<li>
<p>Return to the Settings page for this Project and click the "Hooks"
option in the left sidebar. The newly-installed post-receive webhook
plugin is now listed in the "Post-receive" hooks section. Click the
edit icon next to the hook to configure it:</p>
<img class="screenshot" src="/static/images/integrations/stash/003.png" />
</li>
<li>
<p>Supply the following webhook URL, replacing the bot email address,
bot API key, and Zulip stream with the appropriate
information. <b>Note:</b> the <code>@</code>-sign in the bot e-mail
address must be escaped to <code>%40</code>:</p>
<p><code>{{ external_uri_scheme }}<font color="#00A26F">stash-bot%40example.com</font>:<font color="#00A26F">api_key</font>@{{ external_api_path }}/v1/external/stash?stream=<font color="#00A26F">commits</font></code></p>
<img class="screenshot" src="/static/images/integrations/stash/004.png" />
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When you push to Stash, the
team can see these updates in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/stash/005.png" />
</div>
<div id="subversion" class="integration-instructions">
<p>It is easy to send Zulips on SVN commits, by configuring a post-commit
hook. To do this:</p>
<p>First, create the stream you'd like to use for SVN commit
notifications, and subscribe all interested parties to this stream. The
integration will use the default stream <code>commits</code> if no stream
is supplied in the hook; you still need to create the stream even if you
are using this default.</p>
<p>Then:</p>
<ol>
<li>Download and install our <a href="/api">Python bindings</a> on the
server where the SVN repository lives.</li>
<li>Install <code>pysvn</code>. On Linux, you can install
the <code>python-svn</code> package. On other platforms, you can install
a binary or from source following
the <a href="http://pysvn.tigris.org/project_downloads.html">instructions
on the pysvn website</a>.</li>
<li>Copy <code>integrations/svn/zulip_svn_config.py</code>
and <code>integrations/svn/post-commit</code> from the API bindings
directory to the <code>hooks</code> subdirectory of your SVN
repository.</li>
<li><p>Next, open <code>integrations/git/zulip_svn_config.py</code>
in your favorite editor, and change the following lines to
configure your SVN integration:</p>
<div class="codehilite"><pre><span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"svn-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre></div>
</li>
<li>The default stream used by this post-commit hook
is <code>commits</code>; if you'd prefer a different stream, change it
now in <code>zulip_svn_config.py</code>. Make sure that everyone
interested in getting these post-commit Zulips is subscribed to that
stream!</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When you commit to this SVN
repository, the team can see these updates in real time in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/svn/001.png" />
</div>
<div id="taiga" class="integration-instructions">
<p>Go on your <a href="/#settings">Zulip settings page</a>, create a Taiga bot.
Please note the bot name and API key.</p>
<p>Since Taiga allows you to integrate services on a per
project basis, you have to perform the following steps
for <b>every project</b> that you want to send
notifications to Zulip.</p>
<ol>
<li>
<p>Go to Admin <b>></b> Integration <b>></b> Webhooks menu.</p>
</li>
<li>
<p>Click <b>Add a new webhook</b>.</p>
</li>
<li>
<p>Fill out the form by following the instructions:
<ul>
<li>
<b>Name</b> - to recognize this service, preferably <code>Zulip</code>
</li>
<li>
<b>URL</b> -
<pre>
{{ external_api_uri }}/v1/external/taiga?stream=STREAM_NAME&amp;topic=TOPIC_NAME&amp;api_key=BOT_API_KEY</pre>
<ul>
<li><code>STREAM_NAME</code> - The url-encoded name of
stream which you want to receive notifications.
You can use an existing Zulip stream or create a
new one for this.
</li>
<li><code>TOPIC_NAME</code> - The url-encoded
topic where your Taiga notifications will be
posted. (Read the notes below.)</li>
<li><code>BOT_API_KEY</code> - API key created in Zulip.</li>
</ul>
<p>Remember to url-encode the stream and topic
names. E.g. spaces need to be replaced
with <code>%20</code> (e.g. so if you want your stream
to be called "My awesome project", STREAM_NAME
should be <code>My%20awesome%20project</code>).</p>
</li>
<li>
<b>Secret key</b> - once again the API key created in Zulip.
</li>
</ul>
</p>
</li>
<li>
<p>Click <b>Save</b> once you've finished filling out the form.</p>
</li>
</ol>
<p>That's it! Your actions on Taiga should now cause
notifications on the Zulip stream you specified above.
<img class="screenshot"
src="/static/images/integrations/taiga/001.png" /> <hr />
There are <b>two different ways</b> you may want to consider
when organizing your Taiga - Zulip integration:</p>
<ul>
<li>
Use special Zulip stream for Taiga messages - name
it <code>Taiga</code>. (Make sure to create this stream
first!) For every integrated project, provide a new topic.
<pre>
STREAM_NAME = Taiga
TOPIC = Project</pre>
</li>
<li>
If you already have a Zulip stream for managing a project,
you can also use this existing stream and add Taiga
notifications using special topic.(Remember about
substituting spaces with <code>%20</code>).<pre>
STREAM_NAME = My%20existing%20Zulip%20stream
TOPIC = Taiga</pre>
</li>
</ul>
</div>
<div id="teamcity" class="integration-instructions">
<p>See your Teamcity build status in Zulip!</p>
<p>First, create the stream you'd like to use for Teamcity
notifications, and subscribe all interested parties to this stream. We
recommend the name <code>teamcity</code>.</p>
<p>Next, set up a bot for the integration. You'll need the bot's API key
to construct a URL for Teamcity.</p>
<p>Next, install the <a href="https://github.com/tcplugins/tcWebHooks/releases">tcWebHooks plugin</a>
onto your Teamcity server. Follow the plugin instructions in your
Teamcity documentation, or refer to
<a href="https://confluence.jetbrains.com/display/TCD9/Installing+Additional+Plugins">the online Teamcity documentation</a>.</p>
<p>Next, in your Teamcity project overview page,
click the "Webhooks" tab, and add a new project webhook.
Enter the following URL:</p>
<p><code>{{ external_api_uri }}/v1/external/teamcity?api_key=abcdefgh&amp;stream=teamcity</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Uncheck all "Trigger on Events" options, and check
"Trigger when build is Successful" and "Trigger when build Fails".
Optionally, check "Only trigger when build changes from Failure to Success"
and "Only trigger when build changes from Success to Failure".</p>
<p>Set the Payload Format to "JSON" and save your webhook.</p>
<img class="screenshot" src="/static/images/integrations/teamcity/001.png" />
<p><b>Congratulations! You're done!</b><br /> Your Teamcity build
notifications will appear in Zulip:</p>
<img class="screenshot" src="/static/images/integrations/teamcity/002.png" />
<p><b>Personal Builds</b><br /> When a user runs a personal build, if Zulip can
map their Teamcity username to a Zulip user, that Zulip user will receive a
private message with the result of their personal build.</p>
<img class="screenshot" src="/static/images/integrations/teamcity/003.png" />
</div>
<div id="trac" class="integration-instructions">
<p>First, create the stream you'd like to use for Trac notifications, and
subscribe all interested parties to this stream. The integration will use
the default stream <code>trac</code> if no stream is supplied in the
hook; you still need to create the stream even if you are using this
default.</p>
<p>Next, download and install our <a href="/api">Python
bindings and example scripts</a> on your Trac server.</p>
<p>Next, open <code>integrations/trac/zulip_trac_config.py</code> in
your favorite editor, and change the following lines to specify
your bot's email address, API key, and where you'd like your
notification messages to go (by default,
stream <code>trac</code>):</p>
<div class="codehilite"><pre><span class="n">ZULIP_USER</span> <span class="o">=</span> <span class="s">"trac-notifications-bot@example.com"</span>
<span class="n">ZULIP_API_KEY</span> <span class="o">=</span> <span class="s">"0123456789abcdef0123456789abcdef"</span>
<span class="n">STREAM_FOR_NOTIFICATIONS</span> <span class="o">=</span> <span class="s">"trac"</span>
<span class="n">TRAC_BASE_TICKET_URL</span> <span class="o">=</span> <span class="s">"https://trac.example.com/ticket"</span>
{% if api_site_required %}<span class="n">ZULIP_SITE</span> <span class="o">=</span> <span class="s">"{{ external_api_uri }}"</span>{% endif %}</pre></div>
<p>Copy <code>integrations/trac/zulip_trac.py</code>
and <code>integrations/trac/zulip_trac_config.py</code> into
your Trac installation's <code>plugins/</code>
subdirectory. Once you've done that, edit your Trac
installation's <code>conf/trac.ini</code> to
add <code>zulip_trac</code> to the <code>[components]</code>
section, as follows:</p>
<div class="codehilite"><pre><span class="k">[components]</span>
<span class="na">zulip_trac</span> <span class="o">=</span> <span class="s">enabled</span></pre></div>
<p>You may then need to restart Trac (or Apache) so that Trac will load our plugin.</p>
<p><b>Congratulations! You're done!</b><br /> When people open
new tickets (or edit existing tickets), you'll see a message
like the following, to the stream <code>trac</code> (or whatever
you configured above) with a topic that matches the ticket
name:</p>
<img class="screenshot" src="/static/images/integrations/trac/001.png" />
<p><b>Additional trac configuration</b><br /> After using the plugin
for a while, you may want to customize which changes to tickets
result in a Zulip notification using
the <code>TRAC_NOTIFY_FIELDS</code> setting
in <code>zulip_trac_config.py</code>.</p>
</div>
<div id="transifex" class="integration-instructions">
<p>First, create the stream you'd like to use for Transifex
notifications, and subscribe all interested parties to this stream. We
recommend the name <code>transifex</code>.</p>
<p>Next, set up a bot for the integration. You'll need the bot's API key
to construct a URL for Transifex.</p>
<p><code>{{ external_api_uri }}/v1/external/transifex?api_key=abcdefgh&amp;stream=transifex</code></p>
<p>where <code>api_key</code> is the API key of your Zulip bot,
and <code>stream</code> is the stream name you want the
notifications sent to.</p>
<p>Next, in Transifex, go to your project settings page:
Project Details → Manage → Edit Project and scroll down to
WEB HOOK URL. Paste the URL you constructed into the box and
save your changes.</p>
<p><b>Congratulations! You're done!</b><br />
Example message:
</p>
<img class="screenshot" src="/static/images/integrations/transifex/001.png" />
</div>
<div id="travis" class="integration-instructions">
<p>See your Travis CI build notifications in Zulip!</p>
<p>First, create the stream you'd like to use for notifications, and subscribe
all interested parties to this stream. We recommend the name <code>travis</code>.</p>
<p>Next, set up a bot for the integration. You'll need the bot's API key
to construct a URL for Travis CI.</p>
<p>Finally, set up a webhook in your <code>.travis.yml</code> file:</p>
<pre>
notifications:
webhooks:
- https://zulip.example.com/api/v1/external/travis?stream=travis&amp;topic=build-status&amp;api_key=abcdefgh
</pre>
<p><b>Congratulations! You're done!</b><br /> When a code build occurs,
you're receive a notification on the specified stream and topic.</p>
<img class="screenshot" src="/static/images/integrations/travis/001.png" />
</div>
<div id="trello" class="integration-instructions">
<p>First, create the stream you'd like to use for Trello notifications,
and subscribe all interested parties to this stream. We recommend the
name <code>trello</code>.</p>
<p>Next, download a copy
of <a href="https://github.com/zulip/trello-to-zulip">trello-to-zulip</a>
and follow the instructions in <code>README.md</code>. When you
make changes in Trello, they will be reflected in Zulip:
</p>
<img class="screenshot" src="/static/images/integrations/trello/001.png" />
<p><small>Thanks to Nathan from FoundationDB for <a href="https://github.com/nathanlws/trello-to-zulip">submitting this integration</a>!</small></p>
</div>
<div id="twitter" class="integration-instructions">
<p>See Twitter search results in Zulip! This is great for seeing and
discussing who is talking about you, friends, competitors, or important
topics in real time.</p>
<p>First, create the stream you'd like to use for tweets, and subscribe
all interested parties to this stream. We recommend the
name <code>twitter</code>.</p>
<p>Next, download and install our <a href="/api">Python bindings and
example scripts</a>. This 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.</p>
<p>Next, install <b>version 1.0 or later</b> of
the <code>twitter-python</code> library. If your operating system
distribution doesn't package a new enough version, you can install the
library from source
from <a href="https://github.com/bear/python-twitter">the GitHub
repository</a>.</p>
<p>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:</p>
<ol>
<li>
Log in to <a href="http://dev.twitter.com">http://dev.twitter.com</a>.
</li>
<li>
In the menu under your username,
click <a href="https://dev.twitter.com/apps">My Applications</a>. From
this page, create a new application.
</li>
<li>
Click on the application you created and click "create my access
token". Fill in the requested values.
</li>
</ol>
<p>To configure and deploy this bot:</p>
<ol>
<li>
Create a <code>~/.zulip_twitterrc</code> with the following
contents:
<pre>[twitter]
consumer_key =
consumer_secret =
access_token_key =
access_token_secret =</pre>
</li>
<li>
Test the script by running it manually:
<pre>/usr/local/share/zulip/integrations/twitter/twitter-search-bot --search="@nprnews,quantum physics"</pre>
Note: <code>twitter-search-bot</code> may install to a different
location on your operating system distribution.
</li>
<li>
Configure a crontab entry for this script. A sample crontab entry that
will process tweets every minute is:
<pre>* * * * * /usr/local/share/zulip/integrations/twitter/twitter-search-bot --search="@nprnews,quantum physics"</pre>
</li>
</ol>
<p><b>Congratulations! You're done!</b><br /> When someone tweets a
message containing one of your search terms, you'll get a Zulip on your
specified stream, with the search term as the topic.</p>
<img class="screenshot" src="/static/images/integrations/twitter/001.png" />
<p>Note that the twitter search bot integration <b>just sends
links to tweets</b>; the pretty inline previews of tweets are
generated by the Twitter card rendering integration configured
in <code>/etc/zulip/settings.py</code> on the Zulip server.</p>
</div>
<div id="updown" class="integration-instructions">
<p>See Updown reports in Zulip! This is great to be up to date with
downtime in the services you monitor with Updown!
</p>
<p>First, create the stream you'd like to use for updown
notifications, and subscribe all interested parties to this
stream. We recommend the name <code>updown</code>.</p>
<p>Go to <a href="https://updown.io/settings/edit">your Updown
settings page</a> and in <code>WEBHOOKS</code> section, enter
the following as the URL:</p>
<p><code>{{ external_api_uri }}/v1/external/updown?api_key=abcdefgh&amp;stream=updown</code></p>
<p><b>Congratulations! You're done!</b><br />
Now you'll receive Updown notifications for your service in Zulip.
</p>
<img class="screenshot" src="/static/images/integrations/updown/001.png" />
</div>
<div id="yo-app" class="integration-instructions">
<p>See your Yo App notifications in Zulip!</p>
<p><a href="/api/#api_keys">Go to your Zulip settings and set up a Zulip bot for the
integration.</a> You'll need the bot's API key to construct a URL for
<a href="http://docs.justyo.co/docs/receiving-a-yo-with-the-api">Yo App Callback</a>.</p>
<p>You will receive your notifications as a private message between you and the bot.</p>
<p>Create a URL using your bot's API key and the email address associated with your Zulip account:</p>
<p><pre><code>
https://zulip.example.com/api/v1/external/yo?email=awesome@zulip.example.com&amp;api_key=abcdefgh
</code></pre></p>
<p>Copy the URL created and go to <a href="https://yoapi.justyo.co">yoapi.justyo.co</a>.</p>
<p>Sign in using your username and password and go to <b>Edit Profile</b>.</p>
<img class="screenshot" src="/static/images/integrations/yo-app/001.png" />
<p>Paste the URL in the <b>Callback</b> field and click on <b>Update</b>.</p>
<p><b>Congratulations! You're done!</b><br />When someone sends your username a Yo,
you'll receive a notification as a private message from the bot
like this:</p>
<img class="screenshot" src="/static/images/integrations/yo-app/002.png" />
<p>Multiple users can use the same Yo bot; each user should use
their own Zulip account email in the webhook URL.</p>
</div>
<div id="zendesk" class="integration-instructions">
<p>First, create the stream you'd like to use for Zendesk notifications,
and subscribe all interested parties to this stream. We recommend the
stream name <code>zendesk</code>. Keep in mind you still need to create
the stream first even if you are using this recommendation.</p>
<p>Next, in Zendesk, open your Admin view via gear in the bottom-left
corner. In the Admin view, click on Extensions, then click "add
target".</p>
<img class="screenshot" src="/static/images/integrations/zendesk/001.png" />
<img class="screenshot" src="/static/images/integrations/zendesk/002.png" />
<p>From there, click "URL target". Fill in the form like this:</p>
<ul>
<li><b>Title</b>: Zulip</li>
<li><b>URL</b>: <code>{{ external_api_uri }}{% raw %}/v1/external/zendesk?ticket_title={{ticket.title}}&amp;ticket_id={{ticket.id}}&amp;stream=zendesk{% endraw %}</code></li>
<li><b>Method</b>: POST</li>
<li><b>Attribute Name</b>: message</li>
<li><b>Username</b>: <em>your bot's user name, e.g.</em> <code>zendesk-bot@yourdomain.com</code></li>
<li><b>Password</b>: <em>your bot's API key</em></li>
</ul>
<img class="screenshot" src="/static/images/integrations/zendesk/003.png" />
<p>Now select "Test Target" and click Submit. A test message should
appear in the zendesk stream. If the message was received, save the
target by selecting "Create target" and clicking Submit.</p>
<p>From here, add a new trigger. You'll do this for every action you want
to create a Zulip notification. Triggers are added by selecting Triggers
in the left menu and then clicking "add trigger" in the top right.</p>
<img class="screenshot" src="/static/images/integrations/zendesk/004.png" />
<img class="screenshot" src="/static/images/integrations/zendesk/005.png" />
<p>Let's say you want a notification each time a ticket is updated. Put
in a descriptive title like "Announce ticket update". Under "Meet all of
the folllowing conditions" select "Ticket: is..." and then select
Updated. In the "Perform these actions" section select "Notification:
Notify target" then select Zulip.</p>
<p>Next we need need to enter the message body into Message. You can use
Zulip markdown and the Zendesk placeholders when creating your message.
You can copy this example template:</p>
{% raw %}
<pre><code>Ticket [#{{ticket.id}}: {{ticket.title}}]({{ticket.link}}), was updated by {{current_user.name}}
* Status: {{ticket.status}}
* Priority: {{ticket.priority}}
* Type: {{ticket.ticket_type}}
* Assignee: {{ticket.assignee.name}}
* Tags: {{ticket.tags}}
* Description:
``` quote
{{ticket.description}}
``` </code></pre>
{% endraw %}
<img src="/static/images/integrations/zendesk/006.png" />
<p>Finally, click Submit.</p>
<p><b>Congratulations! You're Done!</b><br /> When a ticket is updated
you will see a notification like the following, to the stream
<code>zendesk</code>, with a topic that matches the ticket's subject
name:</p>
<img class="screenshot" src="/static/images/integrations/zendesk/007.png" />
</div>
</div>
{% endblock %}
{% block customhead %}
{{ super() }}
<script type="text/javascript">
$(function() {
$("a.title").addClass("show-integral");
$("a.title").prepend($("<span class='integral'>∫</span>"));
$("a.title").hover(function (e) {
$(".integral").css("display", "inline");
var width = $(".integral").width();
$("a.title").css("left", -1 * width);
},
function (e) {
$(".integral").css("display", "none");
$("a.title").css("left", 0);
});
var newlozenge,
currentblock,
currentlink,
currentlozenge,
instructionbox = $("#integration-instruction-block"),
hashes = $('.integration-instructions').map(function() {
return this.id || null;
}).get();
function switchToIntegration(integrationHash) {
var cleanHash = integrationHash.substr(1);
if (hashes.indexOf(cleanHash) > -1) {
currentblock = $(integrationHash);
currentlozenge = $(".integration-lozenge.integration-" + cleanHash);
$(".integration-lozenges, .portico-page-header.extra, .portico-large-text.extra").hide();
newlozenge = currentlozenge.clone();
newlozenge.find(".integration-logo").unwrap();
newlozenge.addClass("integration-lozenge-static");
instructionbox.hide();
instructionbox.children(".integration-lozenge").remove();
instructionbox.children(".integration-instructions").appendTo("#integration-instructions-group");
instructionbox.append(newlozenge);
instructionbox.append(currentblock);
instructionbox.show();
$("#integration-list-link").css("display", "block");
window.scrollTo(0,0);
}
}
function updateHash () {
var hash = document.location.hash;
if (hash && hash != '#hubot-integrations') {
switchToIntegration(document.location.hash);
}
else if (currentblock && newlozenge) {
$("#integration-list-link").css("display", "none");
$(".integration-lozenges, .portico-page-header.extra, .portico-large-text.extra").show();
instructionbox.hide();
newlozenge.remove();
currentblock.appendTo("#integration-instructions-group");
$('html, body').animate({scrollTop: $(hash).offset().top}, 'slow');
}
}
window.onhashchange = updateHash;
updateHash();
});
</script>
{% endblock %}