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

Make link-to-conversation copy to the clipboard.


We should make the link-to-conversation menu item in the message menu simply copy the link to the clipboard, rather than opening a new tab or automatically re-narrowing.

(Note: this issue replaces #528, which had gotten a bit cluttered. You can refer back to it for more context, but it might be easier to discuss this on chat to find the current desired behavior. There’s also an old PR linked there, but it might be too old to be of much use.)

Updated 26/04/2017 13:41 1 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

reactions popover: pressing up to go back to reactions filter should put tooltip at the end of search


Currently, when you go down into the reactions via down arrow key and go back up into the reactions filter via up arrow key, the tooltip jumps to the front of the search term.

We probably either want to keep the original position before going down into the reactions grid or just set it to be at the end of the reaction filter.

Updated 25/04/2017 05:46 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 19/04/2017 23:09 1 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

Password field silently missing on new admin creation if no auth enabled


If you neglect to enable an auth backend, everything seems fine except there is no place to create a password for your new admin login. That section of the page is missing.

Maybe show a message warning that no authentication method is enabled? I test installed twice before I noticed I hadn’t been asked to create a password. When I logged out, I couldn’t login again. The login page shows “You look familiar” but no login fields or button.

Updated 23/04/2017 02:29 3 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/04/2017 01:17 3 Comments

New feature: make navigation in help menu keyboard-friendly


Help menu can be accessed through the hotkey ?.

Currently, when we try moving up/down in this menu, it seems to disregarding the help menu and moving the selected message up and down. We want to disable this.

Also, we would like to be able to switch tabs from Keyboard Shortcuts to Message formatting/Search operators by allowing tabbing or navigation with right/left arrows.

Read more here.

Updated 12/04/2017 18:17 3 Comments

registration: Reset password form changes in size due to error messages.


To reproduce in the dev environment: * Go to the login page * Click “normal login page” * Click “Forgot password” * Click on the link in the console * Put a short password (like a) * Click in another field, like confirm password.

My guess is it has something to do with the error message, since the form changes in size every time the error message changes or appears/disappears.

Updated 17/04/2017 17:38 5 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 18/04/2017 21:41 2 Comments

Optimize performance of editing a message you just sent


Currently, we still need to fetch the raw content of a message you just sent from the server in order to open the edit-message widget. In the event that the message was locally echoed and has not been edited since then, this extra step is unnecessary (we can just store the raw content in message_store.js, and discard it on-edit).

Fixing this could materially improve the feeling of responsiveness when opening Zulip’s message editing UI, especially with a slow network connection to the server.

Updated 25/04/2017 19:42 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 18/04/2017 18:04 8 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 28/04/2017 14:50 7 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 23/03/2017 03:09 1 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/04/2017 03:54 3 Comments

tutorial: Change initial messages to be sent in a PM.


Currently, for new organizations, we send a bunch of tutorial-y messages into #announce when the first person from the organization logs in. Search for send_delayed_stream_message in static/js/tutorial.js to see what we send.

A better model would be to send those messages to a PM with the user instead, and drop the user into the PM view when they first log in to the realm. Some reasons: * We can send different messages to first_in_realm and later users * The initial messages in #announce will be quickly lost in a heavily used realm * It gives a place for users to send a few test messages * The messages can (eventually) be customized to be realm specific (e.g. include a link to a code of conduct)

The messages can be sent as a part of do_create_user or similar in

Updated 22/03/2017 00:31 1 Comments

Add a hotkey to open the lightbox on the nearest image above your current place in feed


This would make it super convenient to just browse through recent designs or other images that are being shared, even if there’s been a lot of back-and-forth.

This should probably be V, the analog of v (which only works if the current message has an image). Or maybe we should just make v find an image if there aren’t any in the current message. Thoughts?

Updated 19/04/2017 06:34 1 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 18/04/2017 07:18 4 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 18/04/2017 18:04 6 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 18/04/2017 07:18 5 Comments

Add test coverage for session deletion methods in zerver/lib/


We just extracted zerver/lib/ out of zerver/lib/ We should get it to 100% test coverage and then add it to the fully covered list in tools/test-backend.

This should I think be a fairly quick project – for each function, test that it logs out the user(s) that should be targeted, and doesn’t log out some other user.

Updated 25/03/2017 18:15 8 Comments

integrations: Improve github (and other version control) messages.


Github (and other version control) messages currently look like this: image

A few improvements could be made: * We currently show 10 commits before doing the “and N more commits”. The limit should be 20 instead of 10, since 10+ commits is not uncommon. * The commit links should move to the end. So “integrations: Add foo to bar. (1234567)” * The timabbott pushed to branch master should change to the following. * If all the commits are from timabbott, then “timabbott pushed 15 commits to branch master:” * else if there are at most 3 authors, then “timabbott pushed 8 commits to branch master. Commits by rishig (5), octocat (2), and timabbott (1):” * else “timabbott pushed 13 commits to branch master. Commits by rishig (4), octocat (2), and others (7):”

Authors can be in decreasing order by number of commits, breaking ties alphabetically.

Adding a picture of what it would look like: image

@TomaszKolek, since this is possibly a fast change for you.

Updated 21/04/2017 18:16 9 Comments

Attempting to start a reply to a message you're editing doesn't work


This is a somewhat tricky issue that we need to think about carefully. Right now, the behavior is weird, in that your mouse moves to a pointer “something will happen if you click” when you move it over any of the yellow areas of the message body:


Yep clicking does nothing; I imagine users expect that it would open the compose box (as happens if you click on other messages).

Updated 06/03/2017 08:23 2 Comments

Show a banner with link to a custom url when user joins for the first time


There are two parts for this project.

Part 1 - Banner

When a user joins an organization for the first time a banner would be shown with link to an external webpage. The banner would ask user to check out the link to know more details about the organization (Or something similar).

eg: In case of the link can point to

The administrator should be able to customize the link and enable/disable the banner.

Part 2 - Link in Gear menu

The external URL should be also linked from the gear menu as the banner is shown only when the user joins an organization. Perhaps the link can be called “Organization guidelines” or something, and only appear if an administrator has set that feature?

Discussion regarding this feature can be accessed here.

Check out the New feature tutorial to see how you should go on to implement a new feature in zulip.

Updated 03/03/2017 22:23 2 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 18/04/2017 07:18 9 Comments

Error message sending to a stream you're not subscribed to is broken


If you narrow to a stream you’re not subscribed to (this is easy to do via the search bar, and will become more common when we add a preview feature in /#subscriptions), and send a message, Zulip will give you an error message like this:


Currently, it kinda sucks, because the link takes you to the wrong part of the /#subscriptions page (where you browse your existing streams and need to click “All streams” to see things you’re not on).

But rather than fixing that link, I think maybe we should just provide a “subscribe” button in that error message.

Updated 17/03/2017 13:58 4 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 22/04/2017 19:23 14 Comments

Cannot tab from a locked content field to "Close" button in view source/message editing

  1. Take a message that is not written by you or a message that you can’t edit.

  2. View the source of the message. The “Close” button should be automatically highlighted.

  3. Either double-click in the locked content field to highlight the field or shift+tab to the locked content field.

  4. Now try to press tab to get back to the “Close” button. It doesn’t allow you to. If you were able to edit your message, you could go between the content field and “Close” button with no problems.

@zulipbot label “area: message-editing” “bite size” “help wanted”

Updated 27/02/2017 08:35 2 Comments

View Source misbehaves for message sources already being viewed.



  1. Choose to view source of a message having 4-5 messages after itself.
  2. Again choose view source when the source is already visible.

After following above steps, the narrowed message automatically gets changed to the next message. I believe View Source option should not be available if source is already visible.

Supporting GIF:


Updated 18/04/2017 18:02 5 Comments

Improve API test coverage


We recently added tools/test-api, which performs basic tests of our API against a local development copy of our server. It gets run as part of our continuous integration.

A good project is to find any endpoints that aren’t covered and add tests for them. Also, for the mostly heavily used endpoints (stuff related to sending messages), we may want deeper tests.

Updated 24/03/2017 06:47 2 Comments

Add a complete test suite for our HTML differ algorithm


This is zerver/lib/, which is used in the message edit history feature.

It is currently usually called on rendered, aka HTML, content, not the original markdown, though in theory it could be useful to use it with both.

Basically, we should just call the relevant function with various inputs and verify the output looks correct; we should try to include corner cases in the testing process (e.g. changing *test* to **test**, where just an HTML tag changes).

Success for this looks like a test suite that we feel covers a nice range of cases and gives the file ~100% test coverage.

Updated 20/02/2017 01:55

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: * 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. * We should start displaying topic edits (maybe just show the topic part of a recipient bar to show changes in the topic?) * 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. * 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 22/03/2017 15:53 4 Comments

Add back stats page anchor links (basically navigation for the graphs)


Note: Title has been updated since we temporarily removed the links; see discussion below.

The anchor links in the stats page (https://localhost:9991/stats) do not respond by scrolling to the appropriate section when clicked.

This is most likely due to an error in lines 486-499 in stats.js: .js // handle links with @href started with '#' only $(document).on('click', 'a[href^="#"]', function (e) { // target element id var id = $(this).attr('href'); // target element var $id = $(id); if ($id.length === 0) { return; } // prevent standard hash navigation (avoid blinking in IE) e.preventDefault(); var pos = $id.offset().top+$('.page-content')[0].scrollTop-50; $('.page-content').animate({scrollTop: pos + "px"}, 500); });

Updated 23/03/2017 02:14 3 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 17/02/2017 07:51

Improve password authentication and reset forms javascript issues


While logging Into the Zulip, when they ask for the password. I tried to give a password and deleted everything again. During this course of time whole of the text moved toward left and right which did not look good. This happens because of the different text that was shown as the error message. We can resolve the issue if we can show the error text on a new line.

Updated 07/03/2017 06:25 24 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/03/2017 06:42 9 Comments

docs: Adjust keyboard shortcuts for macOS users.


Some shortcuts on macOS are different than Windows/Linux ones, specifically: * PgUp -> Fn + Up Arrow * PgDn -> Fn + Down Arrow * End -> Fn + Right Arrow * Enter -> Return

Those shortcuts are present both in the ? hotkeys docs and the user docs.

A possible feature would be to tweak the docs and add info for macOS users, if the user agent suggests they’re on a Mac.

Updated 04/03/2017 20:08 7 Comments

user docs: Write user docs for *What to do if the server returns an error*


Write user guide documentation for What to do if the server returns an error, following Zulip’s guidelines on writing user guide documentation.

  • Write an outline for documentation for this feature and post it to the Zulip #documentation stream to get feedback from other contributors.
  • Add your documentation to a new file to the templates/zerver/help/ directory. The name of the file should be a lowercase, hyphenated version of this feature like view-the-markdown-source-of-a-message for the feature “View the Markdown source of a message”.
  • Add a link to your guide under the appropriate section in templates/zerver/help/ The end result should be a nice and clear user guide for the feature, written in Markdown.
  • Verify your documentation looks as you intended and all links work; it’s common to make small mistakes in the markdown that cause your documentation to not look right.
  • Add a commit and submit a pull request. The title of both the commit and the pull request should be docs: Add user guide for *feature*.
Updated 31/01/2017 23:59

user docs: Write user docs for the *Add a link preview* feature


Write user guide documentation for the Add a link preview feature, following Zulip’s guidelines on writing user guide documentation.

  • Write an outline for documentation for this feature and post it to the Zulip #documentation stream to get feedback from other contributors.
  • Add your documentation to a new file to the templates/zerver/help/ directory. The name of the file should be a lowercase, hyphenated version of this feature like view-the-markdown-source-of-a-message for the feature “View the Markdown source of a message”.
  • Add a link to your guide under the appropriate section in templates/zerver/help/ The end result should be a nice and clear user guide for the feature, written in Markdown.
  • Verify your documentation looks as you intended and all links work; it’s common to make small mistakes in the markdown that cause your documentation to not look right.
  • Add a commit and submit a pull request. The title of both the commit and the pull request should be docs: Add user guide for *feature*.
Updated 31/01/2017 23:50

message editing: Add a local echo.


We currently don’t have message editing hooked up to the local echo process, which can cause message editing to feel sluggish on slow connections.

To work on this issue, I would first try to understand how the compose box echo works (e.g. follow compose.send_message, as it calls echo.try_deliver_locally), and then mimic that for

Notes: * We treat locally echoed messages differently from backend-acknowledged messages (e.g. editing them works differently). Most of the existing code for the compose box case will hopefully just work as is, as long as local_id is set. * This is a somewhat non-trivial issue, so probably good for someone with a bit of experience or familiarity with Zulip.

Updated 06/02/2017 07:43 4 Comments

emoji: robot_face (🤖) unicode code point not working


To reproduce, copy and paste 🤖 into a zulip message. (For comparison, 😀 should “work”). The unicode code point is 1f916. It does appear in unicode_emoji_names in static/js/emoji.js, and static/generated/emoji/images/emoji/unicode/1f916.png exists and is the right thing. This emoji also goes by :robot_face:.

The only pattern I’ve noticed is that according to, it was introduced in 2015, and trying (🤓), also introduced in 2015, has the same problem. Something I tried from 2014 did not.

Updated 22/03/2017 22:28 10 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

user docs: Write user docs for the *Zulip in a terminal* feature


Write user guide documentation for the Zulip in a terminal feature, following Zulip’s guidelines on writing user guide documentation.

  • Write an outline for documentation for this feature and post it to the Zulip #documentation stream to get feedback from other contributors.
  • Add your documentation to a new file to the templates/zerver/help/ directory. The name of the file should be a lowercase, hyphenated version of this feature like view-the-markdown-source-of-a-message for the feature “View the Markdown source of a message”.
  • Add a link to your guide under the appropriate section in templates/zerver/help/ The end result should be a nice and clear user guide for the feature, written in Markdown.
  • Verify your documentation looks as you intended and all links work; it’s common to make small mistakes in the markdown that cause your documentation to not look right.
  • Add a commit and submit a pull request. The title of both the commit and the pull request should be docs: Add user guide for *feature*.
Updated 17/03/2017 21:20 14 Comments

Refactor Zulip's email codepaths


Zulip currently sends the following emails. (path) means the email template is in (a subdirectory of) templates/path/. * invitation (confirmation) * prereg confirmation, i.e. at realm creation or registration (confirmation) * zephyr invitation (confirmation) * zephyr setup done (confirmation) * password reset (registration) * digest (zerver/emails) * followup day1 and day2 (zerver/emails) * invitation reminder (zerver/emails) * find team (zerver/emails) * missed message (zerver)

They seem to have been written at different points in Zulip’s development; some use the Django 1.6 style of sending email (we’re currently on Django 1.10), some have filenames ending in _html.txt thus avoiding our linter, some seem to go through similar parallel codepaths (e.g. functions called things like send_this_type_of_email), some only have text versions and not html versions, some have our logo and some don’t, some have support offers and some don’t, etc.

First priority is probably to ensure some homogeneity in the emails that are sent, by e.g. having a common header and/or footer if appropriate, always including the logo in the html versions, always having an html version, always having a verbose_support_offers clause, etc. Issue #3134 covers some of this. Something to keep in the back of the mind might be future translatability; currently none of our emails are translated.

Second priority (but much easier, so maybe do this first) is to set a good file naming convention (foo_email.{html,txt,subject} seems like a good one), and to ensure we’re using send_mail everywhere instead of the Django 1.6 style of sending email (covered in Issue #3132).

Probably third priority (only because it is the hardest) is to write common email code that everyone can use, or figure out some way (developer documentation, if nothing else) to make it easy for someone adding a new email to our system to know what to do. There are unfortunately at least two legitimately different types of email to send: queued email like digest, followup, invitation reminder, and maybe missed message, and then everything else.

Many parts of this could be done by anyone (including someone with little Zulip experience), so don’t feel like you need to tackle all of this to tackle some of it!

Updated 14/03/2017 22:01 7 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 19/04/2017 19:35 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 15/03/2017 21:58 4 Comments

Fix frontend errors in registration form.


To reproduce: * Go to http://localhost:9991/create_realm/ * Enter your email, click Create Organization, and click on the confirmation link in your email. You should now be at http://localhost:9991/accounts/register/ * Bug 1: Click Register. The This field is required. is in an awkward place here: image * Bug 2: Fill out all the fields, but use zulip for Short Name, so that the registration fails (zulip is already taken). Clicking on Register clears the Organization Name and Organization Type. * Enhancement: The error message looks somewhat ugly here, and different from the “This field is required” error messages. image * Bug 3: If you fill out everything other than the Organization Type, you get another awkward This field is required. placement image

Updated 15/03/2017 21:58 8 Comments

Adding new emoji reactions above current message causes jolty scrolling in the message feed


When a user adds a the first emoji on a message above where you are in the feed, it will jolt the feed. Similar to how we handle editing messages, we should adjust the user’s scroll position to eliminate this visible scroll.

It’s easy to reproduce this in development with 2 browser windows – add the first emoji reaction to an old message (so out of view above the screen) while the second browser is in view, and you’ll see the jolt (a small scroll up/down as reactions are added/removed). Ideally, if someone reacts to a message above where you are in the feed, your scroll position would appear to stay fixed.

Updated 08/03/2017 09:07 4 Comments

Fork me on GitHub