Skip to content

feat: cloud welcome screen org creation#9189

Merged
AdityaHegde merged 14 commits intomainfrom
feat/cloud-welcome-screen-org-creation
Apr 17, 2026
Merged

feat: cloud welcome screen org creation#9189
AdityaHegde merged 14 commits intomainfrom
feat/cloud-welcome-screen-org-creation

Conversation

@AdityaHegde
Copy link
Copy Markdown
Collaborator

@AdityaHegde AdityaHegde commented Apr 6, 2026

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:

  • Covered by tests
  • Ran it and it works as intended
  • Reviewed the diff before requesting a review
  • Checked for unhandled edge cases
  • Linked the issues it closes
  • Checked if the docs need to be updated. If so, create a separate Linear DOCS issue
  • Intend to cherry-pick into the release branch
  • I'm proud of this work!

Copy link
Copy Markdown

@Di7design Di7design left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

UXQA:

  1. Create new org modal missing background.
Image Image
  1. Select org list size too small, see design below.
Image
  1. the overall content position is slightly lower than the design. It shouldn't be simply centered; it should be a bit above the center, so visually the interaction content is centered.

@ericokuma
Copy link
Copy Markdown
Contributor

ericokuma commented Apr 8, 2026

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

image

If it helps, this is what Linear does

linear.app/welcome

Copy link
Copy Markdown

@Di7design Di7design left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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!

Image Image

Nice to have for improvement:

  1. Scale the color mode card to width 228px when hovering.
  2. Add a 300ms ease out when switching the color mode.
color.mode.pick.transition.mov

cc @ericokuma

@ericokuma
Copy link
Copy Markdown
Contributor

ericokuma commented Apr 8, 2026

Screenshot 2026-04-08 at 11 02 00 AM

Perhaps add a back button?

Also @Di7design, would we want to be visually consistent and have the Continue buttons located in the same area?

Screenshot 2026-04-08 at 11 03 04 AM

Copy link
Copy Markdown

The two steps use different UI patterns, so different placement is fine:

  • Color mode (full-screen) → center CTA is correct for full-bleed focused steps
  • Create org (modal) → bottom right follows universal modal convention

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?

@ericokuma
Copy link
Copy Markdown
Contributor

ericokuma commented Apr 14, 2026

The two steps use different UI patterns, so different placement is fine:

  • Color mode (full-screen) → center CTA is correct for full-bleed focused steps
  • Create org (modal) → bottom right follows universal modal convention

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?

  • When you are a first time user, you don't have preexisting orgs so you will only need to create a new organization, and so you should just see the org creation form
  • When you decide to create a new project in an org, you are already in the context of an organization so there's no real need to choose the organization after the fact.
  • If you want to switch org, you select the org selector from the nav org breakcrumb dropdown

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

@AdityaHegde AdityaHegde force-pushed the feat/cloud-welcome-screen-org-creation branch from b0e8787 to d07178e Compare April 14, 2026 12:17
@AdityaHegde AdityaHegde marked this pull request as ready for review April 14, 2026 12:18
@AdityaHegde AdityaHegde requested a review from Di7design April 14, 2026 13:35
Copy link
Copy Markdown
Contributor

@ericpgreen2 ericpgreen2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Copy Markdown

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.

Copy link
Copy Markdown
Contributor

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

Copy link
Copy Markdown
Contributor

The work is already done by Aditya so when the use case appears in the future, we are able to support it.

@AdityaHegde AdityaHegde force-pushed the feat/cloud-welcome-screen-org-creation branch from b251001 to e1bd717 Compare April 16, 2026 04:26
@AdityaHegde
Copy link
Copy Markdown
Collaborator Author

Ok to make things simpler we are getting rid of first time user check.

  • If user visits non-auth, non-org page and the user has no orgs then,
    • If user has never selected a theme then we land the user to theme selection
    • Else we land the user to org creation page.
  • If the user has some org then we land the user to orgs list page.
  • Any page within an org should skip this, including invite accept links.

@ericpgreen2

  1. Replaced the store with more reliable checks as noted above.
  2. Updated to show the mutation error.
  3. There is no "settings" here, seems like a hallucination.
  4. Removed select so this is not relevant anymore.
  5. I do have a safeguard here in edge cases. Showing create org in any case shouldnt happen.
  6. Added a redirect.
  7. Done. Any idea what is the pipeline to upload these?

@AdityaHegde AdityaHegde force-pushed the feat/cloud-welcome-screen-org-creation branch from e1bd717 to 3b85ca0 Compare April 16, 2026 04:44
@AdityaHegde AdityaHegde requested a review from ericpgreen2 April 16, 2026 04:47
@AdityaHegde AdityaHegde force-pushed the feat/cloud-welcome-screen-org-creation branch from 3b85ca0 to 8ec320c Compare April 16, 2026 05:07
@AdityaHegde AdityaHegde force-pushed the feat/cloud-welcome-screen-org-creation branch from 6288c01 to 05a9b01 Compare April 16, 2026 06:17
@ericpgreen2
Copy link
Copy Markdown
Contributor

  1. There is no "settings" here, seems like a hallucination

This is what I'm seeing:
image

It should be "settings" to match:
image

Copy link
Copy Markdown
Contributor

@ericpgreen2 ericpgreen2 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

@ericpgreen2
Copy link
Copy Markdown
Contributor

@AdityaHegde Re: the SVG upload pipeline question — no special pipeline needed. web-admin/svelte.config.js points its static assets at ../web-common/static, so anything in that directory gets copied to the build output automatically. Netlify then serves the entire build directory via its CDN.

The SVGs you added to web-common/static/img/theme/ are already in the right place — same pattern as the existing welcome-bg-art.jpg files. Just drop files in web-common/static/ and reference them by absolute path (e.g., /img/theme/dark-mode.svg).

@AdityaHegde AdityaHegde requested review from ericpgreen2 and removed request for k-anshul April 16, 2026 10:52
@AdityaHegde AdityaHegde dismissed Di7design’s stale review April 17, 2026 04:20

Changes have been addressed

@AdityaHegde AdityaHegde merged commit 9f0a1ca into main Apr 17, 2026
11 checks passed
@AdityaHegde AdityaHegde deleted the feat/cloud-welcome-screen-org-creation branch April 17, 2026 04:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants