Skip to content

Release v1.0.0-beta.3: mobile Store redesign + Store covers/icons#960

Merged
jaylfc merged 11 commits into
masterfrom
dev
Jun 16, 2026
Merged

Release v1.0.0-beta.3: mobile Store redesign + Store covers/icons#960
jaylfc merged 11 commits into
masterfrom
dev

Conversation

@jaylfc

@jaylfc jaylfc commented Jun 16, 2026

Copy link
Copy Markdown
Owner

Promote dev to master for the v1.0.0-beta.3 release.

Includes:

  • Mobile Store redesigned to an Apple App Store-style layout (feat(store): Apple App Store-style mobile layout #959).
  • Real Store cover banners + icons (OpenClaw, Hermes, Ollama, ComfyUI, n8n, self-hosted apps; shared Stable Diffusion banner with a grayscale AUTOMATIC1111 cut) via a shared AppIcon component with branded-monogram fallback.
  • Folded gitar feat(store): Apple App Store-style mobile layout #959 findings: honest installed status (no dead Open span), install-failure Retry feedback, AppIcon/StoreCover instance-reuse resets, plus MobileStore tests.

Version bumped to 1.0.0-beta.3 across the 3 version files + CHANGELOG.

Summary by CodeRabbit

  • New Features

    • Redesigned mobile Store with tabbed layout, featured hero section, and app carousels
    • Full-screen search and device filtering in mobile Store
    • Enhanced app cover art and icon system with smart fallback visuals
  • Bug Fixes

    • Installed apps no longer display interactive "Open" control
    • Failed app installs now show Retry action
    • Fixed icon and cover image rendering when reusing app tiles
  • Tests

    • Added comprehensive test coverage for mobile Store components
  • Documentation

    • Updated changelog and status documentation for v1.0.0-beta.3 release

jaylfc added 11 commits June 16, 2026 14:49
The Store rendered its desktop two-pane layout (left section sidebar +
content grid) on phones, so text wrapped, cards clipped and Get/Preview
buttons were cut off. Add a mobile-only presentation switched on
useIsMobile(), leaving the desktop render path byte-identical.

Mobile layout:
- Bottom tab bar (Discover / Apps / Agents / Search / Updates) mapped to
  the existing nav ids, with safe-area-inset-bottom respected.
- Full-width vertical feed: a featured Editor's Choice hero, then
  horizontal snap-scroll carousels with peek of the next card, plus
  App Store-style rows (rounded icon, title, subtitle, trailing Get pill).
- Sticky header with the section title, a search affordance and a device
  filter chip; tapping Search opens a full-screen search view.
- Device selection folds into a header chip + bottom sheet, replacing the
  desktop device pill bar.

All catalog data, install/uninstall logic, device/backend filters and the
model resolver are reused from index.tsx. Theme tokens only (shell-* /
accent / dock), dark graphite default. tsc clean, 42 Store tests pass.
Every Store app now shows an intentional icon instead of a blank tile.
A new shared AppIcon component (desktop + mobile) resolves the logo
through dashboard-icons, tries a name-derived slug, then falls back to
a branded monogram: the app initials on a deterministic per-app
gradient tuned for the graphite shell. The taOS agent frameworks
(OpenClaw, Hermes, IronClaw, MicroClaw, Moltis, Agent Zero, Langroid),
which have no upstream logo, now read as clean monograms.

Real Discover logos are wired via verified dashboard-icons slugs
(comfyui, n8n, ollama, qwen, gemma, github, mcp, hugging-face, openai
and the homelab set). The dead /static/store-icons SVG and .jpg
references that silently 404'd are gone.

A coverFor helper gives featured and carousel cards a distinct cover:
an explicit app.cover when set, otherwise a layered gradient from the
same hue family as the icon, so the hero reads like an App Store
featured card and no card ships flat.

AppIcon and coverFor replace the duplicated icon resolvers and inline
Package fallbacks across MobileStore and the desktop StoreApp.
Official screenshots/hero art for the real apps (comfyui, n8n, home-assistant,
immich, jellyfin, sonarr, radarr, uptime-kuma, vaultwarden, code-server,
nextcloud) saved as optimized webp under public/store-covers and shown behind
the featured + carousel cards via a new coverImage field (falls back to the
gradient when absent). taOS-specific frameworks keep the branded monogram cover.
Official banners (no upstream dashboard-icons logo for these taOS frameworks),
converted to webp and keyed by id in COVER_BY_ID so they resolve for the curated
and backend-sourced rows alike.
Add Ollama banner and a shared Stable Diffusion banner across both
WebUI cards. The AUTOMATIC1111 build (sd-webui) uses a grayscale cut of
the same banner so the two Stable Diffusion entries read as distinct.
Covers resolve via COVER_BY_ID by app id for backend-sourced catalog rows.
- Installed apps no longer render a dead Open span: show an honest
  role=status Installed indicator (store services are managed, not
  launched from the storefront), removing the misleading affordance.
- Surface install failures: a non-ok or failed request now flips the
  pill to a Retry state instead of silently swallowing the error.
- AppIcon resets its resolution stage when the candidate URL set changes,
  so a reused instance does not carry a stale error stage to a new app.
- StoreCover clears its failed flag when coverImage changes, so a reused
  instance retries the new app's cover.
- Add MobileStore tests covering Get/Installed/Retry states and the
  AppIcon/StoreCover instance-reuse resets (47 Store tests pass).
feat(store): Apple App Store-style mobile layout
@jaylfc jaylfc merged commit fa4bd37 into master Jun 16, 2026
12 checks passed
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@github-actions

Copy link
Copy Markdown

👋 Thanks for the PR! This one targets master, which is our
stable branch (it's what live installs track). Please retarget it to
dev — click Edit next to the PR title and change the base
branch dropdown from master to dev. Your commits and any review
carry over, nothing is lost.

See CONTRIBUTING.md for the branch model.

@coderabbitai

coderabbitai Bot commented Jun 16, 2026

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: affe0f02-0ace-431b-9432-ae0a2f53460e

📥 Commits

Reviewing files that changed from the base of the PR and between 394c1c3 and 1587a93.

📒 Files selected for processing (26)
  • CHANGELOG.md
  • desktop/package.json
  • desktop/public/store-covers/code-server.webp
  • desktop/public/store-covers/comfyui.webp
  • desktop/public/store-covers/hermes.webp
  • desktop/public/store-covers/home-assistant.webp
  • desktop/public/store-covers/immich.webp
  • desktop/public/store-covers/jellyfin.webp
  • desktop/public/store-covers/n8n.webp
  • desktop/public/store-covers/nextcloud.webp
  • desktop/public/store-covers/ollama.webp
  • desktop/public/store-covers/openclaw.webp
  • desktop/public/store-covers/radarr.webp
  • desktop/public/store-covers/sonarr.webp
  • desktop/public/store-covers/stable-diffusion-bw.webp
  • desktop/public/store-covers/stable-diffusion.webp
  • desktop/public/store-covers/uptime-kuma.webp
  • desktop/public/store-covers/vaultwarden.webp
  • desktop/src/apps/StoreApp/AppIcon.tsx
  • desktop/src/apps/StoreApp/MobileStore.test.tsx
  • desktop/src/apps/StoreApp/MobileStore.tsx
  • desktop/src/apps/StoreApp/index.tsx
  • desktop/src/apps/StoreApp/types.ts
  • docs/STATUS.md
  • pyproject.toml
  • tinyagentos/__init__.py

📝 Walkthrough

Walkthrough

Adds a full mobile App Store-style MobileStore component with tabbed navigation, carousels, search, and device filtering. Introduces shared AppIcon and StoreCover components with staged URL fallbacks and monogram tiles. Desktop store cards are refactored to use these shared components. CatalogApp gains coverImage, and curated catalog entries are populated with cover URLs. Version bumped to 1.0.0-beta.3.

Changes

Mobile Store UI and Icon/Cover System

Layer / File(s) Summary
CatalogApp coverImage type and cover data
desktop/src/apps/StoreApp/types.ts, desktop/src/apps/StoreApp/index.tsx
CatalogApp gains optional coverImage?: string. HOMELAB_APPS, MOCK_APPS, and a new COVER_BY_ID map are populated with cover URLs, and catalog normalization hydrates cover/coverImage from COVER_BY_ID when the backend omits them.
AppIcon and StoreCover shared component system
desktop/src/apps/StoreApp/AppIcon.tsx
New file adds icon URL resolution with APP_ICONS overrides, slug/family derivation, staged candidate fallbacks, a Monogram component with hash-selected gradient palette, coverFor helper, and StoreCover with image retry on coverImage prop change.
MobileStore component and sub-components
desktop/src/apps/StoreApp/MobileStore.tsx
Implements the full mobile store: GetButton (POST install, busy/retry/installed states), AppRow/AppRowList, FeatureCard, Carousel, SectionHead, TabBar, SearchView, SectionView, and DeviceSheet. MobileStore orchestrates tab, search, and device-filter state with filterCatalog/compatFromResolver-derived app pools.
Desktop card refactor to use AppIcon/StoreCover
desktop/src/apps/StoreApp/index.tsx
Removes inline resolveIconUrl/APP_ICONS/di/gh helpers and refactors AppCard, RichCard, SubscriptionRow, and HeroFeatured to render branding via StoreCover and AppIcon.
Mobile detection and MobileStore routing in StoreApp
desktop/src/apps/StoreApp/index.tsx
Adds isMobile via useIsMobile and a mobile-only early return that renders MobileStore with the same catalog/handler props, bypassing the desktop layout.
Tests, version bump, and docs
desktop/src/apps/StoreApp/MobileStore.test.tsx, CHANGELOG.md, docs/STATUS.md, desktop/package.json, pyproject.toml, tinyagentos/__init__.py
Adds tests covering GetButton states, StoreCover/AppIcon instance-reuse behavior, and a JSDOM scrollTo polyfill. Bumps all version fields to 1.0.0-beta.3 and updates changelog/status docs.

Sequence Diagram(s)

sequenceDiagram
  participant User
  participant MobileStore
  participant GetButton
  participant StoreInstallAPI

  User->>MobileStore: Open Store (mobile)
  MobileStore->>MobileStore: useIsMobile → early return
  MobileStore->>MobileStore: filterCatalog + compatFromResolver
  User->>MobileStore: tap tab / type search
  MobileStore->>MobileStore: setActiveTab / setQuery

  User->>GetButton: tap "Get"
  GetButton->>StoreInstallAPI: POST /api/store/install-v2
  alt HTTP 200
    StoreInstallAPI-->>GetButton: OK
    GetButton->>MobileStore: onInstall(appId)
    MobileStore->>MobileStore: mark installed
  else HTTP 500
    StoreInstallAPI-->>GetButton: Error
    GetButton->>User: show "Retry"
  end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • jaylfc/taOS#959: Directly overlaps with this PR — covers the same MobileStore UI, StoreApp mobile routing, and AppIcon/StoreCover deterministic icon/cover rendering with coverImage support.
  • jaylfc/taOS#871: Extended CatalogApp with logo/cover metadata and the resolveIconUrl-based icon loading pipeline that this PR replaces with the StoreCover/AppIcon system.

Poem

🐇 Hop, hop — a new store in sight,
Carousels spinning, monograms bright!
"Get" pills and stars in a row,
Cover art shining with gradient glow.
Beta three ships with a ribbon and bow~ ✨

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@gitar-bot

gitar-bot Bot commented Jun 16, 2026

Copy link
Copy Markdown
Code Review ✅ Approved

Promotes the v1.0.0-beta.3 release, featuring a redesigned mobile Store layout, enhanced app cover and icon rendering, and improved installation state management. No issues found.

Options

Auto-apply is off → Gitar will not commit updates to this branch.
Display: compact → Showing less information.

Comment with these commands to change:

Auto-apply Compact
gitar auto-apply:on         
gitar display:verbose         

Was this helpful? React with 👍 / 👎 | Gitar

setFailed(false);
try {
const target = installTargets[0]?.name ?? "local";
const res = await fetch("/api/store/install-v2", {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Mobile installs ignore the selected device target

GetButton always posts target_remote: installTargets[0]?.name ?? "local", while the desktop path uses selectedDevices[0] as the default when a single device is selected. If a mobile user has selected/filtered to a remote device, the install can target the wrong host.

Use the selected mobile device as the install target and include it in the callback dependencies.

const compatibleFor = useCallback((pool: CatalogApp[]): CatalogApp[] => {
const selDevObjs = installTargets.filter((t) => selectedDevices.includes(t.name));
const { compatible } = filterCatalog(pool, selDevObjs, selectedBackends);
return compatible.filter((a) =>

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Mobile view applies backend filters without exposing backend controls

compatibleFor applies selectedBackends, and StoreApp persists backend selections, but MobileStore only exposes device selection. A user who selected a backend in the desktop layout can get an empty mobile catalog with no way to clear or change that backend filter.

Either add a mobile backend filter control or clear/reset backend filters when entering the mobile layout.

}, [installTargets, selectedDevices, selectedBackends, compatMap]);

const tabPool = useMemo(() => {
const types = NAV_TYPE_MAP[tab] ?? [];

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Updates tab bypasses device/backend/model compatibility filters

The Updates tab lists every installed app with update_available === true, while the desktop Updates path still runs through filterCatalog and compatFromResolver. This can show updates for apps that are incompatible with the selected device/backend/model resolver state.

Apply the same compatibleFor(...) filtering used by the other mobile tabs to the updates pool.

@kilo-code-bot

kilo-code-bot Bot commented Jun 16, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 3 Issues Found | Recommendation: Address before merge

Overview

Severity Count
CRITICAL 0
WARNING 3
SUGGESTION 0

Issue Details

File Line Issue
desktop/src/apps/StoreApp/MobileStore.tsx 56 Mobile install target ignores selectedDevices and can post installs to the wrong host.
desktop/src/apps/StoreApp/MobileStore.tsx 319 Mobile layout applies persisted backend filters but exposes no backend control to clear/change them.
desktop/src/apps/StoreApp/MobileStore.tsx 325 Updates tab bypasses device/backend/model compatibility filtering used by the desktop path.
Other Observations (not in diff)

Issues found in unchanged code that cannot receive inline comments:

File Line Issue
PR metadata N/A This PR targets master, while the GitHub Actions comment says stable installs track master and asks for retargeting to dev.
PR metadata N/A Coderabbit's comment says the pull request is closed; confirm current PR state before relying on review status.
Files Reviewed (10 files)
  • desktop/src/apps/StoreApp/MobileStore.tsx - 3 issues
  • desktop/src/apps/StoreApp/AppIcon.tsx
  • desktop/src/apps/StoreApp/MobileStore.test.tsx
  • desktop/src/apps/StoreApp/index.tsx
  • desktop/src/apps/StoreApp/types.ts
  • desktop/src/apps/StoreApp/filter.ts (supporting context)
  • desktop/src/hooks/use-is-mobile.ts (supporting context)
  • CHANGELOG.md
  • docs/STATUS.md
  • desktop/package.json, pyproject.toml, tinyagentos/__init__.py

Fix these issues in Kilo Cloud


Reviewed by nex-n2-pro:free · 1,627,181 tokens

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Development

Successfully merging this pull request may close these issues.

1 participant