The Home empty state tells you your Personal Server is ready without ever checking whether it is. src/pages/home/components/connected-sources-list.tsx:259-264 builds the message from this fragment:
afterServer: " is ready. Connect a source to ",
The state that selects it is derived from source count alone (getOnboardingMessageState, L33, called at L119), so a user whose server is stopped or stuck in an error still reads "is ready". Then they click through, nothing works, and they have no idea why.
The status already exists and is more detailed than the copy. src/hooks/usePersonalServer.ts:88 types it as 'stopped' | 'starting' | 'running' | 'error', and src/pages/settings/sections/storage/components/status-row.tsx:27-60 already renders all four states with wording you can borrow.
The wiring is the actual task: src/pages/home/index.tsx does not import usePersonalServer today, so bring the status in and pass it down to ConnectedSourcesList. Save "ready" for running, say something short and accurate for starting, stopped, and error, and point people at the Personal Server page when it is not running. The route is ROUTES.personalServer in src/config/routes.ts.
One thing not to break: importing a source should still be offered even when the server is not running. The point is to stop claiming a state we have not checked, not to gate the app behind it.
This is about the readiness message only. Sign-in and server modes are a separate conversation.
runs typecheck plus vitest. Beyond that I would like to see the four states in the PR, either as screenshots or as a short note on how you forced each one. starting and error are the ones nobody checks.
The Home empty state tells you your Personal Server is ready without ever checking whether it is.
src/pages/home/components/connected-sources-list.tsx:259-264builds the message from this fragment:The state that selects it is derived from source count alone (
getOnboardingMessageState, L33, called at L119), so a user whose server is stopped or stuck in an error still reads "is ready". Then they click through, nothing works, and they have no idea why.The status already exists and is more detailed than the copy.
src/hooks/usePersonalServer.ts:88types it as'stopped' | 'starting' | 'running' | 'error', andsrc/pages/settings/sections/storage/components/status-row.tsx:27-60already renders all four states with wording you can borrow.The wiring is the actual task:
src/pages/home/index.tsxdoes not importusePersonalServertoday, so bring the status in and pass it down toConnectedSourcesList. Save "ready" forrunning, say something short and accurate forstarting,stopped, anderror, and point people at the Personal Server page when it is not running. The route isROUTES.personalServerinsrc/config/routes.ts.One thing not to break: importing a source should still be offered even when the server is not running. The point is to stop claiming a state we have not checked, not to gate the app behind it.
This is about the readiness message only. Sign-in and server modes are a separate conversation.
runs typecheck plus vitest. Beyond that I would like to see the four states in the PR, either as screenshots or as a short note on how you forced each one.
startinganderrorare the ones nobody checks.