0002 Airspace Management – NFA Creation & ALZ Management
| Field | Value |
|---|---|
| Status | Draft |
| Owner | Ihor Prozhoha |
| Contributors | TBD |
| Date | 2026-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 term | Abbreviation | Current code/UI identifier | Meaning |
|---|---|---|---|
| No Fly Area | NFA | NFZ / No Fly Zone | A polygon airspace restriction that prevents drone flight |
| Alternate Landing Zone | ALZ | CLZ / Contingency Landing Zone | A 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-airchitectsupports it but UI will not expose it. - Any UTM-side changes beyond the existing NFA REST API.
Requirements
Functional
NFA Management
NFA-01Manager can view all NFAs showing name, tag, floor, ceiling, and creation date.NFA-02Manager can create an NFA by drawing a polygon on a map canvas.NFA-03Manager can alternatively create an NFA by pasting a raw GeoJSONFeatureinto a text input; the map previews the polygon before submission.NFA-04Create form includes: name (required), tag (optional), floor value + unit + ref (required, default 0 AGL FT), ceiling value + unit + ref (optional).NFA-05On submit, the frontend POSTs toutm-atlas-airchitect/no_fly_zones/and shows success/error feedback within 3 seconds.NFA-06Manager can delete an NFA with a confirmation dialog; callsDELETE /no_fly_zones/{id}.NFA-07NFA management is accessible via a dedicated top-level page at/no-fly-areas.
ALZ Management
ALZ-01The Site Configuration page (/settings/flight-settings) gains an ALZ sub-section showing all ALZ points for the selected site (name, latitude, longitude).ALZ-02Manager can add a single ALZ by clicking a point on the map or entering lat/lng coordinates manually; name is required.ALZ-03Manager can delete an ALZ with a confirmation dialog; the list updates immediately (optimistic UI).ALZ-04Manager can bulk-import ALZs for a site by uploading a GeoJSON FeatureCollection file (.geojsonor.json); the UI validates the format and previews the points before confirming.ALZ-05Bulk import merges with existing ALZs — it does not replace them. Duplicate names within a site are rejected with a validation error.ALZ-06ALZ CRUD calls new REST endpoints inuncrew-missions-service; the GCS bucket-polling path is deprecated and removed once the DB is live.
Renaming
REN-01All UI labels, page titles, and button text are updated from NFZ→NFA and CLZ→ALZ.REN-02Frontend route/no-fly-zones(if it exists) is replaced by/no-fly-areas; any existing links are redirected.REN-03Go symbols, database table, and Frontegg scope names inuncrew-missions-serviceare renamed fromclz/nfztoalz/nfa.REN-04utm-atlas-airchitectinternal API paths (/no_fly_zones/) are not renamed in this work — the backend rename is a separate concern.
Non-Functional
NF-01All ALZ/NFA write endpoints require Frontegg scopes (new scopes:du.uncrew.manage.alz,du.uncrew.manage.nfa).NF-02GeoJSON input is validated client-side before submission; malformed input shows a field-level error, never a raw 4xx response.
User Stories / Scenarios
| # | Story | Acceptance Criteria |
|---|---|---|
| 1 | As 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. |
| 2 | As 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. |
| 3 | As 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. |
| 4 | As 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. |
| 5 | As 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. |
| 6 | As a manager, I want to delete an ALZ point so I can remove decommissioned landing sites. | Confirmation dialog; DELETE endpoint called; list updates. |
| 7 | As 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
| Repo | Stack | Change |
|---|---|---|
uncrew-apollo-frontend | React / TypeScript | New NFA page, ALZ section in site config, map draw tool, NFZ→NFA / CLZ→ALZ label rename |
uncrew-missions-service | Go | New ALZ CRUD endpoints, DB table (alz), deprecate bucket provider, CLZ→ALZ symbol rename |
utm-atlas-airchitect | Python / FastAPI | No changes (NFA API already complete; internal path rename out of scope) |
Integration Points
- NFA: Frontend calls
utm-atlas-airchitectathttps://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-servicefollowing the existing gRPC permission pattern. New Frontegg scopedu.uncrew.manage.alzadded togetFronteggGRPCPermissionsMapinconfig/config.go. DB writes must invalidate the in-memory cache (currentlyclzData, renamed toalzData).
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 inuncrew-missions-service/config/config.go. - If
utm-atlas-airchitectrequires service-level auth, NFA calls must be proxied through a BFF to avoid exposing credentials client-side.
Risks & Phased Rollout
| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| ALZ DB migration misses or corrupts existing site data | Medium | High | Dry-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 calls | Medium | Medium | Spike auth flow first; fallback to BFF proxy pattern |
| Map draw library conflicts with existing map components | Low | Medium | Reuse existing map setup from Jurisdictions page — NFA polygon visualization already works there |
| Rename scope creep (missed references to NFZ/CLZ in logs, metrics, configs) | Medium | Low | Grep 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