From ece1a3f9bd8e2e132e21a2c42f28fa52db831d99 Mon Sep 17 00:00:00 2001 From: Trezy Date: Tue, 12 May 2026 13:28:28 -0500 Subject: [PATCH] docs: convert to fumadocs Signed-off-by: Trezy --- packages/docs/.gitignore | 6 +- .../docs/api-reference}/admin/admin-api.md | 4 +- .../docs/api-reference}/admin/api-clients.md | 4 +- .../docs/api-reference}/admin/api-keys.md | 4 +- .../docs/api-reference}/admin/backfill.md | 4 +- .../docs/api-reference}/admin/domains.md | 4 +- .../docs/api-reference}/admin/events.md | 4 +- .../docs/api-reference}/admin/labelers.md | 4 +- .../docs/api-reference}/admin/lexicons.md | 4 +- .../docs/api-reference/admin/meta.json | 19 + .../docs/api-reference}/admin/plugins.md | 4 +- .../api-reference}/admin/script-variables.md | 4 +- .../docs/api-reference}/admin/settings.md | 4 +- .../docs/api-reference}/admin/stats.md | 4 +- .../docs/api-reference}/admin/users.md | 4 +- .../docs/api-reference}/admin/xrpc-proxy.md | 4 +- .../docs/api-reference}/lua/atproto-api.md | 4 +- .../docs/api-reference}/lua/database-api.md | 4 +- .../docs/api-reference}/lua/http-api.md | 4 +- .../docs/api-reference}/lua/json-api.md | 4 +- .../content/docs/api-reference/lua/meta.json | 13 + .../docs/api-reference}/lua/record-api.md | 4 +- .../api-reference}/lua/standard-libraries.md | 4 +- .../api-reference}/lua/utility-globals.md | 4 +- .../docs/api-reference}/lua/xrpc-lua-api.md | 4 +- .../docs/content/docs/api-reference/meta.json | 9 + .../docs/api-reference}/oauth/api-clients.md | 4 +- .../docs/api-reference/oauth/meta.json | 6 + .../docs/api-reference}/xrpc-api.md | 4 +- .../docs/content/docs/experimental/meta.json | 6 + .../docs/experimental/spaces/changelog.md | 4 +- .../docs/experimental/spaces/credentials.md | 4 +- .../docs/experimental/spaces/index.md} | 4 +- .../docs/experimental/spaces/invites.md | 4 +- .../experimental/spaces/managing-spaces.md | 4 +- .../docs/experimental/spaces/members.md | 4 +- .../docs/experimental/spaces/meta.json | 12 + .../docs/experimental/spaces/records.md | 4 +- .../docs/getting-started/authentication.md | 4 +- .../docs/getting-started/configuration.md | 4 +- .../docs/getting-started/dashboard.md | 4 +- .../docs/getting-started/deployment/docker.md | 4 +- .../docs/getting-started/deployment/meta.json | 9 + .../docs/getting-started/deployment/other.md | 4 +- .../getting-started/deployment/production.md} | 4 +- .../getting-started/deployment/railway.md | 4 +- .../content/docs/getting-started/meta.json | 10 + .../docs/getting-started/quickstart.md | 4 +- .../docs/guides}/api-clients.md | 4 +- .../admin => content/docs/guides}/api-keys.md | 4 +- .../docs/guides}/attestation-signing.md | 4 +- .../docs/guides}/backfill.md | 4 +- .../docs/guides/database/database-setup.md | 4 +- .../content/docs/guides/database/meta.json | 8 + .../database/postgres-to-sqlite-migration.md | 4 +- .../database/sqlite-to-postgres-migration.md | 4 +- .../docs/guides}/developing-plugins.md | 4 +- .../docs/guides}/event-logs.md | 4 +- .../docs/guides}/index-hooks.md | 4 +- .../docs/guides}/labelers.md | 4 +- .../docs/guides}/lexicons.md | 4 +- .../docs/guides/lua-scripting.md} | 4 +- packages/docs/content/docs/guides/meta.json | 19 + .../docs/guides}/permissions.md | 4 +- .../docs/guides}/plugins.md | 4 +- .../docs/guides/upgrading-to-v2.md | 4 +- .../{docs/README.md => content/docs/index.md} | 4 +- packages/docs/content/docs/meta.json | 19 + .../docs/reference/architecture.md | 4 +- .../{ => content}/docs/reference/glossary.md | 4 +- .../docs/content/docs/reference/meta.json | 10 + .../script-examples}/algolia-sync.md | 4 +- .../reference/script-examples}/batch-save.md | 4 +- .../script-examples}/cascading-delete.md | 4 +- .../script-examples}/complex-mutations.md | 4 +- .../script-examples}/create-record.md | 4 +- .../script-examples}/expanded-query.md | 4 +- .../reference/script-examples}/get-record.md | 4 +- .../script-examples}/list-or-fetch.md | 4 +- .../script-examples}/meilisearch-sync.md | 4 +- .../docs/reference/script-examples/meta.json | 20 + .../script-examples}/paginated-list.md | 4 +- .../script-examples}/sidecar-records.md | 4 +- .../script-examples}/signed-record-verify.md | 4 +- .../script-examples}/signed-record.md | 4 +- .../script-examples}/update-or-delete.md | 4 +- .../script-examples}/upsert-record.md | 4 +- .../docs/reference/troubleshooting.md | 4 +- .../content/docs/sdk/lex-agent/changelog.md | 13 + .../docs/content/docs/sdk/lex-agent/meta.json | 7 + .../docs/sdk/lex-agent/overview.md} | 4 +- packages/docs/content/docs/sdk/meta.json | 10 + .../sdk/oauth-client-browser/changelog.md | 21 + .../docs/sdk/oauth-client-browser/meta.json | 7 + .../sdk/oauth-client-browser/overview.md} | 4 +- .../docs/sdk/oauth-client-node/changelog.md | 7 + .../docs/sdk/oauth-client-node/meta.json | 7 + .../docs/sdk/oauth-client-node/overview.md} | 4 +- .../docs/sdk/oauth-client/changelog.md | 21 + .../content/docs/sdk/oauth-client/meta.json | 7 + .../docs/sdk/oauth-client/overview.md} | 4 +- .../docs/{ => content}/docs/sdk/overview.md | 4 +- .../docs/content/docs/tutorials/meta.json | 6 + .../docs/tutorials/statusphere.md | 4 +- packages/docs/docusaurus.config.ts | 70 --- packages/docs/next-env.d.ts | 6 + packages/docs/next.config.mts | 10 + packages/docs/package.json | 30 +- packages/docs/postcss.config.mjs | 7 + .../docs/{static => public}/img/favicon.png | Bin .../docs/{static => public}/img/logo.dark.png | Bin .../{static => public}/img/logo.light.png | Bin packages/docs/{static => public}/img/og.png | Bin packages/docs/scripts/generate-changelogs.mjs | 18 +- packages/docs/sidebars.ts | 541 ------------------ packages/docs/source.config.ts | 12 + .../src/app/docs/[[...slug]]/not-found.tsx | 12 + .../docs/src/app/docs/[[...slug]]/page.tsx | 48 ++ packages/docs/src/app/docs/layout.tsx | 32 ++ packages/docs/src/app/global.css | 16 + packages/docs/src/app/layout.tsx | 29 + packages/docs/src/app/page.tsx | 5 + packages/docs/src/components/mermaid.tsx | 53 ++ packages/docs/src/lib/fonts.ts | 15 + packages/docs/src/lib/source.ts | 6 + packages/docs/tsconfig.json | 45 +- 126 files changed, 831 insertions(+), 716 deletions(-) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/admin-api.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/api-clients.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/api-keys.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/backfill.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/domains.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/events.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/labelers.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/lexicons.md (99%) create mode 100644 packages/docs/content/docs/api-reference/admin/meta.json rename packages/docs/{docs/reference => content/docs/api-reference}/admin/plugins.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/script-variables.md (96%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/settings.md (96%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/stats.md (93%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/users.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/admin/xrpc-proxy.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/atproto-api.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/database-api.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/http-api.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/json-api.md (95%) create mode 100644 packages/docs/content/docs/api-reference/lua/meta.json rename packages/docs/{docs/reference => content/docs/api-reference}/lua/record-api.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/standard-libraries.md (99%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/utility-globals.md (98%) rename packages/docs/{docs/reference => content/docs/api-reference}/lua/xrpc-lua-api.md (98%) create mode 100644 packages/docs/content/docs/api-reference/meta.json rename packages/docs/{docs/reference => content/docs/api-reference}/oauth/api-clients.md (99%) create mode 100644 packages/docs/content/docs/api-reference/oauth/meta.json rename packages/docs/{docs/reference => content/docs/api-reference}/xrpc-api.md (99%) create mode 100644 packages/docs/content/docs/experimental/meta.json rename packages/docs/{ => content}/docs/experimental/spaces/changelog.md (99%) rename packages/docs/{ => content}/docs/experimental/spaces/credentials.md (99%) rename packages/docs/{docs/experimental/spaces.md => content/docs/experimental/spaces/index.md} (99%) rename packages/docs/{ => content}/docs/experimental/spaces/invites.md (99%) rename packages/docs/{ => content}/docs/experimental/spaces/managing-spaces.md (99%) rename packages/docs/{ => content}/docs/experimental/spaces/members.md (99%) create mode 100644 packages/docs/content/docs/experimental/spaces/meta.json rename packages/docs/{ => content}/docs/experimental/spaces/records.md (99%) rename packages/docs/{ => content}/docs/getting-started/authentication.md (99%) rename packages/docs/{ => content}/docs/getting-started/configuration.md (99%) rename packages/docs/{ => content}/docs/getting-started/dashboard.md (99%) rename packages/docs/{ => content}/docs/getting-started/deployment/docker.md (98%) create mode 100644 packages/docs/content/docs/getting-started/deployment/meta.json rename packages/docs/{ => content}/docs/getting-started/deployment/other.md (98%) rename packages/docs/{docs/getting-started/production-deployment.md => content/docs/getting-started/deployment/production.md} (99%) rename packages/docs/{ => content}/docs/getting-started/deployment/railway.md (98%) create mode 100644 packages/docs/content/docs/getting-started/meta.json rename packages/docs/{ => content}/docs/getting-started/quickstart.md (99%) rename packages/docs/{docs/guides/features => content/docs/guides}/api-clients.md (99%) rename packages/docs/{docs/guides/admin => content/docs/guides}/api-keys.md (99%) rename packages/docs/{docs/guides/features => content/docs/guides}/attestation-signing.md (99%) rename packages/docs/{docs/guides/indexing => content/docs/guides}/backfill.md (99%) rename packages/docs/{ => content}/docs/guides/database/database-setup.md (98%) create mode 100644 packages/docs/content/docs/guides/database/meta.json rename packages/docs/{ => content}/docs/guides/database/postgres-to-sqlite-migration.md (98%) rename packages/docs/{ => content}/docs/guides/database/sqlite-to-postgres-migration.md (98%) rename packages/docs/{docs/guides/features => content/docs/guides}/developing-plugins.md (99%) rename packages/docs/{docs/guides/admin => content/docs/guides}/event-logs.md (99%) rename packages/docs/{docs/guides/indexing => content/docs/guides}/index-hooks.md (99%) rename packages/docs/{docs/guides/features => content/docs/guides}/labelers.md (99%) rename packages/docs/{docs/guides/indexing => content/docs/guides}/lexicons.md (99%) rename packages/docs/{docs/guides/scripting.md => content/docs/guides/lua-scripting.md} (99%) create mode 100644 packages/docs/content/docs/guides/meta.json rename packages/docs/{docs/guides/admin => content/docs/guides}/permissions.md (99%) rename packages/docs/{docs/guides/features => content/docs/guides}/plugins.md (99%) rename packages/docs/{ => content}/docs/guides/upgrading-to-v2.md (99%) rename packages/docs/{docs/README.md => content/docs/index.md} (99%) create mode 100644 packages/docs/content/docs/meta.json rename packages/docs/{ => content}/docs/reference/architecture.md (99%) rename packages/docs/{ => content}/docs/reference/glossary.md (99%) create mode 100644 packages/docs/content/docs/reference/meta.json rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/algolia-sync.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/batch-save.md (97%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/cascading-delete.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/complex-mutations.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/create-record.md (97%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/expanded-query.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/get-record.md (96%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/list-or-fetch.md (97%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/meilisearch-sync.md (98%) create mode 100644 packages/docs/content/docs/reference/script-examples/meta.json rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/paginated-list.md (97%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/sidecar-records.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/signed-record-verify.md (97%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/signed-record.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/update-or-delete.md (98%) rename packages/docs/{docs/guides/scripting => content/docs/reference/script-examples}/upsert-record.md (98%) rename packages/docs/{ => content}/docs/reference/troubleshooting.md (99%) create mode 100644 packages/docs/content/docs/sdk/lex-agent/changelog.md create mode 100644 packages/docs/content/docs/sdk/lex-agent/meta.json rename packages/docs/{docs/sdk/lex-agent.md => content/docs/sdk/lex-agent/overview.md} (98%) create mode 100644 packages/docs/content/docs/sdk/meta.json create mode 100644 packages/docs/content/docs/sdk/oauth-client-browser/changelog.md create mode 100644 packages/docs/content/docs/sdk/oauth-client-browser/meta.json rename packages/docs/{docs/sdk/oauth-client-browser.md => content/docs/sdk/oauth-client-browser/overview.md} (99%) create mode 100644 packages/docs/content/docs/sdk/oauth-client-node/changelog.md create mode 100644 packages/docs/content/docs/sdk/oauth-client-node/meta.json rename packages/docs/{docs/sdk/oauth-client-node.md => content/docs/sdk/oauth-client-node/overview.md} (99%) create mode 100644 packages/docs/content/docs/sdk/oauth-client/changelog.md create mode 100644 packages/docs/content/docs/sdk/oauth-client/meta.json rename packages/docs/{docs/sdk/oauth-client.md => content/docs/sdk/oauth-client/overview.md} (99%) rename packages/docs/{ => content}/docs/sdk/overview.md (99%) create mode 100644 packages/docs/content/docs/tutorials/meta.json rename packages/docs/{ => content}/docs/tutorials/statusphere.md (99%) delete mode 100644 packages/docs/docusaurus.config.ts create mode 100644 packages/docs/next-env.d.ts create mode 100644 packages/docs/next.config.mts create mode 100644 packages/docs/postcss.config.mjs rename packages/docs/{static => public}/img/favicon.png (100%) rename packages/docs/{static => public}/img/logo.dark.png (100%) rename packages/docs/{static => public}/img/logo.light.png (100%) rename packages/docs/{static => public}/img/og.png (100%) delete mode 100644 packages/docs/sidebars.ts create mode 100644 packages/docs/source.config.ts create mode 100644 packages/docs/src/app/docs/[[...slug]]/not-found.tsx create mode 100644 packages/docs/src/app/docs/[[...slug]]/page.tsx create mode 100644 packages/docs/src/app/docs/layout.tsx create mode 100644 packages/docs/src/app/global.css create mode 100644 packages/docs/src/app/layout.tsx create mode 100644 packages/docs/src/app/page.tsx create mode 100644 packages/docs/src/components/mermaid.tsx create mode 100644 packages/docs/src/lib/fonts.ts create mode 100644 packages/docs/src/lib/source.ts diff --git a/packages/docs/.gitignore b/packages/docs/.gitignore index 0ff5702..158aaa3 100644 --- a/packages/docs/.gitignore +++ b/packages/docs/.gitignore @@ -1,6 +1,8 @@ .vercel .env*.local +.next +.source # Generated changelogs (built from GitHub releases) -docs/reference/changelog.md -docs/sdk/changelog-*.md +content/docs/reference/changelog.md +content/docs/sdk/changelog-*.md diff --git a/packages/docs/docs/reference/admin/admin-api.md b/packages/docs/content/docs/api-reference/admin/admin-api.md similarity index 99% rename from packages/docs/docs/reference/admin/admin-api.md rename to packages/docs/content/docs/api-reference/admin/admin-api.md index b94f655..dea2496 100644 --- a/packages/docs/docs/reference/admin/admin-api.md +++ b/packages/docs/content/docs/api-reference/admin/admin-api.md @@ -1,4 +1,6 @@ -# Admin API +--- +title: "Overview" +--- The admin API lets you manage lexicons, monitor records, run backfill jobs, and control user access. All endpoints live under `/admin` and require authentication from a DID that exists in the `users` table, with the appropriate [permissions](../../guides/admin/permissions.md) for the endpoint being called. You can also manage all of this through the [web dashboard](../../getting-started/dashboard.md). diff --git a/packages/docs/docs/reference/admin/api-clients.md b/packages/docs/content/docs/api-reference/admin/api-clients.md similarity index 99% rename from packages/docs/docs/reference/admin/api-clients.md rename to packages/docs/content/docs/api-reference/admin/api-clients.md index 79be48f..6178c99 100644 --- a/packages/docs/docs/reference/admin/api-clients.md +++ b/packages/docs/content/docs/api-reference/admin/api-clients.md @@ -1,4 +1,6 @@ -# API Clients +--- +title: "API Clients" +--- API clients identify third-party applications that call HappyView's XRPC endpoints. Every request — authenticated or not — needs an `X-Client-Key` header (or `client_key` query param). Requests without one get `401 Unauthorized`. The client key is HappyView's rate-limit bucket. diff --git a/packages/docs/docs/reference/admin/api-keys.md b/packages/docs/content/docs/api-reference/admin/api-keys.md similarity index 98% rename from packages/docs/docs/reference/admin/api-keys.md rename to packages/docs/content/docs/api-reference/admin/api-keys.md index 1280707..b437637 100644 --- a/packages/docs/docs/reference/admin/api-keys.md +++ b/packages/docs/content/docs/api-reference/admin/api-keys.md @@ -1,4 +1,6 @@ -# API Keys +--- +title: "API Keys" +--- Manage API keys for programmatic access. See the [API Keys guide](../../guides/admin/api-keys.md) for usage details. diff --git a/packages/docs/docs/reference/admin/backfill.md b/packages/docs/content/docs/api-reference/admin/backfill.md similarity index 98% rename from packages/docs/docs/reference/admin/backfill.md rename to packages/docs/content/docs/api-reference/admin/backfill.md index 03736f6..9b4d339 100644 --- a/packages/docs/docs/reference/admin/backfill.md +++ b/packages/docs/content/docs/api-reference/admin/backfill.md @@ -1,4 +1,6 @@ -# Backfill +--- +title: "Backfill" +--- Create and monitor historical backfill jobs. See the [Backfill guide](../../guides/indexing/backfill.md) for background. diff --git a/packages/docs/docs/reference/admin/domains.md b/packages/docs/content/docs/api-reference/admin/domains.md similarity index 99% rename from packages/docs/docs/reference/admin/domains.md rename to packages/docs/content/docs/api-reference/admin/domains.md index 711ce9c..5c90d0e 100644 --- a/packages/docs/docs/reference/admin/domains.md +++ b/packages/docs/content/docs/api-reference/admin/domains.md @@ -1,4 +1,6 @@ -# Domains +--- +title: "Domains" +--- Manage the domains a HappyView instance serves. Each domain gets its own atproto OAuth client identity. The primary domain is set from `PUBLIC_URL` on first boot. All endpoints require the `settings:manage` permission. diff --git a/packages/docs/docs/reference/admin/events.md b/packages/docs/content/docs/api-reference/admin/events.md similarity index 98% rename from packages/docs/docs/reference/admin/events.md rename to packages/docs/content/docs/api-reference/admin/events.md index f54a7f3..d463647 100644 --- a/packages/docs/docs/reference/admin/events.md +++ b/packages/docs/content/docs/api-reference/admin/events.md @@ -1,4 +1,6 @@ -# Event Logs +--- +title: "Event Logs" +--- HappyView logs system events — lexicon changes, record operations, script errors, user actions, and more. See the [Event Logs guide](../../guides/admin/event-logs.md) for details on event types and retention. diff --git a/packages/docs/docs/reference/admin/labelers.md b/packages/docs/content/docs/api-reference/admin/labelers.md similarity index 98% rename from packages/docs/docs/reference/admin/labelers.md rename to packages/docs/content/docs/api-reference/admin/labelers.md index 18b942c..d573ba6 100644 --- a/packages/docs/docs/reference/admin/labelers.md +++ b/packages/docs/content/docs/api-reference/admin/labelers.md @@ -1,4 +1,6 @@ -# Labelers +--- +title: "Labelers" +--- Manage external labeler subscriptions. See the [Labelers guide](../../guides/features/labelers.md) for background. diff --git a/packages/docs/docs/reference/admin/lexicons.md b/packages/docs/content/docs/api-reference/admin/lexicons.md similarity index 99% rename from packages/docs/docs/reference/admin/lexicons.md rename to packages/docs/content/docs/api-reference/admin/lexicons.md index a951116..c312407 100644 --- a/packages/docs/docs/reference/admin/lexicons.md +++ b/packages/docs/content/docs/api-reference/admin/lexicons.md @@ -1,4 +1,6 @@ -# Lexicons +--- +title: "Lexicons" +--- Manage lexicons and network lexicons. See the [Lexicons guide](../../guides/indexing/lexicons.md) for background on how lexicons drive indexing and XRPC routing. diff --git a/packages/docs/content/docs/api-reference/admin/meta.json b/packages/docs/content/docs/api-reference/admin/meta.json new file mode 100644 index 0000000..5582234 --- /dev/null +++ b/packages/docs/content/docs/api-reference/admin/meta.json @@ -0,0 +1,19 @@ +{ + "title": "Admin API", + "pages": [ + "admin-api", + "lexicons", + "stats", + "backfill", + "events", + "api-keys", + "users", + "labelers", + "settings", + "xrpc-proxy", + "domains", + "script-variables", + "api-clients", + "plugins" + ] +} diff --git a/packages/docs/docs/reference/admin/plugins.md b/packages/docs/content/docs/api-reference/admin/plugins.md similarity index 99% rename from packages/docs/docs/reference/admin/plugins.md rename to packages/docs/content/docs/api-reference/admin/plugins.md index 30393fc..fdead49 100644 --- a/packages/docs/docs/reference/admin/plugins.md +++ b/packages/docs/content/docs/api-reference/admin/plugins.md @@ -1,4 +1,6 @@ -# Plugins +--- +title: "Plugins" +--- Plugins extend HappyView with WebAssembly modules sourced from the [official plugin registry](../../guides/features/plugins.md) or any URL serving a `manifest.json`. Most endpoints take a plugin manifest URL and load (or reload) the plugin in place — no restart needed. Encrypted plugin secrets require `TOKEN_ENCRYPTION_KEY` to be configured. diff --git a/packages/docs/docs/reference/admin/script-variables.md b/packages/docs/content/docs/api-reference/admin/script-variables.md similarity index 96% rename from packages/docs/docs/reference/admin/script-variables.md rename to packages/docs/content/docs/api-reference/admin/script-variables.md index 8850992..2b0f51d 100644 --- a/packages/docs/docs/reference/admin/script-variables.md +++ b/packages/docs/content/docs/api-reference/admin/script-variables.md @@ -1,4 +1,6 @@ -# Script Variables +--- +title: "Script Variables" +--- Script variables are encrypted key/value pairs available to Lua scripts via the `vars` global. Use them for secrets like API tokens. diff --git a/packages/docs/docs/reference/admin/settings.md b/packages/docs/content/docs/api-reference/admin/settings.md similarity index 96% rename from packages/docs/docs/reference/admin/settings.md rename to packages/docs/content/docs/api-reference/admin/settings.md index e88724b..7c975e4 100644 --- a/packages/docs/docs/reference/admin/settings.md +++ b/packages/docs/content/docs/api-reference/admin/settings.md @@ -1,4 +1,6 @@ -# Instance Settings +--- +title: "Instance Settings" +--- Instance settings override environment variables at runtime — things like app name, ToS URL, privacy policy URL, and logo. Settings stored here take precedence over their env var equivalents. All endpoints require the `settings:manage` permission. diff --git a/packages/docs/docs/reference/admin/stats.md b/packages/docs/content/docs/api-reference/admin/stats.md similarity index 93% rename from packages/docs/docs/reference/admin/stats.md rename to packages/docs/content/docs/api-reference/admin/stats.md index cab57b4..64c005c 100644 --- a/packages/docs/docs/reference/admin/stats.md +++ b/packages/docs/content/docs/api-reference/admin/stats.md @@ -1,4 +1,6 @@ -# Stats +--- +title: "Stats" +--- ```sh # All examples assume $TOKEN is an API key (hv_...) diff --git a/packages/docs/docs/reference/admin/users.md b/packages/docs/content/docs/api-reference/admin/users.md similarity index 99% rename from packages/docs/docs/reference/admin/users.md rename to packages/docs/content/docs/api-reference/admin/users.md index b7b608e..22aed31 100644 --- a/packages/docs/docs/reference/admin/users.md +++ b/packages/docs/content/docs/api-reference/admin/users.md @@ -1,4 +1,6 @@ -# Users +--- +title: "Users" +--- Manage admin users and their permissions. See the [Permissions guide](../../guides/admin/permissions.md) for available permissions and templates. diff --git a/packages/docs/docs/reference/admin/xrpc-proxy.md b/packages/docs/content/docs/api-reference/admin/xrpc-proxy.md similarity index 98% rename from packages/docs/docs/reference/admin/xrpc-proxy.md rename to packages/docs/content/docs/api-reference/admin/xrpc-proxy.md index 8aa5cf5..bce8faa 100644 --- a/packages/docs/docs/reference/admin/xrpc-proxy.md +++ b/packages/docs/content/docs/api-reference/admin/xrpc-proxy.md @@ -1,4 +1,6 @@ -# XRPC Proxy +--- +title: "XRPC Proxy" +--- Control which unrecognized XRPC methods HappyView forwards to their resolved authority. Locally registered lexicons are always served regardless of this setting. diff --git a/packages/docs/docs/reference/lua/atproto-api.md b/packages/docs/content/docs/api-reference/lua/atproto-api.md similarity index 99% rename from packages/docs/docs/reference/lua/atproto-api.md rename to packages/docs/content/docs/api-reference/lua/atproto-api.md index 9286b7f..b6e6c05 100644 --- a/packages/docs/docs/reference/lua/atproto-api.md +++ b/packages/docs/content/docs/api-reference/lua/atproto-api.md @@ -1,4 +1,6 @@ -# atproto API +--- +title: "atproto API" +--- The `atproto` table provides atproto utility functions. Available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). diff --git a/packages/docs/docs/reference/lua/database-api.md b/packages/docs/content/docs/api-reference/lua/database-api.md similarity index 99% rename from packages/docs/docs/reference/lua/database-api.md rename to packages/docs/content/docs/api-reference/lua/database-api.md index c6797c7..6f80d67 100644 --- a/packages/docs/docs/reference/lua/database-api.md +++ b/packages/docs/content/docs/api-reference/lua/database-api.md @@ -1,4 +1,6 @@ -# Database API +--- +title: "Database API" +--- The `db` table provides access to the database. Available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). diff --git a/packages/docs/docs/reference/lua/http-api.md b/packages/docs/content/docs/api-reference/lua/http-api.md similarity index 98% rename from packages/docs/docs/reference/lua/http-api.md rename to packages/docs/content/docs/api-reference/lua/http-api.md index 8d1c935..b6b9aee 100644 --- a/packages/docs/docs/reference/lua/http-api.md +++ b/packages/docs/content/docs/api-reference/lua/http-api.md @@ -1,4 +1,6 @@ -# HTTP API +--- +title: "HTTP API" +--- The `http` table provides async HTTP client functions. Available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). diff --git a/packages/docs/docs/reference/lua/json-api.md b/packages/docs/content/docs/api-reference/lua/json-api.md similarity index 95% rename from packages/docs/docs/reference/lua/json-api.md rename to packages/docs/content/docs/api-reference/lua/json-api.md index 7d712d7..67f65fa 100644 --- a/packages/docs/docs/reference/lua/json-api.md +++ b/packages/docs/content/docs/api-reference/lua/json-api.md @@ -1,4 +1,6 @@ -# JSON API +--- +title: "JSON API" +--- The `json` global provides JSON serialization and deserialization. Available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). diff --git a/packages/docs/content/docs/api-reference/lua/meta.json b/packages/docs/content/docs/api-reference/lua/meta.json new file mode 100644 index 0000000..d65b99a --- /dev/null +++ b/packages/docs/content/docs/api-reference/lua/meta.json @@ -0,0 +1,13 @@ +{ + "title": "Lua API", + "pages": [ + "record-api", + "database-api", + "http-api", + "xrpc-lua-api", + "atproto-api", + "json-api", + "utility-globals", + "standard-libraries" + ] +} diff --git a/packages/docs/docs/reference/lua/record-api.md b/packages/docs/content/docs/api-reference/lua/record-api.md similarity index 99% rename from packages/docs/docs/reference/lua/record-api.md rename to packages/docs/content/docs/api-reference/lua/record-api.md index 79e2107..d15fec9 100644 --- a/packages/docs/docs/reference/lua/record-api.md +++ b/packages/docs/content/docs/api-reference/lua/record-api.md @@ -1,4 +1,6 @@ -# Record API +--- +title: "Record API" +--- The `Record` API is only available in **procedure** scripts. It handles creating, updating, loading, and deleting atproto records. Writes are proxied to the caller's PDS and indexed locally. diff --git a/packages/docs/docs/reference/lua/standard-libraries.md b/packages/docs/content/docs/api-reference/lua/standard-libraries.md similarity index 99% rename from packages/docs/docs/reference/lua/standard-libraries.md rename to packages/docs/content/docs/api-reference/lua/standard-libraries.md index c5a4d24..adbf908 100644 --- a/packages/docs/docs/reference/lua/standard-libraries.md +++ b/packages/docs/content/docs/api-reference/lua/standard-libraries.md @@ -1,4 +1,6 @@ -# Standard Libraries +--- +title: "Standard Libraries" +--- The following Lua 5.4 standard library modules and builtins are available in the HappyView sandbox. diff --git a/packages/docs/docs/reference/lua/utility-globals.md b/packages/docs/content/docs/api-reference/lua/utility-globals.md similarity index 98% rename from packages/docs/docs/reference/lua/utility-globals.md rename to packages/docs/content/docs/api-reference/lua/utility-globals.md index 235219c..de1bb5a 100644 --- a/packages/docs/docs/reference/lua/utility-globals.md +++ b/packages/docs/content/docs/api-reference/lua/utility-globals.md @@ -1,4 +1,6 @@ -# Utility Globals +--- +title: "Utility Globals" +--- Global functions available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). These don't belong to a specific API table — they're available at the top level of any Lua script. diff --git a/packages/docs/docs/reference/lua/xrpc-lua-api.md b/packages/docs/content/docs/api-reference/lua/xrpc-lua-api.md similarity index 98% rename from packages/docs/docs/reference/lua/xrpc-lua-api.md rename to packages/docs/content/docs/api-reference/lua/xrpc-lua-api.md index f0a9a85..8179a30 100644 --- a/packages/docs/docs/reference/lua/xrpc-lua-api.md +++ b/packages/docs/content/docs/api-reference/lua/xrpc-lua-api.md @@ -1,4 +1,6 @@ -# XRPC Lua API +--- +title: "XRPC Lua API" +--- The `xrpc` table provides cross-endpoint XRPC calls. Available in queries, procedures, and [index hooks](../../guides/indexing/index-hooks.md). diff --git a/packages/docs/content/docs/api-reference/meta.json b/packages/docs/content/docs/api-reference/meta.json new file mode 100644 index 0000000..c46480f --- /dev/null +++ b/packages/docs/content/docs/api-reference/meta.json @@ -0,0 +1,9 @@ +{ + "title": "API Reference", + "pages": [ + "xrpc-api", + "admin", + "oauth", + "lua" + ] +} diff --git a/packages/docs/docs/reference/oauth/api-clients.md b/packages/docs/content/docs/api-reference/oauth/api-clients.md similarity index 99% rename from packages/docs/docs/reference/oauth/api-clients.md rename to packages/docs/content/docs/api-reference/oauth/api-clients.md index e77416b..72d257c 100644 --- a/packages/docs/docs/reference/oauth/api-clients.md +++ b/packages/docs/content/docs/api-reference/oauth/api-clients.md @@ -1,4 +1,6 @@ -# Third-Party API Clients +--- +title: "Third-Party API Clients" +--- Third-party applications can manage their own API clients via the `dev.happyview.*` XRPC endpoints. A third-party client is always tied to exactly one parent — the admin-created top-level API client whose DPoP session made the request. Only one level of nesting is allowed; third-party clients cannot create further children. Each third-party client gets its own rate limit bucket with instance default settings. diff --git a/packages/docs/content/docs/api-reference/oauth/meta.json b/packages/docs/content/docs/api-reference/oauth/meta.json new file mode 100644 index 0000000..4c2f6d3 --- /dev/null +++ b/packages/docs/content/docs/api-reference/oauth/meta.json @@ -0,0 +1,6 @@ +{ + "title": "OAuth API", + "pages": [ + "api-clients" + ] +} diff --git a/packages/docs/docs/reference/xrpc-api.md b/packages/docs/content/docs/api-reference/xrpc-api.md similarity index 99% rename from packages/docs/docs/reference/xrpc-api.md rename to packages/docs/content/docs/api-reference/xrpc-api.md index c6aeb65..47fda88 100644 --- a/packages/docs/docs/reference/xrpc-api.md +++ b/packages/docs/content/docs/api-reference/xrpc-api.md @@ -1,4 +1,6 @@ -# XRPC API +--- +title: "XRPC API" +--- [XRPC](https://atproto.com/specs/xrpc) is the HTTP-based RPC protocol used by the atproto. HappyView dynamically registers XRPC endpoints based on your uploaded [lexicons](../guides/indexing/lexicons.md): query lexicons become `GET /xrpc/{nsid}` routes, procedure lexicons become `POST /xrpc/{nsid}` routes. diff --git a/packages/docs/content/docs/experimental/meta.json b/packages/docs/content/docs/experimental/meta.json new file mode 100644 index 0000000..0655f33 --- /dev/null +++ b/packages/docs/content/docs/experimental/meta.json @@ -0,0 +1,6 @@ +{ + "title": "Experimental", + "pages": [ + "spaces" + ] +} diff --git a/packages/docs/docs/experimental/spaces/changelog.md b/packages/docs/content/docs/experimental/spaces/changelog.md similarity index 99% rename from packages/docs/docs/experimental/spaces/changelog.md rename to packages/docs/content/docs/experimental/spaces/changelog.md index deaf36e..fda0ec3 100644 --- a/packages/docs/docs/experimental/spaces/changelog.md +++ b/packages/docs/content/docs/experimental/spaces/changelog.md @@ -1,4 +1,6 @@ -# Changelog +--- +title: "Changelog" +--- ## Latest diff --git a/packages/docs/docs/experimental/spaces/credentials.md b/packages/docs/content/docs/experimental/spaces/credentials.md similarity index 99% rename from packages/docs/docs/experimental/spaces/credentials.md rename to packages/docs/content/docs/experimental/spaces/credentials.md index afd8855..ab17537 100644 --- a/packages/docs/docs/experimental/spaces/credentials.md +++ b/packages/docs/content/docs/experimental/spaces/credentials.md @@ -1,4 +1,6 @@ -# Credentials +--- +title: "Credentials" +--- :::caution Experimental This API is experimental and will change. See the [Permissioned Spaces overview](../spaces.md) for context. diff --git a/packages/docs/docs/experimental/spaces.md b/packages/docs/content/docs/experimental/spaces/index.md similarity index 99% rename from packages/docs/docs/experimental/spaces.md rename to packages/docs/content/docs/experimental/spaces/index.md index 41d9e0e..37cda75 100644 --- a/packages/docs/docs/experimental/spaces.md +++ b/packages/docs/content/docs/experimental/spaces/index.md @@ -1,4 +1,6 @@ -# Permissioned Spaces +--- +title: "Overview" +--- :::caution Experimental Permissioned Spaces are experimental and the API will change. This implementation follows Daniel Holmgren's [Permissioned Data Diaries](https://dholms.leaflet.pub/3meluqcwky22a) and aligns structurally with the `permissioned-data` branch on `bluesky-social/atproto`, but uses a `dev.happyview` namespace to allow iteration while the official spec stabilizes. diff --git a/packages/docs/docs/experimental/spaces/invites.md b/packages/docs/content/docs/experimental/spaces/invites.md similarity index 99% rename from packages/docs/docs/experimental/spaces/invites.md rename to packages/docs/content/docs/experimental/spaces/invites.md index b0e15ce..169f512 100644 --- a/packages/docs/docs/experimental/spaces/invites.md +++ b/packages/docs/content/docs/experimental/spaces/invites.md @@ -1,4 +1,6 @@ -# Invites +--- +title: "Invites" +--- :::caution Experimental This API is experimental and will change. See the [Permissioned Spaces overview](../spaces.md) for context. diff --git a/packages/docs/docs/experimental/spaces/managing-spaces.md b/packages/docs/content/docs/experimental/spaces/managing-spaces.md similarity index 99% rename from packages/docs/docs/experimental/spaces/managing-spaces.md rename to packages/docs/content/docs/experimental/spaces/managing-spaces.md index caff754..59d2315 100644 --- a/packages/docs/docs/experimental/spaces/managing-spaces.md +++ b/packages/docs/content/docs/experimental/spaces/managing-spaces.md @@ -1,4 +1,6 @@ -# Managing Spaces +--- +title: "Managing Spaces" +--- :::caution Experimental This API is experimental and will change. See the [Permissioned Spaces overview](../spaces.md) for context. diff --git a/packages/docs/docs/experimental/spaces/members.md b/packages/docs/content/docs/experimental/spaces/members.md similarity index 99% rename from packages/docs/docs/experimental/spaces/members.md rename to packages/docs/content/docs/experimental/spaces/members.md index 24299a8..a290b1b 100644 --- a/packages/docs/docs/experimental/spaces/members.md +++ b/packages/docs/content/docs/experimental/spaces/members.md @@ -1,4 +1,6 @@ -# Members +--- +title: "Members" +--- :::caution Experimental This API is experimental and will change. See the [Permissioned Spaces overview](../spaces.md) for context. diff --git a/packages/docs/content/docs/experimental/spaces/meta.json b/packages/docs/content/docs/experimental/spaces/meta.json new file mode 100644 index 0000000..cdfbf93 --- /dev/null +++ b/packages/docs/content/docs/experimental/spaces/meta.json @@ -0,0 +1,12 @@ +{ + "title": "Permissioned Spaces", + "pages": [ + "index", + "managing-spaces", + "members", + "records", + "credentials", + "invites", + "changelog" + ] +} diff --git a/packages/docs/docs/experimental/spaces/records.md b/packages/docs/content/docs/experimental/spaces/records.md similarity index 99% rename from packages/docs/docs/experimental/spaces/records.md rename to packages/docs/content/docs/experimental/spaces/records.md index b58dfa9..bac88c3 100644 --- a/packages/docs/docs/experimental/spaces/records.md +++ b/packages/docs/content/docs/experimental/spaces/records.md @@ -1,4 +1,6 @@ -# Records +--- +title: "Records" +--- :::caution Experimental This API is experimental and will change. See the [Permissioned Spaces overview](../spaces.md) for context. diff --git a/packages/docs/docs/getting-started/authentication.md b/packages/docs/content/docs/getting-started/authentication.md similarity index 99% rename from packages/docs/docs/getting-started/authentication.md rename to packages/docs/content/docs/getting-started/authentication.md index 0ae4a2a..16a443a 100644 --- a/packages/docs/docs/getting-started/authentication.md +++ b/packages/docs/content/docs/getting-started/authentication.md @@ -1,4 +1,6 @@ -# Authentication +--- +title: "Authentication" +--- HappyView has two distinct authentication surfaces: diff --git a/packages/docs/docs/getting-started/configuration.md b/packages/docs/content/docs/getting-started/configuration.md similarity index 99% rename from packages/docs/docs/getting-started/configuration.md rename to packages/docs/content/docs/getting-started/configuration.md index 0c7f530..421e65f 100644 --- a/packages/docs/docs/getting-started/configuration.md +++ b/packages/docs/content/docs/getting-started/configuration.md @@ -1,4 +1,6 @@ -# Configuration +--- +title: "Configuration" +--- HappyView is configured via environment variables. A `.env` file in the project root is loaded automatically on startup. See [Deployment](deployment/docker.md) for local setup or [Production Deployment](production-deployment.md) for production setup. diff --git a/packages/docs/docs/getting-started/dashboard.md b/packages/docs/content/docs/getting-started/dashboard.md similarity index 99% rename from packages/docs/docs/getting-started/dashboard.md rename to packages/docs/content/docs/getting-started/dashboard.md index b5292bf..82a3485 100644 --- a/packages/docs/docs/getting-started/dashboard.md +++ b/packages/docs/content/docs/getting-started/dashboard.md @@ -1,4 +1,6 @@ -# Dashboard +--- +title: "Dashboard" +--- HappyView ships with a web dashboard that provides a visual interface for everything the [admin API](../reference/admin/admin-api.md) offers. It runs as a separate Next.js application alongside the Rust backend and authenticates via atproto OAuth. diff --git a/packages/docs/docs/getting-started/deployment/docker.md b/packages/docs/content/docs/getting-started/deployment/docker.md similarity index 98% rename from packages/docs/docs/getting-started/deployment/docker.md rename to packages/docs/content/docs/getting-started/deployment/docker.md index d111ab2..2ca804a 100644 --- a/packages/docs/docs/getting-started/deployment/docker.md +++ b/packages/docs/content/docs/getting-started/deployment/docker.md @@ -1,4 +1,6 @@ -# Local Development with Docker +--- +title: "Docker" +--- This guide runs HappyView and the dashboard locally using Docker Compose. diff --git a/packages/docs/content/docs/getting-started/deployment/meta.json b/packages/docs/content/docs/getting-started/deployment/meta.json new file mode 100644 index 0000000..894c06a --- /dev/null +++ b/packages/docs/content/docs/getting-started/deployment/meta.json @@ -0,0 +1,9 @@ +{ + "title": "Deployment", + "pages": [ + "railway", + "docker", + "other", + "production" + ] +} diff --git a/packages/docs/docs/getting-started/deployment/other.md b/packages/docs/content/docs/getting-started/deployment/other.md similarity index 98% rename from packages/docs/docs/getting-started/deployment/other.md rename to packages/docs/content/docs/getting-started/deployment/other.md index 5eae03a..b048f28 100644 --- a/packages/docs/docs/getting-started/deployment/other.md +++ b/packages/docs/content/docs/getting-started/deployment/other.md @@ -1,4 +1,6 @@ -# Local Development from Source +--- +title: "From Source" +--- This guide runs HappyView directly with `cargo run`. If you'd rather use Docker Compose, see [Local Development with Docker](docker.md). diff --git a/packages/docs/docs/getting-started/production-deployment.md b/packages/docs/content/docs/getting-started/deployment/production.md similarity index 99% rename from packages/docs/docs/getting-started/production-deployment.md rename to packages/docs/content/docs/getting-started/deployment/production.md index 640a66d..e4bfa6c 100644 --- a/packages/docs/docs/getting-started/production-deployment.md +++ b/packages/docs/content/docs/getting-started/deployment/production.md @@ -1,4 +1,6 @@ -# Production +--- +title: "Production" +--- This page covers what to change when taking a HappyView instance from local development to production. For setup instructions, see [Deployment](../getting-started/deployment/railway.md). This page assumes you already have a working deployment and focuses on hardening and operational concerns. diff --git a/packages/docs/docs/getting-started/deployment/railway.md b/packages/docs/content/docs/getting-started/deployment/railway.md similarity index 98% rename from packages/docs/docs/getting-started/deployment/railway.md rename to packages/docs/content/docs/getting-started/deployment/railway.md index 79046c5..d43d10b 100644 --- a/packages/docs/docs/getting-started/deployment/railway.md +++ b/packages/docs/content/docs/getting-started/deployment/railway.md @@ -1,4 +1,6 @@ -# Deploy on Railway +--- +title: "Railway" +--- The fastest way to get HappyView running is with Railway. Choose the database you want and these templates will deploy HappyView with a single click: diff --git a/packages/docs/content/docs/getting-started/meta.json b/packages/docs/content/docs/getting-started/meta.json new file mode 100644 index 0000000..290dbfe --- /dev/null +++ b/packages/docs/content/docs/getting-started/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Getting Started", + "pages": [ + "quickstart", + "configuration", + "dashboard", + "authentication", + "deployment" + ] +} diff --git a/packages/docs/docs/getting-started/quickstart.md b/packages/docs/content/docs/getting-started/quickstart.md similarity index 99% rename from packages/docs/docs/getting-started/quickstart.md rename to packages/docs/content/docs/getting-started/quickstart.md index 4fcf78d..c7e7da8 100644 --- a/packages/docs/docs/getting-started/quickstart.md +++ b/packages/docs/content/docs/getting-started/quickstart.md @@ -1,4 +1,6 @@ -# Quickstart +--- +title: "Quickstart" +--- This page walks you through the fastest path to a working HappyView instance. By the end, you'll have an AppView that indexes records from the atproto network and serves XRPC endpoints. diff --git a/packages/docs/docs/guides/features/api-clients.md b/packages/docs/content/docs/guides/api-clients.md similarity index 99% rename from packages/docs/docs/guides/features/api-clients.md rename to packages/docs/content/docs/guides/api-clients.md index 274c226..14d7341 100644 --- a/packages/docs/docs/guides/features/api-clients.md +++ b/packages/docs/content/docs/guides/api-clients.md @@ -1,4 +1,6 @@ -# API Clients +--- +title: "API Clients" +--- API clients identify your application to a HappyView instance. Every XRPC request — even unauthenticated queries — must include a client key. This guide walks through creating a client, choosing between public and confidential types, and authenticating users. diff --git a/packages/docs/docs/guides/admin/api-keys.md b/packages/docs/content/docs/guides/api-keys.md similarity index 99% rename from packages/docs/docs/guides/admin/api-keys.md rename to packages/docs/content/docs/guides/api-keys.md index a5a9655..b21765e 100644 --- a/packages/docs/docs/guides/admin/api-keys.md +++ b/packages/docs/content/docs/guides/api-keys.md @@ -1,4 +1,6 @@ -# API Keys +--- +title: "API Keys" +--- API keys let you authenticate with the admin API without going through the OAuth flow. They're useful for CI/CD pipelines, scripts, and any automation that needs to manage your HappyView instance programmatically. diff --git a/packages/docs/docs/guides/features/attestation-signing.md b/packages/docs/content/docs/guides/attestation-signing.md similarity index 99% rename from packages/docs/docs/guides/features/attestation-signing.md rename to packages/docs/content/docs/guides/attestation-signing.md index 3348c2f..077f84f 100644 --- a/packages/docs/docs/guides/features/attestation-signing.md +++ b/packages/docs/content/docs/guides/attestation-signing.md @@ -1,4 +1,6 @@ -# Attestation Signing +--- +title: "Attestation Signing" +--- HappyView can sign records with an ECDSA (secp256k1) keypair so their origin can be verified later. Lua scripts call `atproto.sign()` to attach an inline signature to a record and `atproto.verify_signature()` to check one. HappyView's implementation follows the [atproto attestation spec](https://tangled.org/strings/did:plc:cbkjy5n7bk3ax2wplmtjofq2/3m3fy2xuahc22). diff --git a/packages/docs/docs/guides/indexing/backfill.md b/packages/docs/content/docs/guides/backfill.md similarity index 99% rename from packages/docs/docs/guides/indexing/backfill.md rename to packages/docs/content/docs/guides/backfill.md index 292a05c..ba2b638 100644 --- a/packages/docs/docs/guides/indexing/backfill.md +++ b/packages/docs/content/docs/guides/backfill.md @@ -1,4 +1,6 @@ -# Backfill +--- +title: "Backfill" +--- When you add a new record-type lexicon, HappyView starts indexing new records from that moment via [Jetstream](https://github.com/bluesky-social/jetstream). But what about records that already exist on the network? That's what backfill does: HappyView discovers repos via the relay and fetches records directly from each user's PDS. diff --git a/packages/docs/docs/guides/database/database-setup.md b/packages/docs/content/docs/guides/database/database-setup.md similarity index 98% rename from packages/docs/docs/guides/database/database-setup.md rename to packages/docs/content/docs/guides/database/database-setup.md index 88919e5..9e13162 100644 --- a/packages/docs/docs/guides/database/database-setup.md +++ b/packages/docs/content/docs/guides/database/database-setup.md @@ -1,4 +1,6 @@ -# Database Setup +--- +title: "Database Setup" +--- HappyView supports two database backends: **SQLite** (default) and **PostgreSQL**. The backend is auto-detected from your `DATABASE_URL` scheme, or you can set `DATABASE_BACKEND` explicitly. diff --git a/packages/docs/content/docs/guides/database/meta.json b/packages/docs/content/docs/guides/database/meta.json new file mode 100644 index 0000000..b3a9ea1 --- /dev/null +++ b/packages/docs/content/docs/guides/database/meta.json @@ -0,0 +1,8 @@ +{ + "title": "Database", + "pages": [ + "database-setup", + "postgres-to-sqlite-migration", + "sqlite-to-postgres-migration" + ] +} diff --git a/packages/docs/docs/guides/database/postgres-to-sqlite-migration.md b/packages/docs/content/docs/guides/database/postgres-to-sqlite-migration.md similarity index 98% rename from packages/docs/docs/guides/database/postgres-to-sqlite-migration.md rename to packages/docs/content/docs/guides/database/postgres-to-sqlite-migration.md index 5a8afc0..0ce1a86 100644 --- a/packages/docs/docs/guides/database/postgres-to-sqlite-migration.md +++ b/packages/docs/content/docs/guides/database/postgres-to-sqlite-migration.md @@ -1,4 +1,6 @@ -# Migrating from Postgres to SQLite +--- +title: "Postgres to SQLite Migration" +--- This guide covers migrating an existing HappyView deployment from Postgres to SQLite. If you are staying on Postgres, no action is required. diff --git a/packages/docs/docs/guides/database/sqlite-to-postgres-migration.md b/packages/docs/content/docs/guides/database/sqlite-to-postgres-migration.md similarity index 98% rename from packages/docs/docs/guides/database/sqlite-to-postgres-migration.md rename to packages/docs/content/docs/guides/database/sqlite-to-postgres-migration.md index d75c814..edfead4 100644 --- a/packages/docs/docs/guides/database/sqlite-to-postgres-migration.md +++ b/packages/docs/content/docs/guides/database/sqlite-to-postgres-migration.md @@ -1,4 +1,6 @@ -# Migrating from SQLite to Postgres +--- +title: "SQLite to Postgres Migration" +--- This guide covers migrating an existing HappyView deployment from SQLite to Postgres. If you are staying on SQLite, no action is required. diff --git a/packages/docs/docs/guides/features/developing-plugins.md b/packages/docs/content/docs/guides/developing-plugins.md similarity index 99% rename from packages/docs/docs/guides/features/developing-plugins.md rename to packages/docs/content/docs/guides/developing-plugins.md index 03d4fab..a0ca83b 100644 --- a/packages/docs/docs/guides/features/developing-plugins.md +++ b/packages/docs/content/docs/guides/developing-plugins.md @@ -1,4 +1,6 @@ -# Developing Plugins +--- +title: "Developing Plugins" +--- This guide covers how to build your own HappyView WASM plugins. For installing and configuring plugins, see the [Plugins guide](plugins.md). diff --git a/packages/docs/docs/guides/admin/event-logs.md b/packages/docs/content/docs/guides/event-logs.md similarity index 99% rename from packages/docs/docs/guides/admin/event-logs.md rename to packages/docs/content/docs/guides/event-logs.md index aebd43b..b1354d5 100644 --- a/packages/docs/docs/guides/admin/event-logs.md +++ b/packages/docs/content/docs/guides/event-logs.md @@ -1,4 +1,6 @@ -# Event Logs +--- +title: "Event Logs" +--- HappyView maintains an internal event log that records system activity — lexicon changes, record operations, Lua script executions and errors, user actions, API key events, backfill jobs, and Jetstream connectivity. Events are stored in the database and queryable via the [admin API](../../reference/admin/events.md). diff --git a/packages/docs/docs/guides/indexing/index-hooks.md b/packages/docs/content/docs/guides/index-hooks.md similarity index 99% rename from packages/docs/docs/guides/indexing/index-hooks.md rename to packages/docs/content/docs/guides/index-hooks.md index a7f37d1..2749e53 100644 --- a/packages/docs/docs/guides/indexing/index-hooks.md +++ b/packages/docs/content/docs/guides/index-hooks.md @@ -1,4 +1,6 @@ -# Index Hooks +--- +title: "Index Hooks" +--- Index hooks are Lua scripts that run whenever a record in a collection is created, updated, or deleted. They run **before** the record is indexed, giving you the ability to filter out unwanted records, transform record data before storage, or trigger side effects like syncing with external services. diff --git a/packages/docs/docs/guides/features/labelers.md b/packages/docs/content/docs/guides/labelers.md similarity index 99% rename from packages/docs/docs/guides/features/labelers.md rename to packages/docs/content/docs/guides/labelers.md index a5ce876..2b554e6 100644 --- a/packages/docs/docs/guides/features/labelers.md +++ b/packages/docs/content/docs/guides/labelers.md @@ -1,4 +1,6 @@ -# Labelers +--- +title: "Labelers" +--- Labelers are external services that apply content labels to records. They operate out-of-band — labeler data does not appear in repos or flow through relays. HappyView can subscribe to labelers and store the labels they emit, making them available on records in the admin dashboard and via Lua scripts. diff --git a/packages/docs/docs/guides/indexing/lexicons.md b/packages/docs/content/docs/guides/lexicons.md similarity index 99% rename from packages/docs/docs/guides/indexing/lexicons.md rename to packages/docs/content/docs/guides/lexicons.md index f5a74ca..85c1354 100644 --- a/packages/docs/docs/guides/indexing/lexicons.md +++ b/packages/docs/content/docs/guides/lexicons.md @@ -1,4 +1,6 @@ -# Lexicons +--- +title: "Lexicons" +--- Lexicons are the core building block of HappyView. They're [atproto schema definitions](https://atproto.com/specs/lexicon) that describe your data model, and HappyView uses them to decide which records to index from the network and what XRPC endpoints to serve. diff --git a/packages/docs/docs/guides/scripting.md b/packages/docs/content/docs/guides/lua-scripting.md similarity index 99% rename from packages/docs/docs/guides/scripting.md rename to packages/docs/content/docs/guides/lua-scripting.md index 62982d0..e22128d 100644 --- a/packages/docs/docs/guides/scripting.md +++ b/packages/docs/content/docs/guides/lua-scripting.md @@ -1,4 +1,6 @@ -# Lua Scripting +--- +title: "Lua Scripting" +--- Without Lua scripts, HappyView's query endpoints return raw records and procedure endpoints proxy simple creates and updates. Lua scripts let you go much further: diff --git a/packages/docs/content/docs/guides/meta.json b/packages/docs/content/docs/guides/meta.json new file mode 100644 index 0000000..0cf3422 --- /dev/null +++ b/packages/docs/content/docs/guides/meta.json @@ -0,0 +1,19 @@ +{ + "title": "Guides", + "pages": [ + "upgrading-to-v2", + "lexicons", + "backfill", + "index-hooks", + "lua-scripting", + "api-clients", + "attestation-signing", + "labelers", + "plugins", + "developing-plugins", + "api-keys", + "permissions", + "event-logs", + "database" + ] +} diff --git a/packages/docs/docs/guides/admin/permissions.md b/packages/docs/content/docs/guides/permissions.md similarity index 99% rename from packages/docs/docs/guides/admin/permissions.md rename to packages/docs/content/docs/guides/permissions.md index b6aa668..42ea1cd 100644 --- a/packages/docs/docs/guides/admin/permissions.md +++ b/packages/docs/content/docs/guides/permissions.md @@ -1,4 +1,6 @@ -# Permissions +--- +title: "Permissions" +--- HappyView uses a granular permission system to control access to the admin API. Each user has a set of permissions that determine which endpoints they can access. Permissions can be assigned individually, via templates, or both. diff --git a/packages/docs/docs/guides/features/plugins.md b/packages/docs/content/docs/guides/plugins.md similarity index 99% rename from packages/docs/docs/guides/features/plugins.md rename to packages/docs/content/docs/guides/plugins.md index 0715892..4281c57 100644 --- a/packages/docs/docs/guides/features/plugins.md +++ b/packages/docs/content/docs/guides/plugins.md @@ -1,4 +1,6 @@ -# Plugins +--- +title: "Plugins" +--- HappyView uses WASM plugins to extend its functionality. Plugins can integrate with external platforms, sync data to users' atproto identities, and more. Auth plugins — the first supported plugin type — enable users to link accounts from platforms like Steam, Xbox, itch.io, and others, then sync data like game libraries. diff --git a/packages/docs/docs/guides/upgrading-to-v2.md b/packages/docs/content/docs/guides/upgrading-to-v2.md similarity index 99% rename from packages/docs/docs/guides/upgrading-to-v2.md rename to packages/docs/content/docs/guides/upgrading-to-v2.md index 25c9f60..3abaffd 100644 --- a/packages/docs/docs/guides/upgrading-to-v2.md +++ b/packages/docs/content/docs/guides/upgrading-to-v2.md @@ -1,4 +1,6 @@ -# Migrating from v1 +--- +title: "Migrating from v1" +--- v2 consolidates HappyView, [Tap](https://github.com/bluesky-social/indigo/tree/main/cmd/tap), and [AIP](https://tangled.org/gamesgamesgamesgames.games/aip) into a single binary. Real-time indexing, backfill, and OAuth are now built in — there are no companion services to deploy. diff --git a/packages/docs/docs/README.md b/packages/docs/content/docs/index.md similarity index 99% rename from packages/docs/docs/README.md rename to packages/docs/content/docs/index.md index 1dfda7a..17c7e67 100644 --- a/packages/docs/docs/README.md +++ b/packages/docs/content/docs/index.md @@ -1,4 +1,6 @@ -# HappyView +--- +title: "Introduction" +--- HappyView is the best way to build an [AppView](https://atproto.com/guides/glossary#app-view) for the [AT Protocol](https://atproto.com). Upload your [lexicon](reference/glossary.md#atproto-terms) schemas and get a fully functional AppView, complete with [XRPC](reference/glossary.md#atproto-terms) endpoints, OAuth, real-time network sync, and historical [backfill](guides/indexing/backfill.md), without writing a single line of server code. diff --git a/packages/docs/content/docs/meta.json b/packages/docs/content/docs/meta.json new file mode 100644 index 0000000..1202053 --- /dev/null +++ b/packages/docs/content/docs/meta.json @@ -0,0 +1,19 @@ +{ + "pages": [ + "index", + "---Getting Started---", + "...getting-started", + "---Tutorials---", + "...tutorials", + "---Guides---", + "...guides", + "---JavaScript SDKs---", + "...sdk", + "---Experimental---", + "...experimental", + "---API Reference---", + "...api-reference", + "---Reference---", + "...reference" + ] +} diff --git a/packages/docs/docs/reference/architecture.md b/packages/docs/content/docs/reference/architecture.md similarity index 99% rename from packages/docs/docs/reference/architecture.md rename to packages/docs/content/docs/reference/architecture.md index 766c258..682e0a1 100644 --- a/packages/docs/docs/reference/architecture.md +++ b/packages/docs/content/docs/reference/architecture.md @@ -1,4 +1,6 @@ -# Architecture +--- +title: "Architecture" +--- Guide for contributors working on HappyView itself. For a user-facing overview, see the [Introduction](../README.md). diff --git a/packages/docs/docs/reference/glossary.md b/packages/docs/content/docs/reference/glossary.md similarity index 99% rename from packages/docs/docs/reference/glossary.md rename to packages/docs/content/docs/reference/glossary.md index f19dd87..8bf3d87 100644 --- a/packages/docs/docs/reference/glossary.md +++ b/packages/docs/content/docs/reference/glossary.md @@ -1,4 +1,6 @@ -# Glossary +--- +title: "Glossary" +--- Key terms used throughout the HappyView documentation. For a broader introduction to the atproto, see the [official ATProto glossary](https://atproto.com/guides/glossary). diff --git a/packages/docs/content/docs/reference/meta.json b/packages/docs/content/docs/reference/meta.json new file mode 100644 index 0000000..2a84973 --- /dev/null +++ b/packages/docs/content/docs/reference/meta.json @@ -0,0 +1,10 @@ +{ + "title": "Reference", + "pages": [ + "glossary", + "architecture", + "script-examples", + "troubleshooting", + "changelog" + ] +} diff --git a/packages/docs/docs/guides/scripting/algolia-sync.md b/packages/docs/content/docs/reference/script-examples/algolia-sync.md similarity index 98% rename from packages/docs/docs/guides/scripting/algolia-sync.md rename to packages/docs/content/docs/reference/script-examples/algolia-sync.md index 30c27d2..3167180 100644 --- a/packages/docs/docs/guides/scripting/algolia-sync.md +++ b/packages/docs/content/docs/reference/script-examples/algolia-sync.md @@ -1,4 +1,6 @@ -# Index Hook: Algolia Sync +--- +title: "Algolia Sync" +--- Push records to an Algolia search index whenever they are created, updated, or deleted on the network. diff --git a/packages/docs/docs/guides/scripting/batch-save.md b/packages/docs/content/docs/reference/script-examples/batch-save.md similarity index 97% rename from packages/docs/docs/guides/scripting/batch-save.md rename to packages/docs/content/docs/reference/script-examples/batch-save.md index 669734a..405056f 100644 --- a/packages/docs/docs/guides/scripting/batch-save.md +++ b/packages/docs/content/docs/reference/script-examples/batch-save.md @@ -1,4 +1,6 @@ -# Procedure: Batch Save +--- +title: "Batch Save" +--- Use `Record.save_all()` to create multiple records in parallel. diff --git a/packages/docs/docs/guides/scripting/cascading-delete.md b/packages/docs/content/docs/reference/script-examples/cascading-delete.md similarity index 98% rename from packages/docs/docs/guides/scripting/cascading-delete.md rename to packages/docs/content/docs/reference/script-examples/cascading-delete.md index 870868f..ca2ebc0 100644 --- a/packages/docs/docs/guides/scripting/cascading-delete.md +++ b/packages/docs/content/docs/reference/script-examples/cascading-delete.md @@ -1,4 +1,6 @@ -# Procedure: Cascading Delete +--- +title: "Cascading Delete" +--- Delete a record and all related records across collections. diff --git a/packages/docs/docs/guides/scripting/complex-mutations.md b/packages/docs/content/docs/reference/script-examples/complex-mutations.md similarity index 98% rename from packages/docs/docs/guides/scripting/complex-mutations.md rename to packages/docs/content/docs/reference/script-examples/complex-mutations.md index 94453e2..35208af 100644 --- a/packages/docs/docs/guides/scripting/complex-mutations.md +++ b/packages/docs/content/docs/reference/script-examples/complex-mutations.md @@ -1,4 +1,6 @@ -# Procedure: Complex Mutations +--- +title: "Complex Mutations" +--- Load an existing record, apply multiple transformations, and save it back. diff --git a/packages/docs/docs/guides/scripting/create-record.md b/packages/docs/content/docs/reference/script-examples/create-record.md similarity index 97% rename from packages/docs/docs/guides/scripting/create-record.md rename to packages/docs/content/docs/reference/script-examples/create-record.md index 7b0429e..cd022d7 100644 --- a/packages/docs/docs/guides/scripting/create-record.md +++ b/packages/docs/content/docs/reference/script-examples/create-record.md @@ -1,4 +1,6 @@ -# Procedure: Create a Record +--- +title: "Create Record" +--- The simplest write: take the request body, save it as a record, and return the URI. diff --git a/packages/docs/docs/guides/scripting/expanded-query.md b/packages/docs/content/docs/reference/script-examples/expanded-query.md similarity index 98% rename from packages/docs/docs/guides/scripting/expanded-query.md rename to packages/docs/content/docs/reference/script-examples/expanded-query.md index 8415038..dfdb211 100644 --- a/packages/docs/docs/guides/scripting/expanded-query.md +++ b/packages/docs/content/docs/reference/script-examples/expanded-query.md @@ -1,4 +1,6 @@ -# Query: Expanded Query with Profiles +--- +title: "Expanded Query" +--- List statuses and include the profile of each user who created one. diff --git a/packages/docs/docs/guides/scripting/get-record.md b/packages/docs/content/docs/reference/script-examples/get-record.md similarity index 96% rename from packages/docs/docs/guides/scripting/get-record.md rename to packages/docs/content/docs/reference/script-examples/get-record.md index 6ecd7e4..838bd05 100644 --- a/packages/docs/docs/guides/scripting/get-record.md +++ b/packages/docs/content/docs/reference/script-examples/get-record.md @@ -1,4 +1,6 @@ -# Query: Get a Single Record +--- +title: "Get a Record" +--- Fetch a single record by its AT URI. diff --git a/packages/docs/docs/guides/scripting/list-or-fetch.md b/packages/docs/content/docs/reference/script-examples/list-or-fetch.md similarity index 97% rename from packages/docs/docs/guides/scripting/list-or-fetch.md rename to packages/docs/content/docs/reference/script-examples/list-or-fetch.md index 3aa63a2..242280e 100644 --- a/packages/docs/docs/guides/scripting/list-or-fetch.md +++ b/packages/docs/content/docs/reference/script-examples/list-or-fetch.md @@ -1,4 +1,6 @@ -# Query: List or Fetch Records +--- +title: "List or Fetch" +--- This query handles both single-record lookups (when a `uri` param is provided) and paginated listing. diff --git a/packages/docs/docs/guides/scripting/meilisearch-sync.md b/packages/docs/content/docs/reference/script-examples/meilisearch-sync.md similarity index 98% rename from packages/docs/docs/guides/scripting/meilisearch-sync.md rename to packages/docs/content/docs/reference/script-examples/meilisearch-sync.md index 4061776..177297c 100644 --- a/packages/docs/docs/guides/scripting/meilisearch-sync.md +++ b/packages/docs/content/docs/reference/script-examples/meilisearch-sync.md @@ -1,4 +1,6 @@ -# Index Hook: Meilisearch Sync +--- +title: "Meilisearch Sync" +--- Push records to a Meilisearch search index whenever they are created, updated, or deleted on the network. diff --git a/packages/docs/content/docs/reference/script-examples/meta.json b/packages/docs/content/docs/reference/script-examples/meta.json new file mode 100644 index 0000000..1d3802b --- /dev/null +++ b/packages/docs/content/docs/reference/script-examples/meta.json @@ -0,0 +1,20 @@ +{ + "title": "Script Examples", + "pages": [ + "get-record", + "create-record", + "upsert-record", + "paginated-list", + "list-or-fetch", + "expanded-query", + "update-or-delete", + "batch-save", + "sidecar-records", + "cascading-delete", + "complex-mutations", + "signed-record", + "signed-record-verify", + "algolia-sync", + "meilisearch-sync" + ] +} diff --git a/packages/docs/docs/guides/scripting/paginated-list.md b/packages/docs/content/docs/reference/script-examples/paginated-list.md similarity index 97% rename from packages/docs/docs/guides/scripting/paginated-list.md rename to packages/docs/content/docs/reference/script-examples/paginated-list.md index b1aaeed..7a281e7 100644 --- a/packages/docs/docs/guides/scripting/paginated-list.md +++ b/packages/docs/content/docs/reference/script-examples/paginated-list.md @@ -1,4 +1,6 @@ -# Query: Paginated List +--- +title: "Paginated List" +--- List records from a collection with cursor-based pagination and an optional DID filter. diff --git a/packages/docs/docs/guides/scripting/sidecar-records.md b/packages/docs/content/docs/reference/script-examples/sidecar-records.md similarity index 98% rename from packages/docs/docs/guides/scripting/sidecar-records.md rename to packages/docs/content/docs/reference/script-examples/sidecar-records.md index 142f752..529da25 100644 --- a/packages/docs/docs/guides/scripting/sidecar-records.md +++ b/packages/docs/content/docs/reference/script-examples/sidecar-records.md @@ -1,4 +1,6 @@ -# Procedure: Create Sidecar Records +--- +title: "Sidecar Records" +--- Create two records with different collection NSIDs but the same rkey, linking them together by key. diff --git a/packages/docs/docs/guides/scripting/signed-record-verify.md b/packages/docs/content/docs/reference/script-examples/signed-record-verify.md similarity index 97% rename from packages/docs/docs/guides/scripting/signed-record-verify.md rename to packages/docs/content/docs/reference/script-examples/signed-record-verify.md index dc0dcd5..d42b361 100644 --- a/packages/docs/docs/guides/scripting/signed-record-verify.md +++ b/packages/docs/content/docs/reference/script-examples/signed-record-verify.md @@ -1,4 +1,6 @@ -# Query: Verify Signed Record +--- +title: "Verify Signed Record" +--- Fetch a record and verify its attestation signature. diff --git a/packages/docs/docs/guides/scripting/signed-record.md b/packages/docs/content/docs/reference/script-examples/signed-record.md similarity index 98% rename from packages/docs/docs/guides/scripting/signed-record.md rename to packages/docs/content/docs/reference/script-examples/signed-record.md index 448bc55..46e8ab2 100644 --- a/packages/docs/docs/guides/scripting/signed-record.md +++ b/packages/docs/content/docs/reference/script-examples/signed-record.md @@ -1,4 +1,6 @@ -# Procedure: Signed Record +--- +title: "Signed Record" +--- Save a record with an attestation signature attached. diff --git a/packages/docs/docs/guides/scripting/update-or-delete.md b/packages/docs/content/docs/reference/script-examples/update-or-delete.md similarity index 98% rename from packages/docs/docs/guides/scripting/update-or-delete.md rename to packages/docs/content/docs/reference/script-examples/update-or-delete.md index ee565df..40371ce 100644 --- a/packages/docs/docs/guides/scripting/update-or-delete.md +++ b/packages/docs/content/docs/reference/script-examples/update-or-delete.md @@ -1,4 +1,6 @@ -# Procedure: Update or Delete +--- +title: "Update or Delete" +--- A single endpoint that handles create, update, and delete based on the input fields. diff --git a/packages/docs/docs/guides/scripting/upsert-record.md b/packages/docs/content/docs/reference/script-examples/upsert-record.md similarity index 98% rename from packages/docs/docs/guides/scripting/upsert-record.md rename to packages/docs/content/docs/reference/script-examples/upsert-record.md index 1a1b45c..f963e3e 100644 --- a/packages/docs/docs/guides/scripting/upsert-record.md +++ b/packages/docs/content/docs/reference/script-examples/upsert-record.md @@ -1,4 +1,6 @@ -# Procedure: Upsert a Record +--- +title: "Upsert Record" +--- Create a new record, or update an existing one if the client provides its rkey. diff --git a/packages/docs/docs/reference/troubleshooting.md b/packages/docs/content/docs/reference/troubleshooting.md similarity index 99% rename from packages/docs/docs/reference/troubleshooting.md rename to packages/docs/content/docs/reference/troubleshooting.md index eae25bf..d67c75c 100644 --- a/packages/docs/docs/reference/troubleshooting.md +++ b/packages/docs/content/docs/reference/troubleshooting.md @@ -1,4 +1,6 @@ -# Troubleshooting +--- +title: "Troubleshooting" +--- Common issues and how to resolve them. diff --git a/packages/docs/content/docs/sdk/lex-agent/changelog.md b/packages/docs/content/docs/sdk/lex-agent/changelog.md new file mode 100644 index 0000000..a43b984 --- /dev/null +++ b/packages/docs/content/docs/sdk/lex-agent/changelog.md @@ -0,0 +1,13 @@ +--- +title: "Changelog" +--- + + + +## v1.1.0 + +*Released 2026-05-05* + +### Features + +* update JS SDKs to more closely match their [@atproto](https://github.com/atproto) cousins ([7b87c36](https://github.com/gamesgamesgamesgamesgames/happyview/commit/7b87c36ffd9458942c321009b4a39013abb9cff7)) diff --git a/packages/docs/content/docs/sdk/lex-agent/meta.json b/packages/docs/content/docs/sdk/lex-agent/meta.json new file mode 100644 index 0000000..49fdf0f --- /dev/null +++ b/packages/docs/content/docs/sdk/lex-agent/meta.json @@ -0,0 +1,7 @@ +{ + "title": "Lex Agent", + "pages": [ + "overview", + "changelog" + ] +} diff --git a/packages/docs/docs/sdk/lex-agent.md b/packages/docs/content/docs/sdk/lex-agent/overview.md similarity index 98% rename from packages/docs/docs/sdk/lex-agent.md rename to packages/docs/content/docs/sdk/lex-agent/overview.md index 0119846..4cc2ad9 100644 --- a/packages/docs/docs/sdk/lex-agent.md +++ b/packages/docs/content/docs/sdk/lex-agent/overview.md @@ -1,4 +1,6 @@ -# Lex Agent +--- +title: "Lex Agent" +--- The Lex agent adapter is the recommended way to interact with HappyView from JavaScript. It creates an [`@atproto/lex`](https://npmx.dev/package/@atproto/lex) `Agent` from a `HappyViewSession`, so you can use `@atproto/lex`'s type-safe `Client` to make XRPC calls with HappyView's DPoP authentication. All requests are routed to your HappyView instance, which handles its own lexicons locally and proxies standard atproto methods (e.g., `com.atproto.repo.createRecord`) to the user's PDS. diff --git a/packages/docs/content/docs/sdk/meta.json b/packages/docs/content/docs/sdk/meta.json new file mode 100644 index 0000000..b6d0b18 --- /dev/null +++ b/packages/docs/content/docs/sdk/meta.json @@ -0,0 +1,10 @@ +{ + "title": "JavaScript SDKs", + "pages": [ + "overview", + "lex-agent", + "oauth-client", + "oauth-client-browser", + "oauth-client-node" + ] +} diff --git a/packages/docs/content/docs/sdk/oauth-client-browser/changelog.md b/packages/docs/content/docs/sdk/oauth-client-browser/changelog.md new file mode 100644 index 0000000..d25a298 --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client-browser/changelog.md @@ -0,0 +1,21 @@ +--- +title: "Changelog" +--- + + + +## v1.2.0 + +*Released 2026-05-05* + +### Features + +* update JS SDKs to more closely match their [@atproto](https://github.com/atproto) cousins ([7b87c36](https://github.com/gamesgamesgamesgamesgames/happyview/commit/7b87c36ffd9458942c321009b4a39013abb9cff7)) + +## v1.1.0 + +*Released 2026-04-25* + +### Features + +* **sdk:** allow client to configure clientId ([e76acbe](https://github.com/gamesgamesgamesgamesgames/happyview/commit/e76acbea356b453910ffdc6eaac78b42bfd2fd74)) diff --git a/packages/docs/content/docs/sdk/oauth-client-browser/meta.json b/packages/docs/content/docs/sdk/oauth-client-browser/meta.json new file mode 100644 index 0000000..1fe68c4 --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client-browser/meta.json @@ -0,0 +1,7 @@ +{ + "title": "OAuth Client Browser", + "pages": [ + "overview", + "changelog" + ] +} diff --git a/packages/docs/docs/sdk/oauth-client-browser.md b/packages/docs/content/docs/sdk/oauth-client-browser/overview.md similarity index 99% rename from packages/docs/docs/sdk/oauth-client-browser.md rename to packages/docs/content/docs/sdk/oauth-client-browser/overview.md index eef3bbe..ef521da 100644 --- a/packages/docs/docs/sdk/oauth-client-browser.md +++ b/packages/docs/content/docs/sdk/oauth-client-browser/overview.md @@ -1,4 +1,6 @@ -# Browser Client +--- +title: "Browser Client" +--- The browser client handles the full OAuth redirect flow for browser apps authenticating with a HappyView instance. It wraps the [OAuth Client](./oauth-client.md) with Web Crypto, localStorage, and atproto handle/DID resolution. diff --git a/packages/docs/content/docs/sdk/oauth-client-node/changelog.md b/packages/docs/content/docs/sdk/oauth-client-node/changelog.md new file mode 100644 index 0000000..ad569ea --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client-node/changelog.md @@ -0,0 +1,7 @@ +--- +title: "Changelog" +--- + + + +No releases yet. diff --git a/packages/docs/content/docs/sdk/oauth-client-node/meta.json b/packages/docs/content/docs/sdk/oauth-client-node/meta.json new file mode 100644 index 0000000..cf16b93 --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client-node/meta.json @@ -0,0 +1,7 @@ +{ + "title": "OAuth Client Node", + "pages": [ + "overview", + "changelog" + ] +} diff --git a/packages/docs/docs/sdk/oauth-client-node.md b/packages/docs/content/docs/sdk/oauth-client-node/overview.md similarity index 99% rename from packages/docs/docs/sdk/oauth-client-node.md rename to packages/docs/content/docs/sdk/oauth-client-node/overview.md index 2b5d2b2..8d5f9e6 100644 --- a/packages/docs/docs/sdk/oauth-client-node.md +++ b/packages/docs/content/docs/sdk/oauth-client-node/overview.md @@ -1,4 +1,6 @@ -# Node Client +--- +title: "Node Client" +--- Server-side OAuth client for authenticating with a HappyView instance using AT Protocol. Built on top of [`@happyview/oauth-client`](./oauth-client.md), matching the API surface of [`@atproto/oauth-client-node`](https://www.npmjs.com/package/@atproto/oauth-client-node). diff --git a/packages/docs/content/docs/sdk/oauth-client/changelog.md b/packages/docs/content/docs/sdk/oauth-client/changelog.md new file mode 100644 index 0000000..9f3c6cd --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client/changelog.md @@ -0,0 +1,21 @@ +--- +title: "Changelog" +--- + + + +## v1.1.1 + +*Released 2026-05-08* + +### Bug Fixes + +* expose oauth scopes via the SDKs ([bbcddd0](https://github.com/gamesgamesgamesgamesgames/happyview/commit/bbcddd08fd12105e1c047616cf84dc71a44bf9b7)) + +## v1.1.0 + +*Released 2026-05-05* + +### Features + +* update JS SDKs to more closely match their [@atproto](https://github.com/atproto) cousins ([7b87c36](https://github.com/gamesgamesgamesgamesgames/happyview/commit/7b87c36ffd9458942c321009b4a39013abb9cff7)) diff --git a/packages/docs/content/docs/sdk/oauth-client/meta.json b/packages/docs/content/docs/sdk/oauth-client/meta.json new file mode 100644 index 0000000..06ecb5f --- /dev/null +++ b/packages/docs/content/docs/sdk/oauth-client/meta.json @@ -0,0 +1,7 @@ +{ + "title": "OAuth Client", + "pages": [ + "overview", + "changelog" + ] +} diff --git a/packages/docs/docs/sdk/oauth-client.md b/packages/docs/content/docs/sdk/oauth-client/overview.md similarity index 99% rename from packages/docs/docs/sdk/oauth-client.md rename to packages/docs/content/docs/sdk/oauth-client/overview.md index 4e90da3..1b13b20 100644 --- a/packages/docs/docs/sdk/oauth-client.md +++ b/packages/docs/content/docs/sdk/oauth-client/overview.md @@ -1,4 +1,6 @@ -# OAuth Client +--- +title: "OAuth Client" +--- The core OAuth client handles DPoP key provisioning, session registration, and session restoration against a HappyView instance. It's platform-agnostic — you provide a `CryptoAdapter` and optional `StorageAdapter` for your environment. diff --git a/packages/docs/docs/sdk/overview.md b/packages/docs/content/docs/sdk/overview.md similarity index 99% rename from packages/docs/docs/sdk/overview.md rename to packages/docs/content/docs/sdk/overview.md index 60fede4..8deddbb 100644 --- a/packages/docs/docs/sdk/overview.md +++ b/packages/docs/content/docs/sdk/overview.md @@ -1,4 +1,6 @@ -# JavaScript SDK +--- +title: "Overview" +--- HappyView provides JavaScript packages for building third-party apps that authenticate with a HappyView instance and make XRPC requests on behalf of users. diff --git a/packages/docs/content/docs/tutorials/meta.json b/packages/docs/content/docs/tutorials/meta.json new file mode 100644 index 0000000..7ea6192 --- /dev/null +++ b/packages/docs/content/docs/tutorials/meta.json @@ -0,0 +1,6 @@ +{ + "title": "Tutorials", + "pages": [ + "statusphere" + ] +} diff --git a/packages/docs/docs/tutorials/statusphere.md b/packages/docs/content/docs/tutorials/statusphere.md similarity index 99% rename from packages/docs/docs/tutorials/statusphere.md rename to packages/docs/content/docs/tutorials/statusphere.md index 5b9983d..01c957d 100644 --- a/packages/docs/docs/tutorials/statusphere.md +++ b/packages/docs/content/docs/tutorials/statusphere.md @@ -1,4 +1,6 @@ -# Tutorial: Statusphere with HappyView +--- +title: "Statusphere" +--- [Statusphere](https://github.com/bluesky-social/statusphere-example-app) is an example atproto application where users set their current status as a single emoji. It's a great way to learn how HappyView works because the data model is simple but the queries are interesting. diff --git a/packages/docs/docusaurus.config.ts b/packages/docs/docusaurus.config.ts deleted file mode 100644 index 6e3afed..0000000 --- a/packages/docs/docusaurus.config.ts +++ /dev/null @@ -1,70 +0,0 @@ -import type { Config } from "@docusaurus/types"; -import type * as Preset from "@docusaurus/preset-classic"; - -const config: Config = { - title: "HappyView", - tagline: "Lexicon-driven ATProto AppView", - url: "https://happyview.dev", - baseUrl: "/", - favicon: "img/favicon.png", - onBrokenLinks: "throw", - markdown: { - mermaid: true, - }, - themes: ["@docusaurus/theme-mermaid"], - - i18n: { - defaultLocale: "en", - locales: ["en"], - }, - - presets: [ - [ - "classic", - { - docs: { - path: "docs", - routeBasePath: "/", - sidebarPath: "./sidebars.ts", - }, - blog: false, - theme: { - customCss: undefined, - }, - } satisfies Preset.Options, - ], - ], - - themeConfig: { - image: "img/og.png", - navbar: { - title: "", - logo: { - alt: "HappyView", - src: "img/logo.light.png", - srcDark: "img/logo.dark.png", - }, - items: [ - { - type: "docSidebar", - sidebarId: "docs", - position: "left", - label: "Docs", - }, - { - href: "https://tangled.org/gamesgamesgamesgames.games/happyview", - label: "Source", - position: "right", - }, - ], - }, - prism: { - additionalLanguages: ["lua"], - }, - footer: { - copyright: `Copyright \u00a9 ${new Date().getFullYear()} Birbhouse Games.`, - }, - } satisfies Preset.ThemeConfig, -}; - -export default config; diff --git a/packages/docs/next-env.d.ts b/packages/docs/next-env.d.ts new file mode 100644 index 0000000..c4b7818 --- /dev/null +++ b/packages/docs/next-env.d.ts @@ -0,0 +1,6 @@ +/// +/// +import "./.next/dev/types/routes.d.ts"; + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/packages/docs/next.config.mts b/packages/docs/next.config.mts new file mode 100644 index 0000000..40f832f --- /dev/null +++ b/packages/docs/next.config.mts @@ -0,0 +1,10 @@ +import { createMDX } from 'fumadocs-mdx/next'; +import type { NextConfig } from 'next'; + +const config: NextConfig = { + transpilePackages: ['@happyview/design-system'], +}; + +const withMDX = createMDX(); + +export default withMDX(config); diff --git a/packages/docs/package.json b/packages/docs/package.json index 7ccc467..5a9da50 100644 --- a/packages/docs/package.json +++ b/packages/docs/package.json @@ -3,24 +3,28 @@ "version": "0.0.0", "private": true, "scripts": { - "start": "docusaurus start", + "dev": "next dev --turbopack", "generate-changelogs": "node scripts/generate-changelogs.mjs", - "build": "npm run generate-changelogs && docusaurus build", - "clear": "docusaurus clear" + "build": "npm run generate-changelogs && next build", + "start": "next start" }, "dependencies": { - "@docusaurus/core": "^3.10.0", - "@docusaurus/preset-classic": "^3.10.0", - "@docusaurus/theme-mermaid": "^3.10.0", - "@mdx-js/react": "^3.1.1", - "@mermaid-js/layout-elk": "^0.1.9", - "@tailwindcss/typography": "^0.5.19", - "prismjs": "^1.30.0", - "react": "^19.0.0", - "react-dom": "^19.0.0" + "@happyview/design-system": "workspace:*", + "@types/mdx": "^2.0.13", + "fumadocs-core": "^16.8.10", + "fumadocs-mdx": "^15.0.4", + "fumadocs-ui": "^16.8.10", + "mermaid": "^11.6.0", + "next-themes": "^0.4.6", + "next": "^16.1.6", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "@tailwindcss/postcss": "^4.2.0", + "tailwindcss": "^4.2.0" }, "devDependencies": { - "@docusaurus/tsconfig": "^3.10.0", + "@types/node": "^22.0.0", + "@types/react": "^19.0.0", "typescript": "^5.7.0" } } diff --git a/packages/docs/postcss.config.mjs b/packages/docs/postcss.config.mjs new file mode 100644 index 0000000..297374d --- /dev/null +++ b/packages/docs/postcss.config.mjs @@ -0,0 +1,7 @@ +const config = { + plugins: { + '@tailwindcss/postcss': {}, + }, +}; + +export default config; diff --git a/packages/docs/static/img/favicon.png b/packages/docs/public/img/favicon.png similarity index 100% rename from packages/docs/static/img/favicon.png rename to packages/docs/public/img/favicon.png diff --git a/packages/docs/static/img/logo.dark.png b/packages/docs/public/img/logo.dark.png similarity index 100% rename from packages/docs/static/img/logo.dark.png rename to packages/docs/public/img/logo.dark.png diff --git a/packages/docs/static/img/logo.light.png b/packages/docs/public/img/logo.light.png similarity index 100% rename from packages/docs/static/img/logo.light.png rename to packages/docs/public/img/logo.light.png diff --git a/packages/docs/static/img/og.png b/packages/docs/public/img/og.png similarity index 100% rename from packages/docs/static/img/og.png rename to packages/docs/public/img/og.png diff --git a/packages/docs/scripts/generate-changelogs.mjs b/packages/docs/scripts/generate-changelogs.mjs index 96f261f..a1b7c3a 100644 --- a/packages/docs/scripts/generate-changelogs.mjs +++ b/packages/docs/scripts/generate-changelogs.mjs @@ -6,31 +6,31 @@ const API_BASE = "https://api.github.com"; const CHANGELOGS = [ { name: "HappyView", - output: "docs/reference/changelog.md", + output: "content/docs/reference/changelog.md", match: (tag) => /^v\d/.test(tag), formatVersion: (tag) => tag, }, { name: "@happyview/oauth-client", - output: "docs/sdk/changelog-oauth-client.md", + output: "content/docs/sdk/changelog-oauth-client.md", match: (tag) => tag.startsWith("@happyview/oauth-client-v"), formatVersion: (tag) => tag.replace("@happyview/oauth-client-", ""), }, { name: "@happyview/oauth-client-browser", - output: "docs/sdk/changelog-oauth-client-browser.md", + output: "content/docs/sdk/changelog-oauth-client-browser.md", match: (tag) => tag.startsWith("@happyview/oauth-client-browser-v"), formatVersion: (tag) => tag.replace("@happyview/oauth-client-browser-", ""), }, { name: "@happyview/oauth-client-node", - output: "docs/sdk/changelog-oauth-client-node.md", + output: "content/docs/sdk/changelog-oauth-client-node.md", match: (tag) => tag.startsWith("@happyview/oauth-client-node-v"), formatVersion: (tag) => tag.replace("@happyview/oauth-client-node-", ""), }, { name: "@happyview/lex-agent", - output: "docs/sdk/changelog-lex-agent.md", + output: "content/docs/sdk/changelog-lex-agent.md", match: (tag) => tag.startsWith("@happyview/lex-agent-v"), formatVersion: (tag) => tag.replace("@happyview/lex-agent-", ""), }, @@ -84,7 +84,9 @@ function buildMarkdown(changelog, releases) { if (matching.length === 0) return null; const lines = [ - `# ${changelog.name}`, + `---`, + `title: "${changelog.name}"`, + `---`, "", ``, "", @@ -139,7 +141,9 @@ async function main() { let md = buildMarkdown(changelog, releases); if (!md) { md = [ - `# ${changelog.name}`, + `---`, + `title: "${changelog.name}"`, + `---`, "", ``, "", diff --git a/packages/docs/sidebars.ts b/packages/docs/sidebars.ts deleted file mode 100644 index 553e6bc..0000000 --- a/packages/docs/sidebars.ts +++ /dev/null @@ -1,541 +0,0 @@ -import type { SidebarsConfig } from "@docusaurus/plugin-content-docs"; - -const sidebars: SidebarsConfig = { - docs: [ - { - type: "doc", - id: "README", - label: "Introduction", - }, - { - type: "category", - label: "Getting Started", - items: [ - { - type: "doc", - id: "getting-started/quickstart", - label: "Quickstart", - }, - { - type: "doc", - id: "getting-started/configuration", - label: "Configuration", - }, - { - type: "doc", - id: "getting-started/dashboard", - label: "Dashboard", - }, - { - type: "doc", - id: "getting-started/authentication", - label: "Authentication", - }, - { - type: "category", - label: "Deployment", - items: [ - { - type: "doc", - id: "getting-started/deployment/railway", - label: "Railway", - }, - { - type: "doc", - id: "getting-started/deployment/docker", - label: "Docker", - }, - { - type: "doc", - id: "getting-started/deployment/other", - label: "From Source", - }, - { - type: "doc", - id: "getting-started/production-deployment", - label: "Production", - }, - ], - }, - ], - }, - { - type: "category", - label: "Tutorials", - items: [ - { - type: "doc", - id: "tutorials/statusphere", - label: "Statusphere", - }, - ], - }, - { - type: "category", - label: "Guides", - items: [ - { - type: "doc", - id: "guides/upgrading-to-v2", - label: "Migrating from v1", - }, - { - type: "category", - label: "Features", - items: [ - { - type: "doc", - id: "guides/features/api-clients", - label: "API Clients", - }, - { - type: "doc", - id: "guides/features/attestation-signing", - label: "Attestation Signing", - }, - { - type: "doc", - id: "guides/features/labelers", - label: "Labelers", - }, - { - type: "doc", - id: "guides/features/plugins", - label: "Plugins", - }, - { - type: "doc", - id: "guides/features/developing-plugins", - label: "Developing Plugins", - }, - ], - }, - { - type: "category", - label: "Indexing", - items: [ - { - type: "doc", - id: "guides/indexing/lexicons", - label: "Lexicons", - }, - { - type: "doc", - id: "guides/indexing/backfill", - label: "Backfill", - }, - { - type: "doc", - id: "guides/indexing/index-hooks", - label: "Index Hooks", - }, - ], - }, - { - type: "category", - label: "Scripting", - items: [ - { - type: "doc", - id: "guides/scripting", - label: "Lua Scripting", - }, - { - type: "category", - label: "Script Examples", - items: [ - { - type: "doc", - id: "guides/scripting/get-record", - label: "Get a Record", - }, - { - type: "doc", - id: "guides/scripting/create-record", - label: "Create Record", - }, - { - type: "doc", - id: "guides/scripting/upsert-record", - label: "Upsert Record", - }, - { - type: "doc", - id: "guides/scripting/paginated-list", - label: "Paginated List", - }, - { - type: "doc", - id: "guides/scripting/list-or-fetch", - label: "List or Fetch", - }, - { - type: "doc", - id: "guides/scripting/expanded-query", - label: "Expanded Query", - }, - { - type: "doc", - id: "guides/scripting/update-or-delete", - label: "Update or Delete", - }, - { - type: "doc", - id: "guides/scripting/batch-save", - label: "Batch Save", - }, - { - type: "doc", - id: "guides/scripting/sidecar-records", - label: "Sidecar Records", - }, - { - type: "doc", - id: "guides/scripting/cascading-delete", - label: "Cascading Delete", - }, - { - type: "doc", - id: "guides/scripting/complex-mutations", - label: "Complex Mutations", - }, - { - type: "doc", - id: "guides/scripting/signed-record", - label: "Signed Record", - }, - { - type: "doc", - id: "guides/scripting/signed-record-verify", - label: "Verify Signed Record", - }, - { - type: "doc", - id: "guides/scripting/algolia-sync", - label: "Algolia Sync", - }, - { - type: "doc", - id: "guides/scripting/meilisearch-sync", - label: "Meilisearch Sync", - }, - ], - }, - ], - }, - { - type: "category", - label: "Administration", - items: [ - { - type: "doc", - id: "guides/admin/api-keys", - label: "API Keys", - }, - { - type: "doc", - id: "guides/admin/permissions", - label: "Permissions", - }, - { - type: "doc", - id: "guides/admin/event-logs", - label: "Event Logs", - }, - ], - }, - { - type: "category", - label: "Database", - items: [ - { - type: "doc", - id: "guides/database/database-setup", - label: "Database Setup", - }, - { - type: "doc", - id: "guides/database/postgres-to-sqlite-migration", - label: "Postgres → SQLite Migration", - }, - { - type: "doc", - id: "guides/database/sqlite-to-postgres-migration", - label: "SQLite → Postgres Migration", - }, - ], - }, - ], - }, - { - type: "category", - label: "JavaScript SDK", - items: [ - { - type: "doc", - id: "sdk/overview", - label: "Overview", - }, - { - type: "doc", - id: "sdk/lex-agent", - label: "Lex Agent", - }, - { - type: "doc", - id: "sdk/oauth-client", - label: "OAuth Client", - }, - { - type: "doc", - id: "sdk/oauth-client-browser", - label: "Browser Client", - }, - { - type: "doc", - id: "sdk/oauth-client-node", - label: "Node Client", - }, - ], - }, - { - type: "category", - label: "Experimental", - items: [ - { - type: "category", - label: "Permissioned Spaces", - items: [ - { - type: "doc", - id: "experimental/spaces", - label: "Overview", - }, - { - type: "doc", - id: "experimental/spaces/managing-spaces", - label: "Managing Spaces", - }, - { - type: "doc", - id: "experimental/spaces/members", - label: "Members", - }, - { - type: "doc", - id: "experimental/spaces/records", - label: "Records", - }, - { - type: "doc", - id: "experimental/spaces/credentials", - label: "Credentials", - }, - { - type: "doc", - id: "experimental/spaces/invites", - label: "Invites", - }, - { - type: "doc", - id: "experimental/spaces/changelog", - label: "Changelog", - }, - ], - }, - ], - }, - { - type: "category", - label: "Reference", - items: [ - { - type: "doc", - id: "reference/xrpc-api", - label: "XRPC API", - }, - { - type: "category", - label: "Admin API", - items: [ - { - type: "doc", - id: "reference/admin/admin-api", - label: "Overview", - }, - { - type: "doc", - id: "reference/admin/lexicons", - label: "Lexicons", - }, - { - type: "doc", - id: "reference/admin/stats", - label: "Stats", - }, - { - type: "doc", - id: "reference/admin/backfill", - label: "Backfill", - }, - { - type: "doc", - id: "reference/admin/events", - label: "Event Logs", - }, - { - type: "doc", - id: "reference/admin/api-keys", - label: "API Keys", - }, - { - type: "doc", - id: "reference/admin/users", - label: "Users", - }, - { - type: "doc", - id: "reference/admin/labelers", - label: "Labelers", - }, - { - type: "doc", - id: "reference/admin/settings", - label: "Instance Settings", - }, - { - type: "doc", - id: "reference/admin/xrpc-proxy", - label: "XRPC Proxy", - }, - { - type: "doc", - id: "reference/admin/domains", - label: "Domains", - }, - { - type: "doc", - id: "reference/admin/script-variables", - label: "Script Variables", - }, - { - type: "doc", - id: "reference/admin/api-clients", - label: "API Clients", - }, - { - type: "doc", - id: "reference/admin/plugins", - label: "Plugins", - }, - ], - }, - { - type: "category", - label: "OAuth API", - items: [ - { - type: "doc", - id: "reference/oauth/api-clients", - label: "Third-Party API Clients", - }, - ], - }, - { - type: "category", - label: "Lua API", - items: [ - { - type: "doc", - id: "reference/lua/record-api", - label: "Record API", - }, - { - type: "doc", - id: "reference/lua/database-api", - label: "Database API", - }, - { - type: "doc", - id: "reference/lua/http-api", - label: "HTTP API", - }, - { - type: "doc", - id: "reference/lua/xrpc-lua-api", - label: "XRPC Lua API", - }, - { - type: "doc", - id: "reference/lua/atproto-api", - label: "atproto API", - }, - { - type: "doc", - id: "reference/lua/json-api", - label: "JSON API", - }, - { - type: "doc", - id: "reference/lua/utility-globals", - label: "Utility Globals", - }, - { - type: "doc", - id: "reference/lua/standard-libraries", - label: "Standard Libraries", - }, - ], - }, - { - type: "doc", - id: "reference/glossary", - label: "Glossary", - }, - { - type: "doc", - id: "reference/architecture", - label: "Architecture", - }, - { - type: "doc", - id: "reference/troubleshooting", - label: "Troubleshooting", - }, - { - type: "category", - label: "Changelogs", - items: [ - { - type: "doc", - id: "reference/changelog", - label: "HappyView", - }, - { - type: "doc", - id: "sdk/changelog-oauth-client", - label: "oauth-client", - }, - { - type: "doc", - id: "sdk/changelog-oauth-client-browser", - label: "oauth-client-browser", - }, - { - type: "doc", - id: "sdk/changelog-oauth-client-node", - label: "oauth-client-node", - }, - { - type: "doc", - id: "sdk/changelog-lex-agent", - label: "lex-agent", - }, - ], - }, - ], - }, - ], -}; - -export default sidebars; diff --git a/packages/docs/source.config.ts b/packages/docs/source.config.ts new file mode 100644 index 0000000..0222c33 --- /dev/null +++ b/packages/docs/source.config.ts @@ -0,0 +1,12 @@ +import { defineDocs, defineConfig } from 'fumadocs-mdx/config'; +import { remarkMdxMermaid } from 'fumadocs-core/mdx-plugins'; + +export const docs = defineDocs({ + dir: 'content/docs', +}); + +export default defineConfig({ + mdxOptions: { + remarkPlugins: [remarkMdxMermaid], + }, +}); diff --git a/packages/docs/src/app/docs/[[...slug]]/not-found.tsx b/packages/docs/src/app/docs/[[...slug]]/not-found.tsx new file mode 100644 index 0000000..52dcac4 --- /dev/null +++ b/packages/docs/src/app/docs/[[...slug]]/not-found.tsx @@ -0,0 +1,12 @@ +import { DocsBody, DocsPage } from 'fumadocs-ui/layouts/docs/page'; + +export default function NotFound() { + return ( + + +

404 — Page Not Found

+

The page you're looking for doesn't exist.

+
+
+ ); +} diff --git a/packages/docs/src/app/docs/[[...slug]]/page.tsx b/packages/docs/src/app/docs/[[...slug]]/page.tsx new file mode 100644 index 0000000..8219079 --- /dev/null +++ b/packages/docs/src/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,48 @@ +import { source } from '@/lib/source'; +import { notFound } from 'next/navigation'; +import { + DocsBody, + DocsPage, + DocsTitle, + DocsDescription, +} from 'fumadocs-ui/layouts/docs/page'; +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import { Mermaid } from '@/components/mermaid'; + +export default async function Page(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + + if (!page) notFound(); + + const Mdx = page.data.body; + + return ( + + {page.data.title} + {page.data.description} + + + + + ); +} + +export function generateStaticParams() { + return source.generateParams(); +} + +export async function generateMetadata(props: { + params: Promise<{ slug?: string[] }>; +}) { + const params = await props.params; + const page = source.getPage(params.slug); + if (!page) return {}; + + return { + title: page.data.title, + description: page.data.description, + }; +} diff --git a/packages/docs/src/app/docs/layout.tsx b/packages/docs/src/app/docs/layout.tsx new file mode 100644 index 0000000..c7145b0 --- /dev/null +++ b/packages/docs/src/app/docs/layout.tsx @@ -0,0 +1,32 @@ +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { source } from '@/lib/source'; +import type { ReactNode } from 'react'; + +export default function Layout({ children }: { children: ReactNode }) { + return ( + + + + ), + }} + links={[ + { + text: 'Docs', + url: '/docs', + active: 'nested-url', + }, + { + text: 'Source', + url: 'https://tangled.org/gamesgamesgamesgames.games/happyview', + external: true, + }, + ]} + > + {children} + + ); +} diff --git a/packages/docs/src/app/global.css b/packages/docs/src/app/global.css new file mode 100644 index 0000000..016986e --- /dev/null +++ b/packages/docs/src/app/global.css @@ -0,0 +1,16 @@ +@import 'tailwindcss'; +@import '@happyview/design-system/globals.css'; +@import 'fumadocs-ui/css/lib/default-colors.css'; +@import 'fumadocs-ui/css/preset.css'; + +@source "../../node_modules/fumadocs-ui/dist/**/*.js"; + +@media (min-width: 768px) { + * { + --fd-sidebar-width: 300px !important; + } +} + +#nd-sidebar a { + white-space: nowrap; +} diff --git a/packages/docs/src/app/layout.tsx b/packages/docs/src/app/layout.tsx new file mode 100644 index 0000000..d68c2c4 --- /dev/null +++ b/packages/docs/src/app/layout.tsx @@ -0,0 +1,29 @@ +import './global.css'; +import { RootProvider } from 'fumadocs-ui/provider/next'; +import { fontVariables } from '@/lib/fonts'; +import type { ReactNode } from 'react'; + +export const metadata = { + metadataBase: new URL( + `https://${process.env.VERCEL_PROJECT_PRODUCTION_URL ?? 'localhost:3000'}`, + ), + title: { + template: '%s | HappyView', + default: 'HappyView', + }, + description: 'Lexicon-driven ATProto AppView', + openGraph: { + images: [{ url: '/img/og.png' }], + }, + icons: [{ rel: 'icon', url: '/img/favicon.png' }], +}; + +export default function RootLayout({ children }: { children: ReactNode }) { + return ( + + + {children} + + + ); +} diff --git a/packages/docs/src/app/page.tsx b/packages/docs/src/app/page.tsx new file mode 100644 index 0000000..88715e3 --- /dev/null +++ b/packages/docs/src/app/page.tsx @@ -0,0 +1,5 @@ +import { redirect } from 'next/navigation'; + +export default function Home() { + redirect('/docs'); +} diff --git a/packages/docs/src/components/mermaid.tsx b/packages/docs/src/components/mermaid.tsx new file mode 100644 index 0000000..8325c4c --- /dev/null +++ b/packages/docs/src/components/mermaid.tsx @@ -0,0 +1,53 @@ +'use client'; + +import { use, useEffect, useId, useState } from 'react'; +import { useTheme } from 'next-themes'; + +const cache = new Map>(); + +function cachePromise(key: string, fn: () => Promise): Promise { + const cached = cache.get(key); + if (cached) return cached as Promise; + const promise = fn(); + cache.set(key, promise); + return promise; +} + +export function Mermaid({ chart }: { chart: string }) { + const [mounted, setMounted] = useState(false); + useEffect(() => { + setMounted(true); + }, []); + if (!mounted) return null; + return ; +} + +function MermaidContent({ chart }: { chart: string }) { + const id = useId().replace(/:/g, '_'); + const { resolvedTheme } = useTheme(); + const { default: mermaid } = use( + cachePromise('mermaid', () => import('mermaid')), + ); + + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + fontFamily: 'inherit', + theme: resolvedTheme === 'dark' ? 'dark' : 'default', + }); + + const { svg, bindFunctions } = use( + cachePromise(`${chart}-${resolvedTheme}`, () => + mermaid.render(id, chart.replaceAll('\\n', '\n')), + ), + ); + + return ( +
{ + if (container) bindFunctions?.(container); + }} + dangerouslySetInnerHTML={{ __html: svg }} + /> + ); +} diff --git a/packages/docs/src/lib/fonts.ts b/packages/docs/src/lib/fonts.ts new file mode 100644 index 0000000..309dbb7 --- /dev/null +++ b/packages/docs/src/lib/fonts.ts @@ -0,0 +1,15 @@ +import { Geist, Geist_Mono } from "next/font/google"; + +export const geistSans = Geist({ + subsets: ["latin"], + variable: "--font-geist-sans", + display: "swap", +}); + +export const geistMono = Geist_Mono({ + subsets: ["latin"], + variable: "--font-geist-mono", + display: "swap", +}); + +export const fontVariables = `${geistSans.variable} ${geistMono.variable}`; diff --git a/packages/docs/src/lib/source.ts b/packages/docs/src/lib/source.ts new file mode 100644 index 0000000..519d4a0 --- /dev/null +++ b/packages/docs/src/lib/source.ts @@ -0,0 +1,6 @@ +import { docs } from 'collections/server'; +import { loader } from 'fumadocs-core/source'; + +export const source = loader(docs.toFumadocsSource(), { + baseUrl: '/docs', +}); diff --git a/packages/docs/tsconfig.json b/packages/docs/tsconfig.json index d250afa..6112851 100644 --- a/packages/docs/tsconfig.json +++ b/packages/docs/tsconfig.json @@ -1,6 +1,45 @@ { - "extends": "@docusaurus/tsconfig", "compilerOptions": { - "baseUrl": "." - } + "target": "ES2017", + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "react-jsx", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@/*": [ + "./src/*" + ], + "collections/*": [ + "./.source/*" + ] + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".source/**/*.ts", + ".next/types/**/*.ts", + ".next/dev/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] } -- 2.51.2