Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

ResQ Docs

MintlifyLiveLicensei18n

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails. Built with Mintlify, MDX, OpenAPI, and a cross-repo auto-doc pipeline that pulls API references from five SDK source repos.

This repository is two things at once:

  1. A Mintlify docs site — hand-written prose, OpenAPI references, design assets, all five locales.
  2. An auto-doc orchestrator — workflow templates that live here, deploy to each SDK repo, and open PRs back here whenever a release tag fires.
flowchart LR
subgraph SDK Repos
NPM["resq-software/npm<br/>15 TS packages"]
PYPI["resq-software/pypi<br/>2 Python packages"]
DOTNET["resq-software/dotnet-sdk<br/>6 .NET projects"]
CRATES["resq-software/crates<br/>Rust workspace"]
VCPKG["resq-software/vcpkg<br/>1 C++ package"]
end
subgraph "This repo · resq-software/docs"
direction TB
TPL["automation/<br/>source-repo-templates/"]
SPLICE["scripts/<br/>splice-sdk-nav.py"]
CLGEN["scripts/build_changelog.py<br/>+ automation/changelog-notes.md"]
MDX["index.mdx · sdks/*.mdx<br/>quickstart · auth · errors"]
OPENAPI["specs/*.json"]
CHANGELOG["changelog.mdx"]
DOCSJSON["docs.json (nav)"]
end
PROD[("docs.resq.software<br/>(Mintlify CDN)")]
TPL -- sync-templates.sh --> NPM
TPL -- sync-templates.sh --> PYPI
TPL -- sync-templates.sh --> DOTNET
TPL -- sync-templates.sh --> CRATES
TPL -- sync-templates.sh --> VCPKG
NPM -. tag push .-> AUTOPR["auto/<lang>-api-* PR"]
PYPI -. tag push .-> AUTOPR
DOTNET -. tag push .-> AUTOPR
CRATES -. tag push .-> AUTOPR
VCPKG -. tag push .-> AUTOPR
NPM & PYPI & DOTNET & CRATES & VCPKG -. releases .-> CLGEN
CLGEN -- "changelog sync<br/>(weekly)" --> CHANGELOG
AUTOPR -- merge --> DOCSJSON
MDX --> PROD
OPENAPI --> PROD
CHANGELOG --> PROD
DOCSJSON --> PROD
Loading

Repository layout

