Build tactical applications on MongoDB Enterprise Advanced and connect them to Ditto for local-first mission data synchronization in disconnected environments.
Use cases: Disconnected Environments
Industries: Edge and Mobile,
Products and tools: MongoDB Enterprise Advanced
Partners: Ditto
Solution Overview
Disconnected field operations create a data problem. Field teams need to share location updates, map items, alerts, files, and messages.
A cloud-dependent architecture can make these workflows rely on persistent connectivity. That requirement is difficult to maintain in real-world operations. When connectivity fails, teams lose access to current information.
Developers face a related problem. They must support local storage, synchronization, conflict handling, and command-center visibility. Building these capabilities separately adds complexity to every application.
This solution shows how to build tactical applications that continue to work when connectivity is limited. It uses MongoDB as the data layer, connects an edge synchronization platform to MongoDB, and builds on the data layer to increase capabilities.
Start with the Data Layer
Use MongoDB Enterprise Advanced as the trusted data layer for the application. Store mission entities as BSON documents and organize them into collections that match the operational workflow. MongoDB supports different document shapes in the same database. Store position data, map objects, chat messages, alerts, and files without forcing them into one rigid schema.
Take advantage of this flexible document model to build all your application features on one data platform. Use MongoDB to serve dashboards, APIs, command workflows, and downstream systems. Add new mission entities without redesigning the entire database.
Connect the Edge to MongoDB
Use Ditto, an edge synchronization platform, as the edge synchronization partner. The Ditto ATAK Plugin connects ATAK devices to a local-first peer-to-peer mesh. ATAK constitutes the field application for sharing location, map, chat, and mission data. Ditto synchronizes mission data across nearby devices when network access changes or fails.
Then, connect Ditto to MongoDB with the Ditto MongoDB Connector. The connector synchronizes documents between Ditto and MongoDB and resolves concurrent changes between the two systems.
Build on the Data
Run MongoDB Enterprise Advanced locally at the command center. Use the MongoDB data layer to build the command-center dashboard and other mission applications. With the data and access layers in place, focus on application features instead of building separate storage and synchronization services.
Use this pattern to:
Store varied mission data as documents.
Connect applications to MongoDB with standard drivers and APIs.
Integrate with Ditto for disconnected synchronization.
Expose one shared data layer to command-center applications.
Extend the application as new mission workflows emerge.
Reference Architectures
The architecture uses MongoDB Enterprise Advanced as the application data layer for the command center. MongoDB stores mission documents and serves the dashboard, APIs, and operational workflows. MongoDB Ops Manager manages the local MongoDB deployment.
The Ditto MongoDB Connector links MongoDB to Ditto Server. Ditto Server connects the MongoDB data layer to the peer-to-peer mesh at the tactical edge in ATAK via the Ditto ATAK Plugin. Changes are then synchronized between MongoDB and Ditto without conflicts between the two systems.
Figure 1. Architecture showing MongoDB Enterprise Advanced as the command-center data layer, connected through the Ditto MongoDB Connector to a Ditto peer-to-peer mesh serving ATAK field devices
Tactical Edge
The tactical edge, the layer where field devices create and exchange mission data close to the point of action, includes users and devices operating where connectivity may change or fail.
ATAK provides the field application for sharing location, map, chat, and mission data. The Ditto ATAK Plugin captures that data and synchronizes it across nearby devices through the peer-to-peer mesh. Ditto uses available transports such as Bluetooth Low Energy, Wi-Fi, peer-to-peer Wi-Fi, and MANET-compatible paths. Ditto can also relay data across multiple devices in the mesh.
The edge acts as another source of application data. Ditto keeps that data available and moves it between devices. MongoDB stores the synchronized documents and makes them available to command-center applications.
Command-Center Integration
MongoDB Enterprise Advanced provides the central application data layer. The dashboard reads mission data from MongoDB and presents it through maps, node-status views, and communications feeds.
The Ditto MongoDB Connector listens for changes in Ditto and MongoDB. It applies those changes in the other system and keeps the two data stores aligned.
Applications built on MongoDB query and update mission documents without connecting directly to ATAK devices. Ditto handles delivery to and from disconnected edge devices. This integration lets you build the command-center application against MongoDB instead of directly against ATAK devices.
Why This Design Is Resilient
MongoDB stores the mission data. Ditto keeps field devices synchronized. ATAK provides the field application. The connector links both environments and resolves concurrent changes.
This separation lets each technology focus on one responsibility. MongoDB provides the application data layer, Ditto synchronizes data across the tactical edge, and ATAK provides the field experience.
This design allows you to build application features against MongoDB’s document model without implementing a separate storage model for every device or network condition.
Data Model Approach
Store each mission entity in a document that matches how the application uses it.
Position updates, map objects, and chat messages have different fields and update patterns. Store them in separate collections instead of forcing every entity into one rigid schema. This approach keeps the data model close to the edge-generated data and reduces transformation code between Ditto and MongoDB. These documents can be used for real-time analytics and AI queries at the disconnected edge.
The Ditto ATAK Plugin writes the Ditto ATAK v2 schema. The schema uses compact field names for CoT-based data. The following examples show the most relevant fields to application development.
Store Location Data in the track Collection
Use the track collection for position and status data from field actors. Query these documents to display current and stale devices on the command-center map.
{ "_id": "ANDROID-4486046569cda611", // document identifier "_r": false, // soft-delete flag "c": "MDB Actor 2", // display name "d": "ANDROID-4486046569cda611", // source device "e": "MDB Actor 2", // actor callsign "j": 19.451227, // latitude "l": -99.139832, // longitude "o": 1776886448640, // stale time "w": "a-f-G-U-C" // CoT type }
The compact schema keeps the synchronized document close to the data produced by ATAK. MongoDB stores the document without requiring a separate relational mapping layer.
Store Messages in the chat Collection
Use the chat collection for messages exchanged between field users and command workflows. The collection uses a different shape from track, with fields for message text, sender, room, and timestamp.
{ "_id": "b547f0b4-c371-4aff-ac1d-3bafe110a9e1", // message identifier "_r": false, // soft-delete flag "authorType": "a-f-G-U-C", // sender CoT type "b": 1776735193948, // message timestamp "d": "COMMAND-VEHICLE", // source device "e": "COMMAND", // sender callsign "msg": "Command", // message text "room": "Ditto", // room name "roomId": "ChatContact-Ditto" // room identifier }
MongoDB lets the application store message documents, alongside track documents without adding empty location fields or forcing both entities into the same structure.
Keep Map Objects in the mapitem Collection
Use the mapitem collection for persistent map graphics and shared mission objects.
Use MongoDB’s document model to store each mission entity in the shape your application needs. Keep track, mapitem, and chat in separate collections because they represent different data and access patterns. This approach lets you build map, status, and communications features without forcing all mission data into one rigid schema.
Collection | Purpose | Example application use |
|---|---|---|
| Position and status data | Render field actors and stale nodes. |
| Persistent map objects | Display shared markers and map graphics. |
| Messages and conversation metadata | Show communications in the command-center dashboard. |
Use each collection for one mission function, and keep all collections in one MongoDB data layer. Add fields or new mission entities without redesigning the existing collections.
Build Against One Flexible Data Layer
Build dashboards, APIs, and command-center workflows against MongoDB. Query each collection according to its purpose, and preserve the document structure that arrives from the edge.
Use this approach to:
Reduce data transformation between Ditto and MongoDB.
Keep each mission entity easy to query.
Add new fields without redesigning unrelated documents.
Extend the application without creating a separate storage model for every device or workflow.
Build the Solution
Use the tak-situational-demo GitHub repository to deploy and explore the solution.
Prepare the field devices
Ensure that you meet the following requirements before proceeding:
Set up two or more Android devices.
Ensure each device runs Android 13 or higher with a minimum of 4 GB RAM.
Install ATAK CIV on every unit and approve all necessary device permissions, including GPS access.
Obtain the Ditto ATAK Plugin and sideload the application onto each phone.
Join every device to the local Wi-Fi environment hosting the command station.
Prepare the command-center host
Ensure that you meet the following requirements before proceeding:
Install Docker, kind, kubectl, and Helm. Embedded automation scripts build the Kubernetes deployment automatically.
Allocate 32 GB of system memory. Systems require 24 GB at minimum, as Ops Manager, Ditto Server logs, and MongoDB Enterprise Advanced combined surpass 16 GB limits.
Reserve 30 GB of local storage capacity for container images and persistent data volumes.
Clear ports 80 and 443 to route traffic to the operational web view and Ditto Server components.
Deploy the command-center stack
Execute make setup from the root folder. You can safely rerun this script after any error, as it picks up where it stopped. It initializes components sequentially:
The Kubernetes operator via MongoDB Controllers for Kubernetes.
MongoDB Ops Manager operating in-cluster to manage Enterprise Advanced.
A MongoDB Enterprise Advanced replica set, provisioned through Ops Manager.
The Ditto Operator alongside a self-hosted Ditto Server instance.
The Ditto MongoDB Connector, provisioned as a native Kubernetes object.
The command-center dashboard application.
This script creates the database, users, and collections for this solution. Wait 25 to 35 minutes on initial setup.
Upon completion, the output displays the dashboard URL, a Compass connection string, Ops Manager credentials, and necessary pairing values for edge devices.
Execute make verify to validate your environment. This step inserts a document into MongoDB and retrieves it through Ditto Server, checking bidirectional synchronization.
For complete commands, configuration details, and deployment manifests, review docs/RUN_LOCAL.md in the TAK Situational
Demo repository.
Configure the synchronization
Automate configuration using the Ditto MongoDB Connector. Declare the connector as a Kubernetes BigPeerDataBridge resource to sync track, mapitem, chat, file, and alert collections bidirectionally across tactical units and command-center applications.
Host Ditto Server in the same Kubernetes cluster as MongoDB to route traffic internally. Connect via standard MongoDB connection strings without exposing public endpoints or managing IP allowlists.
Verify these prerequisite conditions prior to initializing the connector:
Confirm target databases and collections exist.
Grant
readWritepermissions to the connector user.Enable
changeStreamPreAndPostImageson all synchronized collections to maintain causal consistency between platforms.
Apply soft-delete flags (_r: true) to mark obsolete documents. Hard removals in MongoDB trigger permanent purge operations in Ditto. Query operational data using _r: false filters.
Review the Ditto Operator MongoDB Connector documentation for additional options.
Pair tactical units
Launch the operational UI and click Add Device. The overlay displays a QR code along with these text parameters: App ID, authentication endpoint, WebSocket endpoint, and playground token. Run make pair to display these credentials in the terminal.
Launch ATAK and the Ditto ATAK Plugin on each target hardware unit. Scan the generated QR code or enter the connection variables into the plugin preferences. Turn off Ditto Cloud syncing to direct network traffic toward your local Ditto Server deployment.
Turn on location services so ATAK produces position telemetry. Repeat these configuration steps for every unit joining the local mesh network. Telemetry updates render on the central dashboard map rapidly.
Review docs/RUN_LOCAL.md in the TAK Situational Demo
repository for step-by-step device onboarding instructions.
Explore operational workflows
Access the operational dashboard at http://localhost. The mapping interface displays field actors and dims inactive nodes. The telemetry panel provides active callsigns, while the chat window streams field transmissions.
Dispatch messages or drop map markers directly from the central interface. The dashboard writes new documents into MongoDB, and the connector broadcasts updates through Ditto Server to every paired handheld unit across the shared data layer.
Connect MongoDB Compass to localhost:27017 to inspect raw application documents, and open Ops Manager to monitor the cluster like a production administrator.
Key Learnings
Build the application data layer first: Use MongoDB Enterprise Advanced to store and serve mission data for dashboards, APIs, and command-center workflows.
Model mission entities as documents: Use MongoDB collections to store position data, map objects, chat messages, files, and alerts without forcing one rigid schema.
Connect MongoDB to the edge: Use the Ditto MongoDB Connector to extend MongoDB-backed applications to disconnected ATAK devices.
Simplify application development: Build application features against one MongoDB data layer instead of creating separate storage models for each device or network condition.
Design for disconnected operations: Combine MongoDB’s durable document storage with Ditto’s local-first synchronization and conflict handling.
Authors
Timothy Marland, MongoDB
Alberto Camarena Rodriguez, MongoDB