Repository navigation
Grablytic Nightly 20261023 (d89db3e)
Pre-release
Pre-release
Grablytic Nightly Build — 20261023 (d89db3e)
Rolling Pre-Release: Built automatically from
mainbranch with cutting-edge engine features, native platform hardening, and regression fixes.
✨ What's New & User Benefits
- 🏎️ Unstoppable Download Queues: Cancelling active downloads or changing maximum concurrent downloads in Settings no longer stalls the download queue. Remaining items start immediately without hanging.
- 🔄 Smart Incomplete Download Resume: If a download was interrupted, Grablytic now searches both your internal cache and your custom download folder. You can resume
.partfiles right where you left off without wasting bandwidth. - 🧹 Automatic Storage Hygiene: Deleting a media download from your library now cleans up orphan thumbnail sidecars (
.jpg,.webp), saving device storage while keeping shared artwork intact. - 📱 Rock-Solid Background Downloads on Android: Upgraded WakeLock and WifiLock management ensures your downloads keep running in the background when the screen turns off or while switching apps.
- ⚡ Faster Playlist & Media Extraction: Standardized Node/QuickJS runtime execution solves YouTube signature challenges and protects against UI freezing on large playlists (up to 500 items).
- 🛡️ Hardened System Security: Replaced prefix string matching with strict path containment (
commonpath) to guarantee downloads and cleanup operations stay strictly within designated folders.
🌟 Deep Technical Highlights & Architectural Upgrades
1. Engine Concurrency, Deadlock & Slot Lifecycle Hardening
- Guaranteed Slot Reclamation: Resolved edge-case slot leakage during early download cancellation before thread creation or after worker termination.
- Dynamic Pool Pumping: Synchronized queue pumps upon runtime
max_concurrentcapacity expansion to eliminate queue starvation and stalls. - Honest Terminal State Delivery: Preserved generation identity (
slot_token) to ensure all cancellation and error events reach the IPC bridge without being dropped.
2. Extractor JS Runtime, PO Token & Playlist Parity
- JS Runtime Standardization: Wired bundled Node/QuickJS runtime execution paths and remote component solvers identically across single video, format inspection, and playlist extraction.
- Bounded Generator Iteration: Protected memory and IPC envelopes by bounding flat playlist extraction to 500 items maximum with 4-tier thumbnail fallback.
- Async Safety: Guarded all Dart/Flutter asynchronous cancellation calls with
.catchError()to prevent unhandled future rejection crashes.
3. Comprehensive Incomplete Download Resume & Sidecar Hygiene
- Multi-Root Resume Discovery: Extended incomplete
.partfile scanning to inspect both internal cache and user-configured public download directories with candidate deduplication. - Private Strike Store: Anchored strike and retry count records to app-private
data_dirstorage, preventing metadata clutter in public folders. - Split-Stream Sibling Discovery: Added split-format
.f<id>suffix stripping when resolving paired.info.jsonmetadata sidecars. - Defensive Sidecar Cleanup: Enforced 7-point safety gate in
deleteFileAndHistoryto purge orphaned thumbnail sidecars (.jpg,.png,.webp) while safeguarding shared media assets.
4. Android Native Platform & Process Decoupling
- Activity Recreation Resilience: Decoupled terminal download events so completed/failed notifications survive Android Activity disposal and configuration changes.
- Periodic WakeLock & WifiLock Renewal: Implemented automated power lock renewal with
onTimeoutcleanup sweep into SQLite database. - Atomic Package Extraction: Implemented staging swap
.tmpwith two-tier CRC32 checksum verification for native binaries (ffmpeg,deno,node).
🧪 Empirical Verification Proof
| Verification Suite | Target | Result | Status |
|---|---|---|---|
| Python Engine Tests | engine/tests (pytest 9.1+) |
515 / 515 passed (100%) | Passing |
| Flutter Static Analysis | lib/ & test/ (dart analyze) |
0 issues found (100% clean) | Passing |
| Flutter Test Suite | Unit & Widget Tests | 362 / 362 passed (100%) | Passing |
| Android Doze & Standby | API 34 Emulator / dumpsys |
Verified W^X and Power Survival | Passing |
📋 Categorized Improvements
Android Native & OS Integration
573dc06fix(android): file sharing stays in the download folder; the boot receiver's guard is the framework's (SEC-004, SEC-005) (#46)19f7981fix(android): the tier-1 feed fetch validates where it connects (SEC-002)66f21caci: retrigger Android lint after a runner failure with no lint report
UI & Client State Management
642cd74fix(flutter): pass the dialog state through the builder that owns the actions1626b78fix(flutter): dispose the dialog controllers70824a8docs(building): describe the Linux CI job by what it installs and asserts
CI/CD, Build Systems & Automation
0d5c894ci: drop the temporary annotation wrappersd8e739fstyle: format code with Google Java Format, Ktlint and Ruff Formatter19204f9ci(workflows): pin every action, state every token scope, keep values out of the shellc2ecafcstyle: format code with Google Java Format, Ktlint and Ruff Formatter15df128style: format code with Google Java Format, Ktlint and Ruff Formatteraec8a92docs: resync the CI table, the IPC table and the feature numbersf17a56fstyle: format code with Google Java Format, Ktlint and Ruff Formatter59c3044chore(ci): fix the probe's own import checkab50f26chore(ci): temporary probe for the tool-test step
General Improvements & Refactoring
d89db3echore(skills): move the pack to .agents/skills, add four skills (#48)54cd388fix(reporting): a path with a space no longer publishes its tail (SEC-006) (#47)1e4b79dfix: SEC-003 bounds the feed, SEC-001 stops cookies and paths reaching public issues (#45)8903d59Merge pull request #44 from OnlyXianzo/arena/951cf094-grablyticc8298e5Revert "TEMP: surface analyze and test failures as annotations (reverted after reading)"62faa1bTEMP: surface analyze and test failures as annotations (reverted after reading)6db0b70Merge pull request #43 from OnlyXianzo/arena/223622b6-grablyticb858b2ffix(tooling): read every Markdown link form, and read destinations properlya366481fix(tooling): count broad catches by construct, not by variable name412c6abMerge pull request #42 from OnlyXianzo/arena/a37f18d5-grablytic1606a62fix(tooling): close #116, #117 and #118 from the pass-9 review3cefbf1Merge pull request #41 from OnlyXianzo/arena/e883af82-grablytic941686ddocs(security): one reporting channel, and check links in root files35d9bf3fix(tool): an unreadable exemption file reports instead of raisingc97f011fix(tooling): close #110-#115, the residue around the two guardsceb11a2fix(tool): the gate tests importtool.*, which a barepytestcannot resolve75e9bfffix(tooling): make both guards match what they claim to check31519e3docs: correct two counts and a command line (#40)58db839docs: bring the whole doc set back in line with the code (#39)8956cc3Delete RENAME_IMPACT_TrueStream_to_Grablytic.md
📜 Full Git Commit Log
Total commits since v0.0.6: 35
Click to expand full commit history
| Commit | Author | Description |
|---|---|---|
d89db3e |
Only_Xianzo | chore(skills): move the pack to .agents/skills, add four skills (#48) |
54cd388 |
Only_Xianzo | fix(reporting): a path with a space no longer publishes its tail (SEC-006) (#47) |
573dc06 |
Only_Xianzo | fix(android): file sharing stays in the download folder; the boot receiver's guard is the framework's (SEC-004, SEC-005) (#46) |
1e4b79d |
Only_Xianzo | fix: SEC-003 bounds the feed, SEC-001 stops cookies and paths reaching public issues (#45) |
8903d59 |
Only_Xianzo | Merge pull request #44 from OnlyXianzo/arena/951cf094-grablytic |
0d5c894 |
OnlyXianzo | ci: drop the temporary annotation wrappers |
c8298e5 |
OnlyXianzo | Revert "TEMP: surface analyze and test failures as annotations (reverted after reading)" |
642cd74 |
OnlyXianzo | fix(flutter): pass the dialog state through the builder that owns the actions |
62faa1b |
OnlyXianzo | TEMP: surface analyze and test failures as annotations (reverted after reading) |
19f7981 |
OnlyXianzo | fix(android): the tier-1 feed fetch validates where it connects (SEC-002) |
6db0b70 |
Only_Xianzo | Merge pull request #43 from OnlyXianzo/arena/223622b6-grablytic |
d8e739f |
deepsource-autofix[bot] | style: format code with Google Java Format, Ktlint and Ruff Formatter |
1626b78 |
OnlyXianzo | fix(flutter): dispose the dialog controllers |
b858b2f |
OnlyXianzo | fix(tooling): read every Markdown link form, and read destinations properly |
a366481 |
OnlyXianzo | fix(tooling): count broad catches by construct, not by variable name |
19204f9 |
OnlyXianzo | ci(workflows): pin every action, state every token scope, keep values out of the shell |
412c6ab |
Only_Xianzo | Merge pull request #42 from OnlyXianzo/arena/a37f18d5-grablytic |
c2ecafc |
deepsource-autofix[bot] | style: format code with Google Java Format, Ktlint and Ruff Formatter |
1606a62 |
OnlyXianzo | fix(tooling): close #116, #117 and #118 from the pass-9 review |
3cefbf1 |
Only_Xianzo | Merge pull request #41 from OnlyXianzo/arena/e883af82-grablytic |
66f21ca |
OnlyXianzo | ci: retrigger Android lint after a runner failure with no lint report |
15df128 |
deepsource-autofix[bot] | style: format code with Google Java Format, Ktlint and Ruff Formatter |
941686d |
OnlyXianzo | docs(security): one reporting channel, and check links in root files |
aec8a92 |
OnlyXianzo | docs: resync the CI table, the IPC table and the feature numbers |
70824a8 |
OnlyXianzo | docs(building): describe the Linux CI job by what it installs and asserts |
f17a56f |
deepsource-autofix[bot] | style: format code with Google Java Format, Ktlint and Ruff Formatter |
35d9bf3 |
OnlyXianzo | fix(tool): an unreadable exemption file reports instead of raising |
c97f011 |
OnlyXianzo | fix(tooling): close #110-#115, the residue around the two guards |
ceb11a2 |
OnlyXianzo | fix(tool): the gate tests import tool.*, which a bare pytest cannot resolve |
59c3044 |
OnlyXianzo | chore(ci): fix the probe's own import check |
ab50f26 |
OnlyXianzo | chore(ci): temporary probe for the tool-test step |
75e9bff |
OnlyXianzo | fix(tooling): make both guards match what they claim to check |
31519e3 |
Only_Xianzo | docs: correct two counts and a command line (#40) |
58db839 |
Only_Xianzo | docs: bring the whole doc set back in line with the code (#39) |
8956cc3 |
Only_Xianzo | Delete RENAME_IMPACT_TrueStream_to_Grablytic.md |
📦 Installation & Verification Assets
Android (.apk)
- arm64-v8a: Modern Android smartphones & tablets (Recommended for most users)
- armeabi-v7a: Older 32-bit Android devices
- x86_64: Android emulators, ChromeOS, and x86 devices
- Universal: All-architecture bundle
Desktop Packages
- Linux:
.deb(Debian/Ubuntu),.rpm(Fedora/RHEL),.pkg.tar.zst(Arch),.tar.gz(Portable) - Windows:
.zip(Portable x64)
Note on Nightly Builds: Nightly releases contain the most recent updates directly from the development tree. For production stability, please use official tagged releases.