The user-friction intelligence layer that complements Sentry.
Sentry sees what your code throws. Mushi sees what your users feel.
Quick start · Live admin demo · Docs · Self-hosting · Architecture
↑ a logged-in 4-stop walk through the Plan → Do → Check loop · static deep-dive hero below · click to open the live admin
↑ a real bug, end-to-end · the admin is dark-only by design
Your existing monitoring is excellent at one thing: what your code threw. It cannot see:
These are user-felt bugs. They never trigger an alert. Users just leave.
Mushi Mushi is the missing layer. Drop a small SDK into your app — users press shake-to-report (or click a widget) and Mushi auto-captures screenshot, console, network, device, route, and intent. An LLM-native pipeline (Haiku fast-filter → Sonnet vision + RAG → judge → optional agentic auto-fix) classifies, deduplicates, and turns the friction into actionable bug intelligence — wired into Sentry, Slack, Jira, Linear, and PagerDuty.
| Scenario | Sentry / Datadog | Mushi Mushi |
|---|---|---|
| Unhandled exception | ✅ | ✅ |
| Button doesn't respond | — | ✅ |
| Page loads in 12 s, no error | — | ✅ |
| User can't find the settings panel | — | ✅ |
| Layout breaks on iPad Safari | — | ✅ |
| Form submits but data doesn't save | ~ | ✅ |
| Feature regressed since last deploy | ~ | ✅ |
Designed as a companion to your existing monitoring, not a replacement. Reports stream through to Sentry breadcrumbs and link back to the offending session.
A walk through the rooms inside. Click any panel to land on it in the live demo.
Quickstart mode · 3 pages, verb-led labels, no PDCA jargon. The default for first-time visitors — pill-toggle up to Beginner (9 pages) or Advanced (all pages) anytime. |
First-run tour · custom 5-stop spotlight tour, no |
Plug-n-play onboarding · opens with a Plan→Do→Check→Act storyboard so you see the loop before the checklist. Required steps drive the green progress bar; optional steps stay tagged. |
Sticky run receipts · every Run / Generate / Dispatch button leaves a persistent |
Dashboard (Advanced) · one living number per stage, bottleneck ring, Next-Best-Action strip, 14d severity-stacked histogram, LLM tokens & calls sparklines, Repo link right under Fixes. |
Reports · triage queue + Btn parity — 4 px severity stripe, 14d severity KPIs with sparklines, blast-radius dedup, Save view preset, single primary action per row. |
Fixes · pipeline + stagger — per-attempt PDCA cards, 30d KPI sparklines, Langfuse trace per run, real PR links, retry-failed CTA. Cards cascade-fade in via |
Judge · Decide/Act/Verify hero over the charts. Live KPIs, 12w score trend, distribution histogram, prompt leaderboard, one-click re-run with a sticky |
Repo · one branch per auto-fix attempt, grouped by CI status. Live event stream via Supabase Realtime on |
Intelligence · the 3-tile hero pattern in action — Decide surfaces the one-liner that matters, Act collapses to "All clear" when there's nothing to do, Verify deeplinks to the evidence. Every advanced page follows this shape. |
Health · real |
Prompt Lab · replaces Fine-Tuning. A/B traffic split between active and candidate prompts per stage, eval dataset preview, synthetic report generator, fine-tuning jobs queue. |
Knowledge graph · auto-switches to Sankey storyboard under 12 nodes; full React Flow canvas above. Apache AGE backed when installed, falls back to plain SQL adjacency otherwise. |
Compliance · SOC 2 control evidence pack with PASS / WARN pills and inline JSON, region pinning per project, print-styled Export PDF, DSAR workflow tracking. |
Marketplace · toggleable extension layer for the loop. Each plugin declares the events it subscribes to and ships with HMAC-signed webhooks; deliveries are logged with HTTP status + first 512 chars of the response. |
Action inbox · open actions across the PDCA loop, grouped by stage with one yellow CTA per group ( |
Anti-gaming · per-device fingerprint tracker that throttles bad-faith reporters and surfaces multi-account abuse ( |
Processing queue (DLQ) · |
Ask Your Data · ad-hoc natural-language SQL over the bug data — read-only Postgres, pre-canned chip prompts ( |
Research · pin QA + product findings here so the next loop iteration starts smarter. Pre-seeded chip topics ( |
MCP — Model Context Protocol · per-project |
Integrations · |
Reporter notifications · outbound messages sent to the people who reported each bug (e.g. |
Workspace settings · 5 tabs (General · BYOK · Firecrawl · Health & test · Dev tools) covering Slack webhook, Sentry DSN, Stage-2 model picker, Stage-1 confidence threshold, dedup similarity threshold — every knob the LLM pipeline reads at runtime, with a |
SSO config · SAML 2.0 + OIDC form, calls the Supabase Auth Admin API on submit, surfaces the resulting ACS URL + Entity ID below for you to paste into your IdP. JIT provisioning on first login is the default. OIDC intentionally returns 501 — see Honest status. |
Audit log · append-only history of every mutation, filterable by actor / action / resource / time. Each row pairs a |
BYO storage · per-project bucket form (Supabase / S3 / R2), region pinning, presigned-URL TTL editor, vault-ref'd access keys (never plaintext). Per-project usage table at the top so you spot a project burning through storage before the bill arrives. |
Multi-project workspace · per-project cards with active-key count, reports count, member count, plus inline CTAs to mint a fresh key, send a test report, or open project-scoped Integrations / Settings. The active project drives the project filter on every other page. |
Billing · plan comparison (Hobby Free / Starter $19 / Pro $99 / Enterprise), per-plan reports/month + overage cents/report + retention days + admin seats, Stripe-metered LLM $ per day below the fold, |
Report detail · 4-stamp PDCA receipt + live Branch & PR timeline — every step of the dispatch lifecycle from |
response_format, prompt-cached system instructions, deterministic JSON.validateResult gating + GitHub PR creation. Sandbox provider abstraction (local-noop for tests, e2b / modal / cloudflare for prod, all four wired through resolveSandboxProvider). True MCP client adapter (JSON-RPC 2.0 + SEP-1686 Tasks) so Claude Code, Codex, Cursor, or any future agent plugs in.fix_coordinations table) so reviewers see the full surface.npx mushi-mushi
The wizard auto-detects your framework (Next.js / Nuxt / SvelteKit / Angular / Expo / Capacitor / plain React, Vue, Svelte / vanilla JS), installs the right SDK with your package manager, writes MUSHI_PROJECT_ID and MUSHI_API_KEY to .env.local (with the right framework prefix), and prints the snippet to paste in. Equivalent commands:
npm create mushi-mushi # via the npm-create convention
npx @mushi-mushi/cli init # if you prefer the scoped name
Skip the wizard and install directly if you already know which SDK you want:
npm install @mushi-mushi/react # also covers Next.js
import { MushiProvider } from '@mushi-mushi/react'
function App() {
return (
<MushiProvider config={{ projectId: 'proj_xxx', apiKey: 'mushi_xxx' }}>
<YourApp />
</MushiProvider>
)
}
That's it. Users now have a shake-to-report widget. Reports land in your admin console, classified within seconds.
import { MushiPlugin } from '@mushi-mushi/vue'
app.use(MushiPlugin, { projectId: 'proj_xxx', apiKey: 'mushi_xxx' })
import { Mushi } from '@mushi-mushi/web'
Mushi.init({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })
import { initMushi } from '@mushi-mushi/svelte'
initMushi({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })
import { Mushi } from '@mushi-mushi/web'
Mushi.init({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })
import { provideMushi } from '@mushi-mushi/angular'
bootstrapApplication(AppComponent, {
providers: [provideMushi({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })],
})
import { MushiProvider } from '@mushi-mushi/react-native'
<MushiProvider projectId="proj_xxx" apiKey="mushi_xxx">
<App />
</MushiProvider>
import { Mushi } from '@mushi-mushi/web'
Mushi.init({ projectId: 'proj_xxx', apiKey: 'mushi_xxx' })
.package(url: "https://github.com/kensaurus/mushi-mushi.git", from: "0.1.0")
import Mushi
Mushi.configure(projectId: "proj_xxx", apiKey: "mushi_xxx")
dependencies {
implementation("dev.mushimushi:mushi-android:0.1.0")
}
Mushi.init(context = this, config = MushiConfig(projectId = "proj_xxx", apiKey = "mushi_xxx"))
Want a runnable example? Check
examples/react-demo— a minimal Vite + React app with test buttons for dead clicks, thrown errors, failed API calls, and console errors.
Published: SDKs at 0.2.x (all seven frameworks + node + adapters + capacitor), CLI + launcher at 0.4.x, MCP + MCP-CI at 0.1.x, admin at kensaur.us/mushi-mushi/ (auto-deployed to S3 + CloudFront on every push to master).
Dogfood: end-to-end loop validated on a real production webapp. Report → LLM triage → "Dispatch fix" → draft GitHub PR → live in /fixes → live branch graph in /repo with per-event Supabase Realtime stream. Sentry, Langfuse, and GitHub all probe Healthy from the Integrations page, with a nightly Playwright dogfood against the production stack catching regressions before they reach users.
This month's highlights 🐛
apps/admin/src/components/PageHero.tsx./repo page — one node per branch the auto-fix agent has opened, grouped by CI status (open / passing / failing / merged / stuck), with a live event stream on the right via Supabase Realtime on the new fix_events table. Each branch shows its own mini PDCA graph (Plan → Dispatch → Branch → Commit → PR → CI → Merge) so you can see the loop progress without leaving the page.useDocumentTitle keeps document.title in sync with the active page via the shared pageContext registry (Reports · 60 reports · 2 critical — Mushi Mushi) and useFaviconBadge paints a red dot on the favicon whenever criticalCount > 0, so operators see urgency from any other browser tab. Both are data-layer driven — zero per-page wiring..github/workflows/nightly-prod-pdca.yml runs the full Playwright dogfood suite against the production Supabase stack every night (07:00 UTC) and auto-opens a GitHub issue if the pipeline regresses. Catches stale env keys, expired tokens, cron disables, and LLM provider outages that the local-stack PR e2e can't see. Flip ENABLE_NIGHTLY_PROD_PDCA to true to enable.⌘K (macOS) or Ctrl+K (Linux/Windows) anywhere to jump to any page, filtered view, or real report / fix by name. cmdk-backed, keyword aliases (bugs → Reports, pr → Fixes, spam → Anti-Gaming), debounced live API search, recents persist per browser (page actions excluded from the recents list so navigation recents don't get evicted).Setup → Bugs to fix → Fixes ready) for humans who'd rather not know what PDCA stands for. Pill-toggle up to Beginner (9 pages) or Advanced (full console) anytime. Advanced mode groups pages under the four PDCA stages with staleness badges and per-page "next best action" strips.react-joyride dep, inherits dark theme tokens.ResponsiveTable primitive with edge-fade scroll shadows, opt-in sticky first column, and a global comfy / compact density toggle that persists per browser. Reports, Judge leaderboards, and Compliance evidence / DSAR tables already use it.window.confirm/prompt retired in favour of focus-trapped <ConfirmDialog> / <PromptDialog> with proper tone="danger" for destructive actions.apiFetch dedups in-flight requests + keeps a 200 ms micro-cache. The old 24× storm on /v1/admin/setup is now 1 request.logLlmInvocation now swallows its own promise-rejection so void callers on the hot request path can't crash the isolate.Triage + Dispatch fix buttons wired to a signed slack-interactions Edge Function. The loop starts and ends in Slack.pnpm install auto-installs a .git/hooks/pre-commit that chains zero-dependency guards: check-no-secrets.mjs (AWS / Stripe / Slack / GitHub / OpenAI / Anthropic / JWT leak scanner), check-design-tokens.mjs (retired-Tailwind-aliases that render transparently), check-mcp-catalog-sync.mjs (MCP catalog ↔ admin mirror parity), check-dead-buttons.mjs (<button disabled> without aria-label / tooltip), check-publish-readiness.mjs, and check-license-headers.mjs. Bypass once with git commit --no-verify, skip install with MUSHI_SKIP_GIT_HOOKS=1.| Phase | Theme | Status |
|---|---|---|
| A | Capture, fast-filter, deep classification, dedup | ✅ |
| B | Knowledge graph, NL queries, weekly intelligence | ✅ |
| C | Vision air-gap, RAG codebase indexer, fix dispatch | ✅ |
| D | Marketplace, Cloud + Stripe, multi-repo fixes, hardened LLM I/O | ✅ |
| E–H | PDCA full-sweep, pipeline self-heal, SAML SSO, integrations CRUD, Sentry hardening | ✅ |
| I | Real unique_users blast radius, StatusStepper, PdcaReceiptStrip, NN/G-compliant EmptyState |
✅ |
| J | Real LLM cost — llm_invocations.cost_usd, Billing LLM $X.XX chip, Prompt Lab Avg $ / eval |
✅ |
| K | Admin polish — first-action gating, layout-shaped skeletons, ResultChip, microinteractions |
✅ |
| L | Beginner/Advanced mode toggle, Next-Best-Action strip, unified 4-stage PDCA, post-QA fixes | ✅ |
| M–Q | 23-page audit + fix-spec sweep — Quickstart mode, first-run tour, themed dialogs, N+1 dedup | ✅ |
| R | 7-axis security + perf audit (2026-04-21) — internal-only middleware, expanded PII scrubber, 20 FK indexes, Zod runtime validation, vendor chunks, secrets scanner · docs/audit-summary-2026-04-21.md |
✅ |
| S | IA rewrite (2026-04-22/23) — Decide/Act/Verify hero on every advanced page, /repo live branch graph + fix_events stream, dynamic tab titles, favicon critical-badge, nightly-prod-PDCA workflow, resilient embeddings sweep |
✅ |
Handover docs (most recent first) live under docs/ — they're the long-form companion to each row above.
| Area | Working | Still partial |
|---|---|---|
| Classification | Haiku fast-filter, Sonnet deep, vision air-gap closed + contract-tested, structured outputs, prompt-cached prompts, pg_cron self-healing every 5 min |
Stage 2 response streaming (Wave S5) — see below |
| Judge / self-improve | Sonnet judge with OpenAI fallback wired, prompt A/B auto-promotion loop (judge → prompt_versions.avg_judge_score → promoteCandidate) |
Fine-tune vendor promotion: finetune_runs schema exists, the submit-to-OpenAI/Anthropic worker is a stub. Prompt A/B promotion is the shipping mechanism today. |
| Fix orchestrator | Single-repo validateResult gating, GitHub PR creation, MCP JSON-RPC 2.0 client, multi-repo data model + coordinator worker (fans out per-repo fix attempts, aggregates per-repo pass/fail) |
First-party Claude Code / Codex adapters still wait on vendor APIs. |
| Sandbox | Provider abstraction; local-noop (tests) + e2b / modal / cloudflare (prod-ready, deny-by-default egress, audit-event stream) |
— |
| Verify | Screenshot diff via Playwright + pixelmatch; @mushi-mushi/verify step interpreter feature-complete — navigate, click, type, press, select, assertText, waitFor, observe. |
— |
| Enterprise | Plugin marketplace + HMAC, audit ingest, region pinning, retention CRUD, Stripe metering + /billing UI + invoice list, SAML SSO via Supabase Auth Admin API (ACS / Entity ID surfaced for IdP setup), routing-destination CRUD with masked secrets |
OIDC SSO intentionally returns 501 Not Implemented — Supabase GoTrue does not yet expose the admin endpoints we'd need. The admin UI exposes the config form so the settings round-trip is tested, but the endpoint is gated. Track Supabase changelog for GoTrue OIDC admin support. |
| Graph backend | Plain SQL adjacency over graph_nodes / graph_edges ships in every deployment. |
Apache AGE is a hosted-tier enhancement: when the AGE extension is installed (self-hosted Postgres 16 or Supabase Enterprise tier) we route graph queries through AGE for >10× traversal speedup. Supabase's managed tier does not ship AGE, so cloud deployments stay on SQL adjacency. |
| Streaming | Fix-dispatch SSE (CVE-2026-29085-safe sanitization) | Classification reasoning still arrives whole. Stage 2 streamObject conversion lands in Wave S5. |
The orchestrator refuses to run local-noop in production unless you explicitly set MUSHI_ALLOW_LOCAL_SANDBOX=1. Pick e2b (or implement the SandboxProvider interface yourself) before exposing autofix to production traffic.
flowchart LR
subgraph App["Your app"]
SDK["@mushi-mushi/{react,vue,svelte,angular,react-native,web}<br/>Shadow-DOM widget · screenshot · console · network · offline queue"]
end
subgraph Edge["Supabase Edge Functions (Deno + Hono)"]
API["api"]
FF["fast-filter<br/>Haiku"]
CR["classify-report<br/>Sonnet + vision + RAG"]
JB["judge-batch<br/>Sonnet (OpenAI fallback)"]
IR["intelligence-report"]
ORCH["fix-dispatch<br/>SSE"]
end
subgraph DB["Postgres + pgvector"]
REP["reports"]
KG["knowledge graph"]
EVAL["judge_evals"]
FIX["fix_attempts<br/>+ coordinations"]
end
subgraph Agents["@mushi-mushi/agents"]
MO["MCP client (JSON-RPC 2.0)"]
SBX["Sandbox: local-noop / e2b"]
GH["GitHub PR creator"]
end
SDK -->|HTTPS| API
API --> FF --> CR
CR --> KG
CR --> REP
KG --> IR
REP --> JB --> EVAL
REP --> ORCH --> Agents
Agents --> GH
See apps/docs/content/concepts/architecture.mdx for the full pipeline.
Most developers only install one SDK package —
npx mushi-mushipicks the right one for you and pulls incoreandwebautomatically.
| Install | Framework | What you get |
|---|---|---|
npx mushi-mushi |
Any (auto-detects) | One-command wizard — installs the right SDK, writes env vars, prints the snippet |
npm i @mushi-mushi/react |
React / Next.js | <MushiProvider>, useMushi(), <MushiErrorBoundary> — drop-in for any React app |
npm i @mushi-mushi/vue |
Vue 3 / Nuxt | MushiPlugin, useMushi() composable, error handler (pair with web for the widget UI) |
npm i @mushi-mushi/svelte |
Svelte / SvelteKit | initMushi(), SvelteKit error hook (pair with web for the widget UI) |
npm i @mushi-mushi/angular |
Angular 17+ | provideMushi(), MushiService, error handler (pair with web for the widget UI) |
npm i @mushi-mushi/react-native |
React Native / Expo | Shake-to-report, bottom-sheet widget, navigation capture, offline queue |
npm i @mushi-mushi/capacitor |
Capacitor / Ionic | iOS + Android via Capacitor — shake-to-report, screenshot, offline queue |
npm i @mushi-mushi/web |
Vanilla / any framework | Framework-agnostic SDK — Shadow-DOM widget, screenshot, console + network capture |
npm i @mushi-mushi/node |
Node (Express/Fastify/Hono) | Server-side SDK — error-handler middleware, uncaughtException hook, W3C trace context |
npm i @mushi-mushi/adapters |
Any Node webhook server | Translate Datadog / New Relic / Honeycomb / Grafana alerts into Mushi reports |
| Package | Purpose |
|---|---|
@mushi-mushi/core |
Shared engine — types, API client, PII scrubber, offline queue, rate limiter, structured logger. Auto-installed. |
@mushi-mushi/cli |
CLI for project setup, report listing, triage. npm i -g @mushi-mushi/cli |
@mushi-mushi/mcp |
MCP server — lets Cursor / Copilot / Claude read, triage, classify, dispatch fixes, and run NL queries |
@mushi-mushi/mcp-ci |
GitHub Action that calls the MCP tools from CI — gate PR merges on classification coverage, dispatch fixes on label |
@mushi-mushi/plugin-sdk |
Build third-party plugins — signed webhook verification, REST callback client, framework adapters |
@mushi-mushi/plugin-jira |
Bidirectional Mushi ↔ Jira Cloud sync (OAuth 3LO, status transitions, fix comments) |
@mushi-mushi/plugin-slack-app |
First-class Slack app — /mushi slash command, signing-secret verification, App Manifest |
@mushi-mushi/plugin-linear |
Reference plugin — create + sync Linear issues from Mushi reports |
packages/ios |
Native iOS SDK (Swift Package Manager) — early dev |
packages/android |
Native Android SDK (Maven dev.mushimushi:mushi-android) — early dev |
| Package | Purpose |
|---|---|
@mushi-mushi/server |
Edge functions — classification pipeline, knowledge graph, fix dispatch + SSE, RAG indexer, vision air-gap, judge with OpenAI fallback, plugin runtime |
@mushi-mushi/agents |
Agentic fix orchestrator — validateResult gating, GitHub PR creation, sandbox abstraction, MCP JSON-RPC 2.0 client, multi-repo coordinator |
@mushi-mushi/verify |
Playwright fix verification — screenshot visual diff + feature-complete step interpreter (navigate, click, type, press, select, assertText, waitFor, observe). Attach step arrays at call-time via verifyFix({ steps }) and correlate runs to an attempt with verifyFix({ fixAttemptId }) — the verifier replays, diffs, writes fix_verifications, and mirrors the result into fix_attempts.verify_steps so the judge can answer "did attempt X verify?" without a timestamp join. |
projectId and apiKeycd deploy
cp .env.example .env # ANTHROPIC_API_KEY, Supabase creds
docker compose up -d
Or via Supabase CLI directly — see SELF_HOSTED.md. A Helm chart lives at deploy/helm/ (incomplete — missing migrations ConfigMap).
Internal edge functions (
fast-filter,classify-report,fix-worker,judge-batch,intelligence-report,usage-aggregator,soc2-evidence,generate-synthetic) authenticate via the sharedrequireServiceRoleAuthmiddleware, which accepts eitherMUSHI_INTERNAL_CALLER_SECRET(used bypg_cron→pg_net, mirrored intopublic.mushi_runtime_config.service_role_key) or the auto-injectedSUPABASE_SERVICE_ROLE_KEY(used for function-to-function calls). Never expose them with--no-verify-jwtin production. Only the publicapifunction should face the internet. Seepackages/server/README.md.
The hosted instance reports to two Sentry projects under the sakuramoto org:
| Project | What it covers | DSN source |
|---|---|---|
mushi-mushi-admin |
Admin console: unhandled errors, React error boundaries, perf traces (10 % sample), errors-only Session Replay (replaysOnErrorSampleRate: 1.0, masked text + media) |
VITE_SENTRY_DSN baked into the build |
mushi-mushi-server |
All eight edge functions: unhandled exceptions + every log.error()/log.fatal() forwarded via _shared/sentry.ts |
SENTRY_DSN_SERVER Supabase secret |
Privacy & safety:
sendDefaultPii: false on both — no IPs, cookies, or request bodies attached automatically.beforeSend. Authorization, Cookie, *-api-key headers redacted server-side.@sentry/vite-plugin during pnpm build and deleted from dist/ before the S3 sync — the public bucket never serves them.mushi_*, sntryu_*, JWTs starting with eyJ, ghp_*, npm_*) on top of SDK-side redaction.For SDK consumers and forks: the published packages do not initialize Sentry. The bridge at
packages/web/src/sentry.tsonly reads context from your existing Sentry instance — it never sends data on its own. Self-hosted forks can leave the DSNs unset and the SDKs no-op cleanly.
The hosted product wires three feedback loops so the operator hears from paying customers fast:
| Channel | Trigger | Where it shows up |
|---|---|---|
| Stripe webhooks → operator push | checkout.session.completed, invoice.payment_failed, customer.subscription.deleted, cancel_at_period_end → true, invoice.payment_succeeded (recovery only) |
Slack and/or Discord via OPERATOR_SLACK_WEBHOOK_URL / OPERATOR_DISCORD_WEBHOOK_URL |
| Stripe Dashboard email digests | Same events natively, plus dispute / refund flows | The Stripe Dashboard email recipient list (configured in the Dashboard UI) |
| In-app support inbox | Paid (or free) customer submits the BillingPage "Need help?" form | support_tickets table + operator push + audit log + reply to SUPPORT_EMAIL |
How each piece works:
packages/server/supabase/functions/_shared/operator-notify.ts): a single helper that knows how to render Slack Block Kit and Discord rich embeds. Severity drives colour; urgent pings @here on Discord. Failures are captured to Sentry but never block the webhook from 200-ing back to Stripe./v1/support/contact): JWT-gated, rate-limited to 5 tickets/hour/user, captures plan tier at submit time so paid tickets jump the queue. Customer sees status updates inline on /billing. PII (passwords, API keys) explicitly called out as off-limits in the form copy.SUPPORT_EMAIL env var, defaults to [email protected]): used in the Checkout custom_text, the BillingPage "Need help?" mailto, and the rate-limit error message.To enable the operator push for a self-hosted instance:
# 1. Create a Slack incoming webhook (api.slack.com/messaging/webhooks)
# OR a Discord channel webhook (server settings → integrations → webhooks).
# 2. Push the secret to Supabase:
supabase secrets set OPERATOR_SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...
# or
supabase secrets set OPERATOR_DISCORD_WEBHOOK_URL=https://discord.com/api/webhooks/...
# 3. Optionally override the support address (defaults to [email protected]):
supabase secrets set [email protected]
# 4. Redeploy the api + stripe-webhooks functions:
supabase functions deploy api stripe-webhooks
git clone https://github.com/kensaurus/mushi-mushi.git
cd mushi-mushi
pnpm install
pnpm build
Requires Node.js ≥ 22 and pnpm ≥ 10.
| Command | |
|---|---|
pnpm dev |
Run all dev servers (admin on :6464, docs, cloud) |
pnpm build |
Build all packages |
pnpm test |
Vitest |
pnpm typecheck |
TypeScript checks |
pnpm lint |
Lint |
pnpm format |
Prettier |
pnpm changeset |
Create a changeset |
pnpm release |
Build + publish to npm |
pnpm check:secrets |
Scan the whole tree for leaked AWS / Stripe / Slack / GitHub / OpenAI / Anthropic / Supabase / JWT tokens. Also runs staged-only on every commit via the auto-installed pre-commit hook. |
pnpm check:design-tokens |
Flag Tailwind classes in apps/admin/ that reference retired aliases (success* / error* / surface-subtle) or typo against real --color-* namespaces defined in apps/admin/src/index.css. Catches the "invisible transparent element" bug class at commit time. |
pnpm check:catalog-sync |
Verify packages/mcp/src/catalog.ts and its admin mirror apps/admin/src/lib/mcpCatalog.ts haven't drifted. |
pnpm check:publish-readiness |
Assert every publishable package.json has name, version, license, engines.node >=20, repository.directory, files (incl. README + LICENSE), and exports/main or bin. Runs in CI and the release workflow before changeset publish. |
pnpm check:license-headers |
Assert every package's license field matches its folder's canonical license (BSL for server / agents / verify, MIT for the rest) and that a matching LICENSE file exists. |
pnpm check:dead-buttons |
Grep apps/admin/**/*.tsx for <button disabled> / disabled={true} with no aria-label or tooltip — catches "button exists but does nothing" regressions at commit time. |
pnpm size |
Run size-limit against the built @mushi-mushi/web bundle (15 KB gzipped budget). |
pnpm e2e |
Run the full-PDCA Playwright dogfood suite in examples/e2e-dogfood/. Assumes Supabase + admin + the dogfood app are already running locally — see the workspace README for setup. |
cd apps/admin
pnpm dev # → http://localhost:6464 — auto-connects to Mushi Cloud
To self-host with your own Supabase project, copy apps/admin/.env.example and fill in your URL + anon key.
cp .env.example .env # Supabase + LLM provider keys
cd packages/server/supabase
npx supabase db push
npx supabase functions deploy api --no-verify-jwt
packages/
core, web, react, vue, svelte, angular, # Web / framework SDKs (MIT)
react-native, capacitor, node, adapters
ios, android, flutter # Native SDKs (early dev)
cli, mcp, mcp-ci, launcher, create-mushi-mushi # Tooling + CI gate
server, agents, verify # Backend (BSL 1.1)
plugin-sdk, plugin-jira, plugin-slack-app, # Plugin marketplace
plugin-linear, plugin-pagerduty, plugin-zapier, plugin-sentry
wasm-classifier # On-device pre-classifier (ONNX)
apps/
admin # React 19 + Tailwind 4 + Vite 8 (dark-only by design, 24 pages)
docs # Nextra v4 documentation site
cloud # Next.js 15 marketing landing + Stripe billing
examples/
react-demo, e2e-dogfood
deploy/ # Docker Compose + Helm chart
tooling/ # Shared ESLint + TypeScript configs
scripts/ # Zero-dependency pre-commit + CI guards (secrets / tokens / dead-buttons / changelog aggregate / …)
Issues and PRs welcome. To get started: pnpm install && pnpm dev. See individual package READMEs for package-specific setup, and the latest handovers (newest first) under docs/ — HANDOVER-2026-04-21-console-elevate.md is the current state of play; Wave S (Decide/Act/Verify hero, /repo page, dynamic titles, favicon badge, nightly prod PDCA) lands on top of it via subsequent PRs.