Librechat-Mobile
CLAUDE.md149 starsChanged 7 days agoApache-2.0View on GitHub
Setup runbooks for every release workflow: docs/RELEASING.md.
- Reads credentials
In this repository13 other files it gives its agents.
- app/CLAUDE.mdCLAUDE.md
- build-logic/CLAUDE.mdCLAUDE.md
- CLAUDE.mdCLAUDE.md
- fastlane/CLAUDE.mdCLAUDE.md
- shared/CLAUDE.mdCLAUDE.md
- audit-depsSkill
- audit-i18nSkill
- audit-paritySkill
- marketing-refreshSkill
- release-highlightsSkill
- small-screensSkill
- sync-upstreamSkill
- update-web-assetsSkill
The file
Files
GitHub CI/CD
Setup runbooks for every release workflow: docs/RELEASING.md.
Apple App Store upload — .github/workflows/appstore.yml
- Manual only (
workflow_dispatch, requiredtag); cutting a GitHub release never uploads to Apple. - One
uploadjob onxcode-27(Xcode pinned, see Environment),environment: release(reviewer-gated secrets). - Xcode cloud signing via an App Store Connect API key: no certificates or profiles stored anywhere;
-allowProvisioningUpdatesmanages them. - Archives the tag with scheme
iosApp AppStore, configurationRelease-AppStore(SWITCHBOARD_CHANNEL=appstore), and fails unless the archived Info.plist saysSwitchboardChannel=appstore. PlainReleaseis the open-source channel (release.yml's sideload IPA). xcodebuild -exportArchivewithmethod: app-store-connect,destination: upload(no altool/fastlane).IOS_BUILD_NUMBER_SUFFIX(run_number×100 + run_attempt) makes the "Stamp Version" phase emit a uniqueCFBundleVersion(YYYYMMPP.N) per upload.- Uploads
dSYMs/as artifactdSYMs-<tag>-<run>-<attempt>(90 days) before the App Store upload; after that, App Store Connect's copy is the only one. - Secrets (
releaseenvironment):ASC_API_KEY_P8_BASE64,ASC_API_KEY_ID,ASC_API_ISSUER_ID,APPLE_TEAM_ID.
Google Play upload — .github/workflows/play.yml
- Manual only (
workflow_dispatch:tag,trackdefaultinternal,status—draftuntil the app's first release has been reviewed). Cutting a GitHub release never uploads to Google. - Refuses any tag not
vYYYY.MM.N: an-rcNshares its final release's versionCode, which Play accepts once. ubuntu-latest,environment: release. Builds:app:bundlePlayRelease -PbuildPlay(theplayReleasevariant is disabled without the flag), signed with the sameSIGNING_*key as the open-source APK.- Fails unless the bundle is
com.garfiec.librechat.playwith the release certificate, then uploads it and the R8 mapping viar0adkll/upload-google-play(SHA-pinned). Native debug symbols ride in the bundle (playflavordebugSymbolLevel). - Extra secret:
PLAY_SERVICE_ACCOUNT_JSON(runbook: "Distribution channels").
F-Droid reproduce — .github/workflows/fdroid-reproduce.yml, scripts/fdroid-reproduce.sh
- Triggers: stable release published (prereleases skipped),
workflow_dispatchwithtag, and PRs todeveloptouching the workflow or script (rebuild the latest release). Don't run it from release.yml: a draft's assets 404, which reads as a mismatch. - Rebuilds the tag in
registry.gitlab.com/fdroid/fdroidserver:buildserver-trixiewith fdroidserver master and the live fdroiddata recipe;fdroid buildcompares against our published APK and checks the signer againstAllowedAPKSigningKeys. A tag missing aBuilds:entry gets one copied from the last. Artifactfdroid-reproduce-<tag>has the log and recipe. - Can't gate a release (needs the published APK). On
release, checkout is the tag, so only tags containing this workflow run automatically; dispatch for older ones.
F-Droid watch — .github/workflows/fdroid-watch.yml, scripts/check-fdroid-published.py
- Daily 15:17 UTC +
workflow_dispatch; builds nothing. Fails when F-Droid's latest cycle lists our latest stable release underfailedBuilds, or the release is > 4 days old and F-Droid still suggests an older versionCode. So it is red daily until F-Droid catches up. - Both F-Droid workflows alert only via GitHub's failed-workflow email (reproduce: the release publisher;
watch: whoever last changed its
cron:line); nothing posts to issues or releases. GitHub disables scheduled workflows after 60 days without repository activity.
CI — .github/workflows/ci.yml
Triggers: push to develop, PRs targeting develop. Concurrency cancels in-progress runs on the same branch.
lint:scripts/check-native-test-names.py(fails on any backtick-quoted declaration name, main or test, Kotlin/Native rejects:. , ; : / \ < > [ ], in any iOS-compiled source set — the JVM accepts some, so otherwise onlyiosnotices);./gradlew detekt :app:lint --continue(detekt covers every source set;DetektConventionPlugin); uploads detekt SARIF to Code Scanning (needs Advanced Security on private repos) + lint HTML.test:./gradlew test.android::app:assembleDebug(bothfossDebugandplayDebug);:feature:chat:assembleDebugAndroidTestas a compile-only gate (keep it scoped: a repo-wideassembleDebugAndroidTestalso compiles:app's staleandroidTest);scripts/verify-speech-services.py --manifest-only(both flavors declare the speech<queries>; the device half runs locally only). Uploads thefossDebugAPK (90 days) and posts its link to the PR.ios:iosSimulatorArm64Testfor:shared,:core:ui,:core:common,:core:data,:core:model,:core:network,:core:logging,:feature:chat,:feature:conversations(runsiosTestandcommonTestfor iOS). A new module with acommonTestoriosTestmust be added to this list, or its tests never compile or run for iOS in CI (the ubuntutestjob can't run Kotlin/Native). Caches~/.konan. Thenxcodebuildfor the simulator (arm64, no signing); the framework comes from the Xcode "Compile Kotlin Framework" phase (:shared:embedAndSignAppleFrameworkForXcode), no separate link step.ios-release-link(OOM canary)::shared:linkReleaseFrameworkIosArm64, the Release device link the release/appstore archives run. Debug/simulator builds skip whole-program optimization, so only this catches the Release link's DevirtualizationAnalysis OOMing the 7 GB runner (KT-80367); don't drop it.- CI does no release signing. Instrumented tests are never executed in CI (no emulator);
:feature:chat's suite is compile-only. The iOS app is built, not uploaded.
Environment
lint,test,android:ubuntu-latest, JDK 21.- iOS jobs (
ios,ios-release-link, release'sios, appstore'supload):xcode-27(Apple Silicon; there is noiosSimulatorX64target), JDK 21. - Xcode is pinned to
'27.1', notlatest-stable: only an iOS 27.1 SDK build fills the iPhone Duo inner display, andlatest-stabledrifts. setup-xcode matches a plain version only against non-beta Xcode, so a beta pin fails at "Select Xcode". Bump the pin deliberately, in all four jobs together.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

