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

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

View File

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

View File

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

View File

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

View File

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