All notable changes to iOSIconPack will be documented in this file.
- Preserved the original logo and wallpaper explorations in a versioned brand concept archive.
- Added a selection record that distinguishes the approved mark and shipped wallpaper sources from alternate studies.
- Recaptured the six product screens from the signed release on Android 15.
- Refreshed the release version, store metadata, and in-app changelog for the archived brand work.
- Added six original wallpapers with full-screen previews, local saving, and Android wallpaper application.
- Added verified product screenshots to the project page and install guide.
- Reworked the dashboard shortcuts around the live icon gallery, current signed release, and icon request form.
- Replaced the old procedural wallpaper set with professionally art-directed originals for each shipped era.
- Allowed screenshots of the wallpaper viewer so users can share and review the included artwork.
- Rewrote the icon-request consent message to say what stays local and when data is sent.
- Updated the store copy, GitHub Pages metadata, distribution notes, and catalog totals.
- Removed inherited Google Play billing and license-check permissions. The app has no purchases or license gate.
- Publish signing verification now accepts the signer labels emitted by current Android build tools.
- The release includes the adaptive, themed, and legacy launcher artwork introduced in v1.2.3.
- New app icon: adaptive, themed (monochrome) and legacy variants regenerated from the 2026-08 icon set.
- Updated the release metadata check for the current blocked-roadmap heading style.
- Added a local release metadata guard that keeps ignored working notes and blocked release targets aligned with the current app version.
- Added generated release-channel status for the gallery and install docs so a stale GitHub Release/Obtainium channel is visible before users download.
- Added strict F-Droid Maven provenance mode with reviewed JitPack and buildscript metadata exceptions.
- Added telemetry-free launcher apply diagnostics that copy local failure context for GitHub bug reports.
- Added
icon-quality-auditto rank low-resolution sources, contrast risks, mask/corner review candidates, and variant gaps with configurable release thresholds. - Added
package-inventory-importto convert local ADB/package inventories into icon-request records and candidate appfilter rows without network upload. - Added Playwright-backed
docs-visual-smokechecks for gallery/request pages across desktop/mobile and dark/light rendered control flows. - Added themed-icon tint contrast checks to
preview-regressionfor Material You and Android auto-theming dark/light palette simulations. - Added temporary expanded/RTL pseudo-locale checks for Android resources and docs copy, including protected-token validation and clipping-risk reporting.
- Added
toolchain-upgrade-rehearsalto plan AGP/Kotlin/KSP/Pillow/Gradle updates and optionally test them in a temporary detached git worktree.
- Polished the GitHub Pages icon gallery with visible result feedback, clearer empty-state recovery, light/dark system colors, mobile layout checks, and stronger keyboard/focus states.
- Refined the live icon request dashboard with labelled controls, improved loading/empty/error states, cached-data fallback messaging, and responsive mobile layout.
- Tightened dashboard home-card copy, launcher apply recovery messages, and About credits.
- Added a concrete privacy policy target for the in-app request consent dialog.
- Local preview regression checks for full-square, circle, rounded-square, and squircle launcher masks.
- Local sharp, line, and filled themed-icon style prototype generation under
build/style-prototypes. - Coverage-gap scoring, icon provenance validation, and dependency advisory release gates.
- Issue-template contact links now route to enabled GitHub Issues instead of disabled repository Discussions.
icontool preflightruns local validators, Gradle test/lint/release packaging, reports release APK size, and fails when the size budget is exceeded.icontool launcher-compat-checkvalidates launcher intent filters and core icon-pack XML resources for Nova, Lawnchair, Smart Launcher, OnePlus, Samsung/ADW generic channels, Niagara, Pixel, and Holo/LauncherPro.icontool request-auditaudits openicon-requestissues or saved issue JSON againstappfilter.xml, reporting already-covered, duplicate, needs-ComponentInfo, ready-to-map, and malformed request buckets without mutating GitHub.icontool coverage-gapranks missing app packages from icon requests plus Arcticons, Delta Icons, Lawnicons, or supplied appfilter XML sources, with component guesses and existing-drawable reuse hints.- Generated gallery accessibility smoke checks now validate search labels, filter pressed states, tab semantics, focus-visible support, and keyboard activation through the local validator path.
icontool maven-provenance-checkreports declared Gradle repositories, resolved buildscript/release artifacts, Maven source repository, license, and source URL metadata for F-Droid distribution review.icontool dependency-auditreports current versus latest-stable AGP, Kotlin, KSP, Blueprint, and Pillow versions, then queries OSV and fails on known advisories.icontool preview-regressionrenders every shipped PNG through full-square, circle, rounded-square, and squircle launcher masks, then fails when hashes drift from the accepted local baseline.- Issue-template contact links now route to the enabled GitHub Issues surface instead of disabled repository Discussions.
- First-party Google app defaults now use the shipped iOS 18 Google/Chrome/Gmail/
YouTube variants instead of generic Apple analogues or static
tp_*icons. - iOS 26 Liquid Glass icons now use a deterministic frosted squircle material pass with translucent depth, rim highlights, and clipped safe-zone corners.
scripts/gen_glyph_variants.pygenerates 367 transparent glyph-only vector variants with a squircle border, exposed through the dashboardGlyphcategory and validated by the local drawable checks.icontool style-prototypesgenerates local sharp, line, and filled themed-icon XML variants underbuild/style-prototypesfor review without adding shipped drawable resources.app/src/main/assets/icon_provenance.jsonrecords source URL, provider, shipped PNG SHA-256, license note, and era transform metadata for every committed icon PNG;fetch_icons.py --provenance-checkand drawable validation fail when it drifts.convertSvgSourcesGradle task converts raw SVG sources fromapp/src/main/svginto generated Android vector drawables at build time.crowdin.ymlandicontool localization-checkwire dashboard strings to a local Crowdin CLI workflow without committing credentials or GitHub Actions.- Home-screen launcher apply cards route Nova, Action, Smart, OnePlus, Lawnchair, Niagara, Projectivy, ADW, Apex, and Samsung Theme Park through app-owned deep links and local launcher compatibility validation.
icontool placeholdergenerates deterministicph_*letter-tile PNGs for uncovered app components without adding them to the dashboard catalog.icontool widget-exportbuilds a local zip with Kustom/KWGT image assets, JSON/CSV catalog metadata, and a Rainmeter skin/resource layout.- Six committed, original WebP wallpapers cover iOS 14, 15, 16, 17, 18, and iOS 26 Liquid Glass eras through Blueprint's raw GitHub wallpaper JSON feed.
- 232 new per-era app variants for popular third-party and Google apps.
- iOS 26 Liquid Glass coverage expanded to 57 icons.
- 367 hand-crafted monochrome vector layers for Android 13+ themed icons.
- Era-specific Material You tint resources for every adaptive themed wrapper.
- Local release metadata consistency check for version, README badge, F-Droid metadata, dashboard changelog, and git tag alignment.
- Local GitHub release-channel check for latest release tag, APK asset name, asset digest, and non-app version release drift.
- Local Android developer verification readiness report for package identity, signing certificate hash, install channels, enforcement timeline, and operator next actions.
- Publish release signing guard that requires maintainer env signing inputs, rejects the committed dev keystore, and verifies the APK certificate SHA-256 fingerprint before publication.
- Explicit no-backup/no-device-transfer XML rules for Android 11- and Android 12+ backup paths.
- Release lint is fail-closed again, and release builds now enable resource shrinking with an explicit icon-pack keep file for dynamically referenced launcher/dashboard resources.
- The local release APK size gate is now 13 MiB to cover the bundled wallpaper pack while still failing on unexpected asset growth.
- Wallpaper entry points are backed by committed original assets; drawable validation now fails on missing launcher resource references, empty advertised wallpaper surfaces, or stale local wallpaper JSON metadata.
- The Frames
json_urlwallpaper feed now loads from the bundled asset catalog with local asset URLs, so the dashboard wallpaper tab does not depend on GitHub Raw at runtime. - Contributor, gallery, and distribution docs now describe local validation and release commands only; stale current-process CI/GitHub Actions claims were removed.
- Every iOS era now has 57 icons; total PNG coverage is 367 icons.
set_era.pynow remapstp_*entries when matching per-era variants exist.icontool rebuildnow syncsicon_pack.xmlso Blueprint filters stay current.gen_monochrome.pynow emits vector-backed mono layers where templates exist, and reports bitmap fallback counts explicitly.- Themed-icon wrappers now use era-specific dynamic color background tokens instead of the shared launcher background color.
- Drawable validation now skips the warning-only full squircle scan by default on
large icon sets; set
IOSICONS_FULL_SQUIRCLE_CHECK=1for the full scan.
- Removed a duplicate Signal routing component that mapped to both WhatsApp and Messages.
- Removed the stray public
v2.5.1release/tag hazard and added a local guard that rejects futurev*tags whose tagged app version does not match.
- 54 new appfilter component mappings (618->672): AI assistants (ChatGPT, Claude, Perplexity), productivity (Notion, Canva, Adobe Reader/Lightroom/Scan), streaming (Paramount+, Pluto TV, Deezer), dating (Tinder, Bumble, Badoo), secure messaging (Signal), fitness (Nike, MyFitnessPal, Peloton), privacy (ProtonMail, ProtonVPN, ProtonPass), crypto (Binance, Coinbase, Cash App), Samsung system (My Files, Clock, Calendar, Device Care, Routines, Reminder), OEM launchers (Pixel, LG, OnePlus, Xiaomi, Oppo, Vivo), Google extras (Gboard, Google One, Cloud Console), Motorola system, Shopping (Shopify).
- F-Droid submission guide (
docs/fdroid-submission.md) with fdroiddata MR checklist and IzzyOnDroid submission instructions. - Research delta scan iter-5 (
docs/research/iter-5-sources.md).
- F-Droid metadata description updated (670+ component entries).
- Gallery Compare Eras tab: side-by-side grid of every stock iOS app across
all 6 design eras (iOS 14 → iOS 18 → iOS 26 Liquid Glass). Era columns are
colour-coded; Liquid Glass column present only for the 10 Liquid Glass subset
apps. Implemented in
gen_gallery.py(_comparison_html(),_base_app_names()). icontool statssubcommand: prints per-era icon counts, component-mapping counts, and top-N drawables by mapping (default top 10,--top Nto override).- Squircle corner compliance check in
validate_drawables.py(check_squircle_corners()). Requires Pillow; skips gracefully when not installed. WARN-only (exits 0). Reports summary count of icons with opaque corners; notes expected behaviour for Apple-sourced icons whose squircle mask is applied by the launcher at runtime.
gen_gallery.py: added tab-bar nav (Browse / Compare Eras / Requests ↗),_js()extended with tab-switching logic that hides search+filter bar in Compare view.PACK_DIRandCOMPARE_ERAS/PREFIX_TO_ERAconstants added.validate_drawables.py: squircle check integrated; output unchanged on pass (still showsOK (135 PNGs …)), squircle summary line appended if Pillow present.scripts/icontool.py:statssubcommand wired into_build_parser().
scripts/gen_monochrome.py: scaffolds Android 13+ themed-icon stubs. Generatesdrawable/<name>_mono.xml(bitmap placeholder referencing the existing PNG) anddrawable/<name>_themed.xml(adaptive-icon wrapper with<monochrome>layer) for everyios18_*andtp_*icon. 90 XML files created total (45 mono + 45 themed). Replace_mono.xml<bitmap>stubs with hand-crafted vectors for higher quality. Run with--forceto regenerate after adding new icons..github/workflows/issue-triage.yml: auto-comments on every new icon request issue. Parses the package name from the structured form, checksappfilter.xmlfor coverage, and replies with either "Already covered" + matched drawable list, or "Queued" + adb ComponentInfo tip. Adds thealready-coveredlabel when the app is mapped.already-coveredGitHub label (blue) for quick maintainer triage.
fetch_icons.py: : Per-era color grading viaPIL.ImageEnhance: each era now gets a distinct Saturation/Contrast/Brightness pass (ios14: richest;ios17: flat/desaturated;ios26_lg: frosted/cool;tp: identity/no grade). : SHA-256 hash cache (icons_raw/.hash_cache.json) skips re-downloading raw files that haven't changed since the last run. :--listflag prints all known icon names and exits.scripts/icontool.py:checksubcommand now runs bothvalidate_appfilter.pyandvalidate_drawables.pyin sequence.scripts/validate_drawables.py: output now distinguishes pure vectors, monochrome stubs, and themed wrappers in the summary line.
scripts/validate_drawables.py: CI asset validator. Checks every PNG indrawable-xxxhdpi/is exactly 192x192 px, a valid PNG, and under 200 KB. Also validates every vector drawable indrawable/parses as valid XML, and everydrawable.xmlentry has a corresponding file on disk. Integrated into.github/workflows/ci.ymlandicontool check.icontool checknow runs bothvalidate_appfilter.pyandvalidate_drawables.pyin a single command.
app/src/main/res/xml/appfilter.xml: 112 additional component mappings across all 20 iOS 18 icon drawables: : ios18_mail: Outlook, ProtonMail, Tutanota, Yahoo Mail, AquaMail, K-9, Thunderbird, Samsung Mail, Fastmail, Gmail conversation view : ios18_messages: Signal, Viber, Skype, Google Messages, Samsung Messages, Line, Telegram web/plus, WhatsApp Business, Huawei Messages : ios18_calendar: Google Calendar, Samsung, MIUI, OnePlus, Huawei, HTC, Business Calendar, Outlook Calendar : ios18_maps: Google Maps, Waze, HERE Maps, Maps.me, OsmAnd, Organic Maps, Yandex Maps : ios18_phone: Google Dialer, Samsung, Huawei, Motorola, LG, HTC : ios18_clock: Google Clock, Samsung, OnePlus, MIUI, Huawei, LG : ios18_camera: Google Camera (Pixel+Ego), Samsung, MIUI, OnePlus, Huawei, Motorola, LG, AOSP Snap : ios18_notes: Google Keep, Evernote, Notion, Samsung Notes, OneNote, SimpleNote, Joplin, MIUI Notes, Huawei Notepad : ios18_calculator: Google, Samsung, OnePlus, MIUI, Huawei, LG : ios18_settings: Stock AOSP, Samsung, MIUI, Huawei, OnePlus : ios18_weather: AccuWeather, Weather Channel, Yahoo Weather, Breezy Weather, Samsung Weather, MIUI Weather, Huawei Weather : ios18_health: Google Fit, Samsung Health, MyFitnessPal, Fitbit, Garmin Connect, Runkeeper, Nike Run Club, Zepp, Polar Flow : ios18_wallet: Google Wallet, Samsung Pay, Cash App, Coinbase, Luno, Blockchain : ios18_files: Google Files, Solid Explorer, Total Commander, Amaze, FX Explorer, Samsung My Files, MIUI Explorer, Huawei Files : ios18_appstore: Samsung Galaxy Store, Amazon Appstore, Huawei AppGallery, Aptoide, F-Droid, Google Play, MIUI : ios18_facetime: Google Meet, Google Duo/Meet, Teams, Webex, GoToMeeting, BlueJeans, Wire : ios18_compass: generic, Axie Pro, Samsung, Huawei : tp_google_maps, tp_pinterest, tp_shazam, tp_slack, tp_reddit, tp_amazon, tp_uber: additional package variants
scripts/icontool.py rebuild: batch-sync subcommand. Scansdrawable-xxxhdpi/for PNG files anddrawable/for vector drawables, then adds any missing entries todrawable.xmlunder the correct era category section. Supports--pruneto remove stale entries for files deleted from disk, and--dry-runto preview changes without writing. Excludestp_*icons (appfilter-only by design).docs/requests.html: live icon request dashboard on GitHub Pages. Reads open GitHub Issues via the REST API, sorted by 👍 votes by default. Features: search, label filter, sort (votes / newest / oldest / most-discussed), paginated load-more, skeleton loader, 5-minute localStorage cache with stale fallback on rate limit, and a direct "Request Icon" button linking to theicon-request.ymlissue template.docs/index.html: added "Requests" link in header nav pointing to the new requests dashboard..github/workflows/build.yml: per-era APK loop. Loopsset_era.pythrough all 6 eras (ios14 to ios18, ios26), builds a signed APK per era, and publishes each asiOSIconPack-v{VERSION}-{ERA}.apkto the GitHub Release alongside the ios18 AAB.app/src/main/res/xml/appfilter.xml: 92 additional component mappings: browser alternatives (Firefox, Brave, Opera, Kiwi, Vivaldi, Tor), music streaming (Amazon Music, TIDAL, Deezer, Apple Music, Pandora, iHeart), gallery apps (Samsung, OnePlus), and popular social/utility third-party icons (YouTube, Gmail, Chrome variants, Discord, Facebook, Netflix, Snapchat, TikTok, Zoom, PayPal, Robinhood, Strava, Spotify Free).
scripts/set_era.py: era-switching CLI. Remaps every drawable reference inappfilter.xmlfrom one iOS design generation to another with a single command. Supports all six eras: ios14, ios15, ios16, ios17, ios18 (default), and ios26 (Liquid Glass). The iOS 26 switch is partial by design: only the 10 icons that have a Liquid Glass variant are remapped; the rest stay on iOS 18. Includes--dry-runand--listflags. Bothres/xml/andassets/copies are updated atomically.scripts/gen_gallery.py+docs/index.html: GitHub Pages icon browser. Dark-theme single-page gallery with era filter tabs, search, and per-icon component count badges. Images load from GitHub raw URLs (no asset copying). CI validatesdocs/index.htmlis up-to-date on every master push viagen_gallery.py --check. Live at https://sysadmindoc.github.io/iOSIconPack/
README.md: added Gallery badge, Obtainium install badge and instructions, era-switching quick-start, updated Contributing section to reference icontool instead of the old manual four-file workflow..github/workflows/ci.yml: added gallery staleness check step.
scripts/icontool.py: contributor CLI that collapses the four-file manual XML wiring workflow into a single command. Supportsadd,link,remove,sync, andchecksubcommands. Atomic writes via temp-file +os.replaceto prevent partial-write drift betweenres/xml/andassets/copies. Third-party (tp_*) icons are excluded fromdrawable.xmlautomatically. New categories are inserted at the correct era position indrawable.xmlwithout manual ordering..github/workflows/ci.yml: CI workflow that runsvalidate_appfilter.pythenassembleDebugon every pull request and push to master. Uploads the debug APK as a build artifact (7-day retention) for quick reviewer testing.fdroid/metadata/com.sysadmindoc.iosicons.yml: F-Droid build metadata ready for submission to the fdroiddata repository.fastlane/metadata/android/en-US/: store listing copy (title, short description, full description) consumed by F-Droid and compatible with Google Play publishing via fastlane.
CONTRIBUTING.md: replaced the four-step manual XML edit section withicontoolexamples; kept the manual fallback path for reference..github/PULL_REQUEST_TEMPLATE.md: PR checklist updated to referenceicontool checkinstead of the old per-file manual steps.
minSdkbumped from 23 to 26 (Android 8.0). Adaptive icons are a mandatory feature of the pack and Android 13+ themed icons need API 33; both were already above the old floor. Aligns with the project stack convention (minSdk 26 unless a specific need for lower).
app/src/main/res/drawable/ic_launcher_background.xml: orphan since v1.1.0 when the adaptive icon switched to@color/ic_launcher_backgroundinic_launcher_colors.xml. Kept no references; dropped to avoid the namespace collision where a drawable and a color share the same id.
- README feature list no longer claims an "Auto-generated placeholders" feature that does not exist. The placeholder engine is on the roadmap but was not shipped. Replaced that bullet with the accurate list of new launcher integrations.
fetch_icons.pyCLI flags:--only,--tp-only,--era,--dry-run,--validate: the validator subcommand reports every icon on disk that lacks an appfilter mapping so dead-weight art does not ship in the APK.requirements.txtpinning Pillow, referenced from CONTRIBUTING.md.- 36 new
appfilter.xmlentries for popular apps that were previously unmapped: Threads, X, BeReal, Threema, Signal, Session, Microsoft Teams, Jerboa (Lemmy), Mastodon, Elk, Bluesky, Lyft, DoorDash, Grubhub, Cash App, Audible, Kindle, GitHub mobile, Obsidian, Google Keep, Notion, Bear, Todoist, Google Calendar, Outlook, Yahoo Mail, Proton Mail, 1Password, Bitwarden, KeePassDX, Duolingo, Khan Academy, etc.
- 30 existing
appfilter.xmlmappings redirected from genericios18_*glyphs to the dedicatedtp_*PNGs (Instagram, WhatsApp, Telegram, Discord, Spotify, Netflix, YouTube + ReVanced/Vanced, Twitter, TikTok, Snapchat, Facebook / Messenger, Chrome, Gmail, Google Maps, Uber / Uber Eats, Reddit, Slack, Zoom, Pinterest, Amazon Shopping, PayPal, Venmo, Robinhood, Strava, Shazam). The third-party art had shipped in the APK for a release but was dead weight: no component pointed to it. fetch_icons.pyno longer bootstraps Pillow at runtime. It now fails fast with a clear instruction topip install -r requirements.txt, consistent with the rest of the project's tooling.fetch_icons.pywrites third-party icons under the canonicaltp_prefix (was3p_, which did not match any drawable on disk: another latent bug).
.gitignoreno longer excludesfetch_icons.py; the script is part of the supported contributor toolchain now that the auto-install pattern has been removed.
- Adaptive launcher icon refresh with dual rotated brand grid + monochrome
themed layer for Android 13+ dynamic theming (closes the 0/110 monochrome
coverage gap flagged in
ROADMAP.md). - GitHub issue templates (icon request / bug / feature) + pull-request template aligned with Arcticons' request funnel.
scripts/validate_appfilter.py: byte-level parity check between theres/xml/andassets/copies ofappfilter.xml/drawable.xml, with drawable-existence + duplicate-component guards. Wired into CI.- Android App Bundle (
bundleRelease) build + artifact upload, so we are ready for the Play Store 150MB limit once icon coverage grows. CONTRIBUTING.mddescribing icon conventions, appfilter wiring, and the release signing env vars.- Launcher intent filters for Microsoft Launcher, Action Launcher, POCO, Pixel / NexusLauncher, and Niagara.
- Signing config now reads
IOSICONS_STORE_PASSWORD/IOSICONS_KEY_ALIAS/IOSICONS_KEY_PASSWORDfrom env (CI secrets) and falls back to the committed dev keystore for offline contributors only. - CI workflow (
build.yml) now builds both APK + AAB, caches Gradle, runs the appfilter validator, and supports manual release dispatch by version input. - README: collapsed the duplicated branding header into a single centered
hero; replaced the stale
v2.5.1badge (Blueprint's version, not ours); corrected the License section to MIT.
ic_launcher_foreground.xml+ic_launcher_monochrome.xmlhad duplicateandroid:pivotX/android:pivotYattributes that Android aapt2 rejects; collapsed to a single pivot declaration per group.
- Initial scaffold: Blueprint dashboard with 110 placeholder icons across six iOS eras.
- Gradle wrapper committed; appfilter expanded to 214 entries.
- Replaced placeholder squircles with iOS-inspired vector glyphs, then replaced those with real iOS app icons fetched from the Apple CDN (135 PNGs total: 110 stock era icons + 25 third-party).
- Gradle 8.13 + AGP 8.12.0 upgrade, SplashScreen style parent fix, signing
config wired to
iosicons.jks.
Original roadmap snapshot
# ROADMAP: v1.2.1: updated 2026-07-02
Actionable work only. True blockers live in `Roadmap_Blocked.md`.
## P2
## P3 Research
## Research-Driven Additions