This document defines the STAC Server (Static / File-Based)
sub-system, part of the Debrief Rewrite under the Core Sub-Systems category.
Purpose
The static STAC Server provides local access to spatial/temporal datasets (primarily GeoJSON FeatureCollections), along with metadata describing background layers and serial metadata. It enables basic file-based deployments of Debrief with no REST services or server processes.
Implementation Strategy
- Follows STAC Specification using static catalog layout
- Implements a
Year > Exercise > Serial
folder hierarchy - Each serial is represented as a single GeoJSON file + STAC
item.json
catalog.json
andcollections/*.json
form the root metadata index- Background tile metadata is included if needed per serial
Folder Structure
stac-root/
├── catalog.json
├── collections/
│ └── tracks.json
├── 2026/
│ └── cold-depths/
│ └── serial-01/
│ ├── item.json
│ └── serial-01.geojson
│ └── serial-01.png
│ └── serial-01.zip
STAC Metadata Files
catalog.json
: top-level entry pointcollections/tracks.json
: describes the FeatureCollection typeitem.json
: metadata for a single serial, references one GeoJSON file as anasset
Sample catalog.json
:
{
"stac_version": "1.0.0",
"type": "Catalog",
"id": "debrief-root",
"title": "Debrief Plot Archive",
"description": "Top-level catalog for locally stored wargame plots and serials.",
"links": [
{
"rel": "child",
"href": "collections/tracks.json",
"type": "application/json",
"title": "Track Data Collection"
},
{
"rel": "child",
"href": "2026/cold-depths/serial-01/item.json",
"type": "application/json",
"title": "Serial 01: Cold Depths"
}
]
}
Example collections/tracks.json
:
{
"stac_version": "1.0.0",
"type": "Collection",
"id": "tracks",
"title": "Debrief Track Data",
"description": "A collection of track plots and annotations for exercise analysis.",
"license": "proprietary",
"extent": {
"spatial": {
"bbox": [[-180.0, -90.0, 180.0, 90.0]]
},
"temporal": {
"interval": [["2025-01-01T00:00:00Z", null]]
}
},
"links": []
}
Example item.json
:
{
"id": "serial-01",
"type": "Feature",
"stac_version": "1.0.0",
"collection": "tracks",
"properties": {
"start_datetime": "2026-02-05T09:00:00Z",
"end_datetime": "2026-02-05T12:00:00Z",
"exercise": "cold-depths",
"serial": "S01"
},
"assets": {
"plot": {
"href": "serial-01.geojson",
"type": "application/geo+json",
"title": "GeoJSON plot for serial-01"
},
"thumbnail": {
"href": "serial-01.png",
"type": "image/png",
"title": "Thumbnail for serial-01"
},
"export": {
"href": "serial-01.zip",
"type": "application/zip",
"title": "Exported serial-01 (dynamic HTML)"
}
}
}
Maintenance and Control Flow
STAC metadata and folder hierarchy are maintained automatically by the Import Service or a lightweight STAC Indexer.
Events and Updates
-
New Wargame:
- Create
Year/Exercise/
folder - Update
catalog.json
with new exercise link
- Create
-
New Serial:
- Create
Serial/
subfolder underExercise/
- Generate
serial-XX.geojson
anditem.json
- Update
catalog.json
and relevantcollection.json
- Create
-
Save Serial:
- Overwrite or update
serial-XX.geojson
- Update
item.json
(timestamp, bounding box, duration)
- Overwrite or update
-
Delete Serial:
- Delete GeoJSON and
item.json
- Update
catalog.json
to remove reference
- Delete GeoJSON and
-
Delete Wargame:
- Delete entire
Exercise/
folder - Update
catalog.json
to remove wargame link
- Delete entire
-
Browse Years, Wargames, Serials:
- UI reads
catalog.json
and walks directory tree - Uses STAC links to populate tree/table views in client UI
- UI reads
Spatial/Temporal Discovery
- Each
item.json
includes bounding box and time range - Client can query this metadata to visualise data availability on a map or timeline
Notes
- No server process is required
- All metadata is file-based and portable
- Designed for MOD deployments with static file access
- Can be adapted later to integrate with server-based STAC services
STAC Metadata Events – Sequence Diagrams
📁 New Wargame
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
participant CatalogJSON
User->>ClientUI: Create new wargame (year + name)
ClientUI->>FileSystem: Create Year/Exercise folder
ClientUI->>CatalogJSON: Add exercise link to catalog.json
📂 New Serial
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
participant CatalogJSON
participant CollectionJSON
User->>ClientUI: Save new serial (with data)
ClientUI->>FileSystem: Create Exercise/Serial folder
ClientUI->>FileSystem: Write serial.geojson
ClientUI->>FileSystem: Generate item.json
ClientUI->>CatalogJSON: Add serial link to catalog.json
ClientUI->>CollectionJSON: Update collection/tracks.json
💾 Save Serial (Update)
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
User->>ClientUI: Save changes to serial
ClientUI->>FileSystem: Overwrite serial.geojson
ClientUI->>FileSystem: Update item.json
🗑️ Delete Serial
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
participant CatalogJSON
User->>ClientUI: Delete serial
ClientUI->>FileSystem: Delete serial.geojson and item.json
ClientUI->>CatalogJSON: Remove serial link from catalog.json
🧹 Delete Wargame
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
participant CatalogJSON
User->>ClientUI: Delete wargame
ClientUI->>FileSystem: Delete Exercise folder
ClientUI->>CatalogJSON: Remove wargame link from catalog.json
🔍 Browse Years / Exercises / Serials
sequenceDiagram
participant ClientUI
participant FileSystem
participant CatalogJSON
ClientUI->>CatalogJSON: Read catalog.json
CatalogJSON-->>ClientUI: Return year/exercise/serial links
ClientUI->>FileSystem: Read item.json (optional preview)
Browse/Search Using Spatial or Temporal Filters
sequenceDiagram
participant User
participant ClientUI
participant FileSystem
participant CatalogJSON
participant ItemJSON
User->>ClientUI: Apply spatial and/or temporal filters
ClientUI->>CatalogJSON: Load catalog.json
CatalogJSON-->>ClientUI: List of item.json links
loop For each item
ClientUI->>FileSystem: Load item.json
FileSystem-->>ClientUI: Return metadata (bbox, datetime)
ClientUI->>ClientUI: Evaluate against spatial/temporal filters
end
ClientUI-->>User: Show matching serials on map/timeline