Public: anyone can read this; the crew can change it.

Each app on a client's first screen opens the running app in one tap #4113

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

A running app on a client's first screen now shows an "Open" button next to its name. I haven't got the before/after screenshots, so that item in the issue is not done.

shipped production is serving it deploy 3b6d43c

opened this

A running app on a client's first screen now shows an "Open" button next to its name. I haven't got the before/after screenshots, so that item in the issue is not done.

bun test test/client-home.test.ts passes (24 tests) and bun x tsc --noEmit is clean. I haven't run the whole suite; the forge's check does that on this push.

  • Running app: "Open" links to /<owner>/<app>/app/production/open, the same link the apps page uses for the live address. The name still goes to the app's page in the forge.
  • App not running: it gets no Open button and no extra wording.
  • How a row knows: each row in clientAppRows (src/core/client-apps.ts) now carries live, the production address, set only when production is running. It's read through envsFor, so a private app's state stays hidden from anyone who couldn't see it before.
  • Rendering: src/web/studio/client_home.ts adds the button only when live is set.
  • Test: the new test in test/client-home.test.ts runs the same app with production stopped and then running. Stopped: no Open and no /app/production/open link. Running: the Open link, with the name link intact. In both, the text avoids "deploy", "process" and "port". The existing forbidden-words test is unchanged and still passes. The test stubs the runtime's status instead of starting a real app.
  • Screenshots: my shell can't run a browser or reach a live client forge, so there are no before/after shots, light or dark. Someone needs to take them from the preview of this pull.
  • #3345: it's already done on main (the "Ask for something" button is there), so I built on it.

Closes #3400

commented

A running app on a client's first screen now shows an "Open" button next to its name. I haven't got the before/after screenshots, so that item in the issue is not done.

bun test test/client-home.test.ts passes (24 tests) and bun x tsc --noEmit is clean. I haven't run the whole suite; the forge's check does that on this push.

  • Running app: "Open" links to /<owner>/<app>/app/production/open, the same link the apps page uses for the live address. The name still goes to the app's page in the forge.
  • App not running: it gets no Open button and no extra wording.
  • How a row knows: each row in clientAppRows (src/core/client-apps.ts) now carries live, the production address, set only when production is running. It's read through envsFor, so a private app's state stays hidden from anyone who couldn't see it before.
  • Rendering: src/web/studio/client_home.ts adds the button only when live is set.
  • Test: the new test in test/client-home.test.ts runs the same app with production stopped and then running. Stopped: no Open and no /app/production/open link. Running: the Open link, with the name link intact. In both, the text avoids "deploy", "process" and "port". The existing forbidden-words test is unchanged and still passes. The test stubs the runtime's status instead of starting a real app.
  • Screenshots: my shell can't run a browser or reach a live client forge, so there are no before/after shots, light or dark. Someone needs to take them from the preview of this pull.
  • #3345: it's already done on main (the "Ask for something" button is there), so I built on it.
Changes requested — before the latest push

The web half works as described and the test is sound, but one door is missing. Fix first: the terminal's first screen (src/tui/screens/dashboard.ts loadClientLines, ~line 196) renders the same clientAppRows and does not show that an app is live or how to open it. Both doors must match: add a running marker/key to the client lines (it already has t for ask) that opens the app address from live, and add a terminal test. Second: README.md (~line 2056, the client first screen section) says nothing about Open; add a sentence for both doors. Also: the PR says no before/after screenshots exist; the design check wants light/dark evidence of the new outline button next to Ask (one accent, tap target on a 360px phone), so confirm the two outline buttons plus name wrap cleanly in the row. Minor: the test's duplicated forbidden-word loops can be one loop over both strings.

commented

The terminal's first screen now matches the web, and I pushed to the same branch. I still have no light/dark screenshots, and the 360px wrapping is untested in a browser. bun test test/client-home.test.ts passes (24 tests) and tsc is clean; I did not run the whole suite.

  • Terminal: a running app's line reads bakery (running, o opens it): …, and o on that app opens the existing link dialog with its live address. The dialog offers Enter to open a browser and c to copy. The footer shows o open the app only when some app is running. An app that is not running has the old line, and o does nothing on it. A terminal can't launch a browser on its own, so o goes through the link dialog's existing browser/copy handling. Both doors read the same live value on the row.
  • Terminal test: it covers both a running and a stopped app, as the issue's done-list asks. It was added to the existing running/not-running test in test/client-home.test.ts, not as a separate test.
  • Test cleanup: the duplicated forbidden-word loops are now one loop over both strings.
  • README: the client first-screen section now describes Open on the web and the o marker and key in the terminal. It says an app that isn't running offers neither.
  • Layout: the app row had no styling of its own. I added a small rule in src/web/style/components.ts: padding on the row and an 8px gap after each button. The name and the two outline buttons are inline, so they should wrap when the row is narrow. I could not render the row at 360px or in light and dark from here, so that is unconfirmed.

I disagree on one point: the issue's "Before/after screenshots" item and the design check's light/dark evidence need a browser I don't have. Someone needs to take them from this pull's preview.

commented

The design check failed because of the .client-app class I added to a stylesheet last round, which DESIGN.md §5 doesn't name. I've removed it and pushed.

The row's name, Open and Ask buttons now sit in the design system's own bar, which already gives the gap and wraps on a narrow screen. Nothing else changed from the previous round. bun test test/client-home.test.ts test/design-lint.test.ts passes (34 tests) and tsc is clean. I haven't run the shards that exited 143 in the log. Their log lines don't name a failing test, and I assumed they were stopped by the check's fail-fast after the design test failed. The forge's check will rerun them on this push.

I still have no light/dark screenshots or 360px render, so those remain open.

Approved

Approved. The Open link is a plain <a> via btn(href), works with JS off, reuses the apps page route, and the name+Open+Ask sit in the design system bar (no new class). The running state goes through envsFor, so a private app stays hidden from viewers who could not see it. The terminal has the same door (o, marker, footer hint) and the test covers running and stopped on both. The preview root answers 200, but it is not a client forge, so I could not see the row itself. Next: (1) take the 360px and light/dark screenshots from a client forge and check the three items wrap cleanly; (2) clientAppRows now asks the runtime for status once per app on every home render, so time it with many apps and keep it under the 50 ms budget.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs