AssayLink Docs

Architecture

One Next.js service, layered domain code, metadata and vocabulary as data.

Runtime shape

Browser
  │  /docs  → static HTML (public/docs)
  │  UI     → Server Components + server actions
  ▼
Next.js 15 (App Router)  —  ECS Fargate "web", port 3000
  ├── app/                 routes, actions
  ├── server/services/     business rules
  ├── server/repositories/ Prisma only
  ├── server/ai/           providers, extraction, scoring
  ├── server/integrations/ MaRLay client (mock today)
  └── domain/              Zod + types
  ▼
PostgreSQL (schema assaylink)

Layering rules

LayerMay importMust not
app/**, components services, domain Prisma, repositories
server/services/** repositories, domain, ai React / Next request APIs beyond auth helpers
server/repositories/** db.ts, domain services (no cycles)
server/ai/** domain, repositories (read) services
domain/** zod only everything else

Domain data model (summary)

Full narrative: repo docs/domain-model.md and ADRs 0002, 0007–0010. Schema: src/web/prisma/schema.prisma. AssayLink does not store experimental execution data.

AI architecture

See docs/adr/0005-ai-provider-abstraction.md and docs/ai-recommendation.md.

Authentication & authorisation

POC: signed cookie + role switcher (ENABLE_ROLE_SWITCHER). Pages: guardCapability. Mutations: requireCapability. Capability map in server/auth/roles.ts. Production path: ALB OIDC header → map groups to roles in current-user.ts only (docs/adr/0006-auth-strategy.md).

Deployment constraints

Architecture decision records

ADRTopic
0001Tech stack (Next.js monolith under src/web)
0002Domain model / metadata as data
0003Template versioning (subtypes deferred)
0004Vocabulary governance
0005AI provider abstraction
0006Auth strategy
0007Metadata sections
0008Conditional metadata rules
0009Metadata Quality Score
0010Definitions, not experimental results

Source files: docs/adr/*.md in the repository root.