{
  "latest": "v1.1.7",
  "releases": [
    {
      "version": "v1.1.7",
      "date": "2026-04-17",
      "notes": "- Fix firmware layout and color scheme",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.7.bin",
      "sha256": "a3bde953162b6148d1c54cc1cae4481cbfd6c49fce4400a98fdf3ede1cfe1a26",
      "size": 1193392
    },
    {
      "version": "v1.1.6",
      "date": "2026-04-17",
      "notes": "esp_rom_crc32_le already applies the standard IEEE 802.3 init (~0) and\nfinal XOR (~result) internally. Seeding it with 0xFFFFFFFF and XOR-ing\nthe result caused every transfer to fail the CRC check, producing an\nendless ERROR_CRC_FAIL retry loop.\nRevert to init=0 and direct equality comparison so the running CRC\nmatches what java.util.zip.CRC32 produces on the Android side.",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.6.bin",
      "sha256": "6d0d68935e63b4e4fafc48c3fc60ecd2174acc685401505441cf92329d2b397c",
      "size": 1193392
    },
    {
      "version": "v1.1.5",
      "date": "2026-04-09",
      "notes": "Guard _appendLogRow against AXP2101 I2C faults returning 0 mV, which\npreviously wrote useless -1%/0mV rows for the entire session. Also\npurge stub log files under 512 bytes at startup — these accumulate from\nbrief USB/dev sessions and clutter the log list.",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.5.bin",
      "sha256": "9ecaa7961bc461ecc37b45d9092ccd6eb5cd4c372e42823ebc74b23c1421e7a3",
      "size": 1193072
    },
    {
      "version": "v1.1.4",
      "date": "2026-04-08",
      "notes": "- chore: move cleanup out of deploy into dedicated clean.sh\n- chore: move and generalise release script to project root\n- chore: add build and deploy scripts for firmware and Android app\n- fix(android): use explicit red for Reset button in factory reset dialog\n- fix(android): use explicit black text in factory reset confirmation dialog\n- fix(firmware): use opaque light background and black text on factory reset confirm overlay\n- fix(firmware): shift settings overlay up and widen layout\n- fix(firmware): add confirmation overlay for device-side factory reset\n- fix: factory reset button color; add factory reset to device settings overlay\n- feat(android): factory reset confirmation dialog and navigation\n- feat(android): add CHAR_FACTORY_RESET constant and BleViewModel::factoryReset()\n- feat(firmware): factory reset via BLE — wipe LittleFS, NVS, bonds, restart\n- feat(firmware): add UiManager::showFactoryResetScreen() with spinner\n- feat(firmware): add SettingsManager::clear() for factory reset\n- docs: factory reset implementation plan\n- docs: factory reset design spec",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.4.bin",
      "sha256": "1b8f5d30a38ad1b6b2e6e2b1400501f131a3b282d63bb6751c2ca77b924d106c",
      "size": 1192480
    },
    {
      "version": "v1.1.3",
      "date": "2026-04-08",
      "notes": "- Add deviceName to DeviceSettings, persisted in NVS\n- Load persisted name at boot for BLE advertising and GATT\n- setDeviceName() updates NVS, GATT characteristic, and advertising\n- Android updateDeviceName() writes name then reads back to confirm",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.3.bin",
      "sha256": "c1bd1b3be851e9237454a8df8529512f4c1645ac53b5b2a723e238d3b6a6a04d",
      "size": 1189776
    },
    {
      "version": "v1.1.2",
      "date": "2026-04-07",
      "notes": "- Remove LV_OBJ_FLAG_SCROLLABLE from OTA overlay to prevent LVGL\n  from rendering phantom scrollbar lines on the round display edges\n- Add OTA partition diagnostics (running/target partition labels)\n- Add boot partition log at startup for post-OTA verification\n- Reset FirmwareUpdateState Complete→Idle on BLE reconnect so the\n  version check runs after OTA reboot, confirming the new version booted",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.2.bin",
      "sha256": "ace7274a3e92524431530e7ea7e53176cc92fa2e41829cc80f057a7d29b3c372",
      "size": 1187472
    },
    {
      "version": "v1.1.1",
      "date": "2026-04-07",
      "notes": "Full end-to-end OTA update flow from the Android companion app to the\nESP32-S3 device over BLE, including SHA-256 verification, progress\noverlay, reliable WRITE_NR transfer, and release management tooling.",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.1.bin",
      "sha256": "f2bb0e186c612249050254425e16428bf4577b7494982cbba419b737948410b2",
      "size": 1187168
    },
    {
      "version": "v1.1.0",
      "date": "2026-04-07",
      "notes": "- fix(ota): reliable transfer and improved overlay\n- fix(android): add missing ACCESS_NETWORK_STATE permission for wifi check\n- feat: auto-generate release notes from commits since last official tag\n- fix(android): scrollable settings screen, dev-build version handling, all-releases list\n- fix: add root@ user prefix to scp commands in release script\n- fix: correct firmware deploy path to /mnt/webserver/srv/pintastic/fw/\n- fix: use nomad01.lan (cluster node) instead of nomad.lan (load balancer) for firmware deploy\n- docs: fix firmware deployment path in CLAUDE.md\n- fix: fall back to most recent tag when HEAD is not exactly on a tag\n- Update release_firmware\n- fix(android): replace check-for-update retry button with snackbar toast\n- feat: add release_firmware.sh deploy script and firmware-release skill\n- fix(android): guard OTA state transitions, add try/finally cleanup, fix indeterminate progress\n- feat(android): add firmware update UI to DeviceSettingsScreen\n- feat(android): add FirmwareUpdateState, checkForUpdate, and startFirmwareUpdate to BleViewModel\n- fix(android): use SDK 33+ writeCharacteristic API and add retry cap in OTA transfer\n- feat(android): add OTA BLE transfer with WRITE_NR windowed streaming\n- feat(android): add OtaForegroundService to keep process alive during firmware transfer\n- feat(firmware): add OTA rollback validation and guard sleep/power-off during OTA\n- fix(firmware): add 3s error overlay dismiss timer, fix version string boundary\n- feat(firmware): add BLE OTA service with NimBLE characteristics and deferred update pattern\n- fix(firmware): block gestures during OTA overlay, init version label text\n- feat(firmware): add OTA progress overlay to UiManager\n- fix(firmware): correct OtaManager doc, buffer comment, and check mbedTLS return codes\n- feat(firmware): add OtaManager with esp_ota_ops and mbedTLS SHA-256\n- fix: streaming SHA-256, clamp progress, verify SHA in getCachedBinary\n- feat(android): add FirmwareRepository with manifest fetch, download, and SHA-256 verify\n- fix: guard blank latestVersion in isUpdateAvailable, namespace OTA commands\n- feat: add OTA UUIDs, permissions, and FirmwareManifest data model\n- docs: add OTA firmware update implementation plan\n- docs: add OTA firmware update design spec",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.1.0.bin",
      "sha256": "f2bb0e186c612249050254425e16428bf4577b7494982cbba419b737948410b2",
      "size": 1187168
    },
    {
      "version": "v1.0.0",
      "date": "2026-04-07",
      "notes": "Add PDF docs and fixes to versioning",
      "url": "https://pintastic.carroarmato0.be/fw/pintastic-v1.0.0.bin",
      "sha256": "f7f9c834a48a1a7d0805b42beba38ac3fd7f16f1c196ee0336f888fcd4f83e1b",
      "size": 1187152
    }
  ]
}
