feat(docs-site): exhaustive Astro + refraction-ui documentation#2
Conversation
Mirrors elloloop/identity/docs-site verbatim: same DocsLayout + AppShell, same nav data shape, same global.css + theme + Pagefind search modal + expressive-code chrome. Branding strings retargeted to elloloop/notify (GitHub repo, container image, package name). Landing page, 404, introduction, quickstart, and all six concept pages (architecture, channels-and-providers, store-and-conformance, realtime-engine, auth-model, multi-tenancy) are written exhaustively with copy-pasteable cURL/Go/TypeScript snippets pulled directly from the notify source. Dependency matrix matches what identity's installed node_modules actually runs (astro 5.18.1 + @astrojs/tailwind 5.1.5 + tailwindcss 3.4.19). identity's committed package.json declares newer versions that pnpm cannot install cleanly — we follow the actually-working installed set. `pnpm run build` is green on every page; Pagefind indexes the article bodies for the search modal.
…erage
Adds the remaining 23 docs pages:
Installation
- Docker (image layout, ports, compose snippet, cosign verify)
- Configuration (every NOTIFY_* env var in one table)
- JWT Keys (HS256 generation, issuer/audience pinning, rotation procedure)
- Store Setup (memory / Postgres / EntDB walkthroughs)
Channels
- Email (emailservice Sender DI, future SES/ACS/SMTP/SendGrid)
- SMS (Twilio E.164 validation, httptest example)
- WhatsApp (whatsapp: prefix handling, messaging-service caveat)
- Web Push (VAPID, service worker, ErrSubscriptionGone)
- Mobile push (FCM HTTP v1, Android/iOS token registration, ErrUnregisteredToken)
- In-app (StreamEvents lifecycle, Pending-vs-Delivered semantics)
Store drivers
- Memory (test/dev reference)
- Postgres (schema, ON CONFLICT idempotency, partial index, migrations)
- EntDB (v2 schema-aware mode, composite_key length-prefix encoding,
commit-then-reconcile race resolution)
- Conformance suite (all 24 subtests across 6 categories, with a
walked-through canary)
API reference
- Every RPC (Notify, StreamEvents, GetNotifications, AckNotification,
AckDataChange, RegisterPushToken)
- Every enum (DeliveryChannel, DeliveryStatus, DeviceType)
- Error-code table
Operations
- Observability (slog JSON logs, /healthz, /metrics, Prometheus scrape)
- Graceful shutdown (sequence, retry-tracker drain, K8s grace period)
Deployment
- Docker (production compose, secrets, TLS termination)
- Kubernetes (Deployment + Services + Ingress + NetworkPolicy + HPA + PDB)
- GitHub Actions (release pipeline job-by-job walkthrough)
Examples
- Send a notification (cURL + Go + Python recipes)
- Subscribe over SSE (Connect-Web with reconnect backoff)
- Register a push token (Web Push + Android/iOS round-trips)
- Ack a notification (AckNotification + AckDataChange)
- Multi-channel fanout (3 users x 3 channels, partial-failure semantics)
Plus the docs CI workflow (.github/workflows/docs.yml) that builds the
site on every PR and deploys to GitHub Pages on main, a README section
linking to the published docs, and the root .gitignore entries for
docs-site/node_modules, dist/, .astro/.
`pnpm run build` produces 35 pages with no errors; pagefind indexes
every article body for the search modal.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1091811e79
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| - "9090" # /metrics, scraped by the Prometheus sidecar | ||
| environment: | ||
| NOTIFY_STORE_DRIVER: postgres | ||
| NOTIFY_POSTGRES_DSN: postgres://notify:\${POSTGRES_PASSWORD}@db:5432/notify?sslmode=require |
There was a problem hiding this comment.
Make the compose DSN match the bundled Postgres
In this docker-compose example, the db service uses the stock postgres:16 image and does not configure server TLS, but the notify DSN requires TLS with sslmode=require. Anyone copying this stack will have notify fail to connect to its own database unless they add cert/key setup to the Postgres service; for this in-network compose database the example should use sslmode=disable or document the missing TLS configuration.
Useful? React with 👍 / 👎.
Summary
Adds a full Astro static documentation site for
elloloop/notifyatdocs-site/, mirroringelloloop/identity/docs-site— same@refraction-ui/astroAppShell, sameastro-expressive-codechrome, sameastro-pagefindsearch modal, sameDocsLayoutshape, same theme + global CSS. Branding strings retargeted tonotify(GitHub repo, container image, package name).35 rendered pages, all building clean under
pnpm run build, with the search index populated by Pagefind.File map
Other changes
.github/workflows/docs.yml— new sibling workflow. Builds the docs site on every PR (broken build = red check, can't merge). On pushes tomain, additionally publishes the rendereddist/to GitHub Pages.README.md— added a "Docs" section linking to the published site and to the local build commands..gitignore— ignoredocs-site/node_modules/,docs-site/dist/,docs-site/.astro/.Content quality bar
Every page meets the brief's bar:
// ... details elided. cURL flows are runnable as-is against a dev-mode container; Go / Python / TS recipes compile against the published generated stubs.composite_key, providers never auto-purging dead tokens, tenant always from the JWT (never the body), AckNotification ownership check returning NotFound (never PermissionDenied).The seven high-value worked examples from the brief are all present and complete:
docker run(memory + dev mode) → cURL Notify → Connect-Web SSE handler.NotificationInternalServiceClientwrapper withX-Notify-Internal-Token.createConnectTransport+ async generator + exponential-backoff reconnect.conformance.RunConformancesnippet +ConcurrentCreate_SameKey_SingleWinnerwalked through.Verification
Smoke check of the rendered site:
Notes for the reviewer
package.jsonlistsastro@6.3.3/@astrojs/tailwind@6.0.2/tailwindcss@4.3.0, but identity's installednode_modules/on disk actually runsastro@5.18.1/@astrojs/tailwind@5.1.5/tailwindcss@3.4.19— their lockfile and installed deps are out of sync. I followed the working matrix; the newer one fails at build time with the Tailwind 4 PostCSS plugin error. If identity's docs-site gets re-bootstrapped against the newer matrix, this repo'sdocs-site/package.jsonshould follow..github/workflows/docs.ymlassumes the repo has Pages enabled with the "GitHub Actions" source. If it isn't enabled yet, the PR check (build only) is still green; the deploy step onmainwill be skipped until Pages is toggled on.data-pagefind-bodyon<article class="prose">anddata-pagefind-ignoreon chrome elements). 35 pages indexed, ~quick lookup via the ⌘K modal.DO NOT merge — leave it for principal review.