Initial version of the mobile app#4
Open
ArtyomSavchenko wants to merge 17 commits into
Open
Conversation
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
Signed-off-by: Artem Savchenko <armisav@gmail.com>
…ioning) - Add config-mobile-huly.json: huly.app cloud config with absolute file URLs usable from a device (relative /files URLs do not work in the native shell) - Support MOBILE_CONFIG env var in copy-web.js to select the bundled config - Commit a stable debug keystore and wire it into the debug signing config so debug APKs from CI and local builds install over each other - Allow overriding versionCode/versionName via env; CI stamps run number - Fix executable bit on android/gradlew Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
Builds the web bundle, syncs Capacitor and uploads a debug APK on pushes/PRs touching mobile/ and on manual dispatch with a selectable bundled config.json (default: huly.app cloud backend). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
Signed-off-by: Artem Savchenko <armisav@gmail.com>
The +x set via update-index was overwritten by a later 'git add -A' from a 644 working copy, so CI failed with 'Permission denied'. Fix the mode in git and chmod defensively in the workflow before invoking gradle. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
…loads - Declare CAMERA, RECORD_AUDIO, MODIFY_AUDIO_SETTINGS and POST_NOTIFICATIONS in AndroidManifest so Capacitor's BridgeWebChromeClient can grant getUserMedia requests from the web app (calls, voice messages, photo capture) - Route WebView downloads to the system DownloadManager (public Downloads dir, cookie passthrough, completion notification); previously attachment downloads were silently ignored - Add iOS usage descriptions for camera, microphone and photo library (required for the corresponding WKWebView permission prompts) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
window.Capacitor is not declared on the Window type, which failed 'rush validate' (TS2339) and blocked PR CI. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
svelte-check/test jobs skip 'rush install' and rely on the cached
CacheFolders to carry each project's .rush/temp state from the build
job. The mobile folder was missing from that list, so Rush failed to
compute the repo inputs snapshot ('Build cache is only supported if
running in a Git repository'). The formatting job additionally requires
every changed project to define a 'format' script — add the same stub
dev/prod uses.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
…d 13+) POST_NOTIFICATIONS was declared but never requested, so notifications would stay silently blocked on API 33+. Camera/mic runtime prompts are already handled by Capacitor's BridgeWebChromeClient (Android) and WebViewDelegationHandler (iOS) with the declarations added earlier. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
…ive.app The app id is effectively immutable once builds are distributed (store listings and update paths are tied to it), and io.huly.platform is derived from a domain/brand this fork is moving away from. Display name and icons intentionally keep Huly branding until the new brand is chosen — those are cheap to swap later. - Android: namespace/applicationId, Java package move, package_name and custom_url_scheme strings - iOS: PRODUCT_BUNDLE_IDENTIFIER - capacitor.config.ts appId, README Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
faker-generated space names like 'late' or 'dis' substring-match other
nav buttons ('Templates', 'discontinue'), tripping Playwright strict
mode in ES-40 (TESTS-391).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Overview
Adds an iOS/Android mobile app that wraps the Platform web frontend in a Capacitor native shell, plus a CI pipeline that produces installable Android test artifacts on every change.
Mobile shell (
mobile/)dev/prodis copied intowww/and loaded from local resources (local-first: the app opens without a server; backend URLs come from the bundledconfig.json).WebViewClient(Android) andWKNavigationDelegate(iOS) intercept load failures (connection refused, timeout, no network) and show a native "Connection Error" screen with a Retry button. Both platforms monitor connectivity; the splash screen is held until the WebView loads.DownloadManager(public Downloads dir, cookie passthrough, completion notification) — previously they were silently ignored.org.platformcollective.app— brand-neutral, chosen before any distribution since store listings and update paths are permanently tied to it. Display name and icons intentionally keep Huly branding until the new brand is decided.versionCode/versionNameoverridable via env; CI stamps the run number.Web app changes
dev/prod: branding fetch no longer crashes app boot whenBRANDING_URLis unreachable; a fallback error UI is shown if platform initialization fails outside the native shell.config-mobile.json(local dev) andconfig-mobile-huly.json(huly.app cloud, absolute file URLs usable from a device — used by CI). The copy script acceptsMOBILE_CONFIGto select the bundled config.CI
Mobileworkflow (.github/workflows/mobile.yml): builds the web bundle →cap sync→gradlew assembleDebug→ uploads thehuly-android-debug-apkartifact (14-day retention). Runs on pushes/PRs touchingmobile/and manually via workflow dispatch with a selectable config input. iOS is not built in CI yet (needs a macOS runner and Apple signing).mobileadded to theCacheFolderscache list (svelte-check/test rely on it to carry.rush/tempstate), aformatstub script, and a pnpm-lock update.Testing
huly-android-debug-apkartifact from the latest Mobile workflow run and install it.Known gaps (follow-ups)
🤖 Generated with Claude Code
https://claude.ai/code/session_019FZunPGufTZSRHuyTkTrny