Mobile UI: bottom tab navigation + auto-build APK on push
CI / test (push) Successful in 20s
CI / deploy-web (push) Successful in 27s
CI / build-apk (push) Successful in 42m14s

The Library crammed five text nav-links into a non-wrapping row with no
bottom navigation — unusable on phones. Restructure the primary screens
into a bottom tab bar:

- Add src/app/(tabs)/_layout.tsx: <Tabs> with 5 tabs (Library, Search,
  Study, Ask, Settings) with emoji icons and the accent active tint.
- Move index/search/study/ask/settings into the (tabs) route group; the
  parens keep URLs unchanged (/, /search, /study, /ask, /settings).
- Root _layout becomes a Stack hosting (tabs) (headerless) plus the
  secondary pushed screens (record, transcript/[id], courses, quiz,
  bibliography), each with a back-button header.
- Drop the per-screen <Stack.Screen> headers from the moved tabs (titles
  now come from Tabs); relocate Study's "Export Anki" action into the body.
- Library: remove the cramped header link-row and duplicate title; add a
  "nothing uploaded" subheader and a Courses link.

Verified at 375px: tab bar pinned to the bottom, 5 even tabs, navigation
between tabs works. tsc clean, web export OK, 279 tests pass.

CI: build-apk now runs automatically on every push to master (after
deploy-web), so the APK at /wisp.apk tracks master instead of being
frozen at a stale tag.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-06-14 20:40:32 +02:00
parent 7611ada001
commit 108ac59cb1
8 changed files with 101 additions and 99 deletions
+9 -9
View File
@@ -7,12 +7,12 @@
# `docker compose` simply builds and (re)creates the `wisp` container on the host.
#
# Triggers:
# push to master -> test, then deploy-web
# push to master -> test, then deploy-web, then build-apk
# pull_request -> test only
#
# Required repo secrets (Settings -> Actions -> Secrets) — used by the APK job
# once it is enabled (see TODO at the bottom): ANDROID_KEYSTORE_BASE64,
# ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS, ANDROID_KEY_PASSWORD.
# Required repo secrets (Settings -> Actions -> Secrets) — used by the build-apk
# job: ANDROID_KEYSTORE_BASE64, ANDROID_KEYSTORE_PASSWORD, ANDROID_KEY_ALIAS,
# ANDROID_KEY_PASSWORD.
# ---------------------------------------------------------------------------
name: CI
@@ -72,11 +72,11 @@ jobs:
# with docker create/cp and copy it into the running `wisp` web container so
# it is downloadable at https://wisp.briggen.dev/wisp.apk.
build-apk:
# ONLY on version tags (v*). The native build is heavy (NDK/whisper.cpp) and
# slow on the shared prod runner; building it on every push would peg the box
# (and degrade the live web apps). Cut a release with: git tag v1.2.3 && git push --tags
needs: [test]
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/v')
# Auto-build the APK on every push to master (arm64-only keeps it ~minutes).
# Runs after deploy-web so the web updates promptly, then the APK follows and
# is published to /srv/wisp/wisp.apk (served at /wisp.apk via the compose mount).
needs: [test, deploy-web]
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
timeout-minutes: 120
steps: