Esposter

Architecture

These pages explain the durable, cross-cutting mechanisms that span multiple packages or feature areas — the repo-wide answer to "whenever we need X, we do it this way". Area-specific features live under their own sections (for example /docs/platform or /docs/esbabbler).

PageWhat it covers
PlatformThe cross-product layer model — identity, resources, datasets, publishing, events
ResourcesThe standard for product persistence and surface — resource model, capabilities, factory
DatasetsThe standard for serving tabular data — contract, DatasetProvider capability, row cap
PublishingThe Publishable capability — versioned publish copy + rate-limited public read
Authbetter-auth OAuth setup, session middleware, and the authed procedure chain
Azure servicesAzure service ownership, the storage split, event flows, and the real-time layer model
EnvironmentEnvironment detection across the three Nuxt runtime contexts
File uploadsThe two-step Azure Blob SAS upload pattern and upload procedure inventory
SerializationHow class instances survive the three transport paths (Azure Table, Nuxt payload, tRPC)
Client data accessThe useQuery + useMutation primitives — non-blocking fetch, optimistic apply, staleness
Async operationsConcurrency by declaration — reads are latest-wins, writes queue, nothing drops silently
Persisted data — latest shape onlyNo legacy-shape schemas or migration code — parse the latest shape or reset
Content token rewritingFinding tokens in authored content — self-delimiting matches, one pass, converge on read
Monorepo toolingpnpm workspace orchestration, virrun routing, publishing, installs, and CI job shape
Server testingtRPC router test wiring — in-memory DB, mocked Azure services, controlled auth session
Destructive confirmationOne shared delete dialog — StyledDeleteFormDialog + opt-in type-the-name guard
Singleton dialogsStore-driven singleton dialogs — one mounted dialog per feature, never one per list item
NavigationNuxtLink/navigateTo for every link — never a raw anchor — and instant docs routing
Persist then notifyGuard, persist, notify — then best-effort bookkeeping that can never fail the caller
Conditional writesA write derived from a read is conditional on that version, and a lost race re-applies
Blob lifecycle ownershipEvery blob prefix's naming discipline and single teardown owner per lifecycle event
No pollingPolling banned repo-wide — every wait is event-driven or awaits a completion handle
No manual recoveryFailed async work retries itself on an event, with an attempt cap and a quarantine
Null vs undefinedOne absent-value sentinel in app-owned code — null survives only in boundary shapes
SearchOne search stack — StyledSearchDialog palettes + useAutoSearch/useCursorSearcher