Core Builds Apps # Core Builds Apps **Seven Android apps. Same brand, same living-room bar.**
--- > | App | Current | What it does | Downloader | Release tag | > |---|---:|---|---|---| > | **[Core Builds Icon Pack](#-icon-pack)** | `v1.8.18` | 933 transparent icons + 68 wallpapers for Projectivy Launcher | `5270601` | [`v*` / `iconpack`](../../releases) | > | **[Core Builds Pixel Neon](#-pixel-neon-icon-pack)** | `v0.1.0` | 933 transparent 8-bit neon icons + 70 wallpapers for Projectivy Launcher | `[USER TO SUPPLY]` | [`pixel-neon-v*` / `pixel-neon`](../../releases) | > | **[Core Builds Pop](#-core-builds-pop)** | `v1.0.0` | The same 933 icons, pop-art cartoon: 16 swatches, one container | `[USER TO SUPPLY]` | [`pop-v*` / `pop`](../../releases) | > | **[Core Line](#-core-line)** | `v1.3.0` | Sports scores & channel RSS ticker (chyron) | `7375676` | [`coreline-v*` / `coreline`](../../releases) | > | **[Core Shift](#-core-shift)** | `v2.3.5` | Android TV screensaver + motion wallpaper browser | `8829421` | [`shift-v*` / `shift`](../../releases) | > | **[Core Motion](#-core-motion)** | `v1.0.0` | Projectivy wallpaper-provider plugin for Core Motion loops | `[USER TO SUPPLY]` | [`motion-v*` / `motion`](../../releases) | > | **[Core Doctor](#-core-doctor)** | `v0.1.0` | Local-only streaming and suite diagnostics (phone) | `8664938` | [`doctor-v*` / `doctor`](../../releases) | > > Each app has its own CI workflow and release tag. Do not merge Gradle roots, split the repo, or repoint floating Downloader tags. --- ## πŸ”· Icon Pack **Transparent app icons for Projectivy Launcher on Android TV.** `933 icons` Β· `68 wallpapers` Β· `v1.8.18` The **Core Builds Icon Pack** is designed for the [Projectivy Launcher](https://play.google.com/store/apps/details?id=com.spocky.projengmenu) on Android TV and Google TV, built to the [Core Builds Brand & Style Guide v1.0](https://github.com/brevityA/Core-Builds). Icons share the **Core Builds visual language**: original geometry, rounded-line brand motifs, one accent and transparent backgrounds. The reviewed glyphs use the canonical **32px main stroke**, with 26.2px / 21.8px detail. Brand references inform the recognisable cue and colour; they do **not** replace the pack's style with filled vendor silhouettes or custom logotypes. The existing Outfit fallback letters remain unchanged. [Reference provenance and rights](THIRD_PARTY_NOTICES.md). **v1.8.16 β€” the pack's own launcher badge finally looks like the brand.** The old icon was a thin wireframe mark on flat night that all but disappeared on dark living-room launchers. The generator now renders a depth-gradient disc with an edge keyline, heavier glowing hexagon linework and a lit diamond, and the adaptive icon gets a real gradient-field background behind the lit mark. Everything still comes from `tools/build_branding.py`; before/after in `docs/icon-before-after.png`. **v1.8.15 β€” Monet Launcher never reads the system wallpaper, so "Set wallpaper" was a no-op on every Monet home screen.** Found by decompiling Monet v1.0.84: the APK has no `WallpaperManager` reference at all, but since v1.0.72 it exports a share target that copies images into Monet's own background library. The preview button now reads **Send to Monet** when Monet is HOME and hands the cached file straight over (no permissions, no export first); the export screen offers **Send N to Monet** for a whole selection. Icon apply to Monet stays manual β€” v1.0.84 has no inbound apply intent β€” but the path now names the 1.0.80 layout, *Settings β†’ Apps β†’ Icon pack*. Research and APK evidence in `docs/MONET_LAUNCHER.md`. **v1.8.14 β€” two thirds of the pack was a letter in a box, and 429 icons shipped the same picture as another icon:** hashing all 926 drawables returned only **655 distinct images**. 608 fell back to a `tile_*` monogram and accents come from a cycled palette of 49, so a shared letter plus a shared palette slot produced a byte-identical PNG β€” one file served seven apps. **56 new marks now cover 58 apps** in the categories a Core Builds user actually runs: debrid clients, players, launchers, browsers, file and network tools. **74 monograms showed a letter the app name does not contain** (Corridor showed W, Crave showed B); 72 are repointed. **30 marks collapsed at a 48px Projectivy tile** β€” MUBI lost all seven counters and read as a solid rectangle, DS file sat at 53% ink β€” so **36 glyph shapes** are redrawn to a 32px minimum counter. Two needed the raster pipeline to get right: `presence.py` dilates every edge by the keyline radius, so MUBI's rings merged even with the vector counters open. Duplicates **429 β†’ 34**, distinct artworks **655 β†’ 902**, glyphs losing counters **30 β†’ 0**. 549 icons are still letter tiles; that tail is a programme, not a sprint. > **Tip:** Use a **dark card background** in Projectivy. These icons are drawn for night chrome (`#0d1117`). > **Note:** Designed and mapped against Android TV / Google TV builds of each app. Devices running mobile variants sometimes expose a different launcher activity β€” if an icon doesn't auto-assign, [open a prefilled issue](#request-an-icon) with the component name and it gets added. ### Request an icon Both issue forms are deep-linked: a report opens on the right template with the right title and label already set β€” no chooser, no retyping the prefix. Field values ride on the same URL. Only `input` and `textarea` fields accept a prefill, so every required dropdown and confirm box is still answered by the reporter β€” a link can never tick a gate for them. | Open | Use it when | A link can prefill | Only in the form | Title / label | |---|---|---|---|---| | [🎨 New icon request](https://github.com/brevityA/CoreBuildsApps/issues/new?assignees=&labels=icon+request&projects=&template=1.new_icon_request.yml&title=%5BIcon%5D+) | Request an icon for an app that isn't in the pack yet. | App name\* Β· Component name Β· Store or download link\* Β· Anything else | Device type\* Β· Confirm | `[Icon]` Β· `icon request` | | [πŸ”§ Icon not auto-assigning](https://github.com/brevityA/CoreBuildsApps/issues/new?assignees=&labels=mapping&projects=&template=2.icon_not_applying.yml&title=%5BNot+applying%5D+) | The app is in the pack, but its icon doesn't appear on your device. | App name\* Β· The component name on YOUR device\* Β· Device and OS\* | Launcher\* Β· Confirm | `[Not applying]` Β· `mapping` | One app per issue, and check [docs/IconPackList.md](docs/IconPackList.md) by name, drawable and package first β€” a listed app that isn't applying belongs on the other form. For one specific app, let the generator build the link you paste into a reply: ```bash python tools/build_issue_prefills.py --app Stremio \ --template 2.icon_not_applying.yml \ --component com.stremio.one/com.stremio.tv.MainActivity ``` ```text https://github.com/brevityA/CoreBuildsApps/issues/new?assignees=&labels=mapping&projects=&template=2.icon_not_applying.yml&title=%5BNot+applying%5D+Stremio&app_name=Stremio&component=com.stremio.one%2Fcom.stremio.tv.MainActivity ``` Generated from `.github/ISSUE_TEMPLATE/` by `tools/build_issue_prefills.py`. Edit the forms, re-run the generator β€” `--check` fails this block on drift. --- ### Install 1. Download using the existing **Downloader code `5270601`**, or use the permanent APK URL: **https://github.com/brevityA/CoreBuildsApps/releases/download/iconpack/iconpack-release.apk** Versioned builds remain available from [**Releases**](../../releases) under `v*` tags. The `iconpack` release is a floating stable target; do not use the repository-wide `latest/download/...` URL as a permanent link because Core Line has separate releases in this repository. 2. Sideload it (Downloader, `adb install`, or a file manager). 3. Open the app and press the **apply** button β€” it detects your launcher and hands off directly. Or apply manually: **Projectivy Launcher Settings** β†’ **Appearance** β†’ **Cards** β†’ **Icon Pack** β†’ **Core Builds Icon Pack** > **Android 11+:** The APK declares a `` block so launcher detection works under package-visibility filtering. No `QUERY_ALL_PACKAGES` permission required. > **Updates:** At launch the app checks `Latestrelease/version.json`. If a newer build exists, a **Download** button pulls the APK from GitHub and opens the system installer. --- ### What's covered 926 icons across 21 categories β€” streaming, media centres, debrid services, players, launchers, tools, stores, live TV, music, sport, gaming, VPN, browsers, files, and more. Highlights: **[NoBuffr](https://downloads.nobuffr.com/android/nobuffr.apk)**, Stremio, Kodi, Jellyfin, Emby, Plex, Nuvio TV, Syncler, Weyd, TorBox, Real-Debrid, AllDebrid, Premiumize, Trakt, VLC, MX Player, SmartTube, YouTube, Spotify, Twitch, Downloader, Aurora Store, TiviMate, TV Bro, SYNC, LocalSend, RS File Manager, Sparkle TV, DS file, Ultimate File Manager Pro β€” plus Netflix, Prime Video, Disney+, Max, Apple TV, Stan, Binge, Kayo, ABC iview, 9Now, 7plus, 10 Play, SBS, and 860+ more. Full table with every mapped component: [**docs/IconPackList.md**](docs/IconPackList.md)
All icons
--- ### Wallpapers 68 curated wallpapers in five active series β€” browse in the Wallpapers tab, preview full-screen, Set as device wallpaper or Save to `Pictures/CoreBuilds`. Multi-select export lets you bulk-save to a folder any launcher (or the system wallpaper picker) can rotate from. Thumbnails are bundled; the full images download on demand from GitHub, at the resolution each series was authored at (`1376Γ—768` for series 6, 4K for series 1–3 and 7). Series 4 "Core Mark" was retired in v1.8.6 β€” see [`Wallpapers/README.md`](Wallpapers/README.md). --- ### 16:9 Banners Every icon ships a **320Γ—180 transparent banner** for Projectivy's wide-card layout. Third-party app banners use the same **monoline glyph + cyanβ†’violet rail + category + path-outlined Outfit Bold name** β€” including NoBuffr and Plex. No standalone vendor-wordmark exception. The pack's own Core Builds mark remains unchanged. Generated from `tools/build_banners.py`. Appfilter maps to banners by default; square icons stay opt-in via `drawable.xml`. --- ### Branding assets The pack's own identity β€” Leanback banner, launcher icon at true sizes, adaptive-icon masks, and a home-row mock.
Branding assets
| Asset | Path | Size | | --- | --- | --- | | Leanback banner | `res/drawable-nodpi/cb_banner.png` | 320Γ—180 dp (640Γ—360 px) | | Launcher icon | `res/mipmap-{xhdpi,xxhdpi}/ic_launcher.png` | 96 / 144 px | | Adaptive foreground | `res/mipmap-{xhdpi,xxhdpi}/ic_launcher_foreground.png` | 216 / 324 px | | Adaptive icon | `res/mipmap-anydpi-v26/ic_launcher.xml` | mark on `#0d1117` | Regenerate with `python tools/build_branding.py && python tools/build_brand_preview.py`. --- ### Adding an icon Everything generates from one file β€” `tools/catalog.json`. You never hand-edit XML. ```jsonc { "name": "Example TV", "drawable": "example_tv", // a-z0-9_ , unique "color": "#00D4FF", // the app's accent "glyph": "play_round", // from tools/glyphs.py "components": ["com.example.tv/.MainActivity"] } ``` Then regenerate and verify: ```bash pip install -r tools/requirements.txt python tools/build_icons.py # SVGs, PNGs, appfilter, docs, preview python tools/build_banners.py # 16:9 monoline banners python tools/build_branding.py # launcher icon + TV banner python tools/validate.py # 22,800+ coherence checks ``` **Finding a component name** for an installed app: ```bash adb shell dumpsys package com.example.tv | grep -A1 "android.intent.action.MAIN" ``` Need a new shape? Add a function to `tools/glyphs.py` and register it in `GLYPHS`. Glyphs are plain SVG path strings on the 512 grid β€” stroke `34`, safe area `432`, rounded caps and joins. --- ### Building the APK CI does it on every push: [`.github/workflows/build.yml`](.github/workflows/build.yml) regenerates assets, **fails if the committed files drift from the catalog**, runs the validator, then builds and uploads the APK. Push a `v*` tag to cut a release β€” CI verifies the tag is on `main` and its versionName matches, so a mis-placed tag fails before it publishes. On tag release, CI also syncs `Latestrelease/version.json` so the in-app update checker stays current automatically. Locally (needs JDK 17 + Android SDK): ```bash ./gradlew assembleDebug # unsigned, installable ./gradlew assembleRelease # signed if keystore env vars are set ``` Release signing reads `KEYSTORE_PATH`, `KEYSTORE_PASSWORD`, `KEY_ALIAS`, `KEY_PASSWORD`. In CI, store the keystore as the base64 secret `KEYSTORE_BASE64`. --- ### Design rules Inherited from the brand guide, enforced by the generator and validator: | Rule | Why | | --- | --- | | Transparent background, always | the launcher owns the card colour | | 512 grid Β· 432 safe area Β· 34 stroke | survives 10-foot downscaling | | One accent per glyph; 32px round primary strokes with subordinate detail | reviewed brands use the same geometric language, not a collection of vendor styles | | Original Core Builds linework; vendor material is reference-only | brand recognition must not override the pack's identity | | The hex stance is never rotated | the point-up hexagon is load-bearing | | Shared 3:1 dark-card contrast floor | squares, banners and previews use the same light-ink alternative when needed | | `isShrinkResources = false` | drawables resolve by name at runtime | --- ## πŸ”· Pixel Neon Icon Pack **The 8-bit neon companion pack for Projectivy Launcher on Android TV.** `933 icons` Β· `70 wallpapers` Β· `0.1.0` Β· clean monoline sibling: **Core Builds Icon Pack** If the original pack is the quiet night-mode set, **Core Builds Pixel Neon** is its arcade cabinet: the same mappings and coverage, but every mark is drawn as a unique 32 px sprite, given a violet/cyan bloom, and scaled with hard nearest-neighbour pixels. Brand glyph cues from the catalog become independently drawn tile monograms, play marks, eyes, shields, waves, and other recognizable pixel signals; each sprite also varies in silhouette, internal pattern, and pose instead of reusing the monoline geometry. The PNGs remain transparent, so the launcher still owns the card colour. ![Core Builds Pixel Neon preview](pixel-neon/docs/preview.png) ### Install Download the `pixel-neon-release.apk` asset from the [**Pixel Neon stable release**](../../releases/tag/pixel-neon), or use the versioned `pixel-neon-v*` release tags. Sideload it beside the original pack β€” the two packages are separate and can be selected independently: - **Core Builds Icon Pack** β€” `tv.corebuilds.iconpack` - **Core Builds Pixel Neon** β€” `tv.corebuilds.pixelneon` Open the app and press **Apply**, or choose it manually in **Projectivy Launcher Settings β†’ Appearance β†’ Cards β†’ Icon Pack β†’ Core Builds Pixel Neon Icon Pack**. The pack includes the same full/short component mappings and 16:9 banner fallback as the original, plus individually generated square pixel sprites for per-app selection. Banners use three arcade sign layouts rather than the original rail-and-wordmark treatment. Pixel Neon also includes its own 70-wallpaper 8-bit collection: original pixel-art scenes across arcade grids, cyber circuits, space runs, neon nature, and boss-stage arenas. Thumbnails and the manifest are bundled for offline browsing, while full 4K sources download only when a preview or export needs them. Set a preview directly when supported, save it to `Pictures/CoreBuilds` for launcher rotation, or bulk-export a selection with progress, cancellation, and retry support. The renderer is derived from the one source catalog, so new component coverage lands in both packs together. See [`pixel-neon/README.md`](pixel-neon/README.md) for the build and regeneration commands. The research-informed sprite rules are documented in [`pixel-neon/DESIGN.md`](pixel-neon/DESIGN.md). ## πŸ”· Core Builds Pop **The same 926 icons, drawn as pop art.** Android TV's only cartoon icon pack. `933 icons` Β· `12 wallpapers` Β· `16 swatches` Β· `v1.0.0`

Core Builds Pop contact sheet

Where the classic pack is transparent and lets Projectivy own the card, **Pop brings its own card**: one superellipse container, a heavy ink keyline, a cream mark, and a Ben-Day halftone screen β€” the neo-brutalist / comic-book language, executed as a system rather than as a mood. Both packs are generated from the same `tools/catalog.json`, so **coverage can never diverge** β€” a component mapped in one is mapped in the other, and `tests/test_pop.py` fails the build if that stops being true. ### Uniform, by construction The brief was "uniform but high quality", and those usually fight. Pop resolves it by making the loudness the constant. Five invariants, each enforced in `tools/popart.py` and checked by `tools/validate_pop.py` β€” not written down in a style guide and hoped for: | Invariant | What it replaces | |---|---| | One superellipse container on all 926 | no container; every launcher looked different | | 171 brand accents β†’ **16 locked swatches**, snapped by hue | 171 unbounded accents | | Every mark optically normalised to one ink box | mark sizes varying by more than 2Γ— | | Line weight snapped **after** scaling, not before | strokes thinning as glyphs grew | | One halftone screen, one angle, one pitch | β€” | The palette keeps colour-as-language β€” Netflix stays red, Spotify stays green β€” and takes away only the saturation and value, which were never carrying meaning. Every swatch, its app count, and a real icon rendered in it: [**docs/pop-palette.png**](docs/pop-palette.png). The biggest single legibility win is the third rule. 549 of the 926 icons are a letter inside a rounded box; Pop's container **is** that box, so the box is dropped and the letter is scaled to the same ink box as every other mark. The letters roughly double in size. ### Covers apps it has never seen Pop's whole claim is one container, and a single unthemed app breaks that claim on sight. So the pack hands the launcher the furniture to build one: an `iconback` in each of the 16 swatches, an `iconmask`, an `iconupon` keyline and a `scale` factor. Apps we do not cover get the Pop field, halftone and ink keyline with their own icon composited inside β€” so the answer to "926 icons" is really *every app on your device*. No other Android TV pack ships this. Pop also themes **Projectivy's own cards** β€” settings, categories, channels and HDMI 1–4 / AV inputs, numbered so you can tell which input is which. That uses the internal-activity mapping Projectivy added in 4.70 ([miproja1#512](https://github.com/spocky/miproja1/issues/512)), answering a [posted request](https://www.reddit.com/r/Projectivy_Launcher/comments/1icfbn7/how_to_i_install_icon_packs_also_can_i_make_my/) that no pack had filled. ### Matching wallpapers Twelve 4K walls in `series-5-pop`, built from the same primitives as the icons β€” same swatches, same ink, same halftone. Dark-weighted with a calm lower half, because that is where Projectivy draws its card rows.

Core Builds Pop wallpapers

Flat art needs no grain dither, which means it survives an indexed palette losslessly: the whole 12-wall 4K series is **2.5 MB**. ### Install Pop is a **separate APK with its own package**, so you can install it alongside the classic pack and switch between them in Projectivy's own icon-pack list. 1. **https://github.com/brevityA/CoreBuildsApps/releases/download/pop/corepop-release.apk** (versioned builds under `pop-v*` tags) 2. Sideload, open, press **apply**. 3. Or: **Projectivy Settings** β†’ **Appearance** β†’ **Cards** β†’ **Icon Pack** β†’ **Core Builds Pop** > **Tip:** Pop icons carry their own field colour, so set Projectivy's card > background to something dark and neutral and let the icons do the colour. ### Build it ```bash python tools/build_pop.py # 926 icons + 926 banners + branding (~5 min) python tools/build_pop_wallpapers.py # 12 Γ— 4K walls + thumbs + manifest (~70 s) python tools/validate_pop.py # 13,700+ coherence checks python tests/test_pop.py # 24 contract tests ``` `tools/pop_glyph_metrics.json` is a committed measurement of every glyph's ink bounding box. It exists so the generators are a pure function of committed inputs β€” measuring at render time would make the output depend on which rasteriser version CI happened to install, and the SVG drift gate would fail on an unrelated dependency bump. Re-run `tools/measure_pop_glyphs.py` only when glyph geometry actually changes. ### Why this pack exists Full research, with sources: [**docs/research/iconpack-demand-2026.md**](docs/research/iconpack-demand-2026.md) [**docs/research/wallpaper-directions.md**](docs/research/wallpaper-directions.md), and [**docs/research/android-tv-icon-packs.md**](docs/research/android-tv-icon-packs.md) β€” the launcher landscape, the ADW spec features packs leave unused, and a prioritised roadmap. The short version: Android TV has roughly three icon packs, and all three are minimal line art. Pop art / cartoon sells well on phones β€” the leading pack in that style ships 7,850 icons and bundles matching halftone wallpapers β€” and nobody ships it on TV. Coverage was already won here at 926 icons; style was the open axis. --- ## πŸ”· Repo Layout ``` tools/catalog.json the single source of truth tools/glyphs.py original Core Builds glyph primitives (no vendor override) tools/brandmarks/ pinned reference-only SVGs (provenance in catalog) tools/icon_style.py shared Classic dark-card colour policy tools/typeface.py Outfit Bold/ExtraBold β†’ SVG paths tools/fonts/ Outfit OFL sources for wordmarks + monograms tools/build_icons.py catalog β†’ SVG, PNG, appfilter, docs tools/build_banners.py catalog β†’ 16:9 monoline banners tools/build_branding.py launcher icon + Leanback banner tools/build_brand_preview.py branding preview sheet tools/build_pixel_neon_wallpapers.py original 8-bit Pixel Neon wallpapers tools/build_pixel_neon.py catalog β†’ 8-bit neon companion pack tools/validate_pixel_neon.py alternate-pack coherence checks tools/validate.py coherence checks (20,000+ at 926 icons) tools/popart.py Pop render engine (container, ink, halftone, fit) tools/measure_pop_glyphs.py one-off glyph ink-bbox measurement tools/pop_glyph_metrics.json committed metrics, so renders are reproducible tools/build_pop.py catalog β†’ the whole Pop module tools/build_pop_wallpapers.py catalog-free: 12 Γ— 4K Pop walls + manifest tools/validate_pop.py Pop coherence checks (13,700+) assets/svg/ master vectors (926) assets/banners/ 16:9 banners (926) app/src/main/res/ the original icon-pack Android module pixel-neon/ 8-bit neon companion pack + its Gradle root PixelNeonWallpapers/ original 8-bit Pixel Neon sources + manifest pop/ Core Builds Pop β€” second pack, shares app/'s Kotlin assets/pop/ Pop master vectors (926 square + 926 banner) Wallpapers/series-5-pop/ 12 Γ— 4K Pop wallpapers (2.5 MB total) Latestrelease/version.json Icon Pack update manifest Latestrelease/pixel-neon-version.json Pixel Neon update manifest Latestrelease/pop-version.json Pop's in-app update manifest docs/IconPackList.md original supported apps + components docs/PopIconList.md the same apps, with their Pop swatch docs/research/ why this pack exists, with sources ticker/ Core Line β€” sports & channel ticker (see ticker/README.md) shift/ Core Shift β€” live wallpaper browser (see shift/HANDOVER.md) doctor/ Core Doctor β€” streaming diagnostics (see doctor/SPEC.md) motion-plugin/ Core Motion β€” Projectivy wallpaper-provider plugin motion-shaders/ GLSL fragment shaders (hex plasma, starfield, flow) Motion/live/ Motion asset set (MP4 loops, thumbnails, live-feed.json) ``` --- ## πŸ”· Core Line **TV-first sports & channel ticker (chyron).** `v1.3.0` Not a player, not a playlist, not streams β€” a reader that crawls the listings other channel apps already publish as RSS: ``` LIVE TOR 3-2 MTL Β· TSN4 SN 3 β—† LAL vs BOS 7:00 PM Β· ESPN ``` - One Android APK for phone, Shield, Google TV, Fire TV (`LAUNCHER` + `LEANBACK_LAUNCHER`) - Parses messy listing lines (`Team vs team epn, tsn4, sn 3` β†’ ESPN, TSN4, SN 3) - Public scoreboards (ESPN, NHL, MLB) with a labeled demo-slate fallback - Same-Wi-Fi QR pairing so a Fire remote never types an RSS URL - Zero npm dependencies; web version runs with `cd ticker && node server.mjs` ### Install 1. Download using **Downloader code `7375676`**, or grab the APK from the [**stable release**](../../releases/tag/coreline) (tags starting with `coreline-v` have versioned notes). 2. Sideload it (Downloader, `adb install`, or a file manager). 3. Open the app β€” it loads a demo ticker immediately. Add your RSS feeds via the settings panel or pair from a phone on the same Wi-Fi using the QR code. ### Building CI: [`.github/workflows/core-line-apk.yml`](.github/workflows/core-line-apk.yml) β†’ push a `coreline-v*` tag to cut a release. Debug APKs are uploaded as CI artifacts on every push. Locally (needs JDK 17 + Android SDK): ```bash cd ticker/android && ./gradlew :app:assembleDebug ``` Tests: `cd ticker && npm test` (114 tests in the current suite). Release signing uses the same `KEYSTORE_BASE64`, `KEYSTORE_PASSWORD`, `KEY_ALIAS`, `KEY_PASSWORD` secrets as the icon pack. Full architecture and remaining debt: [`ticker/HANDOVER.md`](ticker/HANDOVER.md) Β· Detailed readme: [`ticker/README.md`](ticker/README.md). --- ## πŸ”· Core Shift **Android TV screensaver + motion wallpaper browser.** `v2.3.5` Two delivery paths for motion wallpapers on Android TV: - **Monet Launcher** β€” browse live wallpapers in-app, full-screen looping preview, download MP4 loops to `Movies/CoreBuilds`. Point Monet Premium's video wallpaper picker at that folder. - **Projectivy Launcher** β€” the **Core Motion** plugin (`motion-plugin/`, `tv.corebuilds.motion`) implements Spocky's `IWallpaperProviderService` AIDL. Serves an Overflight-compatible JSON feed as `VIDEO` wallpapers plus bundled Lottie vector loops. Install [`coremotion-release.apk`](https://github.com/brevityA/CoreBuildsApps/releases/download/motion/coremotion-release.apk) β†’ Projectivy Settings β†’ Appearance β†’ Wallpaper β†’ Launcher wallpaper β†’ Core Motion. Requires Projectivy Premium. Not detected? See [`docs/PROJECTIVY_DETECTION.md`](docs/PROJECTIVY_DETECTION.md). - **Monet Launcher** β€” no plugin API exists, so the route is the **Aerial Views bridge**: point Aerial Views at [`Motion/aerial-entries.json`](Motion/aerial-entries.json), then set Monet's wallpaper source to Aerial. Auto-updating, and gives you a matching screensaver. Local-file fallback via Core Shift β†’ `Movies/CoreBuilds`. See [`docs/MONET_LAUNCHER.md`](docs/MONET_LAUNCHER.md). Content pipeline: 10 ffmpeg-filter MP4 loops (1080p H.264), 3 self-authored GLSL shaders (hex plasma, starfield, flowing noise), and bundled Lottie vectors β€” all Β§03 palette. - HTTPS-only downloads with GitHub host allowlist - Leanback UI built for D-pad navigation - Remote manifest with bundled fallback β€” works offline after first sync - CI-validated motion asset set ### Install 1. Download using **Downloader code `8829421`**, or use the permanent APK URL: **https://github.com/brevityA/CoreBuildsApps/releases/download/shift/coreshift-release.apk** Versioned builds remain available from [**Releases**](../../releases) under `shift-v*` tags. The `shift` release is a floating stable target. 2. Sideload it (Downloader, `adb install`, or a file manager). 3. Open the app β€” browse live wallpapers, preview full-screen, and download to `Movies/CoreBuilds` for Monet. ### Building CI: [`.github/workflows/core-shift-apk.yml`](.github/workflows/core-shift-apk.yml) β†’ push a `shift-v*` tag to cut a release. Debug APKs are uploaded as CI artifacts on pushes to `main` and matching pull requests. Locally (needs JDK 17 + Android SDK): ```bash cd shift && ./gradlew :app:assembleDebug ``` Motion asset validation: `python tools/validate_motion_feed.py`. Release signing uses the same `KEYSTORE_BASE64`, `KEYSTORE_PASSWORD`, `KEY_ALIAS`, `KEY_PASSWORD` secrets as the icon pack and Core Line. Full architecture and remaining debt: [`shift/HANDOVER.md`](shift/HANDOVER.md). --- ## πŸ”· Core Motion **Projectivy wallpaper-provider plugin for Core Motion loops.** `v1.0.0` Core Motion is the Projectivy-side delivery app: a small APK detected by Projectivy Premium as a wallpaper source. It serves the GitHub-hosted Core Motion feed plus bundled vector loops; it is separate from Core Shift so Monet/Aerial and Projectivy paths can evolve without coupling. ### Install 1. Download the stable APK directly: **https://github.com/brevityA/CoreBuildsApps/releases/download/motion/coremotion-release.apk** Downloader code: **[USER TO SUPPLY]**. Versioned builds remain under `motion-v*`; the `motion` release is the floating stable target and must not be moved to a different asset name. 2. Sideload it. 3. In Projectivy: **Settings β†’ Appearance β†’ Wallpaper β†’ Launcher wallpaper β†’ Core Motion**. Requires Projectivy Premium. ### Building CI: [`.github/workflows/core-motion-apk.yml`](.github/workflows/core-motion-apk.yml) β†’ push a `motion-v*` tag to cut a release. Locally (needs JDK 17 + Android SDK): ```bash cd motion-plugin && ./gradlew :app:assembleDebug ``` Plugin details: [`motion-plugin/README.md`](motion-plugin/README.md) Β· Detection notes: [`docs/PROJECTIVY_DETECTION.md`](docs/PROJECTIVY_DETECTION.md). --- ## πŸ”· Core Doctor **Streaming infrastructure diagnostics for your phone.** `v0.1.0` Not a TV app β€” Core Doctor runs on your phone and checks whether your streaming setup is healthy. Six checks, gated on what credentials you provide: | Check | Gate | What it tests | |---|---|---| | DNS resolution | Always | Resolves api.real-debrid.com, api.torbox.app, v6-4.aiostreams.elfhosted.com | | VPN detection | Always | ConnectivityManager TRANSPORT_VPN | | Addon manifest | Addon URL | HTTP GET {url}/manifest.json β€” validates JSON with `id` field | | Stream probe | Addon URL | HTTP GET {url}/stream/movie/tt0133093.json β€” checks for results | | Real-Debrid | RD key | GET api.real-debrid.com/rest/1.0/user β€” premium status, expiry | | TorBox | TB key | GET api.torbox.app/v1/api/user/me β€” plan status, expiry | - No backend, no persistence, no analytics β€” everything runs client-side - API keys are sent only to the provider they belong to (Bearer token) - Share reports are **redacted by construction** β€” `ReportCard.render()` emits verdicts and summaries only; keys and URLs are structurally excluded - `allowBackup=false`, no SharedPreferences, no Room, no files - Permissions: INTERNET, ACCESS_NETWORK_STATE β€” nothing else ### Install 1. Download using **Downloader code `8664938`**, or grab the APK from [**Releases**](../../releases) under `doctor-v*` tags. 2. Sideload it (Downloader, `adb install`, or a file manager). 3. Open the app β€” enter your addon URL and/or debrid API keys, tap Run. ### Building CI: [`.github/workflows/core-doctor-apk.yml`](.github/workflows/core-doctor-apk.yml) β†’ push a `doctor-v*` tag to cut a release. Locally (needs JDK 17 + Android SDK): ```bash cd doctor && ./gradlew :app:assembleDebug ``` Tests: `cd doctor && ./gradlew test` (unit tests for JSON parsing). Release signing uses the same `KEYSTORE_BASE64`, `KEYSTORE_PASSWORD`, `KEY_ALIAS`, `KEY_PASSWORD` secrets as the other apps. Spec: [`doctor/SPEC.md`](doctor/SPEC.md). --- ## πŸ”· Credits Icon-pack conventions follow the approach proven by [Projectivy Icon Pack](https://github.com/SicMundus86/ProjectivyIconPack) by SicMundus86. Projectivy Launcher is by Spocky. App names and trademarks belong to their respective owners; see [artwork sources and notices](THIRD_PARTY_NOTICES.md) for the offline references and original Core Builds interpretations. No endorsement is implied. Part of the [Core Builds](https://github.com/brevityA/Core-Builds) ecosystem Β· [ko-fi.com/branding_brevity](https://ko-fi.com/branding_brevity)