Archive v1.0 MVP: 7 phases, 13 plans, 27/27 requirements. - Archive roadmap to milestones/v1.0-ROADMAP.md - Archive requirements to milestones/v1.0-REQUIREMENTS.md - Move milestone audit into milestones/ - Create MILESTONES.md with v1.0 entry - Evolve PROJECT.md: move shipped requirements to Validated, update Context with stack/LOC, log Key Decisions with outcomes - Collapse ROADMAP.md to one-line milestone summary - Update STATE.md to shipped status - Back-fill stale requirements-completed frontmatter on 02-01, 04-01, 05-01, 06-01 SUMMARY.md files Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.5 KiB
ImpTune Milestones
Historical record of shipped versions.
v1.0 — ImpTune MVP
Shipped: 2026-04-13
Timeline: 2026-04-10 → 2026-04-13 (4 days)
Phases: 7 (1–7, including gap-closure phases 6 & 7)
Plans: 13
Requirements: 27/27 satisfied
Git tag: v1.0
Delivered
A self-hosted single-container webapp that takes a driver ZIP + printer configuration and produces ready-to-deploy packages for Microsoft Intune (.intunewin, Python-native) or NinjaRMM (ZIP) — covering driver INF parsing, full printer configuration with client/tenant grouping, PowerShell install/uninstall/detect generation with UAC + WOW64 guards, icon embedding, and command-preview UI.
Key Accomplishments
- Python-native
.intunewinformat — reimplemented AES-256-CBC + HMAC-SHA256 encrypted ZIP-in-ZIP with detection.xml, validated byte-level (Phase 1 / 01-03) - Driver upload with INF parsing — RawConfigParser-based parser handles BOM/UTF-16,
%TOKEN%resolution, multi-model drivers, and unused-file detection; backed by SHA256 content-addressed storage (Phase 2) - Full printer CRUD — all 10 PRNT requirements (name, IP, port, duplex, color, paper, collate, client assignment, persistence, regenerate), HTMX forms, Alpine.js IP→port auto-derivation (Phase 3)
- Production-ready PowerShell generators — install/uninstall/detect with SYSTEM-vs-user UAC elevation, WOW64 64-bit relaunch guard, pnputil two-step staging, duplex mapping (Phase 4)
- One-click package export —
/packages/intunewinand/packages/ninjaendpoints assemble complete ready-to-deploy artifacts from a saved printer config (Phase 5) - Icon upload + embedding — Pillow-validated 256×256 PNG ≤750KB, SHA256-addressed storage, wired into .intunewin output (Phases 5 + 6)
- Working dashboard + nav —
/packageslisting page, liverecent_printers/recent_packagesDB queries on dashboard (Phase 7 gap closure)
Architecture / Stack
Python 3.12 · FastAPI · Jinja2 · HTMX · Alpine.js · Pico CSS · SQLite (Peewee WAL) · pycryptodome · Pillow — single Docker container, no Node.js, no external DB, no auth.
Known Gaps / Tech Debt carried into v1.1
- Printer form driver dropdown requires manual page reload after new driver upload (Phase 2)
- PRNT-03 Alpine.js port auto-derivation — code verified, live browser runtime verification pending (Phase 3)
- No UI links to individual script downloads — only via package export or direct URL (Phase 5)
.intunewinbyte-level format validation against a real Intune tenantpnputil+$PSScriptRootpath resolution under SYSTEM context on a real Intune-managed device- Nyquist validation: all 7 phases have draft VALIDATION.md but none are Nyquist-compliant — separate track for v1.1
Notable Fixes Late in Milestone (2026-04-13)
- BLOCKER: DriverStore saved files at
{sha256}butpackages.pylooked up{sha256}.zip— upload→export flow was broken in production, masked by pre-staged test fixtures. Fixed by centralizing path inDriverStore.get_path(); addedtests/test_upload_export_roundtrip.pyregression test. - Peewee
datetime.utcnow()deprecation eliminated (_utcnow()helper indb/models.py) - Stale
requirements-completedfrontmatter back-filled on 5 SUMMARY.md files
Archives
- Roadmap:
milestones/v1.0-ROADMAP.md - Requirements:
milestones/v1.0-REQUIREMENTS.md - Audit report:
milestones/v1.0-MILESTONE-AUDIT.md