Completed milestones
Closed work and evidence. Active work lives in ROADMAP.md. Technical behavior belongs in topic documentation under documentation index.
Google Play authentication
Resolved with GOOPDL_ACCOUNT_EMAIL and GOOPDL_AAS_TOKEN account-based authentication (aas_et/-prefixed token), documented in docs/authentication.md; no anonymous dispenser or committed credential required. Anonymous AuroraOSS dispenser access remains unavailable from GitHub-hosted runners (HTTP 403); CI falls back to verified APKMirror delivery when account secrets are absent. Rejected any option requiring committed credentials or a shared account.
Documentation overhaul
Reviewed uv-based Python project README conventions and j-hc/revanced-magisk-module as structural prior art, then rewrote published documentation for human-first navigation.
README.md: centered header with slogan and badges, description, requirements, features, installation, quick start,morphe.tomloverview, usage tables, documentation index, and credits.docs/README.md: index grouped into starting guides, setup, build pipeline in reading order, security and releases, contributing, and project status.- Rewrote all eleven topic documents with sections, option and field tables, and stated rationale:
cli.md(per-command reference, conventions, exit codes),configuration.md(complete field reference with defaults and validation rules),toolchain.md,providers.md,merge.md,build.md,google-play-integrity.md,modules.md,security.md(now including explicit non-goals),releases.md, andTHIRD_PARTY.md. - Credited Morphe,
j-hc/revanced-magisk-module, APKEditor, uber-apk-signer, and ReVanced; verified every relative documentation link resolves.
Signed merged stock APK
- APKEditor merged stock output stays marked
google_signature_retained = false. uber-apk-signerremains sole signer for merged stock and patched APKs.- Builder signs merged stock immediately after merge, verifies package/version/architecture/ZIP/certificate before Morphe patching, and patches from signed stock.
- Merge provenance records signed-stock hash and certificate SHA-256.
- Regression coverage verifies signed merged stock and merge provenance.
Verified template
- Registered
Manual verified buildon default branch forworkflow_dispatch. - Confirmed committed template keystore selection and validation without secrets.
- Confirmed template certificate signs every release-matrix APK (run 30224125858).
- Published and verified test release v0.0.0-test.4: release-manifest hashes, both update JSON files, and GitHub provenance passed (run 30249842874).
Google Play anonymous auth fails from GitHub-hosted runners when AuroraOSS returns HTTP 403. CI falls back to verified APKMirror delivery; no credential is published.
Config-driven applications
- Removed hardcoded YouTube/YouTube Music app registry.
- Added TOML-controlled output slug and patched package behavior.
- Added Reddit generic-app regression coverage.
- Resolved APKMirror catalog pages through architecture-specific APK/APKM assets; validated Cloudflare R2 delivery and split extraction (run 30224125858).
- Resolved Uptodown catalog pages through requested APK/XAPK architecture assets.
Signer policy
- Kept
EXPECTED_SIGNERSenforcement for YouTube and YouTube Music; unsigned, malformed, and mixed-signer sets remain rejected. - Added optional per-app
expected-signerSHA-256 TOML pin. - Provenance and build summaries record observed signer certificate SHA-256.
- Unpinned valid signer acceptance emits an explicit build event and documents provider-served signer trust.
Package layout
- Moved flat
src/morphe_*.pymodules intosrc/morphe_builder/and replaced filename prefixes with package-relative imports.
Per-app toolchains
- Per-app
patches-source,patches-version,cli-source, andmorphe-versionoverride[toolchain]defaults. - Sources are validated as
owner/repobefore download. - Cache and
toolchain-provenance.jsonkeys includeowner/repo@resolved-tag. - Toolchains prepare once per distinct source and record exact source, tag, and asset hash.
- Regression coverage builds two apps using different patch sources.
Patch-source and config policy
- Each app invokes Morphe with one
--patchesbundle; bundle stacking is unsupported. - Kept ordered
[[apps]]tables because named tables lose ordering and indexed validation errors. - Deferred
[defaults]for density, architecture, and Google Play settings until four or more apps make repetition exceed merge complexity. - Regression coverage rejects multiple patch sources and asserts one
--patchesargument.
Module stock replacement
customize.shinstalls signedstock/base.apkwhen installed stock version differs from module target.- If signer mismatch prevents update, it replaces package; this removes app data and is documented.
- Regression coverage proves version-mismatch installation path and missing-payload abort.
Release readiness
- GitHub-hosted Ubuntu CI validates setup from fresh runners; Windows setup was validated during primary Windows development.
- Documented public shared template-key trust limit prominently in
docs/releases.md. - Added daily config-driven verified-update workflow. It resolves effective CLI/patch source-version tuples, compares tags and SHA-256 values with published APK provenance, skips unchanged toolchains, and blocks publication unless APK version or hash changes.
- Declared stable after user validated application and module behavior on ARM64 device.
Test-release artifact matrix
v0.0.0-test.4 built and released:
- YouTube ARM64 non-root APK and module.
- YouTube ARMv7 APK and module.
- YouTube Music ARM64 non-root APK, root APK, and module.
- YouTube Music ARMv7 non-root APK, root APK, and module.
Artifact matrix is complete.