PathWhat lives here
index.mdx, quickstart.mdx, authentication.mdx, errors.mdx, concepts.mdxHand-written entry-point pages
sdks/<lang>.mdxOne landing page per SDK (TS, Python, Rust, .NET, C++)
sdks/<lang>/api/Auto-generated SDK API references — do not edit by hand
api-reference/OpenAPI-driven REST API reference pages
specs/*.jsonOpenAPI 3.x specs for ResQ services
automation/source-repo-templates/Canonical workflow YAML for each SDK pipeline
automation/sync-templates.shPushes the canonical templates into every SDK repo
scripts/splice-sdk-nav.pyLocal helper to rebuild docs.json's SDK nav from _pages.json artifacts
scripts/build_changelog.pyRegenerates changelog.mdx version tables from published SDK releases
scripts/i18n_parity.pyLocale parity check (missing + structurally short translations)
changelog.mdxSDK release changelog — the version tables are generated
automation/changelog-notes.mdHand-written editorial notes spliced into the changelog, keyed by month
.i18n-exemptPages excused from the locale parity check (one path per line)
docs.jsonMintlify navigation, theming, redirects, locale config
assets/, og-banner.png, og-backdrop.pngBranding
pwa/, manifest.webmanifest, custom.cssPWA + theme overrides
es/, zh/, ar/, hi/Translated mirrors (kept in lock-step with the English root)

Local development

Prerequisites: Node.js v19+ (Mintlify's mint CLI requires it).

# Install the Mintlify CLI
npm i -g mint
# Clone and enter
git clone https://github.com/resq-software/docs.git
cd docs
# Start the local preview
mint dev # default port 3000# or pin a port if 3000 is busy:
mint dev --port 3334

Open the printed URL. Hot-reload picks up edits to .mdx, docs.json, and any synced markdown under sdks/<lang>/api/.

Validate locally before pushing:

mint broken-links # flags any nav-registered page or in-content link that 404s

Auto-doc pipeline

The five SDK source repos each carry a copy of the workflow at automation/source-repo-templates/api-docs.<lang>.yml. That workflow:

  1. Triggers on tag push (e.g. @resq-systems/ui@v0.38.0, v1.3.4, @resq-systems/*@v*) or manual workflow_dispatch. The npm packages publish under the @resq-systems scope (renamed from the retired @resq-sw scope in July 2026).

  2. Generates language-native markdown:

    RepoLangTooling
    resq-software/npmTypeScriptTypeDoc + typedoc-plugin-markdown (per-package)
    resq-software/pypiPythonpydoc-markdown (per-submodule)
    resq-software/dotnet-sdkC# / .NETDefaultDocumentation
    resq-software/cratesRustcargo-doc-md (rustdoc JSON → markdown) for libs; README stub for binaries
    resq-software/vcpkgC++Doxygen → moxygen
  3. Post-processes the output uniformly: rename README.mdindex.md, prefix bare relative links with ./, strip .md extensions from link targets, escape MDX-unsafe characters ({ }, <), inject a version banner from package metadata, build a hierarchical _pages.json index.

  4. Splices the new pages into the matching language sub-group inside docs.json's "Generated Package References" group.

  5. Opens an auto-PR against this repo on a auto/<lang>-api-<ref> branch with add-paths: sdks/<lang>/api/** + docs.json.

  6. A maintainer reviews + merges. Mintlify rebuilds.

Updating a template

Templates here are the source of truth. After editing, sync to every SDK repo with:

automation/sync-templates.sh # all five
automation/sync-templates.sh --dry-run # preview diffs only
automation/sync-templates.sh python # one language
automation/sync-templates.sh --auto-merge # open PRs with --auto

Adding a new SDK

  1. Drop automation/source-repo-templates/api-docs.<lang>.yml (use an existing one as a starting point).
  2. Add a new entry to the TARGETS table in automation/sync-templates.sh with the source repo and default branch.
  3. Add a new lang_specs entry to scripts/splice-sdk-nav.py so local re-splices include it.
  4. Create sdks/<lang>.mdx (the landing page) and add it to the Languages group in docs.json.
  5. Run automation/sync-templates.sh <lang> once after the source repo accepts the workflow.

The first workflow run will create the language sub-group under "Generated Package References" automatically; subsequent runs just rewrite it.

Writing prose

Pages are .mdx with YAML frontmatter:

---title: 'Your Page Title'description: 'One-line description shown in search and cards'---
Full MDX. Use Mintlify's built-ins (`<Card>`, `<Tabs>`, `<CodeGroup>`, `<Note>`, `<Warning>`),
mermaid code fences, or import a custom component.

Add a new page by creating the .mdx file, then adding its path (no extension) to the appropriate group in docs.json's navigation.tabs[*].groups[*].pages.

OpenAPI reference pages point to a spec:

---title: My Service APIopenapi: ../specs/my-service.json---

Drop new specs in specs/ and reference them the same way.

MDX gotchas

Symbol in proseWhy it breaksFix
{ or }MDX parses as JSX expressionWrap in backticks: `{`
<X> (X starts with letter)Parses as JSX component referenceWrap in backticks: `<X>`
< followed by digit / = / spaceAcorn errors before nameSame — backtick or &lt;
< / > in prose (e.g. Foo<Bar>)Reads as a JSX tagBacktick, or &lt; / &gt;
[label](file.md)Mintlify routes .md literally → 404Drop extension: [label](file)

The auto-doc post-processors handle these for generated content; you only need to remember them for hand-written prose.

Internationalization

Translated mirrors live in es/, zh/, ar/, hi/. Each carries the same path structure as English. The locale parity CI check reports every English page that has no counterpart in a locale, and every counterpart that is structurally short — fewer code blocks, headings, or components than the English page. A file that exists but dropped its examples is a gap too, and the check names it.

Run it locally before opening a PR:

python3 scripts/i18n_parity.py --root .

Prose length is not compared; translations legitimately vary in length. Code examples do not.

When you add an English page, either:

  • Translate it into all four other locales before merging, or
  • Add the path to .i18n-exempt with the reason as an inline comment.

.i18n-exempt takes one repo-relative path per line; # starts a comment. Exempt pages are listed separately in the report instead of counting as gaps:

changelog.mdx # append-only release log; every entry would need 4 translations forever

Exempt a page only when translating it is genuinely impractical. A page that is merely untranslated yet should stay in the gap list so it keeps showing up.

SDK changelog

changelog.mdx is partly generated. Only the region between the CHANGELOG:AUTOGEN markers is overwritten; the intro above the first marker is hand-maintained and preserved. The version tables in that region come from scripts/build_changelog.py, which reads published GitHub releases across the five SDK repos. Do not hand-edit inside the markers.

Editorial prose lives in automation/changelog-notes.md, keyed by ## YYYY-MM. Add a section only when a release deserves narrative; the generator splices it above that month's tables. Note bodies must not use ## headings (they would collide with the per-ecosystem table headings).

python3 scripts/build_changelog.py # rewrite the autogen region
python3 scripts/build_changelog.py --check # exit 1 if out of date

The changelog sync workflow runs the generator weekly and on demand, opening a PR whenever a new release changes the tables. Because the generator is deterministic, a run with no new releases produces no diff and no PR.

Validation

CheckCommandWhen
Mintlify build (broken links, frontmatter)mint broken-linksBefore every push
OpenAPI lintruns in CI via spectralOn every PR
PWA manifestruns in CIOn every PR
Locale parityruns in CIOn every PR
CodeQL (actions, python)runs in CIOn every PR

Deployment

Push to main — the Mintlify GitHub App detects the push, builds, and deploys to the production CDN. No manual step required.

Troubleshooting

ProblemFix
Preview won't startDelete ~/.mintlify cache and re-run mint dev
sharp module errorsEnsure Node v19+ and reinstall the CLI
mint broken-links fails on .md link targetsRe-run the matching language's Strip .md extension post-process step (or just regenerate via the SDK workflow)
Auto-PR has empty content but pull-request-operation = none in the run logThe diff fell outside the workflow's add-paths. Check that the new files land under sdks/<lang>/api/**
Mintlify warns "file does not exist" for a registered pageThe splice probably stripped /index from a path whose file isn't at dir/index.md. Either rename the file or fix the splice's strip rules
sync-templates.sh reports "up-to-date" but no template exists in the targetCheck that the target repo's default branch matches the branch hardcoded in TARGETS (npm uses master, others use main)

Contributing

  1. Fork and branch: docs/your-topic
  2. mint dev to preview locally
  3. mint broken-links to validate
  4. Open a PR — describe what changed and why it changed

Active voice. Short sentences. If documenting an API, verify the endpoint behavior against the running service first.

See AGENTS.md for project-specific instructions when collaborating with AI agents on this repo, and CONTRIBUTING.md for the longer style guide.

License

Copyright 2026 ResQ. Licensed under the Apache License, Version 2.0.

About

Official documentation for ResQ Tactical OS — the decentralized kinetic operating system for autonomous disaster response. Mesh-networked coordination when infrastructure fails.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

1 watching

Forks

Used by

Contributors

Languages

Generated from mintlify/starter