Apple PosterBoard .tendies wallpapers, rendered as native Android live wallpapers.
The lock, AOD, and home states are driven by the source wallpaper's own CAML transitions.
Tendroid can browse the independently maintained Tendroid Gallery from inside the app. Catalog packages are size-bounded, restricted to the gallery repository, verified against their published SHA-256, and then processed by the same safe importer as local files.
Creators can submit handmade or AI-assisted wallpapers through a gallery pull request. Each submission contains a manifest, preview, and .tendies package, and must declare its author, source, redistribution rights, license, supported states, and minimum Tendroid build. See the submission guide.
- Imports
.tendiespackages through Android's document picker. - Browses the independently maintained Tendroid Gallery, verifies each download, and imports it without leaving the app.
- Renders layered CAML scenes with images, text, nested transforms, opacity, and masks.
- Maps PosterBoard
Sleep,Locked, andUnlockstates to Android AOD, lock screen, and home screen. - Reproduces per-property timing and
CASpringAnimationtransitions. - Tracks the device's active refresh mode instead of forcing a fixed frame rate.
- Restores a cached AOD frame if Android recreates the wallpaper process.
- Checks GitHub Releases in-app and verifies the published SHA-256 before opening Android's installer.
- Download
tendroid-debug.apkfrom GitHub Releases. - Allow installs from the browser or file manager when Android asks.
- Open Tendroid, import a
.tendiespackage, then choose Set live wallpaper.
Tendroid currently ships as a signed prerelease build. The asset keeps its historical tendroid-debug.apk filename so older installed builds can discover updates, but the APK itself is a non-debuggable release build. A persistent project key lets later builds update it in place; do not install APKs carrying a different signing certificate over an existing installation.
| Feature | Status |
|---|---|
CALayer, CGImage, CATextLayer |
Supported |
| Nested transforms and state overrides | Supported |
Sleep / Locked / Unlock |
Supported |
| Per-key-path timing and spring curves | Supported |
| Samsung AOD and adaptive refresh rate | Tested on device |
| Early unlock gesture signal | Supported where the OEM forwards it |
| Continuous raw lock-screen swipe progress | Not exposed to third-party wallpapers on every OEM |
| PosterBoard JavaScript host objects | Not supported |
JavaScript is not executed. PosterBoard scripts depend on Apple-only objects such as layer, document, and system; safely supporting them requires a constrained compatibility runtime, not a generic JavaScript engine.
Packages are copied into app-private storage under a SHA-256 content ID. Before rendering, Tendroid enforces limits for entry count, compressed and expanded sizes, XML depth, texture dimensions, and decoded bitmap memory. It also rejects duplicate entries, traversal paths, external entities, DTDs, and oversized CAML documents.
Requirements: JDK 17 and Android SDK 36.
GRADLE_USER_HOME="$PWD/.gradle" \
./gradlew testDebugUnitTest lintRelease assembleReleaseThe unsigned local APK is written to app/build/outputs/apk/release/app-release-unsigned.apk. CI supplies the persistent signing key and produces the installable release asset.
To run the parser suite against a real package without committing it:
GRADLE_USER_HOME="$PWD/.gradle" \
TENDIES_SAMPLE=/absolute/path/to/sample.tendies \
./gradlew testDebugUnitTest --rerun-tasksEvery push to main repeats the tests and lint, builds the signed APK, and publishes a GitHub prerelease.
Tendroid is an experimental compatibility renderer, not an Apple or Android system component. OEM lock-screen behavior differs, and some transitions necessarily use the nearest signal available from Android's public wallpaper APIs.
