# 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

1. **Python-native `.intunewin` format** — reimplemented AES-256-CBC + HMAC-SHA256 encrypted ZIP-in-ZIP with detection.xml, validated byte-level (Phase 1 / 01-03)
2. **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)
3. **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)
4. **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)
5. **One-click package export** — `/packages/intunewin` and `/packages/ninja` endpoints assemble complete ready-to-deploy artifacts from a saved printer config (Phase 5)
6. **Icon upload + embedding** — Pillow-validated 256×256 PNG ≤750KB, SHA256-addressed storage, wired into .intunewin output (Phases 5 + 6)
7. **Working dashboard + nav** — `/packages` listing page, live `recent_printers` / `recent_packages` DB 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)
- `.intunewin` byte-level format validation against a real Intune tenant
- `pnputil` + `$PSScriptRoot` path 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}` but `packages.py` looked up `{sha256}.zip` — upload→export flow was broken in production, masked by pre-staged test fixtures. Fixed by centralizing path in `DriverStore.get_path()`; added `tests/test_upload_export_roundtrip.py` regression test.
- Peewee `datetime.utcnow()` deprecation eliminated (`_utcnow()` helper in `db/models.py`)
- Stale `requirements-completed` frontmatter back-filled on 5 SUMMARY.md files

### Archives

- Roadmap: [`milestones/v1.0-ROADMAP.md`](milestones/v1.0-ROADMAP.md)
- Requirements: [`milestones/v1.0-REQUIREMENTS.md`](milestones/v1.0-REQUIREMENTS.md)
- Audit report: [`milestones/v1.0-MILESTONE-AUDIT.md`](milestones/v1.0-MILESTONE-AUDIT.md)
