diff --git a/.gitea/workflows/android.yml b/.gitea/workflows/android.yml new file mode 100644 index 0000000..e45a874 --- /dev/null +++ b/.gitea/workflows/android.yml @@ -0,0 +1,38 @@ +name: Android APK + +on: + push: + branches: [ master ] + paths: + - 'src-tauri/**' + - 'src/**' + - 'static/**' + - 'package.json' + - 'pnpm-lock.yaml' + - 'Dockerfile.android' + - '.gitea/workflows/android.yml' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Build APK in container + run: | + docker build -f Dockerfile.android -t bocken-android . + docker create --name apk-extract bocken-android + docker cp apk-extract:/tmp/Bocken.apk ./Bocken.apk + docker rm apk-extract + + - name: Deploy APK to server + uses: appleboy/scp-action@master + with: + host: bocken.org + username: homepage + key: ${{ secrets.homepage_ssh }} + passphrase: ${{ secrets.homepage_pass }} + port: 22 + source: "Bocken.apk" + target: "/var/www/static/" diff --git a/Dockerfile.android b/Dockerfile.android new file mode 100644 index 0000000..10564c4 --- /dev/null +++ b/Dockerfile.android @@ -0,0 +1,52 @@ +FROM rust:1.87-bookworm + +# Java 21 +RUN apt-get update && apt-get install -y --no-install-recommends \ + openjdk-21-jdk-headless unzip wget curl && \ + rm -rf /var/lib/apt/lists/* +ENV JAVA_HOME=/usr/lib/jvm/java-21-openjdk-amd64 + +# Android SDK +ENV ANDROID_HOME=/opt/android-sdk +RUN mkdir -p "$ANDROID_HOME/cmdline-tools" && \ + wget -q https://dl.google.com/android/repository/commandlinetools-linux-11076708_latest.zip -O /tmp/tools.zip && \ + unzip -q /tmp/tools.zip -d "$ANDROID_HOME/cmdline-tools" && \ + mv "$ANDROID_HOME/cmdline-tools/cmdline-tools" "$ANDROID_HOME/cmdline-tools/latest" && \ + rm /tmp/tools.zip +ENV PATH="$ANDROID_HOME/cmdline-tools/latest/bin:$ANDROID_HOME/platform-tools:$PATH" +RUN yes | sdkmanager --licenses > /dev/null 2>&1 && \ + sdkmanager "platforms;android-36" "build-tools;35.0.0" "ndk;27.0.12077973" +ENV NDK_HOME="$ANDROID_HOME/ndk/27.0.12077973" + +# Rust Android targets +RUN rustup target add aarch64-linux-android armv7-linux-androideabi x86_64-linux-android + +# Node 22 + pnpm +RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - && \ + apt-get install -y nodejs && \ + npm install -g pnpm@latest && \ + rm -rf /var/lib/apt/lists/* + +WORKDIR /app + +# Install deps first (cache layer) +COPY package.json pnpm-lock.yaml ./ +RUN pnpm install --frozen-lockfile + +# Copy source +COPY . . + +# Build APK +RUN pnpm tauri android build --apk + +# Sign APK +RUN keytool -genkey -v -keystore /tmp/debug.keystore \ + -alias debug -keyalg RSA -keysize 2048 -validity 10000 \ + -storepass android -keypass android \ + -dname "CN=Debug,O=Bocken,C=DE" && \ + "$ANDROID_HOME/build-tools/35.0.0/zipalign" -f -v 4 \ + src-tauri/gen/android/app/build/outputs/apk/universal/release/app-universal-release-unsigned.apk \ + /tmp/Bocken.apk > /dev/null && \ + "$ANDROID_HOME/build-tools/35.0.0/apksigner" sign \ + --ks /tmp/debug.keystore --ks-pass pass:android --key-pass pass:android \ + /tmp/Bocken.apk diff --git a/README.md b/README.md index 8d7d319..158f35a 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,11 @@ Bilingual recipe collection with search, category filtering, and seasonal recomm ### Faith (`/glaube` · `/faith`) Catholic prayer collection in German, English, and Latin. Includes an interactive Rosary with scroll-synced SVG bead visualization, mystery images (sticky column on desktop, draggable PiP on mobile), decade progress tracking, and a daily streak counter. Adapts prayers for liturgical seasons like Eastertide. +### Fitness (`/fitness`) +Workout tracker with template-based training plans, set logging with RPE, rest timers synced across devices via SSE, workout history with statistics, and body measurement tracking. Cardio exercises support native GPS tracking via the Android app with background location recording. + +**Android app**: [Download APK](https://bocken.org/static/Bocken.apk) — Tauri v2 shell with native GPS foreground service for screen-off tracking, live notification with elapsed time, distance, and pace. + ### Expense Sharing (`/cospend`) Shared expense tracker with balance dashboards, debt breakdowns, monthly bar charts with category filtering, and payment management.