gitignore: add HANDOFF.md to ignore list
This commit is contained in:
@@ -48,3 +48,6 @@ android/app/build/
|
|||||||
*.apk
|
*.apk
|
||||||
*.aab
|
*.aab
|
||||||
android/local.properties
|
android/local.properties
|
||||||
|
|
||||||
|
# Handoff docs (internal tracking)
|
||||||
|
HANDOFF.md
|
||||||
|
|||||||
-119
@@ -1,119 +0,0 @@
|
|||||||
# HANDOFF — PaperDash Project Setup
|
|
||||||
|
|
||||||
**Date:** 2026-07-01
|
|
||||||
**Status:** Initial project scaffold complete
|
|
||||||
|
|
||||||
## What Was Done
|
|
||||||
|
|
||||||
### 1. Repository Setup
|
|
||||||
|
|
||||||
- Cloned empty repo from `https://gitea.kareemhorstink.me/Imrayya/e-ink-dash`
|
|
||||||
- Created `README.md`, `.gitignore`, `LICENSE` (MIT)
|
|
||||||
- Copyright: **Imrayya (2026)**
|
|
||||||
- Project name: **E-INK Dashboard Ecosystem ~ Paperdash**
|
|
||||||
|
|
||||||
### 2. Architecture Documentation
|
|
||||||
|
|
||||||
- Read and processed `.pi/paperdash_architecture_document.txt`
|
|
||||||
- Updated architecture doc with:
|
|
||||||
- Generic audio mixer interface (Windows Core Audio + Voicemeeter, Voicemeeter as primary focus)
|
|
||||||
- Two notification types: `progress` (with progress bar) and `alert` (rich text with priority levels)
|
|
||||||
- Updated ASCII diagram to include Windows Audio backend
|
|
||||||
|
|
||||||
### 3. Design Decision Records (`.pi/docs/design/`)
|
|
||||||
|
|
||||||
Created four design documents:
|
|
||||||
|
|
||||||
- **architecture-overview.md** — Framework choices (FastAPI, Vanilla JS, WebView, WebSocket)
|
|
||||||
- **audio-mixer-design.md** — Generic audio interface with pluggable backends, data models
|
|
||||||
- **notification-system-design.md** — Two notification types (progress + alert), schemas, rationale
|
|
||||||
- **exe-tray-design.md** — PyInstaller + pystray system tray, quit-only interface
|
|
||||||
|
|
||||||
### 4. Python Server (`server/`)
|
|
||||||
|
|
||||||
Created the FastAPI server with these modules:
|
|
||||||
|
|
||||||
- **main.py** — FastAPI app with WebSocket endpoint (PIN auth), REST endpoints (`/api/v1/state`, `/api/v1/notify`), client HTML serving
|
|
||||||
- **audio_mixer.py** — Pluggable audio backends (Windows Core Audio via pycaw, Voicemeeter via voicemeeter-api), unified `AudioMixerState` data model, `AudioMixerManager` for polling
|
|
||||||
- **media.py** — Windows GSMTC media tracking (title, artist, artwork, playback state), media control commands (play/pause/skip/prev)
|
|
||||||
- **notifications.py** — `NotificationManager` supporting progress and alert types, ID-based update/dismiss, auto-pruning (max 10 active)
|
|
||||||
- **telemetry.py** — HWiNFO64 Shared Memory polling for CPU/GPU temps, RAM/VRAM usage
|
|
||||||
- **tray_wrapper.py** — System tray icon with quit option, runs server in subprocess
|
|
||||||
- **build_exe.py** — PyInstaller build script producing `PaperDash.exe` in `server/dist/`
|
|
||||||
- **requirements.txt** — All Python dependencies
|
|
||||||
|
|
||||||
### 5. Test Suite (`server/tests/`)
|
|
||||||
|
|
||||||
Created comprehensive tests:
|
|
||||||
|
|
||||||
- **test_notifications.py** — Notification creation, updates, pruning, dismissal, progress percentage calculation (async tests with pytest-asyncio)
|
|
||||||
- **test_audio_mixer.py** — Data model defaults, manager initialization with no backends, set_volume/set_mute graceful handling
|
|
||||||
- **test_main.py** — Health endpoint, state endpoint, notify endpoint auth (401 without token, success with valid token)
|
|
||||||
- **test_media.py** — Media state defaults, playing state, manager get_state
|
|
||||||
- **test_telemetry.py** — Sensor reading, telemetry state, manager get_state
|
|
||||||
|
|
||||||
### 6. E-Ink Client (`client/`)
|
|
||||||
|
|
||||||
Created the web client (source of truth for HTML/CSS/JS):
|
|
||||||
|
|
||||||
- **index.html** — PIN login screen + dashboard with panels (media, audio mixer, telemetry, notifications)
|
|
||||||
- **style.css** — High-contrast black/white E-Ink optimized styles, no transitions, block-based progress meters
|
|
||||||
- **app.js** — Vanilla JS WebSocket client with:
|
|
||||||
- PIN authentication and auto-reconnect
|
|
||||||
- Media display (title, artist, album, artwork base64, progress bar, controls)
|
|
||||||
- Audio mixer display (master volume, mute, per-channel meters with block indicators)
|
|
||||||
- Telemetry display (CPU/GPU temp, RAM/VRAM usage)
|
|
||||||
- Notifications (progress bars as block indicators, alert priorities)
|
|
||||||
- Swipe gesture zones (70px threshold) for volume adjustment
|
|
||||||
- DOM API usage (no innerHTML for security)
|
|
||||||
|
|
||||||
### 7. Android Client APK (`android/`)
|
|
||||||
|
|
||||||
Created a custom Android WebView APK for the **BOOX Go 7 Color Gen II** (Android 13):
|
|
||||||
|
|
||||||
- **MainActivity.kt** — Kotlin Single Activity that hosts a full-screen WebView, hides system bars via immersive mode, loads `file:///android_asset/index.html`
|
|
||||||
- **AndroidManifest.xml** — INTERNET permission, landscape orientation, full-screen theme
|
|
||||||
- **build.gradle.kts** — AGP 8.2.0, Kotlin 1.9.22, compileSdk 34, targetSdk 34, minSdk 33 (Android 13)
|
|
||||||
- **assets/** — Bundled index.html, style.css, app.js (copied from `client/`)
|
|
||||||
- **README.md** — Build and installation instructions
|
|
||||||
|
|
||||||
Build: `cd android && ./gradlew assembleDebug`
|
|
||||||
APK output: `app/build/outputs/apk/debug/app-debug.apk`
|
|
||||||
|
|
||||||
### 8. Git Ignore
|
|
||||||
|
|
||||||
- Python artifacts (`__pycache__`, `*.pyc`, `dist/`, `build/`)
|
|
||||||
- Virtual environments (`venv/`, `.venv/`)
|
|
||||||
- Environment files (`.env`, `.env.local`)
|
|
||||||
- IDE files (`.idea/`, `.vscode/`)
|
|
||||||
- `.pi/` directory (contains secrets like PINs and tokens)
|
|
||||||
- Build artifacts (`*.exe`, `*.spec`)
|
|
||||||
|
|
||||||
## Key Design Decisions
|
|
||||||
|
|
||||||
1. **Audio mixer is generic** — supports both Windows default output and Voicemeeter through a pluggable backend interface. Voicemeeter is the immediate implementation focus.
|
|
||||||
|
|
||||||
2. **Two notification types** — `progress` for long-running tasks with progress bars, `alert` for one-off messages with priority levels (info/warning/error).
|
|
||||||
|
|
||||||
3. **E-Ink optimized client** — vanilla JS (no frameworks), DOM API instead of innerHTML, block-stepped progress meters, no CSS transitions, high-contrast black/white theme.
|
|
||||||
|
|
||||||
4. **System tray .exe** — PyInstaller compiles the server to a standalone .exe that runs in the notification bar with a single "Quit" option. No window, no taskbar presence.
|
|
||||||
|
|
||||||
5. **PIN auth for dashboard, Bearer token for scripts** — dual authentication model matching the architecture doc.
|
|
||||||
|
|
||||||
## What's Next
|
|
||||||
|
|
||||||
- Install dependencies and run tests: `cd server && pip install -r requirements.txt && pytest`
|
|
||||||
- Test on Windows with actual Voicemeeter and HWiNFO64
|
|
||||||
- Build Android APK: `cd android && ./gradlew assembleDebug`
|
|
||||||
- Install APK on BOOX Go 7 Color via ADB: `adb install app/build/outputs/apk/debug/app-debug.apk`
|
|
||||||
- Build the .exe: `python build_exe.py`
|
|
||||||
- Fine-tune E-Ink UI layout for the 7-inch display resolution
|
|
||||||
- Sync `client/` changes to `android/app/src/main/assets/` when updating the web client
|
|
||||||
|
|
||||||
## Environment Variables Required
|
|
||||||
|
|
||||||
| Variable | Purpose |
|
|
||||||
|----------|---------|
|
|
||||||
| `DASHBOARD_PIN` | 4-digit PIN for E-Ink client WebSocket auth |
|
|
||||||
| `API_TOKEN` | Bearer token for `/api/v1/notify` endpoint |
|
|
||||||
Reference in New Issue
Block a user