Skip to content
0002 Airspace Management – NFA Creation & ALZ Management

0002 Airspace Management – NFA Creation & ALZ Management

Andi Lamprecht Andi Lamprecht ·· 8 min read· Draft
FieldValue
StatusDraft
OwnerIhor Prozhoha
ContributorsTBD
Date2026-04-23

Terminology

The approved DroneUp operations manuals use the following terms. This PRD adopts them throughout, and the renaming of code/UI identifiers to match is explicitly in scope.

Approved termAbbreviationCurrent code/UI identifierMeaning
No Fly AreaNFANFZ / No Fly ZoneA polygon airspace restriction that prevents drone flight
Alternate Landing ZoneALZCLZ / Contingency Landing ZoneA point location designated as an emergency or alternate landing site

All user-facing strings, route paths, API field names, database table names, and code symbols will be renamed from the legacy identifiers to the approved terms as part of this work.

Overview

This PRD defines the requirements for adding airspace management capabilities to the Uncrew UI: a dedicated No Fly Area (NFA) management page allowing managers to create and delete NFAs, and an ALZ (Alternate Landing Zone) management section within the site configuration page allowing managers to add, delete, and bulk-import ALZ points per site. ALZ storage will migrate from GCS bucket files to a database as part of this work, and all legacy NFZ/CLZ identifiers will be renamed to NFA/ALZ.

Problem

Operations managers currently have no self-service UI to define or remove NFAs — they must submit a ticket to the product team, and a member of the engineering team then needs to make code changes. ALZ definitions per site are managed by manually uploading GeoJSON files to a GCS bucket, with no audit trail, no UI validation, and a 5-minute propagation delay. This creates operational friction and error risk when configuring new sites. It may also violate constraints around Operational Control under Part 135.

Additionally, the codebase uses terminology (NFZ, CLZ) that diverges from approved manuals (NFA, ALZ), causing confusion across operations, engineering, and documentation.

Goals & Non-Goals

Goals

  • Managers can create and delete NFAs from the Uncrew UI without direct API access.
  • Managers can add, delete, and bulk-import ALZ points per site from the site configuration page.
  • ALZ data is migrated from GCS bucket files to a database, deprecating the bucket-polling pattern.
  • All user-facing strings, route paths, and code identifiers are renamed from NFZ→NFA and CLZ→ALZ to align with approved manuals.
  • All CRUD operations are gated behind Frontegg permissions following the du.uncrew.* scope pattern.

Non-Goals

  • Editing / updating existing NFAs or ALZs (rename, move) — fast-follow.
  • ALZ polygon support — current model is Point only; no scope change.
  • LZ (Landing Zone) management — sourced from UTM, explicitly out of scope.
  • NFZ scheduling (time-based activation) — utm-atlas-airchitect supports it but UI will not expose it.
  • Any UTM-side changes beyond the existing NFA REST API.

Requirements

Functional

NFA Management

  • NFA-01 Manager can view all NFAs showing name, tag, floor, ceiling, and creation date.
  • NFA-02 Manager can create an NFA by drawing a polygon on a map canvas.
  • NFA-03 Manager can alternatively create an NFA by pasting a raw GeoJSON Feature into a text input; the map previews the polygon before submission.
  • NFA-04 Create form includes: name (required), tag (optional), floor value + unit + ref (required, default 0 AGL FT), ceiling value + unit + ref (optional).
  • NFA-05 On submit, the frontend POSTs to utm-atlas-airchitect /no_fly_zones/ and shows success/error feedback within 3 seconds.
  • NFA-06 Manager can delete an NFA with a confirmation dialog; calls DELETE /no_fly_zones/{id}.
  • NFA-07 NFA management is accessible via a dedicated top-level page at /no-fly-areas.

ALZ Management

  • ALZ-01 The Site Configuration page (/settings/flight-settings) gains an ALZ sub-section showing all ALZ points for the selected site (name, latitude, longitude).
  • ALZ-02 Manager can add a single ALZ by clicking a point on the map or entering lat/lng coordinates manually; name is required.
  • ALZ-03 Manager can delete an ALZ with a confirmation dialog; the list updates immediately (optimistic UI).
  • ALZ-04 Manager can bulk-import ALZs for a site by uploading a GeoJSON FeatureCollection file (.geojson or .json); the UI validates the format and previews the points before confirming.
  • ALZ-05 Bulk import merges with existing ALZs — it does not replace them. Duplicate names within a site are rejected with a validation error.
  • ALZ-06 ALZ CRUD calls new REST endpoints in uncrew-missions-service; the GCS bucket-polling path is deprecated and removed once the DB is live.

Renaming

  • REN-01 All UI labels, page titles, and button text are updated from NFZ→NFA and CLZ→ALZ.
  • REN-02 Frontend route /no-fly-zones (if it exists) is replaced by /no-fly-areas; any existing links are redirected.
  • REN-03 Go symbols, database table, and Frontegg scope names in uncrew-missions-service are renamed from clz/nfz to alz/nfa.
  • REN-04 utm-atlas-airchitect internal API paths (/no_fly_zones/) are not renamed in this work — the backend rename is a separate concern.

Non-Functional

  • NF-01 All ALZ/NFA write endpoints require Frontegg scopes (new scopes: du.uncrew.manage.alz, du.uncrew.manage.nfa).
  • NF-02 GeoJSON input is validated client-side before submission; malformed input shows a field-level error, never a raw 4xx response.

User Stories / Scenarios

