Repository navigation
Releases: OnlyXianzo/Grablytic
Release list
Grablytic v0.0.6
What's Changed
- docs: publish AGENTS.md and reusable agent skills by @OnlyXianzo in #14
- Harden teardown network boundaries by @OnlyXianzo in #15
- fix: resolve the 61-finding nuclear code-quality review (engine, app, Android, CI) by @OnlyXianzo in #16
- docs: publish project vault and align typography by @OnlyXianzo in #17
- docs(readme) + fix: second-pass review findings, broad-catch ratchet by @OnlyXianzo in #18
- fix: cancelled batch items reach the engine, expired retries stop, schema v8 for existing installs by @OnlyXianzo in #19
- perf: close the third-pass residuals and its seven findings by @OnlyXianzo in #20
- Pass 4: the engine stops starting itself (#91–#98) by @OnlyXianzo in #21
- Skeleton loaders, pre-scaled logo assets, faster share start by @OnlyXianzo in #22
- ci: add CI Log Digest workflow (readable failure cause from the checks API) by @OnlyXianzo in #23
- ci(digest): '/ci-digest ' slash command for the log digest by @OnlyXianzo in #24
- ci(digest): self-diagnosing log fetch (and a push escape hatch) by @OnlyXianzo in #25
- ci(digest): strip ANSI, allow escape sequences, publish the tail by @OnlyXianzo in #26
- ci(digest): anchor the report on the step's own ##[error] marker by @OnlyXianzo in #27
- ci(digest): anchor the report on the step's own ##[error] marker by @OnlyXianzo in #28
- fix(engine): bound download file names in bytes (Errno 36 on long titles) by @OnlyXianzo in #30
- Polish Library and download history UI by @OnlyXianzo in #31
- Improve privacy-conscious crash and bug reporting by @OnlyXianzo in #32
- Capture crashes that were never opted into, and stop reporting from blocking shutdown by @OnlyXianzo in #35
- Close five scrubbing and logging gaps the last pass found by @OnlyXianzo in #36
- Reports: fix the $1 artefact, one version source, and stop dropping unsent crashes (v0.6.0) by @OnlyXianzo in #37
- release: v0.0.6 by @OnlyXianzo in #38
Full Changelog: v0.0.5...v0.0.6
Grablytic v0.0.5
Grablytic v0.0.5 (Build 5) — feature + polish release
Download & Format Picker, Clipboard & Link Saver, Library & Settings, native notifications, cookie auto-detect, Share playback, adaptive logo — 57 commits + orphan redesign/ui merge since v0.0.4. 238 files changed, 21499 insertions(+), 4285 deletions(-).
Full changelog below (also in docs/CHANGELOG.md).
v0.0.5 — 2026-10-11 (feature + polish release; 57 commits + orphan redesign merge since v0.0.4)
Diff vs v0.0.4: 238 files changed, 21499 insertions(+), 4285 deletions(-). Orphan redesign/ui (32a5947..351c8aa) merged via tree checkout + nightly fixup.
- Download & Format Picker (P4-3 / T01 / T03): description + thumbnail toggles
with session persistence, portrait-safe format ladder, batch quality picker,
file-naming hierarchy (predefined + custom name field) and custom-name download
path; opts row bound to active preset — fixes audio+opus preset showing
Video+4K (now correctly Audio+Opus). - Clipboard & Link Saver (T02 / T19):
Proceedreads clipboard + parser when
input empty, startup auto-check offers to import clipboard link, queuedView
batch fixed; dedicated Link Saver menu + FAB bottom-right on home with per-link
Delete/Download and Download All, persistent offline queue with one-tap batch
dispatch and auto-retry. - Library & Settings (T14 / T15): History three-dots menu (play / delete /
remove missing), Settings search bar with category list + sub-menus, grid-view
toggle honored everywhere, storage meter, file import / skip-existing. - Notifications: removed in-app white-stripe bottom notification, replaced with
native device notifications (showAppNotification/styledSnackBarwith
inverseSurface), split success/error native path andPOST_NOTIFICATIONS
gate, 7 migration batches. - Cookies (yt-dlp compat): hint expected format, auto-detect parser for
Netscape# Netscape HTTP Cookie File(7 tab fields) / JSON exports /
Cookie:header / Base64 wrappers (yt-dlp only reads Netscape), domain syntax
validation + relate-check (YouTube cluster), unrelated count, empty-value
preservation fix (351c8aa), WebView import with generated header. - Share Intent (T02 / T04): format menu via Share now includes playback
(lazy-load heavy preview until Play tap) + direct download, auto-start
queued/failed, FIFO share queue. - App logo theme (redesign/ui): adaptive light/dark logo (
adaptive_logo.dartlogo_variantprovider,BricolageGrotesque/Figtreeheadings), launcher
dynamic icons per theme (light/dark/monochrome/legacy, all densities) and
README adaptive<picture>logo.
- Perf & a11y: lazy preview, throttled progress, bounded queues,
history a11y semantics + 48dp touch target. - Quality:
flutter analyzezero warnings, 632 tests (was 631+1), DeepSource
Kotlin 11→0, Python 2/2, docs/link-check/secret-scan green;desktop_engine
null guard for_processrace.
Full automated listing (tree diff, grouped, newest last) —
v0.0.4..HEADvia
tool/generate_release_changelog.pymisses orphanredesign/uicommits (unrelated
history), so they are listed here manually from32a5947..351c8aa:
v0.0.5 — 2026-10-11 (57 commits since v0.0.4, incl. redesign/ui orphan)
Diff vs v0.0.4: 238 files changed, 21499 insertions(+), 4285 deletions(-).
Every change (grouped, newest last, manual from 32a5947..351c8aa + main)
Redesign / Picker / Clipboard / Queue (32a5947..351c8aa)
351c8aafix(cookie): preserve empty-valued JSON cookies (trim regression)ef4e801fix(kotlin): collapse duplicate catch, suppress KT-W1064fce131efix(kotlin): address remaining DeepSource KT-W1057/W100951fd47efix(kotlin): suppress DeepSource KT-R1006/W1042/W1009dc465cetest(flutter): add coverage for cookie imports, notifications, download flows, settings search, and history actions1cefbbddocs(dart): clarify cookie parsing, notification, and download flow behavior798e6adfix(home): use showAppNotification for offline queue67315fdfix(tests): repair widget & navigation test suites9a93badfix(analyze): zero flutter warnings3364666fix(ci): flutter analyze errors + DeepSource configf541e2aMerge branch 'flaws/notify-white-stripe-7' into redesign/uib733fc8fix(notify): migrate command/cookie-webview/settings/playlist/library/shell/live-log white-stripef78b57cMerge branch 'flaws/notify-white-stripe-6' into redesign/ui031469efix(notify): migrate profile/log/storage/about white-stripeb4577feMerge branch 'flaws/notify-white-stripe-5' into redesign/uif77b951fix(notify): migrate download_history/cookies/settings/offline-queue white-stripe39eb1ceMerge branch 'flaws/notify-white-stripe-4' into redesign/ui19f6a73fix(notify): finish share_overlay migration (auto-start queued/failed)96c3acdfix(notify): migrate share_overlay white-stripe SnackBars965e598Merge branch 'flaws/notify-white-stripe-3' into redesign/ui8271368fix(notify): migrate playlist/log white-stripe SnackBars to styled1469f03Merge branch 'flaws/notify-white-stripe-2' into redesign/ui85c7fcefix(notify): migrate format_picker SnackBars to styledSnackBar71a4fbeMerge branch 'flaws/history-a11y' into redesign/ui829d414fix(a11y): history three-dots menu semantics, Dismissible hint, 48dpf881461Merge branch 'flaws/share-lazy-preview' into redesign/uif86b6adperf(share-sheet): lazy-load heavy preview until Play tapf9164b3Merge branch 'flaws/cookie-domain-isolation' into redesign/ui9b46871fix(cookies): validate domain syntax and relate-check on pastea231823Merge branch 'flaws/notify-permission-split' into redesign/ui3d6f867fix(notify): split success/error native path and gate POST_NOTIFICATIONSd88c899Merge branch 'flaws/notify-white-stripe' into redesign/uide82ec8fix(notify): remove white-stripe SnackBars in home/link-saver/offline-bannerd8533d1feat(library+settings+cookies+share+notify): three-dots history, settings search, cookie auto-detect, native notifications, share playbackdac5940feat(clipboard+queue): clipboard proceed, startup offer, link saver FAB6266ad9feat(picker): add description/thumbnail opts, file-naming hierarchy502b495fix(home): bind opts row to active preset, show Audio+OPUS for audio presetsc6e7607docs(readme): update logo to adaptive light/dark variant9761834fix(launcher+ui): make app logo follow theme and settings85dac20docs(readme): add CodeRabbit PR reviews badge84b8e0crefactor(ui): replace hardcoded hexes with theme roles for dark-mode supportbad0851fix(ci): make Verification green on redesign/ui4cd06c6feat(ui): editorial hero, tonal nav pill, emblem logo, overflow polishff2926efeat(ui): picker header value-first hierarchy with sentence-case sectionsd11a06afeat(ui): ledger-first de-templating passe6c78aefeat(ui): nav pill cleanup and outlined icon setb5898eafeat(ui): home headline copy sharpened6717303fix(ui): library filter chips trailing room14608effeat(ui): home pill, opts affordance and empty-state refinementse5eccd1fix(ui): unmask aria2c package status to engine truth29ea731fix(ui): seg edge + picker loading never black (R4)407bdbdfeat(ui): shared seg tabs + picker chrome + menu cancel (R3)ffef52bfeat(ui): seg bar distinction + settings title weight (R2)e2cad59feat(ui): log overlay typography + download card .live (R1)3e22bcdfix(engine): warn when aria2c enabled but binary unusablec3383fefeat(ui): download hero + pill + opts + sections (P4-3)32a5947test(settings): add targeted structural widget test for AboutScreen (P4-5)
Main line since v0.0.4 (reachable from v0.0.4..HEAD)
d230347Merge redesign/ui + PR #13 (351c8aa) into main for v0.0.5b054b18fix(ci): base nightly gate on last built commit, not the frozen nightly taga6c2435fix(deepsource): drop invalid secrets/test-coverage analyzers, fix python runtime_versionc822087chore(deepsource): add detailed .deepsource.toml for Flutter+Python+Kotlin repo09b0f65fix(T19, T01, T02): unbreak widget tests after offline and cache changes3f17819fix(T14): update widget tests for settings folder hierarchy865778fstyle(T18): token-only design sweep (mono + onPrimary)4c02b6ffeat(T08): pre-download in-app preview with progressive streambf1556ffeat(T20): opt-in inexact offline queue remindersb54afe1feat(T19): persistent offline link saver with one-tap batch dispatch92e7116feat(T21): strictly local analytics dashboard1ae4095feat(T03): picker-integrated toggles with session persistence0daa232feat(T16): indicator driven by fractional PageController.pageb53a06cfeat(T07): persistent home thumbnails cached at job creation7ff3d6ffeat(T02): share auto-download mode with error notificationf88418atest(T06): lock source-URL persistence in comment/purl tags30003adfeat(T12): defer chunk rotation across active video sessionsf77e833feat(T04): standalone share format-picker overlayec39183feat(T11): 1 MB chunked log rotation, drop retention-dayseb01514feat(T10): default log export to Downloads via MediaStoreb7c4856fix(T13): logger view scrolls full viewport via collapsible cardf15a197feat(T01): fast-fetch pipeline with placeholder skeleton and extraction caching7202277feat(T05): context-menu Copy Link for active and completedce1cd9efix(T17): launcher-icon safe-zone, monochrome, uncropped logoeb3d044refactor(T15): permissions and appearance sub-menus05dc457fix(T09): resolve Android 14 background freeze and UI-isolate blockingf924045refactor(T14): settings root as category list with sub-menuseae1657feat(batch): retry-failed, file import, skip-existing, storage meter, auto-retry- `f...
Grablytic v0.0.4
Grablytic v0.0.4 (Build 4) — huge improvement release
Tap a finished download to play it, resume interrupted downloads, library grids, a log viewer that survives 5MB logs, hardened links/downloads/installer, and 118 commits of engine + Android hardening since v0.0.2.
Full changelog below (also in docs/CHANGELOG.md).
v0.0.4 — 2026-09-17 (118 commits since v0.0.2)
Diff vs v0.0.2: 152 files changed, 14221 insertions(+), 1494 deletions(-).
Lines of code by area (+added / -removed)
- Python engine: +6836 / -436
- Android native: +1413 / -374
- Flutter UI: +5081 / -565
- Packaging & install: +378 / -55
- CI & workflows: +368 / -21
- Docs & store: +49 / -34
- Other: +96 / -9
Every change (grouped, newest last)
Security & Trust Boundaries
3a1877f68sec(engine): confine clear_download_archive to data_dir [T0-1]def504b7dsec(install): fail closed when no checksum digest is published [T0-4]400251213sec(bootstrap): verify existing binaries against manifest before trusting [T0-5]0581fb4easec(format): allowlist explicit format IDs before selector interpolation [T0-3]5f0980a2asec(paths): confine IPC binary paths, kill PATH/sys.path injection [T0-2]3d5a2d9a4sec(potoken): honest JS trust boundary, no remote solver without runtime [T0-6]327ab328bfix(logging): close sanitize gaps — userinfo creds, cycles, map proxies [T3-15]bc4c8f0cafix(install): close shell injection via eval and python interpolationf17914cf8fix(engine-logs): sanitize request params and redact engine-origin entries6ec6e27b6fix(engine): gate SSRF targets and validate proxy at every sink7a0babc76fix(flutter): enforce trust boundary on engine paths, exports, and proxy9bf556258fix(resume): enforce trust boundary on resume candidate parsing and deletion23a0462cbfix(engine): sanitize yt-dlp option builder sinks and config schema2f230c988fix(core): add library directives to command_template and trust_boundaryb01cd426cfix(engine): close SSRF bypasses in url_guard non-decimal IP forms and DNS names8667ea679fix(ci): publish SHA256SUMS and prefer it in install.sh with API-digest fallback
Resume & Artifact Hygiene
987404fbafix(engine): strip only trailing .part when resolving resume .info.json [TEARDOWN-3]137675085feat: FTL Robo gate, resume strike loop, cosign releasesc0cd45f21fix(network): gate unattended auto-resume on Wi-Fi Only setting779c6e628fix(resume): harden resume discovery, strike tracking containment, and sidecar cleanupf1cb876d3fix(engine): default writeinfojson on so interrupted downloads leave a resume sidecar
Android Native & OS Integration
a5d0580b8feat(android): queue-active WakeLock + WifiLock for downloads [T2-1, needs SDK compile]af0c5d017feat(android): FIFO share queue replaces single-slot var [T2-6 native half, needs SDK compile]ee8d432f2fix(android): release event callbacks on terminal and replay missed terminals3a9b92da9fix(history): sweep all non-terminal statuses and page restore backlogccdb49b0bfix(android): make terminal delivery survive activity death5f381f82efix(android): sweep all active download states on boot with schema guardseae2aaec1fix(android): real worker channel, loud missing runtime, atomic extract1d1541a21fix(android): atomic package extraction, recovery, and two-tier CRC32 stamping2ead2e9aefix(android): periodic wakelock renewal and onTimeout SQLite sweepae3b88b19fix(android): decouple terminal event path and prevent destroyed activity leakc7d724625ci(nightly): generate detailed changelog with commit history and fix android compile references28461f7ddfix(android): cancel active downloads on foreground-service timeout949f40724fix(android): serialize Kotlin SQLite access with busy-timeout and retry
Core Engine & yt-dlp
1175d5571fix(downloader): register in _active_downloads before t.start() [T1-1]16fb0e222fix(downloader): close pump-queue cancel-loss window [T1-2]d735d7f40fix(downloader): add graceful shutdown handling and lazy cleanup thread [T1-6]42683fcdbfix(downloader): bind safe_url before try so early failures report real error [T1-9]de6817829test(ipc): lock in error-ID threading for unparseable input [T1-8]1ea67d16cfix(downloader): reject same-URL admission under a different ID [T1-5]9a904cbfafix(cancel): honest intermediate cancelling state + wedge watchdog [T1-3 engine half]fa5e98d24fix(downloader): cap YDLogger.errors tail at 200 [T3-9]6f4ab9a8bfix(opts): bound all numeric IPC params, reject zero throttle [T3-10]ad50d1eaafix(downloader): scan progress queue via public API only [T3-8]42d90f4c1fix(errors): precise classification + scrubbed messages [T3-14 engine half]0ed1823e6fix(downloader): classify single-item logger errors, not blanket POSTPROCESS [AARAV-1]3a3ff0480feat(dart): FIFO share queue drains cold starts, chains sheets [T2-6 dart half]b804052e6fix(engine): guard sleep_interval with _clamped_int [TEARDOWN-4]a36c23f25fix(download): collapse setMaxConcurrent/syncConcurrency duplicate [TEARDOWN-5]a2e6c0883fix: close BRUTAL-1/2a/2b/2c/5/6 backlog items (engine + IPC)cdd9ad4c6perf(engine): throttle progress at source, bound queues, batch file writesb61f3d20ffix(engine): resolve desktop search/query TypeError by binding search_query157d649d6fix(engine): bound progress queues and harden poll loop against silent drops56002ec1cfix(engine): make queued promotion pollable and slot close idempotente3f5ec07dfix(flutter): dispose every engine transport and forward bridge errorsf6cd2fe68fix(settings): manage aria2c speed controller lifecycle in Statef6cccb147fix(flutter): absorb stream errors in log ingester and detect transport death in desktop engine1fabe9dc2fix(engine): unify IPC envelope contracts for queue_status and forward nodejs_pathb58fbdff1fix(engine): enforce admission queue depth limit and input bounds7b421fc50fix(engine): resolve concurrency slot leaks, queue stalls, and dropped cancel eventsea0391b89fix(engine): configure JS runtime, extractor args, and cancel error guard68a68a208test(engine): remove unused local variables and imports to satisfy ruff correctness gate9e31ef26efix(engine): write partial downloads directly to output dir and serialize ffmpeg6d458486bfix(backlog): remaining log issues 3-8 — concurrency guard, player, links, storage, onboarding, grids8ade7996dfix(engine): thread desktop IPC dispatch so slow extractions stop blocking cancelc55f8e337fix(engine): gate PO-token spawn behind solver flag, stop per-download phantom deno evalf5c848eabfix(engine): bound the FFmpeg serialization gate with a 600s timeout
UI & Client State
df178bc8fdocs(readme): real device screenshots gallery (11 captures, corrected names)2feacf55afix(app): gallery visibility, thumbnail toggle, GitHub open, onboarding reform, list jank73e437830chore(flathub): 0.0.2 release entry + screenshots in metainfob500b5500fix(flutter): bound log pipeline costs and coalesce live rebuilds5863761a9fix(logs): cap log viewer at file tail so multi-MB logs cannot hang the phone
CI/CD, Build & Install
ccba7992efix(ci): move WINGET_TOKEN gate from job-if (secrets context rejected by parser) to env-backed stepa237cb28dfeat(ci): one-shot first WinGet submission workflow (fork + PR from verified manifests)e25009825fix(ci): quote wingetcreate run line (colon broke YAML parse)ed1415370feat(linux): universal install.sh (distro+arch auto-detect, SHA256 verify) + README one-liner932737a05chore(release): bump to 0.0.2+3 for first Grablytic release92b884e83fix(build): quote deb control heredoc, drop comment lines770fd444ffeat(winget): 0.0.2 Grablytic manifests + first-submit plumbingdbfab7e13ci: nightly build + rolling release, all-branch verify, ruff-action [T4-5]5fd9e182eci(build): gate all build jobs on reusable verify workflow [TEARDOWN-6]b2e1fa217ci(verify): pin ruff-action to immutable SHA [CI-FIX]49820b2f9ci(nightly): add emulator Doze + install smoke job2b1f198e1perf(ui): structural selectors make progress ticks rebuild one card166948ccfdocs(nightly): add user-facing benefits and feature overview to nightly notes generatorcdbad3153ci(nightly): remove emulator doze and ftl jobs to guarantee reliable release publishing6a8aa3bb9ci(nightly): temporarily comment out emulator doze and ftl robo jobs
Performance & Resources
11515060cperf(logs): keep DEBUG off the UI bridge to fix 10+ download hang5e1e82c5aperf(lowend): halve fragment threads, indeterminate merge bar, fix search runtime155056594chore: remove perf proof docs from repo (kept in local worklog)
General Improvements
e3fa20991fix(ci): run token check under bash on windows runner9f2d8d909fix(ci): wait for fork propagation before cloningd5031a5fedocs(readme): one-command Linux install block (apt/dnf/zypper/pacman/yay/paru)2c266d5dbdocs(security): v0.0.1 full-matrix VirusTotal scan record (15/15 clean)922d9c09crefactor: rename TrueStream to Grablytic71fb9ed6dfix(install): quote usage heredoc delimiter to prevent command substitution490340792feat(brand): swap in new Grablytic play-mark artwork64718e50dfix(contact): point in-app feedback email to xianzo.help@gmail.com8419a704fdocs(readme): roll install links to v0.0.2 grablytic-* assets9e750abefchore(distrib): roll AUR/Flathub/Izzy manifests to v0.0.2bdf50b59afix(main): add stdout lock to prevent interleaved JSON lines [T1-7]3e4adee24feat(dart): honest cancelling status across provider and home card [T1-3 dart half]cde767a1afix(scheduler): gate RSS XML against entity expansion + ov...
Grablytic v0.0.2
What's Changed
- fix(distribution): correct license to GPL-3.0, dangling refs, AUR deps by @OnlyXianzo in #1
New Contributors
- @OnlyXianzo made their first contribution in #1
Full Changelog: v0.0.1...v0.0.2
Grablytic Nightly 20261023 (d89db3e)
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
TrueStream v0.0.1 Beta (Build 2)
TrueStream v0.0.1 Beta (Pre-Release Build 2)
⚠️ BETA PRE-RELEASE NOTICE: This is the early preview release of TrueStream (v0.0.1 Beta, Build 2). Tested and validated across Android hardware tiers from modern 64-bit flagship phones down to low-end 32-bit budget devices (e.g. Samsung Galaxy A04e), Chromebooks, and Linux desktops with preinstalled standalone binaries.
🏷️ Complete Device & Hardware APK Matrix
To ensure maximum performance and minimal download sizes across the entire Android ecosystem, TrueStream provides dedicated per-architecture splits as well as a universal fallback:
| APK Asset | Architecture | JS Runtime | Target Hardware Tier |
|---|---|---|---|
truestream-v0.0.1-arm64-deno.apk |
ARM64-v8a | Deno | Recommended Default: Flagships, modern 64-bit Android phones (Snapdragon, Tensor, Dimensity). Uses upstream yt-dlp's primary modern JS runtime. |
truestream-v0.0.1-arm64-node.apk |
ARM64-v8a | Node.js | Optimized Download: Modern 64-bit phones, ~40 MB smaller download footprint. |
truestream-v0.0.1-armv7-node.apk |
ARMeabi-v7a | Node.js | Budget & Low-End Devices: Tested for 32-bit ARM phones (e.g. Samsung Galaxy A04e, Redmi A-series, older budget tablets) with optimized RAM and storage footprint. |
truestream-v0.0.1-x86_64-deno.apk |
x86_64 | Deno | Emulators & Chromebooks: 64-bit Intel/AMD Android emulators and ChromeOS devices with Deno runtime. |
truestream-v0.0.1-x86_64-node.apk |
x86_64 | Node.js | Emulators & Chromebooks (Smaller): 64-bit x86 with lightweight Node.js runtime. |
truestream-v0.0.1-universal.apk |
Universal | Both (Deno + Node) | All-in-One Fallback: Contains all 3 ABIs (arm64-v8a, armeabi-v7a, x86_64) and both JS engines for 100% hardware compatibility. |
Desktop Release Assets (Preinstalled Binaries)
Linux releases include a self-contained, preinstalled Python engine and FFmpeg integration with zero setup required:
| Platform | Filename | Distribution Format |
|---|---|---|
| Linux (Debian / Ubuntu) | truestream_0.0.1_amd64.deb / truestream_0.0.1_arm64.deb |
Native .deb package |
| Linux (Fedora / RHEL / openSUSE) | truestream-0.0.1-1.x86_64.rpm / truestream-0.0.1-1.aarch64.rpm |
Native .rpm package |
| Linux (Arch Linux) | truestream-0.0.1-1-x86_64.pkg.tar.zst / truestream-0.0.1-1-aarch64.pkg.tar.zst |
Native pacman package |
| Linux (Portable Standalone) | truestream-0.0.1-linux-x64.tar.gz / truestream-0.0.1-linux-arm64.tar.gz |
Portable bundle with bundled engine |
| Windows (x64) | truestream-windows-x64.zip |
64-bit portable archive with engine |
📝 Full Changelog
🎵 Audio & Stream Extraction Pipeline
- Audio-Only Single Selection & Container Extraction:
- Direct single-selection audio mode in format picker with proper container mappings (
mp3,m4a,opus,flac,wav). - Container-aware post-processing using
FFmpegExtractAudiowithout unnecessary video muxing overhead.
- Direct single-selection audio mode in format picker with proper container mappings (
- SoundCloud Track & Playlist Support:
- Fixed audio-only stream resolution calculation on SoundCloud.
- Automatic metadata tagging (
FFmpegMetadata) and high-resolution album art embedding (EmbedThumbnail).
- Granular Format Picker Screen:
- Interactive stream inspector showing duration, channel info, stream count, and network thumbnails.
- Quality selector chips for video streams (4K, 1080p, 720p, etc.) and audio formats.
- Resilient Multi-Threaded Queue & Resume Engine:
- FIFO download queue with thread concurrency clamping (1–5 concurrent slots, default 2).
- SQLite database backing (
sqflite) for seamless resumption across process death, task termination, or device reboots. - Real-time download metrics: EMA smoothed speed sparkline, ETA calculation, and bytes received.
📱 Android Platform & UI Polish
- Full Hardware Tier Matrix:
- Dedicated builds for ARM64, ARMeabi-v7a (tested for low-end hardware like Samsung Galaxy A04e), and x86_64.
- Adaptive Icon Safe-Zone Alignment:
- Rebuilt Android launcher icons across all 5 density buckets (
mdpi,hdpi,xhdpi,xxhdpi,xxxhdpi) from the master square brand asset. - Extended seamless terracotta paper background across the entire 108dp canvas, eliminating double-border squircle clipping on Samsung One UI, Xiaomi, and Nova launchers.
- Centered emblem and wordmark within the 66dp circular safe zone with zero corner clipping.
- Rebuilt Android launcher icons across all 5 density buckets (
- First-Run Onboarding & Permissions Beat:
- Dedicated permissions onboarding step explaining notification and storage permissions with clear accept/reject options before app entry.
- System Keep-Alive & Notifications:
- Android battery optimization exemption flow to prevent system kills during long background downloads.
- Rich foreground service notifications displaying title, progress bar, speed, and ETA.
- Share Intent integration for sharing URLs directly into TrueStream from YouTube, TikTok, Instagram, Twitter/X, and SoundCloud.
🔍 Search, Playlists & Browsing
- In-App Search:
- Integrated search engine across YouTube and SoundCloud with instant metadata preview and one-tap download.
- Playlist Selection Screen:
- Full playlist entry parser with item checkboxes, selection inversion, range toggles, and unavailable item detection.
- Thumbnail Management:
- Embedded thumbnails inside media files plus optional local PNG sidecars for offline library browsing.
📦 Packaging & Updates
- Obtainium Support:
- Integrated Obtainium one-click add button and deep-link redirection with per-variant regex pinning (
arm64-deno,arm64-node,armv7-node,x86_64-deno,x86_64-node,universal).
- Integrated Obtainium one-click add button and deep-link redirection with per-variant regex pinning (
- Copyright & DMCA Safe Harbor Notice:
- Created root
DMCA.mdnotice establishing good-faith safe harbor compliance and takedown communication channel (xianzo.help@gmail.com).
- Created root
🛠️ Verification & Test Suite Proof
- Python Engine Tests:
320/320 passed (100%) - Flutter Widget & Unit Tests:
271/271 passed (100%) - Flutter Static Analysis:
0 issues found (clean) - Launcher Icon Integrity:
8/8 passed (100%)
📲 Installation Guide
- Choose the APK for your hardware:
- Modern 64-bit phones:
truestream-v0.0.1-arm64-deno.apk - Budget / Low-end 32-bit phones (e.g. Galaxy A04e):
truestream-v0.0.1-armv7-node.apk - Chromebooks & Emulators:
truestream-v0.0.1-x86_64-deno.apk - Any device:
truestream-v0.0.1-universal.apk
- Modern 64-bit phones:
- Requires Android 8.0 (API 24) or higher.
- Allow installation from unknown sources if prompted.