feat: cloud welcome screen org creation#9189
Conversation
|
Ah @Di7design, that's my bad for #3. I had Aditya make it all vertically centered because in First Mile for RD on a big screen, there was a lot of white space in the bottom half of my screen
If it helps, this is what Linear does linear.app/welcome |
Di7design
left a comment
There was a problem hiding this comment.
If we keep the select from org list page, then there is a missing add icon in the create new org action. Other than this everything looks good to me!
Nice to have for improvement:
- Scale the color mode card to width 228px when hovering.
- Add a 300ms ease out when switching the color mode.
color.mode.pick.transition.mov
cc @ericokuma
Perhaps add a back button? Also @Di7design, would we want to be visually consistent and have the Continue buttons located in the same area?
|
|
The two steps use different UI patterns, so different placement is fine:
What should stay consistent: button label ("Continue" everywhere), and button style/component. On back buttons: Maybe not for phase 1? I've been seeing there is no back button on other tools' welcome flow, maybe it's a psychological nudge at play: removing "back" reduces hesitation and keeps users moving toward activation. It signals "you're on a guided path" rather than a free-form navigation experience? |
Just thinking out loud. When do we ever need this org screen selector?
I guess the only time this org screen selector is "needed" is when you have access to multiple organizations and you log into Rill. The theme selection one looks good. Only thing is the highlight border is a bit thin/light so I can't really see when the System option is selected |
b0e8787 to
d07178e
Compare
ericpgreen2
left a comment
There was a problem hiding this comment.
Product / UX / Design
1. Welcome flow doesn't survive page refresh
InWelcomeFlowStore is an in-memory writable<boolean> (web-admin/src/features/welcome/welcome-store.ts). If a user refreshes at any point during the welcome flow — theme page, org creation — the store resets to false, the welcome layout guard redirects them to /, and the getSingleUseUrlParam localStorage value has already been consumed. The user lands on the home page with no org and no way back into the onboarding flow.
This should use sessionStorageStore instead of writable so it survives refreshes within the same tab.
2. No error feedback on org creation failure
In web-admin/src/routes/-/welcome/organization/create/+page.svelte:13-24, if mutateAsync throws (network error, 409 conflict for duplicate org name), nothing visible happens. The CreateNewOrgForm handles form validation errors via onError, but an API-level failure would silently swallow. The user clicks "Continue" and nothing changes.
3. Typo: "organization setting"
web-admin/src/routes/-/welcome/organization/create/+page.svelte:39 — should be "organization settings" (plural).
4. Inconsistent width between wizard pages
The org select page uses a fixed w-[486px] (select/+page.svelte:49), while the org create page uses w-fit (create/+page.svelte:27). These should use the same width constraint for visual consistency across the flow — and the fixed width could overflow on narrow viewports.
URL Routing
5. /-/welcome/organization is a redirect-only route
organization/+page.ts exists solely to fetch the org list and redirect to either /select or /create. This could be handled at the start of the /select page itself (redirect to /create if no orgs), which would eliminate an extra route, an extra network round-trip during navigation, and the staleTime: Infinity cache workaround. As-is, a user who navigates to /-/welcome/organization always gets two consecutive redirects.
6. No index page at /-/welcome
There's no +page.svelte at the /-/welcome root. If something routes there (e.g., a future code path, a manual URL entry while InWelcomeFlowStore is true), the user sees the background art with empty content. Consider adding a +page.ts that redirects to /-/welcome/theme, or making /-/welcome itself the theme page.
Engineering
7. Theme preview SVGs are bundled into JS (~50KB)
DarkModeIcon.svelte (14.8KB), LightModeIcon.svelte (14.8KB), and SystemModeIcon.svelte (21.1KB) are Svelte components containing only SVG markup. Because they're .svelte files, they get compiled into JavaScript and included in the page's JS bundle — meaning every new user downloads and parses ~50KB of JS that could be served as static .svg files loaded via <img> tags.
As static .svg files, they'd be served directly by the CDN, cached independently, and excluded from the JS parse/compile step. They'd also be a bit smaller since they wouldn't have the Svelte component wrapper overhead.
Separately, these are named *Icon.svelte, but they're 208x162 preview thumbnails, not icons. Something like LightModePreview.svg / DarkModePreview.svg / SystemModePreview.svg would be clearer.
Developed in collaboration with Claude Code
|
I think it depends on how many organizations a user can belong to. Even first-time users might receive invitations from different orgs and then come to Rill to create an account, right? So when a user clicks an invitation link, maybe we should land them directly on that org’s page instead of the generic onboarding flow. This is similar to Slack, where you can belong to multiple orgs under a single account, depending on who invites you. For the May 4th release, we probably don’t need to support this yet, but it’s worth considering long term. For first-time users, the flow could be either creating a new org or selecting one they’ve been invited to. |
|
Unlikely that first-time users will receive invitations from different orgs. Most of the time (if not all the time), they will be invited by one org. And yes agree, when they click on an invitation link, they should land directly on the org page not the generic onboarding flow |
|
The work is already done by Aditya so when the use case appears in the future, we are able to support it. |
b251001 to
e1bd717
Compare
|
Ok to make things simpler we are getting rid of first time user check.
|
e1bd717 to
3b85ca0
Compare
3b85ca0 to
8ec320c
Compare
6288c01 to
05a9b01
Compare
ericpgreen2
left a comment
There was a problem hiding this comment.
Re-review after the rewrite in the latest commits. The move from in-memory InWelcomeFlowStore to data-derived state (maybeRedirectToWelcomePage + isThemeSelectionNeeded) is a big improvement — the flow now survives refreshes and the code is simpler.
Two items:
1. Org list cache not invalidated after org creation
maybeRedirectToWelcomePage and organization/+page.ts both fetch the org list with staleTime: Infinity. After a user creates an org and navigates to /{name}, this cached empty list persists. If the user later SPA-navigates to a non-org URL (e.g., /), maybeRedirectToWelcomePage reads the stale cache, sees no orgs, and redirects back to the welcome flow — even though the user already has an org.
Fix: invalidate getAdminServiceListOrganizationsQueryKey() after org creation in createOrg, or use a shorter staleTime.
2. rill:theme and rill:theme:set should be a single localStorage key
Having two keys is a workaround for localStorageStore writing its default value on initialization, making it impossible to distinguish "user chose light" from "default was auto-written." The cleaner design: don't use localStorageStore for the theme preference. Read localStorage.getItem("rill:theme") directly, fall back to "light" in memory if absent, and only write to localStorage when the user actively selects. Then isThemeSelectionNeeded() is just !localStorage.getItem("rill:theme") and the second key goes away.
Developed in collaboration with Claude Code
|
@AdityaHegde Re: the SVG upload pipeline question — no special pipeline needed. The SVGs you added to |








Adds a new user welcome page. Mocks: https://www.figma.com/design/JtG3sbaopjO0xQlyeCjmho/RILL-WIP?node-id=7407-20942&m=dev
This PR is only for the new theme picker and org creator in the welcome screen.
Note that the routes are not locked down for testing. A final commit will lock it down.
Checklist: