Contribute to Open Source. Search issue labels to find the right project for you!

Add a reply button to the compose box.


When the compose box is closed, and when there is a selected message (i.e. most of the time), we should have a “Reply” button to the right of “New topic” and “New private message.” We should style it somewhat more prominently then the other buttons, which perhaps a blue border or something. It should have the same semantics as hitting “r” or “enter” to reply.

Updated 26/06/2017 23:32 2 Comments

Quote/code block autocomplete should surround paste code


(Using bbb for backticks below. )

Often, users will paste in some code/text, and then afterwards, want to surround it with code/quote blocks. So the situation looks like this: bbbquo <- I hit enter, here thing to be quoted, which I pasted in

  • Current behavior: always autocomplete 2 newlines and ending backticks after the bbbquo. So ``` bbbquote

bbb thing to be quoted ```

But it would probably be more useful to have this happen: bbbquote thing to be quoted bbb

I think what we want to do is check if there is more text below the opening bbb, and if there is, autocomplete should add the ending bbb at the bottom of the message, so the pasted material is enclosed.

Updated 26/06/2017 21:18 4 Comments

Document the ability for admins to delete messages


We probably want to document the feature and also link to it from the “” guide, maybe at the start of the “Invite users” section, since it’s a common request from admins who sent a bunch of stupid-looking test messages and now want the history to look more professional when they add new users.

Updated 26/06/2017 21:04 2 Comments

Stream links in email bodies are relative