#StoryAcceptance Criteria
1As a manager, I want to create an NFA by drawing on a map so I don’t need to craft raw GeoJSON.Polygon draw tool available; submit creates NFA via API; area appears in list.
2As a manager, I want to paste GeoJSON to create an NFA when I already have the geometry.GeoJSON textarea renders polygon preview on map; invalid JSON shows inline error.
3As a manager, I want to delete an NFA so I can remove outdated restrictions.Confirmation dialog required; DELETE called on confirm; area removed from list within 2s.
4As a manager, I want to see all ALZ points for a site so I know what alternate landing sites are configured.ALZ list visible in site config; shows name + coordinates.
5As a manager, I want to add an ALZ point by clicking the map so I can define new alternate landing sites accurately.Click on map pins a point; name field required; save calls POST endpoint; point appears in list.
6As a manager, I want to delete an ALZ point so I can remove decommissioned landing sites.Confirmation dialog; DELETE endpoint called; list updates.
7As a manager, I want to bulk-import ALZ points from a GeoJSON file to populate a new site quickly.File picker accepts .geojson/.json; validates FeatureCollection of Points; preview shown; confirm triggers import.

Regulatory & Compliance

NFA creation directly restricts drone flight paths. No FAA approval is required for operator-defined internal NFAs used within DroneUp’s own operational airspace management. However, created NFAs will influence autonomous flight path planning — any NFA overlapping an active mission should surface a warning in the UI (fast-follow, not MVP). Aligning UI and code terminology with approved manuals reduces ambiguity in operational documentation and supports Part 135 Operational Control traceability. No DO-178C applicability. No PII involved.

Technical Specifications

Architecture Overview

Uncrew Apollo Frontend
  ├── /no-fly-areas page → utm-atlas-airchitect REST API (direct, /no_fly_zones/ path unchanged)
  └── /settings/flight-settings (site config)
        └── ALZ section → uncrew-missions-service (new gRPC/REST endpoints)
                              └── PostgreSQL (new alz table, replaces GCS bucket)

Affected Repos

RepoStackChange
uncrew-apollo-frontendReact / TypeScriptNew NFA page, ALZ section in site config, map draw tool, NFZ→NFA / CLZ→ALZ label rename
uncrew-missions-serviceGoNew ALZ CRUD endpoints, DB table (alz), deprecate bucket provider, CLZ→ALZ symbol rename
utm-atlas-airchitectPython / FastAPINo changes (NFA API already complete; internal path rename out of scope)

Integration Points

  • NFA: Frontend calls utm-atlas-airchitect at https://airchitect.utm.{env}.droneup.cloud/no_fly_zones/. Auth mechanism TBD — verify whether Frontegg token is accepted; proxy through a BFF if service-level auth is required.
  • ALZ: New endpoints in uncrew-missions-service following the existing gRPC permission pattern. New Frontegg scope du.uncrew.manage.alz added to getFronteggGRPCPermissionsMap in config/config.go. DB writes must invalidate the in-memory cache (currently clzData, renamed to alzData).

Data Model Changes

New table in uncrew-missions-service PostgreSQL (renamed from legacy clz):

CREATE TABLE alz (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  site_id     TEXT NOT NULL,
  name        TEXT NOT NULL,
  latitude    DOUBLE PRECISION NOT NULL,
  longitude   DOUBLE PRECISION NOT NULL,
  created_at  TIMESTAMPTZ NOT NULL DEFAULT now(),
  UNIQUE (site_id, name)
);

One-time migration script to seed from all existing GCS bucket files into the new table before deprecating the bucket provider.

Security & Privacy

  • New Frontegg scopes: du.uncrew.manage.alz, du.uncrew.manage.nfa — to be provisioned in Frontegg console and added to permission maps in uncrew-missions-service/config/config.go.
  • If utm-atlas-airchitect requires service-level auth, NFA calls must be proxied through a BFF to avoid exposing credentials client-side.

Risks & Phased Rollout

RiskLikelihoodImpactMitigation
ALZ DB migration misses or corrupts existing site dataMediumHighDry-run migration script against prod snapshot before cutover; keep bucket provider behind feature flag until validated
utm-atlas-airchitect auth model incompatible with frontend direct callsMediumMediumSpike auth flow first; fallback to BFF proxy pattern
Map draw library conflicts with existing map componentsLowMediumReuse existing map setup from Jurisdictions page — NFA polygon visualization already works there
Rename scope creep (missed references to NFZ/CLZ in logs, metrics, configs)MediumLowGrep audit across all affected repos before merge; rename Frontegg scope keys atomically

Phased Rollout

  • MVP: NFA list + create (map draw) + delete. ALZ list + single add + delete per site. New ALZ DB + migration. UI label rename (NFZ→NFA, CLZ→ALZ).
  • v1.1: NFA create via GeoJSON paste. ALZ bulk import. Deprecate and remove GCS bucket provider. Code symbol rename in uncrew-missions-service.
  • v2.0: NFA edit. ALZ edit (rename/move). NFA overlap warning for active missions.

Estimation Input

prd_sizing_input:
  feature: "Airspace Management – NFA Creation & ALZ Management"
  scope_clarity: "A"
  key_terms:
    - "no_fly_zone"
    - "nfa"
    - "alz"
    - "clz"
    - "site configuration"
    - "airchitect"
  risk_flags:
    - "db-migration"
    - "third-party-api-auth"
    - "map-draw-library"
    - "rename-scope-creep"
  affected_repos:
    - "uncrew-apollo-frontend"
    - "uncrew-missions-service"
    - "utm-atlas-airchitect"
  domains:
    - "frontend-react"
    - "backend-go"
    - "python-fastapi"
  regulatory: false
  discovery_needed: false
Last updated on