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

24
starlight_help/.gitignore vendored Normal file
View File

@@ -0,0 +1,24 @@
# build output
dist/
dist_no_relative_links/
# generated types
.astro/
# dependencies
node_modules/
# logs
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
*.md
# environment variables
.env
.env.production
# macOS-specific files
.DS_Store

View File

@@ -0,0 +1,801 @@
// @ts-check
import * as fs from "node:fs";
import starlight from "@astrojs/starlight";
import {defineConfig, envField} from "astro/config";
import compressor from "astro-compressor";
import Icons from "unplugin-icons/vite";
/**
* @returns {import("vite").PluginOption}
*/
function createRedirectPlugin() {
const proxyPort = process.env.ZULIP_WEB_APP_PROXY_PORT || "9991";
// Astro and starlight middlewares run after astro's vite middleware,
// which gives error before our logic here could run, so the only option
// left with us was to use a vite plugin.
return {
name: "redirect-plugin",
enforce: "post",
/**
* configureServer only runs in development mode, we handle the redirects
* in production using nginx.
* @param {import("vite").ViteDevServer} server
*/
configureServer(server) {
return () => {
// The method exposed by the connect app at server.middlewares is `use`.
// But `use` appends our middleware at the end of the stack, before which
// the trailingSlashMiddleware of astro runs and gives an error before it
// can reach our middleware. `stack.unshift` ensures our middleware runs
// first.
server.middlewares.stack.unshift({
route: "",
/**
* @param {import("http").IncomingMessage} req
* @param {import("http").ServerResponse} res
* @param {Function} next
*/
handle(req, res, next) {
// Canonical URL for the root of the help center is /help/,
// but for all other help URLs, there should be no trailingSlash.
// We have set trailingSlash to never in astro. Setting it to ignore
// will make our /help/ work, but it causes sidebar and other
// components to generate links with a trailingSlash at the end. So
// we manually handle this case.
if (req.url === "/help/") {
req.url = "/help";
}
// Help center dev server often runs on a port different than
// the web app. We have relative URLs pointing to the web app
// in the help center, but they are not on the port help center
// is running on. We redirect here to our web app proxy port.
// We skip redirect for non-document requests since astro assets
// don't have the /help prefix.
if (
req.url &&
!req.url.startsWith("/help") &&
req.headers.accept?.includes("text/html")
) {
const host = req.headers.host || "localhost";
const redirectUrl = new URL(req.url, `http://${host}`);
// We run help center on the proxy port in case of
// run-dev being run with `--only-help-center` flag.
if (redirectUrl.port !== proxyPort) {
redirectUrl.port = proxyPort;
res.writeHead(302, {Location: redirectUrl.href});
res.end();
return;
}
}
next();
},
});
};
},
};
}
// https://astro.build/config
export default defineConfig({
base: "help",
compressHTML: "jsx",
trailingSlash: "never",
vite: {
plugins: [
// eslint-disable-next-line new-cap
Icons({
compiler: "astro",
customCollections: {
// unplugin-icons has a FileSystemIconLoader which is more
// versatile. But it only supports one directory path for
// a single set of icons. We should start using that loader
// if they add support for multiple paths in the future.
async "zulip-icon"(iconName) {
const iconsPath = `../web/icons/${iconName}.svg`;
if (fs.existsSync(iconsPath)) {
return await fs.promises.readFile(iconsPath, "utf8");
}
throw new Error("Zulip icon not found.");
},
},
iconCustomizer(collection, icon, props) {
if (collection === "zulip-icon" || collection === "fa") {
// We need to override some default starlight behaviour to make
// icons look nice, see the css for this class to see the reasoning
// for each individual override of the default css.
props.class = "zulip-unplugin-icon";
if (collection === "zulip-icon" && icon.startsWith("user-circle-")) {
const iconSuffix = icon.replace("user-circle-", "");
props.class = `zulip-unplugin-icon user-circle user-circle-${iconSuffix}`;
}
}
},
}),
createRedirectPlugin(),
],
ssr: {
noExternal: ["zod"],
},
},
env: {
schema: {
SHOW_RELATIVE_LINKS: envField.boolean({
context: "client",
access: "public",
optional: true,
default: true,
}),
CORPORATE_ENABLED: envField.boolean({
context: "client",
access: "public",
optional: true,
default: true,
}),
SUPPORT_EMAIL: envField.string({
context: "client",
access: "public",
optional: true,
default: "zulip-admin@example.com",
}),
},
},
integrations: [
compressor({
gzip: true,
brotli: false,
zstd: false,
}),
starlight({
title: "Zulip help center",
favicon: "../static/images/favicon.svg",
components: {
Footer: "./src/components/Footer.astro",
Head: "./src/components/Head.astro",
Sidebar: "./src/components/Sidebar.astro",
},
pagination: false,
routeMiddleware: "./src/route_data.ts",
customCss: ["./src/styles/main.css"],
sidebar: [
{
label: "Zulip homepage",
link: "https://zulip.com",
attrs: {
class: "external-icon-sidebar",
target: "_blank",
rel: "noopener noreferrer",
},
},
{
label: "Help center home",
slug: "index",
},
{
label: "Guides for getting started",
items: [
{
label: "Getting started",
link: "/getting-started-with-zulip",
},
{
label: "Choosing a team chat app",
link: "https://blog.zulip.com/2024/11/04/choosing-a-team-chat-app/",
attrs: {
class: "external-icon-sidebar",
target: "_blank",
rel: "noopener noreferrer",
},
},
{
label: "Why Zulip",
link: "https://zulip.com/why-zulip/",
attrs: {
class: "external-icon-sidebar",
target: "_blank",
rel: "noopener noreferrer",
},
},
"trying-out-zulip",
{
label: "Zulip Cloud or self-hosting?",
link: "/zulip-cloud-or-self-hosting",
},
"moderating-open-organizations",
"setting-up-zulip-for-a-class",
"using-zulip-for-a-class",
],
},
{
label: "Guides for moving from another app",
items: [
"migrating-from-other-chat-tools",
"moving-to-zulip",
"moving-from-slack",
"moving-from-teams",
"moving-from-discord",
],
},
{
label: "Getting started",
items: [
"create-an-organization",
"demo-organizations",
"join-a-zulip-organization",
"set-up-your-account",
"introduction-to-topics",
{
label: "Starting a new topic",
link: "/introduction-to-topics#how-to-start-a-new-topic",
},
"finding-a-conversation-to-read",
"reading-conversations",
"starting-a-new-direct-message",
"replying-to-messages",
"messaging-tips",
"keyboard-shortcuts",
],
},
{
label: "Setting up your organization",
items: [
"create-your-organization-profile",
"create-user-groups",
"customize-organization-settings",
"create-channels",
"customize-settings-for-new-users",
"invite-users-to-join",
{
label: "Set up integrations",
link: "/integrations-overview",
},
],
},
{
label: "Account basics",
items: [
"edit-your-profile",
"change-your-name",
"change-your-email-address",
"change-your-profile-picture",
"change-your-password",
"configure-email-visibility",
"logging-in",
"logging-out",
"switching-between-organizations",
"import-your-settings",
"review-your-settings",
"protect-your-account",
"deactivate-your-account",
],
},
{
label: "Preferences",
items: [
"dark-theme",
"font-size",
"line-spacing",
"configure-send-message-keys",
"change-your-language",
"change-your-timezone",
"change-the-time-format",
"configure-emoticon-translations",
"configure-home-view",
"enable-full-width-display",
"manage-your-uploaded-files",
],
},
{
label: "Guides for mastering Zulip",
items: [
"keyboard-shortcuts",
"reading-strategies",
"mastering-the-compose-box",
"format-your-message-using-markdown",
{
label: "Search filters",
link: "/search-for-messages#search-filters",
},
"using-zulip-via-email",
],
},
{
label: "Writing messages",
items: [
"format-your-message-using-markdown",
"mention-a-user-or-group",
{
label: "Link to a channel, topic or message",
link: "/link-to-a-message-or-conversation",
},
"format-a-quote",
"quote-or-forward-a-message",
"emoji-and-emoticons",
"insert-a-link",
"saved-snippets",
"share-and-upload-files",
{
label: "Animated GIFs",
link: "/animated-gifs",
},
"text-emphasis",
"paragraph-and-section-formatting",
"bulleted-lists",
"numbered-lists",
"indent-a-list-item",
"tables",
"code-blocks",
"latex",
"spoilers",
"me-action-messages",
"create-a-poll",
"collaborative-to-do-lists",
"global-times",
"start-a-call",
],
},
{
label: "Sending messages",
items: [
"open-the-compose-box",
"mastering-the-compose-box",
"resize-the-compose-box",
"typing-notifications",
{
label: "Preview messages before sending",
link: "/preview-your-message-before-sending",
},
{
label: "Verify a message was sent",
link: "/verify-your-message-was-successfully-sent",
},
"edit-a-message",
"delete-a-message",
"view-and-edit-your-message-drafts",
"schedule-a-message",
"message-a-channel-by-email",
],
},
{
label: "Reading messages",
items: [
"reading-strategies",
"inbox",
"recent-conversations",
"combined-feed",
"channel-feed",
"list-of-topics",
"left-sidebar",
"message-actions",
"marking-messages-as-read",
"marking-messages-as-unread",
"configure-unread-message-counters",
{
label: "Configure where you land",
link: "/configure-where-you-land",
},
"emoji-reactions",
"view-your-mentions",
"star-a-message",
"schedule-a-reminder",
"view-images-and-videos",
"view-messages-sent-by-a-user",
"link-to-a-message-or-conversation",
"search-for-messages",
"scroll-to-date",
"printing-messages",
{
label: "View message content as Markdown",
link: "/view-the-markdown-source-of-a-message",
},
{
label: "View when message was sent",
link: "/view-the-exact-time-a-message-was-sent",
},
"view-a-messages-edit-history",
"collapse-a-message",
"report-a-message",
"read-receipts",
],
},
{
label: "People",
items: [
"introduction-to-users",
"user-list",
"status-and-availability",
"user-cards",
"view-someones-profile",
"direct-messages",
"find-administrators",
],
},
{
label: "Groups",
items: ["user-groups", "view-group-members"],
},
{
label: "Channels",
items: [
"introduction-to-channels",
{
label: "Subscribe to a channel",
link: "/introduction-to-channels#browse-and-subscribe-to-channels",
},
"create-a-channel",
"pin-a-channel",
"change-the-color-of-a-channel",
"channel-folders",
"unsubscribe-from-a-channel",
"manage-inactive-channels",
"move-content-to-another-channel",
"view-channel-information",
"view-channel-subscribers",
],
},
{
label: "Topics",
items: [
"introduction-to-topics",
"rename-a-topic",
"resolve-a-topic",
"move-content-to-another-topic",
"general-chat-topic",
"delete-a-topic",
],
},
{
label: "Notifications",
items: [
"channel-notifications",
"topic-notifications",
"follow-a-topic",
"dm-mention-alert-notifications",
"mute-a-channel",
"mute-a-topic",
"mute-a-user",
"email-notifications",
"desktop-notifications",
"mobile-notifications",
{
label: "Do Not Disturb",
link: "/do-not-disturb",
},
],
},
{
label: "Apps",
items: [
{
label: "Download apps",
link: "https://zulip.com/apps/",
attrs: {
class: "external-icon-sidebar",
target: "_blank",
rel: "noopener noreferrer",
},
},
{
label: "Mobile app installation guides",
link: "/mobile-app-install-guide",
},
{
label: "Desktop installation guides",
link: "/desktop-app-install-guide",
},
"supported-browsers",
{
label: "Configure how links open",
link: "/configure-how-links-open",
},
"connect-through-a-proxy",
"custom-certificates",
],
},
{
label: "Zulip administration",
link: "#",
attrs: {
class: "non-clickable-sidebar-heading",
},
},
{
label: "Organization profile",
items: [
"organization-type",
{
label: "Communities directory",
link: "/communities-directory",
},
"linking-to-zulip",
"change-organization-url",
"deactivate-your-organization",
],
},
{
label: "Import an organization",
items: [
"import-from-mattermost",
"import-from-microsoft-teams",
"import-from-slack",
"import-from-rocketchat",
"export-your-organization",
{
label: "Zulip Cloud to self-hosting",
link: "/cloud-to-self-hosting",
},
{
label: "Self-hosting to Zulip Cloud",
link: "/self-hosting-to-cloud",
},
],
},
{
label: "Account creation and authentication",
items: [
{
label: "Configure default new user settings",
link: "/configure-default-new-user-settings",
},
"configure-default-profile-pictures",
"custom-profile-fields",
"invite-new-users",
"restrict-account-creation",
"configure-authentication-methods",
"saml-authentication",
"scim",
],
},
{
label: "User management",
items: [
"manage-a-user",
"deactivate-or-reactivate-a-user",
"change-a-users-name",
"manage-user-channel-subscriptions",
"manage-user-group-membership",
"reset-settings-for-users",
],
},
{
label: "Channel management",
items: [
"create-a-channel",
{
label: "Private channels",
link: "/channel-permissions#private-channels",
},
{
label: "Public channels",
link: "/channel-permissions#public-channels",
},
"public-access-option",
"general-chat-channels",
"manage-channel-folders",
"channel-permissions",
"channel-posting-policy",
"configure-who-can-start-new-topics",
"configure-who-can-administer-a-channel",
"configure-who-can-create-channels",
{
label: "Configure who can subscribe",
link: "/configure-who-can-subscribe",
},
{
label: "Configure who can subscribe others",
link: "/configure-who-can-invite-to-channels",
},
{
label: "Configure who can unsubscribe anyone",
link: "/configure-who-can-unsubscribe-others",
},
"subscribe-users-to-a-channel",
"unsubscribe-users-from-a-channel",
"set-default-channels-for-new-users",
"rename-a-channel",
"change-the-channel-description",
"pin-information",
"change-the-privacy-of-a-channel",
"enable-mobile-notifications-by-default",
{
label: "Delete or archive a channel",
link: "/archive-a-channel",
},
],
},
{
label: "Permissions management",
items: [
"manage-permissions",
"manage-user-groups",
"deactivate-a-user-group",
"user-roles",
"guest-users",
"restrict-direct-messages",
"restrict-wildcard-mentions",
{
label: "Restrict message editing",
link: "/restrict-message-editing-and-deletion",
},
"restrict-message-edit-history-access",
"restrict-moving-messages",
"restrict-resolving-topics",
"restrict-name-and-email-changes",
"restrict-profile-picture-changes",
"restrict-permissions-of-new-members",
],
},
{
label: "Organization settings",
items: [
{
label: "Configure organization language",
link: "/configure-organization-language",
},
"custom-emoji",
"configure-call-provider",
"add-a-custom-linkifier",
{
label: "Require topics in channel messages",
link: "/require-topics",
},
"image-video-and-website-previews",
"hide-message-content-in-emails",
"message-retention-policy",
"enable-moderation-requests",
"digest-emails",
"disable-welcome-emails",
"configure-a-custom-welcome-message",
"configure-automated-notices",
"configure-multi-language-search",
"analytics",
],
},
{
label: "Bots & integrations",
items: [
"bots-overview",
"integrations-overview",
"add-a-bot-or-integration",
{
label: "Generate integration URL",
link: "/generate-integration-url",
},
"manage-a-bot",
"deactivate-or-reactivate-a-bot",
"request-an-integration",
{
label: "Restrict bot creation",
link: "/restrict-bot-creation",
},
"view-your-bots",
"view-all-bots-in-your-organization",
"non-webhook-integrations",
"writing-bots",
"interactive-bots-api",
"writing-tests-for-interactive-bots",
"running-bots",
"deploying-bots",
"outgoing-webhooks",
],
},
{
label: "Support",
items: [
"view-zulip-version",
"zulip-cloud-billing",
{
label: "Self-hosted billing",
link: "/self-hosted-billing",
},
"gdpr-compliance",
{
label: "Move to Zulip Cloud",
link: "/move-to-zulip-cloud",
},
"support-zulip-project",
"linking-to-zulip-website",
"contact-support",
],
},
{
label: "◀ Back to Zulip",
link: "../",
},
],
}),
],
// Redirects in astro are just directories with index.html inside
// them doing the redirect we define in the value. The base of
// /help/ will apply to the keys in the list below but we will
// have to prepend /help/ in the redirect URL.
redirects: {
"pm-mention-alert-notifications": "/help/dm-mention-alert-notifications",
"restrict-private-messages": "/help/restrict-direct-messages",
"reading-pms": "/help/direct-messages",
"private-messages": "/help/direct-messages",
"configure-who-can-edit-topics": "/help/restrict-moving-messages",
"configure-message-editing-and-deletion": "/help/restrict-message-editing-and-deletion",
"restrict-visibility-of-email-addresses": "/help/configure-email-visibility",
"change-default-view": "/help/configure-default-view",
"recent-topics": "/help/recent-conversations",
"add-custom-profile-fields": "/help/custom-profile-fields",
"enable-enter-to-send": "/help/configure-send-message-keys",
"change-the-default-language-for-your-organization":
"/help/configure-organization-language",
"delete-a-stream": "/help/archive-a-channel",
"archive-a-stream": "/help/archive-a-channel",
"change-the-topic-of-a-message": "/help/rename-a-topic",
"configure-missed-message-emails": "/help/email-notifications",
"add-an-alert-word": "/help/dm-mention-alert-notifications#alert-words",
"test-mobile-notifications": "/help/mobile-notifications",
"troubleshooting-desktop-notifications":
"/help/desktop-notifications#troubleshooting-desktop-notifications",
"change-notification-sound": "/help/desktop-notifications#change-notification-sound",
"configure-message-notification-emails": "/help/email-notifications",
"disable-new-login-emails": "/help/email-notifications#new-login-emails",
// The `help/about-streams-and-topics` and `help/streams-and-topics` redirects are particularly
// important, because the old URLs appear in links from Welcome Bot messages.
"about-streams-and-topics": "/help/introduction-to-topics",
"streams-and-topics": "/help/introduction-to-topics",
"community-topic-edits": "/help/restrict-moving-messages",
"only-allow-admins-to-add-emoji": "/help/custom-emoji#change-who-can-add-custom-emoji",
"configure-who-can-add-custom-emoji": "/help/custom-emoji#change-who-can-add-custom-emoji",
"add-custom-emoji": "/help/custom-emoji",
"night-mode": "/help/dark-theme",
"enable-emoticon-translations": "/help/configure-emoticon-translations",
"web-public-streams": "/help/public-access-option",
"starting-a-new-private-thread": "/help/starting-a-new-direct-message",
"edit-or-delete-a-message": "/help/delete-a-message",
"start-a-new-topic": "/help/starting-a-new-topic",
"configure-default-view": "/help/configure-home-view",
"reading-topics": "/help/reading-conversations",
"finding-a-topic-to-read": "/help/finding-a-conversation-to-read",
"view-and-browse-images": "/help/view-images-and-videos",
"bots-and-integrations": "/help/bots-overview",
"configure-notification-bot": "/help/configure-automated-notices",
"all-messages": "/help/combined-feed",
"create-streams": "/help/create-channels",
"create-a-stream": "/help/create-a-channel",
"message-a-stream-by-email": "/help/message-a-channel-by-email",
"browse-and-subscribe-to-streams": "/help/browse-and-subscribe-to-channels",
"unsubscribe-from-a-stream": "/help/unsubscribe-from-a-channel",
"view-stream-subscribers": "/help/view-channel-subscribers",
"add-or-remove-users-from-a-stream": "/help/subscribe-users-to-a-channel",
"pin-a-stream": "/help/pin-a-channel",
"change-the-color-of-a-stream": "/help/change-the-color-of-a-channel",
"move-content-to-another-stream": "/help/move-content-to-another-channel",
"manage-inactive-streams": "/help/manage-inactive-channels",
"stream-notifications": "/help/channel-notifications",
"mute-a-stream": "/help/mute-a-channel",
"manage-user-stream-subscriptions": "/help/manage-user-channel-subscriptions",
"stream-permissions": "/help/channel-permissions",
"stream-sending-policy": "/help/channel-posting-policy",
"configure-who-can-create-streams": "/help/configure-who-can-create-channels",
"configure-who-can-invite-to-streams": "/help/configure-who-can-invite-to-channels",
"set-default-streams-for-new-users": "/help/set-default-channels-for-new-users",
"rename-a-stream": "/help/rename-a-channel",
"change-the-stream-description": "/help/change-the-channel-description",
"change-the-privacy-of-a-stream": "/help/change-the-privacy-of-a-channel",
"channels-and-topics": "/help/introduction-to-topics",
"starting-a-new-topic": "/help/introduction-to-topics#how-to-start-a-new-topic",
"browse-and-subscribe-to-channels":
"/help/introduction-to-channels#browse-and-subscribe-to-channels",
"allow-image-link-previews": "/help/image-video-and-website-previews",
"getting-your-organization-started-with-zulip": "/help/moving-to-zulip",
"quote-and-reply": "/help/quote-or-forward-a-message",
"change-a-users-role": "/help/user-roles",
"roles-and-permissions": "/help/user-roles",
"add-or-remove-users-from-a-channel": "/help/subscribe-users-to-a-channel",
"disable-message-edit-history": "/help/restrict-message-edit-history-access",
"edit-a-bot": "/help/manage-a-bot",
"reading-dms": "/help/direct-messages",
"set-up-integrations": "/help/integrations-overview",
"animated-gifs-from-giphy": "/help/animated-gifs",
},
});

View File

@@ -0,0 +1,54 @@
{
"name": "starlight_help",
"type": "module",
"version": "0.0.1",
"scripts": {
"dev": "astro dev",
"start": "astro dev",
"check": "astro check",
"build": "astro build",
"preview": "astro preview",
"astro": "astro"
},
"dependencies": {
"@astrojs/starlight": "^0.41.1",
"@iconify-json/fa": "^1.2.1",
"astro": "^7.1.4",
"astro-compressor": "^1.1.2",
"hast-util-from-html": "^2.0.3",
"hast-util-to-html": "^9.0.5",
"mdast-util-to-string": "^4.0.0",
"remark": "^15.0.1",
"remark-mdx": "^3.1.0",
"sharp": "^0.35.3",
"unist-util-visit": "^5.0.0",
"unplugin-icons": "^23.0.1"
},
"devDependencies": {
"@astrojs/check": "^0.9.3",
"@types/hast": "^3.0.4",
"@types/mdast": "^4.0.4",
"mdast-util-to-markdown": "^2.1.2",
"remark-frontmatter": "^5.0.0",
"remark-gfm": "^4.0.1",
"remark-lint-fenced-code-flag": "^4.2.0",
"remark-lint-file-extension": "^3.0.1",
"remark-lint-final-definition": "^4.0.2",
"remark-lint-heading-increment": "^4.0.1",
"remark-lint-list-item-spacing": "^5.0.1",
"remark-lint-maximum-heading-length": "^4.1.1",
"remark-lint-maximum-line-length": "^4.1.1",
"remark-lint-no-duplicate-headings": "^4.0.1",
"remark-lint-no-file-name-irregular-characters": "^3.0.1",
"remark-lint-no-file-name-mixed-case": "^3.0.1",
"remark-lint-no-unused-definitions": "^4.0.2",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-preset-lint-markdown-style-guide": "^6.0.1",
"remark-preset-lint-recommended": "^7.0.1",
"remark-stringify": "^11.0.0",
"typescript": "npm:@typescript/typescript6@^6.0.2",
"unified": "^11.0.5",
"unified-lint-rule": "^3.0.1",
"vite": "^8.1.5"
}
}

View File

@@ -0,0 +1,107 @@
// @ts-check
// We are using remarkLintRulesLintRecommended and
// remarkPresentLintMarkdownStyleGuide as our starting set of rules.
// None of the rules were giving an error on the starting set, but some
// rules were giving lots of warnings on the generated mdx. They are
// set to false in this file, we can add them back later as and when
// required.
/**
* @import {Root} from "mdast"
* @import {Preset, Processor} from "unified"
*/
import {toMarkdown} from "mdast-util-to-markdown";
import remarkFrontmatter from "remark-frontmatter";
import remarkGfm from "remark-gfm";
import remarkLintFencedCodeFlag from "remark-lint-fenced-code-flag";
import remarkLintFileExtension from "remark-lint-file-extension";
import remarkLintFinalDefinition from "remark-lint-final-definition";
import remarkLintHeadingIncrement from "remark-lint-heading-increment";
import remarkLintListItemSpacing from "remark-lint-list-item-spacing";
import remarkLintMaximumHeadingLength from "remark-lint-maximum-heading-length";
import remarkLintMaximumLineLength from "remark-lint-maximum-line-length";
import remarkLintNoDuplicateHeadings from "remark-lint-no-duplicate-headings";
import remarkLintNoFileNameIrregularCharacters from "remark-lint-no-file-name-irregular-characters";
import remarkLintNoFileNameMixedCase from "remark-lint-no-file-name-mixed-case";
import remarkLintNoUnusedDefinitions from "remark-lint-no-unused-definitions";
import remarkLintUnorderedListMarkerStyle from "remark-lint-unordered-list-marker-style";
import remarkMdx from "remark-mdx";
import remarkPresetLintMarkdownStyleGuide from "remark-preset-lint-markdown-style-guide";
import remarkPresetLintRecommended from "remark-preset-lint-recommended";
import remarkStringify from "remark-stringify";
import {lintRule} from "unified-lint-rule";
const stringifyOptions = {
// Number all list items as 1, for compatibility with
// remark-lint-ordered-list-marker-value.
incrementListMarker: false,
};
/**
* Make sure the linter fails if files need to be reformatted. (The other rules
* catch some but not all formatting issues, so this is needed to be sure we
* don't silently ignore changes that would be made with --fix.)
*
* @this {Processor}
* @param {...unknown} args
*/
function remarkLintNeedsReformatting(...args) {
const settings = this.data("settings");
if (
settings === undefined ||
!("checkReformatting" in settings) ||
!settings.checkReformatting
) {
return undefined;
}
return lintRule(
"needs-reformatting",
/** @param {Root} tree */
(tree, file) => {
const formatted = toMarkdown(tree, {
...settings,
...stringifyOptions,
extensions: this.data("toMarkdownExtensions") || [],
});
if (formatted !== file.value) {
file.message("Would be reformatted");
}
},
)(...args);
}
/** @type {Preset} */
const remarkLintRules = {
plugins: [
remarkPresetLintMarkdownStyleGuide,
remarkPresetLintRecommended,
[remarkLintFinalDefinition, false],
[remarkLintListItemSpacing, false],
[remarkLintFileExtension, ["mdx"]],
[remarkLintNoUnusedDefinitions, false],
[remarkLintMaximumLineLength, false],
[remarkLintFencedCodeFlag, false],
[remarkLintNoFileNameIrregularCharacters, false],
[remarkLintNoFileNameMixedCase, false],
[remarkLintMaximumHeadingLength, false],
[remarkLintNoDuplicateHeadings, false],
[remarkLintHeadingIncrement, false],
[remarkLintUnorderedListMarkerStyle, "*"],
remarkLintNeedsReformatting,
],
};
/** @type {Preset} */
const config = {
plugins: [
remarkGfm,
remarkMdx,
[remarkFrontmatter, ["yaml"]],
remarkLintRules,
[remarkStringify, stringifyOptions],
],
};
export default config;

