Built for the IBM AI Builders Challenge β Advance Space Exploration with AI
OrbitGuard is an AI-powered triage assistant that helps space-mission operators cut through the noise in spacecraft and ground-station telemetry logs β fast. Paste your telemetry, click Run Triage, and receive a plain-language breakdown of every line: what looks normal, what looks suspicious, and exactly what to do next.
Modern space systems β satellites, ground stations, and mission-control networks β are increasingly targeted by sophisticated cyberattacks. The challenge for operators is that the symptoms of a cyberattack often look identical to an ordinary malfunction: an unexpected command, an anomalous signal, an off-schedule data packet.
When something goes wrong during a mission, operators may have only minutes to decide whether they're dealing with a hardware glitch or an active intrusion. Getting that call wrong can mean losing a spacecraft.
This is not hypothetical. In 2007 and 2008, hackers gained unauthorized access to two real NASA/USGS satellites β Landsat-7 and Terra AM-1 β through a ground station in Norway. A US congressional commission later confirmed that in one incident, the intruders "achieved all steps required to command the satellite" but did not issue commands. From the outside, that moment was indistinguishable from ordinary interference. OrbitGuard exists to close exactly that gap.
OrbitGuard acts as a first-pass triage partner for the human operator. It ingests raw telemetry lines (or full mission incident reports) and uses AI to classify each one, delivering:
| Output | Description |
|---|---|
| Verdict | Normal / Suspicious / Likely Attack with a confidence score |
| Explanation | A plain-language reason β no jargon, no black box |
| Next Step | A concrete recommended action for the operator |
OrbitGuard does not make autonomous decisions. It surfaces what matters, explains its reasoning, and keeps the human operator firmly in control.
- π Line-by-line telemetry analysis β every log entry gets its own verdict
- π§ AI-generated explanations β understand why something looks suspicious, not just that it does
- β‘ Operator feedback loop β confirm a verdict or log an override with a note; OrbitGuard remembers it, and future similar readings are reasoned about in light of that feedback β without ever overriding the operator's authority to decide
- β Actionable next steps β no ambiguity; each result tells the operator what to do
- π¨ Mission-control UI β deep navy + dusty-rose/lavender aesthetic built for clarity under pressure
- β‘ Zero setup for operators β paste logs, click a button, get results
- π Flexible ingestion β paste text directly, or upload
.txt/.csvtelemetry logs and.pdfmission incident reports - π Secrets-safe β API keys live in
.env, never in the browser or repository
OrbitGuard uses IBM Granite (via IBM watsonx) as its reasoning engine. Granite was chosen for its strong performance on structured analytical tasks and its alignment with IBM's enterprise-grade AI principles.
The analysis pipeline is intentionally straightforward:
[ Operator pastes telemetry logs or uploads a file ]
β
βΌ
[ Flask backend receives input ]
β
βΌ
[ IBM Granite (via watsonx) analyzes each line ]
β Classifies: Normal / Suspicious / Likely Attack
β Generates plain-language explanation
β Suggests operator next step
β
βΌ
[ Results rendered as color-coded verdict cards ]
π’ Normal π‘ Suspicious π΄ Likely Attack
The prompt is structured to keep Granite grounded in the telemetry context β it is given the telemetry line, the mission context, and asked to reason step by step before delivering a verdict. This reduces hallucination and keeps explanations factual.
OrbitGuard treats the human operator as more than an end recipient of verdicts β their judgment actively shapes future analysis. Every verdict card carries two actions:
| Action | What Happens |
|---|---|
| Confirm | Locks in agreement with Granite's verdict β stamped β Verdict Confirmed |
| Log Override | Operator adds a note explaining their own read of the situation β stamped β Operator-Flagged |
This feedback is stored locally per operator session. When a new telemetry reading shares a sensor or parameter with a previously-reviewed one, OrbitGuard surfaces the operator's earlier note directly inside Granite's reasoning prompt β visibly marked on the resulting card with "Adjusted from operator feedback on a similar reading."
[ Operator confirms β or overrides β‘ a verdict, optionally with a note ]
β
βΌ
[ Feedback stored locally, keyed to the reading ]
β
βΌ
[ A similar reading appears in a future triage run ]
β
βΌ
[ Granite reasons with that operator context in view ]
β Low-risk readings: verdict may relax, and Granite's own
explanation references the operator's note directly
β High-risk / critical readings: verdict holds firm β
operator context informs the analysis, never softens
a genuine threat assessment
Crucially, this is feedback, not automation. Granite doesn't remember on its own initiative, and it never lets a past override silently reclassify a genuinely dangerous reading. The operator's authority to confirm or override again is always live β every card, every time. This is "AI explains, human decides" made visible and persistent, not just a stated principle.
IBM Docling is integrated in the pipeline to handle uploaded files. .txt and .csv logs are parsed and triaged line-by-line, while .pdf mission incident reports are parsed as a single structured document β showcasing Docling's ability to extract and preserve tables and layout from real-world report formats β and triaged as one unified incident.
| Layer | Technology |
|---|---|
| Backend | Python 3, Flask |
| AI Model | IBM Granite (via IBM watsonx) |
| AI Platform | IBM watsonx.ai |
| Document Parsing | IBM Docling |
| Frontend | HTML5, CSS3, Vanilla JavaScript |
| Config | python-dotenv |
IBM Bob was the primary development tool for this entire project. Bob was used to:
- Plan the architecture β breaking the project into stages and mapping out the Flask routes, frontend structure, and AI integration approach before a single line of code was written
- Scaffold the codebase β generating the initial
app.py,index.html,style.css, andscript.jsfiles with full comments and structure - Integrate IBM Granite and Docling β wiring up the watsonx API calls and file-parsing pipeline through iterative, plain-English prompting
- Iterate on the UI β refining the mission-control aesthetic, color scheme, and component layout through conversation
- Write this README β the full documentation was drafted collaboratively with Bob based on the actual project files
Bob acted as a knowledgeable co-developer throughout β not just an autocomplete tool, but a planning partner that understood the project goals and helped make deliberate technical decisions.
Landing screen
The mission-control interface at rest β a subtle twinkling starfield behind a clean telemetry input panel, ready for an operator to paste logs or upload a file.
Running a triage
Sample telemetry pasted directly into the input box, ready to run.
Verdict range: Normal β Likely Attack
A normal command packet (green, 95% confidence) sits right next to a compromised one flagged as Likely Attack (red, 92% confidence) β showing OrbitGuard's full verdict range in a single triage run, each with its own plain-language analysis and recommended action.
Operator confirms a verdict
When Granite's read matches the operator's own judgment, one click locks it in β no re-typing, no second-guessing the obvious.
Operator override β the feedback loop in action
An operator flags a Suspicious verdict (75% confidence) with a note linking it to a related anomaly elsewhere in the log. The next time OrbitGuard sees a similar reading, Granite factors that human judgment into its reasoning β upgrading the verdict to Likely Attack (85% confidence) and marking the card OPERATOR-FLAGGED, with a visible note that the read was adjusted from prior operator feedback.
Clearing review history
A confirmation step before wiping stored operator feedback for the session β a deliberate reset, not an accidental one.
Mission incident report (PDF) upload
A full .pdf mission incident report selected and ready for triage, showcasing file upload support alongside pasted-text input.
Mission incident report (PDF) verdict
Docling parses the report as a single structured document, and OrbitGuard delivers one unified verdict for the entire incident.
git clone https://github.com/Afzaam/orbitguard.git
cd orbitguardpython -m venv venv
venv\Scripts\activate # Windows
# source venv/bin/activate # macOS / Linux
pip install -r requirements.txtcopy .env.example .env # Windows
# cp .env.example .env # macOS / LinuxOpen .env and fill in your IBM watsonx credentials:
WATSONX_API_KEY=your-api-key-here
WATSONX_PROJECT_ID=your-project-id-here
WATSONX_URL=https://api.us-south.ml.cloud.ibm.compython app.pyNavigate to http://127.0.0.1:5000, paste some telemetry, and click Run Triage.
Sample telemetry to try:
SENSOR_TEMP: 45.2Β°C [NORMAL]
COMMAND_RECV: POWER_DOWN from unknown_user at 03:15 UTC
SIGNAL_STRENGTH: -120 dBm [WEAK]
- Real satellite data integration β connect OrbitGuard to live telemetry streams from publicly available satellite feeds (e.g., NORAD, NASA Open Data)
- Live ground-station feeds β real-time WebSocket ingestion from ground-station software, enabling continuous background triage rather than manual paste-and-run
- Mission profile context β allow operators to specify the spacecraft type, mission phase, and known anomaly baselines so the AI can reason with mission-specific knowledge
- Audit trail β persistent logging of every triage session so operators can review decisions and retrain the model on confirmed incidents
- Multi-language support β internationalization for international mission-control teams
- Operator authentication & role-based access control β secure login for mission-control teams, with permission tiers distinguishing who can run triage versus who can review and act on results, for multi-user deployments
orbitguard/
βββ app.py # Flask backend β routes and watsonx integration
βββ requirements.txt # Python dependencies
βββ .env.example # Environment variable template
βββ .gitignore # Keeps secrets out of version control
βββ README.md # This file
βββ docs/
β βββ screenshots/ # README screenshots
βββ templates/
β βββ index.html # Main UI
βββ static/
βββ style.css # Mission-control styling (navy + dusty-rose/lavender)
βββ script.js # Frontend logic (form, AJAX, result cards)
OrbitGuard β Built with β€οΈ and IBM Bob | IBM AI Builders Challenge 2026







