Operational demonstration applications for the swim-developer SWIM framework. Each application represents a real ATM operational scenario and integrates directly with one or more core SWIM services.
Repository: git@github.com:swim-developer/swim-example-apps.git
The SWIM framework (swim-dnotam-consumer, swim-ed254-consumer, swim-dnotam-provider, swim-ed254-provider) handles the infrastructure concerns: AMQP connections, mTLS, XSD validation, subscription lifecycle, outbox, heartbeat, and delivery guarantees.
These example applications sit on top of that framework and show what operational teams can build once the data is flowing:
- Consumer apps read events from Kafka topics that the framework services publish after processing
- Provider apps inject events into the framework via Kafka or the internal HTTP API, simulating upstream data sources
Each application has a Quarkus backend and a React + PatternFly frontend.
| Application | Simulates | Data source | Backend | Frontend |
|---|---|---|---|---|
| dnotam-operations-dashboard | Airfield ops centre receiving real-time DNOTAM events | swim-dnotam-consumer Kafka topics (6 operational intent categories) |
:8090 |
:3000 |
| ed254-arrival-flow-manager | Downstream ATSU receiving arrival sequences from an upstream AMAN | swim-ed254-consumer Kafka topics + consumer subscription API |
:8091 |
:3001 |
| Application | Simulates | Data target | Backend | Frontend |
|---|---|---|---|---|
| dnotam-event-publisher | AISP/EAD workstation publishing DNOTAM events | swim-dnotam-provider via Kafka or internal HTTP API |
:8092 |
:3002 |
| ed254-aman-client | Upstream AMAN system operator publishing arrival sequences and monitoring downstream consumers | swim-ed254-provider via Kafka and internal HTTP API |
:8093 |
:3003 |
The consumer apps require the corresponding SWIM service to be running and publishing to Kafka:
| App | Required service | Kafka topics expected |
|---|---|---|
| dnotam-operations-dashboard | swim-dnotam-consumer |
dnotam-events-closure-topic, dnotam-events-restriction-topic, dnotam-events-surface-condition-topic, dnotam-events-airspace-topic, dnotam-events-hazards-navaids-topic, dnotam-events-others-topic |
| ed254-arrival-flow-manager | swim-ed254-consumer |
ed254-arrival-sequence-topic, ed254-provider-exception-topic |
The provider apps require the corresponding SWIM provider to be running:
| App | Required service | Integration point |
|---|---|---|
| dnotam-event-publisher | swim-dnotam-provider |
Internal HTTP API at :9080 and/or Kafka dnotam-events-all-topic |
| ed254-aman-client | swim-ed254-provider |
Internal HTTP API at :9080 and Kafka ed254-arrival-sequence-topic |
- Java 21 + Maven 3.9+
- Node.js 20+ and npm
- Podman with Compose support
Each app ships with a compose.yml that starts the local infrastructure (Kafka, WireMock or AKHQ) needed to run the backend in Quarkus dev mode.
# Start infrastructure for the app
cd <app-directory>
podman compose up -d
# Start backend
cd backend
./mvnw quarkus:dev -Ddebug=false
# Start frontend (separate terminal)
cd frontend
npm install
npm run devSee each app's README for the full walkthrough and specific configuration.
| Application | Frontend | Backend | Swagger UI |
|---|---|---|---|
| dnotam-operations-dashboard | http://localhost:3000 | http://localhost:8090 | http://localhost:8090/swagger-ui |
| ed254-arrival-flow-manager | http://localhost:3001 | http://localhost:8091 | http://localhost:8091/swagger-ui |
| dnotam-event-publisher | http://localhost:3002 | http://localhost:8092 | http://localhost:8092/swagger-ui |
| ed254-aman-client | http://localhost:3003 | http://localhost:8093 | http://localhost:8093/swagger-ui |
All images are multi-arch (linux/amd64 + linux/arm64) and published to quay.io. Each app has one repository with two tags: backend and frontend.
| Application | Image |
|---|---|
| dnotam-operations-dashboard | quay.io/masales/example-apps-dnotam-dashboard |
| dnotam-event-publisher | quay.io/masales/example-apps-dnotam-publisher |
| ed254-arrival-flow-manager | quay.io/masales/example-apps-ed254-manager |
| ed254-aman-client | quay.io/masales/example-apps-ed254-aman |
From example-apps/:
# Build a single app (backend + frontend, multi-arch manifest)
make dnotam-dashboard-jvm
make dnotam-publisher-jvm
make ed254-manager-jvm
make ed254-aman-jvm
# Build only one component
make dnotam-dashboard-backend-jvm
make dnotam-dashboard-frontend-jvm
# Override registry or tag
make dnotam-dashboard-jvm REGISTRY=quay.io/myorg TAG=v1.0.0Run make help for the full list of targets.
Each app includes a Helm chart under <app>/deploy/helm/. Environment-specific values files control namespace, routes, and resource limits.
| Environment | Values file | Namespace | Route domain |
|---|---|---|---|
| CRC (default) | values-crc.yaml |
swim-demo |
*.apps-crc.testing |
| Production | values.yaml |
swim-example-apps |
*.apps.ocp4.masales.cloud |
# Deploy to CRC
make deploy-dnotam-dashboard
# Deploy all apps
make deploy-all
# Deploy to a different environment
make deploy-dnotam-dashboard ENV=prod NAMESPACE=swim-example-apps
# Check status
make status
# Remove
make cleanup-dnotam-dashboard
make cleanup-all| Layer | Technology |
|---|---|
| Backend | Quarkus 3.x, Java 21 (virtual threads) |
| Database | MongoDB (Panache Active Record) |
| Messaging | Apache Kafka (SmallRye Reactive Messaging) |
| Real-time | WebSocket (Quarkus WebSockets Next) |
| API | JAX-RS + OpenAPI 3.1 |
| Observability | OpenTelemetry, Prometheus metrics |
| Frontend | React 19, PatternFly 6, Vite 6 |
| Container runtime | UBI9 openjdk-21 (backend), Nginx 1.27 (frontend) |
| Registry | quay.io, multi-arch (amd64 + arm64) |
| Orchestration | Helm 3 on OpenShift / Kubernetes |
┌────────────────────────────────────────────────────────┐
│ swim-developer SWIM Services │
├────────────────────────────────────────────────────────┤
│ swim-dnotam-provider │ swim-ed254-provider │
│ swim-dnotam-consumer │ swim-ed254-consumer │
│ (Kafka topics) │ (Kafka topics) │
└────────────┬────────────┴────────────┬─────────────────┘
│ data flows │
┌────────────▼────────────────────────▼─────────────────┐
│ swim-example-apps │
├───────────────────────────┬────────────────────────────┤
│ Consumer apps │ Provider apps │
│ │ │
│ dnotam-operations- │ dnotam-event-publisher │
│ dashboard (:8090/3000) │ (:8092/3002) │
│ │ │
│ ed254-arrival-flow- │ ed254-aman-client │
│ manager (:8091/3001) │ (:8093/3003) │
└───────────────────────────┴────────────────────────────┘
| Project | Role |
|---|---|
| swim-dnotam-consumer | Consumes DNOTAM events from AMQP, publishes to Kafka |
| swim-dnotam-provider | Publishes DNOTAM events to subscribers via AMQP |
| swim-ed254-consumer | Consumes ED-254 arrival sequences from AMQP, publishes to Kafka |
| swim-ed254-provider | Publishes ED-254 arrival sequences to subscribers via AMQP |
| swim-developer-framework | Core framework all services are built on |
Licensed under the Apache License 2.0.