Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
78273ea
Add manual-dispatch Release workflow + docs
corecompiled May 19, 2026
d3c8a5c
Fix YouTube 403 + ship silent engine updates
corecompiled May 23, 2026
f861f3a
Wire release-signed Android APKs into release.yml
corecompiled May 26, 2026
e609f24
Rename release assets so APKs sort before the .exe
corecompiled May 26, 2026
970a962
Default release body template when notes input is empty
corecompiled May 26, 2026
03082d7
Port Android YouTube hardening to Windows CLI
corecompiled May 26, 2026
3eaabb7
Exclude YouTube session cookies from Android backup
corecompiled Aug 2, 2026
d41b074
Scope ViewModels correctly and handle back from Settings
corecompiled Aug 2, 2026
c6350b8
Move Android dependency versions into a version catalog
corecompiled Aug 2, 2026
d1d6807
Move to AGP 8.13.2, Gradle 8.13, Kotlin 2.2.20
corecompiled Aug 2, 2026
271918e
Bump AndroidX, Compose, Coil, OkHttp and coroutines
corecompiled Aug 3, 2026
2b4771f
Give the app a DayNight window theme and a real splash screen
corecompiled Aug 3, 2026
ba6c0b8
Put every screen behind one Material 3 Scaffold
corecompiled Aug 3, 2026
d4d2d05
Target Android 16 (API 36) with edge-to-edge and predictive back
corecompiled Aug 3, 2026
0a72a2f
Add repo-wide MSBuild props and central package versions
corecompiled Aug 3, 2026
dc51fa5
Watch NuGet, Gradle and Actions dependencies with Dependabot
corecompiled Aug 3, 2026
d9b4ff7
Reorder Dependabot groups so the Compose group is reachable
corecompiled Aug 3, 2026
6accea4
Update agent notes for the 2026 toolchain
corecompiled Aug 3, 2026
3319055
Make "Re-run initial setup" actually re-run setup
corecompiled Aug 3, 2026
655f09e
Inset the YouTube sign-in screen under the system bars
corecompiled Aug 3, 2026
eaa200f
Pair the API 26-28 theme parent with its day-mode window background
corecompiled Aug 3, 2026
5cff5f8
Stop the download service when Android 15 times out the dataSync FGS
corecompiled Aug 3, 2026
d490d84
Correct the predictive-back claim and tidy imports
corecompiled Aug 3, 2026
fb94886
Record the hardware verification run for the modernization branch
corecompiled Aug 3, 2026
c7ccdf7
Give the YouTube sign-in screen legible system bar icons
corecompiled Aug 3, 2026
69fedf8
Bump CliWrap to 3.10.4
corecompiled Aug 3, 2026
3d165e6
Rewrite the home screen empty state and move its copy to resources
corecompiled Aug 3, 2026
f526d1b
Give API 26-28 a night theme parent of its own
corecompiled Aug 3, 2026
2f687e9
Show real download progress in the notification
corecompiled Aug 3, 2026
78a2478
Stop a near-complete download from starting over
corecompiled Aug 3, 2026
0799176
Trim and centre the empty-state banner
corecompiled Aug 3, 2026
df54567
Mirror the download queue to disk so it survives process death
corecompiled Aug 3, 2026
7a74030
Stop the swipe reveal showing as red corners on every card
corecompiled Aug 3, 2026
6768cdf
Add a System/Light/Dark theme toggle
corecompiled Aug 3, 2026
8860372
Read the About version from BuildConfig and bump to 1.1.0
corecompiled Aug 3, 2026
a6ac151
Replace raw tool output in error cards with plain messages
corecompiled Aug 3, 2026
951a261
Harden the generic path and refresh the wake lock
corecompiled Aug 3, 2026
c6be0a2
Move the queue's foreground service to WorkManager
corecompiled Aug 3, 2026
0814ab6
Record the WorkManager migration and its measured limits
corecompiled Aug 4, 2026
630203c
Ask for the expedited scheduling the worker's comment claimed
corecompiled Aug 4, 2026
60e2bc3
Pump the queue before retrying a failed foreground start
corecompiled Aug 4, 2026
43c63af
Let a paused download stay paused across process death
corecompiled Aug 4, 2026
5b9ab5c
Correct the README where it describes a version of the app that no lo…
corecompiled Aug 4, 2026
e904cc7
Document the CLI's YouTube hardening services in the layout tree
corecompiled Aug 9, 2026
ab7ee17
deps: bump gradle-wrapper from 8.13 to 9.7.1 in /android
dependabot[bot] Aug 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 48 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
version: 2

updates:
# .NET CLI — versions live in /Directory.Packages.props
- package-ecosystem: "nuget"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "deps"

# Android — versions live in /android/gradle/libs.versions.toml
- package-ecosystem: "gradle"
directory: "/android"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 5
commit-message:
prefix: "deps"
# Dependabot assigns a dependency to the FIRST group whose pattern matches,
# not to every group it matches. `compose` must therefore come before
# `androidx` — the other way round, "androidx.*" swallows every Compose
# artifact and the compose group never receives a member.
groups:
compose:
patterns:
- "androidx.compose*"
androidx:
patterns:
- "androidx.*"
ignore:
# Upgrading the download engine changes download behaviour, not build
# plumbing. It needs the manual URL matrix in PRIVATE_NOTES.local.md,
# so it does not belong in an automated PR.
- dependency-name: "io.github.junkfood02.youtubedl-android:*"

