77 Commits
Author SHA1 Message Date
9cf430d7b2 Gate ci-report and ci-artifacts on relevant-changed to fix skipped-job failures (#37777)
server-ci.yml always triggers now, but ci-report and ci-artifacts were
missed when #37557 gated the other jobs on needs.go.outputs.relevant-changed.
On PRs that don't touch server code, build-mattermost-server and the test
jobs are skipped, so ci-artifacts fails trying to download a
server-dist-artifact that was never uploaded, and ci-report fails trying
to validate test logs that don't exist. Skip both cleanly instead.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 16:33:57 +00:00
9a42ec475b Make server-ci.yml always trigger so required checks never get stuck pending (#37557)
* Make server-ci.yml always trigger so required checks never get stuck pending

Required status checks (e.g. "Server CI Complete") never get reported for a
commit whose workflow run was skipped by the top-level `paths` filter, which
leaves them stuck "Pending" forever and blocks merging PRs that don't touch
server code. Move the path filtering into a job-level `if:` gated on a new
`relevant-changed` output instead, so the workflow always runs and always
reports a status.

* Fail ci-complete explicitly when the go job doesn't succeed

Previously ci-complete ran unconditionally (if: always()) and its step just
echoed a success message, so if the go job failed (e.g. the new
relevant-changed detection step erroring out), all downstream jobs would be
silently skipped due to unset outputs, yet ci-complete would still report
"Server CI Complete" as green. Add go to needs and explicitly fail the step
when needs.go.result != 'success', while keeping the existing always()/FIPS
skip-tolerance behavior so the check still always gets reported.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-30 11:24:06 +03:00
9319a145f4 docs: fix dark-mode code block contrast issues (#37736)
* docs: fix dark-mode code block contrast, plan plugin SDK reference migration

- Change the outgoing webhooks pseudo-JSON example to a `text` fence
  instead of `json`, since the malformed JSON caused Prism to
  misinterpret `//` inside a URL as a comment, rendering it as a
  distracting highlighted link in dark mode.
- Restore contrast for Prism's comment token and the active/hover
  table-of-contents link in dark mode, both of which were nearly
  invisible against the current dark background colors.
- Add a handoff plan for restoring the three plugin SDK reference pages
  that were left as migration placeholders (previously rendered by Hugo
  shortcodes parsing live Go/TS source).

* docs: remove migration plan doc from this PR

The plugin SDK reference migration plan is a separate piece of handoff
work, not part of this dark-mode contrast fix — drop it from this PR
(kept locally, untracked, for handing off separately).

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-29 13:01:22 +03:00
452aa893e0 docs(sidebar): regroup Administration Guide Onboard and Scale sections (#37630)
* docs(sidebar): regroup Administration Guide Onboard and Scale sections

Onboard (34 files) and Scale (28 files) were still flat, unrouped lists
unlike their already-regrouped Configure/Manage/Integrations siblings.
Apply the same manual-grouping-override pattern:

- Onboard: SAML SSO, Other SSO & Identity (OAuth/OIDC/AD-LDAP),
  Multi-Factor & Certificate Auth, Guest Accounts & Delegated
  Administration, User Provisioning & Bulk Data, Migrating to Mattermost.
- Scale: Capacity Planning (scale-to-N-users pages + storage sizing),
  High Availability & Architecture, Search Infrastructure, Observability
  & Monitoring, Caching — with Scaling for Enterprise kept as a standalone
  landing page since it's a general entry point, not a group member.

Extends the existing orphan-check warning logic in buildAdminGuideSidebar
to also cover Onboard/Scale, so future filesystem drift surfaces the same
way it already does for Configure/Manage. Files stay flat on disk, no
URLs move.

* docs(sidebar): align Onboard/Scale subgroups with Sphinx's live nav

Sphinx's actual toctree groups these files differently than the initial
regroup guessed: SAML/OAuth/OIDC/AD-LDAP all live under one identity
bucket (not split SAML vs "other"), guest/permissions pages sit under a
plain "User management" label, and — most notably — 21 of Scale's 28
files (capacity planning, HA/architecture, search infra, caching) are
navigated to from Deployment Guide -> Reference Architecture in Sphinx,
not Administration Guide, even though their Sphinx URLs stay under
/administration-guide/scale/.

- Merge Onboard's samlSso/otherSso groups into one "SSO & Identity"
  group, with SAML nested as its own sub-category inside it.
- Rename "Guest Accounts & Delegated Administration" to "User
  Management".
- Physically move the 21 Scale files that Sphinx navigates to from
  Deployment Guide into deployment-guide/reference-architecture/scale/,
  and add a new `scaling` group to DEPLOYMENT_GROUPS mirroring that
  split. Administration Guide -> Scale keeps only the 7
  monitoring/observability pages.
- Rewrite the ~130 internal .mdx links that pointed at the old
  /administration-guide/scale/* paths for the moved files, and update
  the 31 matching Sphinx->Docusaurus redirect targets in
  active-redirects.json.

Regenerated the sidebar with zero orphan warnings; all files accounted
for exactly once.

* docs(sidebar): flatten Scale's remaining Observability & Monitoring group

With the 21 architecture/capacity/search files moved to Deployment Guide,
Scale is down to 7 monitoring pages under one theme — wrapping them in
their own "Observability & Monitoring" sub-category just adds a redundant
nesting level (Scale > Observability & Monitoring > 7 files). List them
flat directly under Scale instead.

* docs(sidebar): move Calls docs to deployment-guide, dissolve Storage & Database group

Calls (RTCD, offloader, Kubernetes, logging, metrics) is a deployment/
operations concern, not settings-reference material — physically move the
6 Calls docs from administration-guide/configure/ into a new
deployment-guide/calls/ directory and add a matching `calls` group to
DEPLOYMENT_GROUPS, slotted right after Server/Scaling. Rewrite every
cross-reference across docs/ (including the two PDF book manifests) to the
new /deployment-guide/calls/calls-* paths, and add/update the matching
active-redirects.json entries so old URLs keep resolving.

Also dissolve the "Storage & Database" group in Configure — its three
pages (configuration-in-your-database, environment-variables,
azure-blob-storage) become plain top-level entries instead of a
single-purpose subgroup; no files move since their URLs are unchanged.

* docs(calls,scale): fix RST-migration artifacts and stale links flagged in review

Fixes still-valid review findings on the Calls/Scale content moved in this
branch:

- calls-metrics-monitoring.mdx: unescape HTML-entity braces in inline RTCD
  metric names (&#123;/&#125; -> {}), which is unnecessary in fenced/inline
  code and rendered literally; convert two legacy docs.mattermost.com
  absolute links to root-relative internal links, pointing the
  Prometheus/Grafana link at its current post-move location under
  deployment-guide/reference-architecture/scale/ rather than the stale
  administration-guide/scale/ path.
- calls-rtcd-setup.mdx: convert the ICE Host Override link to a
  root-relative path; convert two leftover Sphinx ```{note}``` fences to
  the <Note> component (one of these was rendering as barely-readable
  plain text due to being an unrecognized code-fence language, not a
  proper admonition); add a <Warning> ahead of the community-maintained
  installation scripts link.
- elasticsearch-setup.mdx: remove a stray leftover ":start-after:
  :nosearch:" Sphinx directive rendering as literal page text.
- opensearch-setup.mdx: remove blockquote (`>`) prefixes wrapping every
  numbered-step code fence (another RST-migration artifact), convert a
  raw <div class="note"> to <Note>, and unescape HTML-entity braces/angle
  brackets in the YAML/JSON/Terraform examples.
- deploy-rhel.mdx: fix the "RTCD setup and configuration" link to point
  at calls-rtcd-setup instead of the general calls-deployment-guide page.
- pdf/books/deployment-guide.json: add the two Calls pages missing from
  the PDF spine (calls-metrics-monitoring, calls-rtcd-setup).

Skipped: the raw entity-escaped `{}` in calls-rtcd-setup.mdx's <style>
block is intentional (real JSX context, not a code fence/span) and the
"code comment colors nearly invisible" screenshot turned out to be the
same {note}-fence bug above, not a separate Prism/CSS issue -- fixed by
the <Note> conversion. Two more Sphinx ```{note}``` fences exist in
administration-guide/onboard/sso-saml-keycloak.mdx and
sso-saml-adfs-msws2016.mdx but weren't part of the flagged findings, so
left untouched.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 12:50:50 +03:00
651e68ee68 Fix low-contrast mobile nav sidebar text in light mode (#37695)
The mobile navbar slide-out (.navbar-sidebar) always has a dark denim
background regardless of theme, but its menu links inherited the
light-mode --ifm-menu-color* values tuned for the light desktop
sidebar, rendering dark navy text on a dark navy panel. Scope the
dark-on-dark ("readable on dark") menu color values to .navbar-sidebar
unconditionally, and fix the "Back to main menu" button's text color
which was relying on the same now-changed background.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 11:57:25 +03:00
87f524d0a8 [Docs Revamp Feedback] Support three levels of TOC nesting (End-user Guide > Collaborate) (#37663)
* docs(sidebar): support 3 levels of TOC nesting for End User Guide > Collaborate

Addresses item 6 of Eric Sethna's docs revamp feedback ("Can we support
three levels of nesting in the TOC? ... ie End-user guide > Collaborate").

PR #37630 (open, not merged) applies the manual-grouping-override pattern
to Administration Guide > Onboard/Scale but doesn't touch End User Guide,
and the pattern isn't a shared generic engine — each section gets its own
small builder/regroup pair. This adds that pair for Collaborate
(COLLABORATE_GROUPS/COLLABORATE_ORDER/COLLABORATE_HIDDEN +
buildCollaborateItem/regroupCollaborate/buildEndUserGuideSidebar),
regrouping its 49 flat files into Channels, Messaging & Threads, Calls &
Screen Sharing, Teams/Groups & Roles, Integrations & Connected Apps, and
Keyboard Shortcuts & Accessibility — giving End User Guide > Collaborate >
[group] > page, a genuine 3rd nesting level. Files stay flat on disk; no
URLs move.

* docs(sidebar): support inline subgroup specs in buildCollaborateItem

Addresses CodeRabbit review comment on #37663: buildCollaborateItem only
handled spec.group lookups, unlike buildAdminManageItem which also
supports inline {label, items} subgroup specs (used e.g. for the
Attribute-Based Access Control 4-level nesting under Admin Manage).
Detect spec.items before falling back to the COLLABORATE_GROUPS lookup
so Collaborate can gain the same nested-subgroup capability if needed,
without changing today's generated sidebar output.

* docs(sidebar): merge Collaborate regroup with master's agents-docs promotion

Rebasing onto master surfaced a duplicate 'buildEndUserGuideSidebar'
declaration: master gained its own End User Guide override (promoting
the Agents plugin's usage-tips page, from #37627) after this branch was
cut, so git's non-conflicting merge silently produced two function
bodies with the same name — a SyntaxError caught by CI's docs build
check, not by the rebase itself.

Merged both overrides into a single buildEndUserGuideSidebar: keeps the
agents usage-tips promotion from master, plus this branch's Collaborate
regrouping into COLLABORATE_GROUPS. Verified with a clean
'npm run build:sidebars' run (zero warnings) after initializing the
docs/vendor/mattermost-plugin-agents submodule locally to stage agents
docs first.

* docs(sidebar): clarify TOC nesting depth wording, reorder Collaborate items

- README: describe the inline sub-group nesting as a third category
  level / four-level path instead of ambiguous "3rd level" wording.
- Move invite-people out of the mismatched "Teams, Groups & Roles"
  group into its own top-level Collaborate entry, placed first.
- Reorder "Teams, Groups & Roles" so learn-about-roles leads the group.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 10:59:19 +03:00
ccf06d63a3 Remove denim left-border accent from IME diagram intro panels (#37682)
Drop the left-edge accent bar on the "Secure Collaborative Workflow",
"Integration & AI Platform", and "Sovereign, Cyber-Resilient
Deployment" intro panels — the surrounding denim wash/borders already
signal the section boundary, so the extra bar was redundant decoration.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 08:45:09 +03:00
0100726431 Fix docs site homepage width, unreadable bold text, and deploy-k8s / icon UI bugs (#37681)
* Fix homepage width, card-title weight, and deploy-k8s code block clutter

The homepage's hide_table_of_contents:true dropped the usual 75% width
cap DocItem/Layout applies via docItemCol, so prose read much wider
than every other doc page. Restore the cap unconditionally.

CardGrid's card titles ("For End Users", etc.) used Archivo Black at
900 weight, the same too-heavy/shouty treatment already fixed for
h1-h4 — switch to the sans face at 700 to match.

On the Kubernetes Operator deploy page, strip inline "# comment"
annotations out of the YAML/shell snippets (moving anything useful
into surrounding prose), and replace nested blockquotes used purely
for list indentation with plain nested lists, since the blockquotes
were triggering the site's yellow-bordered blockquote styling at
every nesting level for no reason.

* Fix oversized Restore icon on the Send messages doc page

restore_F099B.svg was the only icon under docs/site/static/img/ui
missing explicit width/height attributes (every sibling icon sets
width="24" height="24"). Without them, the browser falls back to its
default SVG replaced-element size instead of the 24x24 the inline
.theme-icon usage expects, rendering it many times larger than the
surrounding text.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-28 08:44:34 +03:00
fcf3f6a1d7 docs(developers): fix broken Integrate & Extend link on developers landing page (#37690)
The "Integrate & Extend" card and inline link pointed to /developers/integrate,
which has no index page (only its "Get started" subcategory does), causing a
404. Point both links to /developers/integrate/getting-started instead.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 19:28:16 +03:00
44c69e4051 [Docs Revamp Feedback] Remove/restyle "vibe coded" yellow left-border signal (#37666)
* Remove/restyle "vibe coded" yellow left-border signal on docs cards/blocks

Nick Misasi flagged in the "Docs Revamp - Feedback" channel (2026-07-22/23):

  "Docs look great! Left border like this is a pretty common 'vibe coder'
  signal. Wonder if we should just remove it? I see the yellow left border
  in a few other places too. Regardless of whether its AI built or not, I
  don't know if that signal is the first thing we want a reader to see"

tokens.css already documents --mm-color-marigold as "accent — CTAs only,
used sparingly", so this restores that contract: marigold left borders on
static, non-CTA content blocks/cards are replaced with the site's primary
denim brand color, while genuinely deliberate marigold accents (navbar
underline, CTA pill, section rule, h2 rule accent, copy-button hover) are
left untouched.

- CardGrid: removed the always-on marigold left border from the card grid
  (the "For Administrators"/"For Developers" cards from the screenshot);
  hover state now uses a neutral border-strong color instead of marigold.
- PlanAvailability: .plan badge left border marigold -> denim, matching
  the Edition/Deployment/Attestation badge family.
- EditionAvailability: dropped the marigold .edition variant override so
  Edition and Deployment badges share the same denim left edge.
- IMEDiagram: intro-panel (Application/Integration/Deployment) left border
  and icon color marigold -> denim, with a lighter denim tint in dark mode.
- DeploymentArchitectureBuilder: .miniFlow/.flow protocol chips left
  border marigold -> denim (the per-role box legend, which uses marigold
  as one of several deliberate type colors, is left unchanged).
- custom.css: blockquote left border marigold -> border-strong (neutral),
  since it applied unconditionally to every blockquote site-wide.

* Restyle CardGrid nav cards after removing marigold left border

Replace the flat left-border accent with elevation cues (rounded
corners, resting/hover shadow, background tint on hover, and a
circular arrow/icon affordance) so cards still read as clickable
without the decorative bar. Fix dark-mode card surface, which was
hardcoded to a navy shade nearly identical to the page background.

* Fix invisible dark-mode left border on Plan/Edition badges

border-left-color was still hardcoded to the dark denim brand color
in [data-theme='dark'], blending into the near-black background.
Add the lighter --mm-denim-300 override used elsewhere on this
branch (IMEDiagram, DeploymentArchitectureBuilder).

* Fix low-contrast focus ring and inaccurate marigold-usage comment

- CardGrid: marigold focus outline was ~1.7:1 against the white card
  surface, under the 3:1 WCAG 1.4.11 minimum. Switch to denim, with
  a lighter dark-mode override.
- IMEDiagram: reword the marigold usage comment to match tokens.css's
  actual contract ("CTAs only, used sparingly") instead of the
  narrower and incorrect "interactive/hover states only" framing.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 15:01:57 +03:00
e90fa787f5 Remove unreviewed IA-redesign content, restructure air-gapped docs from legacy source (#37674)
* Remove unreviewed IA-redesign content, restructure air-gapped docs from legacy source

The docs-experimental -> monorepo migration (#37330) brought in draft
scaffolding from a proposed IA redesign that was never reviewed and has
no basis in the legacy Sphinx docs or the actual product. This removes
it and, where a real legacy page existed, rebuilds the content from
that source instead.

Removed (no legacy-docs equivalent, entirely speculative):
- administration-guide/upgrade/upgrade-v11.mdx - a per-major-version
  upgrade guide "stub" with literal placeholder text
  ("*Per-release, version-specific procedure authored by
  release-management team.*"); this per-version guide concept never
  existed in the old docs.
- deployment-guide/air-gapped-operations/offline-license-activation.mdx
  - fabricated procedure and config-setting claims with no legacy
  source and no verification against the product.
- security-guide/compliance-frameworks/fedramp-moderate.mdx - a live
  "in-process" FedRAMP authorization badge and NIST 800-53 control
  mapping table that was never reviewed or signed off by compliance/
  legal.

Restructured from the legacy air-gapped-deployment.rst content (real,
previously-published guidance, just reorganized into smaller pages):
- air-gapped-operations/index.mdx - high-level overview, dropped the
  invented "Persona scope" note, "Roadmap (Phase 2)" section, and
  unverified deployment contexts (DoD SIPRNet/JWICS, sovereign-cloud,
  tactical-edge/DDIL) that had no basis in the legacy docs.
- air-gapped-operations/quick-start-runbook.mdx - replaced the
  fabricated (and off-by-one) "12 steps" with the legacy RST's actual
  6-step deployment overview.
- air-gapped-operations/mirror-package-repositories.mdx - replaced
  invented artifact/registry guidance with the legacy Bill of
  Materials, Plugins, SSL/TLS, and registry-mirroring setup content.
- air-gapped-operations/disable-phone-home-features.mdx - replaced the
  invented "phone-home inventory" table (unverified config.json key
  names) with the legacy doc's actual per-feature configuration
  guidance (push notifications, email, link previews, GIF picker,
  notices, telemetry).

Also fixed every cross-reference broken by the above (persona landing
pages under for/, the compliance-frameworks index, DISA STIG and DoD
IL4/IL5 pages, and a few deployment-guide pages that linked to the
removed/renamed content).

The broader for/ persona-landing-page tree and the DISA STIG / DoD
IL4-5 compliance pages still reference the same unreviewed IA redesign
and need a follow-up pass, but are out of scope for this change.

* Soften DISA STIG customer-responsibility wording on DoD IL4/IL5 link

"Validated configuration guidance" overstated what the linked DoD
IL4/IL5 page actually provides (a documented control mapping, not a
third-party-validated one). Matches the "documents the gap honestly"
framing already used elsewhere on these compliance pages.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 13:35:02 +03:00
d3ed609ab9 docs: fix broken mm-ref:/mm-doc: placeholder links from RST migration (#37673)
* docs: fix broken mm-ref:/mm-doc: placeholder links from RST migration

During the Sphinx/RST-to-Docusaurus/MDX conversion, every RST :ref: and
:doc: cross-reference role was converted into a dead link using a
made-up, non-functional URI scheme (mm-ref:/mm-doc:) instead of a real
path, leaving ~228 broken links across ~20 docs/main files.

Decode each payload and resolve it to a working relative link, computing
the target heading's anchor slug (via github-slugger, matching
Docusaurus's own heading-id algorithm) where the original :ref: pointed
at a specific section. A few links with no confidently matching target
are marked with a TODO comment for follow-up.

* Resolve remaining ESR link TODOs and rebuild mangled version table

The three mm-ref: TODOs left by the previous pass pointed at RST
:ref: labels (release-v9-11-extended-support-release, etc.) that
exist as real headings in unsupported-legacy-releases.mdx and
mattermost-v10-changelog.mdx, not in release-policy.mdx. Resolved
them to the correct anchors.

While fixing the links, also rebuilt the surrounding table: it was
the same blockquote/dl/dt-with-literal-RST-separators artifact seen
elsewhere in the RST-to-MDX migration, plus a phantom 4th table
column. Cross-checked against the legacy RST source
(server-deployment-planning.rst) to confirm it's really 3 columns.

* Fix anchor over-extension and truncated RST fragments in table cells

- authentication-configuration-settings.mdx / site-configuration-
  settings.mdx: the migrated doc links wrapped far more text than
  intended ("multi-factor authentication (MFA) | - System Config
  path: ..." / "threaded discussions | - System Config path: ...").
  Closed the anchor immediately after the link label so the System
  Config path text renders as plain text outside the link, matching
  the pattern used elsewhere in these tables.
- client-availability.mdx: three table cells (Preview image links,
  Join existing team, Create a new team) retained truncated RST
  :ref: label fragments ("ments>`__", "eam>`__", "team>`__") left
  over from the conversion. Removed them - the checkmark cells
  already carry the correct support indicators, cross-checked against
  the legacy RST source table.

* Fix stray absolute doc link and leaked table separators

- important-upgrade-notes.mdx: the first Compliance Export doc link in
  the v10.5 row pointed at the absolute docs.mattermost.com/*.html URL
  instead of the site-relative canonical path (the second link in the
  same cell already used the correct path).
- client-availability.mdx: 15 feature-name links across the Messages,
  Channels, Teams, Playbooks, Calls, Authentication, and Other tables
  had leftover RST table-separator artifacts ("| | | |") bleeding into
  the anchor text. Removed them so the link boundary matches the
  correctly-converted rows elsewhere in the same tables.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 13:26:46 +03:00
8c0871edaa [Docs Revamp Feedback] Fix content rendering bugs (admonitions, broken images, table wrapping, oversized icons) (#37669)
* Fix leftover RST/malformed MDX admonition syntax

Docusaurus/MDX admonitions use `:::type[Title]` for a custom title, not
the old Sphinx `.. type::` RST directive or a bare `:::type Title` (which
Docusaurus renders as a type with the literal text "Title" appended, not
a real title). Fixed 12 files using the malformed `:::type Title` form,
plus two leftover `.. image::` RST directives (converted to `<img>` tags,
covered in the images commit's file but noted here since it's the same
admonition-adjacent cleanup pass) in manage-your-security-preferences.mdx.

* Fix broken images: port missing screenshots from legacy docs repo

26 files referenced screenshots/diagrams via relative paths (`../images/x`,
`../../images/x`) that don't resolve anywhere in this repo — the assets
were never migrated during the Sphinx-to-Docusaurus conversion, and in
one file (ad-ldap-groups-synchronization.mdx) the filenames were also
corrupted with a leftover `%0A` (encoded newline) prefix from the
conversion.

Ported the 46 missing image files from mattermost/docs (source/images/)
into docs/site/static/images/ — the location every other working image
reference in this repo already resolves against — and rewrote every
relative reference to the root-absolute `/images/<file>` form used
elsewhere in these same files (e.g. server-logout-indicator.png).

Verified via a full scan: all 680 `/images/...` references across
docs/main now resolve to a real file on disk.

* Fix oversized/broken checkmark icons in EMM config table

The EMM configuration reference table used bare <img src="../../_static/images/check-circle-green.svg" /> for ~24 "supported" checkmarks — a legacy Sphinx path that doesn't exist in this repo (broken image) and, with no explicit size, would render at native SVG size rather than as a small inline checkmark (oversized icon). Replaced with the actual migrated asset (/img/ui/checkmark.svg) plus explicit width/height and alt text.

* Fix wide comparison table wrapping on the plans page

The plans/pricing table (7 columns: Feature Category + 5 editions +
Available From) had no table-layout or column-width rules, so the
first ("Feature Category") column — which holds long, wrapping prose —
ended up roughly the same rendered width as the edition columns, which
only ever hold a short checkmark or version string. That forced every
row onto several wrapped lines. Added `table-layout: fixed` with
explicit per-column widths (28% category / 10% per edition / 22% for
"Available From") so the category column gets the space it needs.

* Fix images broken on non-root baseUrl deployments (PR previews)

Docusaurus only rewrites image URLs for the site's baseUrl when using
markdown image syntax (`![alt](/images/x.png)`) — that gets compiled to
a webpack require() call. A raw HTML `<img src="/images/x.png" />` tag
is left as a literal string, which the browser resolves from the domain
root, ignoring baseUrl entirely.

On production baseUrl is "/", so this silently worked by coincidence.
But PR preview builds set BASE_URL to "/mattermost/pr-<N>/"
(.github/workflows/docs-preview-template.yml), so every raw <img
src="/images/..."> or src="/img/..."> 404s specifically on preview
deployments — which is why images added/fixed earlier in this branch
still showed as broken in the PR's docs preview.

This is a pre-existing, repo-wide pattern (503 raw <img> tags across
103 files, most untouched by this PR otherwise) rather than something
introduced by earlier commits here — those commits just added a few
more instances of an existing broken pattern. Fixed all of them by
importing @docusaurus/useBaseUrl and wrapping src={useBaseUrl('/images/...')}
so the URL is correctly rewritten for whatever baseUrl the site is
built with.

Verified: all 503 useBaseUrl(...) calls resolve to a real file under
docs/site/static, and every modified file was checked with @mdx-js/mdx
compile() to confirm no syntax breakage from the added import
statements.

* Fix leftover RST list/table markup in notifications docs

- mobile-troubleshooting.mdx: replace leading blockquote markers (>)
  under step 3 with list-content indentation so the nested numbered
  substeps and screenshots render as part of the ordered list instead
  of a blockquote.
- manage-your-notifications.mdx: replace the mangled blockquote/dl
  header row (with literal RST separator runs and stray | and +
  characters) with a proper <thead><th scope="col"> row, and restore
  the "Icon badge (dot)" row as a normal <tbody> row.

* Rebuild mangled security preferences table from RST source

Cross-checked against the legacy RST source to reconstruct the table
correctly: proper <thead>/<th scope="col"> header, real ordered/
unordered lists instead of pipe-joined literal text, working internal
links in place of unresolved mm-ref: URIs, and a <Note> block for the
sign-in method callout (previously rendered as literal ".. note::"
text). Also dropped a stray phantom third table column left over from
conversion.

* Fix typos and remaining markup issues in collaborate/notifications docs

- message-priority.mdx: fix "acknowlegement" typo, add missing "the"
  before "message" in the acknowledgement description.
- organize-conversations.mdx: split the Tip's two bullets onto
  separate lines and drop the escaped leading hyphen that was
  preventing the first item from rendering as a list.
- organize-using-custom-user-groups.mdx: fix "preferreed" typo and
  add missing "to" in the archived-group restoration instructions.
- schedule-messages.mdx: fix "dislays" typo.
- manage-your-notifications.mdx: replace the leftover dl/dt/dd/
  line-block markup in the Push notifications row with a plain anchor
  link, matching the Web/Desktop cells elsewhere in the table.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 12:40:43 +03:00
3387e41752 fix(docs-preview): set commit status via gh api for correct target_url (#37664)
* docs: mark scale partial pages as unlisted with proper titles

These MDX files are content partials imported into the scale-to-*-users
pages, mirroring the :orphan:/:nosearch: Sphinx pages they were migrated
from. Without frontmatter, Docusaurus rendered them as full standalone
pages with an ugly slug-derived title, breadcrumbs, and pagination.
unlisted: true keeps their routes alive (needed by the PDF book builder
and legacy redirects) while hiding them from the sidebar, breadcrumbs,
pagination, and search indexing.

* fix(docs-preview): set commit status via gh api for correct target_url

The shared mattermost/actions/delivery/update-commit-status action accepts
a target_url input but ignores it, hardcoding the Actions run URL instead.
This made the docs-preview PR check's Details link point at the workflow
run rather than the S3-hosted preview site.

Switch docs-preview-template.yml and docs-preview-fork.yml to call the
GitHub Statuses API directly via `gh api repos/.../statuses/{sha}`, matching
the pattern in e2e-tests-playwright.yml, so the success status's target_url
points at the actual preview URL.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 10:28:39 +03:00
5f6f9faba3 [Docs Revamp Feedback] Readability & accessibility fixes (#37665)
* Fix readability & accessibility issues from Docs Revamp feedback

Addresses the readability/accessibility batch collected 2026-07-22/23 in
the "Docs Revamp - Feedback" channel and Eric Sethna's first-pass review
doc:

- Dark-mode "note" callout text vs. background contrast (Michael
  Roberson; Eric Sethna's doc item 8) — pin explicit brand colors for
  dark-mode admonitions instead of Infima's generic secondary-alert
  pairing.
- Link color/body-text visual distinction, both themes (Vishal
  Choudhary, Marco Kundt; Eric Sethna's doc item 5) — new link colors
  that stay far apart in luminance from surrounding body text (not just
  from the page background), plus default (not hover-only) underlines.
- Body text should read darker, like the old docs site (Vishal
  Choudhary) — wire --ifm-font-color-base to --mm-text-primary instead
  of Infima's unbranded default.
- Main content panel doesn't visually "pop" against the side nav/TOC
  (Vishal Choudhary) — tint the sidebar/TOC panels with --mm-bg-subtle
  and leave the reading column on the page background.
- Dark-mode inline code contrast (Marco Kundt) — explicit text color via
  --mm-text-primary.
- Bold/color combo hard to read (Ben Cooke) — subtle letter-spacing on
  bold runs in prose.
- Heading/TOC category font not readable, vs. the readable "IME" example
  (Eric Sethna's doc item 1) — swap the 900-weight display face out of
  small multi-word TOC category labels for the base sans face at bold
  weight, matching the same fix already applied to navbar links.
- Inline code spans taking up excess vertical space (Eric Sethna's doc
  item 9) — pin line-height on inline `code` so it stops inheriting the
  1.65 paragraph line-height; multi-line fences are unaffected.
- Prose max-width too wide on large screens (Rohith Chandran) — cap
  top-level article prose at ~760px via a `.markdown > `-scoped rule that
  leaves the OpenAPI 2-column layout (nested deeper) untouched.

Full WCAG contrast math for every changed pair is in the PR description.

Note: this touches docs/site/src/css/custom.css and tokens.css, which a
parallel "remove yellow left border" workstream also touches (callout/
card border styles) — left border/accent-bar colors are deliberately
untouched here to minimize overlap, but a merge conflict is still likely.

* Address review feedback on readability/a11y PR

- Extend dark-mode admonition background fix from "note" to all five
  alert types (info/success/warning/danger) — the "hard on the eyes"
  complaint (item 13) wasn't note-specific. Also pin the alert heading
  label and icon color explicitly, since Infima's inheritance made the
  "NOTE"-style label the most visibly low-contrast part of the callout.
- Drop the default underline on prose links; use medium weight (600) as
  the non-color WCAG 1.4.1 cue instead, keeping underline for hover/focus
  only.
- Stop forcing code blocks to our --mm-denim-800 background in dark mode.
  Docusaurus's dark Prism theme (dracula) has its own background/token
  contrast pairing; overriding just the background broke that pairing.
  Letting the theme's own background show through (already applied to
  the block's container via --prism-background-color) fixes contrast.
- Apply the same small/multi-word-heading fix already used for TOC
  category labels to table column headers, which have the identical
  problem (multi-word labels in the 900-weight display face). Left
  footer titles on the heading face since those are short single words,
  the case that face handles fine — documented why.

* Fix dark-mode contrast for code blocks, inline code, and note callouts

Code block, callout, and inline-code backgrounds/borders all sat within
~1:1 contrast of the dark-mode page background (same navy hue family),
so they had no visible edge or fill distinct from the page. The
unscoped dark-mode `code` background rule also leaked into code
blocks' own `<code>` element (beating Infima's `pre code: transparent`
on specificity), masking most of the code block fill behind a
near-black overlay regardless of the fill color chosen.

* Fix dark-mode contrast for blockquotes, inline code, and table stripes

Same root cause as the earlier code-block/callout fixes: --mm-denim-800
and --mm-denim-700 sit within ~1:1 contrast of the dark-mode page
background, so blockquotes, inline code chips, and even-row table
striping all had no visible fill against the page. Switched them to
--mm-bg-surface (+ denim-400 borders where a border exists) to match
the surface treatment already used elsewhere.

* Tone down h1 title weight; revert prose max-width cap

- h1 page titles were still on the 900-weight Archivo Black poster
  face after h2-h4 got moved to a normal-weight sans face for the
  same "too heavy/shouty" reason. Bring h1 in line with the rest so
  every page title uses one consistent weight.
- Revert the 760px max-width cap on top-level markdown prose blocks
  (added for Rohith Chandran's wide-line-length feedback) — it also
  squeezed non-article layouts like the homepage's persona cards.
  Needs more thought before reapplying narrower/more targeted.

* Trim verbose CSS comments introduced in this branch

Cut reviewer-name/item-number attributions and repeated exploratory
narrative down to the "why" a future reader actually needs, and fixed
a couple of comments left stale by later commits (e.g. h1 no longer
using the Archivo Black display face). Also dropped a redundant
background declaration in the dark-mode .callout override that just
re-set the same value the base rule's --mm-bg-surface already
resolves to per theme.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-27 09:58:43 +03:00
69e3bdf0d9 docs: vendor and stage Mattermost Agents docs for Docusaurus build (#37627)
* docs: vendor and stage Mattermost Agents docs for Docusaurus build

The migration plan externalized Agents links, but the Docusaurus sidebar
generator already declares an `agents` TOP_LEVEL category and stub pages
link to `/agents/docs/*` paths with no content behind them. Vendor the
mattermost-plugin-agents docs/ folder as a submodule and stage it into
main/agents/docs/ at build time (mirroring how Sphinx handles the same
submodule via conf.py excludes), so the Agents sidebar category and
internal links resolve to real, versioned content instead of dead ends.

* docs: strip leading license comment before MDX-staging Agents docs

Three feature pages (channel_summaries.md, custom_prompts.md,
managing_agents.md) lead with a raw <!-- Copyright ... --> HTML comment
before the # Title line, which broke both title extraction (regex only
matched a title at the very start of the file) and the Docusaurus build
(MDX doesn't parse bare HTML comments the way Markdown does, so it failed
to compile with "Unexpected character '!'"). Strip the license comment
before further processing instead of trying to convert it.

* docs: fail loudly on missing Agents submodule, fix usage comment path

- A missing/uninitialized vendor/mattermost-plugin-agents submodule
  previously logged a warning and returned a successful zero-count
  result, letting CI/prestart/prebuild continue with an empty (or, on a
  reused workspace, stale) Agents section instead of failing. Now it
  clears any previously staged output first, then throws so the build
  fails clearly when the submodule isn't present.
- Fixed the usage comment referencing the nonexistent docs-site/scripts
  path instead of the actual docs/site/scripts.

* docs: checkout submodules in docs-ci.yaml build check

This is the third docs-building workflow (alongside docs-cd.yml and
docs-preview-template.yml) that runs npm run build on docs/site, and it
was missed when submodules: true was added to the other two — its
"Build docs site" step failed on this PR because
vendor/mattermost-plugin-agents wasn't checked out, which
stage-agents-docs.mjs now correctly treats as a hard failure.

* docs: inline Agents content instead of a separate top-level LHS section

Sphinx never gives Agents its own top-level nav entry: it `.. include::`s
admin_guide.md/user_guide.md directly into the existing curated pages
(administration-guide/configure/agents-admin-guide.rst and
end-user-guide/agents.rst), and only nests a handful of files
(providers, aws_bedrock_setup, sovereign_ai, usage_tips) as small hidden-
toctree children of those same two pages. load-testing.md,
upgrading_to_2.0.md, and all of features/*.md are never referenced in any
Sphinx toctree at all.

The previous vendoring approach staged all 12 files as a brand-new,
disconnected top-level "Agents" category, so reaching the actual guide
meant leaving the curated page, opening an unrelated top-level section,
and drilling into "Docs" — the opposite of what Sphinx does today.

This reproduces Sphinx's structure instead:
- stage-agents-docs.mjs now categorizes the 12 vendored files: admin_guide/
  user_guide are staged twice — once as a normal (but `unlisted: true`)
  doc for direct-link parity with Sphinx's orphan pages, and once as a
  Docusaurus Markdown partial (leading underscore, auto-excluded from
  routing/sidebars) for inline import. providers/aws_bedrock_setup/
  sovereign_ai/usage_tips are staged as normal listed docs. Everything
  else is staged unlisted, matching Sphinx never surfacing them in nav.
- Added generic relative-markdown-link rewriting (mirroring the existing
  image-path rewriting) so cross-links between vendored files
  (`../admin_guide.md#anchor`, `features/channel_summaries.md`, etc.)
  resolve correctly regardless of nesting depth or where the linking
  content ends up rendered.
- agents-admin-guide.mdx and end-user-guide/agents.mdx now `import` and
  render the partials inline instead of linking out, and no longer link
  to a separate "Docs" section.
- gen-documentation-sidebar.mjs: removed the standalone `agents`
  TOP_LEVEL category. Added `{doc: '<full id>'}` support to
  buildAdminConfigureItem for cross-directory group items, and a new
  ADMIN_CONFIGURE_GROUPS.agents group nesting providers/aws_bedrock_setup/
  sovereign_ai under agents-admin-guide. Added a standalone
  promoteDocToCategory helper (End User Guide has no full manual-grouping
  override) to nest usage_tips under end-user-guide/agents.
- Documented both patterns (cross-directory group items, Markdown-partial
  inlining) in docs/site/README.md's "Manual grouping overrides" section.

Validated: stage-agents-docs.mjs + gen-documentation-sidebar.mjs both run
clean with zero warnings; a scoped @mdx-js/mdx compile check across all
16 affected files (2 curated pages + 12 staged docs + 2 partials) passes
with zero failures. Full `docusaurus build` still needs the OpenAPI
prebuild's Go toolchain, unavailable in this sandbox — already covered by
docs-ci.yaml in CI.

* docs(agents): self-host the plugin-v2 upgrade guide link

Now that mattermost-plugin-agents/docs is vendored and staged into
/agents/docs/*, point the two "how to upgrade to Agents v2" references
(v11 changelog, important upgrade notes) at our own
/agents/docs/upgrading_to_2.0 page instead of an external GitHub blob
link — the same self-hosting fix already applied to the old dangling
sample-file links.

* docs(agents): tighten stage-agents-docs.mjs header comment

Same explanation, fewer words — trims the file-level comment from ~45
to ~33 lines without dropping the rationale (why staging instead of a
direct submodule checkout, and how the three-way listed/unlisted/
inline-partial split reproduces Sphinx's nav).

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-24 16:56:13 +03:00
75ff31543f docs: mark scale partial pages as unlisted with proper titles (#37628)
These MDX files are content partials imported into the scale-to-*-users
pages, mirroring the :orphan:/:nosearch: Sphinx pages they were migrated
from. Without frontmatter, Docusaurus rendered them as full standalone
pages with an ugly slug-derived title, breadcrumbs, and pagination.
unlisted: true keeps their routes alive (needed by the PDF book builder
and legacy redirects) while hiding them from the sidebar, breadcrumbs,
pagination, and search indexing.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-23 10:27:27 +03:00
75a381ee70 docs(site): remove What's New in v11 stub page and fix heading typography (#37617)
* docs: remove What's New in v11 stub page

The page was scaffolding seeded during the IA-redesign migration
(#37330) and never received real content, so it shouldn't be live in
the preview. Drops the sidebar entry and cleans up the cross-links
from the v11 upgrade guide.

* docs(site): tone down in-body heading weight

h2-h4 were rendering in the same 900-weight Archivo Black display
face as h1 page titles, making body section headers (e.g. "Buy a
subscription") look as loud as the hero title. Reserve the heavy
display face for h1 and use Inter at a normal bold weight for h2-h4.

* docs(site): make h1's heavy display weight explicit

h1 relied on the shared --ifm-heading-font-weight variable to render
at 900. Now that h2-h4 override that variable locally, spell out the
weight on h1 directly so it isn't implicitly coupled to a variable
other rules no longer use.

* docs(site): shrink oversized titles on the search results page

Each hit's title on /search is a plain h2 rendered outside .markdown,
so it fell through to the full 1.85rem heading size — as large as an
in-article section header. Scope it down via the SearchPage's own
wrapper class instead of the plugin's hashed CSS-module class.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-22 13:53:43 +03:00
10c0f36cbe docs(sidebar): restructure sidebar grouping, fix Samples/Recipes stubs, self-host sample downloads (#37591)
* docs(sidebar): group Integrations Guide and Administration Guide > Configure

Both sections were flat lists (20 and 34 items respectively) with no
logical grouping, unlike Overview/Deployment Guide which already got
manual groupings. Adds the same override pattern:

- Integrations Guide: group by integration type (Chat & Meeting
  Interop, ITSM & Dev Tools, No-Code Automation, Built-in
  Integrations with Webhooks/Slash Commands sub-groups).
- Administration Guide > Configure: group the ~12 settings-reference
  pages under one category, plus Search, Calls, Storage & Database,
  Email & Notifications, Billing & Account, and Branding groups.
  AI Agents Configuration stays a standalone top-level entry (3rd,
  after System Console Settings and Search) rather than being buried
  in a misc/optional bucket.

* docs(sidebar): document the manual grouping override pattern in README

Nothing explained how OVERVIEW_GROUPS/DEPLOYMENT_GROUPS (and now
ADMIN_CONFIGURE_GROUPS/INTEGRATIONS_GROUPS) work, or what to do when
adding a new file to one of these sections. The script already warns
on orphaned files, but that warning is easy to miss if you don't know
the override mechanism exists in the first place.

* docs(sidebar): reorganize gen-documentation-sidebar.mjs, config on top

Pure reorganization, no behavior change (verified byte-identical
sidebar JSON output before/after). All manual-grouping config
(*_GROUPS/*_ROOT_ORDER/*_HIDDEN constants for Overview, Deployment
Guide, Administration Guide > Configure, Integrations Guide) now
lives together at the top of the file, and all functions (generic
helpers, per-section builders, main) live together at the bottom.

Previously each section's config and builder functions were
interleaved in file order, so adding a page to one section meant
scanning past unrelated sections' logic to find where its config
lived.

* docs(sidebar): remove the empty Samples section

Sphinx never had a "Samples" navigation section — source/samples/ in
the Sphinx repo is marked :orphan: and deliberately excluded from any
toctree; it's a folder of downloadable static assets (JSON/XML/YAML/
CSV/zip) referenced inline via :download: from ~5 unrelated pages
(logging, EMM mobile deploy, Grafana/Loki centralized logging,
compliance export), never a browsable page.

The migrated docs/main/samples/index.mdx was an empty stub (frontmatter
only, no content), so it rendered as an empty top-level sidebar
category with nothing underneath — the "looks broken, not coming
soon" problem. Removed the stub page and the corresponding TOP_LEVEL
entry in the sidebar generator.

Note: the actual downloadable sample files were never migrated into
the new site's static assets — the 4 migrated pages that reference
them still link to github.com/mattermost/docs (the old repo) instead
of being self-hosted. Tracked as a separate follow-up, not fixed here.

* docs: self-host downloadable sample files instead of linking the old repo

Four migrated pages (logging, EMM mobile deploy, Grafana/Loki
centralized logging, compliance export) linked their downloadable
sample files (JSON/XML/YAML/zip) to github.com/mattermost/docs — the
old Sphinx repo — instead of hosting them on the new site. Every other
static asset (images) was copied into docs/site/static/ during
migration; these were missed.

Copies the 8 referenced files into docs/site/static/files/samples/
and repoints all 8 links to the self-hosted /files/samples/... paths,
matching the existing /images/... convention used everywhere else in
this content tree.

* docs(sidebar): remove the Recipes top-level nav section

The Sphinx source for this content (recipes/product-vulnerability-
incident.rst) is marked :orphan: with an explicit comment: "This page
is intentionally not accessible via the LHS" — Sphinx never surfaced
it as a navigable section either.

The migrated page (docs/main/recipes/product-vulnerability-incident.mdx)
was auto-promoted into a full top-level sidebar category by the
filesystem-driven generator, at equal visual weight to sections with
10+ items despite having exactly 1. Removing the TOP_LEVEL entry
matches Sphinx's original intent — the page stays reachable by direct
URL, just not discoverable via the sidebar.

* docs(sidebar): regroup Administration Guide > Manage by task

Manage had 37 files split into a flat top level (19) plus a nested
manage/admin/ sub-folder (18) — a raw filesystem artifact, not a real
Sphinx grouping: Sphinx has no manage-index.rst/toctree that groups
this content, and the admin/ sub-folder is never surfaced as its own
nav level in Sphinx's actual sidebar. Worse, the flat-vs-admin split
was internally inconsistent — related pages (monitoring/health,
billing, user/access management) were each scattered across both
buckets rather than following any coherent theme.

Replaces both with task-based groups: User & Access Management
(including an Attribute-Based Access Control sub-group), Server
Configuration & Maintenance, Monitoring & Diagnostics, Billing &
Licensing, Cloud Workspace Management, Notifications & Surveys,
Content & Product Governance, and Data Export & Migration. Customize
Branding stays a standalone entry (single item, not worth its own
group).

* docs(sidebar): harden buildAdminGuideSidebar's category resolution

Filter the items-fallback lookup to type === 'doc' before reading
.id, matching the same pattern already used in buildDeploymentSidebar
(dirNameFromId), instead of relying on category items implicitly
lacking an .id field.

Also track whether the Configure and Manage sub-categories were
actually found and regrouped, and warn if either is missing — so a
future filesystem change under Administration Guide (renamed/removed
sub-folder) surfaces as a build warning instead of silently leaving
the manual grouping override unapplied.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-21 14:56:11 +03:00
b94cd8a540 ci: consolidate docs-preview checks into one status with preview URL (#37524)
* ci: consolidate docs-preview checks into one status with preview URL

Drop the same-repo status-update jobs that cluttered the PR checks list,
and post a single docs-preview commit status whose Details link opens the
preview environment.

* remove comment

* Remove duplicate failure status update in docs-preview-fork workflow

The deploy job already posts a failure commit status via the shared
template, making the separate update-failure-status job redundant.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-21 13:51:32 +03:00
9c31300bff docs: port P13/P14 content drift into monorepo (#37590)
* docs(P13c): add missing manage-plugins.mdx to Administration Guide Configure

source/administration-guide/configure/manage-plugins.rst existed in the
Sphinx repo pre-fork but was never carried over during the initial P2
move or the P13c Configure reconciliation pass. Port it verbatim
(RST -> MDX) with links/anchors verified against the current docs/main
tree (mmctl-command-line-tool, plugins, plugins-configuration-settings,
popular-integrations, environment-configuration-settings#maximum-file-size,
air-gapped-deployment).

#### Release Note
```release-note
NONE
```

* docs(P13/P14): port remaining content drift into monorepo

Ports outstanding content-only drift identified in docs-experimental
phase-P13/P14: V11.9 docs major release content, Azure Blob Storage
guide, ID-attribute case-sensitivity notes, ranked attribute types and
attribute value masking for ABAC, plugin management guide linkage, and
the P14 markdown action buttons reference page with its
interactive-messages cross-reference. Excludes all automation/workflow
files, which are handled separately.

* docs(sidebar): link top-level category headers to their landing page

buildCategory() only recognized a literal index.md(x) filename as a
category's landing page, but Overview, Deployment Guide, Administration
Guide, Security & Compliance, End User Guide, Integrations Guide, Get
Help, and Use Case Guide all use a *-index.md(x) filename instead (to
avoid collisions when flattening for URL stability). As a result,
clicking most top-level sidebar categories only expanded/collapsed the
list instead of navigating to their overview page. Recognize the
*-index.md(x) convention as a fallback so these categories link
correctly, matching the existing Deployment Guide/Overview behavior.

* docs(P13/P14): fix blog link typo and restore dropped Open Source Components entry

Audit against Sphinx source (docs/source/product-overview/) found two
drops from the 7e915c99f8 content-drift port:

- mattermost-v11-changelog.mdx: blog link slug had an erroneous "-0"
  (mattermost-v11-9-0-is-now-available -> mattermost-v11-9-is-now-available),
  likely copy-pasted from the v11.8.0 entry above it.
- mobile-app-changelog.mdx: the 2.42.0 release entry's "Open Source
  Components" subsection (voximplant/react-native-foreground-service
  removal) was dropped entirely during the RST->MDX port.

#### Release Note
```release-note
NONE
```

* docs(fix): remove standalone SQL comment line breaking MDX parse

A lone "--" comment line inside a <pre><code> SQL block was parsed by
remark as a setext heading underline, splitting the surrounding
paragraph and leaving the <code> tag unclosed. CI caught this in the
docusaurus build. Merge the comment into the surrounding paragraph.

* docs(fix): escape curly braces in JSONB path literal breaking SSG render

'{options}' inside a SQL <pre><code> block was parsed by MDX as a JSX
expression referencing an undefined "options" identifier, causing
"ReferenceError: options is not defined" during static site
generation. Escape the braces the same way already done for other
JSONB path literals elsewhere in this file. Verified with a full local
docusaurus build.

* docs(sidebar): reuse the landing-file resolver for nested category sorting/labels

The prior fix only applied the index.md(x) / *-index.md(x) fallback to
a category's own link resolution. Nested category sort keys and the
category label fallback still assumed a literal index.mdx, so a
sub-directory using the *-index.md(x) naming convention would sort by
its default position (9999) instead of its declared sidebar_position,
and its category label would fall back to a humanized directory name
instead of the landing page's title. Factor the resolver into a shared
findIndexFile() helper and use it in both places.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-21 13:40:08 +03:00
0556b02c6b docs(P13f): reconcile docs drift — Administration Guide: Scale (#37481)
* docs(P13f): reconcile scale/search/monitoring drift from legacy docs repo

Ports content drift from mattermost/docs (Sphinx) into the migrated MDX
pages under administration-guide/scale: Elasticsearch v9 support and
v7.17 deprecation, corrected AWS OpenSearch access policy guidance
(open principal instead of an unsupported IAM-principal policy) plus an
OpenSearch v1.x deprecation notice, new search-engine outage
health-monitor documentation, and plugin-metrics /metrics aggregation
notes.

* docs(P13f): update scale-to-N-users Azure DB SKUs to Intel E*ds v5

Replaces the Azure RDS reader/writer instance SKU (E*as v6, Intel
"as v6" family) with E*ds v5 (Intel "Eds v5" family) across all nine
scale-to-N-users reference architecture pages, matching the upstream
correction in mattermost/docs.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-21 10:29:56 +03:00
3e56c9d908 Add Algolia site verification to docs robots.txt (#37578)
* Add Algolia site verification to docs robots.txt

Adds an algolia-site-verification comment to prove DNS ownership of the
docs.mattermost.com CloudFront distribution for the Algolia Crawler.

* Use Algolia-Crawler-Verif header format

Match the exact verification comment key expected by Algolia's crawler.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-20 16:48:40 +03:00
4af580752e Remove stray root package-lock.json (#37555)
An orphaned, empty package-lock.json at the repo root (with no
matching package.json) was accidentally introduced in #36143. It
breaks the delivery-platform release pipeline's SBOM generation step,
since `snyk sbom --all-projects` cannot resolve a lockfile without a
package.json and aborts the whole scan.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-17 10:36:37 +00:00
a3b721cfc2 Fix docs migration rendering issues (Mermaid, tables, callouts, version filter) (#37511)
* Enable Mermaid rendering for release policy Gantt chart.

Docusaurus requires the theme-mermaid plugin and standard ```mermaid fences instead of Sphinx MyST ```{mermaid} syntax.

* Fix clipped text in important upgrade notes table.

Convert the migrated RST grid table to a two-column layout and restore proper table cell display so long upgrade notes wrap instead of being cut off.

* Fix PostgreSQL version policy table formatting.

Replace the broken Sphinx grid-table markup with a standard HTML table so version, release date, and minimum PostgreSQL version render correctly.

* Fix callout rendering in Linux deployment guides.

Replace unrendered ::: admonition syntax with the project's Note, Tip, and Important MDX components in the RHEL and tarball install guides.

* Add version filter to important upgrade notes page.

Port the Sphinx version-filter widget to a React component so admins can narrow upgrade notes by source and target version during the docs migration.

* Fix UpgradeNotesFilter TypeScript row element typing.

Use querySelectorAll<HTMLTableRowElement> so table row refs satisfy the RowRef type during docs-site typecheck.

* Improve release policy Gantt chart readability.

Port the Sphinx Mermaid styling so done and active bars render blue, ESR bars render red, and task labels use larger bold white text inside the bars.

* Fix upgrade notes filter and table layout.

Wait for the table to mount before collecting versions, hide whole version groups to avoid rowspan breakage, and restore a fixed two-column table layout so note text is no longer clipped.

* Fix markdown table header column alignment.

Restore native table layout for standard docs tables so thead and tbody share column widths; keep the upgrade-notes wrapper for wide tables that need horizontal scroll.

* Fix illegible release policy Gantt chart text.

Mermaid renders the Gantt SVG at a viewBox sized to its own internal
layout, then Docusaurus scales it down (~0.57x) to fit the docs
content column. Task/section labels configured at 14px were rendering
on-screen at ~7px, unreadable without manually zooming the browser.
Scale up the diagram's font size and spacing to compensate.

* Fix header line wrap and cell overflow in upgrade notes table

Force a line break in the header label and constrain header/cell
styling so the two-line header no longer overlaps itself, and long
cell content (including SQL code blocks) wraps within the column
instead of overflowing the table.

* Make Mermaid Gantt outside labels readable in light mode.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-16 19:08:12 +03:00
1613b44d84 Stop posting docs preview PR comments; link preview from status check (#37491)
Docs preview cleanup and build workflows no longer post PR comments.
The build workflows now surface the preview URL via the commit status's
target_url instead, so the status check links directly to the preview.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 14:29:28 +03:00
52efee5682 docs(P13a): reconcile docs drift — new pages + images (#37479)
* docs(P13a): add Azure Native VM page, team channel policies page, and azure screenshots

* docs(P13a): use Note/Important JSX components for consistency with directory siblings

* docs(P13a): wire Azure Native VM into Install on Linux sidebar and card grid

The new deploy-azure-native-vm.mdx page was orphaned from navigation: the
Deployment Guide sidebar's "Install on Linux" grouping and the "Choose an
install method" card grid on deploy-linux.mdx are both manually maintained
lists, so adding the file alone didn't surface it anywhere.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:19:20 +03:00
fd3b125b31 Reconcile Product Overview content drift from docs repo (P13 sub-phase 4.1) (#37476)
* Fix broken checkmark icons and zoom-breaking tables on Plans and Cloud pages

The Plans page referenced a Sphinx-era static image path that doesn't
exist in the Docusaurus site, rendering broken icons. The Cloud
subscriptions comparison table was a mangled RST-to-MDX conversion
artifact (nested dl/dt/dd, literal ASCII borders, unresolved checkmark
substitutions) with fixed column widths that clipped content on zoom.
Both tables now use the site's checkmark.svg icon and scroll
horizontally within their own container instead of breaking the page.

* Reconcile Product Overview content drift from docs repo

Applies content that landed in mattermost/docs between 2026-05-14 and
2026-07-13 (v11.7/v11.8 server releases, v10.11 dot releases, v6.2/v5.13.7
desktop releases, v2.40-2.41.3 mobile releases, and related subscription/
FAQ/deprecation copy updates) to the corresponding MDX pages in
docs/main/product-overview, per phase P13 sub-phase 4.1 of the docs
migration plan.

* Fix duplicate changelog bullet and admin console path in Product Overview

- Remove duplicate flagged-post-visibility bullet from the v11.7.3 changelog entry.
- Correct subscription.mdx admin console path to include the Reporting menu, matching the path used elsewhere in the docs.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:18:58 +03:00
92a41aa849 docs(P13c): reconcile docs drift — Administration Guide: Configure (#37483)
* docs(P13c): reconcile Configure content drift — audit log/telemetry cleanup, mobile ephemeral mode, watermarking, plugin/integration defaults, CJK fix

Ports content drift from the legacy mattermost/docs Sphinx repo into the
Administration Guide > Configure MDX pages (phase P13, sub-phase P13c):

- environment-configuration-settings: remove unused ExperimentalAuditSettings
  file-rotation settings (now handled via AdvancedLoggingJSON), update
  EnableDiagnostics description to reflect Rudder/telemetry removal (Sentry
  only), and add the Mobile ephemeral mode settings.
- experimental-configuration-settings: remove the same unused audit logging
  settings, and add the experimental Enable Mobile Watermark setting.
- site-configuration-settings: update Report a Problem default behavior and
  fix the ReportAProblemMail env var name, add Channel category sorting, and
  add the Classification Markings section.
- integrations-configuration-settings: fix OutgoingIntegrationRequestsTimeout
  key name and default value.
- plugins-configuration-settings: fix RequirePluginSignature default (false).
- reporting-configuration-settings: rename Site statistics to System
  statistics, preserving the legacy anchor.
- enabling-chinese-japanese-korean-search: fix missing semicolon in the
  zhparser SQL example.
- system-attributes: rename "Custom attributes for user profiles" to "User
  attributes" to match the v11.7 product rename.

authentication-configuration-settings had no net drift to apply: the source
commit reviewed (LDAP/SAML ID case-sensitivity notes) was later reverted
upstream, and Azure Blob Storage documentation (hinted in the task) was also
added then fully reverted upstream, so no Azure content exists in either the
source or target repo.

* docs(P13c): fix config.json key for Enable Mobile Watermark setting

ExperimentalSettings.EnableMobileWatermark does not exist in config.go;
the actual field is ExperimentalSettings.EnableWatermark.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:18:48 +03:00
8649fe0796 docs(P13i+P13j): reconcile drift for Integrations Guide, Security Guide, Use Case Guide, Get Help (#37488)
Ports upstream mattermost/docs drift into the Integrations Guide (ServiceNow auth table URL, GitHub org vs. repo webhook guidance, Zapier link fix), Security Guide (Mobile Ephemeral Mode, mobile watermarking), Use Case Guide (Mission-Ready Mobile ephemeral mode references), and Get Help (community chat search bar wording).

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:18:37 +03:00
b99f826e6a docs(P13g): reconcile drift for Deployment Guide (#37489)
Ports drift from the Sphinx docs repo into 11 of the 12 Deployment Guide
MDX pages: K8s builtin DB readiness check, RHEL/tar release version
bumps, RHEL 7/8 v12.0 deprecation notice, Elasticsearch v9 support,
Intune MAM plan availability fix, mobile /mobile-logs command, mobile
watermarking + Ephemeral Mode docs, desktop app version bumps + macOS
MDM support, and reference architecture port table restructuring.

#### Release Note
```release-note
NONE
```

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:18:26 +03:00
bfe4eeec4e docs(P13h): reconcile drift for End User Guide (#37490)
Ports upstream mattermost/docs content drift (auto-translate rename, channel banner classification markings, membership-policy/ABAC updates, AI Actions rewrite menu, GIF frame limits, and related v11.7/v11.8 end-user copy) into the corresponding docs/main End User Guide MDX pages.

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:18:16 +03:00
b07a9836ba docs(P13e): reconcile docs drift — Administration Guide: Onboard + Upgrade + Comply (#37480)
* docs(P13e): reconcile drift for Administration Guide onboard/upgrade/comply pages

Ports content changes made in the legacy Sphinx docs repo since the P13
migration fork point (2026-05-14) into the corresponding MDX pages: SAML/SSO
Entra ID namespace-matching guidance, granular permissions updates, upgrade
notes for v11.7/v11.8, OSS component list, and minor typo/link fixes across
onboard, upgrade, and comply sections.

* docs(P13e): fix MDX compile failure from blank lines inside <pre><code> blocks

Blank lines inside JSX <pre><code> blocks are parsed as paragraph
boundaries by MDX, breaking the enclosing tag matching. Remove the
blank lines used for SQL readability while keeping each statement on
its own line.

* docs(P13e): fix insecure curl example and legacy absolute doc link

- electronic-discovery.mdx: use https for the authenticated curl
  example, matching the other curl examples in the same page.
- important-upgrade-notes.mdx: point the Deprecated Features reference
  at the local route instead of the legacy docs.mattermost.com URL.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 12:14:12 +03:00
5fe06ac4d0 docs(P13d): reconcile Manage content drift — ABAC updates, telemetry, mmctl, health checks (#37482)
Ports content drift from the legacy Sphinx docs repo (mattermost/docs)
since the P13 migration fork point into the corresponding Administration
Guide > Manage MDX pages:

- ABAC v11.7/v11.8: public channel membership policies (advisory vs.
  hard-gate behavior), channel-level permission policies, policy
  simulation, and team-scoped membership policies in Team Settings
  (abac-channel-access-rules, abac-system-wide-policies,
  attribute-based-access-control)
- User Attributes: separate Display Name/Attribute name fields,
  backfill note, terminology updates
- Content flagging: quarantined message report generation and post
  deletion report documentation
- Autotranslation: translation target language and language-pair
  clarifications
- Generating support packet: sanitize typo fixes, removed stale
  ElasticsearchSettings.ClientKey reference
- Installing license key: Site Statistics -> System Statistics rename
- Team/channel members: SetChannelMembers bulk API note
- Telemetry: removed Rudder/Segment-specific reporting details
  following the telemetry stack migration
- Statistics: Site Statistics -> System Statistics rename
- Health check probes: corrected Go import path example
- mmctl: documented --workers flag for import process, renamed
  Custom Profile Attribute -> User Attribute in cpa command docs
- Logging: removed unused audit log file rotation settings from the
  Cloud defaults note

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-14 11:42:37 +03:00
55055ca2f3 ci: add docs PR preview workflows (#37440)
* ci: add docs PR preview workflows (P10)

Adds preview builds for PRs touching docs/** or api/**, deployed to the
existing mattermost-docs-preview-pulls S3 bucket under a repo-scoped
mattermost/pr-<N>/ prefix so they don't collide with mattermost/docs's
own previews of the same bucket. Fork PRs are handled via a manual
workflow_dispatch since they can't access secrets; previews are cleaned
up automatically on PR close for both same-repo and fork PRs.

* fix: use PR author for docs preview TRIGGERING_ACTOR

pull_request.head.user.login is the owner of the head repo/branch, not
the PR author -- for same-repo PRs (head repo == base repo) this
resolves to the org name instead of the contributor who opened the PR.
pull_request.user.login is always the actual PR author.

* docs: reword docs preview PR comment

* fix: harden docs preview workflows

- docs-preview-fork: add explicit permissions (statuses/pull-requests
  write, contents read) instead of relying on default token scope.
- docs-preview-template: validate PR_NUMBER is digits-only and quote
  the S3 destination before use in the upload step, guarding against
  script injection via the fork dispatch's free-text input.
- docs-preview-template: add a per-PR concurrency group so an older,
  slower build can't overwrite a newer upload.
- docs-preview/docs-preview-fork: replace secrets: inherit with an
  explicit secrets mapping, and declare the secrets contract on the
  reusable template, so only the two AWS preview credentials are
  passed instead of every repo/org secret.

* fix: align docs preview build/permissions with docs-ci, drop 3rd-party comment action

- docs-preview-template: add Set up Go (api/server/go.mod), matching
  docs-ci -- make -C api build shells out to `go run .` for code
  sample extraction and needs a pinned toolchain, not whatever happens
  to be preinstalled on the runner.
- docs-preview-template: drop the explicit "Build OpenAPI spec" step;
  npm run build's prebuild lifecycle script already runs
  make -C api build, so it was running twice.
- docs-preview-template: replace peter-evans/create-or-update-comment
  with plain `gh pr comment`, dropping a third-party action pin;
  behavior is unchanged (posts a new comment every run).
- docs-preview: add explicit permissions (contents: read,
  pull-requests: write) so the reusable workflow's requested
  pull-requests: write isn't silently downgraded by a restrictive
  default token policy.

* fix: use gh pr comment in docs-preview-cleanup, drop 3rd-party action

Same swap already made in docs-preview-template.yml -- gh is
preinstalled on the runner, so this drops another third-party action
pin. Also quotes the S3 URI via env vars for consistency with the
template's upload step.

* fix: replace pull_request_target with pull_request in docs-preview-cleanup

zizmor flags pull_request_target as a dangerous trigger by default.
Switch to plain pull_request, guarded to skip fork PRs (which don't
get secrets on this event) -- fork preview cleanup will be handled by
a separate scheduled sweep instead. Also fixes a stray '=' character
that had crept into the file.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-13 15:54:27 +03:00
b5f007d35e docs: fix broken path links, anchors, and tab rendering from RST-to-MDX migration (#37433)
* docs: resolve cross-file anchor mismatches from RST-to-MDX migration

The Sphinx-to-Docusaurus migration converted `:ref:`/`{ref}` links using
naive text-slugification, so anchors that pointed to headings in a
different file (e.g. release-summary tables linking into their
respective changelog pages) were emitted as same-page fragments and
silently resolved to nothing.

Built a label registry from the original Sphinx `.. _label:` / `(label)=`
targets to recover the true source file for each cross-reference, then
rewrote the affected links to point at the correct file + heading
anchor. Fixes 282 broken cross-file anchors, primarily in the mobile/
desktop/server release-summary pages, plus assorted same-page anchor
mismatches caught by re-auditing after the prior admonition/anchor fix.

* docs: manually resolve remaining anchor mismatches after cross-file audit

Hand-verified fixes for anchors that fuzzy-matching alone couldn't
safely resolve (confirmed against actual heading text/context, and in a
few cases against the original RST source, before applying):

- Typos and dropped words carried over from the original Sphinx docs
  (e.g. "bot-acocunts", "auto-follow-all-new-channel-threads" ->
  "follow-all-new-channel-threads").
- Sphinx auto-generated duplicate-heading IDs (#id1/#id3/#id4) resolved
  to their real target headings.
- Numbered-step TOC links in enterprise-roll-out-checklist.mdx that
  dropped the leading "N. " used in the actual heading slugs.
- Push-notification docs pointing at the wrong file entirely
  (environment-configuration-settings instead of
  push-notification-server-configuration-settings).
- SAML "saml-enterprise" label resolved to its true cross-file target
  (authentication-configuration-settings#saml-2-0), recovered from the
  original RST label definition that the automated registry missed
  because it sat after an RST transition marker.
- sso-saml-technical references converted from broken same-page/
  malformed-path anchors to correct page links.

* docs: fix SAML 2.0 anchor slug (saml-2-0 -> saml-20)

github-slugger strips periods rather than hyphenating them, so "SAML
2.0" slugifies to saml-20, not saml-2-0 as previously fixed.

* docs: fix broken path links found during docs/main migration cleanup

* docs: convert div.tab blocks to Docusaurus Tabs/TabItem components

* docs: restore missing Kubernetes deployment architecture diagrams

The RST-to-MDX migration never copied over the AWS/Azure/Oracle
architecture diagrams referenced by the deployment-architecture-at-scale
page, leaving broken images in each Tabs/TabItem.

* docs: fix 7 anchor mismatches from the fragment/heading audit

Covers three root causes from the anchor mismatch breakdown:
- Fragment repeated the target page's own title instead of a real
  heading, so the link is simplified to point at the bare page.
- Heading exists verbatim but lives on a sibling settings page
  (experimental-configuration-settings, push-notification-server-
  configuration-settings) rather than environment-configuration-settings.
- A page path was mistakenly pasted into a same-page #fragment instead
  of being used as a real cross-page link.

* docs: fix 8 anchor slugs that were close but didn't match the real heading

Repoints links whose fragment was a plausible guess (typo, reworded
heading, or wrong section) at the actual auto-generated slug of the
target heading, confirmed by inspecting each target page directly.

* docs: merge split Tabs blocks so tabs render horizontally

The div.tab conversion script split some sibling tab groups into
separate single-item Tabs blocks whenever a stray blockquote marker
sat between them, causing them to render stacked instead of as one
horizontal tab bar. Merges the MySQL/PostgreSQL and Team/Enterprise
Edition tab groups back into single Tabs blocks.

* docs: remove Azure tab and restore Kubernetes deploy content

The Mattermost Operator, Azure, and Oracle platform tabs on the
Kubernetes deployment guide were split across two separate Tabs
blocks (rendering stacked instead of as one tab bar) and all three
tab bodies were empty because the migration never flattened the
original RST include directives. Removes the unsupported Azure tab
and restores the Mattermost Operator and Oracle content from the
pre-migration RST sources as a single merged Tabs block.

* addresscoderabbitreview

* docs: unify Linux/Kubernetes/Containers deploy pages and fix FIPS/STIG placement

Kubernetes and Containers duplicated full install content across a top-level
page (Tabs) and orphaned sidebar subpages that nothing linked to. Reworked
both to follow the Linux page's pattern: shared content on the landing page,
platform-specific instructions live once in their own subpage.

Also removed configure-fips-at-install-time.mdx, which claimed FIPS is
available for native Linux installs — FIPS/STIG in Mattermost is a container
image property (Chainguard-based build), not available outside Docker/
Kubernetes. Consolidated all FIPS/STIG references onto
containers/fips-stig.mdx and pointed the Mattermost Operator subpage (not
Oracle OKE, which doesn't expose image selection) at it.

* docs: fix review findings — image alt text, Important callout markup, typo

- Replace generic alt="image" on scaling diagrams with descriptive text
  identifying cloud provider and user scale.
- Convert raw div.important markup in deploy-containers.mdx to the
  repo's <Important> component, matching usage elsewhere in the file.
- Fix "Matermost" typo in manage-your-display-options.mdx.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-10 14:50:13 +03:00
Eva SarafianouandGitHub eadce354df Remove internal only pages from develop (#37436) 2026-07-10 14:10:10 +03:00
d4e98673e2 docs: fix broken admonitions and anchors in product-overview changelog pages (#37423)
* docs: fix broken admonitions and anchors in product-overview changelog pages

The Sphinx-to-Docusaurus migration script only converted lowercase
admonition directives (e.g. ```{note}```), so capitalized/indented/
same-line variants (```{Important}```, ```{Attention}```) were left as
literal text, causing whole sections to render as a single broken code
block. Also convert unconverted MyST `.. meta::` blocks and `(label)=`
anchors (as escaped MDX heading ids) so existing cross-reference links
keep resolving.

Affects: v10/v11 server changelogs, server/mobile/desktop releases,
release policy, unsupported legacy releases, mobile/desktop app
changelogs.

* docs: fix under-indented Important callouts in v10 changelog

The <Important>/**Critical Fixes**/</Important> blocks nested under
several release-entry bullets were indented with only 1 space instead
of the 2-space list-item content column used by sibling sub-bullets,
risking the callout breaking out of the list item during rendering.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-09 22:01:40 +03:00
611f31f6c2 docs: fix broken images, cross-links, and layout overflow after docs-experimental migration (#37418)
* docs: restore missing e2e/mobile push-notification images

These developer-docs images existed in mattermost-developer-documentation's
static assets but were never copied into the monorepo during the docs
migration, leaving broken image links in e2e-cheatsheets.md and the mobile
push-notification pages. Also fixes e2e-cheatsheets.md's image paths, which
used Hugo-style relative paths that don't resolve under Docusaurus.

* docs: fix broken outgoing webhooks screenshot path

The image reference used an absolute path left over from the old Hugo
site (/integrate/faq/images/...), which doesn't resolve under Docusaurus
since no matching file exists under site/static. The image already lives
co-located in docs/develop/integrate/faq/images/, so point to it with a
relative path instead.

* docs: delete Azure AKS deployment guide page

The page's screenshots never made it into the monorepo during migration
and don't exist under any known source (docs, docs-experimental, or
mattermost-developer-documentation). Remove the page rather than ship
broken images; drop it from the PDF book manifest and repoint its legacy
redirect to the general Kubernetes deployment guide accordingly.

* docs: fix heading levels on Kubernetes deploy guides

deploy-k8s.mdx and deploy-k8s-oke.mdx used H1 (#) for their top-level
in-page sections (Installation steps, Common Errors, etc.) instead of
H2. Docusaurus' contentTitle extraction grabs the first H1 it finds
anywhere in the doc, which stole the page title slot from the actual
frontmatter title, so no title rendered at the top of the page. The
flat H1/H2 mix also meant TOC entries for install steps rendered as a
flat list at the page's TOC root instead of nested under their section,
which made the TOC sidebar overflow/misrender on narrower/zoomed
viewports. Bump every heading in both files one level (H1->H2->H3->H4)
so the page title renders and the TOC nests correctly.

* docs: fix TOC/layout horizontal overflow on wide code blocks

The Kubernetes prerequisites page's TOC sidebar overflowed off-screen at
higher browser zoom levels. Root cause: `.docMainContainer` has `max-width:
none !important` (intentional, so OpenAPI's 2-column layout gets full
width), but that removes the container's only width ceiling. Combined with
the default flexbox `min-width: auto` on both the main container (in its
outer flex row with the left sidebar) and the doc content column (in the
inner content/TOC row), a sufficiently wide code block's intrinsic
min-content size could drag the whole row wider than the viewport instead
of scrolling within itself. Add `min-width: 0` at both flex levels so
`overflow-x: auto` on code blocks and tables actually contains overflow
locally, and make the responsive table-scroll CSS apply unconditionally
instead of only under the 996px breakpoint (zoom shrinks effective layout
width without re-triggering the media query).

Also shorten the illustrative base64 example values in the AWS Aurora
Postgres secret example, which were long enough on their own to be a
secondary contributor to the same overflow.

* docs: restore additional missing images found via full static-resolution scan

Docusaurus's build-time image validator doesn't reliably warn on every
broken absolute-path reference, so npm run build alone missed these.
A direct scan of every image reference in docs/develop and docs/main
against the filesystem turned up 38 more genuinely missing images
(desktop architecture, VPN/Pritunl setup, docker dev environment,
i18n-extract tooling, MVP program, onboarding, schema migration guide,
plugin best-practices, and interactive-message screenshots) that were
never copied over from mattermost-developer-documentation during
migration. Two references (interactive-dialog-date.png and
interactive-dialog-datetime.png) remain unresolved because no source
image exists anywhere in the legacy repo.

* docs: fix broken cross-links after .md to .mdx migration

Several Calls admin guide pages and the air-gapped quick-start runbook
were renamed from .md to .mdx during migration, but their internal
cross-links still pointed at the old .md filenames (and, for
setup-tls, the old flattened path), so Docusaurus couldn't resolve
them. Found via a full scan of every relative markdown link under
docs/main and docs/develop against the filesystem, since the build's
own "couldn't be resolved" warnings don't reliably surface every
broken link.

* docs: remove broken date/datetime element screenshots

These screenshots were never captured before migration (broken on
the currently live docs.mattermost.com too), and no source image
exists anywhere in the legacy repos to restore. Remove the broken
references rather than leave a dead image link.

* docs: move newly-restored desktop architecture images to static/

These 4 images were restored co-located next to their content files,
matching an existing (if inconsistent) convention elsewhere in
docs/develop. Since these are new additions rather than pre-existing
working references, move them to docs/site/static/ instead of
perpetuating the co-located pattern. Repo-wide normalization of the
other ~70 existing co-located image references is left for a separate
follow-up PR.

* docs: remove deleted AKS page from sidebar generator's manual grouping

master (#37402) fixed the sidebar generator's SRC path but this
branch's deletion of deploy-k8s-aks.mdx still left a dangling
reference in the Deployment Guide's manual Kubernetes grouping,
which fails Docusaurus's sidebar-doc-id validation at build time.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-09 18:13:08 +03:00
0533f3d11d ci: add docs CD workflow (#37421)
* ci: add docs CD workflow (P9)

Builds the Docusaurus site and deploys to S3 on every push to master
touching docs/** or api/**, then invalidates CloudFront. Splits the S3
sync into two passes so content-hashed build assets get long-lived
immutable caching while unhashed HTML stays no-cache for near-instant
propagation.

* ci: remove workflow_dispatch trigger from docs-cd

Deploys should only happen via push to master, not manual trigger.

* ci: typecheck before building docs in CD

docusaurus build strips TypeScript types via babel without validating
them, so a type error could still deploy. docs-ci.yaml typechecks the
same commit, but as an uncoupled parallel workflow it doesn't gate CD —
this catches it if CI fails or a required check is bypassed on master.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-09 15:03:28 +00:00
a09975b95f Migrate docs site: Docusaurus config, Algolia, OpenAPI pipeline, and CI (#37402)
* Align Docusaurus config for monorepo, wire Algolia DocSearch (P6)

Fixes projectName/editUrl/path references left over from the docs-unified
repo split, adds trailingSlash for predictable CloudFront 404 handling, and
wires an Algolia search block into themeConfig that's only included when
credentials are present (Docusaurus's schema rejects an empty appId/apiKey,
so this keeps builds green with or without them). Also fixes the
sidebar/redirect generator scripts, which still pointed at the pre-rename
docs/ directory instead of main/, and adds docs/Makefile,
.env.local.example, and an updated README for local dev.

* Wire OpenAPI generation to api/v4/source and add docs-ci.yaml (P7)

Replaces build-openapi.mjs's custom YAML-merge implementation with a thin
wrapper around the canonical `make -C api build` target, keeping only the
MDX sanitization step (quote/autolink fixes) that docusaurus-plugin-openapi-docs
needs. Adds a "prebuild" npm script so `npm run build` regenerates the spec
automatically, and ignores the generated api/v4/html artifacts (narrow form,
since ssr_template.hbs and static/favicon.ico under that path are committed).

Also adds docs-ci.yaml as a path-scoped PR/master build+typecheck gate for
the docs site, replacing the legacy `docs` repo's Sphinx-based ci.yml now
that docs live in this monorepo.

* Rename OpenAPI prebuild script for clarity

"prebuild" is an npm lifecycle hook name (auto-runs before "npm run build"),
not a descriptive name, so `npm run prebuild` didn't signal it's specifically
about OpenAPI generation. Split it into "build:openapi" (the actual script,
runnable directly and self-explanatory) with "prebuild" now just delegating
to it, preserving the automatic pre-build trigger.

* Regenerate sidebars automatically before dev/build (P7 fixup)

documentation.generated.json and developers.generated.json are gitignored
and nothing produced them on a fresh checkout, so both `npm start` and
`npm run build` failed with MODULE_NOT_FOUND outside a working tree that
happened to have stale copies lying around. Wire the sidebar generators
into `prestart`/`prebuild` so they're always regenerated first.

* Remove docs/site/.env.local.example

There's a single Algolia DocSearch app for docs.mattermost.com; credentials
aren't distributed to individual developers, so a per-dev .env.local
workflow doesn't apply. Credentials are only ever injected in CI/CD via
repository variables. Local builds/dev server run fine without them (the
Algolia block in docusaurus.config.ts is conditional).

* Wire OpenAPI doc generation into prestart/prebuild, drop unused Makefile

docusaurus-plugin-openapi-docs requires a separate `docusaurus gen-api-docs`
CLI step to populate docs/api/reference/ (gitignored) — nothing was
invoking it, so a fresh checkout's npm start/build failed the same way the
sidebar JSONs did. Split build:openapi into build:openapi:spec (slow, runs
make -C api build) and build:openapi:docs (fast, generates MDX from the
existing spec), and wire prestart to reuse an existing spec instead of
rebuilding it every dev-server start.

Also drops docs/Makefile: four of its five targets were pure passthroughs
to npm scripts, unreferenced by CI or anything else, and there's no
repo-wide `make -C <dir>` convention to fit into.

Note: a duplicate-doc-id build failure (operationId `status` in the
Playbooks OpenAPI spec colliding with the main API's `status` tag) is
being fixed separately in mattermost-plugin-playbooks.

* Fix stale docs/ reference in sidebar generator's error message

The existence check still hardcoded "docs/" in its error text after SRC
was repointed to main/. Use the SRC constant in the message so it can't
drift out of sync with the actual path again.

* remove code comment

* Drop unused artifact upload from docs-ci.yaml

Nothing consumes it: P9's docs-cd.yml will rebuild independently on push
to master rather than downloading it via workflow_run (avoids workflow_run
trigger footguns for an infrequent, cheap-enough rebuild), and P10's
preview build always needs its own independent build anyway (bakes a
per-PR BASE_URL). This was carried over from the old docs repo's ci.yml
out of habit; that repo's own PR-time uploads had the same unused-artifact
issue (only cd.yml's post-merge run ever consumed it).

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-09 12:32:39 +03:00
bc56925599 feat(docs): move docs-experimental content into monorepo docs/ (#37330)
* feat(docs): move docs-experimental content into monorepo docs/

* Remove plan related files and comments

* Cleanup comments, remove generated files

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-07-02 18:42:57 +03:00
8e536285d6 Bump golang.org/x/net to v0.56.0 (#37293)
Co-authored-by: Hanzo Dev <[email protected]>
2026-06-30 16:27:13 +03:00
98845b2dc6 Skip docs impact review when Docs/Not Needed label is present (#37109)
* Skip docs impact review when Docs/Not Needed label is present

Add a gate job that checks for the Docs/Not Needed label before running
the Claude analysis, so maintainers can opt out without the workflow
re-adding Docs/Needed on subsequent CI runs.

* Simplify docs/not-needed gate using contains() expression

Replace the dedicated check-docs-not-needed job with a contains() check
on github.event.pull_request.labels in the docs-impact-review job's if:
condition. This avoids spinning up a separate runner and an extra API
call to achieve the same opt-out behavior.

---------

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-19 12:59:59 +03:00
65916db597 Update docs impact review workflow to Claude Sonnet 4.6 (#37071)
Claude Sonnet 4 was retired; use the supported claude-sonnet-4-6 model.

Co-authored-by: Hanzo Dev <[email protected]>
2026-06-16 10:43:52 +00:00
Eva SarafianouandGitHub e59338cdae Fix config-change-checker to use merge-base for per-file diffs (#36670)
Automatic Merge
2026-05-21 10:23:44 +02:00
7229a15d6b ci: disable fullyparallel for unsharded weekly Postgres jobs (#36390)
Restore the `fullyparallel: false` override for the unsharded
`Postgres with binary parameters` and `Postgres FIPS` jobs in the
weekly workflow. The override was originally added to the binary
parameters job in #35995 to prevent resource exhaustion on a single
runner, but was dropped when both jobs moved into
server-ci-weekly.yml in #36036, leaving them on the template default
of `true`.

Without it, the hosted runner is overwhelmed (too many server
instances, WebSocket hubs, and DB connections) and the runner agent
itself loses communication with GitHub mid-run, surfacing as
"hosted runner lost communication with the server" at ~55-60 min
into the Run Tests step. Both runs on April 27 and May 4 failed
this way; the sharded FIPS variant retained for FIPS-touching PRs
in server-ci.yml is unaffected because each shard handles only a
fraction of the packages.

Co-authored-by: Hanzo Dev <[email protected]>
2026-05-04 15:52:35 +03:00
Eva SarafianouandGitHub b40b5fc8b0 update buildserver go base image versions to 1.25.9 (#36348)
Made-with: Cursor
2026-05-01 08:17:34 -04:00
Eva SarafianouGitHubcoderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
375f4d5a1c Update docs-impact workflow to keep stale comment instead of deleting (#35940)
* Update docs-impact workflow to keep stale comment instead of deleting

When a re-run of the docs impact analysis determines that documentation
updates are no longer needed, the previous bot comment was deleted while
the Docs/Needed label was kept. This left the label without context.

Instead of deleting the comment, update it to explain that a previous
analysis had flagged the PR but the latest run found no docs impact.
This preserves the audit trail and gives maintainers context to decide
whether to remove the label.

Made-with: Cursor

* Update .github/workflows/docs-impact-review.yml

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

---------

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
2026-04-07 13:20:03 +03:00
bf6b9feafe MM-68120 - Use repo checkout for build files in server-ci-artifacts (#35842)
* Use repo checkout for Dockerfile in server-ci-artifacts build-docker job

The build-docker job was downloading server-build-artifact to get the
Dockerfile and supporting files for every PR. Switch to checking out
server/build/ directly from the repo for external PRs, while keeping
the artifact-based flow for same-repo PRs so that Dockerfile changes
can be tested before merge.

Only upload server-build-artifact when the PR comes from the same repo,
since external PRs no longer use it.

Made-with: Cursor

* retrigger pipelines

* undo previous commit

---------

Co-authored-by: Mattermost Build <[email protected]>
2026-04-01 14:12:56 +03:00
Eva SarafianouandGitHub 287c80ae58 Fix docs-impact-review workflow to reliably post analysis comments (#35831)
- Skip draft PRs and trigger on ready_for_review to run when
  a draft is marked ready
- Remove use_sticky_comment (broken upstream, see
  anthropics/claude-code-action#1052) and inline review comments
  which caused claude[bot] to appear as a PR reviewer
- Write analysis to a file and post it via github-script as a
  sticky comment from github-actions[bot], avoiding conflicts
  with the Claude Code Review App
- Manage docs/needed label from the file directly

Made-with: Cursor
2026-03-27 19:20:21 +02:00
Eva SarafianouandGitHub f00d10ac1c Allow Cursor bot to trigger docs impact review workflow (#35756)
The claude-code-action blocks bot-initiated workflows by default.
Adding cursor to allowed_bots so PRs opened by Cursor are analyzed.

Made-with: Cursor
2026-03-27 13:07:03 +02:00
71fcf94c5e [MM-67744] Add -buildvcs=false to default GOFLAGS (#35587)
* Add -buildvcs=false to default GOFLAGS

This prevents Go from embedding VCS information into binaries, which
avoids false positives in container vulnerability scanners like Trivy
when using Go workspaces with enterprise dependencies.

Also updates mmctl-build target to use $(GO) and $(GOFLAGS) for
consistency with other build targets.

Made-with: Cursor

* Update comment wording

Trigger PR sync to test Enterprise CI

Made-with: Cursor

* Trigger CI to test Enterprise CI fix

Made-with: Cursor

* Test Enterprise CI

Made-with: Cursor

* replace buildvcs metadata in mmctl

* rm redundant -buildvcs=false in GitHub actions

* update mmctl-docs to $(GO)

* simplify getVersionInfo signature

* use GOOS/GOARCH convention

* export GOFLAGS for common use

* Clarify version.go var block comment

---------

Co-authored-by: Jesse Hallam <[email protected]>
2026-03-20 10:28:36 -03:00
Eva SarafianouandGitHub 0e10b060aa Run docs-impact-review as regular CI instead of slash command (#35620)
* Run docs-impact-review as regular CI instead of slash command

Switch the Documentation Impact Review workflow from a `/docs-review`
slash command trigger to running automatically on pull_request events.
The analysis posts a sticky PR comment and inline comments, and adds a
`docs/needed` label when documentation changes are needed.

Made-with: Cursor

* Address review feedback: harden docs-impact-review workflow

- Remove invalid `direct_prompt` input not recognized by the pinned
  claude-code-action version (auto-detects mode from event type).
- Guard Claude step with secret availability check so fork and
  Dependabot PRs skip gracefully instead of failing.
- Move label management out of the LLM into a deterministic
  github-script step that parses the sticky comment, eliminating
  prompt-injection and excessive-agency risks.

Made-with: Cursor

* Fix secret check: use job-level env var instead of secrets context in step if

The secrets context is not available in step-level if expressions.
Evaluate it as a job-level env var and reference that instead.

Made-with: Cursor

* Use paginated API call to fetch all PR comments

Prevents missing the bot comment on busy PRs with more than 30 comments.

Made-with: Cursor

* Address review: add issues:write permission, remove auto-label-removal

- Upgrade issues permission from read to write (required for addLabels API)
- Remove automatic docs/needed label removal to avoid stripping the label
  prematurely when the analysis comment hasn't been posted yet

Made-with: Cursor
2026-03-19 09:47:36 +02:00
Eva SarafianouandGitHub 27f6d58130 Use standard session handler for updateUserAuth endpoint (#35488)
Change the /api/v4/users/{user_id}/auth endpoint to use
APISessionRequired instead of APISessionRequiredTrustRequester.

This endpoint is a JSON API called via XHR and does not need
the TrustRequester flag which is intended for directly-requested
resources like images and file downloads.

Made-with: Cursor
2026-03-06 08:14:22 +02:00
Eva SarafianouandGitHub 0b5bcc0583 Update filippo.io/edwards25519 (#35422) 2026-02-25 11:27:48 -05:00
Eva SarafianouandGitHub 022f7229b9 Set ProdSec as authN/authZ codeowners (#35263) 2026-02-13 11:53:03 +02:00
Eva SarafianouandGitHub baa1cfb533 Update runtime chainguard image for fips (#34997) 2026-01-20 23:09:51 +02:00
Eva SarafianouandGitHub a2a3cf843c Update golang.org/x/crypto (#34838) 2026-01-05 16:09:22 +02:00
d4e2373a39 Bump ubuntu base image version (#31819)
* Bump ubuntu base image version

* Update to Oct 2025 version

---------

Co-authored-by: Mattermost Build <[email protected]>
2025-11-19 12:02:40 +02:00
86caa528f6 Push Proxy Authentication (#34211)
* Initial Implementation of Push Proxy Authentication

* Include Config Listener for Leader plus delete startup function as job scheduler runs on initialization

* Remove push proxy auth from local imports

* Add push proxy auth to external imports

* Add push proxy auth error messages

* Update error codes

* Fix enterprise dep definition

* make i18n-extract

* Mock System store Get

* m

* m

* m

* m

* Update serverID header

* Add install type env var to docker

* Update Push Proxy config with new options

Global, US, Germany and Japan. Previous configurations will keep working

* use model.SafeDereference

* Delete token when new push proxy URL is empty

* ServerID header only if auth token is available

---------

Co-authored-by: Daniel Schalla <[email protected]>
Co-authored-by: Nick Misasi <[email protected]>
Co-authored-by: Mattermost Build <[email protected]>
2025-11-12 20:16:44 +02:00
Eva SarafianouandGitHub f1595ac468 Use validated redirectTo in error page (#34073) 2025-10-14 17:23:49 +03:00
cd5fcef8e7 [MM-65837], [MM-65824] - Update Dependencies (#33972)
* Update github.com/mholt/archives

* Update github.com/spf13/viper

* make batch migration worker tests less flaky

---------

Co-authored-by: Jesse Hallam <[email protected]>
2025-10-01 20:19:22 +00:00
Eva SarafianouandGitHub 9f3f906735 Update msteams plugin (#33899) 2025-09-16 13:35:26 +03:00
Eva SarafianouandGitHub 8e040eb4d0 import/export directories cloud restricable (#33506) 2025-09-15 15:28:50 +03:00
Eva SarafianouandGitHub c5fab22408 Constant time comparison (#33588) 2025-08-27 14:17:16 +03:00
94a4ab6e54 Fix PostgreSQL SSL connection issue with sslmode=require in distroless images (#33523)
* Copy CA certificates to distroless

* Change home directory

---------

Co-authored-by: Mattermost Build <[email protected]>
2025-07-23 11:01:50 +03:00
Eva SarafianouandGitHub a94b63b7c8 Increase pbkdf2 rounds to OWASP recommendation (#33507) 2025-07-22 10:43:40 +03:00
263e1f8024 Move from ubuntu to distroless image (#31136)
* Move from ubuntu to distroless image

* Update updated ubunty image for first stage

* Update server/build/Dockerfile

Co-authored-by: Daniel Schalla <[email protected]>

* Update server/build/Dockerfile

Co-authored-by: Daniel Schalla <[email protected]>

* Add mising env var for health check

* Add mattermost user in /etc/passwd

* Fix e2e userId

* use cypress in place of server. Wget and not curl

* Simplify e2e changes

---------

Co-authored-by: Daniel Schalla <[email protected]>
2025-06-03 20:52:13 +03:00
71a4cbaded Move to library archives (#31100)
* Move to library archives

* wrap the error with %w

Co-authored-by: Jesse Hallam <[email protected]>

* remove redundant format

---------

Co-authored-by: Jesse Hallam <[email protected]>
2025-06-02 09:21:37 +03:00
eb6e977ccc Update golang toolchain to 1.23.9 (#31062)
* Update golang toolchain

* remove comment

---------

Co-authored-by: Mattermost Build <[email protected]>
2025-05-19 16:56:06 +03:00
Eva SarafianouandGitHub 5caadf0929 feat: Switch from Redoc to Stoplight Elements for API documentation (#30591) 2025-04-17 12:31:56 +03:00
Eva SarafianouandGitHub 49e021c084 bump prepackaged msteams version (#30344) 2025-02-27 10:06:17 +02:00
0676580617 Clarify patch role permissions (#30128)
Co-authored-by: Ben Schumacher <[email protected]>
Co-authored-by: Mattermost Build <[email protected]>
2025-02-21 17:08:58 +02:00
Eva SarafianouandGitHub 7bbf27cd97 Remove gobom files (#27140) 2024-06-11 19:15:24 +03:00
Eva SarafianouandGitHub 846a46207e Merge pull request #22713 from mattermost/codeql_monorepo
[SEC-3469] Update codeql config for monorepo
2023-03-29 14:45:24 +02:00
Eva Sarafianou 938d1513e8 Update codeql config for monorepo 2023-03-29 12:55:00 +02:00