View File

@@ -0,0 +1,28 @@
---
import {getCollection} from "astro:content";
const emoticons = (await getCollection("emoticons")).toSorted(
(a, b) => a.data.order - b.data.order,
);
---
<table>
<thead>
<tr>
<th>Emoticon</th>
<th>Emoji</th>
</tr>
</thead>
<tbody>
{emoticons.map((entry) => (
<tr>
<td>
<code>{entry.id}</code>
</td>
<td>
<img src={entry.data.image.src} alt={entry.data.emoji} class="emoji-big" />
</td>
</tr>
))}
</tbody>
</table>

View File

@@ -0,0 +1,41 @@
---
/* eslint-disable unicorn/better-dom-traversing */
import assert from "node:assert/strict";
import {fromHtml} from "hast-util-from-html";
import {toHtml} from "hast-util-to-html";
const tree = fromHtml(await Astro.slots.render("default"), {fragment: true});
const tree_with_removed_newlines = {
type: "root",
children: tree.children.filter((child) => {
if (child.type === "text" && child.value === "\n") {
return false;
}
return true;
}),
};
const first_element = tree_with_removed_newlines.children[0];
assert.ok(first_element?.type === "element" && ["ol", "ul"].includes(first_element.tagName));
const flattened = {
...first_element,
children: tree_with_removed_newlines.children.flatMap((other) => {
if (other.type === "comment") {
return [];
}
assert.ok(other.type === "element");
// Flatten only in case of matching tagName, for the rest, we
// return the elements without flattening since asides, code
// blocks and other elements can be part of a single list item
// and we do not want to flatten them.
if (other.tagName === first_element.tagName) {
return other.children;
}
return [other];
}),
};
---
<Fragment set:html={toHtml(flattened)} />

View File

@@ -0,0 +1,11 @@
---
import {Steps} from "@astrojs/starlight/components";
import FlattenedList from "./FlattenedList.astro";
---
<Steps>
<FlattenedList>
<slot />
</FlattenedList>
</Steps>

View File

@@ -0,0 +1,29 @@
---
import {CORPORATE_ENABLED, SUPPORT_EMAIL} from "astro:env/client";
---
<footer class="sl-flex">
<hr />
{CORPORATE_ENABLED ? (
<p>
Your feedback helps us make Zulip better for everyone! Please{" "}
<a href="/help/contact-support">contact us</a> with questions, suggestions, and feature
requests.
</p>
) : (
<p>
Don't see an answer to your question?{" "}
<a href={`mailto:${SUPPORT_EMAIL}`}>Contact this Zulip server's administrators</a> for
support.
</p>
)}
</footer>
<style>
@layer starlight.core {
footer {
flex-direction: column;
gap: 1.5rem;
}
}
</style>

View File

@@ -0,0 +1,8 @@
---
import Default from "@astrojs/starlight/components/Head.astro";
---
<script src="../scripts/client/adjust_mac_kbd_tags.ts"></script>
<Default>
<slot />
</Default>

View File

@@ -0,0 +1,45 @@
---
/* eslint-disable unicorn/better-dom-traversing */
import assert from "node:assert/strict";
import type {Element} from "hast";
import {fromHtml} from "hast-util-from-html";
import {toHtml} from "hast-util-to-html";
import keyboard_svg from "../../../web/icons/keyboard.svg?raw";
const keyboard_icon_fragment = fromHtml(keyboard_svg, {fragment: true});
const keyboard_icon_first_child = keyboard_icon_fragment.children[0]!;
assert.ok(
keyboard_icon_first_child.type === "element" && keyboard_icon_first_child.tagName === "svg",
);
keyboard_icon_first_child.properties.class = "zulip-unplugin-icon";
// We want to add the `Keyboard tip: ` prefix without a line break or
// wrapping it in a paragraph. If we write `Keyboard tip: <slot />`,
// slot will be wrapped in it's own paragraph and thus will be placed on
// the next line as `Keyboard tip:`. We have to edit slot HTML tree
// directly instead to solve this. Same case applies for the keyboard
// icon we are inserting. We just inject the icon as raw svg.
const prefix_text_element: Element = {
type: "element",
tagName: "strong",
properties: {},
children: [{type: "text", value: " Keyboard tip: "}],
};
const prefix_element_list = [keyboard_icon_first_child, prefix_text_element];
const tree = fromHtml(await Astro.slots.render("default"), {fragment: true});
const first_element = tree.children[0];
assert.ok(first_element?.type === "element");
first_element.children = [...prefix_element_list, ...first_element.children];
tree.children[0] = first_element;
---
<aside aria-label="Keyboard tip" class="starlight-aside starlight-aside--tip keyboard-tip">
<div class="starlight-aside__content">
<Fragment set:html={toHtml(tree)} />
</div>
</aside>

View File

@@ -0,0 +1,17 @@
---
import RelativeSteps from "./RelativeSteps.astro";
import SettingsSteps from "./SettingsSteps.astro";
const {target} = Astro.props;
const [navigation_link_type, ...parts] = target.split("/");
if (navigation_link_type !== "settings" && navigation_link_type !== "relative") {
throw new Error("Invalid navigation link type. Only `settings` or `relative` is allowed.");
}
---
{navigation_link_type === "settings" ? (
<SettingsSteps setting_key={parts[0]} />
) : (
<RelativeSteps link_type={parts[0]} key={parts[1]} />
)}

View File

@@ -0,0 +1,215 @@
---
import {CORPORATE_ENABLED, SHOW_RELATIVE_LINKS} from "astro:env/client";
/* eslint-disable import-x/extensions */
import BarChartIcon from "~icons/zulip-icon/bar-chart";
import BuildingIcon from "~icons/zulip-icon/building";
import CreditCardIcon from "~icons/zulip-icon/credit-card";
import EditIcon from "~icons/zulip-icon/edit";
import GearIcon from "~icons/zulip-icon/gear";
import GitPullRequestIcon from "~icons/zulip-icon/git-pull-request";
import HashIcon from "~icons/zulip-icon/hash";
import HelpIcon from "~icons/zulip-icon/help";
import InfoIcon from "~icons/zulip-icon/info";
import KeyboardIcon from "~icons/zulip-icon/keyboard";
import ManageSearchIcon from "~icons/zulip-icon/manage-search";
import RocketIcon from "~icons/zulip-icon/rocket";
import ToolIcon from "~icons/zulip-icon/tool";
import UserGroupCogIcon from "~icons/zulip-icon/user-group-cog";
/* eslint-enable import-x/extensions */
type Props = {
link_type: string;
key: string;
};
const SHOW_BILLING_HELP_LINKS = CORPORATE_ENABLED;
type RelativeLinkInfo = {
label: string;
relative_link: string;
icon?: unknown;
};
type RelativeLinkMapping = Record<
string,
{
data: Record<string, RelativeLinkInfo>;
template: (item: unknown) => unknown;
is_link_relative: () => boolean;
}
>;
const {link_type, key} = Astro.props;
---
{(() => {
const default_template_for_relative_links = (item: unknown) => (
<ol>
<li>
Click on the <strong>gear</strong> (<GearIcon />) icon in the upper right corner of
the web or desktop app.
</li>
<li class="navigation-step-relative-type">Select {item}.</li>
</ol>
);
const relative_link_mapping: RelativeLinkMapping = {
gear: {
data: {
"channel-settings": {
label: "Channel settings",
relative_link: "/#channels/subscribed",
icon: <HashIcon />,
},
settings: {
label: "Personal Settings",
relative_link: "/#settings/profile",
icon: <ToolIcon />,
},
"organization-settings": {
label: "Organization settings",
relative_link: "/#organization/organization-profile",
icon: <BuildingIcon />,
},
"group-settings": {
label: "Group settings",
relative_link: "/#groups/your",
icon: <UserGroupCogIcon />,
},
stats: {
label: "Usage statistics",
relative_link: "/stats",
icon: <BarChartIcon />,
},
integrations: {
label: "Integrations",
relative_link: "/integrations/",
icon: <GitPullRequestIcon />,
},
"about-zulip": {
label: "About Zulip",
relative_link: "/#about-zulip",
},
},
template: default_template_for_relative_links,
is_link_relative: () => SHOW_RELATIVE_LINKS,
},
"gear-billing": {
data: {
plans: {
label: "Plans and pricing",
relative_link: "/plans/",
icon: <RocketIcon />,
},
billing: {
label: "Billing",
relative_link: "/billing/",
icon: <CreditCardIcon />,
},
},
template: default_template_for_relative_links,
is_link_relative: () => SHOW_RELATIVE_LINKS && SHOW_BILLING_HELP_LINKS,
},
help: {
data: {
"keyboard-shortcuts": {
label: "Keyboard shortcuts",
relative_link: "/#keyboard-shortcuts",
icon: <KeyboardIcon />,
},
"message-formatting": {
label: "Message formatting",
relative_link: "/#message-formatting",
icon: <EditIcon />,
},
"search-filters": {
label: "Search filters",
relative_link: "/#search-operators",
icon: <ManageSearchIcon />,
},
"about-zulip": {
label: "About Zulip",
relative_link: "/#about-zulip",
icon: <InfoIcon />,
},
},
template: (item: unknown) => (
<ol>
<li>
Click on the <strong>help menu</strong> (<HelpIcon />) icon in the upper
right corner of the app.
</li>
<li class="navigation-step-relative-type">Select {item}.</li>
</ol>
),
is_link_relative: () => SHOW_RELATIVE_LINKS,
},
channel: {
data: {
all: {
label: "All",
relative_link: "/#channels/all",
},
available: {
label: "Available",
relative_link: "/#channels/available",
},
},
template: (item: unknown) => (
<ol>
<li>
Click on the <strong>gear</strong> (<GearIcon />) icon in the upper right
corner of the web or desktop app.
</li>
<li>
Select <HashIcon /> <strong>Channel settings</strong>.
</li>
<li>Click {item} in the upper left.</li>
</ol>
),
is_link_relative: () => SHOW_RELATIVE_LINKS,
},
group: {
data: {
all: {
label: "All groups",
relative_link: "/#groups/all",
},
roles: {
label: "Roles",
relative_link: "/#groups/roles",
},
},
template: (item: unknown) => (
<ol>
<li>
Click on the <strong>gear</strong> (<GearIcon />) icon in the upper right
corner of the web or desktop app.
</li>
<li>
Select <UserGroupCogIcon /> <strong>Group settings</strong>.
</li>
<li>Click {item} in the upper left.</li>
</ol>
),
is_link_relative: () => SHOW_RELATIVE_LINKS,
},
};
const {data, template, is_link_relative} = relative_link_mapping[link_type]!;
const {label, relative_link, icon} = data[key]!;
const formattedItem = is_link_relative() ? (
<a href={relative_link}>
{icon}
{label}
</a>
) : (
<strong>
{icon}
{label}
</strong>
);
return template(formattedItem);
})()}

View File

@@ -0,0 +1,202 @@
---
import {SHOW_RELATIVE_LINKS} from "astro:env/client";
/* eslint-disable import-x/extensions */
import BuildingIcon from "~icons/zulip-icon/building";
import GearIcon from "~icons/zulip-icon/gear";
import ToolIcon from "~icons/zulip-icon/tool";
/* eslint-enable import-x/extensions */
const PERSONAL_SETTINGS_TYPE = "Personal settings";
const ORGANIZATION_SETTINGS_TYPE = "Organization settings";
// This list has been transformed one-off from `help_settings_links.py`, we
// have added a comment in that file to update this list in case of any
// changes.
const setting_link_mapping: Record<
string,
{
setting_type: string;
setting_name: string;
setting_link: string;
}
> = {
// a mapping from the setting target that is the same as the final URL
// breadcrumb to that setting to the name of its setting type, the setting
// name as it appears in the user interface, and a relative link that can
// be used to get to that setting
profile: {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Profile",
setting_link: "/#settings/profile",
},
"account-and-privacy": {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Account & privacy",
setting_link: "/#settings/account-and-privacy",
},
preferences: {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Preferences",
setting_link: "/#settings/preferences",
},
notifications: {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Notifications",
setting_link: "/#settings/notifications",
},
"your-bots": {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Bots",
setting_link: "/#settings/your-bots",
},
"alert-words": {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Alert words",
setting_link: "/#settings/alert-words",
},
"uploaded-files": {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Uploaded files",
setting_link: "/#settings/uploaded-files",
},
topics: {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Topics",
setting_link: "/#settings/topics",
},
"muted-users": {
setting_type: PERSONAL_SETTINGS_TYPE,
setting_name: "Muted users",
setting_link: "/#settings/muted-users",
},
"organization-profile": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Organization profile",
setting_link: "/#organization/organization-profile",
},
"organization-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Organization settings",
setting_link: "/#organization/organization-settings",
},
"organization-permissions": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Organization permissions",
setting_link: "/#organization/organization-permissions",
},
"default-user-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Default user settings",
setting_link: "/#organization/organization-level-user-defaults",
},
"emoji-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Custom emoji",
setting_link: "/#organization/emoji-settings",
},
"auth-methods": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Authentication methods",
setting_link: "/#organization/auth-methods",
},
users: {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Users",
setting_link: "/#organization/users/active",
},
imported: {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Users",
setting_link: "/#organization/users/imported",
},
deactivated: {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Users",
setting_link: "/#organization/users/deactivated",
},
invitations: {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Users",
setting_link: "/#organization/users/invitations",
},
bots: {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Bots",
setting_link: "/#organization/bots",
},
"default-channels-list": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Default channels",
setting_link: "/#organization/default-channels-list",
},
"linkifier-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Linkifiers",
setting_link: "/#organization/linkifier-settings",
},
"playground-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Code playgrounds",
setting_link: "/#organization/playground-settings",
},
"profile-field-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Custom profile fields",
setting_link: "/#organization/profile-field-settings",
},
"channel-folder-settings": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Channel folders",
setting_link: "/#organization/channel-folders",
},
"data-exports-admin": {
setting_type: ORGANIZATION_SETTINGS_TYPE,
setting_name: "Data exports",
setting_link: "/#organization/data-exports-admin",
},
};
const {setting_key} = Astro.props;
const {setting_type, setting_name, setting_link} = setting_link_mapping[setting_key]!;
---
<ol>
{SHOW_RELATIVE_LINKS ? (
// The "Bots" label appears in both Personal and
// Organization settings in the user interface, so we need special
// text for this setting.
// As for the case of "Users", it refers to the Users tab in
// organization settings. Since the users tab has multiple sub tabs
// like active, deactivated etc., we need a way to point to them.
setting_name === "Bots" || setting_name === "Users" ? (
<li>
Navigate to the <a href={setting_link}>{setting_name}</a> tab of the{" "}
<b>{setting_type}</b> menu.
</li>
) : (
<li>
Go to <a href={setting_link}>{setting_name}</a>.
</li>
)
) : (
<>
<li>
Click on the <b>gear</b> (<GearIcon />) icon in the upper right corner of the web or
desktop app.
</li>
<li>
Select{" "}
<b>
{setting_type === ORGANIZATION_SETTINGS_TYPE ? <BuildingIcon /> : <ToolIcon />}{" "}
{setting_type}
</b>
.
</li>
<li>
On the left, click <b>{setting_name}</b>.
</li>
</>
)}
</ol>

View File

@@ -0,0 +1,25 @@
---
import DefaultSidebar from "@astrojs/starlight/components/Sidebar.astro";
---
<DefaultSidebar />
<script is:inline>
const scrollSelectedItemIntoView = () => {
const sidebar = document.getElementById("starlight__sidebar");
const selectedItem = sidebar?.querySelector('[aria-current="page"]');
if (!sidebar || !(selectedItem instanceof HTMLElement)) return;
const sidebarRect = sidebar.getBoundingClientRect();
const selectedItemRect = selectedItem.getBoundingClientRect();
const isVisible =
selectedItemRect.top >= sidebarRect.top &&
selectedItemRect.bottom <= sidebarRect.bottom;
if (!isVisible) {
selectedItem.scrollIntoView({block: "center"});
}
};
scrollSelectedItemIntoView();
</script>

View File

@@ -0,0 +1,11 @@
<!--
We wanted to have our note without a header that is the ⓘ followed by a title.
We can make the title disappear by making the title a single space: " ".
The default aside component provided by starlight will always have an icon however.
That is why we needed this custom components.
-->
<aside aria-label="Note" class="starlight-aside starlight-aside--note">
<div class="starlight-aside__content">
<slot />
</div>
</aside>

View File

@@ -0,0 +1,65 @@
---
/* eslint-disable unicorn/better-dom-traversing */
import assert from "node:assert/strict";
import type {Element} from "hast";
import {fromHtml} from "hast-util-from-html";
import {toHtml} from "hast-util-to-html";
import lightbulb_svg from "../../../web/icons/lightbulb.svg?raw";
const lightbulb_icon_fragment = fromHtml(lightbulb_svg, {fragment: true});
const lightbulb_icon_first_child = lightbulb_icon_fragment.children[0]!;
assert.ok(
lightbulb_icon_first_child.type === "element" && lightbulb_icon_first_child.tagName === "svg",
);
lightbulb_icon_first_child.properties.class = "zulip-unplugin-icon aside-icon-lightbulb";
// We want to add the `Tip: ` prefix without a line break or wrapping
// it in a paragraph. If we write `Tip: <slot />`, slot will be wrapped
// in it's own paragraph and thus will be placed on the next line as
// `Tip:`. We have to edit slot HTML tree directly instead to solve this.
// Same case applies for the ligthbulb icon we are inserting. We just
// inject the icon as raw svg.
const prefix_text_element: Element = {
type: "element",
tagName: "strong",
properties: {},
children: [
{
type: "text",
// Whitespace before the text to ensure space between
// this text and the preceding icon.
value: " Tip: ",
},
],
};
let prefix_element_list = [lightbulb_icon_first_child, prefix_text_element];
const tree = fromHtml(await Astro.slots.render("default"), {fragment: true});
const first_element = tree.children[0];
assert.ok(first_element?.type === "element");
// This is currently happening only in one case, for _ImportSelfHostedServerTips.mdx
// where the tip contains an unordered list. Just placing the element as is without
// a paragraph does not look good in that case.
if (first_element.tagName !== "p") {
const paragraph_wrapping_element: Element = {
type: "element",
tagName: "p",
properties: {},
children: [...prefix_element_list],
};
prefix_element_list = [paragraph_wrapping_element];
}
first_element.children = [...prefix_element_list, ...first_element.children];
tree.children[0] = first_element;
---
<aside aria-label="Tip" class="starlight-aside starlight-aside--tip">
<div class="starlight-aside__content">
<Fragment set:html={toHtml(tree)} />
</div>
</aside>

View File

@@ -0,0 +1,27 @@
import {docsLoader} from "@astrojs/starlight/loaders";
import {docsSchema} from "@astrojs/starlight/schema";
import {z} from "astro/zod";
import {defineCollection} from "astro:content";
import EmojiCodes from "../../static/generated/emoji/emoji_codes.json";
const emoticonConversions: Record<string, string> = EmojiCodes.emoticon_conversions;
const nameToCodePoint: Record<string, string> = EmojiCodes.name_to_codepoint;
// Using image() in the schema means Astro bundles only the few emoji used for
// emoticons, rather than the thousands import.meta.glob would copy.
const emoticons = defineCollection({
loader: () =>
Object.entries(emoticonConversions).map(([emoticon, emoji], order) => ({
id: emoticon,
order,
emoji,
image: `../../static/generated/emoji/images-google-64/${nameToCodePoint[emoji.slice(1, -1)]}.png`,
})),
schema: ({image}) => z.object({order: z.int(), emoji: z.string(), image: image()}),
});
export const collections = {
docs: defineCollection({loader: docsLoader(), schema: docsSchema()}),
emoticons,
};

View File