# Workflow actions in .github/workflows/
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "weekly"
day: "monday"
open-pull-requests-limit: 3
commit-message:
prefix: "ci"
165 changes: 165 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
name: Release

on:
workflow_dispatch:
inputs:
tag:
description: 'Release tag (e.g. v0.1.0). Tag will be created on the commit that runs the workflow.'
required: true
type: string
prerelease:
description: 'Mark as pre-release?'
required: false
type: boolean
default: false
notes:
description: 'Optional release notes (Markdown). Leave blank to auto-generate from commits.'
required: false
type: string

concurrency:
group: release-${{ inputs.tag }}
cancel-in-progress: false

jobs:
build-win:
name: Build snaglite.exe
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: '10.0.x'

- name: Restore
run: dotnet restore src/SnagLite/SnagLite.csproj

- name: Publish
run: dotnet publish src/SnagLite/SnagLite.csproj -c Release -r win-x64 --self-contained -o publish --no-restore

- name: Upload snaglite.exe
uses: actions/upload-artifact@v4
with:
name: win-x64
path: publish/snaglite.exe
if-no-files-found: error

build-android:
name: Build Android release APKs
runs-on: ubuntu-latest
defaults:
run:
working-directory: android
steps:
- name: Checkout
uses: actions/checkout@v4

- name: Set up JDK 17
uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'

- name: Set up Android SDK
uses: android-actions/setup-android@v3

- name: Make gradlew executable
run: chmod +x gradlew

- name: Cache Gradle
uses: actions/cache@v4
with:
path: |
~/.gradle/caches
~/.gradle/wrapper
key: ${{ runner.os }}-gradle-${{ hashFiles('android/**/*.gradle*', 'android/gradle/wrapper/gradle-wrapper.properties') }}
restore-keys: |
${{ runner.os }}-gradle-

- name: Decode release keystore
env:
KS_B64: ${{ secrets.SNAGLITE_KEYSTORE_B64 }}
run: |
set -euo pipefail
if [ -z "${KS_B64:-}" ]; then
echo "::error::SNAGLITE_KEYSTORE_B64 secret is empty; cannot build release-signed APKs."
exit 1
fi
echo "$KS_B64" | base64 -d > "$RUNNER_TEMP/snaglite-release.jks"
echo "SNAGLITE_KEYSTORE_PATH=$RUNNER_TEMP/snaglite-release.jks" >> "$GITHUB_ENV"

- name: Build release APKs
env:
SNAGLITE_KEYSTORE_PASS: ${{ secrets.SNAGLITE_KEYSTORE_PASS }}
SNAGLITE_KEY_ALIAS: ${{ secrets.SNAGLITE_KEY_ALIAS }}
SNAGLITE_KEY_PASS: ${{ secrets.SNAGLITE_KEY_PASS }}
run: ./gradlew :app:assembleRelease --no-daemon --stacktrace

- name: Upload release APKs
uses: actions/upload-artifact@v4
with:
name: android-release
path: android/app/build/outputs/apk/release/*.apk
if-no-files-found: error

publish:
name: Create GitHub Release
needs: [build-win, build-android]
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Download build artifacts
uses: actions/download-artifact@v4
with:
path: dist

- name: Stage release assets with version tag in filename
run: |
set -euo pipefail
mkdir -p release
cp "dist/win-x64/snaglite.exe" "release/snaglite-${{ inputs.tag }}-windows-x64.exe"
for f in dist/android-release/*.apk; do
base=$(basename "$f" .apk)
cp "$f" "release/snaglite-${{ inputs.tag }}-android-${base#app-}.apk"
done
ls -lh release/

- name: Build release body
env:
NOTES: ${{ inputs.notes }}
run: |
set -euo pipefail
if [ -n "${NOTES:-}" ]; then
printf '%s\n' "$NOTES" > release/BODY.md
else
cat > release/BODY.md <<'EOF'
Tiny video downloader. Paste a URL, get the file — highest available quality, no setup.

## What's in this release

- Android APKs (release-signed) — `arm64-v8a`, `armeabi-v7a`, `x86_64`, and universal variants.
- `snaglite.exe` — single-file Windows CLI (.NET 10 self-contained, ~42 MB).

## Quick start

- **Android**: sideload the APK matching your CPU. First launch bootstraps `yt-dlp` + `ffmpeg` + `aria2c` automatically.
- **Windows**: drop the exe on your `PATH`, then `snaglite <url>`.

Full docs: [README](https://github.com/corecompiled/SnagLite#readme).
EOF
fi

- name: Create GitHub Release
uses: softprops/action-gh-release@v2
with:
tag_name: ${{ inputs.tag }}
name: ${{ inputs.tag }}
body_path: release/BODY.md
generate_release_notes: true
prerelease: ${{ inputs.prerelease }}
files: release/snaglite-*
fail_on_unmatched_files: true
Loading
Loading