Official mobile app for Volksverpetzer (build with Expo + TypeScript).
-
Clone the repository:
git clone https://github.com/Volksverpetzer/vvp_app.git
-
Change into project directory:
cd vvp_app
-
Install dependencies:
pnpm install
-
Start development server:
pnpm start
The app expects a ./.env file in the project root for some minor configuration.
See .env.example for reference.
The app supports two variants — Volksverpetzer and Mimikama — selected via the APP environment variable (see app.config.ts).
src/helpers/AppImages.ts is the central registry for assets that differ between variants. Instead of importing image files directly in components, always go through AppImages:
import { AppImages } from "#/helpers/AppImages";
// Some AppImages entries can be null — guard before use (see table below)
if (!AppImages.loadingAnimation) return null;
<Image source={AppImages.loadingAnimation} ... />Available entries
| Key | Volksverpetzer asset path | Mimikama asset path |
|---|---|---|
shopButton |
assets/images/volksverpetzer/button_shop.webp |
assets/images/mimikama/button_shop.webp |
loadingAnimation |
assets/images/logo_animated.gif |
null |
Adding a new variant asset
-
Place the asset file(s) under
assets/images/. -
Import them in
AppImages.tsand add a new key using theisVolksverpetzerflag:import { isVolksverpetzer } from "#/helpers/utils/variant"; import MimikamaMyAsset from "#assets/images/mimikama_my_asset.webp"; import VVPMyAsset from "#assets/images/my_asset.webp"; export const AppImages = { // ...existing keys myAsset: isVolksverpetzer ? VVPMyAsset : MimikamaMyAsset, } as const;
-
Use
AppImages.myAssetin your component. If a variant has no asset, usenulland guard against it in the component.
Icons are sourced from the Octicons icon set via @expo/vector-icons. Use the icon browser to find available icon names. Standard UI icons should go through src/components/Icons.tsx, while custom SVG icons (e.g. logos, place icons) are provided via src/components/SvgIcons.tsx.
For platform-specific runs:
pnpm iospnpm androidpnpm web
| Profile | distribution |
Used for |
|---|---|---|
development |
internal |
Dev builds with expo-dev-client for the team (dev:* scripts) |
preview |
internal |
Direct APK sharing with designers (preview:build) |
internal |
store (default) | Beta store submission — Play Store + App Store (expo-release-beta.yml) |
production |
store (default) | Stable store submission + GitHub release APK (expo-release.yml, default profile) |
local-apk |
internal |
Local Android APK build — run via pnpm android:local or expo-release(-beta).yml |
local-ios |
internal |
Local iOS simulator build — run via pnpm ios:local |
mimikama |
store (default) | Mimikama variant store submission |
fdroid |
internal |
F-Droid / FOSS local build (no push notifications) |
Development builds include expo-dev-client and support full native modules — unlike Expo Go. They are built via EAS and can be shared with the team via a URL.
pnpm dev:android # Android
pnpm dev:ios # iOS
pnpm dev:all # Both platforms at onceAfter the build finishes, EAS generates a shareable URL. Team members can open it on their device to download and install directly, or use:
pnpx eas-cli build:run --profile developmentiOS notes:
- iOS 16+: enable Developer Mode on the device (Settings → Privacy & Security → Developer Mode)
- Devices must be registered in your Apple Developer account — EAS will prompt you to register new ones via QR code during the build
- To add a new device without a full rebuild:
pnpx eas-cli build:resign
After installing the build, start the dev server as usual:
pnpm startPreview builds are standalone release builds intended for sharing with testers or designers who are not on the same network. Unlike development builds, they do not require a running dev server.
pnpm preview:build # Build Android APK via EAS (internal distribution)When the build finishes, EAS generates a shareable install link with a QR code — no Expo account required for the recipient. Testers just open the link on their Android device and install the APK.
iOS: Apple requires either TestFlight (invite testers by email, recommended) or ad-hoc distribution (device UDIDs must be registered in your Apple Developer account first). There is no equivalent one-click install link for iOS.
For JS-only changes (UI, fonts, copy) you can push an over-the-air update to everyone who already has the preview build installed — no reinstall needed:
pnpm preview:updateThis publishes the current branch's JS bundle to the preview channel. The app picks it up silently on next launch.
Typical workflow when sharing a branch with designers:
# First time — send them the install link EAS prints
pnpm preview:build
# Every subsequent change on the same branch
pnpm preview:updateBeta releases target the Play Store internal track and TestFlight, and produce a GitHub prerelease with APK artifacts. The expo-release-beta.yml workflow is triggered by pushing a beta-version tag, so make sure the tag points to the intended commit from prerelease.
Feature branches are merged into prerelease via GitHub PRs as soon as they are ready, using squash merge.
When enough features have accumulated to warrant a beta:
-
Bump the version in
package.json— bothversion(e.g.1.2.3-beta.1) andversionCode(useYYYYMMDDNN, must be strictly greater than the previous value):{ "version": "1.2.3-beta.1", "versionCode": 2026051201 } -
Refresh license data if any dependencies were added, removed, or updated since the last release. Skip this step if
package.jsondependencies are unchanged.Run locally and include the result in the same prep commit:
pnpm prepare:licenses
Alternatively, trigger it via GitHub Actions without a local checkout: go to Actions → Update license data → Run workflow, select the
prereleasebranch, and click Run workflow. The workflow commits the updated file directly to the branch — pull before tagging.Commit both changes together and push to
prerelease:git add package.json src/screens/Settings/components/licenses/data.tsx git commit -m "chore: prepare 1.2.3-beta.1" git push origin prerelease -
Tag and push — the tag triggers
expo-release-beta.yml:git tag 1.2.3-beta.1 git push origin 1.2.3-beta.1
The workflow runs lint/tests, submits to both stores, and creates a GitHub prerelease with the APK attached.
Stable releases target the public Play Store and App Store tracks and produce a GitHub release.
-
Open a PR on GitHub from
prereleaseintomain, titled "Release vX.Y.Z", and merge it with a regular merge commit (not squash). -
Tag and push — the tag triggers
expo-release.yml:git tag v1.2.3 git push origin v1.2.3
-
Update the F-Droid metadata in the separate
fdroiddatarepository:- Add a new entry under
Builds:inmetadata/de.volksverpetzer.app.ymlwith the matchingversionNameandversionCode. - Update
CurrentVersionandCurrentVersionCodeat the bottom of that file.
- Add a new entry under
- Run tests:
pnpm test - Lint:
pnpm lint - Fix lint issues:
pnpm lint:fix - Check types and spelling:
pnpm check
F-Droid builds should avoid bundling non-free Google/Firebase libraries. This project supports a
FOSS variant by excluding expo-notifications from Android autolinking and by disabling the
notifications config plugin when BUILD_FOSS_ONLY=true.
- Build with FOSS mode enabled:
BUILD_FOSS_ONLY=true npx expo prebuild --platform android --no-install(or your preferred Android build command)
Set up the WebStorm run configuration to attach its debugger to your running app:
- Go to Run | Edit Configurations....
- Click the + icon in the top left corner and select React Native from the list.
- Name the configuration (e.g., "Debug Expo Hermes").
- In the configuration settings:
- Ensure the "Hermes engine is enabled" checkbox is selected.
- Unselect the "Build and launch application" checkbox, as your app is already running from Step 1.
- Set the Bundler host to 127.0.0.1.
- Ensure the Bundler port is the one your Metro bundler is using (default is 8081, but Expo Go often uses 19000).
- In the "Before launch" section, you may want to remove the "Start React Native Bundler" task if you started it manually.
- Click OK to save the configuration.
Now, you can start the debugging session from within WebStorm:
- Set breakpoints in your code by clicking in the gutter next to the line numbers where you want execution to pause.
- Select your newly created "Debug Expo Hermes" configuration from the dropdown menu in the top-right corner of the IDE.
- Click the Debug (bug) button next to the Run button. The Debug tool window will open.
- On your physical device or emulator, open the Developer Menu (shake the device, press Ctrl + Cmd + Z on iOS simulator, or Ctrl + M on Android emulator).
- Select "Enable Local DevTools" or "Open JS Debugger" from the menu to connect the app to the WebStorm debugger session.
- Once connected, your breakpoints should be triggered, and you can inspect variables, the call stack, and step through your code in the WebStorm Debug tool window.
Download the latest release from GitHub (the APK), and run the following commands in the project root:
unzip -p vvp-app-XXXX.apk assets/app.manifest > app.manifestnpx expo export --dump-assetmapnpx expo-updates assets:verify -b app.manifest -a dist/assetmap.json -e dist/metadata.json -p android