@@ -0,0 +1,59 @@
---
title: Add a bot or integration
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
By default, anyone other than guests can add a bot to a Zulip organization.
A bot that sends content to or from another product is often called an
[integration](/help/integrations-overview).
Organization administrators can also
[restrict bot creation](/help/restrict-bot-creation). Any bot that is added
is visible and available for anyone to use.
## Add a bot or integration
<Tabs>
<TabItem label="Your bots">
<FlattenedSteps>
<NavigationSteps target="settings/your-bots" />
1. Click **Add a new bot**.
1. Fill out the fields, and click **Add**.
</FlattenedSteps>
</TabItem>
<TabItem label="All bots">
<FlattenedSteps>
<NavigationSteps target="settings/bots" />
1. Click **Add a new bot**.
1. Fill out the fields, and click **Add**.
</FlattenedSteps>
</TabItem>
</Tabs>
<ZulipNote>
See [bots overview](/help/bots-overview) for more information about
the various fields.
Nearly all third-party integrations should use **Incoming webhook**
as the **bot type**.
</ZulipNote>
Depending on the type of bot you're creating, you may need to download its
[`zuliprc` configuration file](/help/manage-a-bot#download-zuliprc-configuration-file).
## Related articles
* [Bots overview](/help/bots-overview)
* [Integrations overview](/help/integrations-overview)
* [Manage a bot](/help/manage-a-bot)
* [Deactivate or reactivate a bot](/help/deactivate-or-reactivate-a-bot)
* [Restrict bot creation](/help/restrict-bot-creation)
* [View all bots in your organization](/help/view-all-bots-in-your-organization)
* [Generate URL for an integration](/help/generate-integration-url)

View File

@@ -0,0 +1,245 @@
---
title: Add a custom linkifier
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import EditIcon from "~icons/zulip-icon/edit";
import ExternalLinkIcon from "~icons/zulip-icon/external-link";
import TrashIcon from "~icons/zulip-icon/trash";
<AdminOnly />
Linkifiers make it easy to refer to issues or tickets in third
party issue trackers, like GitHub, Salesforce, Zendesk, and others.
For instance, you can add a linkifier that automatically turns `#2468`
into a link to `https://github.com/zulip/zulip/issues/2468`.
You can configure linkifiers to work in reverse as well: when you paste a URL
that matches the linkifier into the compose box, Zulip will automatically
convert it to linked text (e.g., `https://github.com/zulip/zulip/issues/2468`
becomes `#2468`).
If a linkifier pattern (e.g., `#2468`) appears in the name of a topic, Zulip adds
an **open** (<ExternalLinkIcon />) button to the right of the topic in the
message recipient bar that links to the appropriate URL.
If you have any trouble creating the linkifiers you want, please [contact Zulip
support](/help/contact-support) with details on what you're trying to do.
## Add a custom linkifier
All linkifiers automatically turn text matching the specified pattern into
links. You can also configure pasted links matching the **URL template** to
automatically convert to linked text.
<FlattenedSteps>
<NavigationSteps target="settings/linkifier-settings" />
1. Click **Add linkifier**.
1. Enter the **Example text to linkify**, and the **Pattern** that will match
it and similar text.
1. Enter the **URL template** for where text matching the pattern should link.
1. *(optional)* To enable automatic conversion of pasted URLs to linked text,
fill in **Auto-convert pasted URLs matching the template to**.
1. Click **Add**.
<ZulipTip>
Use the same variables in the **Pattern**, **URL template**, and
**Auto-convert pasted URLs matching the template to** fields.
</ZulipTip>
</FlattenedSteps>
## Edit a custom linkifier
<FlattenedSteps>
<NavigationSteps target="settings/linkifier-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the linkifier you want to edit.
1. Edit linkifier information as desired, and click **Save changes**.
</FlattenedSteps>
## Delete a custom linkifier
<FlattenedSteps>
<NavigationSteps target="settings/linkifier-settings" />
1. In the **Actions** column, click the **delete** (<TrashIcon />)
icon for the linkifier you want to delete.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## Reorder linkifiers
Linkifiers are processed in order, and will not apply to text that
is already linkified. You can therefore choose which linkifiers to prioritize
when more than one linkifier applies. The same priority order applies for
converting URLs to shortened links. See the
[overlapping patterns section](#overlapping-patterns) for examples.
<FlattenedSteps>
<NavigationSteps target="settings/linkifier-settings" />
1. In the **Example** column, click and drag the vertical
dots to reorder the list of linkifiers.
</FlattenedSteps>
## Common linkifier patterns
The following examples cover the most common types of linkifiers, with a focus
on linkifiers for issues or tickets.
### Link to an issue or ticket
This is a pattern that turns a `#` followed by a number into a link. It is often
used to link to issues or tickets in third party issue trackers, like GitHub,
Salesforce, Zendesk, and others.
* Example text to linkify: `#2468`
* Pattern: `#(?P<id>[0-9]+)`
* URL template: `https://github.com/zulip/zulip/issues/{id}`
* Auto-convert pasted URLs matching the template to: `#{id}`
* Automatically links to: `https://github.com/zulip/zulip/issues/2468`
### Link to issues or tickets in multiple projects or apps
To set up linkifiers for issues or tickets in multiple projects,
consider extending the `#2468` format with project-specific
variants. For example, the Zulip development community
[uses](https://zulip.com/development-community/#linking-to-github-issues-and-pull-requests)
`#M2468` for an issue in the repository for the Zulip mobile app,
`#D2468` and issue in the desktop app repository, etc.
* Example text to linkify: `#F245`
* Pattern: `#F(?P<id>[0-9]+)`
* URL template: `https://github.com/zulip/zulip-flutter/issues/{id}`
* Auto-convert pasted URLs matching the template to: `#F{id}`
* Automatically links to: `https://github.com/zulip/zulip-flutter/issues/245`
### Link to issues or tickets in multiple repositories
For organizations that commonly link to multiple GitHub repositories, this
linkfier pattern turns `org/repo#ID` into an issue or pull request link.
* Example text to linkify: `zulip/zulip#2468`
* Pattern: `(?P<org>[a-zA-Z0-9_-]+)/(?P<repo>[a-zA-Z0-9_-]+)#(?P<id>[0-9]+)`
* URL template: `https://github.com/{org}/{repo}/issues/{id}`
* Auto-convert pasted URLs matching the template to: `{org}/{repo}#{id}`
* Automatically links to: `https://github.com/zulip/zulip/issues/2468`
### Link to a hexadecimal issue or ticket number
The following pattern linkfies a string of hexadecimal digits between 7 and 40
characters long, such as a Git commit ID.
* Example text to linkify: `abdc123`
* Pattern: `(?P<id>[0-9a-f]{7,40})`
* URL template: `https://github.com/zulip/zulip/commit/{id}`
* Auto-convert pasted URLs matching the template to: `{id}`
* Automatically links to: `https://github.com/zulip/zulip/commit/abcd123`
## Advanced linkifier patterns
Linkifiers are a flexible system that can be used to construct rules for a wide
variety of situations. Linkifier patterns are regular expressions, using the
[re2](https://github.com/google/re2/wiki/Syntax) regular expression
engine.
Linkifiers use [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.html) compliant
URL templates to describe how links should be generated. These templates support
several expression types. The default expression type (`{var}`) will URL-encode
special characters like `/` and `&`; this behavior is desired for the vast
majority of linkifiers. Fancier URL template expression types can allow you to
get the exact behavior you want in corner cases like optional URL query
parameters. For example:
* Use `{+var}` when you want URL delimiter characters to not be URL-encoded.
* Use `{?var}` and `{&var}` for variables in URL query parameters.
* Use `{#var}` when generating `#` fragments in URLs.
The URL template specification has [brief
examples](https://www.rfc-editor.org/rfc/rfc6570.html#section-1.2) and [detailed
examples](https://www.rfc-editor.org/rfc/rfc6570.html#section-3.2) explaining
the precise behavior of URL templates.
### Linking to documentation pages
This example pattern is a shorthand for linking to pages on Zulip's ReadTheDocs
site.
* Example text to linkify: `RTD/overview/changelog.html`
* Pattern: `RTD/(?P<article>[a-zA-Z0-9_/.#-]+)`
* URL template: `https://zulip.readthedocs.io/en/latest/{+article}`
* Auto-convert pasted URLs matching the template to: `RTD/{article}`
* Automatically links to: `https://zulip.readthedocs.io/en/latest/overview/changelog.html`
<ZulipTip>
This pattern uses the `{+var}` expression type. With the
default expression type (`{article}`), the `/` between `overview` and
`changelog` would incorrectly be URL-encoded.
</ZulipTip>
### Linking to Google search results
This example pattern allows linking to Google searches.
* Pattern: `google:(?P<q>\w+)?`
* URL template: `https://google.com/search{?q}`
* Original text: `google:foo` or `google:`
* Automatically links to: `https://google.com/search?q=foo` or `https://google.com/search`
<ZulipTip>
This pattern uses the `{?var}` expression type. With the default expression
type (`{q}`), there would be no way to only include the `?` in the URL
if the optional `q` is present.
</ZulipTip>
### Overlapping patterns
This example shows how specific linkifiers can be combined with more general
ones to offer succinct linked text for the most commonly referenced links. For
example, if you could have:
* A specific linkifier for the `zulip/zulip` GitHub repository, so that `#123`
links to an issue or pull request in that repository.
* A general linkifier for all GitHub repositories.
You would set that up with:
* Specific linkifier (ordered before the general linkifier)
* Example text to linkify: `#123`
* Pattern: `#(?P<id>[0-9]+)`
* URL template: `https://github.com/zulip/zulip/pull/{id}`
* Auto-convert pasted URLs matching the template to: `#{id}`
* General linkifier
* Example text to linkify: `org/repo#123`
* Pattern: `(?P<org>[a-zA-Z0-9_-]+)/(?P<repo>[a-zA-Z0-9_-]+)#(?P<id>[0-9]+)`
* URL template: `https://github.com/{org}/{repo}/pull/{id}`
* Auto-convert pasted URLs matching the template to: `{org}/{repo}#{id}`
With the specific linkifier ordered first, when both linkifiers match, the
specific linkifier will take precedence:
* Original text: `#123`
* Automatically links to: `https://github.com/zulip/zulip/pull/123`
* Pasting `https://github.com/zulip/zulip/pull/123` auto-converts to: `#123`
When only the general linkifier matches:
* Original text: `django/django#123`
* Automatically links to: `https://github.com/django/django/pull/123`
* Pasting `https://github.com/django/django/pull/123` auto-converts to: `django/django#123`
<ZulipTip>
This set of patterns has overlapping regular expressions and URL
templates. The specific linkifier will only get prioritized over
the general linkifier if it is ordered before the more general
pattern. The same priority order applies when auto-converting
pasted URLs. This can be customized by dragging and dropping
existing linkifiers into the desired order. New linkifiers will
automatically be ordered last.
</ZulipTip>

View File

@@ -0,0 +1,21 @@
---
title: Usage statistics
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
Zulip provides detailed analytics to help you see how you and your team are
using Zulip. The **Organization summary** section of the usage statistics page
includes your organization's overall usage information such as the total number
of users, guests, messages, and storage in use.
You will also find interactive graphs that provide a detailed breakdown of
your organization's number of active users, messages sent, messages received,
and how these statistics have changed over time.
## View organization statistics
<FlattenedSteps>
<NavigationSteps target="relative/gear/stats" />
</FlattenedSteps>

View File

@@ -0,0 +1,104 @@
---
title: Animated GIFs
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import StartComposing from "../include/_StartComposing.mdx";
import GifIcon from "~icons/zulip-icon/gif";
<ZulipNote>
On self-hosted servers, the GIF picker needs to be
[configured][configure-gifs] by a server administrator. You can choose between
[GIPHY](https://giphy.com), [Tenor](https://tenor.com/) and [KLIPY](https://klipy.com)
as your GIF provider.
</ZulipNote>
Zulip makes it easy to find animated GIFs and use them in your messages, if the
GIF picker is [enabled](#disable-the-gif-picker) in your organization.
You can
[customize](/help/image-video-and-website-previews#configure-how-animated-images-are-played)
how animated images are played in messages you receive. Administrators can
[configure the
size](/help/image-video-and-website-previews#configure-image-and-video-thumbnail-size)
of GIFs and other images in the message feed.
## Insert a GIF
<Tabs>
<TabItem label="Desktop/Web">
<Steps>
1. Click the **add GIF** (<GifIcon />) icon at
the bottom of the compose box.
1. Find a GIF you'd like to use.
1. Click on an image to insert it in the compose box.
</Steps>
<ZulipTip>
You can [preview your message](/help/preview-your-message-before-sending)
before sending.
</ZulipTip>
</TabItem>
</Tabs>
If previews of linked images are
[disabled](/help/image-video-and-website-previews#configure-whether-previews-of-linked-images-and-videos-are-shown)
in your organization, the GIF will appear as a link, rather than an image.
## Configure maximum GIFs rating
<AdminOnly />
You can configure the maximum rating of GIFs shown in the GIF picker, which by
default is set to GIFs rated **G (General audience)**.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Compose settings**, select a rating for **GIF picker**.
<SaveChanges />
</FlattenedSteps>
## Disable the GIF picker
<AdminOnly />
Disabling the GIF picker removes it from the compose box.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Compose settings**, set **GIF picker** to **Disabled**.
<SaveChanges />
</FlattenedSteps>
## Privacy
Zulip’s GIF picker uses a third-party service to provide GIFs
([Tenor](https://tenor.com/) for Zulip Cloud). Any text you enter into the GIF
search box will be sent from your browser directly to the corresponding
service’s API. Because these requests are made client-side, the service you are
querying (Tenor, GIPHY or KLIPY) will be able to see your IP address and may use that
data for tracking, similar to if you visited their website and performed the
same search there.
Zulip proxies all external images in messages through the server, including
GIFs. This prevents images from being used to track recipients.
[configure-gifs]: https://zulip.readthedocs.io/en/latest/production/gif-picker-integrations.html
## Related articles
* [Image, video and website previews](/help/image-video-and-website-previews)
* [Share and upload files](/help/share-and-upload-files)
* [Insert a link](/help/insert-a-link)

View File

@@ -0,0 +1,109 @@
---
title: Archive a channel
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SelectChannelViewGeneral from "../include/_SelectChannelViewGeneral.mdx";
import ArchiveIcon from "~icons/zulip-icon/archive";
import MoreVerticalIcon from "~icons/zulip-icon/more-vertical";
import UnarchiveIcon from "~icons/zulip-icon/unarchive";
You can archive channels you no longer plan to use. Archiving a channel:
* Removes it from the left sidebar for all users.
* Prevents new messages from being sent to the channel.
* Prevents messages in the channel from being edited, deleted, or moved.
Archiving a channel does not unsubscribe users, or change who can access it.
Messages in archived channels still appear in [search
results](/help/search-for-messages), the [combined feed](/help/combined-feed),
and [recent conversations](/help/recent-conversations). If you prefer, you can
configure an archived channel to [hide its
content](#hide-content-in-an-archived-channel).
## Archive a channel
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
1. Click the **archive** (<ArchiveIcon />) icon
in the upper right corner of the channel settings panel.
1. Click **Confirm**.
</FlattenedSteps>
<ChannelSettingsNavbarTip />
</TabItem>
</Tabs>
## View archived channels
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select **Archived channels** from the dropdown next to the **Filter** box
above the list of channels.
</FlattenedSteps>
</TabItem>
</Tabs>
## Hide content in an archived channel
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select **Archived channels** from the dropdown next to the **Filter** box
above the list of channels.
1. Select a channel.
1. Select the **Subscribers** tab on the right.
1. Remove all subscribers.
<SelectChannelViewGeneral />
1. Under **Channel permissions**, [make the channel
private](/help/change-the-privacy-of-a-channel).
1. Click **Advanced configuration** to view advanced configuration options.
1. Under **Subscription permissions**, remove everyone from **Who can subscribe
to this channel**, and **Who can subscribe anyone to this channel**. These
permissions give users content access to the channel.
</FlattenedSteps>
</TabItem>
</Tabs>
You can also make these configuration changes prior to archiving a channel.
## Unarchive a channel
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select **Archived channels** from the dropdown in the upper left.
1. Select a channel.
1. Click the **unarchive** (<UnarchiveIcon />)
icon in the upper right corner of the channel settings panel.
1. Click **Confirm**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Edit a message](/help/edit-a-message)
* [Delete a message](/help/delete-a-message)
* [Delete a topic](/help/delete-a-topic)
* [Message retention policy](/help/message-retention-policy)
* [Channel permissions](/help/channel-permissions)

View File

@@ -0,0 +1,101 @@
---
title: Bots overview
---
Bots allow you to
* Send content into and out of Zulip.
* Send content to and from another product.
* Automate tasks a human user could do.
A bot that sends content to or from another product is often called an
[integration](/help/integrations-overview).
## Pre-made bots
Zulip natively supports integrations with over one hundred products, and with
almost a thousand more through Zapier and IFTTT. If you're looking to add an
integration with an existing product, see our
[list of integrations](/integrations/), along with those of
[Zapier](https://zapier.com/apps) and [IFTTT](https://ifttt.com/search).
## Anatomy of a bot
You can think of a bot as a special kind of user, with limited permissions.
Each bot has a **name**, **profile picture**, **email**, **bot type** and **API key**.
* The **name** and **profile picture** play the same role they do for human users. They
are the most visible attributes of a bot.
* The **email** is used for [HTTP Basic authentication](/api/http-headers).
* The **bot type** determines what the bot can and can't do (see below).
* The **API key** is how the bot identifies itself to Zulip. Anyone with the
bot's API key can impersonate the bot.
## Bot type
The **bot type** determines what the bot can do.
| Bot type | Permissions | Common uses |
| ---------------- | ------------------------------------------------------------------ | --------------------------------------------------------------- |
| Generic | Like a normal user account | Automating tasks, bots that listen to all messages on a channel |
| Incoming webhook | Limited to only sending messages into Zulip | Automated notifications into Zulip |
| Outgoing webhook | Generic bot that also receives new messages via HTTP post requests | Third party integrations, most custom bots |
A **generic** bot acts like a normal Zulip user that can only access Zulip via
the API. There's a handful of actions bots can't take, including creating other
bots.
An **outgoing webhook** bot can read direct messages where the bot
is a participant, and channel messages where the bot is
[mentioned](/help/mention-a-user-or-group). When the bot is DM'd or
mentioned, it POSTs the message content to a URL of your choice. The
POST request format can be in a Zulip format or a Slack-compatible
format. This is the preferred bot type for interactive bots built on
top of Zulip Botserver.
Use the most limited bot type that supports your integration. Anyone with the
bot's API key can do anything the bot can, so giving bots unnecessary
permissions can expose your organization to unnecessary risk.
## Channel permissions for bots
Bots can be subscribed to channels, and assigned [channel
permissions](/help/channel-permissions) just like human users. In private
channels with protected history, a bot can only access messages sent after it
was subscribed to the channel.
Bots can send messages to any channel that their owner can, inheriting their
owner's [sending permissions](/help/channel-posting-policy). You can give a bot
channel management permissions, just like you would for a human user.
## Adding bots
By default, anyone other than guests can [add a bot](/help/add-a-bot-or-integration) to a
Zulip organization, but administrators can
[restrict bot creation](/help/restrict-bot-creation). Any bot that is added
is visible and available for anyone to use.
## Integrations that act on behalf of users
If you want an integration to impersonate you (e.g., write messages that come
from your Zulip account), use your [personal API key](/api/api-keys), rather
than a bot's API key. You won't need to create a bot.
If you need a bot to send messages on behalf of multiple users, ask [Zulip
support](mailto:support@zulip.com) or your server administrator to run the
`manage.py change_user_role can_forge_sender` command to give a bot
permission to send messages as users in your organization. Bots with the
`can_forge_sender` permission can also see the names of all channels,
including private channels. This is important for implementing integrations
like the Jabber and IRC mirrors.
## Related articles
* [Integrations overview](/help/integrations-overview)
* [Add a bot or integration](/help/add-a-bot-or-integration)
* [Manage a bot](/help/manage-a-bot)
* [Request an integration](/help/request-an-integration)
* [Deactivate or reactivate a bot](/help/deactivate-or-reactivate-a-bot)
* [Restrict bot creation](/help/restrict-bot-creation)
* [View all bots in your organization](/help/view-all-bots-in-your-organization)
* [Generate URL for an integration](/help/generate-integration-url)

View File

@@ -0,0 +1,60 @@
---
title: Bulleted lists
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import BulletedListsExamples from "../include/_BulletedListsExamples.mdx";
import BulletedListsIntro from "../include/_BulletedListsIntro.mdx";
import StartComposing from "../include/_StartComposing.mdx";
import UnorderedListIcon from "~icons/zulip-icon/unordered-list";
<BulletedListsIntro />
## Create a bulleted list
<Tabs>
<TabItem label="Via compose box button">
<FlattenedSteps>
<StartComposing />
1. *(optional)* Select the text you want to format.
1. Click the **bulleted list** (<UnorderedListIcon />) icon at the
bottom of the compose box to insert list formatting.
1. Press <kbd>Enter</kbd> to automatically add a new bullet to the list.
1. When your list is done, press <kbd>Enter</kbd> a second time to remove the
bullet.
</FlattenedSteps>
<ZulipTip>
You can also use the **bulleted list** (<UnorderedListIcon />) icon
to remove existing list formatting from the current line or selected text.
</ZulipTip>
</TabItem>
<TabItem label="Via Markdown">
<FlattenedSteps>
<StartComposing />
1. Type `*`, `-`, or `+` followed by a space and some text to start a bulleted
list.
1. Press <kbd>Enter</kbd> to automatically add a new bullet to the list.
1. When your list is done, press <kbd>Enter</kbd> a second time to remove the
bullet.
</FlattenedSteps>
</TabItem>
</Tabs>
## Examples
<BulletedListsExamples />
## Related articles
* [Message formatting](/help/format-your-message-using-markdown)
* [Preview messages before sending](/help/preview-your-message-before-sending)
* [Resize the compose box](/help/resize-the-compose-box)
* [Numbered lists](/help/numbered-lists)

View File

@@ -0,0 +1,57 @@
---
title: Change a user's name
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import ManageThisUser from "../include/_ManageThisUser.mdx";
import ManageUserTabTip from "../include/_ManageUserTabTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import UserCogIcon from "~icons/zulip-icon/user-cog";
<AdminOnly />
By default, users can [change their name](/help/change-your-name), though
organization administrators can
[restrict name changes](/help/restrict-name-and-email-changes).
Organization administrators can always change any user's name.
## Change a user's name
<Tabs>
<TabItem label="Via user profile">
<FlattenedSteps>
<ManageThisUser />
1. Under **Name**, enter a new name.
<SaveChanges />
</FlattenedSteps>
<ManageUserTabTip />
</TabItem>
<TabItem label="Via organization settings">
<FlattenedSteps>
<NavigationSteps target="settings/users" />
1. Find the user you would like to manage. Click the
**manage user** (<UserCogIcon />) icon
to the right of their name.
1. Under **Name**, enter a new name.
<SaveChanges />
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Change a user's role](/help/user-roles#change-a-users-role)
* [Deactivate or reactivate a user](/help/deactivate-or-reactivate-a-user)
* [Manage a user](/help/manage-a-user)

View File

@@ -0,0 +1,80 @@
---
title: Change organization URL
---
import {Steps} from "@astrojs/starlight/components";
import ZulipTip from "../../components/ZulipTip.astro";
import CloudPlusOnly from "../include/_CloudPlusOnly.mdx";
import OwnerOnly from "../include/_OwnerOnly.mdx";
<OwnerOnly />
Zulip supports changing the URL for an organization. Users who navigate to the
old URL in the browser will see a notice about the organization being moved,
prior to being redirected to the new URL. [Links to channels, topics and
messages](/help/link-to-a-message-or-conversation) will thus continue to work.
When you change the URL:
* All users will be logged out of the web, mobile and desktop apps.
* Any [API clients](/api/) or [integrations](/integrations/) will need
to be updated to point to the new organization URL.
<ZulipTip>
Consider using a [wildcard
mention](/help/mention-a-user-or-group#mention-everyone-on-a-channel)
in an announcement channel to let users know about an upcoming change.
</ZulipTip>
## Change your Zulip Cloud subdomain
Zulip Cloud organizations are generally hosted at `<subdomain>.zulipchat.com`,
with the subdomain chosen when the organization was created. Organization
[owners](/help/user-roles) can request to change the subdomain.
Please email [support@zulip.com](mailto:support@zulip.com) with the following
information:
<Steps>
1. Your organization's current subdomain.
1. The subdomain you would like to move your organization to.
1. Whether you want links to the old subdomain to redirect to the new one for an
extended period of time. By default, the old subdomain may be freed up for
reuse after 3 months.
</Steps>
## Move to a custom URL on Zulip Cloud
<CloudPlusOnly />
Because maintaining custom URLs requires effort from our operational team,
this feature is available only for organizations with 25+ [Zulip Cloud
Plus](https://zulip.com/plans/#cloud) licenses.
Please email [support@zulip.com](mailto:support@zulip.com) with the following
information:
<Steps>
1. Your organization's current URL.
1. The URL you would like to move your organization to.
</Steps>
## Change the URL for your self-hosted server
If you're self-hosting, you can change the root domain of your Zulip
server by changing the `EXTERNAL_HOST` [setting][zulip-settings]. If
you're [hosting multiple organizations][zulip-multiple-organizations]
and want to change the subdomain for one of them, you can do this
using the `change_realm_subdomain` [management command][management-commands].
In addition to configuring Zulip as detailed here, you also need to
generate [SSL certificates][ssl-certificates] for your new domain.
[ssl-certificates]: https://zulip.readthedocs.io/en/stable/production/ssl-certificates.html
[zulip-settings]: https://zulip.readthedocs.io/en/stable/production/settings.html
[zulip-multiple-organizations]: https://zulip.readthedocs.io/en/stable/production/multiple-organizations.html
[management-commands]: https://zulip.readthedocs.io/en/stable/production/management-commands.html#other-useful-manage-py-commands

View File

@@ -0,0 +1,70 @@
---
title: Change a channel's description
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewGeneral from "../include/_SelectChannelViewGeneral.mdx";
import EditIcon from "~icons/zulip-icon/edit";
Channel descriptions can be used to explain the purpose of a channel, and link
to usage guidelines, resources, or related channels. They appear in the
navigation bar at the top of the web and desktop apps when you view the channel.
You can hover over long channel descriptions with the mouse to view them in
full.
Channel descriptions support Zulip's standard [Markdown
formatting][markdown-formatting], with the exception that image previews are
disabled. Use Markdown formatting to include a link to a website, Zulip
[message][message-link], or [topic][topic-link] in the channel description:
`[link text](URL)`.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewGeneral />
1. Click the **edit channel name and description**
(<EditIcon />) icon to the right of the
channel name, and enter a new description.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/1102). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
## Related articles
* [Pin information](/help/pin-information)
* [View channel information](/help/view-channel-information)
* [Rename a channel](/help/rename-a-channel)
* [Markdown formatting][markdown-formatting]
* [Configure automated notices for channel events](/help/configure-automated-notices#channel-events)
* [Channel permissions](/help/channel-permissions)
[markdown-formatting]: /help/format-your-message-using-markdown
[message-link]: /help/link-to-a-message-or-conversation#get-a-link-to-a-specific-message
[topic-link]: /help/link-to-a-message-or-conversation#get-a-link-to-a-specific-topic

View File

@@ -0,0 +1,51 @@
---
title: Change the color of a channel
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ChannelActions from "../include/_ChannelActions.mdx";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SelectChannelViewPersonal from "../include/_SelectChannelViewPersonal.mdx";
Zulip assigns each of your channels a color when you subscribe to the
channel. Changing a channel's color does not change it for anyone else.
<Tabs>
<TabItem label="Via left sidebar">
<FlattenedSteps>
<ChannelActions />
1. Click **Change color**.
1. Select a color from the grid, use the color picker, or enter a hex code.
1. Click **Confirm** to save and apply the color change.
1. Click outside the box to close the menu.
</FlattenedSteps>
</TabItem>
<TabItem label="Via channel settings">
<FlattenedSteps>
<NavigationSteps target="relative/gear/channel-settings" />
1. Select a channel.
<SelectChannelViewPersonal />
1. Under **Personal settings**, click on the colored square below **Channel color**.
1. Select a color from the grid, use the color picker, or enter a hex code.
1. Click **Choose** to save and apply the color change.
</FlattenedSteps>
<ChannelSettingsNavbarTip />
</TabItem>
</Tabs>
## Related articles
* [Introduction to channels](/help/introduction-to-channels)
* [Channel folders](/help/channel-folders)
* [Pin a channel](/help/pin-a-channel)
* [Mute or unmute a channel](/help/mute-a-channel)
* [Hide or reveal inactive channels](/help/manage-inactive-channels)

View File

@@ -0,0 +1,63 @@
---
title: Change the privacy of a channel
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ChannelPrivacyTypes from "../include/_ChannelPrivacyTypes.mdx";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import ContentAccessDefinition from "../include/_ContentAccessDefinition.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
<ChannelPrivacyTypes />
Organization administrators and [channel
administrators](/help/configure-who-can-administer-a-channel) can always make a
channel private. However, they can only make a private channel public or
web-public if they have content access to it:
<ContentAccessDefinition />
<ZulipNote>
**Warning**: Be careful making a private channel public. All past messages
will become accessible, even if the channel previously had protected history.
</ZulipNote>
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Subscription permissions**, configure **Who can access this channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/1102). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
## Related articles
* [Channel permissions](/help/channel-permissions)
* [Channel posting policy](/help/channel-posting-policy)
* [Configure who can administer a channel](/help/configure-who-can-administer-a-channel)
* [Configure automated notices for channel events](/help/configure-automated-notices#channel-events)

View File

@@ -0,0 +1,18 @@
---
title: Change the time format
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
Based on your preference, Zulip can display times either in a 12-hour
format (e.g., 5:00 PM) or a 24-hour format (e.g., 17:00).
### Change the time format
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **General**, select your preferred option from the
**Time format** dropdown.
</FlattenedSteps>

View File

@@ -0,0 +1,29 @@
---
title: Change your email address
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import EditIcon from "~icons/zulip-icon/edit";
By default, anyone can change their email address at any time.
Organization administrators can
[restrict users to certain email domains](/help/restrict-account-creation#configuring-email-domain-restrictions), or
[prevent users from changing their email](/help/restrict-name-and-email-changes).
## Change your email address
<FlattenedSteps>
<NavigationSteps target="settings/account-and-privacy" />
1. Under **Account**, click on the
**change your email** (<EditIcon />) icon
to the right of your current email. If you do not see the
**change your email** (<EditIcon />) icon,
you do not have permission to change your email address.
1. Enter your new email, and click **Change**.
1. You will receive a confirmation email within a few minutes. Open it,
and click **Confirm email change**.
</FlattenedSteps>

View File

@@ -0,0 +1,63 @@
---
title: Change your language
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import TranslationProjectInfo from "../include/_TranslationProjectInfo.mdx";
<TranslationProjectInfo />
## Change the language of the Zulip app
Note that this will not change channel names, topic names (other than [*general
chat*](/help/general-chat-topic)), or the language of messages you receive.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **General**, select a language from the dropdown under **Language**.
Languages are marked as 100% translated only if every string
in the web, desktop, and mobile apps is translated, including
administrative UI and all error messages that the API can return.
1. Click **Reload**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/1139). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
## Font configuration for unsupported languages
Zulip uses the Source Sans 3 font, which [supports over 30 languages][adobe-docs].
If Source Sans 3 does not support your language, you may need to configure your
browser to use a different font or adjust the default font size to properly
display all the characters. See the documentation for [Chrome][chrome-docs],
[Firefox][firefox-docs], or [Edge][edge-docs] for more information on how to
configure your browser's default font.
[adobe-docs]: https://fonts.adobe.com/fonts/source-sans-3#details-section
[chrome-docs]: https://support.google.com/chrome/answer/96810
[firefox-docs]: https://support.mozilla.org/en-US/kb/change-fonts-and-colors-websites-use#w_custom-fonts
[edge-docs]: https://support.microsoft.com/en-us/microsoft-edge/increase-default-text-size-in-microsoft-edge-c62f80af-381d-0716-25a3-c4856dd3806c
## Related articles
* [Configure organization language for automated messages and invitation emails][org-lang]
[org-lang]: /help/configure-organization-language

View File

@@ -0,0 +1,29 @@
---
title: Change your name
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
By default, everyone can change their name in Zulip. You can write your name
in any language you'd like.
Organization administrators can [change anyone's name](/help/change-a-users-name), and
[prevent users from changing their names](/help/restrict-name-and-email-changes). This
is useful when users' names are managed via LDAP or another data source.
### Change your name
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Edit the **Name** field.
</FlattenedSteps>
<ZulipNote>
**Note:** If you are unable to edit the name field, check
that your organization allows name changes. Follow the steps at
[prevent users from changing their names](/help/restrict-name-and-email-changes)
to view your organization's settings.
</ZulipNote>

View File

@@ -0,0 +1,30 @@
---
title: Change your password
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ChangePasswordViaEmailConfirmation from "../include/_ChangePasswordViaEmailConfirmation.mdx";
You can reset your password at any time, as long as you either know your
current password, or have access to the email address associated with your
account.
### If you've forgotten or never had a password
<ChangePasswordViaEmailConfirmation />
### If you know your current password
<FlattenedSteps>
<NavigationSteps target="settings/account-and-privacy" />
1. Under **Account**, click **Change your password**.
1. Enter your old password and your new password, and click **Change**.
</FlattenedSteps>
## Related articles
* [Logging in](/help/logging-in)
* [Logging out](/help/logging-out)
* [Protect your account](/help/protect-your-account)

View File

@@ -0,0 +1,48 @@
---
title: Change your profile picture
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import CloseIcon from "~icons/zulip-icon/close";
When you first create an account, you'll have an automatically generated profile
picture in the style [configured](/help/configure-default-profile-pictures) by
your organization. You can upload a custom profile picture for your Zulip account.
When you create a Zulip account using an email address already associated with
an account in another Zulip organization, on Zulip Cloud or the same self-hosted
Zulip installation, you can [import](/help/import-your-settings) your profile
picture and other settings from an existing account.
If your organization has configured [Gravatar](https://en.gravatar.com/) as the
default for profile pictures, and your email address already has a gravatar
associated with it, Zulip will use your existing gravatar.
Organization administrators can [restrict profile picture
changes](/help/restrict-profile-picture-changes).
### Change your profile picture
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Click on your profile picture on the right, and choose an image to upload.
1. Crop the image as desired, and click **Save changes**.
</FlattenedSteps>
### Reset your profile picture to default
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Hover over your profile picture on the right, and click the <CloseIcon />
icon in the top right corner.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## Related articles
* [Configure default profile pictures](/help/configure-default-profile-pictures)
* [Restrict profile picture changes](/help/restrict-profile-picture-changes)

View File

@@ -0,0 +1,63 @@
---
title: Change your time zone
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
Zulip uses the time zone configured on your computer or mobile device for
displaying dates and times, such as when a message was sent.
You can [configure your **local time**](#configure-your-local-time) as it's
shown to other users in your [user card](/help/user-cards) and
[profile](/help/view-someones-profile). When your local time doesn't match your
computer's time zone, the Zulip web and desktop apps display a banner offering
to update it. If you don't want to see this banner, you can [hide
it](#hide-banner-when-time-zones-dont-match).
## Configure your local time
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Under **Profile**, select a time zone.
</FlattenedSteps>
</TabItem>
</Tabs>
## Configure time zone used by Zulip to display dates and times
<Steps>
1. Configure the time zone on your computer or mobile device.
1. Reload Zulip.
</Steps>
## Hide banner when time zones don't match
If you local time in Zulip differs from your device's time zone (for example,
you changed your computer's time zone while traveling), you'll see a banner in
the web and desktop apps offering to update your local time to match your
computer's current time zone.
You can choose to permanently hide this banner.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Under **Profile**, toggle **Offer to update to my computer's
time zone**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [User cards](/help/user-cards)
* [View someone's profile](/help/view-someones-profile)
* [Edit your profile](/help/edit-your-profile)

View File

@@ -0,0 +1,78 @@
---
title: Channel feed
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import KeyboardTip from "../../components/KeyboardTip.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelActions from "../include/_ChannelActions.mdx";
import ConfigureChannelLinks from "../include/_ConfigureChannelLinks.mdx";
import MobileChannels from "../include/_MobileChannels.mdx";
import AllMessagesIcon from "~icons/zulip-icon/all-messages";
The **Channel feed** is a feed of all the topics that you have not
[muted](/help/mute-a-topic) in a particular channel. It's a great way to get a
quick overview of recent messages in a channel.
## Go to channel feed for a subscribed channel
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<ChannelActions />
1. Click **Go to channel feed**. If you do not see this option, Zulip is
[configured](#configure-where-channel-links-in-the-left-sidebar-go) so that
clicking on the channel name in the left sidebar will take you directly to
the channel feed.
</FlattenedSteps>
<KeyboardTip>
Use <kbd>S</kbd> to go from a topic view to the channel feed.
</KeyboardTip>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MobileChannels />
1. Select a channel.
</FlattenedSteps>
<ZulipTip>
You can also go to the channel feed from a conversation view or from the
[list of topics in a channel](/help/list-of-topics), by tapping the
**channel feed** (<AllMessagesIcon />)
icon in the upper right corner of the app.
</ZulipTip>
</TabItem>
</Tabs>
## Go to channel feed for an unsubscribed channel
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/available" />
1. Select a channel.
1. Click the channel name in the top bar.
</FlattenedSteps>
</TabItem>
</Tabs>
## Configure where channel links in the left sidebar go
<ConfigureChannelLinks />
## Related articles
* [Combined feed](/help/combined-feed)
* [List of topics in a channel](/help/list-of-topics)
* [Left sidebar](/help/left-sidebar)
* [Reading strategies](/help/reading-strategies)
* [Reading conversations](/help/reading-conversations)

View File

@@ -0,0 +1,69 @@
---
title: Channel folders
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ChannelFoldersIntro from "../include/_ChannelFoldersIntro.mdx";
import MoveChannelToFolder from "../include/_MoveChannelToFolder.mdx";
import MoreVerticalIcon from "~icons/zulip-icon/more-vertical";
<ChannelFoldersIntro />
## Move a channel to a folder
<MoveChannelToFolder />
## Configure whether channels are grouped by folder in the Inbox view
<Tabs>
<TabItem label="Via Inbox view">
<Steps>
1. Click the **ellipsis** (<MoreVerticalIcon />)
to the right of the **Filter** box at the top of the Inbox view.
1. Click **Group channels by folder** or **Don't group channels by folder**, as
desired.
</Steps>
</TabItem>
<TabItem label="Via personal settings">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Information**, toggle **Group channels by folder in the inbox**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Configure whether channels are grouped by folder in the left sidebar
<Tabs>
<TabItem label="Via left sidebar">
<Steps>
1. Click the **ellipsis** (<MoreVerticalIcon />)
to the right of the **Filter left sidebar** box in the upper left.
1. Click **Group channels by folder** or **Don't group channels by folder**, as
desired.
</Steps>
</TabItem>
<TabItem label="Via personal settings">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Left sidebar**, toggle **Group channels by folder in the left
sidebar**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Manage channel folders](/help/manage-channel-folders)
* [Introduction to channels](/help/introduction-to-channels)
* [Pin a channel](/help/pin-a-channel)
* [Mute or unmute a channel](/help/mute-a-channel)
* [Hide or reveal inactive channels](/help/manage-inactive-channels)

View File

@@ -0,0 +1,107 @@
---
title: Channel notifications
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelActions from "../include/_ChannelActions.mdx";
import SelectChannelViewPersonal from "../include/_SelectChannelViewPersonal.mdx";
import ResetIcon from "~icons/zulip-icon/reset";
You can configure desktop, mobile, and email notifications on a channel by
channel basis.
Organization administrators can [enable mobile
notifications](/help/enable-mobile-notifications-by-default), per channel,
as a default for new subscribers.
## Configure notifications for a single channel
These settings will override any default channel notification settings. In [muted
channels](/help/mute-a-channel), channel notification settings apply only to
[unmuted topics](/help/mute-a-topic).
<Tabs>
<TabItem label="Via channel settings">
<FlattenedSteps>
<ChannelActions />
1. Click **Channel settings**.
<SelectChannelViewPersonal />
1. Under **Notification settings**, toggle your preferred
notifications settings for the channel.
</FlattenedSteps>
</TabItem>
<TabItem label="Via personal settings">
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. In the **Notification triggers** table, find the name of the channel
you want to configure. If the channel is currently set to the default
channel notification settings, you can select it from the **Customize
another channel** dropdown at the bottom of the table.
1. Toggle your preferred notifications settings for the selected
channel.
</FlattenedSteps>
<ZulipTip>
To reset a channel's notifications to the default settings, hover
over its name in the notification triggers table, and click the
**reset to default notifications**
(<ResetIcon />) icon.
</ZulipTip>
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/1223). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
## Configure default notifications for all channels
These settings only apply to channels where you have not
explicitly set a notification preference.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. In the **Notification triggers** table,
toggle the settings for **Channels**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/661). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
## Related articles
* [Desktop notifications](/help/desktop-notifications)
* [Email notifications](/help/email-notifications)
* [Mobile notifications](/help/mobile-notifications)
* [Mute or unmute a channel](/help/mute-a-channel)
* [Mute or unmute a topic](/help/mute-a-topic)
* [DMs, mentions, and alerts](/help/dm-mention-alert-notifications)
* [Do not disturb](/help/do-not-disturb)

View File

@@ -0,0 +1,115 @@
---
title: Channel permissions
---
import ZulipNote from "../../components/ZulipNote.astro";
import ChannelAdminPermissions from "../include/_ChannelAdminPermissions.mdx";
import ChannelPrivacyTypes from "../include/_ChannelPrivacyTypes.mdx";
import ChannelsIntro from "../include/_ChannelsIntro.mdx";
import WebPublicChannelsIntro from "../include/_WebPublicChannelsIntro.mdx";
import GlobeIcon from "~icons/zulip-icon/globe";
import HashtagIcon from "~icons/zulip-icon/hashtag";
import LockIcon from "~icons/zulip-icon/lock";
<ChannelsIntro />
<ChannelPrivacyTypes />
## Configure channel permissions
You can configure the following permissions for each channel,
regardless of its type.
Subscription permissions:
* [Who can administer the channel](/help/configure-who-can-administer-a-channel)
* [Who can subscribe themselves](/help/configure-who-can-subscribe)
* [Who can subscribe anyone](/help/configure-who-can-invite-to-channels#configure-who-can-subscribe-anyone-to-a-specific-channel)
* [Who can unsubscribe anyone](/help/configure-who-can-unsubscribe-others)
Messaging permissions:
* [Who can send messages](/help/channel-posting-policy)
* [Who can start new topics](/help/configure-who-can-start-new-topics)
* [Whether topics are required](/help/require-topics)
Moderation permissions:
* [Who can move messages](/help/restrict-moving-messages)
* [Who can resolve topics](/help/restrict-resolving-topics)
* [Who can delete messages](/help/restrict-message-editing-and-deletion)
For the organization as a whole, you can:
* [Restrict channel creation](/help/configure-who-can-create-channels)
* [Restrict who can subscribe others to channels](/help/configure-who-can-invite-to-channels#configure-who-can-subscribe-others-to-channels-in-general)
Any permission, including whether a channel is private, public, or web-public,
can be modified after the channel is created.
## Private channels
[Private channels](#private-channels) (indicated by <LockIcon />) are for conversations that should be visible to users who
are specifically granted access. There are two types of private channels in
Zulip:
* In private channels with **shared history**, new subscribers can access the
channel's full message history. For example, a newly added team member can get
ramped up on a secret project by seeing prior discussions.
* In private channels with **protected history**, new subscribers can only see
messages sent after they join. For example, a new manager would not be able to
see past discussions regarding their own hiring process or performance management.
<ChannelAdminPermissions />
Administrators can [export](/help/export-your-organization) messages in private
channels only if [granted permission to do
so](/help/export-your-organization#configure-whether-administrators-can-export-your-private-data)
by a subscriber.
Users who do not have special permissions (they are not organization
administrators, and have not been granted access to channel metadata) cannot
easily see which private channels exist. They can find out that a channel exists
only by attempting to create a channel with the same name, if they have
[permission to create channels](/help/configure-who-can-create-channels). They
can't get any other information about private channels they are not subscribed
to.
<ZulipNote>
If you create a [bot](/help/bots-overview) that is allowed to read messages
in a private channel (e.g., a **generic bot**, *not* an **incoming webhook bot**,
which is more limited), an administrator can in theory gain access to messages
in the channel by making themselves the bot's owner.
</ZulipNote>
## Public channels
Public channels (indicated by <HashtagIcon />) are open to all members of your organization other than
[guests](/help/guest-users). Anyone who is not a guest can:
* See information about the channel, including its name, description, permission
settings, and subscribers.
* Subscribe or unsubscribe themselves to the channel.
* See all messages and topics, whether or not they are subscribed.
You can configure other permissions for public channels, such as [who is allowed
to post](/help/channel-posting-policy).
Guest users can't see public (or private) channels, unless they have been specifically
subscribed to the channel.
## Web-public channels
<WebPublicChannelsIntro />
Web-public channels are indicated with a **globe** (<GlobeIcon />) icon.
## Related articles
* [User roles](/help/user-roles)
* [Guest users](/help/guest-users)
* [User groups](/help/user-groups)
* [Public access option](/help/public-access-option)
* [Restrict channel creation](/help/configure-who-can-create-channels)
* [Configure who can administer a channel](/help/configure-who-can-administer-a-channel)

View File

@@ -0,0 +1,43 @@
---
title: Channel posting policy
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
You can restrict who can send messages to a channel. For example,
you can set up an announcement channel where only a specific
[group](/help/user-groups) of users can send messages.
<ZulipTip>
You can also [configure who can start new
topics](/help/configure-who-can-start-new-topics).
</ZulipTip>
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Messaging permissions**, configure **Who can post to this channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
## Related articles
* [Configure who can start new topics](/help/configure-who-can-start-new-topics)
* [Configure automated notices for channel events](/help/configure-automated-notices#channel-events)
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [User groups](/help/user-groups)
* [Set default channels for new users](/help/set-default-channels-for-new-users)
* [Configure who can administer a channel](/help/configure-who-can-administer-a-channel)

View File

@@ -0,0 +1,28 @@
---
title: Move from Zulip Cloud to self-hosting
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
You can move freely between [Zulip Cloud](https://zulip.com/zulip-cloud/)
hosting and [self-hosting](https://zulip.com/self-hosting/): you own
your data.
## Move from Zulip Cloud to self-hosting
<Steps>
1. [Export](/help/export-your-organization) your organization's data from
Zulip Cloud.
1. Follow [the instructions][import-only] to import your data into a
self-hosted server.
</Steps>
## Related articles
* [Choosing between Zulip Cloud and self-hosting](/help/zulip-cloud-or-self-hosting)
* [Export your organization](/help/export-your-organization)
* [Change organization URL](/help/change-organization-url)
* [Deactivate your organization](/help/deactivate-your-organization)
* [Move from self-hosting to Zulip Cloud](/help/move-to-zulip-cloud)
[import-only]: https://zulip.readthedocs.io/en/stable/production/export-and-import.html#import-into-a-new-zulip-server

View File

@@ -0,0 +1,201 @@
---
title: Code blocks
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import KeyboardTip from "../../components/KeyboardTip.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import CodeBlocksExamples from "../include/_CodeBlocksExamples.mdx";
import CodeBlocksIntro from "../include/_CodeBlocksIntro.mdx";
import StartComposing from "../include/_StartComposing.mdx";
import CodeIcon from "~icons/zulip-icon/code";
<CodeBlocksIntro />
## Insert code formatting
Zulip's compose box has a smart **code** (<CodeIcon />) button, which inserts contextually appropriate code
formatting:
* If no text is selected, the button inserts code block (` ``` `) formatting.
* If selected text is on one line, the button inserts code span (`` ` ``)
formatting.
* If selected text is on multiple lines, the button inserts code block (` ``` `)
formatting.
<Tabs>
<TabItem label="Via compose box button">
<FlattenedSteps>
<StartComposing />
1. *(optional)* Select the text you want to format.
1. Click the **code** (<CodeIcon />) icon at the
bottom of the compose box to insert code formatting.
1. *(optional)* To enable syntax highlighting in a code bock, start typing the
name of the desired programming language directly after the initial ` ``` `.
Select the language from the auto-complete suggestions.
</FlattenedSteps>
<ZulipTip>
You can also use the **code** (<CodeIcon />)
icon to remove existing code formatting from the selected text.
</ZulipTip>
<KeyboardTip>
You can also use <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>C</kbd>
to insert code formatting.
</KeyboardTip>
</TabItem>
<TabItem label="Via Markdown">
<FlattenedSteps>
<StartComposing />
1. To create an inline code span, use single backticks around the text:
`text`
To create a code block, use triple backticks around the text:
```
def f(x):
return x+1
```
To enable syntax highlighting, use triple backticks followed by one or more
letters, and select the desired programming language from the auto-complete
suggestions.
```python
def fib(n):
# TODO: base case
return fib(n-1) + fib(n-2)
```
</FlattenedSteps>
<ZulipTip>
You can also use `~~~` to start code blocks, or just indent the code 4 or more
spaces.
</ZulipTip>
</TabItem>
</Tabs>
## Examples
<CodeBlocksExamples />
## Language tagging
Tagging a code block with a language enables syntax highlighting and
(if configured) [code playgrounds](#code-playgrounds). Zulip supports syntax
highlighting for hundreds of languages.
A code block can be tagged by typing the language name after the fence
(` ``` `) that begins a code block, as shown here. Typeahead will
help you enter the name for the language. The **Short names** values
from the [Pygments lexer documentation][pygments-lexers] are the
complete set of values that support syntax highlighting.
````
``` python
print("Hello world!")
```
````
### Default code block language
Organization administrators can also configure a default language for code
blocks, which will be used whenever the code block has no tag.
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Message feed settings**, edit **Default language for code blocks**.
</FlattenedSteps>
When a default language is configured, one can use ` ```text ` to display
code blocks without any syntax highlighting (e.g., to paste an error message).
## Code playgrounds
Code playgrounds are interactive in-browser development environments
that are designed to make it convenient to edit
and debug code. Code playgrounds can be configured for any programming language.
Zulip code blocks that are tagged with the language will have a button visible
on hover that allows you to open the code block in the code playground site.
### Add a custom code playground
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/playground-settings" />
1. Under **Add a new code playground**, enter a **Language**, **Name**, and
**URL template**.
1. Click **Add code playground**.
</FlattenedSteps>
For example, to configure code a playground for Rust, you could specify the
language and URL template as `Rust` and `https://play.rust-lang.org/?code={code}`.
When a code block is labeled as `rust` (either explicitly or by organization
default), users would get an on-hover option to open the code block in the
specified code playground.
<ZulipTip>
Code playgrounds use [RFC 6570](https://www.rfc-editor.org/rfc/rfc6570.html)
compliant URL templates to describe how links should be generated. Zulip's
rendering engine will pass the URL-encoded code from the code block as the
`code` parameter, denoted as `{code}` in this URL template, in order to
generate the URL. You can refer to parts of the documentation on URL
templates from [adding a custom linkifier](/help/add-a-custom-linkifier).
</ZulipTip>
### Examples of playground URL templates
Here is a list of playground URL templates you can use for some popular
languages:
* For Java: `https://pythontutor.com/java.html#code={code}` or
`https://cscircles.cemc.uwaterloo.ca/java_visualize/#code={code}`
* For JavaScript: `https://pythontutor.com/javascript.html#code={code}`
* For Python: `https://pythontutor.com/python-compiler.html#code={code}`
* For C: `https://pythontutor.com/c.html#code={code}`
* For C++: `https://pythontutor.com/cpp.html#code={code}`
* For Rust: `https://play.rust-lang.org/?code={code}`
### Technical details
* You can configure multiple playgrounds for a given language; if you do that,
the user will get to choose which playground to open the code in.
* The **Language** field is the human-readable Pygments language name for that
programming language. The language tag for a code block is internally mapped
to these human-readable Pygments names; e.g., `py3` and `py` are mapped to
`Python`. One can use the typeahead (which appears when you type something
or just click on the language field) to look up the Pygments name.
* The links for opening code playgrounds are always constructed by substituting
the URL-encoded contents of the code block into `code` variable in the URL template.
The URL template is required to contain exactly one variable named `code`.
* Code playground sites do not always clearly document their URL format; often
you can just get the prefix from your browser's URL bar.
* You can also use a custom language name to implement simple integrations.
For example, a code block tagged with the "language" `send_tweet` could be
used with a "playground" that sends the content of the code block as a Tweet.
If you have any trouble setting up a code playground, please [contact
us](/help/contact-support) with details on what you're trying to do, and we'll
be happy to help you out.
## Related articles
* [Message formatting](/help/format-your-message-using-markdown)
* [LaTeX](/help/latex)
* [Spoilers](/help/spoilers)
* [Quote message](/help/quote-or-forward-a-message)
[pygments-lexers]: https://pygments.org/docs/lexers/
[get_lexer_by_name]: https://pygments-doc.readthedocs.io/en/latest/lexers/lexers.html#pygments.lexers.get_lexer_by_name

View File

@@ -0,0 +1,100 @@
---
title: Collaborative to-do lists
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import EndComposing from "../include/_EndComposing.mdx";
import StartComposing from "../include/_StartComposing.mdx";
import ToDoListsExamples from "../include/_ToDoListsExamples.mdx";
import ToDoListsIntro from "../include/_ToDoListsIntro.mdx";
import CheckIcon from "~icons/fa/check";
import PencilIcon from "~icons/fa/pencil";
import RemoveIcon from "~icons/fa/remove";
import GripVerticalIcon from "~icons/zulip-icon/grip-vertical";
import TodoListIcon from "~icons/zulip-icon/todo-list";
import TrashIcon from "~icons/zulip-icon/trash";
<ToDoListsIntro />
## Create a to-do list
<Tabs>
<TabItem label="Via compose box button">
<FlattenedSteps>
<StartComposing />
1. Make sure the compose box is empty.
1. Click the **add to-do list** (<TodoListIcon />) icon at the bottom
of the compose box.
1. Fill out todo-list information as desired, and click **Create to-do
list** to insert todo-list formatting.
<EndComposing />
</FlattenedSteps>
<ZulipTip>
To reorder the list of todos, click and drag the **vertical dots**
(<GripVerticalIcon />) to the left of
each option. To delete an option, click the **delete**
(<TrashIcon />) icon to the right of it.
</ZulipTip>
</TabItem>
<TabItem label="Via Markdown">
<FlattenedSteps>
<StartComposing />
1. Make sure the compose box is empty.
1. Type `/todo` followed by a space, and the title of the to-do list.
1. *(optional)* Type each task on a new line, with its description, if
any, after a <kbd>:</kbd> and blank space.
<EndComposing />
</FlattenedSteps>
<ZulipTip>
You will be able to add tasks after the to-do list is created.
</ZulipTip>
</TabItem>
</Tabs>
## Add tasks to a to-do list
<Steps>
1. Fill out the **New task** field, and optionally the **Description**
field at the bottom of the to-do list.
1. Click **Add task** to add the new task to the to-do list.
</Steps>
## Edit the to-do list title
<ZulipNote>
Only the creator of a to-do list can edit the title.
</ZulipNote>
<Steps>
1. Click the **pencil** (<PencilIcon />) icon
to the right of the title.
1. Edit the title as desired.
1. Click the **checkmark** (<CheckIcon />) icon or press
<kbd>Enter</kbd> to save your changes.
</Steps>
<ZulipTip>
You can click the <RemoveIcon /> icon or press
<kbd>Esc</kbd> to discard your changes.
</ZulipTip>
## Examples
<ToDoListsExamples />
## Related articles
* [Message formatting](/help/format-your-message-using-markdown)
* [Polls](/help/create-a-poll)

View File

@@ -0,0 +1,24 @@
---
title: Collapse a message
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import MessageActionsMenu from "../include/_MessageActionsMenu.mdx";
Collapse messages that you don't want to see. Zulip sometimes automatically
partially condenses long messages. This feature is different, and will fully
remove the message content from view.
### Collapse a message
<FlattenedSteps>
<MessageActionsMenu />
1. Click **Collapse message**.
</FlattenedSteps>
<ZulipTip>
To expand a message, click **Show more** at the bottom of the collapsed
message.
</ZulipTip>

View File

@@ -0,0 +1,23 @@
---
title: Combined feed
---
import KeyboardTip from "../../components/KeyboardTip.astro";
import CombinedFeed from "../include/_CombinedFeed.mdx";
<CombinedFeed />
<KeyboardTip>
Use <kbd>S</kbd> (go to channel) or <kbd>Shift</kbd> +
<kbd>S</kbd> (go to conversation) to zoom in, and <kbd>A</kbd> to
get back to **Combined feed**.
</KeyboardTip>
## Related articles
* [Reading strategies](/help/reading-strategies)
* [Inbox](/help/inbox)
* [Recent conversations](/help/recent-conversations)
* [Configure home view](/help/configure-home-view)
* [Reading conversations](/help/reading-conversations)
* [Channel feed](/help/channel-feed)

View File

@@ -0,0 +1,67 @@
---
title: Zulip communities directory
---
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import CommunitiesDirectoryInstructions from "../include/_CommunitiesDirectoryInstructions.mdx";
import CommunitiesDirectoryIntro from "../include/_CommunitiesDirectoryIntro.mdx";
<CommunitiesDirectoryIntro />
## Eligibility
In order to be eligible for listing in the communities directory, an
organization must be open to the public. Your organization is eligible
if users are allowed to [join without an invitation][join-without-invite]
and/or the [public access option](/help/public-access-option) is enabled.
The directory will be organized by [organization type](/help/organization-type),
so it is highly recommended that you make sure the appropriate category
is selected.
Zulip reserves the right to use editorial discretion.
Giving Zulip permission to promote your organization in the communities
directory does not guarantee that it will be listed.
### Self-hosted Zulip communities
Zulip plans to develop support for self-hosted Zulip communities that
have registered their servers with the [Zulip mobile push
notification service][push-notifications] to sign-up for the Zulip
communities directory.
Until that feature is developed, if you administer a self-hosted Zulip
community and would like to be listed in the directory, please contact
[Zulip support](mailto:support@zulip.com). Changing the setting in your
Zulip organization will not send any information to the Zulip project
at this time, even if you use the Zulip mobile push notifications
service.
[join-without-invite]: /help/restrict-account-creation#set-whether-invitations-are-required-to-join
[communities-directory-permission]: /help/communities-directory#give-permission-to-be-in-the-zulip-communities-directory
[push-notifications]: https://zulip.readthedocs.io/en/stable/production/mobile-push-notifications.html
## Change whether your organization may be listed in the Zulip communities directory
<AdminOnly />
<CommunitiesDirectoryInstructions />
<ZulipTip>
Organizations that are not open to the public will not be listed at this time.
If you administer a non-public organization, please check the box to request
to be listed in the future.
</ZulipTip>
## Related articles
* [Create your organization profile](/help/create-your-organization-profile)
* [Public access option](/help/public-access-option)
* [Linking to the Zulip website](/help/linking-to-zulip-website)
* [Support the Zulip project](/help/support-zulip-project)
* [Restrict account creation](/help/restrict-account-creation)
* [Moderating open organizations](/help/moderating-open-organizations)
* [Organization type](/help/organization-type)

View File

@@ -0,0 +1,71 @@
---
title: Configure a custom welcome message
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import InviteUsers from "../include/_InviteUsers.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
You can configure a custom welcome message to be sent to new users in your
organization, along with standard onboarding messages from Welcome Bot. For
example, you can describe the purpose of important channels, and link to your
organization's guidelines for using Zulip.
Administrators can also customize the message each time they [create an
invitation](/help/invite-new-users). Invitations sent by other users will always
use the default custom welcome message configured by your organization's
administrators.
<ZulipTip>
You can compose the welcome message in the compose box to benefit from
buttons and typeahead suggestions for message formatting, and copy it over.
</ZulipTip>
## Configure a default custom welcome message
<AdminOnly />
Users will receive the message that's configured at the time when they accept
the invitation, so there's no need to update or revoke invitations when you
change the welcome message.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Onboarding**, enable **Send a custom Welcome Bot message to
new users**.
1. Under **Message text**, enter a custom welcome message using Zulip's standard
[Markdown formatting](/help/format-your-message-using-markdown).
1. *(optional)* Click **Send me a test message**, followed by **View message**,
to see how the message will look. Follow the instructions above to return to
the panel where this setting can be configured.
<SaveChanges />
</FlattenedSteps>
## Customize the welcome message when sending an invitation
<AdminOnly />
<FlattenedSteps>
<InviteUsers />
1. If there is no custom message configured in your organization, enable **Send
a custom Welcome Bot message**. Otherwise, disable **Send the default Welcome
Bot message configured for this organization**.
1. Under **Message text**, enter the welcome message to use for this
invitation using Zulip's standard [Markdown
formatting](/help/format-your-message-using-markdown).
1. Configure other invitation details as desired, and click **Invite** or
**Create link**.
</FlattenedSteps>
## Related articles
* [Invite new users](/help/invite-new-users)
* [Set default channels for new users](/help/set-default-channels-for-new-users)
* [Configure default new user settings](/help/configure-default-new-user-settings)
* [Joining a Zulip organization](/help/join-a-zulip-organization)

View File

@@ -0,0 +1,79 @@
---
title: Configure authentication methods
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import OwnerOnly from "../include/_OwnerOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
<OwnerOnly />
You can choose which authentication methods to enable for users to log in to
your organization. The following options are available on all
[plans](https://zulip.com/plans/):
* Email and password
* Social authentication: Google, GitHub, GitLab, Apple, Discord
The following options are available for organizations on Zulip Cloud Standard,
Zulip Cloud Plus, and all self-hosted Zulip servers:
* Oauth2 with Microsoft Entra ID (AzureAD)
The following options are available for organizations on Zulip Cloud Plus, and all self-hosted Zulip servers:
* [SAML authentication](/help/saml-authentication), including Okta, OneLogin, Entra ID (AzureAD), Keycloak, Auth0
* [OpenID
Connect](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#openid-connect)
* [SCIM provisioning](/help/scim)
The following authentication and identity management options are available for
all self-hosted servers. If you are interested in one of these options for a
Zulip Cloud organization, contact [support@zulip.com](mailto:support@zulip.com)
to inquire.
* [AD/LDAP user
sync](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#ldap-including-active-directory)
* [AD/LDAP group
sync](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html#ldap-including-active-directory)
* [Custom authentication
options](https://python-social-auth.readthedocs.io/en/latest/backends/index.html#social-backends)
with python-social-auth
### Configure authentication methods
<ZulipNote>
For self-hosted organizations, some authentication options require
that you first [configure your
server](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html)
to support the option.
</ZulipNote>
<ZulipTip>
Before disabling an authentication method, test that you can
successfully log in with one of the remaining authentication methods.
The [`change_auth_backends` management
command](https://zulip.readthedocs.io/en/stable/production/management-commands.html)
can help if you accidentally lock out all administrators.
</ZulipTip>
<FlattenedSteps>
<NavigationSteps target="settings/auth-methods" />
1. To use SAML authentication or SCIM provisioning, Zulip Cloud organizations
must upgrade to [Zulip Cloud Plus](https://zulip.com/plans/), and contact
[support@zulip.com](mailto:support@zulip.com) to enable these methods.
1. Toggle the checkboxes next to the available login options.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Configuring authentication methods](https://zulip.readthedocs.io/en/stable/production/authentication-methods.html)
for server administrators (self-hosted only)
* [SAML authentication](/help/saml-authentication)
* [SCIM provisioning](/help/scim)

View File

@@ -0,0 +1,146 @@
---
title: Configure automated notices
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
The Zulip sends automated notices via Notification Bot to notify users about
changes in their organization or account. Some types of notices can be
configured, or disabled altogether.
Notices sent to channels are translated into the language that the organization
has configured as the [language for automated messages and invitation
emails](/help/configure-organization-language). The topic name is also
translated. Notices sent directly to users will use [their preferred
language](/help/change-your-language).
## Notices about channels
### New channel announcements
<AdminOnly />
When creating a new [public](/help/channel-permissions#public-channels) or
[web-public](/help/channel-permissions#web-public-channels) channel, the channel
creator can choose to advertise the new channel via an automated notice. You can
configure what channel Zulip uses for these notices, or disable these notices
entirely. The topic for these messages is “new channels”.
New [private](/help/channel-permissions#private-channels) channels are never
announced.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, configure **New channel
announcements**.
<SaveChanges />
</FlattenedSteps>
### Channel events
You can configure whether Zulip will send an automated message when a channel's
settings are updated. If enabled, Notification Bot will send messages about
updates to settings such as the channel [name](/help/rename-a-channel),
[description](/help/change-the-channel-description),
[privacy](/help/change-the-privacy-of-a-channel) and [posting
policy](/help/channel-posting-policy). Messages will be sent to the “channel
events” topic in the modified channel.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, configure **Send automated
messages for channel events**.
<SaveChanges />
</FlattenedSteps>
## Notices about topics
A notice is sent when a topic is [resolved or
unresolved](/help/resolve-a-topic). Users can
[configure](/help/marking-messages-as-read#configure-whether-resolved-topic-notices-are-marked-as-read)
whether these notices are automatically marked as read.
Additionally, when moving messages to another
[channel](/help/move-content-to-another-channel) or
[topic](/help/move-content-to-another-topic), users can decide whether to send
automated notices to help others understand how content was moved.
## Notices about users
You will be notified if someone [subscribes you to a
channel](/help/subscribe-users-to-a-channel), or changes your
[group](/help/user-groups) membership.
### New user announcements
<AdminOnly />
You can configure where Notification Bot will post an announcement when new
users join your organization, or disable new user announcement messages
entirely. The topic for these messages is “signups”.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, configure **New user
announcements**.
<SaveChanges />
</FlattenedSteps>
### Notices about changes to user profile
When an administrator modifies your account settings, you will receive a private
message from Notification Bot listing the changes that were made. This includes
updates to your full name, [role](/help/roles-and-permissions), and [custom profiles
fields](/help/custom-profile-fields).
The notification will show both the old and new values for each field that was
changed, making it easy to see exactly what was modified. Only administrators
can change other users' profiles, and these notifications ensure that users are
always informed when such changes occur.
## Zulip update announcements
Zulip announces new features and other important product changes via automated
messages. This is designed to help users discover new features they may find
useful, including new configuration options.
These announcements are posted to the “Zulip updates” topic in the
channel selected by organization administrators (usually 1-2x a month
on Zulip Cloud). You can read update messages whenever it's
convenient, or [mute](/help/mute-a-topic) the topic if you are not
interested. If you organization does not want to receive these
announcements, they can be disabled.
On self-hosted Zulip servers, announcement messages are shipped with the Zulip
server version that includes the new feature or product change. You may thus
receive several announcement messages when your server is upgraded.
Unlike other notices, Zulip update announcements are not translated.
### Configure Zulip update announcements
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, configure **Zulip update
announcements**.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Organization language for automated messages and invitation emails](/help/configure-organization-language)
* [Moderating open organizations](/help/moderating-open-organizations)
* [Zulip Cloud newsletter](/help/email-notifications#low-traffic-newsletter)

View File

@@ -0,0 +1,66 @@
---
title: Configure call provider
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
<AdminOnly />
By default, Zulip integrates with
[Jitsi Meet](https://jitsi.org/jitsi-meet/), a fully-encrypted, 100% open
source video conferencing solution. Organization administrators can also
change the organization's call provider. The call providers
supported by Zulip are:
* [Jitsi Meet](/integrations/jitsi)
* [Zoom integration](/integrations/zoom)
* [BigBlueButton integration](/integrations/big-blue-button)
* [Constructor Groups integration](/integrations/constructor-groups)
* [Nextcloud Talk integration](/integrations/nextcloud-talk)
* [Webex integration](/integrations/webex)
<ZulipTip>
You can disable the video and voice call buttons for your organization
by setting the **call provider** to "None".
</ZulipTip>
## Configure your organization's call provider
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Compose settings**, select the desired provider from the
**Call provider** dropdown.
<SaveChanges />
</FlattenedSteps>
## Use a self-hosted instance of Jitsi Meet
Zulip uses the [cloud version of Jitsi Meet](https://meet.jit.si/)
as its default call provider. You can also use a self-hosted
instance of Jitsi Meet.
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Compose settings**, select **Custom URL** from the
**Jitsi server URL** dropdown.
1. Enter the URL of your self-hosted Jitsi Meet server.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Start a call](/help/start-a-call)
* [Jitsi Meet integration](/integrations/jitsi)
* [Zoom integration](/integrations/zoom)
* [BigBlueButton integration](/integrations/big-blue-button)
* [Constructor Groups integration](/integrations/constructor-groups)
* [Nextcloud Talk integration](/integrations/nextcloud-talk)
* [Webex integration](/integrations/webex)

View File

@@ -0,0 +1,70 @@
---
title: Configure default settings for new users
---
import FlattenedList from "../../components/FlattenedList.astro";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import DefaultUserSettingsList from "../include/_DefaultUserSettingsList.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
<AdminOnly />
You can configure the default values of personal preference settings for new
users joining your organization. This lets you customize the Zulip experience to
match how your organization is using Zulip.
Users will be able to customize their own settings once they join.
If needed, administrators can [reset settings for
users](/help/reset-settings-for-users) to the organization default.
Administrators can customize defaults for all personal preference
settings, including the following:
<FlattenedList>
* Privacy settings:
* Displaying [availability](/help/status-and-availability) to other users
* Allowing others to see when the user has [read
messages](/help/read-receipts)
* Allowing others to see when the user is [typing a
message](/help/typing-notifications)
<DefaultUserSettingsList />
</FlattenedList>
## Configure default settings for new users
Users will have the initial settings that are configured at the time when they
accept the invitation, so there's no need to update or revoke invitations when
you change default settings.
<FlattenedSteps>
<NavigationSteps target="settings/default-user-settings" />
1. Review all settings and adjust as needed.
</FlattenedSteps>
## Configure default language for new users
Your organization's [language](/help/configure-organization-language) will be
the default language for new users when Zulip cannot detect their language
preferences from their browser, including all users [created via the Zulip
API](/api/create-user).
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, change the **Language for
automated messages and invitation emails**.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Reset settings for users](/help/reset-settings-for-users)
* [Moving to Zulip](/help/moving-to-zulip)
* [Customize settings for new users](/help/customize-settings-for-new-users)
* [Set default channels for new users](/help/set-default-channels-for-new-users)
* [Invite users to join](/help/invite-users-to-join)

View File

@@ -0,0 +1,37 @@
---
title: Configure default profile pictures
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
You can configure the style of profile pictures for users who don't have a
profile picture uploaded.
* The default option is an abstract design that looks good in both the
light and dark [themes](/help/dark-theme).
* [Gravatar](https://en.gravatar.com/) lets users link a profile picture to
their email account, which is used across all applications that support it.
The default for users who don't have a gravatar configured is an abstract
design best suited for light theme.
## Configure default profile pictures
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Onboarding**, configure **Default profile pictures for new users**.
You will see a sample of how the pictures will look.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Change your profile picture](/help/change-your-profile-picture)
* [Restrict profile picture changes](/help/restrict-profile-picture-changes)

View File

@@ -0,0 +1,50 @@
---
title: Configure email visibility
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
With privacy in mind, Zulip lets you control which
[roles](/help/user-roles) in the organization can view your email
address. Administrators can set the default email visibility configuration
for new users in the organization.
## Configure who can access your email address
<Tabs>
<TabItem label="On sign-up">
<Steps>
1. After confirming your email, click **Change** below your email address.
1. Configure **Who can access your email address**.
1. Click **Confirm** to apply your changes, and continue the account registration
process.
</Steps>
</TabItem>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/account-and-privacy" />
1. Under **Privacy**, configure **Who can access your email address**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Configure default email visibility for new users
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/default-user-settings" />
1. Under **Privacy settings**, configure **Who can access user's email address**.
</FlattenedSteps>
## Related articles
* [Moderating open organizations](/help/moderating-open-organizations)
* [Restrict name and email changes](/help/restrict-name-and-email-changes)

View File

@@ -0,0 +1,28 @@
---
title: Configure emoticon translations
---
import EmoticonTranslations from "../../components/EmoticonTranslations.astro";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
You can configure whether emoticons like `:)` or `:(` will be automatically
translated into emoji equivalents like 🙂 or 🙁 by Zulip.
## Configure emoticon translations
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Emoji**, toggle **Convert emoticons before sending**.
</FlattenedSteps>
## List of emoticon translations
<EmoticonTranslations />
## Related articles
* [Emoji and emoticons](/help/emoji-and-emoticons)
* [Add custom emoji](/help/custom-emoji)
* [Emoji reactions](/help/emoji-reactions)

View File

@@ -0,0 +1,87 @@
---
title: Configure home view
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import MoreVerticalIcon from "~icons/zulip-icon/more-vertical";
The home view in Zulip is the view you reach after logging in
to the Zulip web app. You can also navigate to the home view via
keyboard shortcuts.
The home views available in Zulip are
[**Inbox**](/help/inbox),
[**Recent conversations**](/help/recent-conversations), and
[**Combined feed**](/help/combined-feed). See
[Reading strategies](/help/reading-strategies) for recommendations
on how to use these views.
You can configure which view is set as your home view, and whether
the <kbd>Esc</kbd> key navigates to the home view. Also, you can
always reach the home view by using the
<kbd data-mac-key="Ctrl">Ctrl</kbd> + <kbd>\[</kbd> shortcut.
## Change home view
Organization administrators can [configure the home view for their
organization](/help/configure-default-new-user-settings) to
[**Inbox**](/help/inbox),
[**Recent conversations**](/help/recent-conversations), or
[**Combined feed**](/help/combined-feed).
* The **Inbox** view works best if you regularly clear all unread messages in
channels you follow.
* **Recent conversations** works well for getting an overview of recent activity.
* **Combined feed** is convenient for low-traffic organizations, or for skimming
messages as they come in.
You can customize your personal home view regardless of
organization settings:
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Navigation**, click on the **Home view** dropdown
and select a view.
1. To see your changes in action, open a new Zulip tab, or use a keyboard
shortcut twice to exit the settings and navigate to your home view
(<kbd data-mac-key="Ctrl">Ctrl</kbd> + <kbd>\[</kbd> or <kbd>Esc</kbd>
if enabled).
</FlattenedSteps>
<ZulipTip>
You can also hover over your desired home view in the left sidebar, and
choose the option to **make it your home view** in the **ellipsis**
(<MoreVerticalIcon />) menu.
</ZulipTip>
## Configure whether <kbd>Esc</kbd> navigates to the home view
Zulip has a number of [keyboard shortcuts](/help/keyboard-shortcuts)
designed to enhance the user experience in the app.
By default, the <kbd>Esc</kbd> key shortcut will ultimately navigate to
your home view. You can disable this key binding if you would prefer.
This will not disable other <kbd>Esc</kbd> key shortcuts used in Zulip,
and will not affect the behavior of the
<kbd data-mac-key="Ctrl">Ctrl</kbd> + <kbd>\[</kbd> shortcut.
### Toggle whether <kbd>Esc</kbd> navigates to the home view
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Navigation**, toggle **Escape key navigates to
home view**, as desired.
</FlattenedSteps>
## Related articles
* [Reading strategies](/help/reading-strategies)
* [Recent conversations](/help/recent-conversations)
* [Combined feed](/help/combined-feed)
* [Keyboard shortcuts](/help/keyboard-shortcuts)
* [Reset settings for users](/help/reset-settings-for-users)

View File

@@ -0,0 +1,27 @@
---
title: Configure how links open in mobile apps
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import MobileSettings from "../include/_MobileSettings.mdx";
You can configure whether website links will open directly in the Zulip app, or
in your device's default browser.
## Configure whether to open links within the app
<Tabs>
<TabItem label="Mobile">
<FlattenedSteps>
<MobileSettings />
1. Toggle **Open links with in-app browser**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Link to a message or conversation](/help/link-to-a-message-or-conversation)

View File

@@ -0,0 +1,23 @@
---
title: Configure multi-language search
---
Zulip supports [full-text search](/help/search-for-messages), which can be
combined arbitrarily with Zulip's full suite of [search
filters](/help/search-for-messages#search-filters). By default, Zulip search
only supports English text, using [PostgreSQL's built-in full-text search
feature](https://www.postgresql.org/docs/current/textsearch.html), with a custom
set of English stop words to improve the quality of the search results.
Self-hosted Zulip organizations can instead set up an experimental
[PGroonga](https://pgroonga.github.io/) integration that provides full-text
search for all languages simultaneously, including Japanese and Chinese. See
[here](https://zulip.readthedocs.io/en/stable/subsystems/full-text-search.html#multi-language-full-text-search)
for setup instructions.
## Related articles
* [Configure organization language for automated messages and invitation emails][org-lang]
* [Searching for messages](/help/search-for-messages)
[org-lang]: /help/configure-organization-language

View File

@@ -0,0 +1,50 @@
---
title: Organization language for automated messages and invitation emails
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import TranslationProjectInfo from "../include/_TranslationProjectInfo.mdx";
<AdminOnly />
<TranslationProjectInfo />
Each user can use Zulip with [their preferred language][user-lang].
Additionally, if your organization has a primary language other than
American English, you can set the language used for the organization's
automated messages and invitation emails. This setting:
* Determines the language used for [automated
notices](/help/configure-automated-notices) that are sent to channels, including
both the topic name and message content. (Automated messages sent to a single
user will use that user's preferred language).
* Determines the language used for outgoing
[invitation emails](/help/invite-new-users).
* Is used as the default language for new user accounts when Zulip
cannot detect their language preferences from their browser,
including all users [created via the Zulip API][api-create-user].
## Configure the organization language
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, change the **Language for
automated messages and invitation emails**.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Change your language][user-lang]
* [Configure multi-language search](/help/configure-multi-language-search)
* [Configure default settings for new users](/help/configure-default-new-user-settings)
* [Configure automated notices](/help/configure-automated-notices)
[api-create-user]: https://zulip.com/api/create-user
[user-lang]: /help/change-your-language

View File

@@ -0,0 +1,51 @@
---
title: Configure send message keys
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ComposeBoxMenu from "../include/_ComposeBoxMenu.mdx";
import StartComposing from "../include/_StartComposing.mdx";
By default, the <kbd>Enter</kbd> key adds a new line to your message,
and <kbd>Ctrl</kbd> + <kbd>Enter</kbd> sends your message.
This is convenient for typing multi-line messages, which are more common in
Zulip than in most other chat products. However, you can also configure
Zulip so that the <kbd>Enter</kbd> key sends your message.
<ZulipTip>
<kbd>Shift</kbd> + <kbd>Enter</kbd> always adds a new line, regardless
of whether **<kbd>Enter</kbd> to send** is enabled.
</ZulipTip>
## Configure send message keys
<Tabs>
<TabItem label="Via compose box">
<FlattenedSteps>
<StartComposing />
<ComposeBoxMenu />
1. Toggle your preferred option for **Press ... to send**.
</FlattenedSteps>
</TabItem>
<TabItem label="Via personal settings">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **General**, toggle **<kbd>Enter</kbd> sends when composing a message**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Message formatting](/help/format-your-message-using-markdown)
* [Preview messages before sending](/help/preview-your-message-before-sending)
* [Mastering the compose box](/help/mastering-the-compose-box)

View File

@@ -0,0 +1,68 @@
---
title: Configure unread message counters
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import MoreVerticalIcon from "~icons/zulip-icon/more-vertical";
To provide information about unread messages, Zulip can show unread message
counters next to channel names in the left sidebar. This is likely to be helpful
if you generally read (or otherwise [mark as read](/help/marking-messages-as-read))
all the messages in a channel, but may otherwise feel unnecessary.
## Configure unread message counters
Zulip offers an option to display a dot instead of an unread counter for channels
in the left sidebar. You can use a dot for all channels, or just for channels you
have [muted](/help/mute-a-channel). You will still be able to see the number of
unread messages in a channel by moving your mouse over it in the left sidebar or
opening it.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Left sidebar**, select your preferred option from the
**Show unread counts for** dropdown.
</FlattenedSteps>
</TabItem>
</Tabs>
## Configure unread summary counters
You can configure whether Zulip displays unread count summaries on your home
view in the left sidebar. You will still be able to see the
summary counts by moving your mouse over them in the left sidebar. The counter
on your home view will also be shown when you're in that view.
<Tabs>
<TabItem label="Via left sidebar">
<Steps>
1. Hover over your configured [home view](/help/configure-home-view) in the
**views** section of the left sidebar.
1. Click on the **ellipsis** (<MoreVerticalIcon />).
1. Click the option to hide or show the unread counter.
</Steps>
</TabItem>
<TabItem label="Via personal settings">
<FlattenedSteps>
<NavigationSteps target="settings/preferences" />
1. Under **Left sidebar**, toggle **Show unread count total on home view**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Reading strategies](/help/reading-strategies)
* [Marking messages as read](/help/marking-messages-as-read)
* [Marking messages as unread](/help/marking-messages-as-unread)
* [Star a message](/help/star-a-message)
* [Desktop notifications](/help/desktop-notifications)

View File

@@ -0,0 +1,45 @@
---
title: Configure where you land in message feeds
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import MobileSettings from "../include/_MobileSettings.mdx";
When you go to a message feed in the Zulip web or desktop app, you'll generally
land at your oldest unread message in that view.
[Searches](/help/search-for-messages) and [starred
messages](/help/star-a-message) put you at the newest message instead.
In the mobile app, you can choose where message feeds will open:
* **First unread message**: Recommended if you like to clear your inbox of
unread messages.
* **First unread message in conversation views, newest message elsewhere**: In
Zulip, a **conversation** is a [direct message](/help/direct-messages) thread
(one-on-one or with a group), or a [topic in a
channel](/help/introduction-to-topics). This option works well if you have old
unread messages, and don't want to navigate there in your [Combined
feed](/help/combined-feed) and [channel feeds](/help/channel-feed).
* **Newest message**: You may be used to this behavior from other chat
applications. To avoid accidentally marking messages as read,
consider setting [Mark messages as read on
scroll](/help/marking-messages-as-read#configure-whether-messages-are-automatically-marked-as-read)
to **Never** when using this setting.
<Tabs>
<TabItem label="Mobile">
<FlattenedSteps>
<MobileSettings />
1. Tap **Open message feeds at**.
1. Select the desired configuration.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Marking messages as read](/help/marking-messages-as-read)
* [Reading strategies](/help/reading-strategies)

View File

@@ -0,0 +1,43 @@
---
title: Configure who can administer a channel
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ChannelAdminPermissions from "../include/_ChannelAdminPermissions.mdx";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
<ZulipNote>
Organization administrators can automatically administer all channels.
</ZulipNote>
<ChannelAdminPermissions />
## Configure who can administer a channel
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Administrative permissions**, configure **Who can administer
this channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
## Related articles
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [User groups](/help/user-groups)
* [Channel posting policy](/help/channel-posting-policy)
* [Configure who can unsubscribe anyone from a channel](/help/configure-who-can-unsubscribe-others)
* [Archive a channel](/help/archive-a-channel)

View File

@@ -0,0 +1,67 @@
---
title: Restrict channel creation
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
<AdminOnly />
Zulip allows you to separately control [permissions](/help/manage-permissions)
for creating [web-public](/help/public-access-option), public and private
channels.
For corporations and other organizations with controlled access, we
recommend keeping channel creation open to make it easy for users to
self-organize.
Only users in trusted roles (moderators and administrators) can be
given permission to create web-public channels. This is intended
[to help manage abuse](/help/public-access-option#managing-abuse) by
making it hard for an attacker to host malicious content in an
unadvertised web-public channel in a legitimate organization.
### Manage who can create channels
<Tabs>
<TabItem label="Public channels">
<FlattenedSteps>
<NavigationSteps target="settings/organization-permissions" />
1. Under **Channel permissions**, configure **Who can create public channels**.
<SaveChanges />
</FlattenedSteps>
</TabItem>
<TabItem label="Private channels">
<FlattenedSteps>
<NavigationSteps target="settings/organization-permissions" />
1. Under **Channel permissions**, configure **Who can create private channels**.
<SaveChanges />
</FlattenedSteps>
</TabItem>
<TabItem label="Web-public channels">
<FlattenedSteps>
<NavigationSteps target="settings/organization-permissions" />
1. Under **Channel permissions**, configure **Who can create web-public channels**.
<SaveChanges />
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [Create a channel](/help/create-a-channel)
* [Introduction to channels](/help/introduction-to-channels)

View File

@@ -0,0 +1,72 @@
---
title: Configure who can subscribe other users to channels
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import ContentAccessDefinition from "../include/_ContentAccessDefinition.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
You can configure who can subscribe other users to channels. If you have
permission to subscribe users [to a specific
channel](#configure-who-can-subscribe-anyone-to-a-specific-channel), you can
always do so, whether or not you're subscribed yourself.
There is also a [general
permission](#configure-who-can-subscribe-others-to-channels-in-general), which
allows subscribing others to all [public
channels](/help/channel-permissions#public-channels). For [private
channels](/help/channel-permissions#private-channels), you additionally need to
have content access to the channel in order to use this permission. Users have
content access if:
<ContentAccessDefinition />
[Guests](/help/guest-users) are never permitted to subscribe others.
## Configure who can subscribe others to channels in general
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/organization-permissions" />
1. Under **Channel permissions**, configure **Who can subscribe others to channels**.
<SaveChanges />
</FlattenedSteps>
## Configure who can subscribe anyone to a specific channel
If you have permission to administer a public channel, you can configure who can
subscribe anyone to it. For [private
channels](/help/channel-permissions#private-channels), you additionally need to
have content access in order to change this configuration.
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Subscription permissions**, configure **Who can subscribe anyone to
this channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
## Related articles
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [User groups](/help/user-groups)
* [Configure who can subscribe to a channel](/help/configure-who-can-subscribe)
* [Configure who can unsubscribe anyone from a channel](/help/configure-who-can-unsubscribe-others)
* [Subscribe users to a channel](/help/subscribe-users-to-a-channel)
* [Unsubscribe users from a channel](/help/unsubscribe-users-from-a-channel)

View File

@@ -0,0 +1,44 @@
---
title: Configure who can start new topics
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
You can restrict who can start new topics in a channel. For example, you can set
up:
* A channel where only some users can post new announcements, but
everyone can discuss them.
* A channel with just a handful of topics everyone is expected to use.
* A channel for mirroring another messaging app, where each topic corresponds to
a channel in the other app.
<ZulipTip>
You can also [configure who can send messages](/help/channel-posting-policy)
to a channel.
</ZulipTip>
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Messaging permissions**, configure **Who can start new topics**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
## Related articles
* [Channel permissions](/help/channel-permissions)
* [Channel posting policy](/help/channel-posting-policy)
* [Configure whether topics are required](/help/require-topics)

View File

@@ -0,0 +1,68 @@
---
title: Configure who can subscribe to a channel
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
You can give users permission to subscribe to a channel. Everyone other than
[guests](/help/guest-users) can subscribe to any
[public](/help/channel-permissions#public-channels) or
[web-public](/help/channel-permissions#web-public-channels) channel, so this
feature is intended for use with [private
channels](/help/channel-permissions#private-channels). Guests can never
subscribe themselves to a channel.
This permission grants access to channel content: users who are allowed to
subscribe to a channel will also be able to read messages in it without
subscribing.
<ZulipTip>
For example, you can give your team's [user group](/help/user-groups) permission
to subscribe to each of your team's channels. A designer on the team could then
follow a [link to a
conversation](/help/link-to-a-message-or-conversation#link-to-a-topic-within-zulip)
in the private engineering channel, and read it without subscribing. They could
subscribe if they need to send a message there, without asking for help.
</ZulipTip>
If you have permission to administer a public channel, you can configure who can
subscribe to it. For [private
channels](/help/channel-permissions#private-channels), you additionally need to
have content access in order to change this configuration.
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Subscription permissions**, configure **Who can subscribe to this
channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
</TabItem>
</Tabs>
## Related articles
* [Subscribe to a channel](/help/introduction-to-channels#browse-and-subscribe-to-channels)
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [User groups](/help/user-groups)
* [Configure who can subscribe other users to channels](/help/configure-who-can-invite-to-channels)
* [Configure who can unsubscribe anyone from a channel](/help/configure-who-can-unsubscribe-others)
* [Subscribe users to a channel](/help/subscribe-users-to-a-channel)
* [Unsubscribe users from a channel](/help/unsubscribe-users-from-a-channel)

View File

@@ -0,0 +1,38 @@
---
title: Configure who can unsubscribe anyone from a channel
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ChannelSettingsNavbarTip from "../include/_ChannelSettingsNavbarTip.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import SelectChannelViewPermissions from "../include/_SelectChannelViewPermissions.mdx";
Organization administrators and [channel
administrators](/help/configure-who-can-administer-a-channel) can automatically
unsubscribe anyone from a channel.
<FlattenedSteps>
<NavigationSteps target="relative/channel/all" />
1. Select a channel.
<SelectChannelViewPermissions />
1. Under **Subscription permissions**, configure **Who can unsubscribe anyone
from this channel**.
<SaveChanges />
</FlattenedSteps>
<ChannelSettingsNavbarTip />
## Related articles
* [Channel permissions](/help/channel-permissions)
* [User roles](/help/user-roles)
* [User groups](/help/user-groups)
* [Configure who can administer a channel](/help/configure-who-can-administer-a-channel)
* [Restrict who can subscribe other users to channels](/help/configure-who-can-invite-to-channels)
* [Unsubscribe users from a channel](/help/unsubscribe-users-from-a-channel)
* [Subscribe users to a channel](/help/subscribe-users-to-a-channel)

View File

@@ -0,0 +1,85 @@
---
title: Connect through a proxy
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import DesktopSidebarSettingsMenu from "../include/_DesktopSidebarSettingsMenu.mdx";
Some corporate and university networks may require you to connect to Zulip
via a proxy.
## Web
Zulip uses your browser's default proxy settings. To set a custom proxy just
for Zulip, check your browser's instructions for setting a custom proxy for
a single website.
## Desktop
<Tabs>
<TabItem label="System proxy settings">
<FlattenedSteps>
<DesktopSidebarSettingsMenu />
1. Select the **Network** tab.
1. Click **Use system proxy settings**.
1. Restart the Zulip desktop app.
</FlattenedSteps>
</TabItem>
<TabItem label="Custom proxy settings">
<FlattenedSteps>
<DesktopSidebarSettingsMenu />
1. Select the **Network** tab.
1. Click **Manual proxy configuration**.
1. Either enter a URL for **PAC script**, or fill out **Proxy rules** and
**Proxy bypass rules**.
1. Click **Save changes**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Additional tips for custom proxy settings
In most corporate environments, your network administrator will provide a
URL for the **PAC script**.
The second most common configuration is that your network administrator has
set up a proxy server for accessing the public internet, but URLs on the
local network must be accessed directly. In that case set **Proxy rules** to
the URL of the proxy server (it may look something like
`http://proxy.example.edu:port`), and **Proxy bypass rules** to cover local URLs
(it may look something like `*.example.edu,10.0.0.0/8`).
If either of those apply, you can skip the rest of this guide. If not, we
document the syntax for **Proxy rules** and **Proxy bypass rules** below.
### Proxy rules
A semicolon-separated list of `protocolRule`s.
```
protocolRule -> [<protocol>"="]<URLList>
protocol -> "http" | "https" | "ftp" | "socks"
URLList -> comma-separated list of URLs, ["direct://"]
```
Some examples:
* `http=http://foo:80;ftp=http://bar:1080` - Use proxy `http://foo:80`
for `http://` URLs, and proxy `http://bar:1080` for `ftp://` URLs.
* `http://foo:80` - Use proxy `http://foo:80` for all URLs.
* `http://foo:80,socks5://bar,direct://` - Use proxy `http://foo:80` for
all URLs, failing over to `socks5://bar` if `http://foo:80` is
unavailable, and after that using no proxy.
* `http=http://foo;socks5://bar` - Use proxy `http://foo` for `http://` URLs,
and use `socks5://bar` for all other URLs.
### Proxy bypass rules
A comma-separated list of URIs. The URIs can be hostnames, IP address
literals, or IP ranges in CIDR notation. Hostnames can use the `*`
wildcard. Use `<local>` to match any of `127.0.0.1`, `::1`, or `localhost`.

View File

@@ -0,0 +1,85 @@
---
title: Contact support
---
We're here to help! This page will guide you to the best way to reach us.
## Zulip community
The primary communication forum for the Zulip community is the Zulip server
hosted at chat.zulip.org. Users and administrators of Zulip organizations stop
by to ask questions, offer feedback, and participate in product design
discussions.
Everyone is welcome to sign up and participate — we love hearing from our users!
Please see the [Zulip development community][development-community] guide for
detailed instructions on how to join the community, [community norms][community-norms]
and [where][development-community-channels] to ask your questions or give
feedback.
## Support requests
* For support requests regarding your Zulip Cloud organization, you can request
interactive chat support in the [Zulip development
community](#zulip-community), or [email Zulip
support](mailto:support@zulip.com).
* Response time: Usually within 1-3 business days, or within one business
day for paid customers.
* For support requests regarding your **self-hosted server**:
* **Business** and **Enterprise** plan customers can request interactive
chat support in the [Zulip development community](#zulip-community),
or [email Zulip support](mailto:support@zulip.com). Phone support is
available for Enterprise customers upon request.
* Response time: Usually within one business day.
* **Free** and **Community** plan customers can ask for help in the
[Zulip development community](#zulip-community). You will usually get a
friendly reply within 1-3 business days.
## Sales, billing, and partnerships
For **sales**, **billing**, **partnerships**, and **other commercial
questions**, contact [sales@zulip.com](mailto:sales@zulip.com). Response time:
Usually within one business day.
## Product feedback
Your feedback helps us make Zulip better for everyone! Please reach out if you
have questions, suggestions, or just want to brainstorm how to make Zulip work
for your organization.
* There are [several
ways](https://zulip.readthedocs.io/en/latest/contributing/reporting-bugs.html)
to **report possible bugs**.
* Response time: Usually within 1-3 business days in the [Zulip development
community](#zulip-community) or by email, or within one week [on
GitHub](https://github.com/zulip).
* You can [**request
features**](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html)
or [**share
feedback**](https://zulip.readthedocs.io/en/latest/contributing/suggesting-features.html#evaluation-and-onboarding-feedback).
Many improvements to the Zulip app start with a user's suggestion.
* Response time: Usually within 1-3 business days in the [Zulip development
community](#zulip-community) or by email, or within one week [on
GitHub](https://github.com/zulip).
* To **report issues or share feedback privately**, contact
[feedback@zulip.com](mailto:feedback@zulip.com). This works well if you'd like
to include details about your organization that shouldn't be posted in public.
* Response time: Usually within 1-3 business days.
[development-community]: https://zulip.com/development-community/
[community-norms]: https://zulip.com/development-community/#community-norms
[development-community-channels]: https://zulip.com/development-community/#channels-for-zulip-users-and-administrators
## Security
If you believe you've identified a security issue, please report it to Zulip's
security team at [security@zulip.com](mailto:security@zulip.com) as soon as
possible, so that we can address it and make a responsible disclosure.
## Related articles
* [Zulip Cloud billing](/help/zulip-cloud-billing)
* [View Zulip version](/help/view-zulip-version)

View File

@@ -0,0 +1,21 @@
---
title: Create a channel
---
import CreateAChannelInstructions from "../include/_CreateAChannelInstructions.mdx";
import DependsOnPermissions from "../include/_DependsOnPermissions.mdx";
<DependsOnPermissions />
If you are an administrator setting up channels for the first time, check out our
[guide to setting up channels for a new organization](/help/create-channels).
<CreateAChannelInstructions />
## Related articles
* [Create channels for a new organization](/help/create-channels)
* [Channel permissions](/help/channel-permissions)
* [Set default channels for new users](/help/set-default-channels-for-new-users)
* [Introduction to channels](/help/introduction-to-channels)
* [Restrict channel creation](/help/configure-who-can-create-channels)

View File

@@ -0,0 +1,103 @@
---
title: Polls
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import EndComposing from "../include/_EndComposing.mdx";
import PollsExamples from "../include/_PollsExamples.mdx";
import PollsIntro from "../include/_PollsIntro.mdx";
import StartComposing from "../include/_StartComposing.mdx";
import CheckIcon from "~icons/fa/check";
import PencilIcon from "~icons/fa/pencil";
import RemoveIcon from "~icons/fa/remove";
import GripVerticalIcon from "~icons/zulip-icon/grip-vertical";
import PollIcon from "~icons/zulip-icon/poll";
import TrashIcon from "~icons/zulip-icon/trash";
<PollsIntro />
## Create a poll
<Tabs>
<TabItem label="Via compose box button">
<FlattenedSteps>
<StartComposing />
1. Make sure the compose box is empty.
1. Click the **add poll** (<PollIcon />) icon at the bottom of the compose box.
1. Fill out poll information as desired, and click **Add poll** to insert poll
formatting.
<EndComposing />
</FlattenedSteps>
<ZulipTip>
To reorder the list of options, click and drag the **vertical dots**
(<GripVerticalIcon />) to the left of each
option. To delete an option, click the **delete**
(<TrashIcon />) icon to the right of it.
</ZulipTip>
</TabItem>
<TabItem label="Via Markdown">
<FlattenedSteps>
<StartComposing />
1. Make sure the compose box is empty.
1. Type `/poll` followed by a space, and the question you want to ask.
1. *(optional)* Type each option on a new line.
<EndComposing />
</FlattenedSteps>
<ZulipTip>
You will be able to add options after the poll is created.
</ZulipTip>
</TabItem>
</Tabs>
## Add options to a poll
<ZulipNote>
To preserve the meaning of votes in the poll, existing poll options cannot
be modified.
</ZulipNote>
<Steps>
1. Fill out the **New option** field at the bottom of the poll.
1. Click **Add option** or press <kbd>Enter</kbd> to add the new option to
the poll.
</Steps>
## Edit the question
<ZulipNote>
Only the creator of a poll can edit the question.
</ZulipNote>
<Steps>
1. Click the **pencil** (<PencilIcon />) icon
to the right of the question.
1. Edit the question as desired.
1. Click the **checkmark** (<CheckIcon />) icon or press
<kbd>Enter</kbd> to save your changes.
</Steps>
<ZulipTip>
You can click the <RemoveIcon /> icon or press
<kbd>Esc</kbd> to discard your changes.
</ZulipTip>
## Examples
<PollsExamples />
## Related articles
* [Message formatting](/help/format-your-message-using-markdown)
* [Collaborative to-do lists](/help/collaborative-to-do-lists)

View File

@@ -0,0 +1,56 @@
---
title: Create an organization
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import ZulipNote from "../../components/ZulipNote.astro";
import CreateADemoOrganization from "../include/_CreateADemoOrganization.mdx";
import DemoOrgsConversion from "../include/_DemoOrgsConversion.mdx";
import DemoOrgsIntro from "../include/_DemoOrgsIntro.mdx";
import ZulipCloudOnly from "../include/_ZulipCloudOnly.mdx";
It only takes a minute to create a new organization on Zulip Cloud, or on a
self-hosted Zulip server you've set up.
<DemoOrgsIntro />
## Create a demo organization
<ZulipCloudOnly />
<DemoOrgsConversion />
<CreateADemoOrganization />
## Create a regular organization
<Tabs>
<TabItem label="Zulip Cloud">
<ZulipNote>
To import data from another app, follow the import instructions for
[Slack](/help/import-from-slack), [Mattermost](/help/import-from-mattermost)
or [Rocket.Chat](/help/import-from-rocketchat).
</ZulipNote>
1. Decide on a name and subdomain for your organization.
1. Fill out the form at [https://zulip.com/new/](https://zulip.com/new/), and click **Create organization**.
1. Click **Complete registration** in the confirmation email you received.
1. Fill out your account information, and click **Sign up**.
</TabItem>
<TabItem label="Self hosting">
1. Follow the [guide to install your server](https://zulip.readthedocs.io/en/stable/production/install.html).
1. Decide on a name and subdomain for your organization.
1. Fill out the form at the URL provided by the installation script, and click **Create organization**.
1. Fill out your account information, and click **Sign up**.
</TabItem>
</Tabs>
## Related articles
* [Getting started with Zulip](/help/getting-started-with-zulip)
* [Trying out Zulip](/help/trying-out-zulip)
* [Moving to Zulip](/help/moving-to-zulip)
* [Zulip Cloud or self-hosting?](/help/zulip-cloud-or-self-hosting)
* [Migrating from other chat tools](/help/migrating-from-other-chat-tools)

View File

@@ -0,0 +1,42 @@
---
title: Create channels
---
import CreateAChannelInstructions from "../include/_CreateAChannelInstructions.mdx";
import CreateChannelsIntro from "../include/_CreateChannelsIntro.mdx";
<CreateChannelsIntro />
## How to create a channel
<CreateAChannelInstructions />
## Tips for creating channels
* It's often best to start with just a few channels, and add more as
needed. For small teams, you can start with the default channels
and go from there.
* A channel's name can be in any language, and can include spaces, punctuation,
and Unicode emoji. For large organizations, we recommend using a consistent naming
scheme, like `#marketing/<name>` or `#mk/<name>` for all channels
pertaining to the marketing team, `#help/<team name>` for
`<team name>`'s internal support channel, etc.
* You can [pin reference information](/help/pin-information), such as important
messages or topics, and external references, in the
[description](/help/view-channel-information#view-channel-description) for a
channel.
* For open source projects or other volunteer organizations, consider
adding default channels like **#announce** for announcements, **#new
members** for new members to introduce themselves and be welcomed,
and **#help** so that there's a clear place users stopping by with
just a single question can post.
* For channels where it's important that everyone stays on top of new messages,
organization administrators can [enable mobile notifications](/help/enable-mobile-notifications-by-default)
as a default for new subscribers.
## Related articles
* [Moving to Zulip](/help/moving-to-zulip)
* [Channel permissions](/help/channel-permissions)
* [Set default channels for new users](/help/set-default-channels-for-new-users)
* [Getting started with Zulip](/help/getting-started-with-zulip)

View File

@@ -0,0 +1,34 @@
---
title: Create user groups
---
import CloudPaidPlansOnly from "../include/_CloudPaidPlansOnly.mdx";
import HowToCreateAUserGroup from "../include/_HowToCreateAUserGroup.mdx";
import UserGroupsApplications from "../include/_UserGroupsApplications.mdx";
import UserGroupsIntro from "../include/_UserGroupsIntro.mdx";
import UserSubgroupsIntro from "../include/_UserSubgroupsIntro.mdx";
<CloudPaidPlansOnly />
<UserGroupsIntro />
Many organizations find it helpful to create groups for:
* Each team, e.g., “mobile”, “design”, or “IT”.
* Leadership roles, e.g., “managers”, “engineering-managers”.
<UserSubgroupsIntro />
<UserGroupsApplications />
## How to create a user group
<HowToCreateAUserGroup />
## Related articles
* [Moving to Zulip](/help/moving-to-zulip)
* [User groups](/help/user-groups)
* [Manage user groups](/help/manage-user-groups)
* [Invite users to join](/help/invite-users-to-join)
* [Getting started with Zulip](/help/getting-started-with-zulip)

View File

@@ -0,0 +1,59 @@
---
title: Create your organization profile
---
import AddAWideLogo from "../include/_AddAWideLogo.mdx";
import AdminOnly from "../include/_AdminOnly.mdx";
import CommunitiesDirectoryInstructions from "../include/_CommunitiesDirectoryInstructions.mdx";
import CommunitiesDirectoryIntro from "../include/_CommunitiesDirectoryIntro.mdx";
import EditOrganizationProfile from "../include/_EditOrganizationProfile.mdx";
<AdminOnly />
Your organization's profile includes its **name**,
[**type**](/help/organization-type), **description**, **profile picture**, and
**logo**. The name, description and profile picture appear on the registration
and login pages for your organization, and (optionally) in the [communities
directory](/help/communities-directory).
* The **organization name** also appears in the title of your Zulip browser tab
or Desktop app, and in email and desktop notifications. It's best to keep it
short.
* The **organization type** is used to customize the experience for users
in your organization, including initial organization settings and
Welcome Bot messages received by new users.
* The **organization description** supports [full Markdown
formatting](/help/format-your-message-using-markdown), including
**bold**/*italic*, links, lists, and more.
* The **organization profile picture** is a square image that is also used for
[switching between organizations](/help/switching-between-organizations) in
the desktop app. It will be displayed at 100×100 pixels, or more on
high-resolution displays.
* The [**organization logo**](#add-a-wide-logo) replaces the Zulip logo in the
upper left corner of the web and desktop apps.
## Edit organization profile
<EditOrganizationProfile />
## Zulip communities directory
<CommunitiesDirectoryIntro />
### Change whether your organization may be listed in the Zulip communities directory
<CommunitiesDirectoryInstructions />
For more details, see [Communities directory](/help/communities-directory).
## Add a wide logo
<AddAWideLogo />
## Related articles
* [Moving to Zulip](/help/moving-to-zulip)
* [Customize organization settings](/help/customize-organization-settings)
* [Create channels](/help/create-channels)
* [Communities directory](/help/communities-directory)
* [Getting started with Zulip](/help/getting-started-with-zulip)

View File

@@ -0,0 +1,91 @@
---
title: Use a custom certificate
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import DesktopSidebarSettingsMenu from "../include/_DesktopSidebarSettingsMenu.mdx";
By default, Zulip requests a generally-accepted certificate during the
server install process, for the server's public hostname. In some
cases, a server administrator may choose not to use that feature, in
which case your Zulip server may be using a self-signed
certificate. This is most common for Zulip servers not connected to
the public internet.
## Web
Most browsers will show a warning if you try to connect to a Zulip server
with a self-signed certificate.
If you are absolutely, 100% sure that the Zulip server you are connecting to
is supposed to have a self-signed certificate, click through the warnings
and follow the instructions on-screen.
If you are less than 100% sure, contact your server
administrator. Accepting a malicious self-signed certificate would
give a stranger full access to your Zulip account, including your
username and password.
## Desktop
Zulip Desktop uses the operating system's certificate store, like your web
browser.
<Tabs>
<TabItem label="macOS">
<Steps>
1. Hit `Cmd` + `Space` to bring up Spotlight Search, type **Keychain
Access**, and press Enter.
1. From the **File** menu, choose **Import Items...**
1. Navigate to the certificate file, then click **Open**.
1. Right-click the newly-added certificate, and click **Get Info** from
the context menu.
1. Expand the **Trust** section.
1. Select **Always Trust** for the **Secure Sockets Layer (SSL)** option.
1. Close the window. You will be prompted for your password to verify
the change.
1. Restart the Zulip Desktop application.
</Steps>
</TabItem>
<TabItem label="Windows">
On Windows, Zulip Desktop shares the certificate store with
Google Chrome, so you can add certificates to it from inside
Chrome.
<Steps>
1. Open Google Chrome.
1. From the Chrome menu (⋮) in the top-right, select **Settings**.
1. In the **Privacy and Security** section, click **Security**.
1. Scroll down to and click **Manage Certificates**.
1. Select the **Trusted Root Certification Authorities** tab.
1. Select **Import...**
1. Navigate to the certificate file, then click **Open**.
1. Select **Done**.
1. Restart the Zulip Desktop application.
</Steps>
</TabItem>
<TabItem label="Linux">
The required packages and steps vary by distribution; see the Chromium
documentation for [detailed documentation][linux]. On most systems,
once the `nss` tools are installed, the command to trust the
certificate is:
```bash "path/to/certificate.pem"
certutil -d sql:$HOME/.pki/nssdb -A -t "P,," -n zulip \
-i path/to/certificate.pem
```
You will need to restart the Zulip Desktop application to pick up the
new certificate.
</TabItem>
</Tabs>
[linux]: https://chromium.googlesource.com/chromium/src.git/+/main/docs/linux/cert_management.md
## Related articles
* [Installing SSL certificates](https://zulip.readthedocs.io/en/stable/production/ssl-certificates.html)

View File

@@ -0,0 +1,88 @@
---
title: Custom emoji
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import SaveChanges from "../include/_SaveChanges.mdx";
import TrashIcon from "~icons/zulip-icon/trash";
Custom emoji can be used by all users in an organization (including
bots). They are supported everywhere that Zulip supports emoji,
including [emoji reactions][emoji-reactions],
[messages][emoji-messages], [channel descriptions][emoji-channels] and
[user statuses][emoji-status].
[emoji-reactions]: /help/emoji-reactions
[emoji-messages]: /help/format-your-message-using-markdown#emoji-and-emoticons
[emoji-channels]: /help/change-the-channel-description
[emoji-status]: /help/status-and-availability
## Add custom emoji
<FlattenedSteps>
<NavigationSteps target="settings/emoji-settings" />
1. Click **Add a new emoji**.
1. Click **Upload image or GIF**, and add a file in the PNG, JPG, or
GIF file format. Zulip will automatically scale the image down to
25x25 pixels.
1. Enter an **Emoji name**, and click **Confirm**.
</FlattenedSteps>
**Emoji names** can only contain `a-z`, `0-9`, dashes (`-`), and spaces.
Upper and lower case letters are treated the same, and underscores (`_`)
are treated the same as spaces.
### Bulk add emoji
We expose a [REST API endpoint](/api/upload-custom-emoji) for bulk uploading
emoji. Using REST API endpoints requires some technical expertise;
[contact us](/help/contact-support) if you get stuck.
## Replace a default emoji
You can replace a default emoji by adding a custom emoji of the same
name. If an emoji has several names, you must use the emoji's primary name
to replace it. You can find the primary name of an emoji by hovering over it
in the [emoji picker](/help/emoji-and-emoticons#use-an-emoji-in-your-message),
while the search box is empty (you may have to scroll down a bit to find it).
## Deactivate custom emoji
<FlattenedSteps>
<NavigationSteps target="settings/emoji-settings" />
1. Click the **deactivate** (<TrashIcon />) icon next to the
emoji that you would like to deactivate.
</FlattenedSteps>
Deactivating an emoji will not affect any existing messages or emoji
reactions. Anyone can deactivate custom emoji they added, and organization
administrators can deactivate anyone's custom emoji.
## Change who can add custom emoji
<AdminOnly />
You can configure who can add custom emoji. This permission can be granted to
any combination of [roles](/help/user-roles), [groups](/help/user-groups), and
individual [users](/help/introduction-to-users).
<FlattenedSteps>
<NavigationSteps target="settings/organization-permissions" />
1. Under **Other permissions**, configure **Who can add custom emoji**.
<SaveChanges />
</FlattenedSteps>
## Related articles
* [Emoji and emoticons](/help/emoji-and-emoticons)
* [Emoji reactions](/help/emoji-reactions)

View File

@@ -0,0 +1,183 @@
---
title: Custom profile fields
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import EditIcon from "~icons/zulip-icon/edit";
import TrashIcon from "~icons/zulip-icon/trash";
<AdminOnly />
[User cards](/help/user-cards) show basic information about a user, and [user
profiles](/help/view-someones-profile) provide additional details. You can add
custom profile fields to user cards and user profiles, making it easy for users
to share information, such as their pronouns, job title, or team.
Zulip supports many types of profile fields, such as dates, lists of options,
account links, and [more](#profile-field-types). You can choose which
custom profile fields to [display](#display-custom-fields-on-user-card) on user
cards. Custom profile fields can be optional or
[required](#make-a-custom-profile-field-required).
You can [configure](#use-a-custom-profile-field-in--mention-suggestions)
**External account** and **Short text** custom profile fields to be used for
[@-mention](/help/mention-a-user-or-group) suggestions. For example, users could
be mentioned by their GitHub or Mastodon usernames.
Zulip supports synchronizing custom profile fields from an external
user database such as LDAP or SAML. See the [authentication
methods][authentication-production] documentation for details.
## Add a custom profile field
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. Click **Add a new profile field**.
1. Fill out profile field information as desired, and click **Add**.
1. In the **Labels** column, click and drag the vertical dots to reorder the
list of custom profile fields.
</FlattenedSteps>
## Edit a custom profile field
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the profile field you want to edit.
1. Edit profile field information as desired, and click **Save changes**.
</FlattenedSteps>
## Delete a custom profile field
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **delete** (<TrashIcon />) icon for the profile field you want to delete.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## Reorder custom profile fields
Users will see custom profile fields in the specified order.
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Labels** column, click and drag the vertical dots to reorder the
list of custom profile fields.
</FlattenedSteps>
## Display custom fields on user card
Organizations may find it useful to display additional fields on the
user card, such as pronouns, GitHub username, job title, team, etc.
All field types other than "Person" have a checkbox option
that controls whether to display a custom field on the user card.
There's a limit to the number of custom profile fields that can be displayed
at a time. If the maximum number of fields is already selected, all unselected
checkboxes will be disabled.
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the profile field you want to edit.
1. Toggle **Display on user card**.
1. Click **Save changes**.
</FlattenedSteps>
<ZulipTip>
You can also choose which custom profile fields will be displayed by toggling
the checkboxes in the **Card** column of the **Custom profile fields** table.
</ZulipTip>
## Make a custom profile field required
If a custom profile field is required, users who have left it blank will see a
banner every time they open the Zulip web or desktop app prompting them to fill
it out.
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the profile field you want to edit.
1. Toggle **Required field**.
1. Click **Save changes**.
</FlattenedSteps>
<ZulipTip>
You can also choose which custom profile fields are required by toggling the
checkboxes in the **Required** column of the **Custom profile fields** table.
</ZulipTip>
## Use a custom profile field in @-mention suggestions
**External account** and **Short text** custom profile fields can be used for
[@-mention](/help/mention-a-user-or-group) suggestions.
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the profile field you want to edit.
1. Toggle **Use in @-mention suggestions**.
1. Click **Save changes**.
</FlattenedSteps>
## Configure whether users can edit custom profile fields
You can configure whether users in your organization can edit custom profile
fields for their own account. For example, you may want to restrict editing if
syncing profile fields from an employee directory.
<FlattenedSteps>
<NavigationSteps target="settings/profile-field-settings" />
1. In the **Actions** column, click the **edit** (<EditIcon />)
icon for the profile field you want to configure.
1. Toggle **Users can edit this field for their own account**.
1. Click **Save changes**.
</FlattenedSteps>
## Profile field types
Choose the profile field type that's most appropriate for the requested information.
* **Date**: For dates (e.g., birthdays or work anniversaries).
* **Link**: For links to websites, including company-internal pages.
* **External account**: For linking to an external account (e.g., GitHub,
GitLab, LinkedIn, etc.). You can
[configure](#use-a-custom-profile-field-in--mention-suggestions) this field to
be used for [@-mention](/help/mention-a-user-or-group) suggestions. Some
integrations ([Bitbucket](/integrations/bitbucket),
[GitHub](/integrations/github), [GitLab](/integrations/gitlab),
[Jira](/integrations/jira)) use [silent
mentions](/help/mention-a-user-or-group#silently-mention-a-user) to refer to
users if a matching external account is configured.
* **Dropdown**: A dropdown with a list of predefined options (e.g.,
office location).
* **Pronouns**: What pronouns should people use to refer to the user? Pronouns
are displayed in [user mention](/help/mention-a-user-or-group) autocomplete
suggestions.
* **Paragraph**: For multiline responses (e.g., a user's intro message).
* **Short text**: For one-line responses up to 50 characters (e.g., team name or
role in your organization). You can
[configure](#use-a-custom-profile-field-in--mention-suggestions) this field to
be used for [@-mention](/help/mention-a-user-or-group) suggestions.
* **Users**: For selecting one or more users (e.g., manager or direct reports).
## Related articles
* [Edit your profile](/help/edit-your-profile)
* [User cards](/help/user-cards)
* [View someone's profile](/help/view-someones-profile)
[authentication-production]: https://zulip.readthedocs.io/en/stable/production/authentication-methods.html

View File

@@ -0,0 +1,46 @@
---
title: Customize organization settings
---
import ReviewOrganizationSettingsInstructions from "../include/_ReviewOrganizationSettingsInstructions.mdx";
<ReviewOrganizationSettingsInstructions />
A few settings to highlight:
* Decide [who can invite new users][who-can-invite], or whether
[anyone can join without an invitation][who-can-join].
* [Set visibility for users' email addresses][email-address-visibility].
* If your organization uses a programming language, set the [default
language for code blocks][default-code-block-language]. Also
consider setting up [code playgrounds][code-playgrounds].
* If your organization uses code repositories, [set up
linkifiers](/help/add-a-custom-linkifier) to make it easy to link to
issues (e.g., just by typing #1234 for issue 1234).
* [Add custom emoji](/help/custom-emoji), including your organization's logo.
For many other settings, e.g., [message][message-editing-permissions] and
[topic][topic-editing-permissions] editing permissions, you can experience how
Zulip works for your organization before deciding what settings are best for
you.
[message-editing-permissions]: /help/restrict-message-editing-and-deletion
[topic-editing-permissions]: /help/restrict-moving-messages
[default-code-block-language]: /help/code-blocks#default-code-block-language
[code-playgrounds]: /help/code-blocks#code-playgrounds
[email-address-visibility]: /help/configure-email-visibility
[who-can-invite]: /help/restrict-account-creation#change-who-can-send-invitations
[who-can-join]: /help/restrict-account-creation#set-whether-invitations-are-required-to-join
## Related articles
* [Moving to Zulip](/help/moving-to-zulip)
* [Create your organization profile](/help/create-your-organization-profile)
* [Create channels](/help/create-channels)
* [Getting started with Zulip](/help/getting-started-with-zulip)

View File

@@ -0,0 +1,14 @@
---
title: Customize settings for new users
---
import CustomizeSettingsForNewUsers from "../include/_CustomizeSettingsForNewUsers.mdx";
<CustomizeSettingsForNewUsers />
## Related articles
* [Moving to Zulip](/help/moving-to-zulip)
* [Invite users to join](/help/invite-users-to-join)
* [Getting started with Zulip](/help/getting-started-with-zulip)
* [Reset settings for users](/help/reset-settings-for-users)

View File

@@ -0,0 +1,47 @@
---
title: Dark theme
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import MobileSettings from "../include/_MobileSettings.mdx";
import PersonalMenu from "../include/_PersonalMenu.mdx";
Zulip provides both a light theme and a dark theme, which is great
for working in a dark space.
## Manage color theme
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<PersonalMenu />
1. Select the desired theme using the row of icons in the middle of the menu.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MobileSettings />
1. Select the desired theme.
</FlattenedSteps>
</TabItem>
</Tabs>
The default is **Automatic** (for the desktop and web apps) or **System** (for the
mobile apps). This setting detects which theme to use based on the color scheme
used by your device's operating system.
You can also specify **Light** or **Dark** if you'd like Zulip to use the same
color scheme regardless of your operating system configuration.
## Related articles
* [Set up your account](/help/set-up-your-account)
* [Review your settings](/help/review-your-settings)
* [Configure default new user settings](/help/configure-default-new-user-settings)
* [Font size](/help/font-size)
* [Line spacing](/help/line-spacing)

View File

@@ -0,0 +1,65 @@
---
title: Deactivate a user group
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import UserGroupPlusIcon from "~icons/zulip-icon/user-group-plus";
import UserGroupXIcon from "~icons/zulip-icon/user-group-x";
You can deactivate groups you no longer plan to use. Deactivated groups cannot be [mentioned](/help/mention-a-user-or-group), or used for any [permissions](/help/manage-permissions).
## Deactivate a user group
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/group/all" />
1. Select a user group.
1. Select the **Permissions** tab on the right.
1. Remove all permissions.
1. Click the **deactivate group** (<UserGroupXIcon />) button in the
upper right corner of the user group settings panel.
1. Click **Confirm**.
</FlattenedSteps>
</TabItem>
</Tabs>
## View deactivated user groups
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/group/all" />
1. Select **Deactivated groups** from the dropdown next to the **Filter** box
above the list of groups.
</FlattenedSteps>
</TabItem>
</Tabs>
## Reactivate a user group
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="relative/group/all" />
1. Select **Deactivated groups** from the dropdown next to the **Filter** box
above the list of groups.
1. Select a user group.
1. Click the **reactivate group** (<UserGroupPlusIcon />) button in the
upper right corner of the user group settings panel.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [User groups](/help/user-groups)
* [Create user groups](/help/create-user-groups)
* [Manage user groups](/help/manage-user-groups)

View File

@@ -0,0 +1,83 @@
---
title: Deactivate or reactivate a bot
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import UserCogIcon from "~icons/zulip-icon/user-cog";
import UserPlusIcon from "~icons/zulip-icon/user-plus";
import UserXIcon from "~icons/zulip-icon/user-x";
By default, users can deactivate and reactivate the bots that they
add. Organization admins can prevent users from reactivating bots by
[restricting bot creation](/help/restrict-bot-creation).
Organization administrators can also deactivate or reactivate any existing
bot, regardless of who owns them.
## Deactivate a bot
<Tabs>
<TabItem label="Your bots">
<FlattenedSteps>
<NavigationSteps target="settings/your-bots" />
1. In the **Actions** column, click the **deactivate bot** (<UserXIcon />)
icon for the bot you want to deactivate.
1. Approve by clicking **Deactivate**.
</FlattenedSteps>
</TabItem>
<TabItem label="All bots">
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/bots" />
1. In the **Actions** column, click the **deactivate bot** (<UserXIcon />)
icon for the bot you want to deactivate.
1. Approve by clicking **Deactivate**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Reactivate a bot
<Tabs>
<TabItem label="Your bots">
<FlattenedSteps>
<NavigationSteps target="settings/your-bots" />
1. Select **Deactivated** from the dropdown above the **Bots** table.
1. In the **Actions** column, click the **reactivate bot** (<UserPlusIcon />)
icon for the bot you want to reactivate.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
</TabItem>
<TabItem label="All bots">
<AdminOnly />
<FlattenedSteps>
<NavigationSteps target="settings/bots" />
1. Select **Deactivated** from the dropdown above the **Bots** table.
1. In the **Actions** column, click the **reactivate bot** (<UserPlusIcon />)
icon for the bot you want to reactivate.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Related articles
* [Bots overview](/help/bots-overview)
* [Integrations overview](/help/integrations-overview)
* [Add a bot or integration](/help/add-a-bot-or-integration)
* [Manage a bot](/help/manage-a-bot)
* [Restrict bot creation](/help/restrict-bot-creation)
* [View all bots in your organization](/help/view-all-bots-in-your-organization)

View File

@@ -0,0 +1,135 @@
---
title: Deactivate or reactivate a user
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import ManageThisUser from "../include/_ManageThisUser.mdx";
import ManageUserTabTip from "../include/_ManageUserTabTip.mdx";
import UserCircleDeactivatedIcon from "~icons/zulip-icon/user-circle-deactivated";
import UserPlusIcon from "~icons/zulip-icon/user-plus";
import UserXIcon from "~icons/zulip-icon/user-x";
## Deactivating a user
<AdminOnly />
When you deactivate a user:
* The user will be immediately logged out of all Zulip sessions, including
desktop, web and mobile apps.
* The user's credentials for logging in will no longer work, including password
login and [any other login options](/help/configure-authentication-methods)
enabled in your organization.
* The user's [bots](/help/bots-overview) will be deactivated.
* [Email invitations and invite links](/help/invite-new-users) created by the
user will be disabled.
* Other users will be able to see that the user has been deactivated (e.g., on
their [user card](/help/user-cards)). In sidebars and elsewhere, a user's
[availability](/help/status-and-availability) will be replaced with a
deactivated icon
(<UserCircleDeactivatedIcon />).
* Even if your organization [allows users to join without an
invitation](/help/restrict-account-creation#set-whether-invitations-are-required-to-join),
this user will not be able to rejoin with the same email account.
* You can choose whether to delete the user's name, profile picture,
and messages they've sent (e.g., their DMs or channel messages).
<ZulipNote>
You must go through the deactivation process below to fully remove a user's
access to your Zulip organization. Changing a user's password or removing
their single sign-on account will not log them out of their open Zulip
sessions, or disable their API keys.
</ZulipNote>
### Deactivate a user
<Tabs>
<TabItem label="Via user profile">
<FlattenedSteps>
<ManageThisUser />
1. Click **Deactivate user** at the bottom of the **Manage user** menu.
1. *(optional)* Select **Notify this user by email?** if desired, and enter a
custom comment to include in the notification email.
1. Choose whether to delete the user's name, profile picture, and messages
they've sent (e.g., their DMs or channel messages).
1. Approve by clicking **Deactivate**.
</FlattenedSteps>
<ManageUserTabTip />
</TabItem>
<TabItem label="Via organization settings">
<FlattenedSteps>
<NavigationSteps target="settings/users" />
1. In the **Actions** column, click the **deactivate user** (<UserXIcon />)
icon for the user you want to deactivate.
1. *(optional)* Select **Notify this user by email?** if desired, and enter a
custom comment to include in the notification email.
1. Choose whether to delete the user's name, profile picture, and messages
they've sent (e.g., their DMs or channel messages).
1. Approve by clicking **Deactivate**.
</FlattenedSteps>
</TabItem>
</Tabs>
<ZulipTip>
Organization administrators cannot deactivate organization owners.
</ZulipTip>
## Reactivating a user
<AdminOnly />
A reactivated user will have the same role, channel subscriptions, user group
memberships, and other settings and permissions as they did prior to
deactivation. They will also have the same API key and bot API keys, but their
bots will be deactivated until the user manually
[reactivates](/help/deactivate-or-reactivate-a-bot) them again.
### Reactivate a user
<Tabs>
<TabItem label="Via organization settings">
<FlattenedSteps>
<NavigationSteps target="settings/deactivated" />
1. Select the **Deactivated** tab.
1. In the **Actions** column, click the **reactivate user** (<UserPlusIcon />) icon for the user you want to reactivate.
</FlattenedSteps>
</TabItem>
<TabItem label="Via user profile">
<Steps>
1. Click on a user's profile picture or name on a message they sent
to open their **user card**.
1. Click **View profile**.
1. Select the **Manage user** tab.
1. Click **Reactivate user** at the bottom of the **Manage user** menu.
1. Approve by clicking **Confirm**.
</Steps>
<ManageUserTabTip />
</TabItem>
</Tabs>
<ZulipTip>
You may want to [review and adjust](/help/manage-user-channel-subscriptions)
the reactivated user's channel subscriptions.
</ZulipTip>
## Related articles
* [Mute a user](/help/mute-a-user)
* [Change a user's role](/help/user-roles#change-a-users-role)
* [Change a user's name](/help/change-a-users-name)
* [Deactivate your account](/help/deactivate-your-account)
* [Manage a user](/help/manage-a-user)

View File

@@ -0,0 +1,58 @@
---
title: Deactivate your account
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
In Zulip, you have a dedicated account for each organization you belong to.
Deactivating your Zulip account in one organization will have no effect on any
other Zulip accounts you may have.
Once you deactivate your account, you cannot register in the same organization
with the email address you used before. If you are re-joining an organization,
ask an organization administrator to
[reactivate](/help/deactivate-or-reactivate-a-user#reactivate-a-user) your
account.
<ZulipTip>
You can find all the Zulip Cloud accounts associated with your email address
with the [**Find your accounts**](https://zulip.com/accounts/find/) tool.
If you have forgotten your account password, you can
[reset it](/help/change-your-password).
</ZulipTip>
## Deactivate your account
<ZulipNote>
If you are the only owner in the organization, you cannot
deactivate your account. You will need to
[add another owner](/help/user-roles#change-a-users-role) first.
</ZulipNote>
<FlattenedSteps>
<NavigationSteps target="settings/account-and-privacy" />
1. Under **Account**, click **Deactivate account**.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## What happens when you deactivate an account
* Your [user card](/help/user-cards) will have a notice indicating that your
account has been deactivated.
* Deactivating your account won't delete messages you've sent or files
you've shared. If permitted in your organization, delete content you'd
like to remove before deactivating your account.
* Any bots that you maintain will be disabled.
## Related articles
* [Logging in](/help/logging-in)
* [Logging out](/help/logging-out)
* [Change your password](/help/change-your-password)
* [Switching between organizations](/help/switching-between-organizations)
* [Deactivate or reactivate a user](/help/deactivate-or-reactivate-a-user)
* [Deactivate your organization](/help/deactivate-your-organization)

View File

@@ -0,0 +1,36 @@
---
title: Deactivate your organization
---
import {SUPPORT_EMAIL} from "astro:env/client";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import OwnerOnly from "../include/_OwnerOnly.mdx";
If you are no longer using a Zulip organization, you can deactivate it. When you
deactivate an organization, you can specify the time period after which the
organization's data will be permanently deleted.
## Deactivate an organization
<OwnerOnly />
<FlattenedSteps>
<NavigationSteps target="settings/organization-profile" />
1. Under **Deactivate organization**, click **Deactivate organization**.
1. Select when the organization's data (users, channels, messages, etc.)
should be permanently deleted.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## Restore a deactivated organization
A deactivated organization can be restored until its data is deleted.
If you deactivated your organization by accident, please contact
<a href={`mailto:${SUPPORT_EMAIL}`}>{SUPPORT_EMAIL}</a> as soon as possible.
## Related articles
* [Deactivate your account](/help/deactivate-your-account)

View File

@@ -0,0 +1,128 @@
---
title: Delete a message
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import DependsOnPermissions from "../include/_DependsOnPermissions.mdx";
import MessageActions from "../include/_MessageActions.mdx";
import MessageActionsMenu from "../include/_MessageActionsMenu.mdx";
import MessageLongPressMenu from "../include/_MessageLongPressMenu.mdx";
import EditIcon from "~icons/zulip-icon/edit";
Zulip lets you delete the content of your messages or delete messages completely
if these actions are allowed in your organization. Only server administrators
can restore deleted messages.
Organization administrators can
[configure](/help/restrict-message-editing-and-deletion) who can edit and delete
their own messages, and who can delete any message. They can also set time
limits on message editing and deletion.
## Delete message content
Editing a message to delete its content will cause the message to be displayed
as **(deleted)**. The original sender and timestamp of the message will still
be displayed, and the original content of the message is still accessible via
Zulip's [edit history](/help/view-a-messages-edit-history) feature. This can be
the best option for avoiding confusion if other users have already responded to
your message.
<DependsOnPermissions />
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<MessageActions />
1. Click the **pencil** (<EditIcon />) icon.
1. Delete the content of the message.
1. Click **Save**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MessageLongPressMenu />
1. Tap **Edit message**.
1. Delete the content of the message.
1. Tap **Save**.
</FlattenedSteps>
</TabItem>
</Tabs>
## Delete a message completely
In some cases, such as when a message accidentally shares secret information, or
contains spam or abuse, it makes sense to delete a message completely. Deleted
messages will immediately disappear from the UI in all official Zulip clients.
Any uploaded files referenced only by deleted messages will be immediately
inaccessible. Note that an uploaded file shared in multiple messages will be
deleted only when *all* of those messages are deleted.
It's important to understand that anyone who received the message
before you deleted it could have made a copy of its content. Even if
no one is online when you send the message, users may have received
the message via email or mobile notifications. So if you
accidentally shared secret information that you can change, like a
password, you may want to change that password regardless of whether
you also delete the message.
<DependsOnPermissions />
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<MessageActionsMenu />
1. Select **Delete message**.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MessageLongPressMenu />
1. Tap **Delete message**.
1. Approve by tapping **Delete**.
</FlattenedSteps>
</TabItem>
</Tabs>
<ZulipTip>
You can delete messages sent by [bots that you
own](/help/view-your-bots) just like messages you sent yourself.
</ZulipTip>
## Restoring deleted messages
For protection against accidental or immediately regretted
deletions, messages deleted directly or via a [message retention
policy](/help/message-retention-policy) are archived for 30 days in a
format that can be restored by a server administrator. After that
time, they are permanently and irrecoverably deleted from the Zulip
server. Server administrators can adjust the archival time using
the `ARCHIVED_DATA_VACUUMING_DELAY_DAYS` setting.
## Message notifications
When a message is deleted, any [pending email
notifications](/help/email-notifications#configure-delay-for-message-notification-emails)
for that message will be canceled, and
[mobile](/help/mobile-notifications) and
[desktop](/help/desktop-notifications) notifications will be removed,
including [mentions and alerts](/help/dm-mention-alert-notifications).
## Related articles
* [Delete a topic](/help/delete-a-topic)
* [Archive a channel](/help/archive-a-channel)
* [Message retention policy](/help/message-retention-policy)
* [Edit a message](/help/edit-a-message)
* [Restrict message editing and deletion](/help/restrict-message-editing-and-deletion)

View File

@@ -0,0 +1,59 @@
---
title: Delete a topic
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
import TopicActions from "../include/_TopicActions.mdx";
<AdminOnly />
We generally recommend against deleting topics, but there are a few
situations in which it can be useful:
* Clearing out test messages after setting up an organization.
* Clearing out messages from an overly enthusiastic bot.
* Managing abuse.
In most other cases, [renaming a topic](/help/rename-a-topic) is often a
better idea, or just leaving the topic as is. Deleting a topic can confuse
users who come to the topic later via an email notification.
Note that deleting a topic also deletes every message with that topic,
whereas [archiving a channel](/help/archive-a-channel) does not.
### Delete a topic
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<TopicActions />
1. Click **Delete topic**.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
Access this feature by following the web app instructions in your
mobile device browser.
Implementation of this feature in the mobile app is tracked [on
GitHub](https://github.com/zulip/zulip-flutter/issues/1549). If
you're interested in this feature, please react to the issue's
description with 👍.
</TabItem>
</Tabs>
Note that deleting all of the individual messages within a particular
topic also deletes that topic. Structurally, topics are simply an
attribute of messages in Zulip.
## Related articles
* [Edit a message](/help/edit-a-message)
* [Delete a message](/help/delete-a-message)
* [Archive a channel](/help/archive-a-channel)
* [Message retention policy](/help/message-retention-policy)

View File

@@ -0,0 +1,84 @@
---
title: Demo organizations
---
import {Steps} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import CreateADemoOrganization from "../include/_CreateADemoOrganization.mdx";
import DemoOrgsConversion from "../include/_DemoOrgsConversion.mdx";
import DemoOrgsIntro from "../include/_DemoOrgsIntro.mdx";
import OwnerOnly from "../include/_OwnerOnly.mdx";
import ZulipCloudOnly from "../include/_ZulipCloudOnly.mdx";
<ZulipCloudOnly />
<DemoOrgsIntro />
<DemoOrgsConversion />
## Create a demo organization
<CreateADemoOrganization />
## Configure an email for your account
To take certain administrative actions, like [inviting other
users](/help/invite-new-users) or converting a demo organization to a permanent
organization, you'll need to configure an email for your account.
<FlattenedSteps>
<NavigationSteps target="settings/account-and-privacy" />
1. Under **Account**, click **Add email**, and fill out the required
information. Click **Add**.
1. You will receive a confirmation email within a few minutes. Open
it and click **Confirm and set password**.
1. Configure a password, and click **Submit**.
</FlattenedSteps>
## Convert a demo organization to a permanent organization
<OwnerOnly />
If you'd like to keep your demo organization's message history and user
accounts, you can convert it to a permanent Zulip organization. You'll be able
to choose a new subdomain for your organization's URL.
Everyone will be logged out of existing sessions on the web, mobile and desktop
apps, and will need to log in again at the new URL. Any [API clients](/api/) or
[integrations](/integrations/) will need to be updated to point to the new
organization URL.
<FlattenedSteps>
<NavigationSteps target="settings/organization-profile" />
1. Click the **Convert** button in the banner at the top.
1. Enter your new **Organization URL**, and click **Convert**.
</FlattenedSteps>
## Deactivate a demo organization
<OwnerOnly />
Demo organizations are automatically deleted after 30 days, but you can
also manually deactivate your organization.
<FlattenedSteps>
<NavigationSteps target="settings/organization-profile" />
1. Under **Deactivate organization**, click **Deactivate organization**.
1. Select when the organization's data (users, channels, messages, etc.)
should be permanently deleted. If you haven't configured an email for your
account, data will be deleted immediately.
1. Approve by clicking **Confirm**.
</FlattenedSteps>
## Related articles
* [Getting started with Zulip](/help/getting-started-with-zulip)
* [Trying out Zulip](/help/trying-out-zulip)
* [Moving to Zulip](/help/moving-to-zulip)
* [Invite users to join](/help/invite-users-to-join)

View File

@@ -0,0 +1,255 @@
---
title: Deploying bots in production
---
import {Steps} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import DownloadIcon from "~icons/zulip-icon/download";
Usually, work on a bot starts on a laptop. At some point, you'll want
to deploy your bot in a production environment, so that it'll stay up
regardless of what's happening with your laptop. There are several
options for doing so:
* The simplest is running `zulip-run-bot` inside a `screen` session on
a server. This works, but if your server reboots, you'll need to
manually restart it, so we don't recommend it.
* Using `supervisord` or a similar tool for managing a production
process with `zulip-run-bot`. This consumes a bit of resources
(since you need a persistent process running), but otherwise works
great.
* Using the Zulip Botserver, which is a simple Flask server for
running a bot in production, and connecting that to Zulip's outgoing
webhooks feature.
## Zulip Botserver
The Zulip Botserver is for people who want to:
* Run bots in production.
* Run multiple bots at once.
The Zulip Botserver is a Python (Flask) server that implements Zulip's
outgoing webhooks API. You can of course write your own servers using
the outgoing webhooks API, but the Botserver is designed to make it
easy for a novice Python programmer to write a new bot and deploy it
in production.
### How Botserver works
Zulip Botserver starts a web server that listens to incoming messages
from your main Zulip server. The sequence of events in a successful
Botserver interaction are:
<Steps>
1. Your bot user is mentioned or receives a direct message:
```
@**My Bot User** hello world
```
1. The Zulip server sends a POST request to your Botserver endpoint URL:
```
{
"message":{
"content":"@**My Bot User** hello world",
},
"bot_email":"myuserbot-bot@example.com",
"trigger":"mention",
"token":"XXXX"
}
```
This URL is configured in the Zulip web-app in your Bot User's settings.
1. The Botserver searches for a bot to handle the message, and executes your
bot's `handle_message` code.
</Steps>
Your bot's code should work just like it does with `zulip-run-bot`.
### Installing the Zulip Botserver
Install the `zulip_botserver` package:
```
pip3 install zulip_botserver
```
### Create a bot in your Zulip organization
<Steps>
1. Navigate to the **Bots** tab of the **Personal settings** menu, and click
**Add a new bot**.
1. Set the **Bot type** to **Outgoing webhook**.
1. Set the **endpoint URL** to `https://<host>:<port>` where `host` is the
hostname of the server you'll be running the Botserver on, and `port` is
the port number. The default port is `5002`.
1. Click **Create bot**. You should see the new bot user in the
**Active bots** panel.
</Steps>
### Running a bot using the Zulip Botserver
<Steps>
1. [Create your bot](#create-a-bot-in-your-zulip-organization) in your Zulip
organization.
1. [Download the `zuliprc` file](/help/manage-a-bot#download-zuliprc-configuration-file)
for the bot created above.
1. Run the Botserver, where `helloworld` is the name of the bot you
want to run:
```
zulip-botserver --config-file <path_to_zuliprc> --bot-name=helloworld
```
You can specify the port number and various other options; run
`zulip-botserver --help` to see how to do this.
</Steps>
Everything is set up! Test your Botserver like you would
test a normal bot.
### Running multiple bots using the Zulip Botserver
The Zulip Botserver also supports running multiple bots from a single
Botserver process.
<Steps>
1. [Create your bots](#create-a-bot-in-your-zulip-organization)
in your Zulip organization.
1. Download the `botserverrc` file from the **Bots** tab of the
**Personal settings** menu, by clicking the **download**
(<DownloadIcon />) icon above the **Bots** table.
1. Open the `botserverrc`. It should contain one or more sections that look
like this:
```
[helloworld]
email=foo-bot@hostname
key=dOHHlyqgpt5g0tVuVl6NHxDLlc9eFRX4
site=http://hostname
token=aQVQmSd6j6IHphJ9m1jhgHdbnhl5ZcsY
bot-config-file=~/path/to/helloworld.conf
```
Each section contains the configuration for an outgoing webhook bot.
1. For each bot, enter the name of the bot you want to run in the square
brackets `[]` (e.g., the above example applies to the `helloworld` bot).
To run an external bot, enter the path to the bot's python file instead,
e.g., `[~/Documents/my_bot_script.py]`.
1. Run the Zulip Botserver by passing the `botserverrc` to it.
```
zulip-botserver --config-file <path-to-botserverrc> --hostname <address> --port <port>
```
If omitted, `hostname` defaults to `127.0.0.1` and `port` to `5002`.
</Steps>
<ZulipNote>
The `bot-config-file` setting is needed only for bots that
use a config file.
</ZulipNote>
### Running Zulip Botserver with supervisord
[supervisord](https://supervisord.org/) is a popular tool for running
services in production. It helps ensure the service starts on boot,
manages log files, restarts the service if it crashes, etc. This
section documents how to run the Zulip Botserver using *supervisord*.
Running the Zulip Botserver with *supervisord* works almost like
running it manually.
<FlattenedSteps>
1. Install *supervisord* via your package manager; e.g., on Debian/Ubuntu:
```
sudo apt-get install supervisor
```
1. Configure *supervisord*. *supervisord* stores its configuration in
`/etc/supervisor/conf.d`.
* Do **one** of the following:
* Download the [sample config file][supervisord-config-file]
and store it in `/etc/supervisor/conf.d/zulip-botserver.conf`.
* Copy the following section into your existing supervisord config file.
```
[program:zulip-botserver]
command=zulip-botserver --config-file=<path/to/your/botserverrc>
--hostname <address> --port <port>
startsecs=3
stdout_logfile=/var/log/zulip-botserver.log ; all output of your Botserver will be logged here
redirect_stderr=true
```
* Edit the `<>` sections according to your preferences.
[supervisord-config-file]: https://raw.githubusercontent.com/zulip/python-zulip-api/main/zulip_botserver/zulip-botserver-supervisord.conf
1. Update *supervisord* to read the configuration file:
```
supervisorctl reread
supervisorctl update
```
(or you can use `/etc/init.d/supervisord restart`, but this is less
disruptive if you're using *supervisord* for other services as well).
1. Test if your setup is successful:
```
supervisorctl status
```
The output should include a line similar to this:
> zulip-botserver RUNNING pid 28154, uptime 0:00:27
The standard output of the Botserver will be logged to the path in
your *supervisord* configuration.
</FlattenedSteps>
If you are hosting the Botserver yourself (as opposed to using a
hosting service that provides SSL), we recommend securing your
Botserver with SSL using an `nginx` or `Apache` reverse proxy and
[Certbot](https://certbot.eff.org/).
### Troubleshooting
* Make sure the API key you're using is for an [outgoing webhook
bot](/help/outgoing-webhooks) and you've
correctly configured the URL for your Botserver.
* Your Botserver needs to be accessible from your Zulip server over
HTTP(S). Make sure any firewall allows the connection. We
recommend using [zulip-run-bot](/help/running-bots) instead for
development/testing on a laptop or other non-server system.
If your Zulip server is self-hosted, you can test by running `curl
http://zulipbotserver.example.com:5002` from your Zulip server;
the output should be:
```
$ curl http://zulipbotserver.example.com:5002/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>405 Method Not Allowed</title>
<h1>Method Not Allowed</h1>
<p>The method is not allowed for the requested URL.</p>
```
## Related articles
* [Non-webhook integrations](/help/non-webhook-integrations)
* [Running bots](/help/running-bots)
* [Writing bots](/help/writing-bots)

View File

@@ -0,0 +1,202 @@
---
title: Installing the Zulip desktop app
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import AppWillUpdateTip from "../include/_AppWillUpdateTip.mdx";
The Zulip desktop app comes with native desktop notifications, support for
multiple Zulip accounts, and a dedicated tray icon.
Installing the latest stable release is recommended for most users. For an early
look at the newest features, consider the [beta
releases](#install-a-beta-release).
## Install the latest release
<Tabs>
<TabItem label="macOS">
<AppWillUpdateTip />
#### Disk image *(recommended)*
<Steps>
1. Download [Zulip for macOS](https://zulip.com/apps/mac).
1. Open the file, and drag the app into the **Applications** folder.
</Steps>
#### Homebrew
<Steps>
1. Run the command `brew install --cask zulip` from a terminal.
1. Run Zulip from **Applications**.
</Steps>
You can run the command `brew upgrade zulip` to immediately upgrade the app.
</TabItem>
<TabItem label="Windows">
#### Web installer *(recommended)*
<AppWillUpdateTip />
<Steps>
1. Download and run [Zulip for Windows](https://zulip.com/apps/windows).
1. Run Zulip from the **Start** menu.
</Steps>
#### Offline installer *(for isolated networks)*
<ZulipNote>
The app will not update automatically. You can repeat these steps to upgrade
to future versions.
</ZulipNote>
<Steps>
1. Download [zulip-x.x.x-x64.msi][latest] for 64-bit desktops
(common), or [zulip-x.x.x-ia32.msi][latest] for 32-bit (rare).
1. Copy the installer file to the machine you want to install the app
on, and open it there.
1. Run Zulip from the **Start** menu.
</Steps>
</TabItem>
<TabItem label="Linux">
#### APT *(Ubuntu or Debian)*
<ZulipTip>
The app will be updated automatically to future versions when you do a
regular software update on your system, e.g., with
`sudo apt update && sudo apt upgrade`.
</ZulipTip>
<Steps>
1. Enter the following commands into a terminal:
```bash
sudo apt install curl
sudo curl -fL -o /etc/apt/trusted.gpg.d/zulip-desktop.asc \
https://download.zulip.com/desktop/apt/zulip-desktop.asc
echo "deb https://download.zulip.com/desktop/apt stable main" | \
sudo tee /etc/apt/sources.list.d/zulip-desktop.list
sudo apt update
sudo apt install zulip
```
These commands set up the Zulip Desktop APT repository and its signing
key, and then install the Zulip client.
1. Run Zulip from your app launcher, or with `zulip` from a terminal.
</Steps>
#### AppImage *(recommended for all other distros)*
<AppWillUpdateTip />
<Steps>
1. Download [Zulip for Linux](https://zulip.com/apps/linux).
1. Make the file executable, with
`chmod a+x Zulip-x.x.x-x86_64.AppImage` from a terminal (replace
`x.x.x` with the actual app version of the downloaded file).
1. Run the file from your app launcher, or from a terminal. This file is the
Zulip app, so no installation is required.
</Steps>
#### Snap
<Steps>
1. Make sure [snapd](https://docs.snapcraft.io/core/install) is installed.
1. Execute following command to install Zulip:
```bash
sudo snap install zulip
```
1. Run Zulip from your app launcher, or with `zulip` from a terminal.
</Steps>
#### Flathub
<Steps>
1. Make sure you have [Flatpak](https://flathub.org/setup) installed on your
system.
1. Use the following command from the official
[Flathub page](https://flathub.org/apps/org.zulip.Zulip) to install Zulip:
```bash
flatpak install flathub org.zulip.Zulip
```
1. After the installation is complete, you can run Zulip using the following
command:
```bash
flatpak run org.zulip.Zulip
```
</Steps>
</TabItem>
</Tabs>
## Install a beta release
Get a peek at new features before they're released!
<Tabs>
<TabItem label="Most systems">
<AppWillUpdateTip />
<Steps>
1. Go to the [Zulip releases][release-list] page on GitHub, and find the latest
version tagged with the “Pre-release” label.
1. If there's a **Pre-release** that's more recent than the [latest release][latest],
download the appropriate Zulip beta installer or app for your system.
1. To install and run Zulip, refer to the instructions for your operating
system in the [Install the latest release](#install-the-latest-release)
section above.
</Steps>
</TabItem>
<TabItem label="Linux with APT">
<ZulipTip>
The app will be updated automatically to future versions when you do a
regular software update on your system, e.g., with
`sudo apt update && sudo apt upgrade`.
</ZulipTip>
#### You don't have the Zulip app installed
<Steps>
1. Enter the following commands into a terminal:
```bash
sudo curl -fL -o /etc/apt/trusted.gpg.d/zulip-desktop.asc \
https://download.zulip.com/desktop/apt/zulip-desktop.asc
echo "deb https://download.zulip.com/desktop/apt beta main" | \
sudo tee /etc/apt/sources.list.d/zulip-desktop.list
sudo apt update
sudo apt install zulip
```
These commands set up the Zulip Desktop beta APT repository and its signing
key, and then install the Zulip beta client.
1. Run Zulip from your app launcher, or with `zulip` from a terminal.
</Steps>
#### You already have the Zulip app installed
<Steps>
1. Enter the following commands into a terminal:
```bash
sudo sed -i s/stable/beta/ /etc/apt/sources.list.d/zulip-desktop.list
sudo apt update
sudo apt install zulip
```
These commands set up the Zulip Desktop beta APT repository, and then
install the Zulip beta client.
1. Run Zulip from your app launcher, or with `zulip` from a terminal.
</Steps>
</TabItem>
</Tabs>
[latest]: https://github.com/zulip/zulip-desktop/releases/latest
[release-list]: https://github.com/zulip/zulip-desktop/releases
## Related articles
* [Connect through a proxy](/help/connect-through-a-proxy)
* [Use a custom certificate](/help/custom-certificates)
* [View Zulip version](/help/view-zulip-version)

View File

@@ -0,0 +1,176 @@
---
title: Desktop notifications
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipNote from "../../components/ZulipNote.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import PlayCircleIcon from "~icons/fa/play-circle";
Zulip can be configured to send visual and audible desktop notifications for
[DMs, mentions, and alerts](/help/dm-mention-alert-notifications), as well as
[channel messages](/help/channel-notifications) and [followed
topics](/help/follow-a-topic#configure-notifications-for-followed-topics).
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. Toggle the checkboxes in the **Desktop** column of the **Notification
triggers** table.
</FlattenedSteps>
## Notification sound
You can select the sound Zulip uses for audible desktop notifications. Choosing
**None** disables all audible desktop notifications.
### Change notification sound
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. Under **Desktop message notifications**, configure
**Notification sound**.
</FlattenedSteps>
<ZulipTip>
To hear the selected sound, click the <PlayCircleIcon /> to the right of your selection.
</ZulipTip>
## Unread count badge
By default, Zulip displays a count of your unmuted unread messages on the
[desktop app](https://zulip.com/apps/) sidebar and on the browser tab icon. You
can configure the badge to only count [direct messages](/help/direct-messages)
and [mentions](/help/mention-a-user-or-group), or to include messages in
[followed topics](/help/follow-a-topic) but not other
[channel](/help/introduction-to-channels) messages.
### Configure unread count badge
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. Under **Desktop message notifications**, configure
**Unread count badge**.
</FlattenedSteps>
### Disable unread count badge
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. Under **Desktop message notifications**, select **None** from the
**Unread count badge** dropdown.
</FlattenedSteps>
## Testing desktop notifications
<ZulipNote>
This does not make an unread count badge appear.
</ZulipNote>
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. Under **Desktop message notifications**, click **Send a test notification**.
If notifications are working, you will receive a test notification.
</FlattenedSteps>
</TabItem>
</Tabs>
## Troubleshooting desktop notifications
Desktop notifications are triggered when a message arrives, and Zulip is not
in focus or the message is offscreen. You must have Zulip open in a browser
tab or in the Zulip desktop app to receive desktop notifications.
**Visual desktop notifications** appear in the corner of your main monitor.
**Audible desktop notifications** make a sound.
To receive notifications in the desktop app, make sure that [Do Not Disturb
mode](/help/do-not-disturb) is turned off.
### Check notification settings for DMs or channels
If you have successfully received a [test
notification](#testing-desktop-notifications), but you aren't seeing desktop
notifications for new messages, check your Zulip notification settings. Make
sure you have enabled desktop notifications [for
DMs](/help/dm-mention-alert-notifications) or [for the
channel](/help/channel-notifications) you are testing. Messages in [muted
topics](/help/mute-a-topic) will not trigger notifications.
### Check platform settings
The most common issue is that your browser or system settings are blocking
notifications from Zulip. Before checking Zulip-specific settings, make sure
that **Do Not Disturb mode** is not enabled on your computer.
<Tabs>
<TabItem label="Chrome">
<Steps>
1. Click on the site information menu to the left of the URL for your Zulip
organization.
1. Toggle **Notifications** and **Sound**. If you don't see those options,
click on **Site settings**, and set **Notifications** and **Sound** to
**Allow**.
</Steps>
Alternate instructions:
<Steps>
1. Select the Chrome menu at the top right of the browser, and select
**Settings**.
1. Select **Privacy and security**, **Site Settings**, and then
**Notifications**.
1. Next to **Allowed to send notifications**, select **Add**.
1. Paste the Zulip URL for your organization into the site field, and
click **Add**.
</Steps>
</TabItem>
<TabItem label="Firefox">
<Steps>
1. Select the Firefox menu at the top right of the browser, and select
**Settings**.
1. On the left, select **Privacy & Security**. Scroll to the **Permissions**
section and select the **Settings** button next to **Notifications**.
1. Find the URL for your Zulip organization, and adjust the **Status**
selector to **Allow**.
</Steps>
</TabItem>
<TabItem label="Desktop app">
**Windows**
<Steps>
1. Click the **Start** button and select **Settings**. Select **System**,
and then **Notifications & actions**.
1. Select **Zulip** from the list of apps.
1. Configure the notification style that you would like Zulip to use.
</Steps>
**macOS**
<Steps>
1. Open your Mac **System Preferences** and select **Notifications**.
1. Select **Zulip** from the list of apps.
1. Configure the notification style that you would like Zulip to use.
</Steps>
</TabItem>
</Tabs>
## Related articles
* [Channel notifications](/help/channel-notifications)
* [DMs, mentions, and alerts](/help/dm-mention-alert-notifications)
* [Email notifications](/help/email-notifications)
* [Mobile notifications](/help/mobile-notifications)
* [Do not disturb](/help/do-not-disturb)

View File

@@ -0,0 +1,31 @@
---
title: Weekly digest emails
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
<AdminOnly />
Zulip has a beta feature to send weekly emails to users who haven't
been active for 5 or more days. These emails include details on new
channels created and highlights of traffic (of subscribed channels) that
can intrigue users.
This feature is disabled by default, but an organization administrator
can enable it for their organization. Individual users can opt-out in
organizations that have enabled it.
You can view a sample digest email for your account in HTML and
plain-text formats by visiting `https://zulip.example.com/digest/`,
if `https://zulip.example.com` is your Zulip server URL.
## Enable digest emails for an organization
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Automated messages and emails**, toggle
**Send weekly digest emails to inactive users**.
</FlattenedSteps>

View File

@@ -0,0 +1,122 @@
---
title: Direct messages
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import DmFeedInstructions from "../include/_DmFeedInstructions.mdx";
import FindDmConversationLeftSidebar from "../include/_FindDmConversationLeftSidebar.mdx";
import MobileDirectMessages from "../include/_MobileDirectMessages.mdx";
import SearchNoteForDmConversations from "../include/_SearchNoteForDmConversations.mdx";
import SendDm from "../include/_SendDm.mdx";
import ViewDmsLeftSidebar from "../include/_ViewDmsLeftSidebar.mdx";
import ChevronRightIcon from "~icons/zulip-icon/chevron-right";
import SearchIcon from "~icons/zulip-icon/search";
import UserListIcon from "~icons/zulip-icon/user-list";
**Direct messages (DMs)** are conversations with other users that happen outside
of a [channel](/help/introduction-to-channels). They are convenient for 1:1 and
small group conversations. Direct messages are private to conversation participants. Administrators may be
able to [export](/help/export-your-organization) your DMs in a corporate
organization, or [with your
permission](/help/export-your-organization#configure-whether-administrators-can-export-your-private-data).
If you find yourself frequently conversing with the same person or group, it
often works best to [create a private channel](/help/create-a-channel) for your
conversations. This lets you organize your discussion into topics, and subscribe
or unsubscribe people as needed.
## Send a DM
<SendDm />
## View your direct message conversations
There are a few different ways to view your DM conversations.
<Tabs>
<TabItem label="Via left sidebar">
<FlattenedSteps>
<ViewDmsLeftSidebar />
</FlattenedSteps>
<ZulipTip>
To return to the channel list in the left sidebar, click the **back to
channels** link above the search box.
</ZulipTip>
</TabItem>
<TabItem label="Via right sidebar">
<Steps>
1. If the [user list](/help/user-list) in the right sidebar is hidden, click the
**user list** (<UserListIcon />) icon in
the upper right to show it.
1. Click on any user to view your 1:1 DM conversation.
</Steps>
<ZulipTip>
You can find a user by typing their name in the **Filter users** box at the
top of the right sidebar.
</ZulipTip>
</TabItem>
<TabItem label="Via compose box">
<Steps>
1. Click the **New direct message** button at the bottom of the app, or use the
<kbd>X</kbd> keyboard shortcut to [open the compose box](/help/open-the-compose-box).
1. Start typing a user's name in the recipient bar, and select their name from
the list of suggestions. Continue to add users for a group DM conversation.
1. Click the highlighted **Go to conversation** (<ChevronRightIcon />) button at the top of the compose box, or use
the <kbd>Ctrl</kbd> + <kbd>.</kbd> keyboard shortcut to view that DM
conversation.
</Steps>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MobileDirectMessages />
1. Tap a recent DM conversation to view it.
</FlattenedSteps>
</TabItem>
</Tabs>
## Find a direct message conversation
<Tabs>
<TabItem label="Via left sidebar">
<SearchNoteForDmConversations />
<FindDmConversationLeftSidebar />
</TabItem>
<TabItem label="Via search box">
<Steps>
1. Click the **search** (<SearchIcon />) icon in the top bar to open the [search
box](/help/search-for-messages).
1. Start typing a user's name. You'll be able to select DMs with that user
from the list of suggestions.
1. *(optional)* Continue to add users via the search box for a group DM
conversation.
</Steps>
<ZulipTip>
You can also type `dm-including` in the search box to find all 1:1 and group
DM conversations that include a particular user.
</ZulipTip>
</TabItem>
</Tabs>
## Go to direct message feed
You can see all your direct messages in one place.
<DmFeedInstructions />
## Related articles
* [Typing notifications](/help/typing-notifications)
* [Open the compose box](/help/open-the-compose-box)

View File

@@ -0,0 +1,25 @@
---
title: Disable welcome emails
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import AdminOnly from "../include/_AdminOnly.mdx";
<AdminOnly />
Zulip sends a handful of emails to new users, introducing them to the Zulip
app, when they join an organization. If these emails don't make sense for
your organization, you can disable them.
Note that regardless of this setting, users will receive an initial account
email notifying them about their new Zulip account and how to log in.
## Disable welcome emails
<FlattenedSteps>
<NavigationSteps target="settings/organization-settings" />
1. Under **Onboarding**, toggle
**Send emails introducing Zulip to new users**.
</FlattenedSteps>

View File

@@ -0,0 +1,100 @@
---
title: DMs, mentions, and alerts
---
import {Steps} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import TrashIcon from "~icons/zulip-icon/trash";
You can configure desktop, mobile, and email notifications for
[direct messages (DMs)](/help/direct-messages),
[mentions](/help/mention-a-user-or-group), and [alert
words](#alert-words).
## Configure notifications
These settings will affect notifications for direct messages, group
direct messages, mentions, and alert words.
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. In the **Notification triggers** table, toggle the settings for **DMs, mentions, and alerts**.
</FlattenedSteps>
You can also hide the content of direct messages (and group direct
messages) from desktop notifications.
<Steps>
1. Under **Desktop message notifications**, toggle
**Include content of direct messages in desktop notifications**.
</Steps>
## Wildcard mentions
You can configure which types of notifications you want to receive for wildcard
mentions (**@all**, **@everyone**, **@channel**) and **@topic** mentions
separately from personal @-mentions.
<ZulipTip>
These mentions don't trigger notifications in muted topics, unlike
personal mentions. In muted channels, they are suppressed by default,
but you can override this by [enabling](/help/channel-notifications#configure-notifications-for-a-single-channel)
wildcard mention notifications in the specific channels where you'd like to receive them.
</ZulipTip>
<FlattenedSteps>
<NavigationSteps target="settings/notifications" />
1. In the **Notification triggers** table, toggle the **@all** checkbox for
**Channels** or **Followed topics**.
</FlattenedSteps>
Additionally, you can override this configuration for individual
channels in your [Channel settings](/help/channel-notifications), and
administrators can [restrict use of wildcard
mentions](/help/restrict-wildcard-mentions) in large channels.
## Alert words
Zulip lets you to specify case-insensitive **alert words or phrases** that send you a desktop
notification whenever the alert word is included in a message. For example, you
can set up an alert for the name of a product you're responsible for. Alerts for
problematic words or phrases can help moderators respond quickly when there's an
issue.
<ZulipTip>
Alert words in messages you receive while the alert is enabled will be highlighted.
</ZulipTip>
### Add an alert word or phrase
<FlattenedSteps>
<NavigationSteps target="settings/alert-words" />
1. Click **Add alert word**.
1. Type a word or phrase, and click **Add**.
</FlattenedSteps>
### Remove an alert word or phrase
<FlattenedSteps>
<NavigationSteps target="settings/alert-words" />
1. Click the **delete** (<TrashIcon />) icon next to the
alert word that you would like to remove.
</FlattenedSteps>
## Related articles
* [Desktop notifications](/help/desktop-notifications)
* [Email notifications](/help/email-notifications)
* [Mobile notifications](/help/mobile-notifications)
* [Restrict wildcard mentions](/help/restrict-wildcard-mentions)
* [Channel notifications](/help/channel-notifications)
* [View your mentions](/help/view-your-mentions)
* [Do not disturb](/help/do-not-disturb)

View File

@@ -0,0 +1,61 @@
---
title: Do Not Disturb
---
import {Steps, TabItem, Tabs} from "@astrojs/starlight/components";
import ZulipNote from "../../components/ZulipNote.astro";
import DesktopToggleSidebarTip from "../include/_DesktopToggleSidebarTip.mdx";
import BellIcon from "~icons/fa/bell";
import BellSlashIcon from "~icons/fa/bell-slash";
The Zulip desktop app offers a **Do Not Disturb (DND)** mode. Turning on **Do Not
Disturb** mode disables [desktop notifications](/help/desktop-notifications)
across all the organizations you have
[added](/help/logging-in#log-in-to-a-new-organization) to the Zulip desktop app.
This can be convenient for avoiding interruptions during a meeting, or when you need
time to focus on your work.
<ZulipNote>
Other types of notifications will not be affected, including [mobile
notifications](/help/mobile-notifications), [email
notifications](/help/email-notifications), and [desktop
notifications](/help/desktop-notifications) in the Zulip web app.
</ZulipNote>
## Toggle Do Not Disturb
<Tabs>
<TabItem label="Desktop">
<Steps>
1. Click the **bell** (<BellIcon />) or **bell with a slash** (<BellSlashIcon />) icon in the **organizations sidebar** on the
left. You can also select **Toggle Do Not Disturb** from the **Zulip** menu in
the top menu bar.
</Steps>
<DesktopToggleSidebarTip />
</TabItem>
</Tabs>
## Check whether Do Not Disturb is enabled
<Tabs>
<TabItem label="Desktop">
<Steps>
1. If the **organizations sidebar** on the left shows a **bell** (<BellIcon />) icon, **Do Not Disturb** is disabled. If the **organizations
sidebar** on the left shows a **bell with a slash** (<BellSlashIcon />) icon, **Do Not Disturb** is enabled, and you are not
receiving desktop notifications.
</Steps>
<DesktopToggleSidebarTip />
</TabItem>
</Tabs>
## Related articles
* [Desktop notifications](/help/desktop-notifications)
* [DMs, mentions, and alerts](/help/dm-mention-alert-notifications)
* [Channel notifications](/help/channel-notifications)
* [Email notifications](/help/email-notifications)
* [Mobile notifications](/help/mobile-notifications)

View File

@@ -0,0 +1,79 @@
---
title: Edit a message
---
import {TabItem, Tabs} from "@astrojs/starlight/components";
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import ZulipTip from "../../components/ZulipTip.astro";
import DependsOnPermissions from "../include/_DependsOnPermissions.mdx";
import MessageActions from "../include/_MessageActions.mdx";
import MessageLongPressMenu from "../include/_MessageLongPressMenu.mdx";
import EditIcon from "~icons/zulip-icon/edit";
Zulip makes it possible to edit the content of your messages, letting you fix
typos, clarify your thoughts, etc. Organization administrators can
[configure](/help/restrict-message-editing-and-deletion) who can edit messages,
and set time limits for this action. However, even organization owners cannot
edit the content of a message sent by another user.
<ZulipTip>
You can also [edit message topics](/help/rename-a-topic).
</ZulipTip>
## Edit a message
<DependsOnPermissions />
<Tabs>
<TabItem label="Desktop/Web">
<FlattenedSteps>
<MessageActions />
1. Click the **pencil** (<EditIcon />) icon.
1. Edit the content of the message.
1. Click **Save**.
</FlattenedSteps>
</TabItem>
<TabItem label="Mobile">
<FlattenedSteps>
<MessageLongPressMenu />
1. Tap **Edit message**.
1. Edit the content of the message.
1. Tap **Save**.
</FlattenedSteps>
</TabItem>
</Tabs>
<ZulipTip>
When you edit a message, everyone will see it labeled as **edited**. You
can [view a message's edit history](/help/view-a-messages-edit-history)
if it is [allowed](/help/restrict-message-edit-history-access) in your
organization.
</ZulipTip>
## Message notifications
If you edit a message to [mention a user or group](/help/mention-a-user-or-group),
the newly mentioned users will receive notifications just as if they had been
mentioned in the original message.
If you edit a message soon after sending it, the edit will be reflected in any
[email notifications that have not yet been sent](/help/email-notifications#configure-delay-for-message-notification-emails).
This includes canceling notifications for users whose
[mention](/help/format-your-message-using-markdown#mention-a-user-or-group) was
removed or changed from a regular mention to a
[silent mention](/help/mention-a-user-or-group#silently-mention-a-user).
If you [delete the content of a message](/help/delete-a-message#delete-message-content),
any pending email notifications for that message will be canceled, including
[mentions and alerts](/help/dm-mention-alert-notifications).
## Related articles
* [View, copy, and share message content as Markdown](/help/view-the-markdown-source-of-a-message)
* [Restrict message editing and deletion](/help/restrict-message-editing-and-deletion)
* [Delete a message](/help/delete-a-message)

View File

@@ -0,0 +1,30 @@
---
title: Edit your profile
---
import FlattenedSteps from "../../components/FlattenedSteps.astro";
import NavigationSteps from "../../components/NavigationSteps.astro";
By default, your profile includes your name, email, the date you joined, and
when you were last active.
Organization administrators can also
[add custom profile fields](/help/custom-profile-fields#add-a-custom-profile-field). Custom profile
fields are always optional, and will not appear in your profile unless you
fill them out.
### Edit your profile
<FlattenedSteps>
<NavigationSteps target="settings/profile" />
1. Edit the fields under **Profile**.
</FlattenedSteps>
## Related articles
* [Set up your account](/help/set-up-your-account)
* [Change your name](/help/change-your-name)
* [Change your email address](/help/change-your-email-address)
* [Change your profile picture](/help/change-your-profile-picture)
* [View someone's profile](/help/view-someones-profile)

Some files were not shown because too many files have changed in this diff Show More