> ## Documentation Index
> Fetch the complete documentation index at: https://docs.stackra.figentra.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 0011 — Rejected and deferred technologies

> Superseded by 0227 · 2026-10-20

> [!NOTE]
>
> Superseded by [0227](/adr/0227-rejected-and-deferred-technologies-refreshed). The table below is
> the record as it stood on 2026-10-19; read 0227 for the current table.

> [!NOTE]
>
> The Encore row is superseded by [0124](/adr/0124-encore-is-the-generated-runtime-target): Encore
> is the generated runtime target in `.stackra/encore/`
> ([0091](/adr/0091-generated-encore-app-in-stackra-folder)), and hand-written Encore in service
> source or packages is rejected.

> [!NOTE]
>
> Amended by [0154](/adr/0154-tenant-code-runs-only-in-a-sandboxed-code-step): the sandboxed code
> step (QuickJS-WASM and Pyodide, no filesystem, allow-listed fetch) is the only place tenant code
> may run. It is listed as an allowed form in the row below.

> [!NOTE]
>
> The "runtime schema engine" row was rewritten by
> [0110](/adr/0110-experience-is-the-sdui-service-at-l2), which supersedes the old row ("A runtime
> schema engine, server-driven UI, JSONB-for-everything", Rejected). It now allows data that only
> references registered code.

## Context

Assistants and new contributors helpfully add well-known tools. Each one adds a second way to do something that already
has one, and each costs a migration to remove. The decisions against them are scattered across earlier repositories as
prose. This page is the one table. Each row says what is not introduced, what to use instead, and what event reopens it.

## Decision

Do not introduce anything in the **Not introduced** column. If a task seems to need one, stop and route to the
`architecture-guardian` agent. Rejected means no for the foreseeable future. Deferred means not yet, and the trigger
names when. A row changes only by a new ADR that supersedes this page.

| Not introduced | Status | Use instead | Revival trigger |
| - | - | - | - |
| Encore (`encore.dev`, `~encore/*`) as the service runtime | Deferred | Independent service members ([0010](/adr/0010-services-are-independent-workspace-members)) | The first service needs managed databases, pub/sub or secrets that a plain member cannot provide cheaply |
| Nest.js (`@nestjs/*`) as a framework layer; an API gateway in front of services | Rejected | `@stackra/container` (Nest-shaped, no `@nestjs/*`, [0005](/adr/0005-di-container-and-legacy-decorators)) | None foreseen |
| `reflect-metadata` and type-based auto-wiring | Rejected | Explicit tokens ([0005](/adr/0005-di-container-and-legacy-decorators)) | A hosts-wide toolchain that emits `design:paramtypes` everywhere |
| Prisma, Drizzle, TypeORM, Knex | Rejected | MikroORM ([0014](/adr/0014-data-ownership-and-orm)) | MikroORM fails a measured requirement and the ADR names the replacement |
| ESLint, Prettier, Jest | Rejected | oxlint, oxfmt, vitest (ADR [0001](/adr/0001-monorepo-layout)) | A required rule or feature the Oxc tools lack, shown by a failing case |
| Express, Fastify as a server framework | Rejected | the service runtime chosen by ADR | Same as the runtime row |
| MikroORM or any ORM on a client | Rejected | Client storage is `@stackra/storage` ([0256](/adr/0256-client-storage-one-stackra-storage-package)); MikroORM is server-only ([0014](/adr/0014-data-ownership-and-orm)) | Never on a client. A sync engine stays Deferred (see its row) |
| Tauri as the desktop shell | Rejected | Electron ([0058](/adr/0058-desktop-is-electron)), one app member with a desktop target ([0249](/adr/0249-one-app-three-targets-web-pwa-and-electron)) | None foreseen |
| Next.js (`next`, the `app-next` app kind) | Rejected | Vite with React Router 7 framework mode, which covers server rendering ([0165](/adr/0165-web-client-stack-ui-contract-form-adapters-and-no-nextjs)) | Never. Change only by a new ADR |
| Vite+ (`vp`) as the task runner | Rejected | Turborepo, oxlint, oxfmt, lefthook | Turborepo stops meeting cache or boundary needs |
| A second vault or Doppler; secret values in any file | Rejected | Infisical plus the runtime secret store ([0009](/adr/0009-secrets-two-mechanisms)) | Infisical is retired by the organisation |
| Two code hosts in one repository | Rejected | one host ([0012](/adr/0012-code-host-and-ci)) | A migration ADR that deletes the first host in the same change |
| Delegating implementation to a cheaper model through another runner | Rejected | Claude agents by tier ([0017](/adr/0017-agent-roster-and-models)) | A measured result, on this repository, that a delegate matches the review pass rate |
| An AI gateway, a separate-language agent runtime (LangGraph and similar) | Rejected | AI SDK core plus MCP SDK in the service ([0021](/adr/0021-ai-engine-and-agent-write-safety)) | A provider requirement the SDK cannot meet |
| A shared React component library across web and native | Deferred | Share types, client, validation, state, i18n and tokens, not components | Two apps ship the same screen and the duplication has caused a bug |
| A sync engine (RxDB, ElectricSQL, PowerSync, WatermelonDB) | Deferred | A mutation queue with idempotency keys; conflict records for human review | Offline editing of shared records is a product requirement |
| A dedicated search service (Typesense, Meilisearch, OpenSearch) | Deferred | Postgres `pg_trgm` and full-text search behind a search interface | Postgres search misses a measured latency or relevance target |
| A relationship-authorization service (OpenFGA, SpiceDB, Cedar) | Deferred | An in-house check shaped like `check(subject, relation, object)` | More than one service needs shared, queried authorization data |
| A dedicated observability service or Prometheus for business metrics | Deferred | Platform tracing, metrics and logs ([0020](/adr/0020-observability-and-crash-reporting)) | Business metrics need retention the platform tooling does not give |
| A runtime schema engine, JSONB-for-everything, or tenant data that carries code, markup or logic | Rejected | Coded resources and build-time generation. Allowed: data that only references registered code, namely L2 UI documents ([0110](/adr/0110-experience-is-the-sdui-service-at-l2)), builder-UI agents ([0100](/adr/0100-ai-model-and-ownership)), tenant automations ([0122](/adr/0122-workflow-studio-three-layers)) and bounded custom fields ([0116](/adr/0116-content-types-and-custom-fields)), and the sandboxed code step for tenant logic ([0154](/adr/0154-tenant-code-runs-only-in-a-sandboxed-code-step)) | None foreseen |

## Consequences

* A proposal that touches one of these rows starts with a new ADR, not a pull request.
* Product-specific rejections (billing vendors, wallet design and similar) are not carried here; a product repository records its own.

## Enforcement

* `FORBIDDEN_DEPENDENCIES` in `tools/scripts/validate-repository.mjs` fails a member that lists `eslint`, `prettier`, `jest`, `@nestjs/core`, `@nestjs/common`, `reflect-metadata`, `prisma`, `@prisma/client`, `drizzle-orm`, `express`, `fastify`, `typeorm` or `knex`.
* `packages/tooling/oxlint/src/boundaries.jsonc` bans `encore.dev` in packages.
* Planned: extend the list with `encore.dev` for members other than a future service runtime, and with the other rows that name a package, after this table is reviewed.
* The `architecture-guardian` agent reads this page.

## Supersedes and sources

Supersedes: none. Sources: user rules `not-built-yet.md`; academorix `.agents/rules/not-built-yet.md`; figentra `docs/adr/0001-technology-stack-and-toolchain`, `0036` to `0039`; platform `docs/adr/0013`. Every row was re-checked against Stackra's layout.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.