From 859907a51a8f2ae3ba6cb9805a2b0e7e3cb82a34 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 20:16:11 +0200 Subject: [PATCH 01/22] Add GitHub Actions workflow for APK build and release --- .github/workflows/apk.yml | 81 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 .github/workflows/apk.yml diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml new file mode 100644 index 0000000..7b3ff12 --- /dev/null +++ b/.github/workflows/apk.yml @@ -0,0 +1,81 @@ +name: APK + +on: + workflow_dispatch: + +jobs: + build: + name: Build + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Set up JDK + uses: actions/setup-java@v5 + with: + distribution: 'temurin' + java-version: '17' + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + + - name: Grant Permission to Execute + run: chmod +x gradlew + + - name: Decode keystore + run: | + echo "${{ secrets.KEYSTORE }}" \ + | base64 --decode > $RUNNER_TEMP/release.keystore + + + - name: Build Release APK + env: + KEYSTORE: ${{ runner.temp }}/release.keystore + KEY_ALIAS: ${{ secrets.KEY_ALIAS }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} + run: ./gradlew assembleRelease + + - name: Upload APK artifact + uses: actions/upload-artifact@v6 + with: + name: apk-release + path: app/build/outputs/apk/release/app-release.apk + if-no-files-found: error + + + publish-github-release: + name: Publish GitHub Release + runs-on: ubuntu-latest + needs: build + permissions: + contents: write + + steps: + - name: Checkout code + uses: actions/checkout@v6 + + - name: Download APK artifact + uses: actions/download-artifact@v7 + with: + name: apk-release + path: app/build/outputs/apk/release + + - name: Get version name + id: get_version + run: | + VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) + echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + + - name: Create GitHub Release + id: create_release + uses: softprops/action-gh-release@v2 + with: + name: Release ${{ env.VERSION_NAME }} + draft: false + prerelease: false + files: app/build/outputs/apk/release/app-release.apk + token: ${{ secrets.GITHUB_TOKEN }} + From 66c22e1b26c8b326c45b8ea5f035f8fb5a781bba Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 20:32:01 +0200 Subject: [PATCH 02/22] Update keystore environment variable names --- app/build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bd56814..c15bbd5 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -23,8 +23,8 @@ android { } signingConfigs { create("release") { - storeFile = file(System.getenv("KEYSTORE_FILE") ?: "keystore.jks") - storePassword = System.getenv("KEYSTORE_PASSWORD") ?: "" + storeFile = file(System.getenv("KEYSTORE") ?: "keystore.jks") + storePassword = System.getenv("STORE_PASSWORD") ?: "" keyAlias = System.getenv("KEY_ALIAS") ?: "" keyPassword = System.getenv("KEY_PASSWORD") ?: "" } From ccdebebd0d3240b1c387e07c3543a8ef7e38ee5d Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 20:40:17 +0200 Subject: [PATCH 03/22] Update apk.yml --- .github/workflows/apk.yml | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 7b3ff12..4fd72ec 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -63,17 +63,25 @@ jobs: name: apk-release path: app/build/outputs/apk/release - - name: Get version name - id: get_version + # - name: Get version name + # id: get_version + # run: | + # VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) + # echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + + - name: Set TAG env var run: | - VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) - echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + RAW=$(git describe --tags --always 2>/dev/null || echo "${{ github.event.repository.name }}") + CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') + echo "TAG=$CLEAN" >> $GITHUB_ENV + echo "raw=$RAW" >> $GITHUB_OUTPUT + echo "clean=$CLEAN" >> $GITHUB_OUTPUT - name: Create GitHub Release id: create_release uses: softprops/action-gh-release@v2 with: - name: Release ${{ env.VERSION_NAME }} + name: Release ${{ env.TAG }} draft: false prerelease: false files: app/build/outputs/apk/release/app-release.apk From 5cec847ef7f0dbad23ed7908ae2b1e71df1e7e38 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 20:45:54 +0200 Subject: [PATCH 04/22] Uncomment version name retrieval in workflow --- .github/workflows/apk.yml | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 4fd72ec..67247c1 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -63,11 +63,11 @@ jobs: name: apk-release path: app/build/outputs/apk/release - # - name: Get version name - # id: get_version - # run: | - # VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) - # echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV + - name: Get version name + id: get_version + run: | + VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) + echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV - name: Set TAG env var run: | @@ -81,9 +81,10 @@ jobs: id: create_release uses: softprops/action-gh-release@v2 with: - name: Release ${{ env.TAG }} - draft: false - prerelease: false + name: Release ${{ env.VERSION_NAME }} + tag_name: ${{ env.TAG }} + # draft: false + # prerelease: false files: app/build/outputs/apk/release/app-release.apk token: ${{ secrets.GITHUB_TOKEN }} From ae2771f786710419fd96961e402cc0d97e579be7 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 20:57:04 +0200 Subject: [PATCH 05/22] Update TAG environment variable handling in workflow --- .github/workflows/apk.yml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 67247c1..c2026e8 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -71,17 +71,16 @@ jobs: - name: Set TAG env var run: | - RAW=$(git describe --tags --always 2>/dev/null || echo "${{ github.event.repository.name }}") - CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') - echo "TAG=$CLEAN" >> $GITHUB_ENV + RAW=$(git describe --tags --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") + # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') + echo "TAG=$RAW" >> $GITHUB_ENV echo "raw=$RAW" >> $GITHUB_OUTPUT - echo "clean=$CLEAN" >> $GITHUB_OUTPUT - name: Create GitHub Release id: create_release uses: softprops/action-gh-release@v2 with: - name: Release ${{ env.VERSION_NAME }} + name: ${{ env.TAG }} tag_name: ${{ env.TAG }} # draft: false # prerelease: false From db23408340a0c581d84f687516290a875b718e4b Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 21:04:34 +0200 Subject: [PATCH 06/22] Update apk.yml --- .github/workflows/apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index c2026e8..2a2316b 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -71,7 +71,7 @@ jobs: - name: Set TAG env var run: | - RAW=$(git describe --tags --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") + RAW=$(git describe --tags --always 2>/dev/null || echo "${{ github.event.repository.name }}") # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') echo "TAG=$RAW" >> $GITHUB_ENV echo "raw=$RAW" >> $GITHUB_OUTPUT From 7ccdeb8e67a5417616ef89ddc97b0dded2b2792c Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 21:22:44 +0200 Subject: [PATCH 07/22] Update APK workflow to trigger on tag pushes --- .github/workflows/apk.yml | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 2a2316b..076952e 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -1,7 +1,9 @@ name: APK on: - workflow_dispatch: + push: + tags: ['v*'] + workflow_dispatch: jobs: build: @@ -56,7 +58,12 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 - + with: + fetch-depth: 0 + submodules: recursive + fetch-tags: true + ref: apk-build + - name: Download APK artifact uses: actions/download-artifact@v7 with: @@ -71,7 +78,7 @@ jobs: - name: Set TAG env var run: | - RAW=$(git describe --tags --always 2>/dev/null || echo "${{ github.event.repository.name }}") + RAW=$(git describe --tags --always --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') echo "TAG=$RAW" >> $GITHUB_ENV echo "raw=$RAW" >> $GITHUB_OUTPUT @@ -86,4 +93,6 @@ jobs: # prerelease: false files: app/build/outputs/apk/release/app-release.apk token: ${{ secrets.GITHUB_TOKEN }} + generate_release_notes: false + make_latest: true From b563fabb926e47636e6a87da200fece17b249437 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 21:28:38 +0200 Subject: [PATCH 08/22] Update apk.yml --- .github/workflows/apk.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 076952e..2a187e5 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -62,7 +62,6 @@ jobs: fetch-depth: 0 submodules: recursive fetch-tags: true - ref: apk-build - name: Download APK artifact uses: actions/download-artifact@v7 From d25e7454edbb61a92cb7b886c6db032edd248485 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 21:37:06 +0200 Subject: [PATCH 09/22] Update apk.yml --- .github/workflows/apk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 2a187e5..6e07dea 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -62,6 +62,7 @@ jobs: fetch-depth: 0 submodules: recursive fetch-tags: true + ref: main - name: Download APK artifact uses: actions/download-artifact@v7 From 75c919bcab1aebf3b879198bde00d72a1620b8f5 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 24 May 2026 21:45:08 +0200 Subject: [PATCH 10/22] Update apk.yml --- .github/workflows/apk.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 6e07dea..03e5062 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -13,7 +13,16 @@ jobs: steps: - name: Checkout code uses: actions/checkout@v6 + with: + fetch-depth: 0 # must have full history + other branches + - name: patch + run: | + git fetch origin ci + git checkout origin/ci -- app/build.gradle.kts + echo "PATCH DIFF:" + git diff -- app/build.gradle.kts + - name: Set up JDK uses: actions/setup-java@v5 with: From 7eeb96bf75115825b21db69333604ed07355fcd7 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:45:05 +0200 Subject: [PATCH 11/22] Update checkout action to use 'revamp-ci' branch --- .github/workflows/apk.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 03e5062..734439c 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -14,6 +14,7 @@ jobs: - name: Checkout code uses: actions/checkout@v6 with: + ref: revamp-ci fetch-depth: 0 # must have full history + other branches - name: patch From b25ca87259fedf932b0fadd42a24b3dd756d74e5 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:48:00 +0200 Subject: [PATCH 12/22] Update APK file name in workflow --- .github/workflows/apk.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 734439c..5611d73 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -54,7 +54,7 @@ jobs: uses: actions/upload-artifact@v6 with: name: apk-release - path: app/build/outputs/apk/release/app-release.apk + path: app/build/outputs/apk/release/FastTrack-release.apk if-no-files-found: error @@ -101,7 +101,7 @@ jobs: tag_name: ${{ env.TAG }} # draft: false # prerelease: false - files: app/build/outputs/apk/release/app-release.apk + files: app/build/outputs/apk/release/FastTrack-release.apk token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: false make_latest: true From 31aa25801ee38b7922e655f23009f83013546640 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 17:57:06 +0200 Subject: [PATCH 13/22] Update apk.yml --- .github/workflows/apk.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 5611d73..6056f02 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -16,6 +16,7 @@ jobs: with: ref: revamp-ci fetch-depth: 0 # must have full history + other branches + fetch-tags: 1 - name: patch run: | @@ -49,12 +50,16 @@ jobs: KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} run: ./gradlew assembleRelease - + + - name: debug print + run: | + find . -iname '*.apk' + - name: Upload APK artifact - uses: actions/upload-artifact@v6 + uses: actions/upload-artifact@v7 with: name: apk-release - path: app/build/outputs/apk/release/FastTrack-release.apk + path: app/build/outputs/apk/release/*.apk if-no-files-found: error @@ -101,7 +106,7 @@ jobs: tag_name: ${{ env.TAG }} # draft: false # prerelease: false - files: app/build/outputs/apk/release/FastTrack-release.apk + files: app/build/outputs/apk/release/*.apk token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: false make_latest: true From dc20331019cf632f5ffc90d50f67b9074815d181 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:12:22 +0200 Subject: [PATCH 14/22] Update apk.yml --- .github/workflows/apk.yml | 93 +++++++++------------------------------ 1 file changed, 21 insertions(+), 72 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 6056f02..00a683f 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -2,29 +2,30 @@ name: APK on: push: - tags: ['v*'] + tags: ['v*'] workflow_dispatch: jobs: - build: - name: Build + build-and-release: + name: Build and Release runs-on: ubuntu-latest + permissions: + contents: write # needed for the release step steps: - name: Checkout code - uses: actions/checkout@v6 + uses: actions/checkout@v7 with: - ref: revamp-ci - fetch-depth: 0 # must have full history + other branches - fetch-tags: 1 + fetch-depth: 0 # needed to fetch the ci branch below + fetch-tags: true + + # - name: patch + # run: | + # git fetch origin revamp-ci + # git checkout origin/ci -- app/build.gradle.kts + # echo "PATCH DIFF:" + # git diff -- app/build.gradle.kts - - name: patch - run: | - git fetch origin ci - git checkout origin/ci -- app/build.gradle.kts - echo "PATCH DIFF:" - git diff -- app/build.gradle.kts - - name: Set up JDK uses: actions/setup-java@v5 with: @@ -32,16 +33,14 @@ jobs: java-version: '17' - name: Setup Gradle - uses: gradle/actions/setup-gradle@v5 + uses: gradle/actions/setup-gradle@v6 - name: Grant Permission to Execute run: chmod +x gradlew - name: Decode keystore run: | - echo "${{ secrets.KEYSTORE }}" \ - | base64 --decode > $RUNNER_TEMP/release.keystore - + echo "${{ secrets.KEYSTORE }}" | base64 --decode > "$RUNNER_TEMP/release.keystore" - name: Build Release APK env: @@ -50,64 +49,14 @@ jobs: KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} run: ./gradlew assembleRelease - - - name: debug print - run: | - find . -iname '*.apk' - - - name: Upload APK artifact - uses: actions/upload-artifact@v7 - with: - name: apk-release - path: app/build/outputs/apk/release/*.apk - if-no-files-found: error - - - publish-github-release: - name: Publish GitHub Release - runs-on: ubuntu-latest - needs: build - permissions: - contents: write - - steps: - - name: Checkout code - uses: actions/checkout@v6 - with: - fetch-depth: 0 - submodules: recursive - fetch-tags: true - ref: main - - - name: Download APK artifact - uses: actions/download-artifact@v7 - with: - name: apk-release - path: app/build/outputs/apk/release - - - name: Get version name - id: get_version - run: | - VERSION_NAME=$(echo ${GITHUB_REF#refs/tags/v}) - echo "VERSION_NAME=$VERSION_NAME" >> $GITHUB_ENV - - - name: Set TAG env var - run: | - RAW=$(git describe --tags --always --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") - # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') - echo "TAG=$RAW" >> $GITHUB_ENV - echo "raw=$RAW" >> $GITHUB_OUTPUT - name: Create GitHub Release - id: create_release - uses: softprops/action-gh-release@v2 + if: startsWith(github.ref, 'refs/tags/') + uses: softprops/action-gh-release@v3 with: - name: ${{ env.TAG }} - tag_name: ${{ env.TAG }} - # draft: false - # prerelease: false + name: ${{ github.ref_name }} + tag_name: ${{ github.ref_name }} files: app/build/outputs/apk/release/*.apk token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: false make_latest: true - From b32533d0b7a8484d19eb31c8d188f41fa6b30fd0 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:13:02 +0200 Subject: [PATCH 15/22] Rename workflow to 'APK build-and-release' --- .github/workflows/apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 00a683f..5f43557 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -1,4 +1,4 @@ -name: APK +name: APK build-and-release on: push: From b1d68b8c44eb750615df5cdcac412f4c51859802 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 19:28:10 +0200 Subject: [PATCH 16/22] List APK artifacts in workflow Add a step to list APK artifacts before creating a GitHub release. --- .github/workflows/apk.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 5f43557..c2a31c1 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -50,8 +50,12 @@ jobs: STORE_PASSWORD: ${{ secrets.STORE_PASSWORD }} run: ./gradlew assembleRelease + - name: list artifacts + run: | + find . -iname '*.apk' + - name: Create GitHub Release - if: startsWith(github.ref, 'refs/tags/') + # if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v3 with: name: ${{ github.ref_name }} From de51060296d72509784ab6095249d6db2d8648a0 Mon Sep 17 00:00:00 2001 From: glwnd Date: Fri, 10 Jul 2026 20:09:51 +0200 Subject: [PATCH 17/22] action --- .github/workflows/apk.yml | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index c2a31c1..2af7c66 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -52,14 +52,21 @@ jobs: - name: list artifacts run: | - find . -iname '*.apk' + find . -iname '*.apk' + + - name: Set TAG env var + run: | + RAW=$(git describe --tags --always --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") + # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') + echo "TAG=$RAW" >> $GITHUB_ENV + echo "raw=$RAW" >> $GITHUB_OUTPUT - name: Create GitHub Release # if: startsWith(github.ref, 'refs/tags/') uses: softprops/action-gh-release@v3 with: - name: ${{ github.ref_name }} - tag_name: ${{ github.ref_name }} + name: ${{ env.TAG }} + tag_name: ${{ env.TAG }} files: app/build/outputs/apk/release/*.apk token: ${{ secrets.GITHUB_TOKEN }} generate_release_notes: false From 19b34d21a8b4be5e90b204d1cec73005c3dfdbc9 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Fri, 10 Jul 2026 20:16:40 +0200 Subject: [PATCH 18/22] Update apk.yml --- .github/workflows/apk.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 2af7c66..234ee90 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -56,7 +56,7 @@ jobs: - name: Set TAG env var run: | - RAW=$(git describe --tags --always --abbrev=0 2>/dev/null || echo "${{ github.event.repository.name }}") + RAW=$(git describe --tags --always --abbrev=0 2>/dev/null) # CLEAN=$(echo "$RAW" | tr '/' '-' | tr '[:upper:]' '[:lower:]') echo "TAG=$RAW" >> $GITHUB_ENV echo "raw=$RAW" >> $GITHUB_OUTPUT From c9b58ab3b65b327df13e2e5ea68bed0f8b16f120 Mon Sep 17 00:00:00 2001 From: glwnd Date: Fri, 10 Jul 2026 21:28:59 +0200 Subject: [PATCH 19/22] (i18n) fix Spanish translation hallucinations --- app/src/main/res/raw-es/info.md | 40 ++++++++++++++-------------- app/src/main/res/raw-es/tips.md | 47 ++++++++++++++++++--------------- 2 files changed, 45 insertions(+), 42 deletions(-) diff --git a/app/src/main/res/raw-es/info.md b/app/src/main/res/raw-es/info.md index 4b9e6e6..7bc7623 100644 --- a/app/src/main/res/raw-es/info.md +++ b/app/src/main/res/raw-es/info.md @@ -1,34 +1,34 @@ # Ayuno Intermitente -**Rápido intermitente** es actualmente un campo de estudio muy activo, algunas partes de esto están bien establecidas y otras todavía están siendo estudiadas. Así que tome todo esto con un grano de sal, y consulte las fuentes principales enlazadas a continuación. +El ayuno intermitente es un campo de estudio muy activo: algunas de sus bases están bien establecidas, mientras que otras siguen bajo investigación. Por eso conviene tomar lo siguiente con cautela y consultar las fuentes primarias que se enlazan al final. -## Cómo y por qué ayunar funciona: +## Cómo y por qué funciona el ayuno -Se cree que en nuestro desarrollo temprano como recolectores de cazadores, nuestra dieta era fiesta o hambre. Tal vez una tribu pequeña recibiría una gran muerte una vez por semana o menos. Por lo tanto, nuestros cuerpos están bien diseñados para sacar el máximo provecho de ello y almacenar todo lo posible para su uso posterior. +Se cree que, en nuestra etapa temprana como cazadores-recolectores, nuestra dieta alternaba entre la abundancia y la escasez: quizá una tribu pequeña conseguía una presa grande una vez por semana, o incluso con menos frecuencia. Por eso nuestro cuerpo evolucionó para aprovechar al máximo cada ingesta y almacenar todo lo posible para más adelante. -Adquirir glúcidos en grandes cantidades habría sido difícil. Por ejemplo, el forraje para las bayas, que serían altas en el azúcar, requeriría mucho esfuerzo sólo por una pequeña cantidad de azúcar. +Conseguir carbohidratos en grandes cantidades era difícil. Recolectar bayas, por ejemplo — ricas en azúcar —, exigía mucho esfuerzo a cambio de muy poca energía. -### Así, nuestros cuerpos desarrollaron dos vías primarias de energía: +### Por eso desarrollamos dos rutas energéticas principales -1. **Glucos:** Todos los carbohidratos se descomponen en glucosa al consumir. La glucosa puede ser consumida directamente por las células para obtener energía. El exceso de glucosa se almacena como glicogeno en varios lugares alrededor del cuerpo, como el hígado y el músculo esquelético. Una vez que sus reservas de glicogeno estén llenas, el resto de glucosa se convertirá en un tejido adipose. Cuando sea necesario, el glicogeno almacenado se puede descomponer en glucosa para ser consumido por las células. -2. **Cuerpos de cetona:** Estos se derivan de la metabolización de grasa y las células pueden consumirlos en lugar de glucosa para obtener energía. El exceso de calorías de los hidratos de carbono o de la proteína (_que se descomponen en glucosa y aminoácidos respectivamente_) se almacenarán como tejido adiposo (_grasa_), y cuando sea necesario, puede dividirse en cuerpos de ketone que serán utilizados para la energía por sus células. +1. **Glucosa.** Todos los carbohidratos se descomponen en glucosa al ser consumidos. Las células pueden usarla directamente como energía. El exceso se almacena como glucógeno en distintos tejidos, sobre todo en el hígado y el músculo esquelético. Una vez llenas esas reservas, el excedente de glucosa se convierte en tejido adiposo. Cuando el cuerpo lo necesita, el glucógeno almacenado vuelve a convertirse en glucosa para que las células lo consuman. +2. **Cuerpos cetónicos.** Provienen de la metabolización de la grasa, y las células pueden usarlos como energía en lugar de glucosa. El exceso de calorías proveniente de carbohidratos o proteínas (que se descomponen en glucosa y aminoácidos, respectivamente) se almacena como tejido adiposo, y cuando hace falta, ese tejido se descompone en cuerpos cetónicos que las células utilizan como combustible. -En los días de la recolección de cazadores a menudo hubiéramos despojado nuestra energía de los cuerpos de ketone así como de la glucosa. +En la época de los cazadores-recolectores, era habitual obtener energía tanto de cuerpos cetónicos como de glucosa. -Sin embargo, hoy en día en las sociedades occidentales modernas, los hidratos de carbono son tan fáciles de llegar que la gente puede pasar la mayor parte de su vida sin que sus cuerpos tengan que recurrir a los cuerpos de ketone para obtener energía. +Sin embargo, en las sociedades occidentales modernas los carbohidratos están tan al alcance de la mano que muchas personas pasan la mayor parte de su vida sin que su cuerpo necesite recurrir a los cuerpos cetónicos. -Un área activa de investigación trata sobre qué procesos tiene el cuerpo que sólo están activos cuando el cuerpo está consumiendo principalmente cuerpos de cetona. +Un área de investigación activa estudia qué procesos del cuerpo solo se activan cuando este consume principalmente cuerpos cetónicos. -## Etapas de Rápida: +## Etapas del ayuno -1. **Quema de glucosa:** Al principio tu cuerpo consumirá la glucosa que ya está libre en tu sangre. Usted puede haber oído que durante el ejercicio cardiovascular se tarda 20 minutos en agotar toda su glucosa. Para los atletas resistentes como los corredores marathon, se aconseja que consuman más glucosa cada 20 minutos si es posible. Como ocurre con todos los números aquí, se trata de una estimación áspera, una buena regla general si se quiere. Esto se verá afectado por muchos factores: tu propio cuerpo, la actividad que estás haciendo, cuánta glucosa ya tenías debido a tu dieta, etc. Pero es una estimación bastante buena, así que iremos con ella. -2. **Descomposición de glucógeno:** A medida que la glucosa en tu sangre se agota, tu cuerpo lo reabastecerá al romper tus tiendas de glicogeno. Las personas que siguen las dietas bajas de carbono tendrán tiendas de glicogeno más pequeñas, por lo que esta fase puede variar ampliamente. Alguien con una dieta baja de glúcido puede completar esta etapa en tan solo unas horas, mientras que alguien con una dieta alta de glúcido que no hace ejercicio regularmente podría tomar entre 24 y 48 horas para agotar sus tiendas. El ejercicio durante esta etapa lo acelerará forzando a su cuerpo a quemar glucosa más rápido. -3. **Desglose de Tejidos Adipose:** A medida que tus tiendas de glicogeno empiezan a agotarse, tu cuerpo empezará a cambiar para romper el tejido adiposo (_grasa_) en cuerpos de ketone. Este es el comienzo de la "quema de grasa". -4. **Ketosis:** Esta es la primera etapa que parece mostrar más beneficios que la simple restricción de calorías. La ketosis es el estado de los cuerpos de ketona siendo la fuente primaria de energía en tu sangre. Aunque todavía no se conoce el mecanismo de acción, este Estado parece tener beneficios significativos para las enfermedades relacionadas con la inflamación y la inflamación, como la gota. -5. **Autofagia:** El cuerpo tiene otro mecanismo para recolectar energía. En esta etapa su cuerpo comenzará a consumir células viejas o dañadas para obtener energía. Este ámbito de la investigación está todavía en pañales, pero parece que se trata de un mecanismo importante para que el cuerpo resuelva problemas. Los cánceres son simplemente células dañadas que no saben cuándo dejar de dividir. Si un cuerpo entra regularmente a la autofagia, parece que esas células dañadas se descomponen por energía antes de que tengan tiempo para convertirse en un problema. Otra área de investigación está en torno a la Enfermedad del heimer. Sabemos que la causa del heimer es una acumulación de amiloides de placa en el cerebro, por lo que cualquier forma de prevenir esas acumulaciones debería evitar que la enfermedad se arraigue en primer lugar. La autofagia puede hacer justamente eso, consumiendo la placa antes de que se convierta en un problema. Adicionalmente, algunos lugares que almacenan glicogeno y tejidos adiposos están bien en pequeñas cantidades, pero se convierten en un problema cuando esas tiendas nunca se agotan. La cirrosis del hígado, por ejemplo, puede ser causada por depósitos de grasa en el hígado impidiendo su función normal. Si a menudo bebes alcohol y no sigues una dieta de glúcido bajo, el glucógeno almacenado en el hígado rara vez se agotará. -6. **Autofagia óptima:** Este es probablemente el área de investigación más reciente, así que toma esto con un grano de sal. Pero cuando su cuerpo ha estado en autofagia durante un período de tiempo suficiente, parece que se activan más sistemas de “reparación”. El mecanismo de acción aún no es conocido por ello. Pero los estudios han demostrado que se reparan daños al ADN, como la longitud de los telómetros en los extremos de su ADN, efectivamente revertir el daño de ADN relacionado con la edad y reducir su edad biológica. Parece no ser sólo la autofagia que activa estos sistemas, estresar el cuerpo de diversas maneras puede desencadenarlos. Los atletas de resistencia pueden activar estos sistemas, que pueden tener sentido ya que parece que nuestros antepasados eran cazadores de resistencia, corriendo durante horas mientras acechaban presas. +1. **Quema de glucosa.** Al principio, el cuerpo consume la glucosa que ya circula libre en la sangre. Quizá hayas oído que, durante el ejercicio cardiovascular, se tardan unos 20 minutos en agotarla por completo. Por eso a los atletas de resistencia, como los corredores de maratón, se les recomienda ingerir más glucosa cada 20 minutos si es posible. Como con todas las cifras aquí mencionadas, se trata de una estimación aproximada —una regla general útil, no una ley fija—, ya que factores como tu propio metabolismo, la actividad realizada o cuánta glucosa tenías disponible según tu dieta pueden alterarla. Aun así, es una estimación razonable, así que la usaremos como referencia. +2. **Descomposición del glucógeno.** A medida que la glucosa en sangre se agota, el cuerpo la repone descomponiendo sus reservas de glucógeno. Quienes siguen dietas bajas en carbohidratos tienen reservas más pequeñas, por lo que esta etapa puede variar mucho: alguien con una dieta baja en carbohidratos puede completarla en solo un par de horas, mientras que alguien con una dieta alta en carbohidratos y sedentario puede tardar entre 24 y 48 horas en agotarlas. El ejercicio durante esta fase la acelera, ya que obliga al cuerpo a quemar glucosa más rápido. +3. **Descomposición del tejido adiposo.** Cuando las reservas de glucógeno empiezan a agotarse, el cuerpo comienza a descomponer el tejido adiposo (grasa) en cuerpos cetónicos. Aquí empieza propiamente la "quema de grasa". +4. **Cetosis.** Es la primera etapa que parece ofrecer beneficios más allá de la simple restricción calórica. La cetosis es el estado en el que los cuerpos cetónicos se convierten en la principal fuente de energía en sangre. Aunque todavía no se conoce el mecanismo exacto, este estado parece tener beneficios significativos frente a enfermedades relacionadas con la inflamación, como la gota. +5. **Autofagia.** El cuerpo cuenta con otro mecanismo para obtener energía: en esta etapa comienza a consumir células viejas o dañadas. Esta línea de investigación aún está en pañales, pero todo indica que se trata de un mecanismo clave para que el organismo se autorregule. El cáncer, en esencia, son células dañadas que no saben cuándo dejar de dividirse; si un cuerpo entra regularmente en autofagia, esas células dañadas parecen descomponerse para obtener energía antes de convertirse en un problema. Otra línea de estudio gira en torno al alzhéimer: sabemos que su causa es la acumulación de placas de amiloide en el cerebro, así que cualquier mecanismo que prevenga esa acumulación debería frenar la enfermedad antes de que se instale. La autofagia podría hacer justamente eso, consumiendo la placa antes de que se vuelva un problema. Además, algunos depósitos de glucógeno y grasa son inofensivos en pequeñas cantidades, pero se convierten en un problema cuando nunca se agotan. La cirrosis hepática, por ejemplo, puede deberse a depósitos de grasa que impiden el funcionamiento normal del hígado: si bebes alcohol con frecuencia y no sigues una dieta baja en carbohidratos, el glucógeno almacenado en el hígado rara vez llega a agotarse. +6. **Autofagia óptima.** Probablemente la línea de investigación más reciente, así que conviene tomarla con reservas. Cuando el cuerpo permanece en autofagia durante el tiempo suficiente, parecen activarse sistemas de "reparación" adicionales, cuyo mecanismo tampoco se conoce todavía. Sin embargo, estudios han mostrado reparación del daño en el ADN —por ejemplo, en la longitud de los telómeros—, revirtiendo efectivamente el daño genético asociado a la edad y reduciendo la edad biológica. Al parecer no solo la autofagia activa estos sistemas: someter al cuerpo a distintos tipos de estrés físico también puede desencadenarlos. Los atletas de resistencia podrían activarlos, lo cual tendría sentido si consideramos que nuestros ancestros eran cazadores de resistencia que corrían durante horas mientras acechaban a sus presas. -## Fuentes: +## Fuentes -- [Cómo ralentizar el envejecimiento (e incluso revertirlo)](https://www.youtube.com/watch?v=QRt7LjqJ45k) (_Youtube_) -- [Efectos de Disensión Intermitente en Salud, Envejecimiento y Enfermedad](https://www.nejm.org/action/showFullText?downloadfile=showFullText&downloadfile=showFullText&doi=10.1056/nejmra1905136) (_Revista de Nueva Inglaterra de Medicina_) \ No newline at end of file +- [Cómo ralentizar el envejecimiento (e incluso revertirlo)](https://www.youtube.com/watch?v=QRt7LjqJ45k) (*YouTube*) +- [Effects of Intermittent Fasting on Health, Aging, and Disease](https://www.nejm.org/action/showFullText?downloadfile=showFullText&downloadfile=showFullText&doi=10.1056/nejmra1905136) (*New England Journal of Medicine*) \ No newline at end of file diff --git a/app/src/main/res/raw-es/tips.md b/app/src/main/res/raw-es/tips.md index 2e79bd5..9f4aeea 100644 --- a/app/src/main/res/raw-es/tips.md +++ b/app/src/main/res/raw-es/tips.md @@ -4,34 +4,37 @@ ## Iniciar lentamente: -- Pruebe un par de ayunas de 16 horas para empezar, luego mueva a 30 horas de ayuno, y así sucesivamente. -- Cuanto más rápido vayas, más fácil obtendrán las cosas. -- Cuando empiezas a hacer un ayuno de varios días, generalmente el primer día es más difícil que el segundo día. +- Pruebe un par de ayunos de 16 horas para empezar, luego pase a 30 horas de ayuno, y así sucesivamente. +- Cuanto más rápido vayas, más fácil te resultará hacer las cosas. +- Al empezar un ayuno de varios días, el primer día suele ser más duro que el segundo. -## Alimentos de Calorie Cero +## Alimentos y bebidas sin calorías -- **Beba mucha agua:** Además de ser bueno para ti, llenar tu estómago con un montón de volumen te ayudará a sentirte lleno durante un tiempo. -- **Beber cero bebidas calorías:** - - ¡Las aguas de seltzer saboreadas son excelentes para esto! - - Té no endulzado (_Caliente o hielo_) - - Agua con zumo de limón o limón +* **Bebe mucha agua:** además de ser beneficiosa para tu salud, llenar el estómago con líquido te ayudará a sentirte saciado durante un buen rato. +* **Toma bebidas sin calorías:** -## Alimentos muy bajos de Calorie + * ¡Las aguas con gas aromatizadas son una excelente opción! + * Té sin azúcar (caliente o frío). + * Agua con unas gotas de limón o de lima. -Usted puede comer un par de calorías durante su ayuno y aún así ser igual de eficaz. Intenta mantenerlo por debajo de 100 -calorías al día. Para este fin, esta es una receta que encuentro muy efectiva en "sentirse comida" mientras que solo es de 5 -calorías por porción: +## Alimentos muy bajos en calorías -**Caldo picante:** +Puedes consumir unas pocas calorías durante el ayuno y seguir obteniendo prácticamente los mismos beneficios. Intenta no superar las 100 calorías al día. -- 1 tsp de pollo -- 8oz (1 taza) agua de ebullición -- Rayo de salsa de habanero caliente -- Zumo de cal +Para ello, aquí tienes una receta que resulta muy efectiva para calmar la sensación de hambre y que apenas aporta unas 5 calorías por ración: -Para Vegan o Vegan más rápido, usted puede sustituir el pollo de illon por el de la verdura. +**Caldo picante** -## Supresores de Appetitos +* 1 cucharadita de caldo de pollo en polvo. +* 1 taza (240 ml) de agua hirviendo. +* Unas gotas de salsa picante de habanero. +* Un chorrito de zumo de lima. -- **Coffe:** más que llenar tu estómago un poco para sentirte lleno, reprimirá activamente tu apetito por un tiempo -- **Salsa caliente:** Normalmente estas son calorías cero, y también ayudarán a evitar los sentimientos de hambre \ No newline at end of file +Si sigues una dieta vegana o prefieres una versión apta para veganos, puedes sustituir el caldo de pollo por caldo de verduras. + +## Supresores del apetito + +* **Café:** además de llenar un poco el estómago, puede ayudarte a reducir el apetito durante un tiempo. +* **Salsa picante:** por lo general apenas aporta calorías y también puede ayudar a disminuir la sensación de hambre. + +Si lo deseas, también puedo darle un tono más científico, más divulgativo o más cercano y motivador, según el público al que vaya dirigido el texto. From 75d510b103ffbbec874c1fd774e7df1ac096c105 Mon Sep 17 00:00:00 2001 From: glwnd Date: Sat, 11 Jul 2026 15:08:35 +0200 Subject: [PATCH 20/22] db migration schema --- .../2.json | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/schemas/com.darkrockstudios.apps.fasttrack.data.database.AppDatabase/2.json diff --git a/app/schemas/com.darkrockstudios.apps.fasttrack.data.database.AppDatabase/2.json b/app/schemas/com.darkrockstudios.apps.fasttrack.data.database.AppDatabase/2.json new file mode 100644 index 0000000..c10bb8e --- /dev/null +++ b/app/schemas/com.darkrockstudios.apps.fasttrack.data.database.AppDatabase/2.json @@ -0,0 +1,50 @@ +{ + "formatVersion": 1, + "database": { + "version": 2, + "identityHash": "82e9fabc07c671aa9a050a69e505a918", + "entities": [ + { + "tableName": "FastEntry", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`uid` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `start` INTEGER NOT NULL, `length` INTEGER NOT NULL, `notes` TEXT NOT NULL DEFAULT '')", + "fields": [ + { + "fieldPath": "uid", + "columnName": "uid", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "start", + "columnName": "start", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "length", + "columnName": "length", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "notes", + "columnName": "notes", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "uid" + ] + } + } + ], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '82e9fabc07c671aa9a050a69e505a918')" + ] + } +} \ No newline at end of file From 0e24d830777a203f83675e7f629d7ebf65c67712 Mon Sep 17 00:00:00 2001 From: glwnd Date: Sat, 11 Jul 2026 17:07:34 +0200 Subject: [PATCH 21/22] - `chmod +x ./gradlew` --- gradlew | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 gradlew diff --git a/gradlew b/gradlew old mode 100644 new mode 100755 From 8a17170bb145ef5391d4e1403d68237965bf7a77 Mon Sep 17 00:00:00 2001 From: glowinthedark <48893368+glowinthedark@users.noreply.github.com> Date: Sun, 12 Jul 2026 14:59:03 +0200 Subject: [PATCH 22/22] Update apk.yml --- .github/workflows/apk.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/.github/workflows/apk.yml b/.github/workflows/apk.yml index 234ee90..d38628e 100644 --- a/.github/workflows/apk.yml +++ b/.github/workflows/apk.yml @@ -42,6 +42,15 @@ jobs: run: | echo "${{ secrets.KEYSTORE }}" | base64 --decode > "$RUNNER_TEMP/release.keystore" + - name: Patch applicationId suffix to prevent collision with existing installs + run: | + perl -0777 -pi -e ' + s/(release\s*\{\s*\n\s*isMinifyEnabled = true)/$1\n applicationIdSuffix = ".revamp_v3"/ + ' app/build.gradle.kts + + echo "--- patched block ---" + grep -A5 "release {" app/build.gradle.kts + - name: Build Release APK env: KEYSTORE: ${{ runner.temp }}/release.keystore