/CLAUDE.md
CLAUDE.md at /CLAUDE.md
Path: CLAUDE.md
zudo-tauri-wisdom
Takazudo's Tauri v2 dev notes, built with zudo-doc (zfb stack, MDX, Tailwind CSS v4).
Commands
pnpm dev # Start dev: zfb dev server (port 4321) + doc-history-server (4322), via run-p
pnpm build # Build static site via zfb build
pnpm preview # Preview built site
pnpm check # zfb type checking
pnpm check:html # Validate built HTML (html-validate dist/**/*.html)
pnpm check:links # Check for broken links in dist/
pnpm check:pin-parity # Verify pin version parity across packages
pnpm check:wrangler-pin # Verify wrangler version is pinned correctly
pnpm check:template-drift # Check for template drift vs upstream
pnpm format:md # Format MDX files (write)
pnpm format:md:check # Format MDX files (check only)
pnpm b4push # Pre-push validation (format + drift + pins + typecheck + build + html + links)
pnpm setup:doc-skill # Generate tauri-wisdom skill + symlink all skillszudo-doc 4.x note: doc-history now runs as a separate process (
dev:history), sopnpm devusesrun-pto launch it alongsidezfb dev. z-index tokens are package-owned in 4.x, so the oldgen:z-index/check:z-indexscripts are gone.
Content Structure
English (default):
src/->content/ docs/ /docs/ . . . Japanese:
src/->content/ docs- ja/ /ja/ docs/ . . . Japanese docs should mirror the English directory structure
Bilingual rule: When creating or updating any doc page, ALWAYS update both the English (docs/) and Japanese (docs-ja/) versions in the same PR. Keep code blocks identical between languages -- only translate surrounding prose. If a Japanese version does not yet exist, create it.
Exception: Pages with generated: true in frontmatter (e.g., claude-resources auto-generated pages) do not require Japanese translations.
Content Categories
Top-level directories under src/. Directories with header nav entries are mapped via categoryMatch in the headerNav of zfb.config.ts:
getting-started/- Overview, project setup, dev vs production modearchitecture/- Sidecar pattern, loading screen, process lifecyclerust-backend/- Mutex safety, settings cache, file watchers, menus, windowsfrontend/- IPC commands, useEffect pitfalls, capabilitiesdev-server/- SSE live-reload, watcher loops, Vite integrationdeployment/- Build bundle, macOS pitfalls, cargo cache, node downloadmobile/- Mobile (iOS/Android) Tauri setup and patternsrecipes/- Real-world app patterns (doc viewer, text editor, multi-config)claude/- Claude Code integration docs
Auto-generated directories (no header nav entry, managed by claude-resources integration):
claude-md/- CLAUDE.md file documentation (noPage: true)claude-skills/- Claude Skills documentation (noPage: true)
Writing Docs
All documentation files use .mdx format with YAML frontmatter.
Frontmatter Fields
The whole site is configured through a single zudoDoc({...}) call in zfb.config.ts (zudo-doc 4.x single-entry config API). The frontmatter schema and content collections are package-owned defaults (@takazudo/zudo-doc) — there is NO src/ and NO src/. To override the schema, pass buildDocsSchema to zudoDoc().
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Page title, rendered as the page h1 |
description | string | No | Subtitle displayed below the title |
sidebar_position | number | No | Sort order within category (lower = higher). Always set this for predictable ordering |
sidebar_label | string | No | Custom text for sidebar display (overrides title) |
tags | string[] | No | Cross-category grouping tags |
draft | boolean | No | Exclude from build entirely |
unlisted | boolean | No | Built but noindexed, hidden from sidebar/nav |
hide_sidebar | boolean | No | Hide the left sidebar, center content |
hide_toc | boolean | No | Hide the right-side table of contents |
standalone | boolean | No | Hidden from sidebar nav but still indexed |
slug | string | No | Custom URL slug override |
generated | boolean | No | Build-time generated content (skip translation) |
search_exclude | boolean | No | Exclude from search results |
pagination_next | string/null | No | Override next page link (null to hide) |
pagination_prev | string/null | No | Override prev page link (null to hide) |
doc_history | boolean | No | Override per-page whether doc-history is shown |
category_no_page | boolean | No | Makes index.mdx a non-linked sidebar header (no route/sitemap/search); frontmatter form of noPage: true in _category_.json |
category_sort_order | "asc"/"desc" | No | Child sort direction for this category; frontmatter form of _category_.json sort order |
Content Rules
No h1 in content: The frontmatter
titleis automatically rendered as the page h1. Start your content with## h2headings. Do not write# h1in the MDX body.Always set
sidebar_position: Without it, pages sort alphabetically which is unpredictable. Use integers starting from 1.Kebab-case file names: Use
my-article.mdx, notmyArticle.mdxormy_article.mdx.
Linking Between Docs
Use relative file paths with the .mdx extension:
[Link text](./sibling-page.mdx)
[Link text](../other-category/page.mdx)
[Link text](../other-category/page.mdx#anchor)The remark plugin resolves these during build. External links use standard URLs.
Admonitions
Available globally without imports. Two syntax forms:
Directive syntax (preferred for longer content):
:::note[Custom Title]
Content here.
:::JSX syntax (for inline use):
<Note>Short note content.</Note>Types: <Note>, <Tip>, <Info>, <Warning>, <Danger>, <Caution>
Additional directive types:
:::details[Summary text]
Collapsible content here.
:::
:::code-group
```bash [npm]
npm installpnpm install:::
Caution
Caution content here.
### Mermaid Diagrams
Mermaid is enabled. Use fenced code blocks:
````markdown
```mermaid
graph TB
A --> B
### HtmlPreview Component
For interactive HTML/CSS/JS previews with code display:
```markdown
<HtmlPreview html="<div>Hello</div>" css="div { color: red; }" />
```
Use `js`/`displayJs` props for JavaScript demos.
## Navigation Structure
Navigation is filesystem-driven. Directory structure directly becomes sidebar navigation.
### Sidebar Ordering
- Pages are ordered by `sidebar_position` (ascending). Without it, alphabetical order is used.
- Category index pages (`index.mdx`) control category position via their own `sidebar_position`.
### Category Index Pages
Create `index.mdx` in a category directory when you want custom intro copy, description, or explicit sidebar ordering. The framework auto-generates category index pages when missing, but explicit ones give better control.
### Category Configuration
Use `_category_.json` for category-level metadata when needed:
```json
{
"label": "Category Name",
"position": 900,
"description": "Category description",
"noPage": true
}
```
The `noPage: true` flag means the category has no landing page (just groups items). Alternatively, use `category_no_page: true` in the `index.mdx` frontmatter -- frontmatter wins over the sidecar JSON.
### Header Navigation
Defined in the `zudoDoc({...})` call in `zfb.config.ts` via `headerNav`. Each item maps to a top-level content directory via `categoryMatch`:
```typescript
{ label: "Overview", path: "/docs/getting-started", categoryMatch: "getting-started" }
```
`categoryMatch` must be a single top-level directory name. Adding a new header nav item requires editing `zfb.config.ts`.
## Content Creation Workflow
### Adding a New Article
1. Create the English `.mdx` file in the appropriate category under `src/content/docs/`
2. Add frontmatter with at least `title` and `sidebar_position`
3. Write content starting with `## h2` headings (not `# h1`)
4. Create the matching Japanese file under `src/content/docs-ja/` with the same path
5. Keep code blocks, Mermaid diagrams, and `<HtmlPreview>` blocks identical -- only translate prose
6. Run `pnpm format:md` to format the MDX files
7. Run `pnpm build` to verify the site builds correctly
### Adding a New Category
1. Create the directory under `src/content/docs/` (kebab-case)
2. Create `index.mdx` with `title`, `description`, and `sidebar_position`
3. Add a `headerNav` entry in `zfb.config.ts` with `categoryMatch` pointing to the directory name
4. Mirror the directory structure under `src/content/docs-ja/`
5. Run `pnpm build` to verify
## MDX Components
Available globally in MDX without imports:
- `<Note>`, `<Tip>`, `<Info>`, `<Warning>`, `<Danger>`, `<Caution>` - Admonitions
- `<HtmlPreview>` - Interactive HTML/CSS/JS preview with code display
## Typography
- Futura for page h1 titles and header site name (`font-futura` class)
- Noto Sans JP for body text
- Headings use font-weight 400 (normal), not bold
## Doc Skill (tauri-wisdom)
The `tauri-wisdom` skill (`.claude/skills/tauri-wisdom/SKILL.md`) is **generated** by `pnpm setup:doc-skill` (runs `scripts/setup-doc-skill.sh`). It is gitignored -- do NOT track it in git or edit it directly. To update the skill content, edit the generator script and re-run `pnpm setup:doc-skill`.
## Project Layout
In zudo-doc 4.x the host surface collapsed into the `@takazudo/zudo-doc`
package (config API, components, utils, types, route helpers, design tokens are
all package-owned). The project ships only a thin shell:
```
pages/ # 3 route stubs only (rest injected by the package)
index.tsx # 1-line re-export of the package home route
docs/[[...slug]].tsx # self-contained doc-route stub (dev-mode 404 fix)
[locale]/docs/[[...slug]].tsx # locale-prefixed counterpart (i18n)
src/
content/ # MDX doc pages (docs/ + docs-ja/) — the actual content
styles/global.css # package CSS imports + host font/brand overrides
zfb.config.ts # the ONE config file: a single zudoDoc({...}) call
setup-preset.json # scaffold config record (drives re-scaffold)
scripts/ # host check/gen scripts (drift, pins, links, doc-skill)
```
## Site Config
- Base path: `/` (root — no subpath prefix)
- Live URL: `https://zudo-tauri-wisdom.takazudomodular.com/`
- Config: `zfb.config.ts` — the entire site config is one `zudoDoc({...})` call
(`@takazudo/zudo-doc/