# CLAUDE.md ## Project Overview `datascape` is a minimal personal wiki where **the folder structure is the wiki**. No database, no CMS, no abstraction layer — every folder is a page, and `index.md` in a folder is that page's content. ## Build & Deploy ```bash # Local build (host architecture) go build . # Deploy to NAS make deploy ``` ## HTTP API Surface | Method | Path | Behaviour | |--------|------|-----------| | GET | `/{path}/` | If folder exists: render `index.md` + list contents. If not: show empty create prompt. | | GET | `/{path}/?edit` | Mobile-friendly editor with `index.md` content in a textarea | | POST | `/{path}` | Write `index.md` to disk; creates the folder if it does not exist yet | Non-existent paths without a trailing slash redirect to the slash form (GET only — POSTs are not redirected because `path.Clean` strips the trailing slash from `PostURL` and the content would be lost). Do not add new endpoints without a concrete stated need. ## Code Structure When adding a new special folder type, create a new `.go` file. Do not add type-specific logic to `main.go` or `render.go`. Prefer separate, human-readable `.html` files over inlined HTML strings in Go. Embed them via `embed.FS` if needed. ## Architecture Rules - **Single binary** — no installer, no runtime dependencies, no Docker - **Go stdlib `net/http`** only — no web framework - **`goldmark`** for Markdown rendering — no other Markdown libraries - **`embed.FS`** for all assets — no external serving, no CDN - **No database** of any kind - **No indexing or caching** unless explicitly requested and justified - Keep dependencies to an absolute minimum; if stdlib can do it, use stdlib ## Frontend Rules - Vanilla JS only — no frameworks, no build pipeline - Each feature gets its own JS file; global behaviour goes in `global-shortcuts.js` - Do not inline JS in templates or merge unrelated features into one file - `ALT+SHIFT` is the modifier for all keyboard shortcuts — do not introduce others - Editor toolbar buttons use `data-action` + `data-key`; adding `data-key` auto-registers the shortcut - Prefer generic, descriptive CSS classes (`btn`, `btn-small`, `muted`, `danger`) over element-specific names (`save-button`, `cancel-button`, `form-name-input`). Use a modifier + base class pattern (`btn btn-small`) rather than one-off classes that duplicate shared styles. - Where possible, re-use existing CSS classes - For mutating modals (anything that POSTs and then navigates), call `closeModal()` and then `postReplace(action, body, target)` from `page/actions.js`. Do NOT use `