I got a private message while I was away, which triggered an email to me with the message. The message contained a link to a stream (e.g. #frontend). I tried to click the stream link, but got confused when it just loaded my gmail inbox.

It looks like the link is relative: html <a class="stream" data-stream-id="6" href="/#narrow/stream/frontend">#frontend</a>

Is there a place in the code that does some processing on the message body before sending an email? The domain could be inserted into all relative links like this before sending the email.

Updated 13/06/2017 04:00 9 Comments

Mention the visibility differences of private and public streams on stream creation


Right now we only mention the stream accessibility differences (Anyone can join / People must be invited ) between private and public streams while stream creation.

screenshot from 2017-06-09 07 27 18

We should expand this section to include * Stream visibility (Are the private streams visible to other users (not the content)) * Who can add users to the streams

Updated 09/06/2017 19:44 4 Comments

Make vagrant proxy setup show warnings if necessary


If the user specified the HTTP_PROXY and HTTPS_PROXY variables in ~/.zulip-vagrant-config but didnt’t install vagrant-proxyconf plugin a warning should be shown when vagrant up is run by the user. I missed doing vagrant-proxyconf install in my new laptop and spend some time debugging the error (It’s kind of funny that I wrote this feature myself :smile: and still messed up the installation).

This would be a good issue for new contributors. The file that you would be changing for accomplishing this task would be mostly To know more about the proxy setup process see

Updated 08/06/2017 10:07 3 Comments

Improve abstractions for writing tests using the Zulip API


We now use **api_auth in 142 places in the codebase, and it’s kinda ugly. We should think about replacing the **api_auth mechanism we use for things like self.client_patch with something more like self.api_patch(user_profile, "/users/me/subscriptions") , where we aren’t specifying how to do auth in every single test.

We should get a few thoughts on the specific interface before changing this.

Updated 08/06/2017 05:16 4 Comments

Make the UI for setting a bot as an incoming webhook bot more fancy/self-explanatory


As part of #5082, we added a basic dropdown menu for making it possible to set a bot as an incoming webhook, with limited permissions to only send messages.

I think it’s probably worth doing a pass at making that look really nice, keeping in mind that we’ll eventually have at least 4 choices: * Incoming webook * Outgoing webhook (with sub-options for format) * Generic bot * Embedded bot (with sub-options for which one)

Updated 07/06/2017 04:26 1 Comments

Link to instructions for setting up Travis CI for your account more prominently


Currently, we document the fact you can sign up your personal Zulip for for travis CI in the Git Guide, but people who know Git rarely go through that giant document.

We should probably add some link to this at the end of the developer environment setup documentation (and maybe also tools/setup-git-repo, which is in the same section).

Updated 06/06/2017 20:46 1 Comments

Expand and reorganize "Using Travis" section from docs/


The new docs/ is a mix of developer docs and user docs, for users of Travis-for-Zulip.

It’d probably be worth concentrating the user docs together so that people can read them without going through the developer docs. E.g., the “sign up your personal repo” bit, and maybe a section like “Reading Travis CI output” that discusses the setup/run structure and the hiding of output.

From @gnprice’s

Updated 06/06/2017 20:30 1 Comments

Hamburger menu on landing page gets "selected" when used, on Android Firefox


When browsing the landing home page in mobile Firefox, on Android, trying to use the hamburger menu can result in it confusingly being “selected” as if it’s text. See screenshot: <img height=640px src=“”>

I can’t seem to reproduce this in the mobile browsers I have handy: Chrome or Safari on iOS.

(Thanks @drakedevel for the report and screenshot!)

Updated 15/06/2017 10:09 1 Comments

Settings menu breaks when not enough vertical space available.



  1. Open a dev server tab.
  2. Shrink this tab vertically.
  3. Go to the settings menu, which should look like this: image

  4. Toggle the Settings | Organization bar.

  5. Watch the layout break: image

In specific, the Settings | Organization bar has been split. This is probably due to the newly appeared scroll bar. This scroll bar has not been present before.

Updated 15/06/2017 10:09 4 Comments

provision: Avoid spending ~1s on ` compilemessages` in no-op provisions


Since we rarely change the translations files these are generated from, this is basically a waste of time almost always.

We can efficiently and robustly address this by just doing the equivalent of: cat static/locale/*/LC_MESSAGES/*.po zerver/management/commands/ | sha1sum > var/last_compilemessages_hash and seeing if the result has changed since the last time.

This is extracted from #1461.

Updated 10/06/2017 21:25 2 Comments

provision: Avoid spending 2s installing node/npm when the current version is already there


In a no-op provision, scripts/lib/install-node takes 2 seconds, even though we essentially never change our pinned node version. We should be able to wrap that script with a quicker version check that checks a hash for the combination of: * node --version * npm --version (Note: This is slow but can be fixed the same way we did for node by not using nvm in the wrapper and just hardcoding the path) * scripts/lib/install-node, scripts/setup/node-wrapper, scripts/setup/npm-wrapper

and if it hasn’t changed, exit quickly.

We probably want this optimization to work in production as well, so it makes sense to tweak (or wrap) scripts/lib/install-node to handle this correctly, rather than just patching provision.

The npm part we should make sure interacts with #4880 properly; we may be able to just skip the npm work here and just do it on yarn.

This is extracted from #1461.

Updated 06/06/2017 10:09 3 Comments

Add setting to prevent unintentional "(no topic)" message by requiring topics


We should add an organization setting to prevent users from sending without a topic.

Original report below.

I unintentionally ended up with “(no topic)” message whilst chatting in a meeting topic. :/

Ideally this is avoided, possibly with a ‘require topic’ setting per stream.

Updated 02/06/2017 04:09 9 Comments

Add limited ordered list support to our markdown


Markdown has this cool ordered list feature where you can do this: 1. first item 1. second 1. third

And it’ll auto-renumber them for you to ½/3.

We can’t use existing markdown ordered lists implementations, because they will also turn a solo 2. into a 1., which really sucks if you’re splitting a list across multiple messages. But I think we could do something where if you do several of the same number, it does turn it into an ordered list, counting from that number. is a helpful resource for anyone interested in working on this.

Updated 01/06/2017 21:06 1 Comments

realm_filters: Difference in rendering between markdown and bugdown.


There is a difference in rendering of realm filters between bugdown and markdown: anim A realm filter should match only after a start of a line, whitespace or opening delimiters.(See comment in bugdown/ prepare_realm_patter()). Seems like markdown is not configured to respect those rules. To more clearly understand the issue try rendering pr#123, markdown will linkify it but bugdown will not(bugdown’s behavior is correct).

Updated 18/06/2017 21:03 4 Comments

Confluence Integration


It would be useful to have an integration with Confluence such that a Zulip message would be created each time a page in the Confluence Wiki is created / edited / deleted. This would make it obvious when documentation activity is occurring.

I tried to add the integrations label to this issue per the instructions on the integrations page but it appears you can only label issues if you are a contributor. If someone else could add the label, that would be great!

Updated 13/06/2017 13:36 3 Comments

Improve visual design of html emails.


Our current email templates are quite old, and look dated. It would be great to restyle them to look more modern and to fit the Zulip brand (underwater sea theme).

For this issue, don’t worry too much about the text; that can be improved independently.

All of our email templates are in templates/zerver/emails, and all our html email templates end in .html.

Updated 08/06/2017 18:09 5 Comments

Add setting(s) to control to what extent message deletion is allowed in an organization


Now that #135 is completed, we should add options to control to what extent deletion is allowed. I can imagine supporting at least these uses cases: * Not allowed at all (for organizations that want a strong audit history) * Allowed only for organization administrators (the current behavior) * Allowed only for organization administrators and deleting messages you sent yourself.

I think we can probably do this cleanly as just 2 bool settings: * Allow users to delete messages that they sent * Organization administrators can delete messages they can see

While we’re working on this, we should also probably edit the text of the modal for message deletion to make clear the risks involved with deleting messages.

Once this is done, we should make sure the options are documented clearly.

Updated 05/06/2017 20:18 2 Comments

Document log2zulip integration


We have this cool script for forwarding errors from tailing a given set of log files into Zulip, log2zulip, that just got moved to api/integrations/log2zulip (and thus now is distributed as part of our pip package). It’d be awesome to document it as one of our official integrations in /integrations, since it’s actually pretty useful.

There’s a sample simple configuration file here: $ cat puppet/zulip_ops/files/log2zulip.conf ["/var/log/nginx/error.log"]

Updated 26/05/2017 22:19 1 Comments

onboarding: Improve messaging from our password strength checker.


We use for password strength checking. If someone’s password is too weak, we just say “password is too weak” without telling them what rules we are using to determine their password strength.

zxcvbn already provides more detailed messages for passwords that are too weak, like this is a top-10 common password (see on, which we should expose to the user.

Marking this as a bug, since it frustrated multiple people trying to register for at the pycon sprints.

Updated 26/06/2017 21:19 4 Comments

markdown: @-mentions rendering glitch


When @-mentioning someone on a new line, the rendering glitches for a split second.

Some visuals below: - <text> <link> <newline> @-mention triple @-mention - <text> <newline> @-mention image - @-mention <newline> @-mention image

After getting a response back from the server, the message rerenders properly.

It’s due to an issue with frontend markdown rendering, check the documentation to get started on this issue.

Updated 15/06/2017 10:10

Focus issues on login and registration pages


When using the “tab” key to navigate the login and registration pages, there are some confusing quirks in the change of focus:

  • The “Sign in” and “Sign up” buttons have no visual indication that they have received focus (which can make a user utilizing keyboard navigation uncertain that they are about to trigger the correct action).
  • There are invisible elements after the “Sign in with Google” and “Sign in with GitHub” buttons which interrupt the tab sequence; perhaps these are the “button” elements within those links? Either the link or the button should receive focus, but not both.
Updated 27/05/2017 17:53 6 Comments

Misuse of aria-required attribute on login and registration forms


The login form contains four elements which use the “aria-required” attribute, two of which are divs which are not valid elements for it to be used on. (The usage on the input elements is completely appropriate.) Similarly, the email input on the registration form is followed by an empty div using an inappropriate “aria-required” attribute.

I’m not sure yet what these empty divs are used for (dynamic insertion of error messages, perhaps?), but they should not have that attribute.

Updated 24/05/2017 01:25 3 Comments

Text on login and registration screens should have better contrast


Much of the text on the login and registration screens doesn’t satisfy the W3C WCAG Level AA guidelines for sufficient contrast from the background.

You can identify which text has this issue via the Web Developer or Accessibility Developer Tools browser extensions or by entering the page URL at As of the time of writing this, the elements at the following CSS selectors are flagged as having insufficient contrast:

  • .split-view .info-box .organization-path
  • .split-view .left-side .description a (2 links)
  • .portico-page .or
  • .login-google button
  • .login-github button
  • .register-google button
  • .login-page-container .right-side .actions (2 links)
  • .footer .footer-navigation a (7 links)
  • .footer .footer-navigation span (6 separator bullets)

The browser extensions and online accessibility audit tool mentioned above can all help pick color pairs with more suitable contrast ratios.

Updated 05/06/2017 15:11 2 Comments

Add documentation for init.d starting nginx.


Write developer documentation for in developer docs for init.d and Linux in

The main purpose of this is just to make clean that Zulip uses the system nginx, not something run via supervisord, so when one changes a certificate, one needs to restart the system nginx.

For reference: Zulip chat

Updated 30/05/2017 05:16 1 Comments

Make Zulip give a better error for Google Compute Platform weird boto configuration


GCE has an /etc/boto.cfg, which GCP prepopulates in its image to include: [Plugin] plugin_directory = /usr/lib/python3/dist-packages/google_compute_engine/boto

The boto library reads this, an ends up being totally broken on import with Python 2. We should at least add code in our production installer to detect this situation and tell the user to fix it.

@jmandel FYI; did you end up opening an issue with Google about this?

Updated 09/06/2017 17:22 9 Comments

settings: change email popup when ESC is pressed leaves gray overlay

  1. Go to your-account settings.
  2. Go to where your email is and click [Change].
  3. When the change email popup comes up, press Esc.
  4. This should leave a gray overlay on your home screen.
  5. Click the screen to get rid of the gray overlay.

We can either have Esc go back to your-account settings or have it go back to the home screen. I think it makes sense to go back to the settings modal. Any thoughts?

Updated 17/05/2017 03:27 3 Comments

Test query counts for more stream-create scenarios.


If you create a public stream in a realm with a notifications stream, then we have tests like test_multi_user_subscription that check the query counts to make sure they’re not too expensive.

We should have similar tests for when…

  • there is no notifications stream (this is important, because we used to send PMs instead, which was super expensive)
  • the stream is private
  • the user passed in announce=False
Updated 16/05/2017 17:48 1 Comments

Improve default streams


Our default streams for new realms are these. We may want to improve the descriptions, and we possibly want to consider new starting streams. This is a good thing to figure out on chat.

            "social": {"description": "For socializing", "invite_only": False},
            "general": {"description": "For general stuff", "invite_only": False},
            "zulip": {"description": "For zulip stuff", "invite_only": False}
Updated 16/05/2017 23:47 2 Comments

i18n: Add translation packages to stats page.


The stats page isn’t a part of the regular webapp, and our current build process for the page doesn’t include the packages that are needed to add translation tags.

To work on this issue, I’d start by grepping for 18 and stats.js in zproject/ to see how we add translation to the regular webapp, and what’s different about our build process for the stats page. may also be useful reading.

It would also be great to add translation tags as needed to stats.html and stats.js as a part of resolving this issue (they are fairly small files). is helpful reading for how to test the stats page in development.

Updated 13/05/2017 17:53

Exception in popovers.actions_menu_handle_keyboard


I got the below exception from logs, so I don’t know what causes it exactly, but the top of the traceback is in get_action_menu_menu_items, which is a 1-line function, and the code path to there is pretty clear. I’m not entirely sure what the code in question is supposed to do, so I suspect with some spelunking, this won’t be hard to fix.

TypeError: Cannot read property '$tip' of undefined
    at h (static/min/app.580329556832.js:1611:766)
       = static/js/popovers.js line 176 column 44

    at Object.c.actions_menu_handle_keyboard (static/min/app.580329556832.js:1614:334)
       = static/js/popovers.js line 196 column 17

    at Object.a.process_enter_key (static/min/app.580329556832.js:1680:426)
       = static/js/hotkey.js line 258 column 9

    at Object.a.process_hotkey (static/min/app.580329556832.js:1683:260)
       = static/js/hotkey.js line 385 column 20

    at Object.a.process_keydown (static/min/app.580329556832.js:1690:465)
       = static/js/hotkey.js line 661 column 12

    at HTMLDocument.<anonymous> (static/min/app.580329556832.js:1690:520)
       = static/js/hotkey.js line 665 column 9

    at HTMLDocument.g (static/min/common.4584f908a1d2.js:251:25)
       = static/js/blueslip.js line 221 column 20

    at HTMLDocument.dispatch (static/min/common.4584f908a1d2.js:125:73)
       = static/node_modules/jquery/dist/jquery.js line 5225 column 16

    at HTMLDocument.h.handle (static/min/common.4584f908a1d2.js:118:327)
       = static/node_modules/jquery/dist/jquery.js line 4878 column 6
Updated 20/06/2017 00:37 4 Comments

feature request: show somewhere the number of commits a build has


it’s great to be able to upgrade zulip from git master branch. However it would be a logical addition if or zulip/about could somewhere note how many commits were on github when the git upgrade was done. This way it’s easier to know how many commits a server is behind the latest master.

right now Zulip 1.5.1 is more than 2000 commits behind master. But if we upgrade since then I can only guess.

Updated 05/05/2017 19:23 4 Comments

Strengthen check for name validity.


Currently zerver.lib.users.check_full_name is more lax than the RFC standard for the name part of name <email>. We’d like to be able to send emails to users using UserProfile.full_name for name.

This involves a few steps: * Figure out what the standard is, and if python already has a library that implements this check. Maybe in the email.header or email.utils modules? * Add this check to check_full_name. If you’re writing the check from scratch, feel free to err on the side of writing a more-restrictive-than-needed check if it is simpler to understand. * Write a migration that converts non-valid full names to valid full names (can be hackish, e.g. it can just remove some offending characters. I expect this to be a pretty rare occurance)

While you’re looking at this, it would also be great to * Make sure by the end of this process newlines, tabs, and other such control characters are also not allowed (either via adding them to UserProfile.NAME_INVALID_CHARS or via the other parts of check_full_name)

As a bonus, or as a followup, it would be great to apply a similar check to

Updated 16/06/2017 02:58 11 Comments

Standardize tooltip naming style.


We seem to have several different styles/naming conventions for doing tooltips in the codebase. Some don’t “scale” in the sense that they don’t allow for more than one tooltip in the same view. It would be great to standardize how we do tooltips in a way that will allow folks to just copy-paste from existing code when adding tooltips in the future.

As a part of this, you could add a tooltip to templates/analytics/stats.html for the Number of Users graph that says “Only includes users who have an active account and who have logged in in the last two weeks.”, since that page that will then have more than one tooltip.

Updated 25/04/2017 22:47 1 Comments

email: Change sender and subject of missed message emails.


Currently, if there is a Huddle message with A, B, and C, and B and C have a bit of a conversation while A is away, A will get missed message emails with two different subjects: “Missed Zulip from B” and “Missed Zulip from C”. Each email thread will have half the conversation.

It’d be great to change the missed message emails as follows: * The sender should be “Zulip Missed Messages” * The subject should be one of the following, as appropriate: * name sent you a message in realm * name @-mentioned you in realm * Group PMs with name_list in realm

name_list should be one of: “name1 and name2” “name1, name2, and name3” “name1, name2, and others”

Thoughts * Possibly name1 should actually be user_profile1.short_name, or user_profile1.full_name.split(' ')[0] (and similarly for name2 and name3) * I’m not sure how to choose the order of the names. Maybe order by date_joined? Alphabetical is always an option, but feels lame.

Implementation: * zerver/lib/ is a good file to look at. Search for missedmessage.

Updated 12/05/2017 20:55 2 Comments

integrations: Add pages for hubot integrations.


Two issues: * The links to “Hubot” in the “Integrations available via Hubot” section of the integrations/ page are broken. * Clicking on any of the boxes (e.g. Assembla) takes you directly to the github page.

It would be great to add a integrations/#assembla page, and similarly for the rest. People ask whether “Zulip supports X” (where X is something like voice calls, screensharing, etc), and it’d be great to be able to point them to these pages.

Updated 18/04/2017 22:36 2 Comments

views: Apply human_users_only decorator to human-only views.


4516 introduces a human_users_only decorator that can be used to block bots from e.g. changing their display settings or doing other things that don’t make sense for bot users.

It would be great to add the decorator to all the functions in zerver/views/* that need it. For each such function, we need to add the decorator, remove any relevant if user_profile.is_bot: return json_error .. logic, and add the endpoint to test_human_only_endpoints in

I’d split this into a bunch of commits (e.g. one per file, or more fine-grained than that) to make this easy to review.

Updated 16/06/2017 15:23 11 Comments

stats: Extract messages sent over time legend from plotly.


Currently the messages sent over time legend has confusing styling; the squares should be checkboxes, and “Humans” and “Bots” should be grouped together separately from “Me”.

The first step to doing this is to replace the plotly legend with three regular checkboxes. The click handlers of the checkboxes should either call the appropriate plotly functions to retrace the graph, or if it’s easier, they can just redraw the graph (ideally keeping the same rangeslider position).

@italo-batista, this could be a great issue for you to look at. Adding @manjithd2 as well, in case you’d like to follow it!

Updated 08/06/2017 15:17 5 Comments

Clicking a link in the message feed defocuses the compose box


If you click a link in the message feed to another site, the compose box loses focus, which is slightly annoying if you’re consulting some linked-to resource as part of drafting a reply.

I suspect this is effectively a bug in how we fixed the earlier issue that clicking a link in the message feed would focus the link (causing enter to re-open the link).

Updated 12/06/2017 08:10 14 Comments

stream creation: Don't mark stream as inactive after creation.


We currently mark streams as inactive if they have no loaded messages. If you create a stream (e.g. through the subscriptions modal), it will be marked as inactive, since it has no messages.

This is slightly confusing for people on small realms (it marks the newly created stream as light grey, which is a different color than the rest of the streams), but really confusing if you have 40+ streams, since then the new stream is automatically sorted to the bottom, with the rest of the inactive streams.

The solution is to mark streams as active if the user just created it.

Notes: * The is_active function is in static/js/stream_data.js. * A lot of relevant code is in stream_list.js, including e.g. the functions that build the sidebar.

Updated 20/06/2017 00:37 8 Comments

font: Ligatures like ff have strange behavior


Copying conversation from

– If you type something with two f’s and then left arrow back over it, you get somewhat strange behavior, since the ff is turned into a ligature. I managed to get stranger behavior as well by using backspace instead of left arrow, though I don’t have a repro at the moment. If we turn off ligatures, would that break accented characters? (fwiw, slack and gchat seem to handle the ff case fine)

– I have been able to reproduce the left arrow thing (or any other attempt of moving the cursor between both f’s). The cursor stays after the last f, but if you type the text appears between them. Something curious also happens if you click between both f’s. The cursor should appear between the f’s, but it doesn’t. Actually, if you type new text, it appears after the ligature.

– This happens in the compose box, search boxes, edit box, etc. @brockwhittaker in case you want to take a look.

(Marking as a bug, but feel free to remove if this feels more like an enhancement than a bug.)

Updated 09/05/2017 00:36 4 Comments

compose: Change compose box to use a handlebars template.


Currently, the message edit box and the compose box have completely different styling. We’d like to make the message edit box look more like the compose box. The first step for this is to render the compose box via a handlebars template, so that we can then reuse that template for the message editing box.

Much of the relevant compose box code is in static/js/compose.js.

Updated 07/04/2017 23:40 6 Comments

Prioritize recent message senders / PM recipients in typeahead


Thanks to @tommyip’s work in #2806, we now prioritize PM recipient and @-mention typeahead by users who are subscribers to a stream.

A second level of prioritization that should probably be above that one is prioritizing recent message senders and users you’ve been in a PM thread with (first in the current narrow and then in the organization overally); this would massively decrease the impact of having large numbers of inactive users (like on or other open source projects) on the efficiently of naming other users via typeahead.

This will take some care to avoid having this feature slow down the typeahead, but I think with a bit of data structures work (we probably already cache all the needed data for in pm_list.js for the recent PM threads piece; and recent senders should be pretty easy to add as a data structure), this should be very doable.

Updated 26/06/2017 08:04 8 Comments

emoji: Use spaces instead of underscore when possible.


Many emoji shortcodes have underscores, like :baby_bottle:. We display the emoji shortcodes with underscores everywhere in the app, but it would be nicer just to show spaces, like baby bottle.

A few places this should be changed: * Emoji autocomplete should show baby bottle instead of baby_bottle * Typing either :baby b or :baby_b should show baby bottle in the autocomplete, but it should still complete to :baby_bottle: when you hit enter * The alt text in the emoji should stay as :baby_bottle:, but the title should change to baby bottle (see `zerver.lib.bugdown.make_emoji)

Updated 22/05/2017 21:11 5 Comments

Change consider_bankruptcy to use UserPresence instead of pointer.


Currently, the following piece of code in static/js/unread_ui.js puts up the bankruptcy modal if you have more than 500 unread messages and your pointer is more than 2 days in the past:

    var now = new XDate(true).getTime() / 1000;
    if ((page_params.unread_count > 500) &&
        (now - page_params.furthest_read_time > 60 * 60 * 24 * 2)) { // 2 days.
        var unread_info = templates.render('bankruptcy_modal',
                                           {unread_count: page_params.unread_count});

It would be better to use the information in UserPresence to calculate this, since page_params.furthest_read_time can be very far back for those that use the left sidebar to read Zulip rather than the Home view.

It would also be better to change 2 days to 4 days, so that it doesn’t include just being gone for the weekend.

Updated 18/04/2017 18:05 5 Comments

Audit our webhook integrations for ping messages that should be handled


As a follow-up to #3994, it’d be super awesome to audit our other integrations for whether they have “ping” type messages that are being silently accepted and should instead send out a similar notice. Probably the best way to check is to read the webhook docs for the integration, but we could also check our code in most cases.

I’d sorta do this in a few stages that all feel fairly quick (and log findings in this issue). E.g. start by checking out the 5 other Git integrations and opening issues for any that need work, and going from there.

Updated 16/06/2017 02:58 8 Comments

bugdown: Buggy local echo when ending with at-mention.


Not sure what the underlying issue is, but a reproducer is stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff stuff <@mention someone>

The local echo should have 15 copies of the @mention replacing all the stuff.

Updated 16/06/2017 02:58 8 Comments

search: Add ability to search by huddle.


We’ll want to add a new search keyword, like huddle-with:<email>.

On the backend, the main change that needs to be made is in NarrowBuilder in zerver/views/

The frontend is a bit messier, but I would git grep for pm-with which should have a superset of the changes that are needed.

This is something that will also need a careful test suite.

This would be a great medium size project for someone who has done several smaller projects, and is looking for something bigger.

Updated 16/06/2017 02:58 11 Comments

analytics: Improve new realm experience on /stats.


One of the first things someone might do when trying out zulip is to click on the links in the gear menu, one of which is (or will soon be) a link to the /stats page. Currently this page is completely broken for new realms.

A good solution would be to just show fixture data until the realm has a bit of traffic.

Some steps: * Remove the min_length argument from get_chart_data and the functions it calls (git grep for min_length from the analytics/ directory), and also from the $.get calls in stats.js. * For the charts in stats.js, if data.end_times.length is small: * show some fixture data instead * make the opacity of the graph 40% or something * disable all the buttons * overlay a message on top, like “Not enough data; please check back in a couple of days.”

Notes: Also check that e.g. the weekly view on Messages Sent Over Time looks okay with < 1wk of data, and that the Number of Users graph looks okay with 1-2 days of data. If it doesn’t we can open further issues to fix it.

Some notes on the analytics frontend is available at

You can delete all the analytics data with ./ clear_analytics_tables --force, and you can modify e.g. DAYS_OF_DATA in (and then run ./ to mimic a young realm. You can also modify clear_analytics_tables (via do_drop_all_analytics_tables) to only delete things after a certain end_time, with UserCount.objects.filter(end_time__gt=myendtime).delete().

Updated 08/06/2017 05:30 17 Comments

Improve visual formatting of message edit history


Now, after a message has been edited, it’s possible to see the history versions of the message (see #268). The new UI is functional, but could look a lot nicer. The big structural things are these: * [x] We should optimize the timestamp display to not repeat the date every time, while still providing precise dates for each transition in the message’s content. * [ ] Only show who edited messages if it was someone other than the author (only relevant for topic edits). * [ ] We should start displaying topic edits (maybe just show the topic part of a recipient bar to show changes in the topic?) * [ ] Fix the funny alignment of notes about who edited things. * [x] Improve the colors. The current colors were chosen for a use case where the diff would be shown on every message, not only in this off-to-the-side edit history view. * [x] Potentially add some sort of (optional?) display of what was removed from the previous version. That is tracked in #1406, so it’s fine to close this issue even if that isn’t resolved.

This is a meta-issue for now; we may end up splitting it into several sub-issues once someone is actually working on it.

Updated 16/06/2017 03:04 7 Comments

Improve "Uploaded files" / attachment UI behavior


We merged, which means there’s now a UI for deleting attachments that you didn’t intend to upload. But it seems like we probably want to enhance that in a few ways:

(1) It doesn’t live-update to show attachments you’ve uploaded during the current browser session. (2) Since users are probably unlikely to update their attachments, it might make sense to not bother including the data in page_params; for a user who has sent thousands of screenshots in their time using Zulip, the page is probably pretty slow.

I think (1) + (2) probably have a joint solution of only fetching + rendering this particular settings page when a user actually clicks on the “Uploaded files” button.

(3) After an attachment is deleted, it’d be nice to somehow update how the relevant messages are rendered to display an “attachment deleted” image of some sort. I don’t have a great solution for how to do this that isn’t messy, but the approximate idea would be to (1) move the Attachment object into a “deleted” state rather than removing it and (2) if one tries to access a deleted Attachment image, return the URL to a fixed “File deleted” image rather than the (now nonexistent) original file’s URL.

(4) Finally, I think we should provide some clarity that deleting an attachment will (maybe just in the documentation paragraph).

Updated 27/06/2017 00:31 3 Comments

Add test to assert every child of ScrollView has 'overflow: hidden' set


ScrollView has an important performance optimization called removeClippedSubviews which removes subviews outside of the visible bounds from the view hierarchy. This is a big win for memory consumption.

The optimization only kicks in however, when every subview of the ScrollView has the ‘overflow: hidden’ property set.

We should add a test to make sure no subviews are contained in the main MessageList ScrollView without ‘overflow: hidden’ set.

Updated 19/04/2017 04:21 6 Comments

Document the new /stats page


We may end up changing the exact set of graphs over time so I wouldn’t focus on an exhaustive list, but it seems worth adding a user documentation article about the fact that we have nice graphs of data about usage of one’s Zulip organization as well as one’s own personal usage. We can maybe also add an entry in templates/zerver/features.html.

Updated 18/04/2017 18:06 13 Comments

Add support for integration with the 1password extension


I got feedback from a user that they’d like to be able to use the 1password extension with Zulip:

It looks like this just requires integrating

Putting this in the backlog since Google auth is probably higher priority, but this might be easy, so I’d certainly encourage anyone looking for a task to give this a try.

Updated 16/05/2017 17:03 9 Comments

@-mention autocomplete should display more than 5 results


In case of several matches, the @-mention autocomplete should display either all of them or there should be an upper limit which can be configured by users. The list of results can be scrollable.

This is needed because there is a possibility that more than 5 users have same initial name, hence the desired person’s name can be left out of the results which can be annoying.

Updated 30/03/2017 19:03 3 Comments

Improve the find my team page.


The find my team page allows users to enter an email address (actually, up to 10 email addresses) and receive an email with a link to the login page of their organization. The basic functionality is there, but it could use a few improvements:

  • [ ] You shouldn’t be able to click “Find team” if you don’t have a valid list of email addresses. Slack does this really nicely:

  • [ ] We should send an email regardless of whether they are in a Zulip org or not.

  • [ ] The followup page should have links to resend the email or enter a different email address.

  • [ ] The URL of the followup page currently has the email as a URL parameter, which should be removed.

  • [x] Add the 'In the Zulip development environment, outgoing emails are printed to the console.' text (git grep for it to see how we do it elsewhere)

  • [x] On load, the cursor should go into the box where you enter your email address.

The find my team page is at http://<host>:9991/find-my-team/. In the dev environment, you’ll need to first change 'FIND_TEAM_LINK_DISABLED' to False in zproject/

Updated 26/06/2017 21:24 13 Comments

Images with low height have an excessively big message box



Sending a very small image (like an icon, for instance) results in an message box that is too big.

Steps to reproduce

  1. Log in as Cordelia.
  2. Paste in all/(no topic) a small picture (<100px tall). Preferrably use one with a background color, that contrasts with Zulip’s white background, for increased visibility. You can use this one, for example: Test picture
  3. Send the picture.
  4. The following message box appears: Too big message box


Looks like this happens because the message_inline_image CSS class specifies a fixed height of 100px.

Perhaps changing that to max-height could be a fix for this problem.

Updated 21/04/2017 04:51 4 Comments

Allow users to check subdomain availability on registration page.


To get to the page: go to localhost:9991/create_realm, enter an email, click Create Organization, and then click on the confirmation email in your terminal.

It would be really nice to have a “Check” button to the right of this box: image that checked if your short name/subdomain is already taken or not.

Started a discussion at

Updated 26/06/2017 21:24 4 Comments

Remove realm_str from session object for realm sign-up.


We have the following logic in def accounts_home_with_realm_str(request, realm_str): # type: (HttpRequest, str) -> HttpResponse if not settings.REALMS_HAVE_SUBDOMAINS and completely_open(get_realm_by_string_id(realm_str)): # You can sign up for a completely open realm through a # special registration path that contains the domain in the # URL. We store this information in the session rather than # elsewhere because we don't have control over URL or form # data for folks registering through OpenID. request.session["realm_str"] = realm_str return accounts_home(request) else: return HttpResponseRedirect(reverse('zerver.views.accounts_home'))

It would be great to no longer have to store the realm_str in the session, since it increases the security impact of a SESSION_KEY leak. I imagine the way to do this will be to pass the realm (or realm_str) through the google auth / github auth paths in zerver/views/, either as a parameter or by maintaining the URL. Most of the work for maintaining the URL has already been done as a part of the subdomains project over the summer.

This task would be better for a relatively experienced programmer, since registration/authentication bugs can be a bit subtle.

Updated 20/06/2017 00:39 2 Comments

Add support for administrators toggling default streams in stream settings page


Currently, administrators can manage the “default” streams that new users get automatically when they sign up via the administration panel; we should also display and allow management of whether a stream is a default stream when an administrator is looking at that individual stream’s settings.

Updated 01/04/2017 10:46 1 Comments

Fork me on GitHub