diff --git a/.gitignore b/.gitignore
index cc39fcee5..f915aeedb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,3 +19,4 @@ release
.dev.vars.*
cloudflare/composio-broker/worker-configuration.d.ts
.claude/worktrees/
+.vercel/
diff --git a/apps/docs/.gitignore b/apps/docs/.gitignore
new file mode 100644
index 000000000..b7b57197a
--- /dev/null
+++ b/apps/docs/.gitignore
@@ -0,0 +1,17 @@
+/node_modules
+/.source
+/coverage
+/.next
+/.open-next
+/out
+/build
+/public/app-icon.svg
+/public/screenshots
+*.tsbuildinfo
+.DS_Store
+*.pem
+.env*.local
+.vercel
+next-env.d.ts
+cloudflare-env.d.ts
+.env*
diff --git a/apps/docs/.oxlintrc.json b/apps/docs/.oxlintrc.json
new file mode 100644
index 000000000..07401af05
--- /dev/null
+++ b/apps/docs/.oxlintrc.json
@@ -0,0 +1,4 @@
+{
+ "$schema": "../../node_modules/oxlint/configuration_schema.json",
+ "ignorePatterns": [".next/**", ".open-next/**", ".source/**"]
+}
diff --git a/apps/docs/AGENTS.md b/apps/docs/AGENTS.md
new file mode 100644
index 000000000..643577dfa
--- /dev/null
+++ b/apps/docs/AGENTS.md
@@ -0,0 +1,9 @@
+
+
+# This is NOT the Next.js you know
+
+This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
+
+This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
+
+
diff --git a/apps/docs/CLAUDE.md b/apps/docs/CLAUDE.md
new file mode 100644
index 000000000..43c994c2d
--- /dev/null
+++ b/apps/docs/CLAUDE.md
@@ -0,0 +1 @@
+@AGENTS.md
diff --git a/apps/docs/README.md b/apps/docs/README.md
new file mode 100644
index 000000000..339afc28f
--- /dev/null
+++ b/apps/docs/README.md
@@ -0,0 +1,36 @@
+# OpenMausBot documentation
+
+The public documentation site is a Next.js 16 + Fumadocs app. User-facing content lives in `content/docs`; the repository's top-level `docs` folder remains available for implementation notes and detailed platform records.
+
+## Develop
+
+From the repository root:
+
+```bash
+pnpm install
+pnpm docs:dev
+```
+
+The site opens at `http://localhost:3000`.
+
+## Verify
+
+```bash
+pnpm docs:build
+pnpm --filter @openmausbot/docs types:check
+pnpm --filter @openmausbot/docs lint
+```
+
+## Deploy to Vercel
+
+This is a fully static site. Deploying it does not deploy the Electron app, local harness, credentials, agents, or user data.
+
+Create a second Vercel project beside the existing `openmausbot.com` project:
+
+1. Import the `milind-soni/OpenMausBot` repository.
+2. Set **Root Directory** to `apps/docs`.
+3. Keep the detected **Next.js** framework settings.
+4. Set the production branch to `main` and deploy.
+5. Add `docs.openmausbot.com` under **Settings → Domains**.
+
+Vercel will build the static `out` directory, publish every push to `main`, and create preview URLs for documentation pull requests. Keep `openmausbot.com` on the existing marketing project and add a Docs link there after the new domain is live.
diff --git a/apps/docs/app/api/search/route.ts b/apps/docs/app/api/search/route.ts
new file mode 100644
index 000000000..3393da6fb
--- /dev/null
+++ b/apps/docs/app/api/search/route.ts
@@ -0,0 +1,8 @@
+import { source } from '@/lib/source';
+import { createFromSource } from 'fumadocs-core/search/server';
+
+export const revalidate = false;
+
+export const { staticGET: GET } = createFromSource(source, {
+ language: 'english',
+});
diff --git a/apps/docs/app/docs/[[...slug]]/page.tsx b/apps/docs/app/docs/[[...slug]]/page.tsx
new file mode 100644
index 000000000..d3200e048
--- /dev/null
+++ b/apps/docs/app/docs/[[...slug]]/page.tsx
@@ -0,0 +1,56 @@
+import { getPageImageUrl, getPageMarkdownUrl, source } from '@/lib/source';
+import {
+ DocsBody,
+ DocsDescription,
+ DocsPage,
+ DocsTitle,
+ MarkdownCopyButton,
+ ViewOptionsPopover,
+} from 'fumadocs-ui/layouts/docs/page';
+import { notFound } from 'next/navigation';
+import { getMDXComponents } from '@/components/mdx';
+import type { Metadata } from 'next';
+import { createRelativeLink } from 'fumadocs-ui/mdx';
+import { gitConfig } from '@/lib/shared';
+
+export default async function Page(props: PageProps<'/docs/[[...slug]]'>) {
+ const params = await props.params;
+ const page = source.getPage(params.slug);
+ if (!page) notFound();
+
+ const MDX = page.data.body;
+ const markdownUrl = getPageMarkdownUrl(page).url;
+
+ return (
+
+ {page.data.title}
+ {page.data.description}
+
+ {caption ? {caption} : null}
+
+ );
+}
diff --git a/apps/docs/components/provider.tsx b/apps/docs/components/provider.tsx
new file mode 100644
index 000000000..6e2dfc5c9
--- /dev/null
+++ b/apps/docs/components/provider.tsx
@@ -0,0 +1,9 @@
+'use client';
+
+import SearchDialog from '@/components/search';
+import { RootProvider } from 'fumadocs-ui/provider/next';
+import type { ReactNode } from 'react';
+
+export function Provider({ children }: { children: ReactNode }) {
+ return {children};
+}
diff --git a/apps/docs/components/search.tsx b/apps/docs/components/search.tsx
new file mode 100644
index 000000000..29531f5de
--- /dev/null
+++ b/apps/docs/components/search.tsx
@@ -0,0 +1,37 @@
+'use client';
+
+import {
+ SearchDialog,
+ SearchDialogClose,
+ SearchDialogContent,
+ SearchDialogHeader,
+ SearchDialogIcon,
+ SearchDialogInput,
+ SearchDialogList,
+ SearchDialogOverlay,
+ type SharedProps,
+} from 'fumadocs-ui/components/dialog/search';
+import { useDocsSearch } from 'fumadocs-core/search/client';
+import { staticClient } from 'fumadocs-core/search/client/orama-static';
+import { useI18n } from 'fumadocs-ui/contexts/i18n';
+
+export default function DefaultSearchDialog(props: SharedProps) {
+ const { locale } = useI18n();
+ const { search, setSearch, query } = useDocsSearch({
+ client: staticClient({ locale }),
+ });
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
diff --git a/apps/docs/content/docs/changelog/index.mdx b/apps/docs/content/docs/changelog/index.mdx
new file mode 100644
index 000000000..90a3ffda5
--- /dev/null
+++ b/apps/docs/content/docs/changelog/index.mdx
@@ -0,0 +1,51 @@
+---
+title: Changelog
+description: Highlights from recent OpenMausBot desktop releases.
+icon: Clock
+---
+
+The changelog tracks published desktop builds. Changes merged into `main` after a release are not listed as shipped until a new build is published.
+
+## 0.1.27 — August 20, 2026
+
+- Added the Cursor Agent CLI engine with ACP model discovery.
+- Added pasted screenshot attachments and labeled sidebar sections.
+- Repaired the macOS update restart path and made browser join links resilient to popup blocking.
+- Added approval audit records, credential hardening, pinned messages, more reactions, room timeouts, and temporary computer takeover.
+- Adopted Apache License 2.0.
+
+[Full 0.1.27 release notes](https://github.com/milind-soni/openmausbot-releases/releases/tag/v0.1.27)
+
+## 0.1.25 — August 20, 2026
+
+- Added a signed and notarized Intel macOS build.
+- Shipped the first Ubuntu 24.04 x64 `.deb` and AppImage beta packages.
+- Added four themes, spoiler text, safer additive team import, and several approval and model-routing fixes.
+
+[Full 0.1.25 release notes](https://github.com/milind-soni/openmausbot-releases/releases/tag/v0.1.25)
+
+## 0.1.24 — August 19, 2026
+
+- Added the native iOS companion and USB Android control.
+- Added readable bot memory, working folders, cost tracking, message search, and a raw event inspector.
+- Added Bring Your Own VPS computers and major harness reliability fixes.
+
+[Full 0.1.24 release notes](https://github.com/milind-soni/openmausbot-releases/releases/tag/v0.1.24)
+
+## 0.1.23 — August 17, 2026
+
+- Fixed the Composio OAuth completion flow.
+- Added clear updater states, a new app icon, and correct delegated-turn terminal status.
+
+[Full 0.1.23 release notes](https://github.com/milind-soni/openmausbot-releases/releases/tag/v0.1.23)
+
+## 0.1.22 — August 17, 2026
+
+- Replaced the legacy two-key connector setup with one validated Composio project key.
+- Moved connector lifecycle to Composio Sessions and added true upstream revocation.
+
+[Full 0.1.22 release notes](https://github.com/milind-soni/openmausbot-releases/releases/tag/v0.1.22)
+
+
+ Browse checksums, installers, and older notes in the [OpenMausBot releases repository](https://github.com/milind-soni/openmausbot-releases/releases).
+
diff --git a/apps/docs/content/docs/changelog/meta.json b/apps/docs/content/docs/changelog/meta.json
new file mode 100644
index 000000000..e73d9f2a5
--- /dev/null
+++ b/apps/docs/content/docs/changelog/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Changelog",
+ "icon": "Clock",
+ "pages": ["index"]
+}
diff --git a/apps/docs/content/docs/computers/cloud-and-vps.mdx b/apps/docs/content/docs/computers/cloud-and-vps.mdx
new file mode 100644
index 000000000..7d5df28d2
--- /dev/null
+++ b/apps/docs/content/docs/computers/cloud-and-vps.mdx
@@ -0,0 +1,26 @@
+---
+title: Cloud computer and your own VPS
+description: Choose a managed Box desktop or a hardened container on a Linux server you own.
+icon: Cloud
+---
+
+## Box cloud computer
+
+Add a Box API key in App Settings to provision an isolated hosted Linux desktop. The computer can sleep and wake, and supported sessions provide a live viewer for temporary human control.
+
+Box is a third-party paid service after its trial. OpenMausBot stores the configured credential locally and does not expose it to the renderer.
+
+## Bring your own VPS
+
+OpenMausBot can control Docker on an x86_64 Linux server through an SSH config alias. The agent process stays on your local machine; only Docker commands and the managed desktop container run on the VPS.
+
+Your SSH alias should include connection multiplexing, keepalives, and a connect timeout. Connect manually once to approve the host key, then verify:
+
+```bash
+ssh my-vps true
+docker -H ssh://my-vps info
+```
+
+The SSH user needs Docker access, which is root-equivalent on that server. Use a dedicated VPS and firewall inbound traffic to SSH only.
+
+The managed container publishes no ports, has no host mounts, and is checked before every attach. Its filesystem should be treated as disposable; move important results out before deleting or upgrading the container.
diff --git a/apps/docs/content/docs/computers/index.mdx b/apps/docs/content/docs/computers/index.mdx
new file mode 100644
index 000000000..e181de00a
--- /dev/null
+++ b/apps/docs/content/docs/computers/index.mdx
@@ -0,0 +1,28 @@
+---
+title: Give a bot a computer
+description: Choose the right desktop or isolated environment for a task.
+icon: Monitor
+---
+
+A bot can work without a computer, use the computer running OpenMausBot, or work inside an isolated desktop.
+
+
+
+| Backend | Isolation | Best for |
+|---|---|---|
+| This computer | None | Working with local apps and files you explicitly approve |
+| Local VM | Containerized desktop | Repeatable browser and desktop work on your machine |
+| Box cloud computer | Hosted remote desktop | Always-available isolated Linux work |
+| Self-hosted VPS | Hardened container over SSH | Using infrastructure you own |
+
+## Auto, local, and cloud selection
+
+Computer selection is explicit per bot. Auto may reuse a ready, verified backend, but it does not silently provision every backend or turn on host control.
+
+## Preview and takeover
+
+The Computer panel can show live frames while an agent works. Supported cloud desktops also provide an interactive viewer. OpenMausBot opens that viewer in the app when possible, with a browser fallback for external join flows.
+
+
+ Starting a screen preview does not grant the bot control. Local input requires a separate opt-in and remains subject to the computer-use safety boundary.
+
diff --git a/apps/docs/content/docs/computers/local-computer.mdx b/apps/docs/content/docs/computers/local-computer.mdx
new file mode 100644
index 000000000..8cb062d62
--- /dev/null
+++ b/apps/docs/content/docs/computers/local-computer.mdx
@@ -0,0 +1,22 @@
+---
+title: This computer
+description: Let a supported agent control the local desktop through the bundled CUA boundary.
+icon: MousePointer2
+---
+
+Local control is off by default. The Electron main process owns the bundled CUA driver lifecycle so operating-system permissions are attributed to OpenMausBot rather than a background helper.
+
+## macOS
+
+The packaged app can request Accessibility and Screen Recording permission. After granting either permission, restart the control session when prompted so macOS applies the new grant.
+
+## Ubuntu
+
+Ubuntu 24.04 GNOME local control is beta. Packaged builds include a pinned CUA runtime. Xorg is supported with explicit opt-in; guarded Wayland support also requires its validated GNOME helper and health checks.
+
+## Safety model
+
+- Enabling local control globally does not assign it to a bot.
+- Choose **This computer** for each bot that should receive the capability.
+- Risky actions still surface through the approval flow.
+- Missing permissions, unexpected binaries, unsupported desktop sessions, and failed health checks fail closed.
diff --git a/apps/docs/content/docs/computers/local-vm.mdx b/apps/docs/content/docs/computers/local-vm.mdx
new file mode 100644
index 000000000..1be2194c8
--- /dev/null
+++ b/apps/docs/content/docs/computers/local-vm.mdx
@@ -0,0 +1,21 @@
+---
+title: Local VM
+description: Run desktop work inside an isolated Docker or Podman environment.
+icon: Box
+---
+
+The Local VM gives each bot a containerized Linux desktop on the same machine as OpenMausBot. It is useful for browser work, downloads, and repeatable automation that should not run directly on your host desktop.
+
+## Requirements
+
+- Docker Desktop, Docker Engine, or a supported Podman setup
+- Enough local memory and disk for the desktop image
+- A healthy container runtime available to the OpenMausBot process
+
+## Persistence
+
+The bot's workspace and browser profile live in a durable mounted directory. Recreating the desktop can repair stale runtime state without deleting the durable workspace.
+
+## Ownership and reuse
+
+Local VM ownership uses a renewable lease. OpenMausBot validates the resolved image and container safety contract before reuse instead of trusting only a mutable image tag.
diff --git a/apps/docs/content/docs/computers/meta.json b/apps/docs/content/docs/computers/meta.json
new file mode 100644
index 000000000..3e0b36eaa
--- /dev/null
+++ b/apps/docs/content/docs/computers/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Computers",
+ "icon": "Monitor",
+ "pages": ["index", "local-computer", "local-vm", "cloud-and-vps"]
+}
diff --git a/apps/docs/content/docs/connected-apps/index.mdx b/apps/docs/content/docs/connected-apps/index.mdx
new file mode 100644
index 000000000..60942d1ab
--- /dev/null
+++ b/apps/docs/content/docs/connected-apps/index.mdx
@@ -0,0 +1,37 @@
+---
+title: Connected apps
+description: Give bots secure, user-authorized tools for Gmail, GitHub, Slack, Notion, and hundreds more.
+icon: PlugZap
+---
+
+Open **Connected apps** from the sidebar, choose a service, and complete its authorization in your normal browser. OpenMausBot turns the resulting connection into tools that supported agent engines can use.
+
+
+
+## Official packaged app
+
+The signed desktop app registers its own installation with OpenMausBot's managed connected-apps service. You do **not** need to find or paste a Composio key.
+
+1. Open **Connected apps**.
+2. Search for Gmail, GitHub, Slack, Notion, or another toolkit.
+3. Select **Connect**.
+4. Finish OAuth in the browser window that opens.
+5. Return to the app and ask a bot to use the service.
+
+The installation identity is stored using Electron's operating-system-backed secure storage. Provider OAuth tokens remain with Composio and are not written into bot prompts or the renderer.
+
+## Self-hosted or source builds
+
+The managed service is a convenience for official packaged builds. A source build can use your own Composio project and `COMPOSIO_API_KEY`; see [Self-hosted Composio](./self-hosted-composio.mdx).
+
+## Multiple accounts
+
+Connect more than one account for the same toolkit and give each a clear alias such as `work`, `personal`, or `client-acme`. When several accounts could perform an action, OpenMausBot requires explicit selection instead of silently replacing the first connection.
+
+## Disconnecting
+
+Disconnecting an account revokes the upstream grant. It does not only hide the account in the local UI. Other accounts for the same toolkit remain connected.
+
+
+ Current official builds provision connected apps automatically. A Composio project key is only needed when you deliberately run the integration yourself.
+
diff --git a/apps/docs/content/docs/connected-apps/meta.json b/apps/docs/content/docs/connected-apps/meta.json
new file mode 100644
index 000000000..e33017237
--- /dev/null
+++ b/apps/docs/content/docs/connected-apps/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Connected apps",
+ "icon": "PlugZap",
+ "pages": ["index", "multiple-accounts", "self-hosted-composio"]
+}
diff --git a/apps/docs/content/docs/connected-apps/multiple-accounts.mdx b/apps/docs/content/docs/connected-apps/multiple-accounts.mdx
new file mode 100644
index 000000000..986e417ce
--- /dev/null
+++ b/apps/docs/content/docs/connected-apps/multiple-accounts.mdx
@@ -0,0 +1,23 @@
+---
+title: Multiple accounts
+description: Connect work and personal accounts without silently replacing either one.
+icon: UsersRound
+---
+
+OpenMausBot supports several labeled accounts for the same toolkit. This is useful for two Gmail inboxes, several Slack workspaces, or separate personal and work services.
+
+## Add another account
+
+1. Open **Connected apps**.
+2. Find an already connected toolkit.
+3. Choose **Add account**.
+4. Enter a unique label such as `work`, `personal`, or the workspace name.
+5. Complete authorization in your browser.
+
+When more than one account could execute a tool, the Composio session requires explicit account selection. A new authorization does not silently become the default for the old one.
+
+## Disconnect safely
+
+Each connected account appears separately with its alias and status. Disconnect removes only the chosen account and leaves the others active.
+
+OpenMausBot caps each toolkit at five usable accounts. If a provider or Composio project policy prevents another authorization, use a separate OpenMausBot installation or configuration rather than reauthorizing over a working account.
diff --git a/apps/docs/content/docs/connected-apps/self-hosted-composio.mdx b/apps/docs/content/docs/connected-apps/self-hosted-composio.mdx
new file mode 100644
index 000000000..397af1e34
--- /dev/null
+++ b/apps/docs/content/docs/connected-apps/self-hosted-composio.mdx
@@ -0,0 +1,31 @@
+---
+title: Composio for self-hosters
+description: Configure project-key access, scoped permissions, and headless development.
+icon: KeyRound
+---
+
+The simplest open-source setup is for each installation owner to create a Composio project and paste that project's key into OpenMausBot. This avoids operating a shared credential broker and keeps usage attached to the user's own Composio account.
+
+## Least-privilege scoped key
+
+If you use a scoped Composio project key, grant:
+
+- Sessions: read and write
+- Toolkits: read
+- Connected accounts: read and write
+
+Connected-account write access is required for upstream revocation during disconnect.
+
+## Source and headless runs
+
+Set the key on the harness process:
+
+```bash
+COMPOSIO_API_KEY=ak_your_project_key pnpm dev:server
+```
+
+OpenMausBot creates a stable random Composio user identifier and reuses the returned Session. It does not store raw Gmail, Slack, GitHub, or other provider tokens.
+
+## Managed broker
+
+The repository also contains a Cloudflare Worker broker for managed deployments. It returns the same account-aware inventory shape while keeping broker credentials out of the renderer. Use it only when you intentionally operate a hosted connection service; it is not required for ordinary self-hosting.
diff --git a/apps/docs/content/docs/contributing/documentation.mdx b/apps/docs/content/docs/contributing/documentation.mdx
new file mode 100644
index 000000000..30222ac12
--- /dev/null
+++ b/apps/docs/content/docs/contributing/documentation.mdx
@@ -0,0 +1,44 @@
+---
+title: Writing documentation
+description: Add and review Fumadocs pages in the same pull request as the feature.
+icon: FilePenLine
+---
+
+Public documentation lives in `apps/docs/content/docs`. Internal design notes and implementation plans can remain in the repository's top-level `docs` folder.
+
+## Add a page
+
+Create a `.mdx` file with a title and description:
+
+```mdx
+---
+title: Feature name
+description: One sentence that says what the reader will learn.
+---
+
+Explain the user outcome first.
+```
+
+Add the page filename to the nearest `meta.json` so it appears in navigation.
+
+## Preview locally
+
+From the repository root:
+
+```bash
+pnpm docs:dev
+```
+
+Open `http://localhost:3000`. Before submitting:
+
+```bash
+pnpm docs:build
+```
+
+## Documentation standard
+
+- Describe shipped behavior, not an open PR as though it has been released.
+- Lead with user outcomes and include exact recovery steps for known failure modes.
+- State platform and security boundaries plainly.
+- Prefer links to stable public docs over duplicating long internal design records.
+- Update the changelog only when a release is actually published.
diff --git a/apps/docs/content/docs/contributing/index.mdx b/apps/docs/content/docs/contributing/index.mdx
new file mode 100644
index 000000000..ae7e22a87
--- /dev/null
+++ b/apps/docs/content/docs/contributing/index.mdx
@@ -0,0 +1,29 @@
+---
+title: Contributing
+description: Work with the project architecture and keep changes reviewable.
+icon: GitPullRequest
+---
+
+OpenMausBot welcomes focused fixes and features. Read the repository's [CONTRIBUTING.md](https://github.com/milind-soni/OpenMausBot/blob/main/CONTRIBUTING.md) before opening a pull request.
+
+## Before building
+
+- Search open and recently merged issues and pull requests.
+- Link overlapping work and coordinate with the current contributor.
+- Extend the existing harness, renderer, companion, and provider boundaries instead of adding a parallel system.
+- Open an issue before a large cross-platform change.
+
+## Local checks
+
+```bash
+pnpm typecheck
+pnpm test
+pnpm build
+pnpm check:electron
+```
+
+Run the platform-specific package or native tests when your change touches macOS, Windows, Ubuntu, Cloudflare, or iOS.
+
+## Keep PRs narrow
+
+One concern per pull request is easier to review, test, revert, and release. Large prototypes are useful integration branches, but upstream submissions should be split into independently green slices.
diff --git a/apps/docs/content/docs/contributing/meta.json b/apps/docs/content/docs/contributing/meta.json
new file mode 100644
index 000000000..e85a75254
--- /dev/null
+++ b/apps/docs/content/docs/contributing/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Contributing",
+ "icon": "GitPullRequest",
+ "pages": ["index", "documentation"]
+}
diff --git a/apps/docs/content/docs/features/approvals-and-inspector.mdx b/apps/docs/content/docs/features/approvals-and-inspector.mdx
new file mode 100644
index 000000000..3ad152069
--- /dev/null
+++ b/apps/docs/content/docs/features/approvals-and-inspector.mdx
@@ -0,0 +1,21 @@
+---
+title: Approvals and inspector
+description: Stay in control when agents ask questions, request access, or perform risky work.
+icon: ShieldCheck
+---
+
+OpenMausBot renders structured agent events as native conversation cards. Questions, choices, permission requests, tool activity, and failures remain attached to the task that produced them.
+
+## Approval cards
+
+When an engine supports approvals, OpenMausBot surfaces the request instead of hiding it in terminal output. Read the requested action and scope before approving it. Denying an action sends control back to the agent so it can choose a safer path.
+
+
+
+## Inspector
+
+Use **Inspector** when you need more detail than the conversation provides. It is useful for following tool calls, reconnect attempts, engine output, and long-running work.
+
+## When a run disconnects
+
+OpenMausBot retries transient streaming failures. If retries end in an authentication or configuration error, fix the underlying engine rather than repeatedly retrying the task. See [Agent engine troubleshooting](../providers/troubleshooting.mdx).
diff --git a/apps/docs/content/docs/features/attachments-and-search.mdx b/apps/docs/content/docs/features/attachments-and-search.mdx
new file mode 100644
index 000000000..028cd0a6f
--- /dev/null
+++ b/apps/docs/content/docs/features/attachments-and-search.mdx
@@ -0,0 +1,25 @@
+---
+title: Attachments, search, and message tools
+description: Add visual context and find, preserve, or reuse important parts of a conversation.
+icon: Paperclip
+---
+
+## Image attachments
+
+Paste a screenshot directly into the composer or attach an image from disk. Add a short instruction explaining what the agent should inspect—the highlighted UI, an error message, a layout mismatch, or the whole image.
+
+## Search
+
+The sidebar search finds bots and conversation content. Use distinctive project names, issue numbers, or exact error fragments to narrow results quickly.
+
+## Message actions
+
+- **Pin** durable decisions or instructions.
+- **Copy** a response without selecting the message manually.
+- **React** to leave lightweight feedback in shared conversations.
+- **Retry** when a transient provider or connection failure interrupts a response.
+- **Read aloud** when voice output is configured.
+
+
+ Crop tokens, email addresses, private repository names, and customer data before attaching an image to any cloud-backed model.
+
diff --git a/apps/docs/content/docs/features/automation.mdx b/apps/docs/content/docs/features/automation.mdx
new file mode 100644
index 000000000..347f8adf3
--- /dev/null
+++ b/apps/docs/content/docs/features/automation.mdx
@@ -0,0 +1,29 @@
+---
+title: Routines and webhooks
+description: Start fresh agent tasks on a schedule or from an external event.
+icon: CalendarClock
+---
+
+## Routines
+
+A routine runs once or on selected weekdays. Each run starts a fresh task using the selected bot's model, permissions, tools, and computer configuration.
+
+
+
+Run receipts distinguish queued, active, waiting, completed, missed, failed, and cancelled work. OpenMausBot must be running when a local routine becomes due.
+
+## Webhook triggers
+
+Webhooks start the same queued task executor from an external HTTP request. They are independent from schedules and use a dedicated receiver on `127.0.0.1:8800` by default.
+
+The receiver exposes only health and secret hook routes. It does not expose the broader OpenMausBot API.
+
+Bearer authentication is preferred because it keeps the secret out of URLs and most access logs. A capability URL is available for senders that cannot set headers.
+
+## Reaching a local webhook
+
+To accept events from the public internet, proxy only the webhook receiver through a narrowly configured relay or tunnel. Do not expose the main harness port.
+
+
+ Local routines and webhook deliveries are not hosted jobs. Closing the desktop app stops the local executor and receiver.
+
diff --git a/apps/docs/content/docs/features/bots-and-tasks.mdx b/apps/docs/content/docs/features/bots-and-tasks.mdx
new file mode 100644
index 000000000..2b2abbee0
--- /dev/null
+++ b/apps/docs/content/docs/features/bots-and-tasks.mdx
@@ -0,0 +1,34 @@
+---
+title: Bots and tasks
+description: Organize persistent agents, focused tasks, shared rooms, and delegated work.
+icon: Bot
+---
+
+## Bots are persistent teammates
+
+A bot keeps its own conversation, model, instructions, working folder, memory, connected tools, and computer preference. Create separate bots when the role, access, or project context should differ.
+
+- A coding bot attached to one repository
+- A research bot with browser and document tools
+- An operations bot with Gmail, Calendar, and Slack
+- A local-model bot for private or offline work
+
+## Tasks are focused runs
+
+Use **Task** when the work should have a clear beginning and result. Tasks are easier to track than mixing every request into the bot's main conversation, and scheduled runs create tasks automatically.
+
+## Rooms and teams
+
+Rooms let multiple bots and people share context. Use a room when several specialists need the same brief or should hand work to one another. A chief-of-staff pattern works well: one bot receives the request, delegates focused tasks, and summarizes the result.
+
+## Delegation
+
+Delegation asks another bot to handle a bounded subtask. The delegated task keeps its own activity and returns a result to the originating conversation. Give each delegate a narrow outcome and avoid assigning two bots ownership of the same files.
+
+| Need | Use |
+|---|---|
+| Ongoing relationship and memory | Bot |
+| One deliverable with a status | Task |
+| Several participants sharing context | Room |
+| A specialist handling one branch of work | Delegation |
+| Repeated work at a known time | Schedule |
diff --git a/apps/docs/content/docs/features/chat-and-teams.mdx b/apps/docs/content/docs/features/chat-and-teams.mdx
new file mode 100644
index 000000000..0370f3aa9
--- /dev/null
+++ b/apps/docs/content/docs/features/chat-and-teams.mdx
@@ -0,0 +1,27 @@
+---
+title: Chat, tasks, rooms, and teams
+description: Organize agents like contacts and let them collaborate without losing control of each task.
+icon: MessagesSquare
+---
+
+## Bots and tasks
+
+A bot is a durable agent identity. A task is one conversation with that bot and has its own transcript, provider session, approvals, costs, and state.
+
+Use separate tasks when you want fresh context without duplicating the bot. Messages sent while a bot is busy are queued, and supported providers can be steered while they work.
+
+## Rooms
+
+Rooms bring several bots into one conversation. Each participant keeps its own agent process and provider state. Room timeouts prevent a participant from blocking the whole group indefinitely.
+
+## Delegation
+
+Bots can hand work to other bots. Delegated runs carry explicit status back into the parent conversation, including completion, failure, and cancellation.
+
+## Rewind and branches
+
+Editing an earlier message creates a new conversation path. OpenMausBot avoids resuming stale provider sessions after a rewind, so the next turn follows the visible branch rather than hidden abandoned state.
+
+## Memory and working folders
+
+Bot memory is visible and editable. A bot may also have a dedicated working folder; rooms can use a shared working folder. Cloud workspaces use a stable default so generated files remain discoverable across tasks.
diff --git a/apps/docs/content/docs/features/index.mdx b/apps/docs/content/docs/features/index.mdx
new file mode 100644
index 000000000..f77013465
--- /dev/null
+++ b/apps/docs/content/docs/features/index.mdx
@@ -0,0 +1,52 @@
+---
+title: Feature overview
+description: A map of the capabilities currently available in OpenMausBot.
+icon: Sparkles
+---
+
+OpenMausBot turns agent CLIs into a messaging-style workspace. The harness normalizes each provider into one event stream, so the interface can treat different agents consistently while preserving their native strengths.
+
+## Agents and conversations
+
+- A separate bot for each role, model, personality, and working folder
+- Streaming responses with live tool activity
+- Multiple tasks per bot, with searchable, persistent transcript history
+- Edit, branch, rewind, pin, react, export, and share conversation content
+- Rooms for multi-agent collaboration and explicit bot-to-bot delegation
+- Queueing and steering while an agent is already working
+- Per-task token and cost visibility
+- Readable, editable bot memory
+
+## Computers and tools
+
+- Local computer control with explicit opt-in and approval boundaries
+- Isolated Local VM desktops through Docker or Podman
+- Hosted Box cloud computers
+- A self-hosted Linux VPS backend over Docker's SSH transport
+- Live previews and in-app desktop takeover where the backend supports it
+- USB Android control through the Phone Harness skill
+- Connected apps through Composio, including multiple labeled accounts per toolkit
+
+## Automation
+
+- One-time and weekday routines
+- Webhook-triggered tasks with dedicated secret endpoints
+- Fresh task context and durable run receipts for each automated run
+- Notifications for work that needs attention
+
+## Voice and access
+
+- Spoken replies and per-bot ElevenLabs voices
+- Native macOS dictation and half-duplex call mode
+- Paired iOS companion with chat, approvals, search, transcript controls, and opt-in computer viewing
+
+## Desktop experience
+
+- macOS, Windows, and Ubuntu packages
+- Theme switching and accessible contrast
+- Sidebar sections, compact headers, pinned messages, spoilers, and image attachments
+- Automatic updates on macOS and Windows
+
+
+ macOS has the broadest native integration. Ubuntu local control is a guarded beta, Windows installers are not yet signed, and the iOS companion keeps sensitive workspace configuration on the computer.
+
diff --git a/apps/docs/content/docs/features/meta.json b/apps/docs/content/docs/features/meta.json
new file mode 100644
index 000000000..1655482ac
--- /dev/null
+++ b/apps/docs/content/docs/features/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Features",
+ "icon": "Sparkles",
+ "pages": ["index", "bots-and-tasks", "chat-and-teams", "approvals-and-inspector", "attachments-and-search", "automation", "voice-and-memory"]
+}
diff --git a/apps/docs/content/docs/features/voice-and-memory.mdx b/apps/docs/content/docs/features/voice-and-memory.mdx
new file mode 100644
index 000000000..d63b6c0dc
--- /dev/null
+++ b/apps/docs/content/docs/features/voice-and-memory.mdx
@@ -0,0 +1,25 @@
+---
+title: Voice, dictation, and memory
+description: Listen to agents, talk to them, and inspect what they remember.
+icon: AudioLines
+---
+
+## Spoken replies
+
+Add an ElevenLabs key in App Settings, choose a voice, and use the speaker control on a response. Auto-speak can read new replies as they arrive.
+
+The harness rewrites code-heavy Markdown into speech-friendly text before synthesis. Keys remain on the harness and never reach the renderer.
+
+## Call mode
+
+On macOS, call mode combines native on-device speech recognition with the configured ElevenLabs voice. It is deliberately half-duplex: the microphone pauses while the bot speaks to prevent the app from transcribing its own audio.
+
+Tool progress and approval requests can be narrated during a call so long-running work does not sound disconnected.
+
+## Dictation
+
+The composer microphone uses Apple's local speech recognition in the macOS desktop build. Linux and Windows dictation are not currently shipped.
+
+## Memory
+
+Each bot can keep plain-text memory that you can inspect, correct, or delete. Memory is not a hidden remote profile; it lives with the local OpenMausBot data.
diff --git a/apps/docs/content/docs/getting-started/configuration.mdx b/apps/docs/content/docs/getting-started/configuration.mdx
new file mode 100644
index 000000000..bb425e9dd
--- /dev/null
+++ b/apps/docs/content/docs/getting-started/configuration.mdx
@@ -0,0 +1,37 @@
+---
+title: Configuration
+description: Understand engine paths, credentials, and the local configuration boundary.
+icon: Settings
+---
+
+Most users configure OpenMausBot from the app. The packaged desktop validates credentials before saving them and stores supported secrets with the operating system's secure storage.
+
+## Engine discovery
+
+OpenMausBot checks the inherited process path, common install locations, and the login shell. If an engine is installed somewhere unusual, open **Settings → Engines** and choose its executable explicitly.
+
+Explicit paths are useful when you:
+
+- keep multiple CLI versions;
+- use a wrapper script;
+- installed an engine in a directory desktop apps cannot discover; or
+- launch OpenMausBot from a Windows shortcut or Linux application menu with a different environment from your terminal.
+
+## Optional credentials
+
+| Credential | Enables |
+|---|---|
+| Composio project key | Connected apps and OAuth sessions |
+| Box API key | Hosted Linux computers |
+| ElevenLabs API key | Spoken replies and voice mode |
+| OpenCode Go API key | OpenCode Go engine |
+
+Local agent chat works without these credentials.
+
+## Environment configuration
+
+Source and headless runs can set supported environment variables before starting the harness. The app-level settings are preferable for normal packaged use because they validate inputs and keep secret values out of the renderer.
+
+
+ A prompt becomes conversation history and may be sent to an agent provider. Use App Settings or environment configuration for credentials.
+
diff --git a/apps/docs/content/docs/getting-started/first-bot.mdx b/apps/docs/content/docs/getting-started/first-bot.mdx
new file mode 100644
index 000000000..284473096
--- /dev/null
+++ b/apps/docs/content/docs/getting-started/first-bot.mdx
@@ -0,0 +1,48 @@
+---
+title: Create your first bot
+description: Choose an engine, folder, and working style for a useful first agent.
+icon: Bot
+---
+
+## Before you start
+
+Install and sign in to at least one supported agent CLI. OpenMausBot detects installed engines during onboarding and again from **App settings → Agent engines**.
+
+
+
+## Create the bot
+
+1. Select **New or share** in the sidebar.
+2. Choose **New bot**.
+3. Give the bot a clear name and purpose.
+4. Select its agent engine and model.
+5. Choose a working folder if it should edit files or work in a repository.
+
+The working folder matters: it becomes the bot's starting context and limits accidental edits elsewhere. Use a dedicated project folder for coding, research, or content work.
+
+## Give it a useful first task
+
+Start with a concrete outcome and the constraints that matter:
+
+```text
+Review this project, run the tests, and explain the three highest-impact issues.
+Do not change files yet. Link each finding to the relevant file.
+```
+
+Once you trust the diagnosis, ask the bot to implement the change. This keeps review and mutation as separate, easy-to-check steps.
+
+## Tune the bot
+
+Open **Bot settings** to change its name, avatar, instructions, engine, model, working folder, and computer setup. Different bots can use different engines and folders at the same time.
+
+
+ OpenMausBot launches agent tools you installed. If an engine returns a 401 or asks you to sign in, finish that engine's own CLI login, then refresh detection in App settings.
+
+
+## Next steps
+
+
+
+
+
+
diff --git a/apps/docs/content/docs/getting-started/installation.mdx b/apps/docs/content/docs/getting-started/installation.mdx
new file mode 100644
index 000000000..75651dbec
--- /dev/null
+++ b/apps/docs/content/docs/getting-started/installation.mdx
@@ -0,0 +1,54 @@
+---
+title: Installation
+description: Install OpenMausBot on macOS, Windows, or Ubuntu.
+icon: Download
+---
+
+## Download a released build
+
+Choose the package for your computer from the [latest release](https://github.com/milind-soni/openmausbot-releases/releases/latest).
+
+| Platform | Recommended package | Notes |
+|---|---|---|
+| macOS Apple silicon | `OpenMausBot.dmg` | Signed and notarized. Drag to Applications. |
+| macOS Intel | `OpenMausBot-intel.dmg` | Signed and notarized. |
+| Windows x64 | `OpenMausBot-setup.exe` | Per-user installer; Windows signing is not yet available. |
+| Ubuntu 24.04 x64 | `OpenMausBot-amd64.deb` | Recommended Ubuntu package; the AppImage is portable. |
+
+
+ The Windows installer is not code-signed yet. Windows may show “Unknown publisher.” Verify that you downloaded it from the official OpenMausBot releases repository before choosing **More info → Run anyway**.
+
+
+## Install an agent CLI
+
+OpenMausBot needs at least one supported agent engine installed and signed in. Claude and Codex are the most common starting points.
+
+1. Install the CLI from its official provider.
+2. Run it once in a terminal and complete sign-in.
+3. Restart OpenMausBot.
+4. Open the model picker. Available engines appear normally; unavailable engines explain what is missing.
+
+See [Agent engines](../providers/index.mdx) for the complete list and explicit path overrides.
+
+## Build from source
+
+Requirements: Node.js 24 or newer, pnpm 10.33.0, and at least one authenticated agent CLI.
+
+```bash
+git clone https://github.com/milind-soni/OpenMausBot.git
+cd OpenMausBot
+corepack enable
+pnpm install --frozen-lockfile
+```
+
+Run the harness, web UI, and Electron shell in separate terminals:
+
+```bash
+pnpm dev:server
+pnpm dev
+pnpm dev:desktop
+```
+
+## Where data lives
+
+OpenMausBot stores its application data under `~/.openmausbot`. Electron window and browser data use the normal per-platform application data directory.
diff --git a/apps/docs/content/docs/getting-started/meta.json b/apps/docs/content/docs/getting-started/meta.json
new file mode 100644
index 000000000..129064390
--- /dev/null
+++ b/apps/docs/content/docs/getting-started/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Getting started",
+ "icon": "Rocket",
+ "pages": ["installation", "quick-tour", "first-bot", "configuration"]
+}
diff --git a/apps/docs/content/docs/getting-started/quick-tour.mdx b/apps/docs/content/docs/getting-started/quick-tour.mdx
new file mode 100644
index 000000000..6d5a6e911
--- /dev/null
+++ b/apps/docs/content/docs/getting-started/quick-tour.mdx
@@ -0,0 +1,36 @@
+---
+title: Quick tour
+description: Learn the six parts of OpenMausBot before handing your first job to an agent.
+icon: Map
+---
+
+## 1. Sidebar
+
+The sidebar holds your bots, groups, automations, connected apps, profile, and app settings. Search looks through bot names and message history. Use **New or share** to create a bot or start a shared room.
+
+## 2. Conversation
+
+Messages are the work log. Agent replies, questions, approval requests, tool progress, attachments, and failures stay together in the conversation. You can pin, copy, react to, search, and retry messages.
+
+## 3. Task mode
+
+The **Task** button starts a separate unit of work without losing the main conversation. A task keeps its own status and result, which is useful for parallel or delegated work.
+
+## 4. Model picker
+
+Pick an agent engine and model per bot. The picker separates cloud-backed agent CLIs from local engines and shows what is installed on this machine.
+
+
+
+## 5. Computer and inspector
+
+Open **Bot's computer** to choose where visual work runs. Open **Inspector** to follow lower-level activity when a task is executing.
+
+## 6. Connected apps and automations
+
+Connected apps give bots authenticated tools. Automations turn a good prompt into scheduled or webhook-triggered work.
+
+
+
+
+
diff --git a/apps/docs/content/docs/index.mdx b/apps/docs/content/docs/index.mdx
new file mode 100644
index 000000000..a49feceb5
--- /dev/null
+++ b/apps/docs/content/docs/index.mdx
@@ -0,0 +1,52 @@
+---
+title: OpenMausBot documentation
+description: Build a team of AI agents that can talk, use tools, operate computers, and keep working on a schedule.
+icon: BookOpen
+---
+
+Local-first agent workspace
+
+OpenMausBot turns agent CLIs into a familiar desktop chat app. Each bot can have its own model, instructions, working folder, connected apps, computer, and recurring work.
+
+
+
Many enginesClaude, Codex, Grok, Cursor, local models, and more
+
Real toolsApps, files, terminals, browsers, VMs, and cloud desktops
+
Your machineLocal data and bring-your-own agent subscriptions
+
+
+
+
+
+
+
+
+
+
+
+## How the pieces fit
+
+| Layer | What it does | Where to configure it |
+|---|---|---|
+| **Bot** | Holds the identity, conversation, memory, and defaults | Bot settings |
+| **Agent engine** | Runs the reasoning loop and tools | Model picker and App settings |
+| **Working folder** | Gives the bot project context and a safe place to work | Bot settings |
+| **Connected apps** | Authorizes services such as Gmail or GitHub | Connected apps |
+| **Computer** | Gives visual control of a desktop environment | Computer panel |
+| **Automation** | Runs a task later, on a schedule, or from a webhook | Automations |
+
+## Choose your path
+
+| I want to… | Start here |
+|---|---|
+| Understand the app in five minutes | [Quick tour](./getting-started/quick-tour.mdx) |
+| Pick Claude, Codex, Cursor, Grok, or a local model | [Agent engines](./providers/index.mdx) |
+| Organize bots, tasks, rooms, and delegations | [Bots and tasks](./features/bots-and-tasks.mdx) |
+| Control a browser or desktop | [Computers](./computers/index.mdx) |
+| Run work every morning | [Automations](./features/automation.mdx) |
+| Reach my bots from an iPhone | [iOS companion](./mobile/ios-companion.mdx) |
+| Back up or move my data | [Data and backups](./self-hosting/data-and-backups.mdx) |
+| Build from source or contribute | [Contributing](./contributing/index.mdx) |
+
+
+ OpenMausBot moves quickly. The changelog records shipped releases; proposed or unfinished work stays on GitHub until it lands.
+
diff --git a/apps/docs/content/docs/meta.json b/apps/docs/content/docs/meta.json
new file mode 100644
index 000000000..99a9913e8
--- /dev/null
+++ b/apps/docs/content/docs/meta.json
@@ -0,0 +1,18 @@
+{
+ "title": "OpenMausBot",
+ "root": true,
+ "pages": [
+ "index",
+ "getting-started",
+ "features",
+ "providers",
+ "computers",
+ "connected-apps",
+ "mobile",
+ "self-hosting",
+ "security",
+ "troubleshooting",
+ "changelog",
+ "contributing"
+ ]
+}
diff --git a/apps/docs/content/docs/mobile/android-control.mdx b/apps/docs/content/docs/mobile/android-control.mdx
new file mode 100644
index 000000000..9a9b46264
--- /dev/null
+++ b/apps/docs/content/docs/mobile/android-control.mdx
@@ -0,0 +1,16 @@
+---
+title: USB Android control
+description: Let a bot inspect and operate a physically connected Android phone.
+icon: Cable
+---
+
+OpenMausBot can expose a USB-connected Android device through its Phone Harness skill. A supported agent can inspect the screen, open apps, tap, type, swipe, scroll, and capture screenshots.
+
+## Requirements
+
+- A physical Android device connected over USB
+- USB debugging enabled on the device
+- The computer trusted from the device's debugging prompt
+- The packaged Android platform tools or a compatible local ADB installation
+
+Phone access is a separate capability from desktop computer use. Keep the device unlocked and visible while testing, and review actions that may send messages, change accounts, or expose private content.
diff --git a/apps/docs/content/docs/mobile/ios-companion.mdx b/apps/docs/content/docs/mobile/ios-companion.mdx
new file mode 100644
index 000000000..97ff0994d
--- /dev/null
+++ b/apps/docs/content/docs/mobile/ios-companion.mdx
@@ -0,0 +1,36 @@
+---
+title: iOS companion
+description: Pair an iPhone directly with the OpenMausBot instance running on your computer.
+icon: Smartphone
+---
+
+The native iOS companion is a thin client. Your computer remains the only machine that owns agent processes, credentials, transcripts, SQLite data, and computers.
+
+## What it can do
+
+- Discover and pair on the same LAN, or connect through Tailscale
+- List bots and rooms, read paged transcripts, send messages, and interrupt work
+- Answer approvals and questions, including narrow always-allow grants
+- Search, manage tasks, react, share, and navigate message versions
+- Follow resumable live updates and optionally view a bot's cloud computer
+
+## Pairing
+
+The desktop opens a two-minute pairing window with a high-entropy QR credential and a six-digit manual fallback. Redeeming either closes the window and returns a separate per-device token stored in iOS Keychain.
+
+The computer stores only a digest of the device token. Revoking the phone from desktop Settings invalidates future requests.
+
+## Network options
+
+- **Same trusted Wi-Fi:** Bonjour discovery and direct HTTP.
+- **Away from home:** Tailscale on both devices with the computer's MagicDNS name.
+
+There is no hosted OpenMausBot relay. Bonjour does not cross Tailscale, so remote connections use manual address entry.
+
+## Security boundary
+
+The companion sidecar uses a default-deny route allowlist. Provider keys, pairing administration, Local VM lifecycle, webhook secrets, team import/export, and internal peer-agent routes remain unreachable from the phone.
+
+
+ Live and replayed events can produce alerts while the companion is connected, but a terminated iOS app cannot be awakened without a future APNs relay.
+
diff --git a/apps/docs/content/docs/mobile/meta.json b/apps/docs/content/docs/mobile/meta.json
new file mode 100644
index 000000000..9889ac83c
--- /dev/null
+++ b/apps/docs/content/docs/mobile/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Mobile",
+ "icon": "Smartphone",
+ "pages": ["ios-companion", "android-control"]
+}
diff --git a/apps/docs/content/docs/providers/index.mdx b/apps/docs/content/docs/providers/index.mdx
new file mode 100644
index 000000000..af9566ae4
--- /dev/null
+++ b/apps/docs/content/docs/providers/index.mdx
@@ -0,0 +1,43 @@
+---
+title: Agent engines
+description: Use the agent subscriptions and CLIs you already have.
+icon: BrainCircuit
+---
+
+OpenMausBot does not proxy every message through its own model account. It starts supported agent CLIs on your computer and normalizes their output through the local harness.
+
+
+
+## Built-in engines
+
+| Engine | Authentication shape | Notes |
+|---|---|---|
+| Claude | Claude CLI login | Strong support for tools, approvals, sessions, and local computer use |
+| Codex | Codex CLI login | Model discovery, approvals, steering, and computer tools |
+| Grok | Grok CLI login | ACP-based local model catalog and session support |
+| Cursor | Cursor Agent CLI login or API key | ACP driver with live model discovery |
+| Kimi | Kimi CLI login | ACP integration |
+| Droid | Factory Droid CLI login | ACP integration |
+| Antigravity | Google Antigravity CLI login | Default Google consumer engine |
+| OpenCode Go | OpenCode login | ACP integration |
+| Qwen | Qwen CLI login | ACP integration |
+| Hermes | Hermes CLI login | ACP integration |
+| Pi | Pi CLI login | Native driver |
+
+Additional driver instances can be declared in local configuration. Unavailable engines remain visible with a reason instead of crashing the provider fleet.
+
+## Detection
+
+OpenMausBot checks common installation directories and the login shell in the background. Restart the app after installing or authenticating a CLI.
+
+If detection fails, use **Settings → Engines** to set an explicit executable path. This is supported for every engine and is the most reliable solution for version managers, wrappers, custom builds, and Windows installations outside the normal path.
+
+## Model selection
+
+The model picker groups models by provider and marks defaults. Supported engines can refresh their model catalog from the installed CLI. Changing the model affects future turns; it does not rewrite earlier transcript history.
+
+
+
+
+ Your existing CLI login or provider API key determines access and billing. OpenMausBot does not turn one subscription into access to another provider.
+
diff --git a/apps/docs/content/docs/providers/meta.json b/apps/docs/content/docs/providers/meta.json
new file mode 100644
index 000000000..4c763775c
--- /dev/null
+++ b/apps/docs/content/docs/providers/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Agent engines",
+ "icon": "BrainCircuit",
+ "pages": ["index", "troubleshooting"]
+}
diff --git a/apps/docs/content/docs/providers/troubleshooting.mdx b/apps/docs/content/docs/providers/troubleshooting.mdx
new file mode 100644
index 000000000..8e25b0747
--- /dev/null
+++ b/apps/docs/content/docs/providers/troubleshooting.mdx
@@ -0,0 +1,31 @@
+---
+title: Engine troubleshooting
+description: Fix missing CLIs, failed authentication, model errors, and path differences.
+icon: Wrench
+---
+
+## “CLI not found”
+
+1. Open a terminal and run the CLI directly.
+2. Confirm the command is an executable, not only a shell alias or function.
+3. Restart OpenMausBot after installation.
+4. Set the exact executable in **Settings → Engines** if automatic detection still fails.
+
+Desktop applications often inherit a different environment than a terminal. This is common on Windows shortcuts, macOS Finder launches, and Linux application menus.
+
+## Authentication failures
+
+Run the provider's own status or login command in a terminal. OpenMausBot uses the CLI's authenticated session; installing the binary alone is not enough.
+
+A `401 Unauthorized` response from `api.openai.com` means the launched Codex process did not receive valid authentication. Confirm `codex login status`, sign in again if needed, then restart OpenMausBot. Do not paste a ChatGPT password into OpenMausBot.
+
+## A selected model fails
+
+- Refresh the model picker after updating the CLI.
+- Choose a model actually available to that provider account.
+- Confirm a custom wrapper forwards the model argument and preserves the provider's expected environment.
+- Try the provider CLI directly with the same model to separate an account problem from an OpenMausBot integration problem.
+
+## Windows notes
+
+Use a real `.exe`, `.cmd`, or resolvable command path in the engine override. If a CLI was installed in WSL, the Windows desktop app cannot treat that Linux binary as a native Windows executable without an explicit bridge or wrapper.
diff --git a/apps/docs/content/docs/security/index.mdx b/apps/docs/content/docs/security/index.mdx
new file mode 100644
index 000000000..7b223321e
--- /dev/null
+++ b/apps/docs/content/docs/security/index.mdx
@@ -0,0 +1,27 @@
+---
+title: Security model
+description: The boundaries that keep agents, credentials, computers, and paired devices scoped.
+icon: ShieldCheck
+---
+
+OpenMausBot is designed around a local owner, explicit capabilities, and narrow process boundaries. Local-first does not mean risk-free: an agent with tool or computer access can still act on the resources you grant it.
+
+## Core boundaries
+
+- The harness owns agent processes and listens on loopback.
+- The renderer receives configured-or-not credential state, not secret values.
+- Provider-specific credentials are injected only into the process that needs them.
+- Risky actions become approval cards rather than implicit permission.
+- Local computer control is a separate opt-in and per-bot selection.
+- Paired phones use a default-deny API allowlist and per-device bearer tokens.
+- Cloud and VPS backends are validated before reuse.
+
+## Your responsibility
+
+- Review approvals, especially shell commands, file writes, and actions in connected services.
+- Use dedicated environments for untrusted or destructive work.
+- Keep provider accounts and connected apps scoped to what a bot needs.
+- Revoke lost companion devices immediately.
+- Keep OpenMausBot and agent CLIs updated.
+
+Security reports should be filed through the repository's documented security channel rather than disclosed in a public issue before a fix is available.
diff --git a/apps/docs/content/docs/security/meta.json b/apps/docs/content/docs/security/meta.json
new file mode 100644
index 000000000..7966c0272
--- /dev/null
+++ b/apps/docs/content/docs/security/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Security",
+ "icon": "ShieldCheck",
+ "pages": ["index", "permissions-and-secrets"]
+}
diff --git a/apps/docs/content/docs/security/permissions-and-secrets.mdx b/apps/docs/content/docs/security/permissions-and-secrets.mdx
new file mode 100644
index 000000000..800275826
--- /dev/null
+++ b/apps/docs/content/docs/security/permissions-and-secrets.mdx
@@ -0,0 +1,27 @@
+---
+title: Permissions and secrets
+description: How approvals, operating-system grants, and provider credentials are handled.
+icon: KeyRound
+---
+
+## Approval cards
+
+Supported providers emit permission requests and questions through the local harness. OpenMausBot displays these inline and records the outcome. Cancellation closes outstanding requests so stale approvals cannot be answered after a turn has ended.
+
+“Always allow” is narrow: it is tied to a server-issued key and a pending request rather than granting arbitrary execution from a paired device.
+
+## Operating-system permissions
+
+Screen Recording and Accessibility permissions are controlled by the operating system. The desktop process owns local CUA lifecycle so grants are attributed to OpenMausBot.
+
+## Secret handling
+
+- Do not paste API keys into chat.
+- Packaged builds use write-only settings and operating-system-backed encryption where supported.
+- Secret values are scrubbed from public configuration responses and mobile APIs.
+- Per-provider environment injection prevents unrelated agent processes from inheriting credentials they do not use.
+- OAuth provider tokens for connected apps stay with Composio.
+
+## Shared machines
+
+OpenMausBot assumes the logged-in operating-system user is the workspace owner. On a shared machine, other administrators may be able to read application data or inspect processes. Use a dedicated OS account for stronger separation.
diff --git a/apps/docs/content/docs/self-hosting/data-and-backups.mdx b/apps/docs/content/docs/self-hosting/data-and-backups.mdx
new file mode 100644
index 000000000..f0e96cdba
--- /dev/null
+++ b/apps/docs/content/docs/self-hosting/data-and-backups.mdx
@@ -0,0 +1,19 @@
+---
+title: Data and backups
+description: Know what OpenMausBot stores locally and what to preserve.
+icon: DatabaseBackup
+---
+
+OpenMausBot keeps its application state under `~/.openmausbot`, including configuration, transcripts, message attachments, device pairing state, and the SQLite message store.
+
+## Back up
+
+Close OpenMausBot before taking a filesystem-level backup so SQLite and configuration files are captured consistently. Preserve the entire `.openmausbot` directory rather than selecting individual database files.
+
+## Do not copy secrets casually
+
+Packaged desktop builds may protect credentials using operating-system secure storage. Copying the JSON directory to another machine does not necessarily make protected credentials usable there, and it should not be treated as a portable credential export.
+
+## Disposable computer filesystems
+
+Local VM workspaces are mounted durably, but a self-hosted VPS container filesystem is intentionally disposable. Move important artifacts to a durable workspace, repository, or connected app before removing or upgrading a container.
diff --git a/apps/docs/content/docs/self-hosting/index.mdx b/apps/docs/content/docs/self-hosting/index.mdx
new file mode 100644
index 000000000..4315025e9
--- /dev/null
+++ b/apps/docs/content/docs/self-hosting/index.mdx
@@ -0,0 +1,35 @@
+---
+title: Self-hosting OpenMausBot
+description: Run the harness and desktop app on infrastructure you control.
+icon: Server
+---
+
+OpenMausBot is local-first by default: the harness listens on loopback, agent CLIs run on your machine, and application state lives under `~/.openmausbot`.
+
+## Typical self-hosted setup
+
+1. Run OpenMausBot on your personal macOS, Windows, or Ubuntu computer.
+2. Install and authenticate the agent CLIs you want to use.
+3. Add optional third-party keys only for the services you need.
+4. Keep the harness on loopback.
+5. Use the paired companion sidecar or Tailscale when another device needs access.
+
+## What is still third party
+
+Self-hosting OpenMausBot does not self-host every optional provider:
+
+- Agent providers authenticate and bill through their own CLI or API.
+- Composio owns connected-app OAuth grants unless you replace that integration.
+- Box owns managed cloud computers.
+- ElevenLabs synthesizes speech when voice is enabled.
+
+These services are optional. Local chat through a locally installed agent CLI does not require them.
+
+## Run headless during development
+
+```bash
+pnpm install --frozen-lockfile
+pnpm dev:server
+```
+
+The main harness listens on `127.0.0.1:8799` by default. Keep it private; it owns agent processes, approvals, computers, and workspace configuration.
diff --git a/apps/docs/content/docs/self-hosting/meta.json b/apps/docs/content/docs/self-hosting/meta.json
new file mode 100644
index 000000000..3161a3d1a
--- /dev/null
+++ b/apps/docs/content/docs/self-hosting/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Self-hosting",
+ "icon": "Server",
+ "pages": ["index", "networking", "data-and-backups"]
+}
diff --git a/apps/docs/content/docs/self-hosting/networking.mdx b/apps/docs/content/docs/self-hosting/networking.mdx
new file mode 100644
index 000000000..06ba34a1f
--- /dev/null
+++ b/apps/docs/content/docs/self-hosting/networking.mdx
@@ -0,0 +1,24 @@
+---
+title: Networking
+description: Understand the harness, webhook, and companion network boundaries.
+icon: Network
+---
+
+OpenMausBot separates its network surfaces by trust level.
+
+| Surface | Default bind | Purpose |
+|---|---|---|
+| Harness | `127.0.0.1:8799` | Full app API and event stream |
+| Webhook receiver | `127.0.0.1:8800` | Health and secret hook endpoints only |
+| Companion sidecar | `0.0.0.0:8810` when enabled | Paired-device, token-authenticated allowlist |
+| Companion control | `127.0.0.1:8811` | Pairing and device administration |
+
+## Remote access
+
+Use the companion sidecar rather than exposing the harness. Tailscale is the recommended remote route because it encrypts and authenticates the network path without making the machine public.
+
+For webhook delivery, proxy only the dedicated webhook receiver. Never forward the main harness port to the public internet.
+
+## Port overrides
+
+Source and advanced deployments can change documented ports with the relevant environment settings. When the default harness port is occupied, packaged builds may fall back to another local port and communicate the selected address internally.
diff --git a/apps/docs/content/docs/troubleshooting/connected-apps.mdx b/apps/docs/content/docs/troubleshooting/connected-apps.mdx
new file mode 100644
index 000000000..c90c99524
--- /dev/null
+++ b/apps/docs/content/docs/troubleshooting/connected-apps.mdx
@@ -0,0 +1,26 @@
+---
+title: Connected apps
+description: Fix OAuth loops, missing tools, and connections that appear to vanish.
+icon: Unplug
+---
+
+## Connection completes but the app still shows disconnected
+
+1. Return to OpenMausBot after the browser confirms success.
+2. Open **Connected apps** and use **Refresh connection status**.
+3. Check the **Connected** tab for the account, including its alias.
+4. Retry from the original bot after the account appears active.
+
+## The account is connected but the agent cannot use it
+
+Start a new task after connecting the app so the engine receives a fresh tool catalog. Name the service and account explicitly in the request. If several accounts are connected, select or mention the intended alias.
+
+Some engines expose connected tools differently. Verify the chosen engine supports MCP or the connected-tool bridge used by the app.
+
+## Official build says the service is unavailable
+
+Check internet connectivity and try again later before reconnecting every account. The packaged app preserves its installation identity across transient broker outages; rotating or deleting local credentials during an outage can separate existing grants from the installation.
+
+## Self-hosted build asks for configuration
+
+Source and self-hosted builds do not automatically use the official managed service. Configure your own Composio project as described in [Self-hosted Composio](../connected-apps/self-hosted-composio.mdx).
diff --git a/apps/docs/content/docs/troubleshooting/index.mdx b/apps/docs/content/docs/troubleshooting/index.mdx
new file mode 100644
index 000000000..acb0c044e
--- /dev/null
+++ b/apps/docs/content/docs/troubleshooting/index.mdx
@@ -0,0 +1,26 @@
+---
+title: Troubleshooting
+description: Find the failing layer first, then apply the smallest safe fix.
+icon: Wrench
+---
+
+Most OpenMausBot failures come from one of four layers: the desktop app, a local agent CLI, a connected service, or a computer backend.
+
+
+
+
+
+
+
+
+## Collect useful evidence
+
+Before opening an issue, record:
+
+- OpenMausBot version and operating system;
+- selected engine and model;
+- the exact visible error, not only “it failed”;
+- whether the same agent CLI works directly in a terminal;
+- whether restarting only the affected task changes the result.
+
+Never post API keys, OAuth callback URLs, bearer tokens, or the contents of secure credential files.
diff --git a/apps/docs/content/docs/troubleshooting/meta.json b/apps/docs/content/docs/troubleshooting/meta.json
new file mode 100644
index 000000000..212e90199
--- /dev/null
+++ b/apps/docs/content/docs/troubleshooting/meta.json
@@ -0,0 +1,5 @@
+{
+ "title": "Troubleshooting",
+ "icon": "Wrench",
+ "pages": ["index", "startup-and-ports", "updates", "connected-apps"]
+}
diff --git a/apps/docs/content/docs/troubleshooting/startup-and-ports.mdx b/apps/docs/content/docs/troubleshooting/startup-and-ports.mdx
new file mode 100644
index 000000000..d15038636
--- /dev/null
+++ b/apps/docs/content/docs/troubleshooting/startup-and-ports.mdx
@@ -0,0 +1,24 @@
+---
+title: App startup and ports
+description: Diagnose launch failures and local server conflicts.
+icon: Power
+---
+
+The Electron app starts a local harness and serves the interface from the same machine. The normal port is `8799`. If another process already owns it, packaged builds may select a fallback port automatically.
+
+## App opens but never becomes ready
+
+1. Quit every OpenMausBot window.
+2. Confirm no old OpenMausBot process remains.
+3. Start the app once and wait for the local harness.
+4. If it still fails, inspect the desktop log.
+
+On macOS, packaged logs are under `~/Library/Logs/OpenMausBot`. On Windows they are under the OpenMausBot log directory in `%APPDATA%`.
+
+## Development port overrides
+
+Use `OMB_PORT` for a source-run harness. A packaged desktop build owns its server lifecycle and may choose a fallback if the preferred port is unavailable.
+
+## Isolate a test profile
+
+Developers can set `OMB_DATA_DIR` to run against a clean OpenMausBot data directory. This is useful for reproduction and screenshots without touching a real workspace.
diff --git a/apps/docs/content/docs/troubleshooting/updates.mdx b/apps/docs/content/docs/troubleshooting/updates.mdx
new file mode 100644
index 000000000..669611cf1
--- /dev/null
+++ b/apps/docs/content/docs/troubleshooting/updates.mdx
@@ -0,0 +1,23 @@
+---
+title: Desktop updates
+description: Recover from a stuck download or restart and understand supported update paths.
+icon: RefreshCw
+---
+
+Automatic updates are available on macOS and Windows. Ubuntu packages are updated by installing a newly downloaded package.
+
+## The download keeps spinning
+
+Leave the app open long enough for one complete attempt, then quit and reopen it. A failed differential update should fall back to the full package. If the same release remains stuck, download the current installer from the [official releases repository](https://github.com/milind-soni/openmausbot-releases/releases/latest) and install it over the existing copy.
+
+## Restart to update does nothing
+
+Quit OpenMausBot completely and launch it again. If the version did not change, install the latest release manually. Your conversations and settings live outside the application bundle and are not removed by replacing the app.
+
+## Verify the installed version
+
+Open **App settings** and check the displayed version. A commit merged to `main` is not in the desktop app until a release workflow publishes a new version.
+
+
+ Do not install update files forwarded through chat or uploaded to an unrelated repository. Use the OpenMausBot releases repository and its checksums.
+
diff --git a/apps/docs/lib/layout.shared.tsx b/apps/docs/lib/layout.shared.tsx
new file mode 100644
index 000000000..b5d3c29ad
--- /dev/null
+++ b/apps/docs/lib/layout.shared.tsx
@@ -0,0 +1,19 @@
+import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared';
+import { BrandTitle } from '@/components/brand-title';
+import { gitConfig } from './shared';
+
+export function baseOptions(): BaseLayoutProps {
+ return {
+ nav: {
+ title: ,
+ url: '/docs',
+ transparentMode: 'none',
+ },
+ links: [
+ { text: 'Website', url: 'https://www.openmausbot.com', external: true },
+ { text: 'Changelog', url: '/docs/changelog' },
+ { type: 'button', text: 'Download', url: 'https://github.com/milind-soni/openmausbot-releases/releases/latest', external: true },
+ ],
+ githubUrl: `https://github.com/${gitConfig.user}/${gitConfig.repo}`,
+ };
+}
diff --git a/apps/docs/lib/shared.ts b/apps/docs/lib/shared.ts
new file mode 100644
index 000000000..a7ab12b07
--- /dev/null
+++ b/apps/docs/lib/shared.ts
@@ -0,0 +1,10 @@
+export const docsRoute = '/docs';
+export const docsImageRoute = '/og/docs';
+export const docsContentRoute = '/llms.mdx/docs';
+export const appName = 'OpenMausBot Docs';
+
+export const gitConfig = {
+ user: 'milind-soni',
+ repo: 'OpenMausBot',
+ branch: 'main',
+};
diff --git a/apps/docs/lib/source.ts b/apps/docs/lib/source.ts
new file mode 100644
index 000000000..1c4878ec0
--- /dev/null
+++ b/apps/docs/lib/source.ts
@@ -0,0 +1,45 @@
+import { loader } from 'fumadocs-core/source';
+import { lucideIconsPlugin } from 'fumadocs-core/source/lucide-icons';
+import { docsContentRoute, docsImageRoute, docsRoute } from './shared';
+import { defineDocs } from 'fumadocs-mdx/macro';
+import { metaSchema, pageSchema } from 'fumadocs-core/source/schema';
+
+const docs = defineDocs({
+ dir: 'content/docs',
+ docs: {
+ schema: pageSchema,
+ postprocess: {
+ includeProcessedMarkdown: true,
+ },
+ },
+ meta: {
+ schema: metaSchema,
+ },
+});
+
+export const source = loader({
+ baseUrl: docsRoute,
+ source: docs.toFumadocsSource(),
+ plugins: [lucideIconsPlugin()],
+});
+
+export function getPageImageUrl(page: (typeof source)['$inferPage']) {
+ const segments = [...page.slugs, 'image.png'];
+ return {
+ segments,
+ url: '/' + [page.locale, ...docsImageRoute.split('/'), ...segments].filter(Boolean).join('/'),
+ };
+}
+
+export function getPageMarkdownUrl(page: (typeof source)['$inferPage']) {
+ const segments = [...page.slugs, 'content.md'];
+ return {
+ segments,
+ url: '/' + [page.locale, ...docsContentRoute.split('/'), ...segments].filter(Boolean).join('/'),
+ };
+}
+
+export async function getLLMText(page: (typeof source)['$inferPage']) {
+ const processed = await page.data.getText('processed');
+ return `# ${page.data.title} (${page.url})\n\n${processed}`;
+}
diff --git a/apps/docs/next.config.mjs b/apps/docs/next.config.mjs
new file mode 100644
index 000000000..457dcf29d
--- /dev/null
+++ b/apps/docs/next.config.mjs
@@ -0,0 +1,10 @@
+import { createMDX } from 'fumadocs-mdx/next';
+
+const withMDX = createMDX();
+
+/** @type {import('next').NextConfig} */
+const config = {
+ reactStrictMode: true,
+};
+
+export default withMDX(config);
diff --git a/apps/docs/package.json b/apps/docs/package.json
new file mode 100644
index 000000000..74ce641aa
--- /dev/null
+++ b/apps/docs/package.json
@@ -0,0 +1,37 @@
+{
+ "name": "@openmausbot/docs",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "assets:sync": "node scripts/sync-assets.mjs",
+ "prebuild": "pnpm assets:sync",
+ "predev": "pnpm assets:sync",
+ "build": "next build",
+ "dev": "next dev",
+ "start": "next start",
+ "types:check": "next typegen && tsc --noEmit",
+ "lint": "oxlint .",
+ "preview": "next start"
+ },
+ "dependencies": {
+ "cnfast": "^0.1.0",
+ "fumadocs-core": "16.14.5",
+ "fumadocs-mdx": "15.3.0",
+ "fumadocs-ui": "npm:@fumadocs/base-ui@16.14.5",
+ "lucide-react": "^1.31.0",
+ "next": "16.3.2",
+ "react": "^19.2.8",
+ "react-dom": "^19.2.8"
+ },
+ "devDependencies": {
+ "@tailwindcss/postcss": "^4.3.3",
+ "@types/mdx": "^2.0.14",
+ "@types/node": "^26.2.0",
+ "@types/react": "^19.2.18",
+ "@types/react-dom": "^19.2.4",
+ "oxlint": "^1.78.0",
+ "postcss": "^8.5.26",
+ "tailwindcss": "^4.3.3",
+ "typescript": "^6.0.3"
+ }
+}
diff --git a/apps/docs/postcss.config.mjs b/apps/docs/postcss.config.mjs
new file mode 100644
index 000000000..297374d80
--- /dev/null
+++ b/apps/docs/postcss.config.mjs
@@ -0,0 +1,7 @@
+const config = {
+ plugins: {
+ '@tailwindcss/postcss': {},
+ },
+};
+
+export default config;
diff --git a/apps/docs/scripts/sync-assets.mjs b/apps/docs/scripts/sync-assets.mjs
new file mode 100644
index 000000000..e8e50669b
--- /dev/null
+++ b/apps/docs/scripts/sync-assets.mjs
@@ -0,0 +1,16 @@
+import { copyFile, mkdir, readdir } from 'node:fs/promises';
+import { fileURLToPath } from 'node:url';
+
+const screenshotsSource = fileURLToPath(new URL('../../../docs/screenshots/', import.meta.url));
+const screenshotsTarget = fileURLToPath(new URL('../public/screenshots/', import.meta.url));
+const iconSource = fileURLToPath(new URL('../../../public/app-icon.svg', import.meta.url));
+const iconTarget = fileURLToPath(new URL('../public/app-icon.svg', import.meta.url));
+
+await mkdir(screenshotsTarget, { recursive: true });
+
+for (const name of await readdir(screenshotsSource)) {
+ if (!/\.(png|jpe?g|webp)$/i.test(name)) continue;
+ await copyFile(`${screenshotsSource}/${name}`, `${screenshotsTarget}/${name}`);
+}
+
+await copyFile(iconSource, iconTarget);
diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json
new file mode 100644
index 000000000..d1006d700
--- /dev/null
+++ b/apps/docs/tsconfig.json
@@ -0,0 +1,30 @@
+{
+ "compilerOptions": {
+ "target": "ESNext",
+ "lib": ["dom", "dom.iterable", "esnext"],
+ "allowJs": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "forceConsistentCasingInFileNames": true,
+ "noEmit": true,
+ "esModuleInterop": true,
+ "module": "esnext",
+ "moduleResolution": "bundler",
+ "resolveJsonModule": true,
+ "isolatedModules": true,
+ "jsx": "react-jsx",
+ "incremental": true,
+ "paths": {
+ "@/*": ["./*"]
+ },
+ "plugins": [{ "name": "next" }]
+ },
+ "include": [
+ "next-env.d.ts",
+ "**/*.ts",
+ "**/*.tsx",
+ ".next/types/**/*.ts",
+ ".next/dev/types/**/*.ts"
+ ],
+ "exclude": ["node_modules"]
+}
diff --git a/docs/screenshots/docs-automations.png b/docs/screenshots/docs-automations.png
new file mode 100644
index 000000000..5c449afd3
Binary files /dev/null and b/docs/screenshots/docs-automations.png differ
diff --git a/docs/screenshots/docs-computer-panel.png b/docs/screenshots/docs-computer-panel.png
new file mode 100644
index 000000000..6bc7d24c6
Binary files /dev/null and b/docs/screenshots/docs-computer-panel.png differ
diff --git a/docs/screenshots/docs-connected-apps.png b/docs/screenshots/docs-connected-apps.png
new file mode 100644
index 000000000..abfd0d995
Binary files /dev/null and b/docs/screenshots/docs-connected-apps.png differ
diff --git a/docs/screenshots/docs-engine-detection.png b/docs/screenshots/docs-engine-detection.png
new file mode 100644
index 000000000..3c5d7c0de
Binary files /dev/null and b/docs/screenshots/docs-engine-detection.png differ
diff --git a/docs/screenshots/docs-fresh-bot.png b/docs/screenshots/docs-fresh-bot.png
new file mode 100644
index 000000000..c30b7df38
Binary files /dev/null and b/docs/screenshots/docs-fresh-bot.png differ
diff --git a/docs/screenshots/docs-model-picker.png b/docs/screenshots/docs-model-picker.png
new file mode 100644
index 000000000..87bf5d2f5
Binary files /dev/null and b/docs/screenshots/docs-model-picker.png differ
diff --git a/docs/screenshots/docs-onboarding.png b/docs/screenshots/docs-onboarding.png
new file mode 100644
index 000000000..cb22652fb
Binary files /dev/null and b/docs/screenshots/docs-onboarding.png differ
diff --git a/package.json b/package.json
index 38f940417..29d66525e 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,9 @@
"lint": "oxlint .",
"check:contrast": "node scripts/check-contrast.mjs",
"dev": "vite",
+ "docs:dev": "pnpm --filter @openmausbot/docs dev",
+ "docs:build": "pnpm --filter @openmausbot/docs build",
+ "docs:preview": "pnpm --filter @openmausbot/docs preview",
"companion": "node --experimental-strip-types companion/src/index.ts",
"dev:server": "node --experimental-strip-types server/index.ts",
"dev:desktop": "electron .",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c87fc3ddc..34a60a829 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -50,7 +50,7 @@ importers:
version: 1.78.0
'@tailwindcss/vite':
specifier: ^4.1.11
- version: 4.3.3(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))
+ version: 4.3.3(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))
'@types/node':
specifier: ^26.2.0
version: 26.2.0
@@ -62,7 +62,7 @@ importers:
version: 19.2.4(@types/react@19.2.18)
'@vitejs/plugin-react':
specifier: ^4.7.0
- version: 4.7.0(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))
+ version: 4.7.0(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))
electron:
specifier: ^43.4.0
version: 43.4.0
@@ -86,16 +86,75 @@ importers:
version: 5.9.3
vite:
specifier: ^7.1.0
- version: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)
+ version: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
vitest:
specifier: ^4.1.10
- version: 4.1.10(@types/node@26.2.0)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))
+ version: 4.1.10(@types/node@26.2.0)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))
wrangler:
specifier: 4.123.0
version: 4.123.0(@cloudflare/workers-types@5.20260818.1)
+ apps/docs:
+ dependencies:
+ cnfast:
+ specifier: ^0.1.0
+ version: 0.1.0
+ fumadocs-core:
+ specifier: 16.14.5
+ version: 16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)
+ fumadocs-mdx:
+ specifier: 15.3.0
+ version: 15.3.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))
+ fumadocs-ui:
+ specifier: npm:@fumadocs/base-ui@16.14.5
+ version: '@fumadocs/base-ui@16.14.5(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.3.3)'
+ lucide-react:
+ specifier: ^1.31.0
+ version: 1.33.0(react@19.2.8)
+ next:
+ specifier: 16.3.2
+ version: 16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react:
+ specifier: ^19.2.8
+ version: 19.2.8
+ react-dom:
+ specifier: ^19.2.8
+ version: 19.2.8(react@19.2.8)
+ devDependencies:
+ '@tailwindcss/postcss':
+ specifier: ^4.3.3
+ version: 4.3.3
+ '@types/mdx':
+ specifier: ^2.0.14
+ version: 2.0.14
+ '@types/node':
+ specifier: ^26.2.0
+ version: 26.2.0
+ '@types/react':
+ specifier: ^19.2.18
+ version: 19.2.18
+ '@types/react-dom':
+ specifier: ^19.2.4
+ version: 19.2.4(@types/react@19.2.18)
+ oxlint:
+ specifier: ^1.78.0
+ version: 1.78.0
+ postcss:
+ specifier: ^8.5.26
+ version: 8.5.26
+ tailwindcss:
+ specifier: ^4.3.3
+ version: 4.3.3
+ typescript:
+ specifier: ^6.0.3
+ version: 6.0.3
+
packages:
+ '@alloc/quick-lru@5.2.0':
+ resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==}
+ engines: {node: '>=10'}
+
'@babel/code-frame@7.29.7':
resolution: {integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==}
engines: {node: '>=6.9.0'}
@@ -167,6 +226,10 @@ packages:
peerDependencies:
'@babel/core': ^7.0.0-0
+ '@babel/runtime@7.29.7':
+ resolution: {integrity: sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==}
+ engines: {node: '>=6.9.0'}
+
'@babel/template@7.29.7':
resolution: {integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==}
engines: {node: '>=6.9.0'}
@@ -179,6 +242,33 @@ packages:
resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
+ '@base-ui/react@1.7.0':
+ resolution: {integrity: sha512-j+8QjX44C32jrXD/qyEAGpFr70FRpGL2CY61mQd9nBPWN737CK0xxD1ceJ055rW4RtdvFDT1e7otzdlfxvsYug==}
+ engines: {node: '>=14.0.0'}
+ peerDependencies:
+ '@date-fns/tz': ^1.2.0
+ '@types/react': ^17 || ^18 || ^19
+ date-fns: ^4.0.0
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@date-fns/tz':
+ optional: true
+ '@types/react':
+ optional: true
+ date-fns:
+ optional: true
+
+ '@base-ui/utils@0.3.2':
+ resolution: {integrity: sha512-oWy1aq/I2GmYjpl4PhEAhzflF8VPGKgZeq0xAWTbfD5KBWyxcN0ZP2+WHSUm/5Z6lVMBDLReLcoXwSYoRc/zNQ==}
+ peerDependencies:
+ '@types/react': ^17 || ^18 || ^19
+ react: ^17 || ^18 || ^19
+ react-dom: ^17 || ^18 || ^19
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
'@cloudflare/kv-asset-handler@0.5.0':
resolution: {integrity: sha512-jxQYkj8dSIzc0cD6cMMNdOc1UVjqSqu8BZdor5s8cGjW2I8BjODt/kWPVdY+u9zj3ms75Q5qaZgnxUad83+eAg==}
engines: {node: '>=22.0.0'}
@@ -588,6 +678,62 @@ packages:
cpu: [x64]
os: [win32]
+ '@floating-ui/core@1.8.0':
+ resolution: {integrity: sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==}
+
+ '@floating-ui/dom@1.8.0':
+ resolution: {integrity: sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==}
+
+ '@floating-ui/react-dom@2.1.9':
+ resolution: {integrity: sha512-JDjEFGCpImxDCA7JJKviA0M9+RtmJdj0m/NVU5IMgBK+AmZouAQQ7/+2GLH0GXXY0YMw9oXPB8hKdbPYg5QLYg==}
+ peerDependencies:
+ react: '>=16.8.0'
+ react-dom: '>=16.8.0'
+
+ '@floating-ui/utils@0.2.12':
+ resolution: {integrity: sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==}
+
+ '@fuma-translate/react@1.0.2':
+ resolution: {integrity: sha512-uOiOtBx3nRXR8Nu1GzBf1tApgF1FErDBTHxRIAQeyQdyOoZbrNRN6H4kDCWObY4qyGeGbHydG0DHzgeUgFDMIw==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@fumadocs/base-ui@16.14.5':
+ resolution: {integrity: sha512-QDKcfAWpR3x5C3PDkU+MV6o5rsFdhh8lc12cFVixcFAEecUjPatNfWf/ShDXBls27z32E0PfaYJi0Sg53zPJRg==}
+ peerDependencies:
+ '@types/mdx': '*'
+ '@types/react': '*'
+ fumadocs-core: 16.14.5
+ next: 16.x.x
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ takumi-js: '*'
+ peerDependenciesMeta:
+ '@types/mdx':
+ optional: true
+ '@types/react':
+ optional: true
+ next:
+ optional: true
+ takumi-js:
+ optional: true
+
+ '@fumadocs/tailwind@0.1.1':
+ resolution: {integrity: sha512-BnPe52UxSaG8yKlHMKBxXw8h6GpK5qO55ci6+Qd5JnquTvIw6SpfbC1P+qAi82PuPWv1KZAWY8bxRk4+x9ctXw==}
+ peerDependencies:
+ tailwindcss: ^4.0.0
+ peerDependenciesMeta:
+ tailwindcss:
+ optional: true
+
+ '@fumari/image-size@0.1.0':
+ resolution: {integrity: sha512-x2o9u6P8uKUK15B8XgEoRhR3PgLoLSbQKK6FUCd14JzumEw+e8FXZPelij/dZ4VQVMp4r61VD3DcvSo3aEhLAA==}
+
'@img/colour@1.1.0':
resolution: {integrity: sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==}
engines: {node: '>=18'}
@@ -598,75 +744,150 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@img/sharp-darwin-arm64@0.35.3':
+ resolution: {integrity: sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [darwin]
+
'@img/sharp-darwin-x64@0.35.2':
resolution: {integrity: sha512-BaktuGPCeHJMARpodR8jK4uKiZrPAy9WrfQW0sdI37clracq8Bp01AYS3SZgi5FS/y5twa9t4+LIuuxQjqRrWw==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [darwin]
+ '@img/sharp-darwin-x64@0.35.3':
+ resolution: {integrity: sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [darwin]
+
'@img/sharp-freebsd-wasm32@0.35.2':
resolution: {integrity: sha512-YoAxdnd8hPUkvLHd3bWY+YA8nw3xM/RyRopYucNsWHVSan8NLVM3X2volsfoRDcXdUJPg6tXahSd7HXPK7lRnw==}
engines: {node: '>=20.9.0'}
os: [freebsd]
+ '@img/sharp-freebsd-wasm32@0.35.3':
+ resolution: {integrity: sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==}
+ engines: {node: '>=20.9.0'}
+ os: [freebsd]
+
'@img/sharp-libvips-darwin-arm64@1.3.1':
resolution: {integrity: sha512-4V/M3roRMTYjiwZY9IOVQOE8OyeCxFAkYmyZDrZl51uOKjibm3oeEJ4WAmLxutAfzFbC9jqUiPs2gbnGflH+7g==}
cpu: [arm64]
os: [darwin]
+ '@img/sharp-libvips-darwin-arm64@1.3.2':
+ resolution: {integrity: sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==}
+ cpu: [arm64]
+ os: [darwin]
+
'@img/sharp-libvips-darwin-x64@1.3.1':
resolution: {integrity: sha512-c0/DxItpJv2+dGhgycJBBgotdqruGYDvA79drdh0MD1dFpy7JzJ/PlXwi1H4rFf0eTy8tgbI91aHDnZIceY3jQ==}
cpu: [x64]
os: [darwin]
+ '@img/sharp-libvips-darwin-x64@1.3.2':
+ resolution: {integrity: sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==}
+ cpu: [x64]
+ os: [darwin]
+
'@img/sharp-libvips-linux-arm64@1.3.1':
resolution: {integrity: sha512-JznefmcK9j1JKPz8AkQDh89kjojubyfOasWBPKfzMIhPwsgDy9evpE/naJTXXXmghS1iFwR8u/kTwh/I2/+GCw==}
cpu: [arm64]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-arm64@1.3.2':
+ resolution: {integrity: sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-arm@1.3.1':
resolution: {integrity: sha512-aGGy9aWzXgHBG7HNyQPWorZthlp7+x6fDRoPAQbGO3ThcttuTyKIx3NuSHb6zb4gBNq6/yNn9f1cy9nFKS/Vmg==}
cpu: [arm]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-arm@1.3.2':
+ resolution: {integrity: sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-ppc64@1.3.1':
resolution: {integrity: sha512-1EkwGNCZk6iWNCMWqrvdJ+r1j0PT1zIz60CNPhYnJlK/zyeWqlsPZIe+ocBVqPF8k/Ssee/NCk+tE9Ryrko6ng==}
cpu: [ppc64]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-ppc64@1.3.2':
+ resolution: {integrity: sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-riscv64@1.3.1':
resolution: {integrity: sha512-Ilays+w2bXdnxzxtQdmXR62u8o8GYa3eL4+Gr+1KiE4xperMZUslRaVPJwwPkzlHEjGfXAfRVAa/7CYCtSqsBw==}
cpu: [riscv64]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-riscv64@1.3.2':
+ resolution: {integrity: sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-s390x@1.3.1':
resolution: {integrity: sha512-VfBwVHQTbRoj4XlpA/KLZ7ltgMpz+4WSejFzQ+GnoImjo1PtEJ59QB2qR1xQEeRPYIkNrPIm2L4cICMvz4C2ew==}
cpu: [s390x]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-s390x@1.3.2':
+ resolution: {integrity: sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linux-x64@1.3.1':
resolution: {integrity: sha512-+c8ukgwU62DS54nCAjw7keOfHUkmr0B5QHEdcOqRnodF/MNXJbVI8Eopoj4B/0H8Asr65I+A4Amrn7a85/md6A==}
cpu: [x64]
os: [linux]
libc: [glibc]
+ '@img/sharp-libvips-linux-x64@1.3.2':
+ resolution: {integrity: sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-libvips-linuxmusl-arm64@1.3.1':
resolution: {integrity: sha512-qlKb/pwbkAi1WMsJrYHk7CuDrd12s27U2QnRhFYUoJNrRCmkosMTttuRFat/DDB3IlDm5qE1TJgZ4JDnHX8Ldw==}
cpu: [arm64]
os: [linux]
libc: [musl]
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.2':
+ resolution: {integrity: sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-libvips-linuxmusl-x64@1.3.1':
resolution: {integrity: sha512-yO21HwoUVLN8Qa+/SBjQLMYwBWAVJjeGPNe+hc0OUeMeifEtJqu5a1c4HayE1nNpDih9y3/KkoltfkDodmKAlg==}
cpu: [x64]
os: [linux]
libc: [musl]
+ '@img/sharp-libvips-linuxmusl-x64@1.3.2':
+ resolution: {integrity: sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-linux-arm64@0.35.2':
resolution: {integrity: sha512-af12Pnd0ZGu2HfP8NayB0kk6eC/lrfbQE6HlR4jD+34wdJ1Vw9TF6TMn6ZvffT+WgqVsl0hRbmNvz2u/23VmwA==}
engines: {node: '>=20.9.0'}
@@ -674,6 +895,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-arm64@0.35.3':
+ resolution: {integrity: sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-arm@0.35.2':
resolution: {integrity: sha512-SE4kzF2mepn6z+6E7L6lsV8FzuLL6IPQdyX8ZiwROAG/G8td+hP/m7FsFPwidtrF19gvajuC9l6TxAVcsA4S7A==}
engines: {node: '>=20.9.0'}
@@ -681,6 +909,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-arm@0.35.3':
+ resolution: {integrity: sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-ppc64@0.35.2':
resolution: {integrity: sha512-hYSBm7zcNtDCozCxQHYZJiu63b/bXsgRZuOxCIBZsStMM9Vap47iFHdbX4kCvQsblPB/k+clhELpdQJHQLSHvg==}
engines: {node: '>=20.9.0'}
@@ -688,6 +923,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-ppc64@0.35.3':
+ resolution: {integrity: sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [ppc64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-riscv64@0.35.2':
resolution: {integrity: sha512-qQt0Kc13+Hoan/Awq/qMSQw3L+RI1NCRPgD5cUJ/1WSSmIoysLOc72jlRM3E0OHN9Yr313jgeQ2T+zW+F03QFA==}
engines: {node: '>=20.9.0'}
@@ -695,6 +937,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-riscv64@0.35.3':
+ resolution: {integrity: sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==}
+ engines: {node: '>=20.9.0'}
+ cpu: [riscv64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-s390x@0.35.2':
resolution: {integrity: sha512-E4fLLfRPzDLlEeDaTzI98OFLcv++WL5ChLLMwPoVd0CIoZQqupBSNbOisPL5am9XsbQ9T84+iiMpUvbFtkunbA==}
engines: {node: '>=20.9.0'}
@@ -702,6 +951,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-s390x@0.35.3':
+ resolution: {integrity: sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==}
+ engines: {node: '>=20.9.0'}
+ cpu: [s390x]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linux-x64@0.35.2':
resolution: {integrity: sha512-gi0zFJJRLswfCZmHtJdikXPOc5u7qamSOS3NHedLqLd4W8Q0NqjdBr6TTRIgsfFjqfTsHFgdfvJ9LwqSgcHiAA==}
engines: {node: '>=20.9.0'}
@@ -709,6 +965,13 @@ packages:
os: [linux]
libc: [glibc]
+ '@img/sharp-linux-x64@0.35.3':
+ resolution: {integrity: sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
'@img/sharp-linuxmusl-arm64@0.35.2':
resolution: {integrity: sha512-siWbOW1u6HFnFLrp0waKyW7VEf7jYvcDWdrXEFa8AkdAQgEvuu5Fz8/Y70w9EeqAdwDtfU012BhEHHaDqvQNzg==}
engines: {node: '>=20.9.0'}
@@ -716,6 +979,13 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-linuxmusl-arm64@0.35.3':
+ resolution: {integrity: sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-linuxmusl-x64@0.35.2':
resolution: {integrity: sha512-YBqMMcjDi4QGYiSn4vNOYBhmlC4z5AXqkOUUqI2e0AFA4urNv4ESgOgwNl3K+4etQhha0twXlzeF20bbULm9Yg==}
engines: {node: '>=20.9.0'}
@@ -723,33 +993,67 @@ packages:
os: [linux]
libc: [musl]
+ '@img/sharp-linuxmusl-x64@0.35.3':
+ resolution: {integrity: sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
'@img/sharp-wasm32@0.35.2':
resolution: {integrity: sha512-Mrv4JQNYVQ94xH+jzZ9r+gowleN8mv2FTgKT+PI6bx5C0G8TdNYndu161pg2i7uoBwxy2ImPMHrJOM2LZef7Bw==}
engines: {node: '>=20.9.0'}
+ '@img/sharp-wasm32@0.35.3':
+ resolution: {integrity: sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==}
+ engines: {node: '>=20.9.0'}
+
'@img/sharp-webcontainers-wasm32@0.35.2':
resolution: {integrity: sha512-QNV27pxs9wpApEiCfvHM1RDoP1w1+2KrUWWDPEhEwg+latvOrfuhWrHWZKwdSFwU6jh3myjw/yOCRsUIuOft3g==}
engines: {node: '>=20.9.0'}
cpu: [wasm32]
+ '@img/sharp-webcontainers-wasm32@0.35.3':
+ resolution: {integrity: sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==}
+ engines: {node: '>=20.9.0'}
+ cpu: [wasm32]
+
'@img/sharp-win32-arm64@0.35.2':
resolution: {integrity: sha512-BiVRYc/t6/Vl3e1hBx0hugG4oN9Pydf4fgMSpxTQJmwGUg/YoXTWHiFeRymHfCZzifxu4F4rpk/I67D0LQ20wQ==}
engines: {node: '>=20.9.0'}
cpu: [arm64]
os: [win32]
+ '@img/sharp-win32-arm64@0.35.3':
+ resolution: {integrity: sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==}
+ engines: {node: '>=20.9.0'}
+ cpu: [arm64]
+ os: [win32]
+
'@img/sharp-win32-ia32@0.35.2':
resolution: {integrity: sha512-YYEhx9PImCC7T0tI8JDMi4DB9LwLCXCU5OWNYEXAxh5Q1ShKkyC6byxzoBJ3gEFDnH2lQckWuDe70G7mB2XJog==}
engines: {node: ^20.9.0}
cpu: [ia32]
os: [win32]
+ '@img/sharp-win32-ia32@0.35.3':
+ resolution: {integrity: sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==}
+ engines: {node: ^20.9.0}
+ cpu: [ia32]
+ os: [win32]
+
'@img/sharp-win32-x64@0.35.2':
resolution: {integrity: sha512-imoOyBcoM/iiUr4J6VPpCNjPnjvP/Gks95898yB8YqoGGYmHYbOyCuNv9FMhFgtaiHFGbHW8bxKqRV6VjtXThQ==}
engines: {node: '>=20.9.0'}
cpu: [x64]
os: [win32]
+ '@img/sharp-win32-x64@0.35.3':
+ resolution: {integrity: sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==}
+ engines: {node: '>=20.9.0'}
+ cpu: [x64]
+ os: [win32]
+
'@isaacs/fs-minipass@4.0.1':
resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==}
engines: {node: '>=18.0.0'}
@@ -764,6 +1068,9 @@ packages:
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
+ '@jridgewell/source-map@0.3.11':
+ resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==}
+
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
@@ -781,6 +1088,9 @@ packages:
resolution: {integrity: sha512-9QOtNffcOF/c1seMCDnjckb3R9WHcG34tky+FHpNKKCW0wc/scYLwMtO+ptyGUfMW0/b/n4qRiALlaFHc9Oj7Q==}
engines: {node: '>= 10.0.0'}
+ '@mdx-js/mdx@3.1.1':
+ resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==}
+
'@napi-rs/lzma-linux-x64-gnu@1.5.1':
resolution: {integrity: sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==}
engines: {node: ^22.20 || ^24.12 || >=25}
@@ -788,6 +1098,61 @@ packages:
os: [linux]
libc: [glibc]
+ '@next/env@16.3.2':
+ resolution: {integrity: sha512-8k4YoG8cM7LWlkfzGNYCRBbFNlernLiMw4s0btVl+CmmWqn3VpYypA72/5Feb1UWdxe6tHqr5KHP4p4Y4m9luA==}
+
+ '@next/swc-darwin-arm64@16.3.2':
+ resolution: {integrity: sha512-ib5Llm93YCKoKWDh6ZaHq6QWTuOZ2bRkSnUwMmX8dsRIOkBNL1vVlSiUKSfixPL9SSh9pvukzqajk/klkn5vqg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@next/swc-darwin-x64@16.3.2':
+ resolution: {integrity: sha512-qd98fX2+I5nYJDioW2o7nSjoxM5KvWdeDefM80igia4+C/qSIEhH4MhTE+hO/7qKM7W37/Mq+dOWp8UePSyLHw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@next/swc-linux-arm64-gnu@16.3.2':
+ resolution: {integrity: sha512-vqsgb6FAOzcrCccsLXiKtAy5t8EzO+uOazuFaSkQxeY0tNONG3vpHYy8pyBafcI5SNFPTeyard6yTr6SzNGo2A==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-arm64-musl@16.3.2':
+ resolution: {integrity: sha512-xIe1eujfHUB2XcxHGddxJyu6TJRPjC5NpIkQYB/32ESkt5VkQyIAjmLRS38c+s6QY+qjtY/4KarVDzXRuD7lZQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-linux-x64-gnu@16.3.2':
+ resolution: {integrity: sha512-Fe0SA2j8X0kmc3aveuHD7UktO3AE2+mH3LguP60vGbz7u0z+MrDXbeb5iZFYAwR7EzzzXJ2Yk966w9mGTFMqfA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@next/swc-linux-x64-musl@16.3.2':
+ resolution: {integrity: sha512-TFBipb+gyesI/2Ve4zVu7kGltBWN/R466G5/1gtt2lECfc22G1pjkTxu68Q9aFcOaXiRGTQfvDbQQFe7mYgxiQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@next/swc-win32-arm64-msvc@16.3.2':
+ resolution: {integrity: sha512-rVtmnNpBYIosDnKD/96dKxFsJnwnn1WRGG/HioSe8XCm2ksSHNrd2R6+hSjvTBxeMNhJ9pYeu/90cWB1nQLuNA==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [win32]
+
+ '@next/swc-win32-x64-msvc@16.3.2':
+ resolution: {integrity: sha512-H4Y2o2/JcHu8LtwzD5CXfHhwxwz8gfsx2HXDEw46Mtev5xHnEmB7HNtZtmriw5ReUOjRtcDqo7XSbU01FT9NlA==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
'@noble/hashes@1.4.0':
resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==}
engines: {node: '>= 16'}
@@ -1140,6 +1505,9 @@ packages:
'@standard-schema/spec@1.1.0':
resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==}
+ '@swc/helpers@0.5.23':
+ resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
+
'@szmarczak/http-timer@4.0.6':
resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==}
engines: {node: '>=10'}
@@ -1233,6 +1601,9 @@ packages:
resolution: {integrity: sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==}
engines: {node: '>= 20'}
+ '@tailwindcss/postcss@4.3.3':
+ resolution: {integrity: sha512-JTSZZGQi1AyKirbLN3azmjVzef92tcX7h+iSqPdaeStyFpGpDlKvvpxeOE8njhbUanbRwr3z8DyzhICWnMtQeg==}
+
'@tailwindcss/vite@4.3.3':
resolution: {integrity: sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==}
peerDependencies:
@@ -1318,6 +1689,9 @@ packages:
'@types/mdast@4.0.4':
resolution: {integrity: sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==}
+ '@types/mdx@2.0.14':
+ resolution: {integrity: sha512-T48PeuJtvLosNTPVhfnIp3i/n3a4g4Bad7YCq5k64D4u7NwDrAotikQ+5+sjtUvBmxCMlbo3dVL+C2dP0rWHzg==}
+
'@types/ms@2.1.0':
resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==}
@@ -1439,10 +1813,89 @@ packages:
resolution: {integrity: sha512-KRYzxepc14G/CEpEGc3Yn+JKaAeT63smlDr+vjB8jRfgTBBI9wRj/nkQEO+ucV8p8I9bfKLWp37uHgFrbntPvw==}
engines: {node: '>=10.0.0'}
+ '@yuku-analyzer/binding-android-arm64@0.8.7':
+ resolution: {integrity: sha512-pzJ++UMCZEV4s6SP3Ryvj+snWP8s7aTXFkSXRyeBF4RSALftPzfqYssHdGOmOH2QnRAtyOhhg64tdjeSGJvYRg==}
+ cpu: [arm64]
+ os: [android]
+
+ '@yuku-analyzer/binding-darwin-arm64@0.8.7':
+ resolution: {integrity: sha512-vymR7Us3i/HJvUxA1N5sKCrrn2mXw/Xvzbt66zlRyGPDmkUzFCrn34OqodR/zctmD1JhaFlv+Ur6xNNPRIid/w==}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@yuku-analyzer/binding-darwin-x64@0.8.7':
+ resolution: {integrity: sha512-aX1xy6wJeI2QN/ipu9B6/dzz6RmHQ5+Ty6uyf9csqYZDnY4/U2GsDskYQIRysc2Cuh+GNnvuO5xCXxiqkmVEcw==}
+ cpu: [x64]
+ os: [darwin]
+
+ '@yuku-analyzer/binding-freebsd-x64@0.8.7':
+ resolution: {integrity: sha512-5LT2KkjK0zBI2s3VoSyGPSs9Ey7rWPxWkCyFgZXoszQOkAk2z0biP+DLzb9zw6flmwwCCiyeZRqM65srfo8l1Q==}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@yuku-analyzer/binding-linux-arm-gnu@0.8.7':
+ resolution: {integrity: sha512-4haNlVk624QoNSKIneoH9JKu5SvfD+Hkxg490HUS5pfFuWwoXT3zOmAdfwPMsSH0bNIkFO7GqtwDZ9EVpyzepw==}
+ cpu: [arm]
+ os: [linux]
+ libc: [glibc]
+
+ '@yuku-analyzer/binding-linux-arm-musl@0.8.7':
+ resolution: {integrity: sha512-7HwJHVFtrufB5qHHL1PSDPr/j6uoNLwbwxa04QzsbpcbbzfDUbT37loHPu5u0NuetRUlV+TqXDlX6OpXcM8hKQ==}
+ cpu: [arm]
+ os: [linux]
+ libc: [musl]
+
+ '@yuku-analyzer/binding-linux-arm64-gnu@0.8.7':
+ resolution: {integrity: sha512-yUEgxEPuDVBO+nkDw8qbssYA8oHu82Q0da+C7rGyVplmjlKa5DhBnMMagTEjFZx4jNDVWnGHJreUCSeGL0x/gQ==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [glibc]
+
+ '@yuku-analyzer/binding-linux-arm64-musl@0.8.7':
+ resolution: {integrity: sha512-2X7EwxPbgdNRqgMwtxOnNOGEmdm1RS8PD2Q5cOxj8cEZD4fy7yHHeSDoEdBOyrJtHzbG6jQB6CeReO1okb/S7Q==}
+ cpu: [arm64]
+ os: [linux]
+ libc: [musl]
+
+ '@yuku-analyzer/binding-linux-x64-gnu@0.8.7':
+ resolution: {integrity: sha512-k/iQFK1gAvaHLzXXZ3/+g48wT5YB6MfikPb+juGCd9HzyPMUSBCy44rz6nT+xoWnnxmBoeBUywA4CvWCWZFTtg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [glibc]
+
+ '@yuku-analyzer/binding-linux-x64-musl@0.8.7':
+ resolution: {integrity: sha512-gTfYHx3cg8FERTYsg1dQrQFTutcWJ7wTp8YToyAJnZMbUCkcyuwUiWNYaEHyF0xIb+PsG7HfD+BLWhRRom5qKg==}
+ cpu: [x64]
+ os: [linux]
+ libc: [musl]
+
+ '@yuku-analyzer/binding-win32-arm64@0.8.7':
+ resolution: {integrity: sha512-XDCWZZztOvdTtPNaU5EzrrV0dmMugdZ+Qdq5INeiGhGW5hD0TuCBIIXK7wTmRM6NcKarGlyBP5SYkiAuw6+slg==}
+ cpu: [arm64]
+ os: [win32]
+
+ '@yuku-analyzer/binding-win32-x64@0.8.7':
+ resolution: {integrity: sha512-VtSH1pWuk3bo+BiUAtzYa4Ku1r/10CO14QvkGpRhDcFck8sIf7ox+wiucyKNKcf+srWCYxR1hO+wn5N3BdtFdw==}
+ cpu: [x64]
+ os: [win32]
+
+ '@yuku-toolchain/types@0.8.7':
+ resolution: {integrity: sha512-2Z53dNxAJL6UvFoIrDZvYf3zlO8s4VJK4O2hhaB4mXVwwpX/7ajtss3cmfqKvamlNLWyt9FSWs4eoYdlbxpnHA==}
+
abbrev@4.0.0:
resolution: {integrity: sha512-a1wflyaL0tHtJSmLSOVybYhy22vRih4eduhhrkcjgrWGnRfrZtovJ2FRjxuTtkkj47O/baf0R86QU5OuYpz8fA==}
engines: {node: ^20.17.0 || >=22.9.0}
+ acorn-jsx@5.3.2:
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ acorn@8.18.0:
+ resolution: {integrity: sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
agent-base@7.1.4:
resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
engines: {node: '>= 14'}
@@ -1476,6 +1929,10 @@ packages:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
engines: {node: '>=12'}
+ astring@1.9.0:
+ resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
+ hasBin: true
+
async-exit-hook@2.0.1:
resolution: {integrity: sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==}
engines: {node: '>=0.12.0'}
@@ -1589,6 +2046,10 @@ packages:
character-reference-invalid@2.0.1:
resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
+ chokidar@5.0.0:
+ resolution: {integrity: sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==}
+ engines: {node: '>= 20.19.0'}
+
chownr@3.0.0:
resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==}
engines: {node: '>=18'}
@@ -1604,6 +2065,12 @@ packages:
resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==}
engines: {node: '>=8'}
+ class-variance-authority@0.7.1:
+ resolution: {integrity: sha512-Ka+9Trutv7G8M6WT6SeiRWz792K5qEqIGEGzXKhAE6xOWAY6pPH8U+9IY3oCMv6kqTmLsv7Xh/2w2RigkePMsg==}
+
+ client-only@0.0.1:
+ resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
+
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@@ -1615,7 +2082,14 @@ packages:
resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==}
engines: {node: '>=6'}
- color-convert@2.0.1:
+ cnfast@0.1.0:
+ resolution: {integrity: sha512-rH0jBKeLkVrK7NsZ5Ba2l7WdMBmm1k0FMpABeXUU1PgTUxbz3261gEuCSsrYuXo4BwAe3yCcIbQ93YyS52lOGQ==}
+ hasBin: true
+
+ collapse-white-space@2.1.0:
+ resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
+
+ color-convert@2.0.1:
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
engines: {node: '>=7.0.0'}
@@ -1629,6 +2103,9 @@ packages:
comma-separated-tokens@2.0.3:
resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==}
+ commander@2.20.3:
+ resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
commander@5.1.0:
resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
engines: {node: '>= 6'}
@@ -1641,6 +2118,9 @@ packages:
resolution: {integrity: sha512-pJDh5/4wrEnXX/VWRZvruAGHkzKdr46z11OlTPN+VrATlWWhSKewNCJ1futCO5C7eJB3nPMFZA1LeYtcFboZ2A==}
engines: {node: '>=0.10.0'}
+ compute-scroll-into-view@3.1.1:
+ resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==}
+
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
@@ -1707,6 +2187,9 @@ packages:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
+ detect-node-es@1.1.0:
+ resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==}
+
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
@@ -1778,6 +2261,10 @@ packages:
resolution: {integrity: sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==}
engines: {node: '>=10.13.0'}
+ entities@6.0.1:
+ resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
+ engines: {node: '>=0.12'}
+
env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
engines: {node: '>=6'}
@@ -1814,6 +2301,12 @@ packages:
es6-error@4.1.1:
resolution: {integrity: sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==}
+ esast-util-from-estree@2.0.0:
+ resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
+
+ esast-util-from-js@2.0.1:
+ resolution: {integrity: sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==}
+
esbuild@0.28.1:
resolution: {integrity: sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==}
engines: {node: '>=18'}
@@ -1836,9 +2329,27 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
+ estree-util-attach-comments@3.0.0:
+ resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==}
+
+ estree-util-build-jsx@3.0.1:
+ resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==}
+
estree-util-is-identifier-name@3.0.0:
resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==}
+ estree-util-scope@1.0.0:
+ resolution: {integrity: sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==}
+
+ estree-util-to-js@2.0.0:
+ resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==}
+
+ estree-util-value-to-estree@3.5.0:
+ resolution: {integrity: sha512-aMV56R27Gv3QmfmF1MY12GWkGzzeAezAX+UplqHVASfjc9wNzI/X6hC0S9oxq61WT4aQesLGslWP9tKk6ghRZQ==}
+
+ estree-util-visit@2.0.0:
+ resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==}
+
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -1877,6 +2388,17 @@ packages:
resolution: {integrity: sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==}
engines: {node: '>= 6'}
+ framer-motion@13.1.1:
+ resolution: {integrity: sha512-B/xn2TPS4f61cEBLFjiYlQFnBZUW1YVj/LM+C+N4OP8Rs95VLEI2ot/RlfBg111la/EiyECFaJJi/A3FWA8MUA==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
fs-extra@10.1.0:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'}
@@ -1909,6 +2431,102 @@ packages:
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
+ fumadocs-core@16.14.5:
+ resolution: {integrity: sha512-II6BqBO0A/KBYqCBgs1cBB/etyQbv1Qi+f0L29Br/CUbKWlHGRFFksfbcMW5HUitoIWDzOXJldxk9z6nvdZe4w==}
+ peerDependencies:
+ '@mdx-js/mdx': '*'
+ '@mixedbread/sdk': 0.x.x
+ '@orama/core': 1.x.x
+ '@oramacloud/client': 2.x.x
+ '@tanstack/react-router': 1.x.x
+ '@types/estree-jsx': '*'
+ '@types/hast': '*'
+ '@types/mdast': '*'
+ '@types/react': '*'
+ algoliasearch: 5.x.x
+ flexsearch: '*'
+ lucide-react: '*'
+ next: 16.x.x
+ react: ^19.2.0
+ react-dom: ^19.2.0
+ react-router: 7.x.x || 8.x.x
+ waku: '*'
+ zod: 4.x.x
+ peerDependenciesMeta:
+ '@mdx-js/mdx':
+ optional: true
+ '@mixedbread/sdk':
+ optional: true
+ '@orama/core':
+ optional: true
+ '@oramacloud/client':
+ optional: true
+ '@tanstack/react-router':
+ optional: true
+ '@types/estree-jsx':
+ optional: true
+ '@types/hast':
+ optional: true
+ '@types/mdast':
+ optional: true
+ '@types/react':
+ optional: true
+ algoliasearch:
+ optional: true
+ flexsearch:
+ optional: true
+ lucide-react:
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ react-dom:
+ optional: true
+ react-router:
+ optional: true
+ waku:
+ optional: true
+ zod:
+ optional: true
+
+ fumadocs-mdx@15.3.0:
+ resolution: {integrity: sha512-ZzfM4O15SDfqvgsOzifNYu3ZlV23tOI6cP5emTrdCTV3Jhj1xHU+74RckkPnAvGo+ee2hRyM0vksCjvUYff+bA==}
+ hasBin: true
+ peerDependencies:
+ '@fumadocs/satteri': 0.x.x
+ '@types/mdast': '*'
+ '@types/mdx': '*'
+ '@types/react': '*'
+ fumadocs-core: ^16.7.0
+ mdast-util-directive: '*'
+ next: ^15.3.0 || ^16.0.0
+ react: ^19.2.0
+ rolldown: '*'
+ satteri: ^0.10.0
+ vite: 7.x.x || 8.x.x
+ peerDependenciesMeta:
+ '@fumadocs/satteri':
+ optional: true
+ '@types/mdast':
+ optional: true
+ '@types/mdx':
+ optional: true
+ '@types/react':
+ optional: true
+ mdast-util-directive:
+ optional: true
+ next:
+ optional: true
+ react:
+ optional: true
+ rolldown:
+ optional: true
+ satteri:
+ optional: true
+ vite:
+ optional: true
+
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
@@ -1924,6 +2542,10 @@ packages:
resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==}
engines: {node: '>= 0.4'}
+ get-nonce@1.0.1:
+ resolution: {integrity: sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==}
+ engines: {node: '>=6'}
+
get-proto@1.0.1:
resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==}
engines: {node: '>= 0.4'}
@@ -1932,6 +2554,9 @@ packages:
resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
engines: {node: '>=8'}
+ github-slugger@2.0.0:
+ resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==}
+
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me
@@ -1974,15 +2599,33 @@ packages:
resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==}
engines: {node: '>= 0.4'}
+ hast-util-from-parse5@8.0.3:
+ resolution: {integrity: sha512-3kxEVkEKt0zvcZ3hCRYI8rqrgwtlIOFMWkbclACvjlDw8Li9S2hk/d51OI0nr/gIpdMHNepwgOKqZ/sy0Clpyg==}
+
+ hast-util-parse-selector@4.0.0:
+ resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==}
+
+ hast-util-raw@9.1.0:
+ resolution: {integrity: sha512-Y8/SBAHkZGoNkpzqqfCldijcuUKh7/su31kEBp67cFY09Wy0mTRgtsLYsiIxMJxlu0f6AA5SUTbDR8K0rxnbUw==}
+
+ hast-util-to-estree@3.1.3:
+ resolution: {integrity: sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==}
+
hast-util-to-html@9.0.5:
resolution: {integrity: sha512-OguPdidb+fbHQSU4Q4ZiLKnzWo8Wwsf5bZfbvu7//a9oTYoqD/fWpe96NuHkoS9h0ccGOTe0C4NGXdtS0iObOw==}
hast-util-to-jsx-runtime@2.3.6:
resolution: {integrity: sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==}
+ hast-util-to-parse5@8.0.1:
+ resolution: {integrity: sha512-MlWT6Pjt4CG9lFCjiz4BH7l9wmrMkfkJYCxFwKQic8+RTZgWPuWxwAfjJElsXkex7DJjfSJsQIt931ilUgmwdA==}
+
hast-util-whitespace@3.0.0:
resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==}
+ hastscript@9.0.1:
+ resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==}
+
hosted-git-info@4.1.0:
resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
engines: {node: '>=10'}
@@ -2214,9 +2857,21 @@ packages:
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ lucide-react@1.33.0:
+ resolution: {integrity: sha512-MTRwMy0ZlL8Ur/vOAiJ9XGHE+kFPC7brq6MxAm0GiGXEBj0qy0jA/pG4N675oSzciO/UCdX8T+5yUQdmDeTLxg==}
+ peerDependencies:
+ react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+ magic-string@1.2.2:
+ resolution: {integrity: sha512-veT/+7iXrXzT39XnEN4lOxtNl72dMgJ8Lp+5Bd6YcMSWpb0n0MjBM8Uuooi6jgJr8dhUW2swQgBmoZVMni5SVg==}
+
+ markdown-extensions@2.0.0:
+ resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==}
+ engines: {node: '>=16'}
+
markdown-table@3.0.4:
resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==}
@@ -2258,6 +2913,9 @@ packages:
mdast-util-mdx-jsx@3.2.0:
resolution: {integrity: sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==}
+ mdast-util-mdx@3.0.0:
+ resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==}
+
mdast-util-mdxjs-esm@2.0.1:
resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==}
@@ -2297,12 +2955,30 @@ packages:
micromark-extension-gfm@3.0.0:
resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==}
+ micromark-extension-mdx-expression@3.0.1:
+ resolution: {integrity: sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==}
+
+ micromark-extension-mdx-jsx@3.0.2:
+ resolution: {integrity: sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==}
+
+ micromark-extension-mdx-md@2.0.0:
+ resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==}
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==}
+
+ micromark-extension-mdxjs@3.0.0:
+ resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==}
+
micromark-factory-destination@2.0.1:
resolution: {integrity: sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==}
micromark-factory-label@2.0.1:
resolution: {integrity: sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==}
+ micromark-factory-mdx-expression@2.0.3:
+ resolution: {integrity: sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==}
+
micromark-factory-space@2.0.1:
resolution: {integrity: sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==}
@@ -2333,6 +3009,9 @@ packages:
micromark-util-encode@2.0.1:
resolution: {integrity: sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==}
+ micromark-util-events-to-acorn@2.0.3:
+ resolution: {integrity: sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==}
+
micromark-util-html-tag-name@2.0.1:
resolution: {integrity: sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==}
@@ -2412,6 +3091,23 @@ packages:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
+ motion-dom@13.1.1:
+ resolution: {integrity: sha512-XSf8VYWSB6G/0IY3rWVbyLcxWXtAVHkN1PQE2agTaCv3u8RGvbwu56TyyR/MNzBqqNavEBTZzErcxI1TxBrjcA==}
+
+ motion-utils@13.0.0:
+ resolution: {integrity: sha512-7DnN7TmbLcYXcG4RVadXIihWlyuM9afoUww8Y5Agg431kGKiuL2/OMyP4mJ5wLz+pvN3t5ySClLOaVXJ+wekRQ==}
+
+ motion@13.1.1:
+ resolution: {integrity: sha512-WNZoK6xiF+kkTqkZ5K7FDDh6A8BG4i5Hc7KXtW8gtTxkpJFds+hIOrDaQGKjQj/AE/i4hJqAaUHEqp/Qo02y6Q==}
+ peerDependencies:
+ react: ^18.0.0 || ^19.0.0
+ react-dom: ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ react:
+ optional: true
+ react-dom:
+ optional: true
+
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -2420,6 +3116,33 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
+ next-themes@0.4.6:
+ resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
+ peerDependencies:
+ react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+ react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
+
+ next@16.3.2:
+ resolution: {integrity: sha512-/ZCaubUy17Lld1SiPWxuPbCk2ihqAxF2QNQaPZeEaEb7t1I58qhsJN187D7AfpapHAqUPXH0f/thtdW9dWgWFg==}
+ engines: {node: '>=20.9.0'}
+ hasBin: true
+ peerDependencies:
+ '@opentelemetry/api': ^1.1.0
+ '@playwright/test': ^1.51.1
+ babel-plugin-react-compiler: '*'
+ react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0
+ sass: ^1.3.0
+ peerDependenciesMeta:
+ '@opentelemetry/api':
+ optional: true
+ '@playwright/test':
+ optional: true
+ babel-plugin-react-compiler:
+ optional: true
+ sass:
+ optional: true
+
node-abi@4.33.0:
resolution: {integrity: sha512-vLBWCKb+7LWsX+TbfzWOkw0W81m377tyx3hOweBTjO43CXZnRGS1/JPWs20fr0PgZyDXk6ROYrylsEycK8raDA==}
engines: {node: '>=22.12.0'}
@@ -2448,6 +3171,10 @@ packages:
resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
engines: {node: '>=10'}
+ npm-to-yarn@3.2.0:
+ resolution: {integrity: sha512-K1HmQeZT2HrjpsR6KgqbN2FAXL2NrJJmNUSD9ck7HGTVu1JKXox8n9SB+tjbU8m8JGLF4OscrroPepew/L7/Xw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
object-keys@1.1.1:
resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
engines: {node: '>= 0.4'}
@@ -2489,6 +3216,9 @@ packages:
parse-entities@4.0.2:
resolution: {integrity: sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==}
+ parse5@7.3.0:
+ resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
+
path-is-absolute@1.0.1:
resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
engines: {node: '>=0.10.0'}
@@ -2522,6 +3252,10 @@ packages:
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
engines: {node: '>=10.4.0'}
+ postcss@8.5.23:
+ resolution: {integrity: sha512-g50586zr4bZmwFiTlflMu8E0bDTb5I5gertgwAKmsdUlTQIhZtunzUlD1WSzwcVWPoAVpsrA6vlfCD7oXvRwgg==}
+ engines: {node: ^10 || ^12 || >=14}
+
postcss@8.5.26:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14}
@@ -2600,6 +3334,36 @@ packages:
resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==}
engines: {node: '>=0.10.0'}
+ react-remove-scroll-bar@2.3.8:
+ resolution: {integrity: sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-remove-scroll@2.7.2:
+ resolution: {integrity: sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ react-style-singleton@2.2.3:
+ resolution: {integrity: sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
react@19.2.8:
resolution: {integrity: sha512-PWaYA1L/q9u2u7xYQi+Y3L3Yfnie7XyLeaJICV1MGD6LprsBxcAqGjYyr0eY3p+QdsA+x/Irkt4Qif8D63+Sbw==}
engines: {node: '>=0.10.0'}
@@ -2611,6 +3375,24 @@ packages:
readable-stream@2.3.8:
resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ readdirp@5.1.1:
+ resolution: {integrity: sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==}
+ engines: {node: '>= 20.19.0'}
+
+ recma-build-jsx@1.0.0:
+ resolution: {integrity: sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==}
+
+ recma-jsx@1.0.1:
+ resolution: {integrity: sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+
+ recma-parse@1.0.0:
+ resolution: {integrity: sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==}
+
+ recma-stringify@1.0.0:
+ resolution: {integrity: sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==}
+
regex-recursion@6.0.2:
resolution: {integrity: sha512-0YCaSCq2VRIebiaUviZNs0cBz1kg5kVS2UKUfNIx8YVs1cN3AV7NTctO5FOKBA+UT2BPJIWZauYHPqJODG50cg==}
@@ -2620,9 +3402,18 @@ packages:
regex@6.1.0:
resolution: {integrity: sha512-6VwtthbV4o/7+OaAF9I5L5V3llLEsoPyq9P1JVXkedTP33c7MfCG0/5NOPcSJn0TzXcG9YUrR0gQSWioew3LDg==}
+ rehype-raw@7.0.0:
+ resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==}
+
+ rehype-recma@1.0.0:
+ resolution: {integrity: sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==}
+
remark-gfm@4.0.1:
resolution: {integrity: sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==}
+ remark-mdx@3.1.1:
+ resolution: {integrity: sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==}
+
remark-parse@11.0.0:
resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==}
@@ -2632,6 +3423,9 @@ packages:
remark-stringify@11.0.0:
resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==}
+ remark@15.0.1:
+ resolution: {integrity: sha512-Eht5w30ruCXgFmxVUSlNWQ9iiimq07URKeFS3hNc8cUWy1llX4KDWfyEDZRycMc+znsN9Ux5/tJ/BFdgdOwA3A==}
+
require-directory@2.1.1:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
@@ -2644,6 +3438,9 @@ packages:
resolution: {integrity: sha512-vHjcY2MlAITJhC0eRD/Vv8Vlgmu9Sd3LX9zZvtGzU5ZImdTN3+d6e/4mnTyV8vEbyf1sgNIrWxhWlrys52OkEA==}
engines: {node: '>=12', npm: '>=6'}
+ reselect@5.2.0:
+ resolution: {integrity: sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==}
+
resolve-alpn@1.2.1:
resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==}
@@ -2681,6 +3478,9 @@ packages:
scheduler@0.27.0:
resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
+ scroll-into-view-if-needed@3.1.0:
+ resolution: {integrity: sha512-49oNpRjWRvnU8NyGVmUaYG4jtTkNonFZI86MmGRDqBphEK2EXT9gdEUoQPZhuBM8yWHxCWbobltqYO5M4XrUvQ==}
+
semver-compare@1.0.0:
resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
@@ -2710,6 +3510,15 @@ packages:
resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==}
engines: {node: '>=20.9.0'}
+ sharp@0.35.3:
+ resolution: {integrity: sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==}
+ engines: {node: '>=20.9.0'}
+ peerDependencies:
+ '@types/node': '*'
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+
shebang-command@2.0.0:
resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
engines: {node: '>=8'}
@@ -2743,6 +3552,10 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
space-separated-tokens@2.0.2:
resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==}
@@ -2779,6 +3592,19 @@ packages:
style-to-object@1.0.14:
resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==}
+ styled-jsx@5.1.6:
+ resolution: {integrity: sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==}
+ engines: {node: '>= 12.0.0'}
+ peerDependencies:
+ '@babel/core': '*'
+ babel-plugin-macros: '*'
+ react: '>= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0'
+ peerDependenciesMeta:
+ '@babel/core':
+ optional: true
+ babel-plugin-macros:
+ optional: true
+
sumchecker@3.0.1:
resolution: {integrity: sha512-MvjXzkz/BOfyVDkG0oFOtBxHX2u3gKbMHIF/dXblZsgD3BWOFLmHovIpZY7BykJdAjcqRCBi1WYBNdEC9yI7vg==}
engines: {node: '>= 8.0'}
@@ -2812,6 +3638,11 @@ packages:
resolution: {integrity: sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==}
engines: {node: '>=6.0.0'}
+ terser@5.16.9:
+ resolution: {integrity: sha512-HPa/FdTB9XGI2H1/keLFZHxl6WNvAI4YalHGtDQTlMnJcoqSab1UwL4l1hGEhs6/GmLHBZIg/YgB++jcbzoOEg==}
+ engines: {node: '>=10'}
+ hasBin: true
+
tiny-async-pool@1.3.0:
resolution: {integrity: sha512-01EAw5EDrcVrdgyCLgoSPvqznC0sVxDSVeiOz09FUpjh71G79VCqneOr+xvt7T1r76CF6ZZfPjHorN2+d+3mqA==}
@@ -2861,6 +3692,11 @@ packages:
engines: {node: '>=14.17'}
hasBin: true
+ typescript@6.0.3:
+ resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
undici-types@7.18.2:
resolution: {integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==}
@@ -2884,9 +3720,15 @@ packages:
unist-util-is@6.0.1:
resolution: {integrity: sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==}
+ unist-util-position-from-estree@2.0.0:
+ resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==}
+
unist-util-position@5.0.0:
resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==}
+ unist-util-remove-position@5.0.0:
+ resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==}
+
unist-util-stringify-position@4.0.0:
resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==}
@@ -2913,12 +3755,40 @@ packages:
peerDependencies:
browserslist: '>= 4.21.0'
+ use-callback-ref@1.3.3:
+ resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sidecar@1.1.3:
+ resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ use-sync-external-store@1.6.0:
+ resolution: {integrity: sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==}
+ peerDependencies:
+ react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
+
utf8-byte-length@1.0.5:
resolution: {integrity: sha512-Xn0w3MtiQ6zoz2vFyUVruaCL53O/DwUvkEeOvj+uulMm0BkUGYWmBYVyElqZaSLhY6ZD0ulfU3aBra2aVT4xfA==}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+ vfile-location@5.0.3:
+ resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==}
+
vfile-message@4.0.3:
resolution: {integrity: sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==}
@@ -3006,6 +3876,9 @@ packages:
jsdom:
optional: true
+ web-namespaces@2.0.1:
+ resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==}
+
web-vitals@5.3.0:
resolution: {integrity: sha512-q6LWsLatGYZp5VGBIOvbTj6JBV2nOmC8KvWztXBmwJcfFAzhwKwbOxhUH306XY3CcaZDUlSmSuNPBsCn0bFu+g==}
@@ -3087,6 +3960,11 @@ packages:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
engines: {node: '>=18'}
+ yaml@2.9.0:
+ resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==}
+ engines: {node: '>= 14.6'}
+ hasBin: true
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
@@ -3105,6 +3983,16 @@ packages:
youch@4.1.0-beta.10:
resolution: {integrity: sha512-rLfVLB4FgQneDr0dv1oddCVZmKjcJ6yX6mS4pU82Mq/Dt9a3cLZQ62pDBL4AUO+uVrCvtWz3ZFUL2HFAFJ/BXQ==}
+ yuku-analyzer@0.8.7:
+ resolution: {integrity: sha512-nyPXcwwRPEggJqxIP28GeLKPjk9oGUuBlS4I0KfFrezNe93Ie9WIlOYRI42bo+MmZoxH238XHoPy0IZdwZIBxA==}
+
+ yuku-ast@0.8.7:
+ resolution: {integrity: sha512-h6+4bDfyootiMB9vckk5uKo5r5j0GHrkr17FQTDNfEsFT3DWlN9uu1HJwQwc64pgmLCI945fWM3lbTIqxjT3GQ==}
+
+ zbsearch@4.0.0:
+ resolution: {integrity: sha512-gm4zfO31n2ZdruTTRQoWVWO4Q2+zrDt2GlrvIc+5JulRQNAm4IanCxER82vQ7Ug96FYkGqWUJBXFe1kGAcDWaQ==}
+ engines: {node: '>= 20.0.0'}
+
zod@4.4.3:
resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==}
@@ -3113,6 +4001,8 @@ packages:
snapshots:
+ '@alloc/quick-lru@5.2.0': {}
+
'@babel/code-frame@7.29.7':
dependencies:
'@babel/helper-validator-identifier': 7.29.7
@@ -3202,6 +4092,8 @@ snapshots:
'@babel/core': 7.29.7
'@babel/helper-plugin-utils': 7.29.7
+ '@babel/runtime@7.29.7': {}
+
'@babel/template@7.29.7':
dependencies:
'@babel/code-frame': 7.29.7
@@ -3225,6 +4117,29 @@ snapshots:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
+ '@base-ui/react@1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@base-ui/utils': 0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@floating-ui/react-dom': 2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@floating-ui/utils': 0.2.12
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ use-sync-external-store: 1.6.0(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ '@base-ui/utils@0.3.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@babel/runtime': 7.29.7
+ '@floating-ui/utils': 0.2.12
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ reselect: 5.2.0
+ use-sync-external-store: 1.6.0(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
+
'@cloudflare/kv-asset-handler@0.5.0': {}
'@cloudflare/unenv-preset@2.16.1(unenv@2.0.0-rc.24)(workerd@1.20260811.1)':
@@ -3510,6 +4425,63 @@ snapshots:
'@esbuild/win32-x64@0.28.2':
optional: true
+ '@floating-ui/core@1.8.0':
+ dependencies:
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/dom@1.8.0':
+ dependencies:
+ '@floating-ui/core': 1.8.0
+ '@floating-ui/utils': 0.2.12
+
+ '@floating-ui/react-dom@2.1.9(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ '@floating-ui/dom': 1.8.0
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ '@floating-ui/utils@0.2.12': {}
+
+ '@fuma-translate/react@1.0.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)':
+ dependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ '@fumadocs/base-ui@16.14.5(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(tailwindcss@4.3.3)':
+ dependencies:
+ '@base-ui/react': 1.7.0(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@fuma-translate/react': 1.0.2(@types/react@19.2.18)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ '@fumadocs/tailwind': 0.1.1(tailwindcss@4.3.3)
+ class-variance-authority: 0.7.1
+ cnfast: 0.1.0
+ fumadocs-core: 16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)
+ lucide-react: 1.33.0(react@19.2.8)
+ motion: 13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ next-themes: 0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ react-remove-scroll: 2.7.2(@types/react@19.2.18)(react@19.2.8)
+ rehype-raw: 7.0.0
+ scroll-into-view-if-needed: 3.1.0
+ shiki: 4.4.3
+ unist-util-visit: 5.1.0
+ optionalDependencies:
+ '@types/mdx': 2.0.14
+ '@types/react': 19.2.18
+ next: 16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ transitivePeerDependencies:
+ - '@date-fns/tz'
+ - date-fns
+ - tailwindcss
+
+ '@fumadocs/tailwind@0.1.1(tailwindcss@4.3.3)':
+ optionalDependencies:
+ tailwindcss: 4.3.3
+
+ '@fumari/image-size@0.1.0': {}
+
'@img/colour@1.1.0': {}
'@img/sharp-darwin-arm64@0.35.2':
@@ -3517,105 +4489,209 @@ snapshots:
'@img/sharp-libvips-darwin-arm64': 1.3.1
optional: true
+ '@img/sharp-darwin-arm64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-arm64': 1.3.2
+ optional: true
+
'@img/sharp-darwin-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-darwin-x64': 1.3.1
optional: true
+ '@img/sharp-darwin-x64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-darwin-x64': 1.3.2
+ optional: true
+
'@img/sharp-freebsd-wasm32@0.35.2':
dependencies:
'@img/sharp-wasm32': 0.35.2
optional: true
+ '@img/sharp-freebsd-wasm32@0.35.3':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.3
+ optional: true
+
'@img/sharp-libvips-darwin-arm64@1.3.1':
optional: true
+ '@img/sharp-libvips-darwin-arm64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-darwin-x64@1.3.1':
optional: true
+ '@img/sharp-libvips-darwin-x64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-arm64@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-arm64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-arm@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-arm@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-ppc64@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-ppc64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-riscv64@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-riscv64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-s390x@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-s390x@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linux-x64@1.3.1':
optional: true
+ '@img/sharp-libvips-linux-x64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linuxmusl-arm64@1.3.1':
optional: true
+ '@img/sharp-libvips-linuxmusl-arm64@1.3.2':
+ optional: true
+
'@img/sharp-libvips-linuxmusl-x64@1.3.1':
optional: true
+ '@img/sharp-libvips-linuxmusl-x64@1.3.2':
+ optional: true
+
'@img/sharp-linux-arm64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-arm64': 1.3.1
optional: true
- '@img/sharp-linux-arm@0.35.2':
+ '@img/sharp-linux-arm64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm64': 1.3.2
+ optional: true
+
+ '@img/sharp-linux-arm@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-arm': 1.3.1
optional: true
+ '@img/sharp-linux-arm@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-arm': 1.3.2
+ optional: true
+
'@img/sharp-linux-ppc64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-ppc64': 1.3.1
optional: true
+ '@img/sharp-linux-ppc64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-ppc64': 1.3.2
+ optional: true
+
'@img/sharp-linux-riscv64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-riscv64': 1.3.1
optional: true
+ '@img/sharp-linux-riscv64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-riscv64': 1.3.2
+ optional: true
+
'@img/sharp-linux-s390x@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-s390x': 1.3.1
optional: true
+ '@img/sharp-linux-s390x@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-s390x': 1.3.2
+ optional: true
+
'@img/sharp-linux-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linux-x64': 1.3.1
optional: true
+ '@img/sharp-linux-x64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linux-x64': 1.3.2
+ optional: true
+
'@img/sharp-linuxmusl-arm64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-arm64': 1.3.1
optional: true
+ '@img/sharp-linuxmusl-arm64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.2
+ optional: true
+
'@img/sharp-linuxmusl-x64@0.35.2':
optionalDependencies:
'@img/sharp-libvips-linuxmusl-x64': 1.3.1
optional: true
+ '@img/sharp-linuxmusl-x64@0.35.3':
+ optionalDependencies:
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.2
+ optional: true
+
'@img/sharp-wasm32@0.35.2':
dependencies:
'@emnapi/runtime': 1.11.3
optional: true
+ '@img/sharp-wasm32@0.35.3':
+ dependencies:
+ '@emnapi/runtime': 1.11.3
+ optional: true
+
'@img/sharp-webcontainers-wasm32@0.35.2':
dependencies:
'@img/sharp-wasm32': 0.35.2
optional: true
+ '@img/sharp-webcontainers-wasm32@0.35.3':
+ dependencies:
+ '@img/sharp-wasm32': 0.35.3
+ optional: true
+
'@img/sharp-win32-arm64@0.35.2':
optional: true
+ '@img/sharp-win32-arm64@0.35.3':
+ optional: true
+
'@img/sharp-win32-ia32@0.35.2':
optional: true
+ '@img/sharp-win32-ia32@0.35.3':
+ optional: true
+
'@img/sharp-win32-x64@0.35.2':
optional: true
+ '@img/sharp-win32-x64@0.35.3':
+ optional: true
+
'@isaacs/fs-minipass@4.0.1':
dependencies:
minipass: 7.1.3
@@ -3632,6 +4708,12 @@ snapshots:
'@jridgewell/resolve-uri@3.1.2': {}
+ '@jridgewell/source-map@0.3.11':
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.13
+ '@jridgewell/trace-mapping': 0.3.31
+ optional: true
+
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31':
@@ -3657,9 +4739,65 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@mdx-js/mdx@3.1.1':
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdx': 2.0.14
+ acorn: 8.18.0
+ collapse-white-space: 2.1.0
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-util-scope: 1.0.0
+ estree-walker: 3.0.3
+ hast-util-to-jsx-runtime: 2.3.6
+ markdown-extensions: 2.0.0
+ recma-build-jsx: 1.0.0
+ recma-jsx: 1.0.1(acorn@8.18.0)
+ recma-stringify: 1.0.0
+ rehype-recma: 1.0.0
+ remark-mdx: 3.1.1
+ remark-parse: 11.0.0
+ remark-rehype: 11.1.2
+ source-map: 0.7.6
+ unified: 11.0.5
+ unist-util-position-from-estree: 2.0.0
+ unist-util-stringify-position: 4.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ transitivePeerDependencies:
+ - supports-color
+
'@napi-rs/lzma-linux-x64-gnu@1.5.1':
optional: true
+ '@next/env@16.3.2': {}
+
+ '@next/swc-darwin-arm64@16.3.2':
+ optional: true
+
+ '@next/swc-darwin-x64@16.3.2':
+ optional: true
+
+ '@next/swc-linux-arm64-gnu@16.3.2':
+ optional: true
+
+ '@next/swc-linux-arm64-musl@16.3.2':
+ optional: true
+
+ '@next/swc-linux-x64-gnu@16.3.2':
+ optional: true
+
+ '@next/swc-linux-x64-musl@16.3.2':
+ optional: true
+
+ '@next/swc-win32-arm64-msvc@16.3.2':
+ optional: true
+
+ '@next/swc-win32-x64-msvc@16.3.2':
+ optional: true
+
'@noble/hashes@1.4.0': {}
'@noble/hashes@2.3.0': {}
@@ -3893,6 +5031,10 @@ snapshots:
'@standard-schema/spec@1.1.0': {}
+ '@swc/helpers@0.5.23':
+ dependencies:
+ tslib: 2.8.1
+
'@szmarczak/http-timer@4.0.6':
dependencies:
defer-to-connect: 2.0.1
@@ -3958,12 +5100,20 @@ snapshots:
'@tailwindcss/oxide-win32-arm64-msvc': 4.3.3
'@tailwindcss/oxide-win32-x64-msvc': 4.3.3
- '@tailwindcss/vite@4.3.3(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))':
+ '@tailwindcss/postcss@4.3.3':
dependencies:
+ '@alloc/quick-lru': 5.2.0
'@tailwindcss/node': 4.3.3
'@tailwindcss/oxide': 4.3.3
+ postcss: 8.5.26
tailwindcss: 4.3.3
- vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)
+
+ '@tailwindcss/vite@4.3.3(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.3
+ '@tailwindcss/oxide': 4.3.3
+ tailwindcss: 4.3.3
+ vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
'@trycua/cua-driver-darwin-arm64@0.20.0':
optional: true
@@ -4058,6 +5208,8 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
+ '@types/mdx@2.0.14': {}
+
'@types/ms@2.1.0': {}
'@types/node@24.13.3':
@@ -4126,7 +5278,7 @@ snapshots:
'@ungap/structured-clone@1.3.3': {}
- '@vitejs/plugin-react@4.7.0(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))':
+ '@vitejs/plugin-react@4.7.0(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))':
dependencies:
'@babel/core': 7.29.7
'@babel/plugin-transform-react-jsx-self': 7.29.7(@babel/core@7.29.7)
@@ -4134,7 +5286,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-beta.27
'@types/babel__core': 7.20.5
react-refresh: 0.17.0
- vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)
+ vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
transitivePeerDependencies:
- supports-color
@@ -4147,13 +5299,13 @@ snapshots:
chai: 6.2.2
tinyrainbow: 3.1.1
- '@vitest/mocker@4.1.10(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))':
+ '@vitest/mocker@4.1.10(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))':
dependencies:
'@vitest/spy': 4.1.10
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)
+ vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
'@vitest/pretty-format@4.1.10':
dependencies:
@@ -4181,8 +5333,52 @@ snapshots:
'@xmldom/xmldom@0.8.13': {}
+ '@yuku-analyzer/binding-android-arm64@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-darwin-arm64@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-darwin-x64@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-freebsd-x64@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-arm-gnu@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-arm-musl@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-arm64-gnu@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-arm64-musl@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-x64-gnu@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-linux-x64-musl@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-win32-arm64@0.8.7':
+ optional: true
+
+ '@yuku-analyzer/binding-win32-x64@0.8.7':
+ optional: true
+
+ '@yuku-toolchain/types@0.8.7': {}
+
abbrev@4.0.0: {}
+ acorn-jsx@5.3.2(acorn@8.18.0):
+ dependencies:
+ acorn: 8.18.0
+
+ acorn@8.18.0: {}
+
agent-base@7.1.4: {}
ajv@8.20.0:
@@ -4256,6 +5452,8 @@ snapshots:
assertion-error@2.0.1: {}
+ astring@1.9.0: {}
+
async-exit-hook@2.0.1: {}
async@3.2.6: {}
@@ -4370,6 +5568,10 @@ snapshots:
character-reference-invalid@2.0.1: {}
+ chokidar@5.0.0:
+ dependencies:
+ readdirp: 5.1.1
+
chownr@3.0.0: {}
chromium-pickle-js@0.2.0: {}
@@ -4378,6 +5580,12 @@ snapshots:
ci-info@4.4.0: {}
+ class-variance-authority@0.7.1:
+ dependencies:
+ clsx: 2.1.1
+
+ client-only@0.0.1: {}
+
cliui@8.0.1:
dependencies:
string-width: 4.2.3
@@ -4390,6 +5598,10 @@ snapshots:
clsx@2.1.1: {}
+ cnfast@0.1.0: {}
+
+ collapse-white-space@2.1.0: {}
+
color-convert@2.0.1:
dependencies:
color-name: 1.1.4
@@ -4402,6 +5614,9 @@ snapshots:
comma-separated-tokens@2.0.3: {}
+ commander@2.20.3:
+ optional: true
+
commander@5.1.0: {}
commander@9.5.0:
@@ -4409,6 +5624,8 @@ snapshots:
compare-version@0.1.2: {}
+ compute-scroll-into-view@3.1.1: {}
+
concat-map@0.0.1: {}
convert-source-map@2.0.0: {}
@@ -4464,6 +5681,8 @@ snapshots:
detect-libc@2.1.2: {}
+ detect-node-es@1.1.0: {}
+
detect-node@2.1.0:
optional: true
@@ -4595,6 +5814,8 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.3.3
+ entities@6.0.1: {}
+
env-paths@2.2.1: {}
env-paths@3.0.0: {}
@@ -4623,6 +5844,20 @@ snapshots:
es6-error@4.1.1:
optional: true
+ esast-util-from-estree@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ unist-util-position-from-estree: 2.0.0
+
+ esast-util-from-js@2.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ acorn: 8.18.0
+ esast-util-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
esbuild@0.28.1:
optionalDependencies:
'@esbuild/aix-ppc64': 0.28.1
@@ -4688,8 +5923,39 @@ snapshots:
escape-string-regexp@5.0.0: {}
+ estree-util-attach-comments@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+
+ estree-util-build-jsx@3.0.1:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ estree-walker: 3.0.3
+
estree-util-is-identifier-name@3.0.0: {}
+ estree-util-scope@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+
+ estree-util-to-js@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ astring: 1.9.0
+ source-map: 0.7.6
+
+ estree-util-value-to-estree@3.5.0:
+ dependencies:
+ '@types/estree': 1.0.9
+
+ estree-util-visit@2.0.0:
+ dependencies:
+ '@types/estree-jsx': 1.0.5
+ '@types/unist': 3.0.3
+
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.9
@@ -4722,6 +5988,15 @@ snapshots:
hasown: 2.0.4
mime-types: 2.1.35
+ framer-motion@13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ motion-dom: 13.1.1
+ motion-utils: 13.0.0
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
fs-extra@10.1.0:
dependencies:
graceful-fs: 4.2.11
@@ -4764,6 +6039,73 @@ snapshots:
fsevents@2.3.3:
optional: true
+ fumadocs-core@16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3):
+ dependencies:
+ '@fumari/image-size': 0.1.0
+ estree-util-value-to-estree: 3.5.0
+ github-slugger: 2.0.0
+ hast-util-to-estree: 3.1.3
+ hast-util-to-jsx-runtime: 2.3.6
+ mdast-util-mdx: 3.0.0
+ mdast-util-to-markdown: 2.1.2
+ npm-to-yarn: 3.2.0
+ remark: 15.0.1
+ remark-gfm: 4.0.1
+ remark-rehype: 11.1.2
+ scroll-into-view-if-needed: 3.1.0
+ shiki: 4.4.3
+ tinyglobby: 0.2.17
+ unified: 11.0.5
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ yaml: 2.9.0
+ zbsearch: 4.0.0
+ optionalDependencies:
+ '@mdx-js/mdx': 3.1.1
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ '@types/mdast': 4.0.4
+ '@types/react': 19.2.18
+ lucide-react: 1.33.0(react@19.2.8)
+ next: 16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ zod: 4.4.3
+ transitivePeerDependencies:
+ - supports-color
+
+ fumadocs-mdx@15.3.0(@types/mdast@4.0.4)(@types/mdx@2.0.14)(@types/react@19.2.18)(fumadocs-core@16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react@19.2.8)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)):
+ dependencies:
+ '@mdx-js/mdx': 3.1.1
+ '@standard-schema/spec': 1.1.0
+ chokidar: 5.0.0
+ esbuild: 0.28.2
+ estree-util-value-to-estree: 3.5.0
+ fumadocs-core: 16.14.5(@mdx-js/mdx@3.1.1)(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(@types/react@19.2.18)(lucide-react@1.33.0(react@19.2.8))(next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8))(react-dom@19.2.8(react@19.2.8))(react@19.2.8)(zod@4.4.3)
+ github-slugger: 2.0.0
+ magic-string: 1.2.2
+ mdast-util-mdx: 3.0.0
+ picocolors: 1.1.1
+ picomatch: 4.0.5
+ tinyexec: 1.3.0
+ tinyglobby: 0.2.17
+ unified: 11.0.5
+ unist-util-remove-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ yaml: 2.9.0
+ yuku-analyzer: 0.8.7
+ zod: 4.4.3
+ optionalDependencies:
+ '@types/mdast': 4.0.4
+ '@types/mdx': 2.0.14
+ '@types/react': 19.2.18
+ next: 16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ react: 19.2.8
+ vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
+ transitivePeerDependencies:
+ - supports-color
+
function-bind@1.1.2: {}
gensync@1.0.0-beta.2: {}
@@ -4783,6 +6125,8 @@ snapshots:
hasown: 2.0.4
math-intrinsics: 1.1.0
+ get-nonce@1.0.1: {}
+
get-proto@1.0.1:
dependencies:
dunder-proto: 1.0.1
@@ -4792,6 +6136,8 @@ snapshots:
dependencies:
pump: 3.0.4
+ github-slugger@2.0.0: {}
+
glob@7.2.3:
dependencies:
fs.realpath: 1.0.0
@@ -4852,6 +6198,58 @@ snapshots:
dependencies:
function-bind: 1.1.2
+ hast-util-from-parse5@8.0.3:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ hastscript: 9.0.1
+ property-information: 7.2.0
+ vfile: 6.0.3
+ vfile-location: 5.0.3
+ web-namespaces: 2.0.1
+
+ hast-util-parse-selector@4.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+
+ hast-util-raw@9.1.0:
+ dependencies:
+ '@types/hast': 3.0.5
+ '@types/unist': 3.0.3
+ '@ungap/structured-clone': 1.3.3
+ hast-util-from-parse5: 8.0.3
+ hast-util-to-parse5: 8.0.1
+ html-void-elements: 3.0.0
+ mdast-util-to-hast: 13.2.1
+ parse5: 7.3.0
+ unist-util-position: 5.0.0
+ unist-util-visit: 5.1.0
+ vfile: 6.0.3
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
+ hast-util-to-estree@3.1.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/estree-jsx': 1.0.5
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ estree-util-attach-comments: 3.0.0
+ estree-util-is-identifier-name: 3.0.0
+ hast-util-whitespace: 3.0.0
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ style-to-js: 1.1.21
+ unist-util-position: 5.0.0
+ zwitch: 2.0.4
+ transitivePeerDependencies:
+ - supports-color
+
hast-util-to-html@9.0.5:
dependencies:
'@types/hast': 3.0.5
@@ -4886,10 +6284,28 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ hast-util-to-parse5@8.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ devlop: 1.1.0
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+ web-namespaces: 2.0.1
+ zwitch: 2.0.4
+
hast-util-whitespace@3.0.0:
dependencies:
'@types/hast': 3.0.5
+ hastscript@9.0.1:
+ dependencies:
+ '@types/hast': 3.0.5
+ comma-separated-tokens: 2.0.3
+ hast-util-parse-selector: 4.0.0
+ property-information: 7.2.0
+ space-separated-tokens: 2.0.2
+
hosted-git-info@4.1.0:
dependencies:
lru-cache: 6.0.0
@@ -5069,10 +6485,20 @@ snapshots:
dependencies:
react: 19.2.8
+ lucide-react@1.33.0(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
+ magic-string@1.2.2:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
+ markdown-extensions@2.0.0: {}
+
markdown-table@3.0.4: {}
matcher@3.0.0:
@@ -5191,6 +6617,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ mdast-util-mdx@3.0.0:
+ dependencies:
+ mdast-util-from-markdown: 2.0.3
+ mdast-util-mdx-expression: 2.0.1
+ mdast-util-mdx-jsx: 3.2.0
+ mdast-util-mdxjs-esm: 2.0.1
+ mdast-util-to-markdown: 2.1.2
+ transitivePeerDependencies:
+ - supports-color
+
mdast-util-mdxjs-esm@2.0.1:
dependencies:
'@types/estree-jsx': 1.0.5
@@ -5312,6 +6748,57 @@ snapshots:
micromark-util-combine-extensions: 2.0.1
micromark-util-types: 2.0.2
+ micromark-extension-mdx-expression@3.0.1:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdx-jsx@3.0.2:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ estree-util-is-identifier-name: 3.0.0
+ micromark-factory-mdx-expression: 2.0.3
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
+ micromark-extension-mdx-md@2.0.0:
+ dependencies:
+ micromark-util-types: 2.0.2
+
+ micromark-extension-mdxjs-esm@3.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-core-commonmark: 2.0.3
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
+ micromark-extension-mdxjs@3.0.0:
+ dependencies:
+ acorn: 8.18.0
+ acorn-jsx: 5.3.2(acorn@8.18.0)
+ micromark-extension-mdx-expression: 3.0.1
+ micromark-extension-mdx-jsx: 3.0.2
+ micromark-extension-mdx-md: 2.0.0
+ micromark-extension-mdxjs-esm: 3.0.0
+ micromark-util-combine-extensions: 2.0.1
+ micromark-util-types: 2.0.2
+
micromark-factory-destination@2.0.1:
dependencies:
micromark-util-character: 2.1.1
@@ -5325,6 +6812,18 @@ snapshots:
micromark-util-symbol: 2.0.1
micromark-util-types: 2.0.2
+ micromark-factory-mdx-expression@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ devlop: 1.1.0
+ micromark-factory-space: 2.0.1
+ micromark-util-character: 2.1.1
+ micromark-util-events-to-acorn: 2.0.3
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ unist-util-position-from-estree: 2.0.0
+ vfile-message: 4.0.3
+
micromark-factory-space@2.0.1:
dependencies:
micromark-util-character: 2.1.1
@@ -5377,6 +6876,16 @@ snapshots:
micromark-util-encode@2.0.1: {}
+ micromark-util-events-to-acorn@2.0.3:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/unist': 3.0.3
+ devlop: 1.1.0
+ estree-util-visit: 2.0.0
+ micromark-util-symbol: 2.0.1
+ micromark-util-types: 2.0.2
+ vfile-message: 4.0.3
+
micromark-util-html-tag-name@2.0.1: {}
micromark-util-normalize-identifier@2.0.1:
@@ -5478,10 +6987,54 @@ snapshots:
dependencies:
minimist: 1.2.8
+ motion-dom@13.1.1:
+ dependencies:
+ motion-utils: 13.0.0
+
+ motion-utils@13.0.0: {}
+
+ motion@13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ framer-motion: 13.1.1(react-dom@19.2.8(react@19.2.8))(react@19.2.8)
+ tslib: 2.8.1
+ optionalDependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
ms@2.1.3: {}
nanoid@3.3.18: {}
+ next-themes@0.4.6(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+
+ next@16.3.2(@babel/core@7.29.7)(@types/node@26.2.0)(react-dom@19.2.8(react@19.2.8))(react@19.2.8):
+ dependencies:
+ '@next/env': 16.3.2
+ '@swc/helpers': 0.5.23
+ baseline-browser-mapping: 2.11.13
+ caniuse-lite: 1.0.30001809
+ postcss: 8.5.23
+ react: 19.2.8
+ react-dom: 19.2.8(react@19.2.8)
+ styled-jsx: 5.1.6(@babel/core@7.29.7)(react@19.2.8)
+ optionalDependencies:
+ '@next/swc-darwin-arm64': 16.3.2
+ '@next/swc-darwin-x64': 16.3.2
+ '@next/swc-linux-arm64-gnu': 16.3.2
+ '@next/swc-linux-arm64-musl': 16.3.2
+ '@next/swc-linux-x64-gnu': 16.3.2
+ '@next/swc-linux-x64-musl': 16.3.2
+ '@next/swc-win32-arm64-msvc': 16.3.2
+ '@next/swc-win32-x64-msvc': 16.3.2
+ sharp: 0.35.3(@types/node@26.2.0)
+ transitivePeerDependencies:
+ - '@babel/core'
+ - '@types/node'
+ - babel-plugin-macros
+
node-abi@4.33.0:
dependencies:
semver: 7.8.5
@@ -5513,6 +7066,8 @@ snapshots:
normalize-url@6.1.0: {}
+ npm-to-yarn@3.2.0: {}
+
object-keys@1.1.1:
optional: true
@@ -5568,6 +7123,10 @@ snapshots:
is-decimal: 2.0.1
is-hexadecimal: 2.0.1
+ parse5@7.3.0:
+ dependencies:
+ entities: 6.0.1
+
path-is-absolute@1.0.1: {}
path-key@3.1.1: {}
@@ -5597,6 +7156,12 @@ snapshots:
base64-js: 1.5.1
xmlbuilder: 15.1.1
+ postcss@8.5.23:
+ dependencies:
+ nanoid: 3.3.18
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
postcss@8.5.26:
dependencies:
nanoid: 3.3.18
@@ -5688,6 +7253,33 @@ snapshots:
react-refresh@0.17.0: {}
+ react-remove-scroll-bar@2.3.8(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8)
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ react-remove-scroll@2.7.2(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ react-remove-scroll-bar: 2.3.8(@types/react@19.2.18)(react@19.2.8)
+ react-style-singleton: 2.2.3(@types/react@19.2.18)(react@19.2.8)
+ tslib: 2.8.1
+ use-callback-ref: 1.3.3(@types/react@19.2.18)(react@19.2.8)
+ use-sidecar: 1.1.3(@types/react@19.2.18)(react@19.2.8)
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ react-style-singleton@2.2.3(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ get-nonce: 1.0.1
+ react: 19.2.8
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.18
+
react@19.2.8: {}
read-binary-file-arch@1.0.6:
@@ -5706,6 +7298,37 @@ snapshots:
string_decoder: 1.1.1
util-deprecate: 1.0.2
+ readdirp@5.1.1: {}
+
+ recma-build-jsx@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-util-build-jsx: 3.0.1
+ vfile: 6.0.3
+
+ recma-jsx@1.0.1(acorn@8.18.0):
+ dependencies:
+ acorn: 8.18.0
+ acorn-jsx: 5.3.2(acorn@8.18.0)
+ estree-util-to-js: 2.0.0
+ recma-parse: 1.0.0
+ recma-stringify: 1.0.0
+ unified: 11.0.5
+
+ recma-parse@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ esast-util-from-js: 2.0.1
+ unified: 11.0.5
+ vfile: 6.0.3
+
+ recma-stringify@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ estree-util-to-js: 2.0.0
+ unified: 11.0.5
+ vfile: 6.0.3
+
regex-recursion@6.0.2:
dependencies:
regex-utilities: 2.3.0
@@ -5716,6 +7339,20 @@ snapshots:
dependencies:
regex-utilities: 2.3.0
+ rehype-raw@7.0.0:
+ dependencies:
+ '@types/hast': 3.0.5
+ hast-util-raw: 9.1.0
+ vfile: 6.0.3
+
+ rehype-recma@1.0.0:
+ dependencies:
+ '@types/estree': 1.0.9
+ '@types/hast': 3.0.5
+ hast-util-to-estree: 3.1.3
+ transitivePeerDependencies:
+ - supports-color
+
remark-gfm@4.0.1:
dependencies:
'@types/mdast': 4.0.4
@@ -5727,6 +7364,13 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ remark-mdx@3.1.1:
+ dependencies:
+ mdast-util-mdx: 3.0.0
+ micromark-extension-mdxjs: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+
remark-parse@11.0.0:
dependencies:
'@types/mdast': 4.0.4
@@ -5750,6 +7394,15 @@ snapshots:
mdast-util-to-markdown: 2.1.2
unified: 11.0.5
+ remark@15.0.1:
+ dependencies:
+ '@types/mdast': 4.0.4
+ remark-parse: 11.0.0
+ remark-stringify: 11.0.0
+ unified: 11.0.5
+ transitivePeerDependencies:
+ - supports-color
+
require-directory@2.1.1: {}
require-from-string@2.0.2: {}
@@ -5758,6 +7411,8 @@ snapshots:
dependencies:
pe-library: 0.4.1
+ reselect@5.2.0: {}
+
resolve-alpn@1.2.1: {}
responselike@2.0.1:
@@ -5822,6 +7477,10 @@ snapshots:
scheduler@0.27.0: {}
+ scroll-into-view-if-needed@3.1.0:
+ dependencies:
+ compute-scroll-into-view: 3.1.1
+
semver-compare@1.0.0:
optional: true
@@ -5870,6 +7529,40 @@ snapshots:
'@img/sharp-win32-ia32': 0.35.2
'@img/sharp-win32-x64': 0.35.2
+ sharp@0.35.3(@types/node@26.2.0):
+ dependencies:
+ '@img/colour': 1.1.0
+ detect-libc: 2.1.2
+ semver: 7.8.5
+ optionalDependencies:
+ '@img/sharp-darwin-arm64': 0.35.3
+ '@img/sharp-darwin-x64': 0.35.3
+ '@img/sharp-freebsd-wasm32': 0.35.3
+ '@img/sharp-libvips-darwin-arm64': 1.3.2
+ '@img/sharp-libvips-darwin-x64': 1.3.2
+ '@img/sharp-libvips-linux-arm': 1.3.2
+ '@img/sharp-libvips-linux-arm64': 1.3.2
+ '@img/sharp-libvips-linux-ppc64': 1.3.2
+ '@img/sharp-libvips-linux-riscv64': 1.3.2
+ '@img/sharp-libvips-linux-s390x': 1.3.2
+ '@img/sharp-libvips-linux-x64': 1.3.2
+ '@img/sharp-libvips-linuxmusl-arm64': 1.3.2
+ '@img/sharp-libvips-linuxmusl-x64': 1.3.2
+ '@img/sharp-linux-arm': 0.35.3
+ '@img/sharp-linux-arm64': 0.35.3
+ '@img/sharp-linux-ppc64': 0.35.3
+ '@img/sharp-linux-riscv64': 0.35.3
+ '@img/sharp-linux-s390x': 0.35.3
+ '@img/sharp-linux-x64': 0.35.3
+ '@img/sharp-linuxmusl-arm64': 0.35.3
+ '@img/sharp-linuxmusl-x64': 0.35.3
+ '@img/sharp-webcontainers-wasm32': 0.35.3
+ '@img/sharp-win32-arm64': 0.35.3
+ '@img/sharp-win32-ia32': 0.35.3
+ '@img/sharp-win32-x64': 0.35.3
+ '@types/node': 26.2.0
+ optional: true
+
shebang-command@2.0.0:
dependencies:
shebang-regex: 3.0.0
@@ -5904,6 +7597,8 @@ snapshots:
source-map@0.6.1: {}
+ source-map@0.7.6: {}
+
space-separated-tokens@2.0.2: {}
sprintf-js@1.1.3:
@@ -5942,6 +7637,13 @@ snapshots:
dependencies:
inline-style-parser: 0.2.7
+ styled-jsx@5.1.6(@babel/core@7.29.7)(react@19.2.8):
+ dependencies:
+ client-only: 0.0.1
+ react: 19.2.8
+ optionalDependencies:
+ '@babel/core': 7.29.7
+
sumchecker@3.0.1:
dependencies:
debug: 4.4.3
@@ -5978,6 +7680,14 @@ snapshots:
mkdirp: 0.5.6
rimraf: 2.6.3
+ terser@5.16.9:
+ dependencies:
+ '@jridgewell/source-map': 0.3.11
+ acorn: 8.18.0
+ commander: 2.20.3
+ source-map-support: 0.5.21
+ optional: true
+
tiny-async-pool@1.3.0:
dependencies:
semver: 5.7.2
@@ -6016,6 +7726,8 @@ snapshots:
typescript@5.9.3: {}
+ typescript@6.0.3: {}
+
undici-types@7.18.2: {}
undici-types@8.3.0: {}
@@ -6042,10 +7754,19 @@ snapshots:
dependencies:
'@types/unist': 3.0.3
+ unist-util-position-from-estree@2.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+
unist-util-position@5.0.0:
dependencies:
'@types/unist': 3.0.3
+ unist-util-remove-position@5.0.0:
+ dependencies:
+ '@types/unist': 3.0.3
+ unist-util-visit: 5.1.0
+
unist-util-stringify-position@4.0.0:
dependencies:
'@types/unist': 3.0.3
@@ -6079,10 +7800,34 @@ snapshots:
escalade: 3.2.0
picocolors: 1.1.1
+ use-callback-ref@1.3.3(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ use-sidecar@1.1.3(@types/react@19.2.18)(react@19.2.8):
+ dependencies:
+ detect-node-es: 1.1.0
+ react: 19.2.8
+ tslib: 2.8.1
+ optionalDependencies:
+ '@types/react': 19.2.18
+
+ use-sync-external-store@1.6.0(react@19.2.8):
+ dependencies:
+ react: 19.2.8
+
utf8-byte-length@1.0.5: {}
util-deprecate@1.0.2: {}
+ vfile-location@5.0.3:
+ dependencies:
+ '@types/unist': 3.0.3
+ vfile: 6.0.3
+
vfile-message@4.0.3:
dependencies:
'@types/unist': 3.0.3
@@ -6093,7 +7838,7 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.3
- vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0):
+ vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0):
dependencies:
esbuild: 0.28.2
fdir: 6.5.0(picomatch@4.0.5)
@@ -6106,11 +7851,13 @@ snapshots:
fsevents: 2.3.3
jiti: 2.7.0
lightningcss: 1.32.0
+ terser: 5.16.9
+ yaml: 2.9.0
- vitest@4.1.10(@types/node@26.2.0)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)):
+ vitest@4.1.10(@types/node@26.2.0)(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)):
dependencies:
'@vitest/expect': 4.1.10
- '@vitest/mocker': 4.1.10(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0))
+ '@vitest/mocker': 4.1.10(vite@7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0))
'@vitest/pretty-format': 4.1.10
'@vitest/runner': 4.1.10
'@vitest/snapshot': 4.1.10
@@ -6127,13 +7874,15 @@ snapshots:
tinyexec: 1.3.0
tinyglobby: 0.2.17
tinyrainbow: 3.1.1
- vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)
+ vite: 7.3.6(@types/node@26.2.0)(jiti@2.7.0)(lightningcss@1.32.0)(terser@5.16.9)(yaml@2.9.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 26.2.0
transitivePeerDependencies:
- msw
+ web-namespaces@2.0.1: {}
+
web-vitals@5.3.0: {}
web-vitals@6.0.0: {}
@@ -6208,6 +7957,8 @@ snapshots:
yallist@5.0.0: {}
+ yaml@2.9.0: {}
+
yargs-parser@21.1.1: {}
yargs@17.7.3:
@@ -6235,6 +7986,30 @@ snapshots:
cookie: 1.1.1
youch-core: 0.3.3
+ yuku-analyzer@0.8.7:
+ dependencies:
+ '@yuku-toolchain/types': 0.8.7
+ yuku-ast: 0.8.7
+ optionalDependencies:
+ '@yuku-analyzer/binding-android-arm64': 0.8.7
+ '@yuku-analyzer/binding-darwin-arm64': 0.8.7
+ '@yuku-analyzer/binding-darwin-x64': 0.8.7
+ '@yuku-analyzer/binding-freebsd-x64': 0.8.7
+ '@yuku-analyzer/binding-linux-arm-gnu': 0.8.7
+ '@yuku-analyzer/binding-linux-arm-musl': 0.8.7
+ '@yuku-analyzer/binding-linux-arm64-gnu': 0.8.7
+ '@yuku-analyzer/binding-linux-arm64-musl': 0.8.7
+ '@yuku-analyzer/binding-linux-x64-gnu': 0.8.7
+ '@yuku-analyzer/binding-linux-x64-musl': 0.8.7
+ '@yuku-analyzer/binding-win32-arm64': 0.8.7
+ '@yuku-analyzer/binding-win32-x64': 0.8.7
+
+ yuku-ast@0.8.7:
+ dependencies:
+ '@yuku-toolchain/types': 0.8.7
+
+ zbsearch@4.0.0: {}
+
zod@4.4.3: {}
zwitch@2.0.4: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index a591e2239..013ee40ef 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -3,6 +3,7 @@
# A packages list is required for `pnpm list` (electron-builder's collector).
packages:
- "."
+ - "apps/docs"
allowBuilds:
electron: true # postinstall downloads the Electron dist
esbuild: true # postinstall validates the platform binary