Conversation
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.
… SD banners wired), Pi on b4b2af7
- 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
Qodo reviews are paused for this user.Troubleshooting steps vary by plan Learn more → On a Teams plan? Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center? |
|
👋 Thanks for the PR! This one targets See CONTRIBUTING.md for the branch model. |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (26)
📝 WalkthroughWalkthroughAdds a full mobile App Store-style ChangesMobile Store UI and Icon/Cover System
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
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Poem
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Code Review ✅ ApprovedPromotes 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. OptionsAuto-apply is off → Gitar will not commit updates to this branch. Comment with these commands to change:
Was this helpful? React with 👍 / 👎 | Gitar |
| setFailed(false); | ||
| try { | ||
| const target = installTargets[0]?.name ?? "local"; | ||
| const res = await fetch("/api/store/install-v2", { |
There was a problem hiding this comment.
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) => |
There was a problem hiding this comment.
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] ?? []; |
There was a problem hiding this comment.
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.
Code Review SummaryStatus: 3 Issues Found | Recommendation: Address before merge Overview
Issue Details
Other Observations (not in diff)Issues found in unchanged code that cannot receive inline comments:
Files Reviewed (10 files)
Fix these issues in Kilo Cloud Reviewed by nex-n2-pro:free · 1,627,181 tokens |
Promote dev to master for the v1.0.0-beta.3 release.
Includes:
Version bumped to 1.0.0-beta.3 across the 3 version files + CHANGELOG.
Summary by CodeRabbit
New Features
Bug Fixes
Tests
Documentation