Skip to content

Apps page: plan, rename Integrations to Apps, several marketplaces, share an app by link and QR - #2383

Closed
joepio wants to merge 3 commits into
developfrom
claude/project-thread-3l53n8
Closed

joepio wants to merge 3 commits into
developfrom
claude/project-thread-3l53n8

Conversation

@joepio

@joepio joepio commented Oct 28, 2026 •

Copy link
Copy Markdown
Member

Requested by Joep · project thread

The plan (planning/app-marketplace.md, accepted by Joep on 28 Oct) and the first slice of its phase 1.

Plan

One catalog of Listings in marketplace drives, discovery in context, sharing by link and QR, install with the package in the drive, activation per signer, "Add to home screen" for any resource, selling access via signed Entitlements. Leading example: Leerboom as a separately sold school app.

Phase 1, first slice

  • Integrations is now Apps: page, sidebar entry, title; route /app/apps. /app/integrations redirects and keeps its search params (the integration proxy still returns there).
  • Several marketplaces: extra catalog URLs next to the primary one (Settings > Integration > Marketplaces, stored per browser). Entries merge, the earlier marketplace wins a duplicate shortname, an unreachable marketplace shows its own error and hides nothing (15 s timeout). ?marketplace=<url> asks to add one.
  • Share an app: each drive-app card has Share with link, QR, Copy and Open. ?app=<shortname> scrolls to and highlights the card. The QR/copy block is factored out of ShareLinkPanel into components/ShareLink.tsx.
  • Not yet: Listing/catalog convergence and the catalog.json export (question to the catalog owner in Catalog: may catalog.json become an export of Listing resources? atomic-plugins#702).

Screenshots (desktop 1280 and phone 390) were shared in the project thread; they are not committed.

Related Issues

ontola/atomic-plugins#702

Checklist

  • Add changelog entry linking to issue, describe API changes (no API change)
  • Add or update tests if needed: vitest for marketplace merge, URL list storage and share links; e2e specs updated for the rename
  • Update docs if needed (planning)

Tests

typecheck 0 errors, oxlint and format clean, vitest on PluginRuns, helpers and Settings pass, Playwright integration-demo, integration-store-install, integration-visibility, integration-workspace, plugins, drive-catalog: 14 passed (dev profile). No Playwright spec yet for the marketplace, share and ?app= flows.

🤖 Generated with Claude Code

https://claude.ai/code/session_01AHutN34dKKUVaBMgyQSttV

Accepted direction (Joep, 28 Oct): one catalog of Listings in marketplace
drives, discovery in context, install with the package blob in the drive,
activation per signer, Add to home screen for any resource, and selling
access to content drives through signed Entitlements.
@joepio
joepio marked this pull request as ready for review October 28, 2026 13:34
@joepio joepio self-assigned this Oct 28, 2026

joepio commented Oct 28, 2026

Copy link
Copy Markdown
Member Author

Complexity review: OK. Merging the two catalogs and two install paths into one is the right direction. Three points to add to the plan so it doesn't grow a third of each:

  1. A third catalog. schema-catalog.md proposes a central catalog for schemas, templates and import mappings, and unified-templates.md continues the template catalogue. Phase 6 adds templates as a manifest contribution. State in Decisions that schemas and templates are Listings in the same marketplace drives, or say why not. Otherwise "one catalog" becomes three again.
  2. Entitlement vs Invite. Core Invite already has target, usagesLeft (seats), expiresAt and users, and it is what grants read rights on a drive. What is new is that access ends (validUntil) and something revokes the rights when it lapses. Model Entitlement as an Invite plus that one field, or name in phase 5 what does the revoking (the seller's node? a scheduled run?). The current text grants read rights but never says who takes them away.
  3. Release for drive apps. plugin-runtime-convergence.md defines Release as a pinned, immutable server-plugin artifact. A drive app whose blob is copied into the drive and updated "within the same grants automatically" needs the same immutability rules. Link that section from phase 1 rather than restating it.

Generated by Claude Code

…ink and QR

The Integrations page is now Apps (/app/apps; /app/integrations redirects and
keeps its search). Extra marketplace catalogs can be added in Settings or by
link (?marketplace=), merged with the primary one with the earlier winning a
duplicate shortname; an unreachable one shows its error and hides nothing.
Each drive app card has Share (link + QR, factored out of ShareLinkPanel), and
?app= scrolls to and highlights the card.
@joepio joepio changed the title Plan: apps discovery, sharing, installation and marketplace Apps page: plan, rename Integrations to Apps, several marketplaces, share an app by link and QR Oct 28, 2026

joepio commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

Review of the implementation commits (a23b684, b5cbd1f). ShareLink.tsx extracted from ShareLinkPanel is a good reuse. Two points:

  1. Two settings for one list. helpers/pluginCatalogUrl.ts now keeps the primary catalog (plugin-catalog-url) and a second localStorage key plugin-marketplaces. useMarketplaceUrls then merges them and dedupes against the primary again, and addMarketplace checks both. One ordered list whose first entry is the default removes the merge, the double dedupe and the second event name. Read the old key once, as a migration.
  2. Per device, while the plan says per signer. localStorage means every device and every browser re-adds the same marketplaces. The plan (decision 2) ties activation to the agent. Storing the list on the agent (or the drive) syncs it for free and needs no subscribeToSetting event. Fine to defer, but then say in the plan that phase 1 is per device.

Generated by Claude Code

joepio added a commit that referenced this pull request Oct 29, 2026
- #2373: docs for Atomic Sync, the atomic.place section, a new sidebar and a docs screenshot script, kept out of the e2e suite.
- #2375: no lookbehind regexes, so iOS 16.3 and older load the web app; the build fails on any new one.
- #2383: planning/app-marketplace.md.
- #2389: sentry.test.ts waits for the newest identity instead of a fixed sleep.

joepio commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

The planning commit (d8e0af4) landed via batch #2384 (100841e). This PR stays open for the Apps code slice, which goes in the next batch.


Generated by Claude Code

joepio added a commit that referenced this pull request Oct 29, 2026
…2391)

- #2383: Integrations becomes Apps, several marketplaces, share an app by link and QR.
- #2390: drive icon upload is optimistic, failures are visible, notifyErrorOnce and asError in the store.
- #2350: removes unused helpers, the useMarkdown and useDate hooks and dead Rust helpers.
- #2394: the sidebar drag overlay no longer stays on screen after a drop.
- #2395: tables opened from another drive show their rows and totals.
- #2396: useCollection rebuilds when the query's drive changes.
- #2397: the Getting started card can be turned back on from drive settings.
- #2399: a full localStorage no longer crashes setDrive.
- MeetingChatOverlay test waits for the overlay to register for Back.

joepio commented Oct 29, 2026

Copy link
Copy Markdown
Member Author

Landed on develop via batch #2391 (squash 52f878c), with a green Main (Mancave) / CI run on its exact head 58efc14. Closing.


Generated by Claude Code

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