Files
apf_portal/decisions/0003-workspace-and-app-naming-convention.md
T
Julien Gautier 79eee77594 chore: initialize repository with project rules, docs, and phase-1 ADRs
Set up the foundation for the adastra-portal project:

- CLAUDE.md captures durable project rules (quality bar, security/perf/a11y
  as first-class, language, commit conventions, ADR proactivity).
- docs/ and decisions/ scaffolding with maintained indexes (docs/README.md
  and decisions/README.md), MADR 4.0.0 template, and tag vocabulary.
- Phase-1 ADRs (0001-0006) lock structural choices: ADR usage, Nx monorepo
  with the apps preset, naming convention (adastra-portal / portal-shell /
  portal-bff), Angular CSR/zoneless/Signals/Vitest, NestJS over Express,
  PostgreSQL with Prisma.
- docs/setup/ guides translated to English.
- .gitignore covers Node/Nx artifacts and the personal notes/ scratchpad.

The Nx workspace itself is not yet bootstrapped; that step is gated on a
revised setup guide aligned with the ADRs.
2026-04-29 20:43:00 +02:00

3.4 KiB

status, date, decision-makers, tags
status date decision-makers tags
accepted 2026-04-29 R&D Lead
process

Workspace and app naming convention

Context and Problem Statement

Default Nx scaffolding offers placeholder names like my-workspace and web, which are unacceptable for a long-lived enterprise project. Naming has to survive two foreseeable changes: the product's marketing name may evolve (the working title adastra_portal is provisional), and the project may sit alongside other R&D projects in the same Gitea organization, where collisions on generic names like web or api would cause confusion.

What naming convention do we adopt for the workspace, the apps, and future libraries so names are explicit, function-anchored, and stable against rebranding?

Decision Drivers

  • The product's marketing name is provisional — names anchored on it become stale at rebrand.
  • Names should reflect function, not brand.
  • Multiple R&D projects may share the org — generic names (web, api, frontend) cause friction.
  • Compliance with npm package naming rules (lowercase, kebab-case).
  • Readability inside Nx's project graph and CLI output.

Considered Options

  • Defaultsmy-workspace, web. (Rejected up-front.)
  • Brand-anchoredadastra-front, adastra-back. Fragile to rebranding.
  • Function-prefixedportal-shell, portal-bff. (Chosen.)
  • Genericshell, bff. Risk of org-wide collision; reduced readability.

Decision Outcome

Chosen option: function-prefixed naming.

Scope Name Rationale
Workspace / repo / npm package root adastra-portal matches the Gitea repository name; the only place a brand-ish name lives, so a rebrand is a one-line change
Frontend app portal-shell "shell" describes the function — the Angular host that loads features
Backend app portal-bff explicit role: backend-for-frontend
Feature libraries feature-<name> e.g. feature-auth, feature-billing
Shared libraries shared-<scope> e.g. shared-ui, shared-data-access, shared-util

The portal- prefix encodes the function (a portal). Even if the brand Adastra is renamed, "portal" remains accurate. The brand-ish token adastra is confined to the workspace root and a tiny number of metadata files (root package.json, repo URL).

Consequences

  • Good, because names survive a brand change with minimal churn.
  • Good, because portal-shell / portal-bff are unambiguous in CLI output and in the Nx project graph.
  • Good, because the prefix scales when more apps appear (e.g. portal-admin, portal-jobs).
  • Bad, because the prefix adds verbosity (pnpm nx serve portal-shell vs pnpm nx serve web). Acceptable.
  • Neutral, because if "portal" itself ceases to be accurate (e.g. the system pivots to something other than a portal), the prefix would also need updating — but that would be a deeper architectural pivot anyway.

Confirmation

  • Nx project names match the convention in nx.json and in each project's project.json.
  • @nx/eslint/enforce-module-boundaries is configured with tags aligned to the convention (scope:portal-shell, scope:portal-bff, type:feature, type:shared).
  • PR review rejects new project names that don't match.

More Information