icarus prospects
Icarus Prospects
A web-based save editor for Icarus prospect files. Served at /prospects on the portal
as a Flask Blueprint. Allows users to reset completed missions with full dependency
cascading.
Project Details
| Field | Value |
|---|---|
| GitLab Project | icarus/prospects |
| GitLab Project ID | 4 |
| Repository | https://git.eurekaendeavors.com/icarus/prospects |
| Visibility | private |
| License | GPL v3 |
| Portal route | /prospects |
| Package name | icarus-prospects |
| Depends on | icarus/core |
| Status | ✅ Live — 165+ uploads processed |
What It Does
Users upload a prospect save file (.json), select missions to reset, and download
the modified file. All in the browser, no installation required.
Supported features: - Reset Great Hunts mission chains (with full dependency cascading) - Reset Open World missions (with expedition → biome cascading) - Reset PRO and ELY story chains (sequential dependencies) - All missions shown with display names, descriptions, and difficulty - Session-based: no user accounts required, no persistent storage of save data - WCAG 2.1 Level A accessibility
Package Architecture
Extracted into a standalone pip package (icarus_prospects) on 2026-03-17 as part of the
submodule-first migration (#140). The portal blueprint is now thin wiring via
create_blueprint() factory with _state.py dependency injection.
icarus/prospects (submodule at icarus-prospects/)
├── icarus_prospects/
│ ├── __init__.py
│ ├── blueprint.py create_blueprint() factory
│ ├── models.py SQLAlchemy models (sessions, visits, events)
│ ├── routes.py Upload, editor, API routes
│ ├── services/
│ │ └── mission_service.py Cascade logic, mission parsing, reset application
│ ├── data/
│ │ ├── gh_chains.json GH chain definitions (9 chains, 3 maps)
│ │ └── mission_metadata.json Display names from catalog
│ ├── templates/prospects/
│ └── static/
├── pyproject.toml
└── tests/
Dependency Cascading
Mission dependencies are enforced automatically when toggling missions:
Great Hunts (GH) Chains
- Uncheck: Cascades downstream — all later missions also unchecked
- Check: Cascades upstream — all prerequisites also checked
- 9 chains across Olympus, Styx, and Prometheus maps
Expedition → Biome
- Uncheck expedition: All missions in that biome unchecked
- Check biome mission: Expedition unlock auto-checked
Story Chains (PRO/ELY)
- Sequential:
PRO_Story_0→PRO_Story_1→ ... →PRO_Story_6 - Same cascading rules as GH chains
Session Management
- Each upload creates a
ProspectEditSessionin PostgreSQL - Session ID stored in Flask session cookie
- Sessions expire after
PROSPECTS_SESSION_TTL_SECONDS(default 1 hour) - Expired sessions cleaned up periodically via
before_requesthook - All mission state held server-side (compressed blob + parsed state)
- No save data persists after session expiry
API Endpoints
All API routes require an active session (return 404 otherwise).
| Method | Path | Purpose |
|---|---|---|
| GET | /prospects/ |
Upload page |
| POST | /prospects/upload |
File upload + parse |
| GET | /prospects/editor |
Mission editor UI |
| POST | /prospects/api/toggle |
AJAX mission toggle with cascading |
| POST | /prospects/api/apply |
Generate modified save |
| GET | /prospects/api/download |
Download modified save |
| GET | /prospects/api/state |
Current session state |
Monetization
Prospects editing is split in the monetization plan: - Free: Marking missions as incomplete (resetting/replaying) - Premium: Marking missions as complete (skipping content)
See issue #139 for the prospects rework plan.
Accessibility (WCAG 2.1 Level A)
| Feature | Notes |
|---|---|
| Skip-to-content link | Keyboard navigation |
aria-live="polite" |
AJAX update announcements |
:focus-visible outlines |
On checkboxes |
role="status" |
On change count badge |
aria-describedby |
Upload error linked to input |