Thank you for contributing! This guide explains how to submit dashboards, card presets, and themes to the community marketplace.
- Fork this repository
- Add your content (dashboard, card preset, or theme)
- Add an entry to
registry.json - Open a pull request
- Open KubeStellar Console
- Navigate to the dashboard you want to share
- Click the floating action button (bottom-right)
- Click Export — a JSON file will download
- Create a new directory under
dashboards/with a kebab-case name:dashboards/my-awesome-dashboard/dashboard.json - (Optional, but strongly recommended) Add a PNG screenshot as
screenshot.png(recommended: 1200x630). Screenshots are not required by CI, but they help reviewers confirm what the dashboard should look like before they import it.
Add an entry to registry.json:
{
"id": "my-awesome-dashboard",
"name": "My Awesome Dashboard",
"description": "A brief description of what this dashboard shows.",
"author": "your-github-username",
"version": "1.0.0",
"downloadUrl": "https://raw.githubusercontent.com/kubestellar/console-marketplace/main/dashboards/my-awesome-dashboard/dashboard.json",
"tags": ["monitoring", "production"],
"cardCount": 6,
"type": "dashboard"
}Before opening a PR, validate that your registry.json change is well-formed and that the entry fields line up with the file you added:
python3 -m json.tool registry.json > /dev/null
python3 scripts/validate-marketplace.py --mode staticCard presets add a single card to the user's current dashboard.
Create a file under card-presets/:
{
"format": "kc-card-preset-v1",
"card_type": "pod_issues",
"title": "Pod Health Monitor",
"config": {}
}The card_type must be one of the 153 available types — see Available Card Types in the README.
{
"id": "pod-health-monitor",
"name": "Pod Health Monitor",
"description": "Card showing pods with issues like CrashLoopBackOff and OOMKilled.",
"author": "your-github-username",
"version": "1.0.0",
"downloadUrl": "https://raw.githubusercontent.com/kubestellar/console-marketplace/main/card-presets/pod-health-monitor.json",
"tags": ["monitoring", "pods"],
"cardCount": 1,
"type": "card-preset"
}Themes change the entire look and feel of the console.
Create a file under themes/. Your theme must follow the Console Theme interface. See themes/midnight-blue.json for a complete example.
Key fields:
id: Unique kebab-case identifiername: Display namedark:truefor dark themes,falsefor lightcolors: All color tokens (HSL for core, hex for brand/status/chart)font: Font family and weight definitions
Include themeColors for the preview dots shown in the marketplace:
{
"id": "my-theme",
"name": "My Theme",
"description": "A custom theme with warm tones.",
"author": "your-github-username",
"version": "1.0.0",
"downloadUrl": "https://raw.githubusercontent.com/kubestellar/console-marketplace/main/themes/my-theme.json",
"tags": ["dark", "warm"],
"cardCount": 0,
"type": "theme",
"themeColors": ["#f59e0b", "#f97316", "#ef4444", "#10b981", "#06b6d4"]
}Marketplace contributions are config-only, but you should still validate them before opening a PR.
- Python 3 (Python 3.6+ recommended) — the marketplace validator uses only standard library modules, no pip dependencies required
- Git
- A local checkout of
kubestellar/consolefor--mode cross-repo, local Marketplace UI testing, and TypeScript unit tests - Node.js 22.x when working with the Console checkout (matches the current Console dev/CI environment)
Keeping the Console and Marketplace repos next to each other makes the validator paths, local UI testing, and TypeScript unit test commands below easier to follow:
cd ..
git clone https://github.com/kubestellar/console.git console
# console-marketplace should already be checked out beside it
cd console
cd web && npm install && cd ..
# Start a local Console for end-to-end Marketplace testing
./start-dev.sh
# or, if you want GitHub OAuth plus Vite HMR:
./startup-oauth.sh --devThe local Console uses backend http://localhost:8080, frontend http://localhost:5174, and kc-agent http://localhost:8585. Wait for the Console to finish starting before you begin the integration checks below.
From the repository root:
python3 -m json.tool registry.json > /dev/null
python3 scripts/validate-marketplace.py --mode static
python3 scripts/validate-marketplace.py --mode cross-repo --console-path /path/to/consoleImportant: The CI Marketplace Quality Gate workflow runs validate-marketplace.py --mode static on every PR. Running it locally before you push will catch issues early and prevent surprising CI failures.
What these checks catch:
python3 -m json.tool: malformed JSON--mode static: registry consistency, naming, dashboard grid/shape checks, required fields (matches CI behavior)--mode cross-repo: everything instatic, plus validation that referencedcard_typevalues exist in a localkubestellar/consolecheckout
If you only changed one file, you can also validate it directly:
python3 -m json.tool dashboards/<id>/dashboard.json > /dev/null
python3 -m json.tool card-presets/<id>.json > /dev/null
python3 -m json.tool themes/<id>.json > /dev/nullValidate the exported file before wiring it into registry.json:
python3 -m json.tool dashboards/<id>/dashboard.json > /dev/null
python3 - <<'PY'
import json
with open('dashboards/<id>/dashboard.json') as f:
data = json.load(f)
assert data['format'] == 'kc-dashboard-v1'
assert isinstance(data.get('cards'), list) and data['cards']
for card in data['cards']:
assert card.get('card_type')
assert isinstance(card.get('position'), dict)
print('dashboard.json looks valid')
PYA dashboard card_type is valid only when it matches a real Console card ID in snake_case. The authoritative list is in README.md#available-card-types-153, and the safest verification is the cross-repo validator:
python3 scripts/validate-marketplace.py --mode cross-repo --console-path /path/to/consoleMake sure the preset uses kc-card-preset-v1 and references a real Console card type:
python3 -m json.tool card-presets/<id>.json > /dev/null
python3 scripts/validate-marketplace.py --mode cross-repo --console-path /path/to/consoleIf you already have a local Console running, you can test the preset without publishing it by pasting this into the browser DevTools console on a dashboard page:
window.dispatchEvent(new CustomEvent('kc-add-card-from-marketplace', {
detail: await (await fetch('http://localhost:8000/card-presets/<id>.json')).json()
}))Validate the JSON, then preview it in a local Console by loading it into custom theme storage:
const theme = await (await fetch('http://localhost:8000/themes/<id>.json')).json()
localStorage.setItem('kc-custom-themes', JSON.stringify([theme]))
window.dispatchEvent(new Event('kc-custom-themes-changed'))After that, open Settings → Theme and select your theme.
Use a local checkout of kubestellar/console for end-to-end verification.
- Serve this repository locally:
python3 -m http.server 8000
- If you have not prepared the Console checkout yet, follow the setup steps in Recommended sibling checkouts for cross-repo work, then wait for the Console to come up at
http://localhost:8080. - The Console marketplace currently fetches the registry from a hard-coded URL in
web/src/hooks/useMarketplace/demoData.ts; there is no runtime env var/dev flag for overriding it yet. - In your Console checkout, temporarily point
REGISTRY_URLat your local server by editingweb/src/hooks/useMarketplace/demoData.ts:const REGISTRY_URL = 'http://localhost:8000/registry.json'
- Reload the Console, open Marketplace, and install your dashboard, card preset, or theme.
- For dashboards, also test the same JSON through the normal dashboard import flow in the running Console (floating action button → Import) and verify the layout and cards render correctly.
- When you are done testing, revert the temporary override before you commit anything in the Console repo:
cd /path/to/console git restore web/src/hooks/useMarketplace/demoData.ts git status --short
If you want to keep the override around for a later test session without risking an accidental Console commit, stash just that file:
cd /path/to/console
git stash push -m "local marketplace registry override" -- web/src/hooks/useMarketplace/demoData.tsYou can also test a dashboard import directly against a running local Console:
await fetch('/api/dashboards/import', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(await (await fetch('http://localhost:8000/dashboards/<id>/dashboard.json')).json())
})PRs that touch web/src/** (plus vitest.marketplace.config.ts or .github/workflows/ts-unit-tests.yml) run the TypeScript Unit Tests workflow. Those tests reuse shared Vitest/Vite config and npm dependencies from kubestellar/console, so you need a local Console checkout even though the tests live in this repo.
The CI workflow uses a sparse Console checkout; for local work, a normal sibling checkout is simpler. If you followed the layout above, this is the local equivalent of CI:
# one-time shared dependency install in the Console checkout
cd ../console/web
npm ci
# one-time symlink so Marketplace tests resolve shared deps from the Console checkout
cd ../..
ln -sfn "$(pwd)/console/web/node_modules" console-marketplace/web/node_modules
# run Marketplace TypeScript unit tests
cd console/web
npx vitest run \
--config ../../console-marketplace/vitest.marketplace.config.ts \
--dir ../../console-marketplace/webMarketplace TypeScript unit tests live under web/src/** (including web/src/**/__tests__/**). Re-run the command above whenever you change marketplace TypeScript source or tests there.
Before submitting, verify the following in a running Console:
- Dashboards: imports successfully, card layout is preserved, cards render without errors
- Card presets: install into an existing dashboard, title/config are applied, card renders without errors
- Themes: colors are readable in the sidebar, dashboard cards, Marketplace tiles, and Settings page
- Themes: capture screenshots of the key surfaces you changed (at minimum: dashboard view, Marketplace, and Settings → Theme)
- Themes: if your theme is light, confirm text contrast on light backgrounds; if dark, confirm contrast on dark cards and panels
PRs that touch registry.json, dashboards/**, presets/**, card-presets/**, themes/**, or scripts/** trigger CI validation.
Current checks include:
- Validate JSON (
.github/workflows/validate-json.yml) - Marketplace Quality Gate (
.github/workflows/marketplace-quality.yml) - PR Verifier (
.github/workflows/pr-verifier.yml)
Run the local validation commands above before you open the PR so CI findings are limited to genuine review issues.
- Descriptive name: Choose a clear name
- Good description: 1-2 sentences explaining what it does and who it's for
- Relevant tags: Use existing tags when possible
- Tested: Make sure your content works when installed into a fresh console
| Tag | Use for |
|---|---|
sre |
Site reliability / operations |
security |
Security monitoring and auditing |
compliance |
Compliance and governance |
monitoring |
General observability |
production |
Production focused |
development |
Dev/staging focused |
gitops |
GitOps and pipelines |
networking |
Network monitoring |
storage |
Storage and PV monitoring |
cost |
Cost management |
gpu |
GPU and ML workloads |
helm |
Helm release management |
rbac |
Access control |
dark |
Dark themes |
warm |
Warm color palette themes |
minimal |
Clean, minimal design |
- Start at
1.0.0 - Patch: layout tweaks, typo fixes
- Minor: new cards, significant changes
- Major: complete redesigns
Use this format:
Add <name> dashboardAdd <name> card presetAdd <name> theme
This project follows the KubeStellar Code of Conduct.
- Open an issue
- Join the KubeStellar community