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
Check · Review · Land · Live done — Landed and live in production.
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
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 carrieslive, the production address, set only when production is running. It's read throughenvsFor, so a private app's state stays hidden from anyone who couldn't see it before. - Rendering:
src/web/studio/client_home.tsadds the button only whenliveis set. - Test: the new test in
test/client-home.test.tsruns the same app with production stopped and then running. Stopped: no Open and no/app/production/openlink. 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.
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.
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): …, andoon that app opens the existing link dialog with its live address. The dialog offers Enter to open a browser andcto copy. The footer showso open the apponly when some app is running. An app that is not running has the old line, andodoes nothing on it. A terminal can't launch a browser on its own, soogoes through the link dialog's existing browser/copy handling. Both doors read the samelivevalue 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
omarker 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.
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. 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.
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.tspasses (24 tests) andbun x tsc --noEmitis clean. I haven't run the whole suite; the forge's check does that on this push./<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.clientAppRows(src/core/client-apps.ts) now carrieslive, the production address, set only when production is running. It's read throughenvsFor, so a private app's state stays hidden from anyone who couldn't see it before.src/web/studio/client_home.tsadds the button only whenliveis set.test/client-home.test.tsruns the same app with production stopped and then running. Stopped: no Open and no/app/production/openlink. 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.Closes #3400