{
  "versionName": "0.6.0-dev",
  "versionCode": 2108,
  "baseVersionCode": 108,
  "apkUrl": "https://updater.javp.app/dev/javp-arm64-v8a-0.6.0-dev+108.apk",
  "changelog": "## 0.6.0-dev+108 (2026-09-28)\n\n### Fixed\n\n- Updating no longer leaves every previous installer in the app cache. Old\n  update downloads are removed, including ones already stored from earlier\n  versions, so cache can shrink even when Downloads is empty.\n- A download that fails or is cancelled no longer leaves the video behind\n  after it disappears from Downloads.\n\n- Taps and toggles no longer feel dead while a source sync is running. Screen\n  updates could previously be held back for **seconds** at a time and then\n  arrive all at once, which made the app look like it was ignoring you even\n  though it was running normally.\n- Windows stays more responsive during large VOD catalog writes: soft background\n  source syncs and catalog SQLite work no longer run on top of a manual\n  Synchroniser, and status ticks rematerialize Sources less often while busy.\n- Scrolling and tapping the Sources list during a sync no longer randomly\n  dies: status ticks used to rematerialize every source row, which cancelled\n  in-flight gestures. Only the row whose status actually changed rebuilds now.\n- Alt-tabbing away mid-sync no longer bricks window focus. Spurious blur is\n  debounced instead of hard-ignored or force-reclaimed.\n\n- Syncing a source no longer makes the app queue clicks or refuse to come to\n  the front on Windows. The pauses that were meant to let the window stay\n  responsive were themselves the stall, and they made every sync take about\n  three times longer than the work needed.\n- A long catalog job no longer holds up unrelated parts of the app. Browsing,\n  counts, and search used to wait behind whatever maintenance pass was running,\n  which is why the interface answered but nothing actually moved.\n- A moment of contention while saving no longer risks parking the app for up to\n  half a minute; it now backs off and retries instead.\n- Discord Rich Presence no longer costs anything while you browse. Its\n  connection checked itself sixty times a second on the same thread that draws\n  the app, whether or not something was playing.\n\n- Syncing an Xtream source downloads the movie and series catalogs once\n  each. A repeat sync that has not changed still skips the rewrite.\n\n### Bug fixes\n\n- Web companion opens IPTV as HLS (`.m3u8`) instead of a raw MPEG-TS (`.ts`) download, so Chrome/Firefox can play live channels.\n\n### Fixes\n\n- Windows stays clickable and foregroundable while large catalog syncs run in\n  the background (status text used to keep updating while the window ignored\n  focus and clicks).\n- Window can always be brought to foreground and focused during active sync\n  operations, preventing OS foreground-lock deadlocks.\n- Cold start no longer runs the VOD category index 2\u20133 times back-to-back on\n  large libraries (that was the multi-second Home hitch after launch).\n- Live channel sync commits groups in a single batch pass, eliminating hundreds\n  of individual SQLite write transactions and frame-yield stalls.\n- Resolving anime / remote-catalog episodes no longer freezes the UI or spams\n  catalog JSON rewrites to disk \u2014 playable episodes are kept in memory without\n  mutating the main catalog list.\n- Episode cards now live-refresh smoothly and instantly as each episode resolves,\n  without triggering full-screen scaffold rebuilds or getting dropped by quiet mode.\n- Continue Watching and Recent Channels on Home now properly live-refresh when\n  watching items or reordering channels.\n- Sources screen updates channel and VOD counts immediately upon sync completion.\n\n## 0.6.0-dev+107 (2026-09-25)\n\n### Fixes\n\n- Pausing playback pauses the next-episode countdown, so the next episode does not start on its own while the video is paused.\n\n- Google Drive on the web no longer fails to connect or sync with \u201cinit has already been called\u201d.\n\n### Improvements\n\n- The web companion lives at http://javp.tf (no HSTS) so HTTP streams can play in the browser.\n- `http://javp.tf/add?\u2026` is a first-class add-source link (same query as `https://javp.app/add`), not a media open.\n\n- On http://javp.tf, IPTV passwords and other secrets persist in localStorage. flutter_secure_storage_web cannot run outside a secure context (HTTPS / localhost).\n\n- On https://javp.tf, the web companion recommends http://javp.tf (mixed content / CORS). javp.app stays the native add-source link.\n\n### Bug fixes\n\n- Web companion demand-loads an IPTV live or VOD group when you open it, instead of painting an empty list and waiting on SQLite / a full dump.\n\n- Web companion no longer throws LiveChannelDb is unavailable on web when syncing Xtream live groups. Channels persist in the catalog / localStorage instead.\n\n## 0.6.0-dev+106 (2026-09-23)\n\n### Fixes\n\n- Pull-to-refresh on a series reloads episode versions from the catalog, including links that were already resolved.\n\n## 0.6.0-dev+105 (2026-09-23)\n\n### Fixes\n\n- Offline download now recognizes catalog HLS proxies (base64-wrapped `.m3u8` URLs) and packages the full episode instead of saving a tiny playlist file\n\n- Dragging the playhead on a movie or episode follows your finger, and playback jumps to that time when you let go.\n\n### Improvements\n\n- Play/pause control uses a slightly darker disc with no drop shadow\n\n## 0.6.0-dev+104 (2026-09-22)\n\n### Features\n\n- Playing local disk files (Open with / Library picker) starts immediately\n  like a regular media player \u2014 without adding them to Library \u2014 and Next /\n  Previous steps through other media in the same folder.\n\n### Fixes\n\n- Removing or re-syncing a remote catalog clears stale local series shells and\n  expired stream links so Play and episode lists match the live catalog again\n\n- Finishing an episode with no scene after the credits marks it watched and offers the next episode, instead of leaving a percent on that episode.\n- The next-episode countdown is shorter and uses a smaller card so the picture stays visible behind it. With no credits marker, that card appears only in the last few seconds, in time to show it will autoplay.\n\n- Holding for temporary 2\u00d7 no longer cancels into volume or brightness when the finger moves slightly\n\n- Phone player side-strip volume now follows the device volume (0\u2013100%), not software gain relative to the current level\n- Phone brightness side-strip uses a smoother perceptual curve instead of jumping between dim and full bright\n\n## 0.6.0-dev+103 (2026-09-22)\n\n### Fixes\n\n- After re-adding a custom catalog (new id, maybe a new name), v2 series that\n  still showed episode lists can resolve play URLs again instead of staying on\n  stubs from the old source id.\n\n- Refreshing a remote-catalog series page renews expired tokenized play links (magnets still kept)\n\n- Soft keyboard no longer covers Add / Edit source fields on the catalogs list.\n\n- Taps and settings toggles respond during a catalog sync. Progress animations\n  used to starve Flutter's idle queue, so clicks arrived but nothing reacted.\n- Discord Rich Presence no longer polls on the UI thread while you browse.\n- Catalog reads no longer wait behind a long SQLite maintenance pass. Sort-title\n  reindex runs on its own connection, and contended waits time out instead of\n  parking the app for up to half a minute.\n- Large catalog jobs no longer sleep a full frame between chunks, so a sync is\n  not several times slower than the work itself.\n- The Sources list stays scrollable while status updates; only the row that\n  changed rebuilds.\n- Windows no longer sweeps empty XInput slots dozens of times a second when no\n  controller is attached.\n\n- Watching a magnet no longer leaves a growing torrent cache on disk after you\n  stop \u2014 stream data under the temp folder is deleted when playback ends (and\n  orphans are cleared the next time the torrent engine starts).\n\n- Series episode lists no longer collapse to the one you just played after you leave and come back \u2014 opening a show keeps the full season, and playing an episode no longer dumps extra stream versions onto Home / Catalog.\n\n## 0.6.0-dev+102 (2026-09-08)\n\n### Fixes\n\n- Opening a downloaded series after a restart plays the files already on the\n  device instead of fetching episode versions from the catalog.\n\n- macOS: app no longer crashes at launch looking for `librqbit_engine` under the build machine's home directory; the torrent engine dylib now loads from the app bundle via `@rpath`.\n\n- Auto-download ahead and next/previous episode keep the same version kind you picked (for example VOSTFR) instead of falling back to the default edition\n\n- Web player uses the same gesture controls as the desktop/phone app, and clicks work again (HTML video no longer steals pointer events).\n- Live / HLS streams play in Chromium browsers via hls.js.",
  "force": false,
  "channel": "dev",
  "publishedAt": "2026-09-28T18:51:59+00:00",
  "releases": [
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+108 (2026-09-28)",
      "notes": "### Fixed\n\n- Updating no longer leaves every previous installer in the app cache. Old\n  update downloads are removed, including ones already stored from earlier\n  versions, so cache can shrink even when Downloads is empty.\n- A download that fails or is cancelled no longer leaves the video behind\n  after it disappears from Downloads.\n\n- Taps and toggles no longer feel dead while a source sync is running. Screen\n  updates could previously be held back for **seconds** at a time and then\n  arrive all at once, which made the app look like it was ignoring you even\n  though it was running normally.\n- Windows stays more responsive during large VOD catalog writes: soft background\n  source syncs and catalog SQLite work no longer run on top of a manual\n  Synchroniser, and status ticks rematerialize Sources less often while busy.\n- Scrolling and tapping the Sources list during a sync no longer randomly\n  dies: status ticks used to rematerialize every source row, which cancelled\n  in-flight gestures. Only the row whose status actually changed rebuilds now.\n- Alt-tabbing away mid-sync no longer bricks window focus. Spurious blur is\n  debounced instead of hard-ignored or force-reclaimed.\n\n- Syncing a source no longer makes the app queue clicks or refuse to come to\n  the front on Windows. The pauses that were meant to let the window stay\n  responsive were themselves the stall, and they made every sync take about\n  three times longer than the work needed.\n- A long catalog job no longer holds up unrelated parts of the app. Browsing,\n  counts, and search used to wait behind whatever maintenance pass was running,\n  which is why the interface answered but nothing actually moved.\n- A moment of contention while saving no longer risks parking the app for up to\n  half a minute; it now backs off and retries instead.\n- Discord Rich Presence no longer costs anything while you browse. Its\n  connection checked itself sixty times a second on the same thread that draws\n  the app, whether or not something was playing.\n\n- Syncing an Xtream source downloads the movie and series catalogs once\n  each. A repeat sync that has not changed still skips the rewrite.\n\n### Bug fixes\n\n- Web companion opens IPTV as HLS (`.m3u8`) instead of a raw MPEG-TS (`.ts`) download, so Chrome/Firefox can play live channels.\n\n### Fixes\n\n- Windows stays clickable and foregroundable while large catalog syncs run in\n  the background (status text used to keep updating while the window ignored\n  focus and clicks).\n- Window can always be brought to foreground and focused during active sync\n  operations, preventing OS foreground-lock deadlocks.\n- Cold start no longer runs the VOD category index 2\u20133 times back-to-back on\n  large libraries (that was the multi-second Home hitch after launch).\n- Live channel sync commits groups in a single batch pass, eliminating hundreds\n  of individual SQLite write transactions and frame-yield stalls.\n- Resolving anime / remote-catalog episodes no longer freezes the UI or spams\n  catalog JSON rewrites to disk \u2014 playable episodes are kept in memory without\n  mutating the main catalog list.\n- Episode cards now live-refresh smoothly and instantly as each episode resolves,\n  without triggering full-screen scaffold rebuilds or getting dropped by quiet mode.\n- Continue Watching and Recent Channels on Home now properly live-refresh when\n  watching items or reordering channels.\n- Sources screen updates channel and VOD counts immediately upon sync completion.",
      "versionCode": 108
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+107 (2026-09-25)",
      "notes": "### Fixes\n\n- Pausing playback pauses the next-episode countdown, so the next episode does not start on its own while the video is paused.\n\n- Google Drive on the web no longer fails to connect or sync with \u201cinit has already been called\u201d.\n\n### Improvements\n\n- The web companion lives at http://javp.tf (no HSTS) so HTTP streams can play in the browser.\n- `http://javp.tf/add?\u2026` is a first-class add-source link (same query as `https://javp.app/add`), not a media open.\n\n- On http://javp.tf, IPTV passwords and other secrets persist in localStorage. flutter_secure_storage_web cannot run outside a secure context (HTTPS / localhost).\n\n- On https://javp.tf, the web companion recommends http://javp.tf (mixed content / CORS). javp.app stays the native add-source link.\n\n### Bug fixes\n\n- Web companion demand-loads an IPTV live or VOD group when you open it, instead of painting an empty list and waiting on SQLite / a full dump.\n\n- Web companion no longer throws LiveChannelDb is unavailable on web when syncing Xtream live groups. Channels persist in the catalog / localStorage instead.",
      "versionCode": 107
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+106 (2026-09-23)",
      "notes": "### Fixes\n\n- Pull-to-refresh on a series reloads episode versions from the catalog, including links that were already resolved.",
      "versionCode": 106
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+105 (2026-09-23)",
      "notes": "### Fixes\n\n- Offline download now recognizes catalog HLS proxies (base64-wrapped `.m3u8` URLs) and packages the full episode instead of saving a tiny playlist file\n\n- Dragging the playhead on a movie or episode follows your finger, and playback jumps to that time when you let go.\n\n### Improvements\n\n- Play/pause control uses a slightly darker disc with no drop shadow",
      "versionCode": 105
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+104 (2026-09-22)",
      "notes": "### Features\n\n- Playing local disk files (Open with / Library picker) starts immediately\n  like a regular media player \u2014 without adding them to Library \u2014 and Next /\n  Previous steps through other media in the same folder.\n\n### Fixes\n\n- Removing or re-syncing a remote catalog clears stale local series shells and\n  expired stream links so Play and episode lists match the live catalog again\n\n- Finishing an episode with no scene after the credits marks it watched and offers the next episode, instead of leaving a percent on that episode.\n- The next-episode countdown is shorter and uses a smaller card so the picture stays visible behind it. With no credits marker, that card appears only in the last few seconds, in time to show it will autoplay.\n\n- Holding for temporary 2\u00d7 no longer cancels into volume or brightness when the finger moves slightly\n\n- Phone player side-strip volume now follows the device volume (0\u2013100%), not software gain relative to the current level\n- Phone brightness side-strip uses a smoother perceptual curve instead of jumping between dim and full bright",
      "versionCode": 104
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+103 (2026-09-22)",
      "notes": "### Fixes\n\n- After re-adding a custom catalog (new id, maybe a new name), v2 series that\n  still showed episode lists can resolve play URLs again instead of staying on\n  stubs from the old source id.\n\n- Refreshing a remote-catalog series page renews expired tokenized play links (magnets still kept)\n\n- Soft keyboard no longer covers Add / Edit source fields on the catalogs list.\n\n- Taps and settings toggles respond during a catalog sync. Progress animations\n  used to starve Flutter's idle queue, so clicks arrived but nothing reacted.\n- Discord Rich Presence no longer polls on the UI thread while you browse.\n- Catalog reads no longer wait behind a long SQLite maintenance pass. Sort-title\n  reindex runs on its own connection, and contended waits time out instead of\n  parking the app for up to half a minute.\n- Large catalog jobs no longer sleep a full frame between chunks, so a sync is\n  not several times slower than the work itself.\n- The Sources list stays scrollable while status updates; only the row that\n  changed rebuilds.\n- Windows no longer sweeps empty XInput slots dozens of times a second when no\n  controller is attached.\n\n- Watching a magnet no longer leaves a growing torrent cache on disk after you\n  stop \u2014 stream data under the temp folder is deleted when playback ends (and\n  orphans are cleared the next time the torrent engine starts).\n\n- Series episode lists no longer collapse to the one you just played after you leave and come back \u2014 opening a show keeps the full season, and playing an episode no longer dumps extra stream versions onto Home / Catalog.",
      "versionCode": 103
    },
    {
      "versionName": "0.6.0-dev",
      "title": "0.6.0-dev+102 (2026-09-08)",
      "notes": "### Fixes\n\n- Opening a downloaded series after a restart plays the files already on the\n  device instead of fetching episode versions from the catalog.\n\n- macOS: app no longer crashes at launch looking for `librqbit_engine` under the build machine's home directory; the torrent engine dylib now loads from the app bundle via `@rpath`.\n\n- Auto-download ahead and next/previous episode keep the same version kind you picked (for example VOSTFR) instead of falling back to the default edition\n\n- Web player uses the same gesture controls as the desktop/phone app, and clicks work again (HTML video no longer steals pointer events).\n- Live / HLS streams play in Chromium browsers via hls.js.",
      "versionCode": 102
    }
  ],
  "gitCommit": "4ccc0990e59c96bbbbaa2c88e8a03d711fd2510c",
  "apkSha256": "bd7a344f514be267a621d366744c2d2e671f12459c29ad895d7db56840ff02f4",
  "apks": {
    "arm64-v8a": {
      "url": "https://updater.javp.app/dev/javp-arm64-v8a-0.6.0-dev+108.apk",
      "sha256": "bd7a344f514be267a621d366744c2d2e671f12459c29ad895d7db56840ff02f4",
      "versionCode": "2108"
    }
  },
  "packages": {
    "windows-x64": {
      "url": "https://updater.javp.app/dev/javp-0.6.0-dev+108-windows-x64.zip",
      "sha256": "35f8a75775d88091fcde1f23de105ac8f50214d4c4336787b1db3d82d36b7245",
      "kind": "zip"
    },
    "windows-x64-setup": {
      "url": "https://updater.javp.app/dev/javp-0.6.0-dev+108-setup.exe",
      "sha256": "86af0c4081bd648649c7f2c7ed5625fc722562fa7074d139d83060f41af46e1d",
      "kind": "exe"
    },
    "linux-x64": {
      "url": "https://updater.javp.app/dev/javp-0.6.0-dev+108-linux-x64.zip",
      "sha256": "bfeb6d13b82500ec6c3c054f9ed79b9d4fbd8a4f34bd3738a808938eb606fd8b",
      "kind": "zip"
    }
  }
}
