Signed out, this forge still opens with dev's pitch — Your code, your machine … real git over HTTPS, issues, pull requests — so the front door the direction is about is a door only signed-in people ever see; show a visitor the public apps instead, with the pictures the forge already takes.
home (src/web/pages/site.ts:670-685) routes to studioHome only when user !== undefined; everyone else gets landing(ctx) (site.ts:512), which is the dev story. Meanwhile the look machinery landed: looksForApps/looksForEnv (src/core/looks.ts), lookThumb and lookUrl (src/web/pages/looks.ts), and production pictures exist for the public apps on this forge. This is the piece #28 needs before flipping DEFAULT_MODE: a default that only changes the signed-in home is half a front door.
Done looks like
[ ] Signed out in studio mode, / leads with the public apps that are serving: name, one clamped line of description, its live state, and its production look as a picture that links to the app's page.
[ ] Only what a signed-out reader may see is on it: public repositories that are apps, and a look image route that answers 404 for a private app to an anonymous request (assert it, do not assume it).
[ ] Sign in and Create an account stay one click away, and the dev story stays reachable — ?mode=dev renders the existing landing unchanged, and nothing in landing is deleted.
[ ] A forge with no public apps — a fresh install, which is how most people meet this page — falls back to the existing landing rather than an empty shelf.
[ ] First paint is server-rendered and stays under the page budget with the pictures at their natural size and loading="lazy": fixed width and height attributes, no layout shift as they arrive, and the page's HTML no larger than the dashboard's.
[ ] The anonymous home is cacheable-cheap: it must not run a per-app runtime status call per row if that costs a process call — read what the page already has, as appsCard does.
[ ] test/studio.test.ts: signed out with the studio cookie lists a public app and its look, and does not list a private one; ?mode=dev still renders the landing; with no public apps the landing renders.
Files
src/web/pages/site.ts (the studio branch of home, a studioLanding), src/web/pages/looks.ts (reuse lookThumb), src/web/style/* for the shelf if it needs a rule, docs/STUDIO.md, test/studio.test.ts.
Risks
This page is the one page anonymous traffic hits, so it is the one page where a per-row database or runtime call turns into a load problem; keep the reads to the two the dashboard already makes. Descriptions here are user text and must be escaped and clamped — the studio home's own rows run to five lines today (#28 has that case for the signed-in side). A picture of a public app is public by definition: do not link a preview environment's look, only production's.
Signed out, this forge still opens with dev's pitch — Your code, your machine … real git over HTTPS, issues, pull requests — so the front door the direction is about is a door only signed-in people ever see; show a visitor the public apps instead, with the pictures the forge already takes.
home(src/web/pages/site.ts:670-685) routes tostudioHomeonly whenuser !== undefined; everyone else getslanding(ctx)(site.ts:512), which is the dev story. Meanwhile the look machinery landed:looksForApps/looksForEnv(src/core/looks.ts),lookThumbandlookUrl(src/web/pages/looks.ts), and production pictures exist for the public apps on this forge. This is the piece #28 needs before flippingDEFAULT_MODE: a default that only changes the signed-in home is half a front door.Done looks like
/leads with the public apps that are serving: name, one clamped line of description, its live state, and its production look as a picture that links to the app's page.?mode=devrenders the existing landing unchanged, and nothing inlandingis deleted.loading="lazy": fixed width and height attributes, no layout shift as they arrive, and the page's HTML no larger than the dashboard's.appsCarddoes.test/studio.test.ts: signed out with the studio cookie lists a public app and its look, and does not list a private one;?mode=devstill renders the landing; with no public apps the landing renders.Files
src/web/pages/site.ts(the studio branch ofhome, astudioLanding),src/web/pages/looks.ts(reuselookThumb),src/web/style/*for the shelf if it needs a rule,docs/STUDIO.md,test/studio.test.ts.Risks
This page is the one page anonymous traffic hits, so it is the one page where a per-row database or runtime call turns into a load problem; keep the reads to the two the dashboard already makes. Descriptions here are user text and must be escaped and clamped — the studio home's own rows run to five lines today (#28 has that case for the signed-in side). A picture of a public app is public by definition: do not link a preview environment's look, only production's.
Suggested: Scout.