Skip to content

Apps UX improvements#410

Open
krokicki wants to merge 16 commits into
mainfrom
apps-improvements
Open

Apps UX improvements#410
krokicki wants to merge 16 commits into
mainfrom
apps-improvements

Conversation

@krokicki

@krokicki krokicki commented Jul 19, 2026

Copy link
Copy Markdown
Member

A set of small, independent quality-of-life improvements to the Apps feature — catalog, launch flow, and the app/listing/job detail pages. Each ships as its own commit; the four core items are captured in docs/superpowers/specs/2026-07-18-apps-improvements-design.md.

Navigation: breadcrumbs across the Apps pages

The launch page and the app/listing detail pages now show a breadcrumb trail (apps-home icon → app → entry point, -delimited) in place of the old back-arrow + title header, via a new AppBreadcrumbs component.

  • The trail's origin is inferred from install status with no router plumbing: installed apps route home → My Apps and back to the app detail page; not-installed apps route home → App Catalog and back to the matching catalog listing (resolved from the cached catalog query by canonical URL + manifest path).
  • Launch breadcrumbs point back to wherever the user came from, and catalog-originated launches keep the App Catalog tab selected.

Catalog

  • Install count — a new sortable "Installs" column and a count on the listing detail page. An install is counted live from user_apps (grouped COUNT by url + manifest path, joined in memory) — no new column, no migration, no counter to keep in sync.
  • Leaner table — dropped the Repository column and let the Description column take the remaining width; the app name no longer includes the entry point.

Add-app flow

Pasting a GitHub URL that embeds a branch/tag (e.g. .../tree/my-branch) now splits the ref into the Revision field automatically, leaving a bare repo URL in the URL field. A pasted ref is authoritative and overwrites the Revision box; typing a bare URL is undisturbed. Backed by a new pure helper splitGithubRef.

Commit display

Standardized the commit SHA display: the app page now shows the short 7-char SHA (matching the job page) and both the "App commit" and job-page "Version" labels are renamed to Commit.

Working directory: new repo option

The working_dir value that ran from the manifest's directory inside the clone is renamed to manifest (the new default for non-container runnables). repo is reintroduced to always run from the clone root, ignoring the manifest's subdirectory — useful for a manifest nested in a monorepo whose command must run from the top of the project. The cached clone is now bind-mounted into containers for both manifest and repo (anything but work).

Not backwards compatible: in the separate-repos case (manifest and code in different repos), manifest now cds into repo/<manifest_path> for consistency with the same-repo case, where it previously ran from the clone root. FG_MANIFEST_DIR (added on main) is reconciled with the rename and likewise points at repo[/manifest_path].

Testing

  • Backend: new pytest coverage for the catalog install count.
  • Frontend: unit tests for splitGithubRef (bare URL, /tree/<branch>, /tree/main, .git suffix, non-GitHub string) and component tests for AppBreadcrumbs.

@StephanPreibisch @JaneliaSciComp/fileglancer

krokicki and others added 16 commits July 18, 2026 16:17
Covers four changes: paste-URL revision split, launch-page breadcrumbs,
catalog install count, and short "Commit" display/rename.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When adding an app, pasting a URL copied from a GitHub branch/tag view
(…/tree/<ref>) now moves the ref into the Revision box and leaves the URL
field bare, instead of burying the ref in the URL. Add splitGithubRef helper
(reusing parseGithubUrl) with unit tests; bare and SSH URLs are untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The app detail page now renders a 7-char monospace commit SHA, formatted
identically to the Job page. Both labels are renamed to "Commit" (Job page
"Version" and app page "App commit").

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The catalog now reports install_count per listing — the number of distinct
users who currently have the app installed — computed with one grouped COUNT
over user_apps, joined to listings by (url, manifest_path). No migration or
counter to maintain. Shown as a sortable "Installs" column in the catalog
table view and a row on the listing detail page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The launch page now has a file-browser-style breadcrumb trail
(apps-home icon › App Name › entry-point) in place of the back-arrow header,
so the user can jump back to the app level or the top apps page. Origin is
inferred from install status: installed apps link back to My Apps and their
detail page; uninstalled apps link back to the App Catalog and their listing.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
AppDetail and ListingDetail now use the same file-browser-style breadcrumb
header as the launch page (apps-home icon › name) in place of the back-arrow
header, keeping their action buttons and badges. Home links to My Apps and the
App Catalog respectively.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The launch-page breadcrumbs now follow the actual navigation origin, carried in
React Router location state (not the URL): launching from My Apps records the
My Apps origin, launching from a catalog listing records the App Catalog origin
and links the app-name segment back to that listing — even when the app is also
installed. On reload/direct navigation, where state is lost, the previous
install-status inference is used as a fallback.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Apps tab rail highlighted My Apps on every launch page. It now reads the
launch origin from navigation state, so a launch started from the App Catalog
keeps the App Catalog tab selected. Falls back to My Apps when state is absent
(reload/direct navigation), matching the breadcrumb behavior.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Removes the wide Repository column so each catalog entry fits on a single row;
the repo is still reachable from the listing detail page.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After the Repository column was removed, the fixed fraction template left the
Sharer column oversized and Description cramped. Size Sharer, Shared on,
Installs, Status, and Actions to fixed widths that fit their content, and let
Name and Description share the remaining space with Description dominant.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
When a manifest's repo_url was a bare GitHub URL (no /tree/branch), the
"separate code repo" check compared it against the branch-carrying stored
app URL, so they never matched. Same-repo apps on a non-default branch were
treated as having a separate code repo and ran from that repo's default
branch (e.g. master) instead of the app's branch.

Compare repo identity (owner/repo) via same_github_repo(), ignoring branch,
so a bare repo_url for the same repo is not mistaken for a separate one.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The working_dir option that ran from the manifest's directory inside the
clone is now named "manifest" (the new default for non-container runnables).
"repo" is reintroduced to always run from the clone root, ignoring the
manifest's subdirectory — useful for a manifest nested in a monorepo whose
command must run from the top of the project.

The cached clone is now bind-mounted into containers for both "manifest"
and "repo" (anything but "work").

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Previously the separate-repos case (manifest and code in different repos)
ran 'manifest' from the clone root, while the same-repo case ran from the
manifest's subdirectory. Compute manifest_suffix once from manifest_path so
both cases behave identically.

Not backwards compatible: a separate-repos app whose manifest lives in a
subdirectory now cd's into repo/<subdir> instead of repo/.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@krokicki krokicki changed the title Apps minor improvements Apps UX improvements Jul 22, 2026
@krokicki

Copy link
Copy Markdown
Member Author

TODO:

  • Add tooltip for app catalog name which shows the full repo name

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant