~ knotless Search/
↑↓ move↵ open⇧↵ all results

peterullrich.com/hatk

AT Protocol app framework

Forked from chadtmiller.com/hatk

0
0
main
161 lines · 5.9 KB Raw History
# Docs Overhaul Design

## Goal

Rewrite hatk documentation to reflect the current API surface (generated client helpers, SQLite-only, SvelteKit remote commands, `parseViewer`/`login`/`logout` from `$hatk/client`). Inspired by Nitro's docs style — project tree on landing page, code-heavy examples, progressive structure.

## Audience

Web developers who may or may not know AT Protocol. Don't gate understanding behind AT Protocol knowledge. Explain concepts inline as they come up ("lexicons are schemas for your data — like Prisma models but for the AT Protocol"). Link to AT Protocol docs for deep dives.

## Framework

Stay with VitePress. Content is the problem, not the tooling.

---

## Landing Page

Hero with current tagline, then a project structure visualization:

```
my-app/
├── app/                    # SvelteKit frontend
│   ├── routes/
│   │   ├── +layout.server.ts   # parseViewer(cookies)
│   │   └── +page.svelte        # your UI
│   └── lib/
├── server/                 # Backend
│   ├── feeds/              # Feed generators
│   │   └── recent.ts       # defineFeed({ ... })
│   └── xrpc/               # Custom endpoints
│       └── getProfile.ts   # defineQuery('...', ...)
├── seeds/
│   └── seed.ts             # Test fixtures
├── lexicons/               # AT Protocol schemas
├── hatk.config.ts          # Configuration
└── hatk.generated.ts       # Auto-generated types
```

Below the tree, 4 feature cards:
- **Typed end-to-end** — Lexicons generate TypeScript types for records, queries, feeds
- **SQLite by default** — No external database, just works
- **OAuth built-in** — AT Protocol auth with session cookies, no setup
- **SvelteKit-first** — Full-stack with SSR, remote commands, typed XRPC calls

CTA: "Get Started"

---

## Navigation Structure

### Top nav
- Guide → /getting-started/quickstart
- Frontend → /frontend/setup
- CLI → /cli/
- API → /api/

### Sidebar

**Getting Started** (3 pages)
- Quickstart
- Project Structure
- Configuration

**Guides** (7 pages)
- Feeds
- XRPC Handlers
- Auth & OAuth
- Seeds
- Labels
- OpenGraph
- Hooks

**Frontend** (3 pages)
- SvelteKit Setup
- Data Loading
- Mutations

**CLI Reference** (5 pages)
- Overview
- Scaffolding
- Development
- Testing
- Build & Deploy

**API Reference** (7 pages)
- Overview
- Records
- Feeds
- Search
- Blobs
- Preferences
- Labels

---

## Page Details

### Getting Started

**Quickstart** — Zero to running app in under 2 minutes.
1. `npx hatk new my-app`
2. `cd my-app && npm run dev`
3. Open browser, see the app
4. Make a first change (edit a feed or add a record via admin)

No AT Protocol preamble. Jump straight into doing. Explain concepts when they naturally arise.

**Project Structure** — Expanded annotated tree. Each directory gets 2-3 sentences and a link to the relevant guide. Replaces current page which lists directories without connecting them to workflows.

**Configuration** — `hatk.config.ts` reference. Each option with type, default, one-line description. Groups: server (relay, plc, port), database (engine, path), backfill (parallelism, signalCollections), oauth (issuer, scopes, clients). Minimal config example at top showing just the essentials. No DuckDB options.

### Guides

All guides follow the same pattern: what it does, minimal example, then details.

**Feeds** — `defineFeed()` with `generate` and `hydrate`. Statusphere "recent" feed as the example. Pagination with `ctx.paginate()`, hydration for author profiles. Most important guide.

**XRPC Handlers** — `defineQuery()` and `defineProcedure()` with typed context (`Ctx<K>`). `ctx.ok()` for return type enforcement. `ctx.db.query()` for direct SQL, `ctx.lookup()` for cross-collection joins.

**Auth & OAuth** — Rewritten from scratch. No `OAuthClient` class. Focus on: config (hatk.config.ts oauth section), built-in login/callback flow, `parseViewer(cookies)` in layouts, `login()`/`logout()` from `$hatk/client`, `getViewer()` in server code. Complete flow from config to working login.

**Seeds** — `seed()` helper with `createAccount`, `createRecord`, `uploadBlob`. Complete seed file example. `hatk seed` and `hatk reset` commands.

**Labels** — `defineLabel()` with `evaluate()`. Brief.

**OpenGraph** — `defineOG()` with Satori. Brief.

**Hooks** — `defineHook('on-login', ...)` with `ensureRepo`. One example.

### Frontend

**SvelteKit Setup** — Vite plugin (`hatk()` in vite.config.ts), `$hatk` and `$hatk/client` aliases, what the generated files contain, the `app/` directory convention. `hatk generate types` for regeneration.

**Data Loading** — `callXrpc()` from `$hatk/client`. Show in `+page.server.ts` (server-side bridge) and `+page.ts` (universal). `customFetch` for SvelteKit deduplication. `getViewer()` for current user in server code.

**Mutations** — Remote commands with SvelteKit experimental remote functions. `command('unchecked', ...)` pattern. Creating/deleting records via `callXrpc('dev.hatk.createRecord', ...)`. Optimistic UI updates.

### CLI & API Reference

Update to match current signatures. Remove DuckDB references. Add `customFetch` param, `parseViewer`, new generated client exports.

---

## Key Changes from Current Docs

- Drop all DuckDB references (SQLite only)
- Drop TanStack Query (use `callXrpc` directly)
- Drop `OAuthClient` class (use generated `login`/`logout`/`parseViewer`)
- Drop `api-client.md` guide (fold into Frontend section)
- Frontend gets its own top-level section
- Landing page gets project tree visualization
- All examples sourced from hatk-template-statusphere and hatk-template-teal
- Deployment guide updated for SQLite/Railway

## Source Material

- `~/code/hatk-template-statusphere` — simple reference app
- `~/code/hatk-template-teal` — complex reference app with feeds, bookmarks, search
- `~/code/hatk-template-start` — minimal starter
- `~/code/hatk/packages/hatk/src/cli.ts` — generated client output (auth helpers, parseViewer)