Skip to content

chore(web): Remove org domain from routes#1076

Merged
brendan-kellam merged 11 commits intomainfrom
brendan/remove-domain-from-routes
Apr 4, 2026
Merged

chore(web): Remove org domain from routes#1076
brendan-kellam merged 11 commits intomainfrom
brendan/remove-domain-from-routes

Conversation

@brendan-kellam
Copy link
Copy Markdown
Contributor

@brendan-kellam brendan-kellam commented Apr 2, 2026

Human Summary

As part of our original SaaS effort in April 2025, we introduced
multi-tenancy into Sourcebot as part of v3.0.0. Organizations
(or tenants) were assigned a domain suffix that would be appended
as the root part of the URL (e.g., https://sourcebot.dev/org-a/...)
allowing us to identify what the current organization context was.
For self-hosted instances, multi-tenancy was irrelevant, and so the
domain suffix was simple ~ for the single-tenant org.

In v4.0.0, we scrapped multi-tenancy, but we were left with the
~ in the URL pathname. In this PR, we remove the org domain
prefix from the URL pathname and shifted all routes to be served
at the root domain.

Claude Summary

Removes the [domain] dynamic route segment from the URL structure. Previously, all app routes were nested under app/[domain]/ (e.g., /~/search, /~/settings), a leftover from when multi-tenancy was supported. This PR eliminates the ~ from all URLs.

  • Route structure: Moved all routes from app/[domain]/ into app/(app)/, a Next.js route group that preserves the layout guard without affecting URLs. Routes are now /search, /settings, /chat, etc.
  • Org resolution: Replaced all getOrgFromDomain(domain) calls with direct lookups using SINGLE_TENANT_ORG_ID. Removed getOrgFromDomain and data/org.ts entirely.
  • Domain removal from schema: Dropped the domain column from the Org model and removed SINGLE_TENANT_ORG_DOMAIN constant.
  • API route: Moved app/api/[domain]/repos/[repoId]/image/ to app/api/repos/[repoId]/image/.
  • Hooks/utils: Deleted useDomain hook. Removed domain from all URL construction, component props, query keys, email templates, and form fields.
  • Actions: Updated createAccountRequest, getMemberApprovalRequired, getAnonymousAccessStatus, orgHasAvailability, and createGuestUser to no longer accept a domain parameter.

🤖 Generated with Claude Code

@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai bot commented Apr 2, 2026

Important

Review skipped

Too many files!

This PR contains 200 files, which is 50 over the limit of 150.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 42b790c6-accd-44fb-8666-dbe1e6263443

📥 Commits

Reviewing files that changed from the base of the PR and between b7656c3 and 0afa16e.

📒 Files selected for processing (200)
  • CHANGELOG.md
  • packages/db/prisma/migrations/20260402052154_remove_domain_from_org/migration.sql
  • packages/db/prisma/schema.prisma
  • packages/web/src/__mocks__/prisma.ts
  • packages/web/src/actions.ts
  • packages/web/src/app/(app)/CLAUDE.md
  • packages/web/src/app/(app)/README.md
  • packages/web/src/app/(app)/agents/page.tsx
  • packages/web/src/app/(app)/askgh/[owner]/[repo]/api.ts
  • packages/web/src/app/(app)/askgh/[owner]/[repo]/components/landingPage.tsx
  • packages/web/src/app/(app)/askgh/[owner]/[repo]/components/repoIndexedGuard.tsx
  • packages/web/src/app/(app)/askgh/[owner]/[repo]/page.tsx
  • packages/web/src/app/(app)/askgh/[owner]/[repo]/types.ts
  • packages/web/src/app/(app)/askgh/layout.tsx
  • packages/web/src/app/(app)/browse/README.md
  • packages/web/src/app/(app)/browse/[...path]/components/codePreviewPanel.tsx
  • packages/web/src/app/(app)/browse/[...path]/components/pureCodePreviewPanel.tsx
  • packages/web/src/app/(app)/browse/[...path]/components/pureTreePreviewPanel.tsx
  • packages/web/src/app/(app)/browse/[...path]/components/rangeHighlightingExtension.ts
  • packages/web/src/app/(app)/browse/[...path]/components/treePreviewPanel.tsx
  • packages/web/src/app/(app)/browse/[...path]/page.tsx
  • packages/web/src/app/(app)/browse/browseStateProvider.tsx
  • packages/web/src/app/(app)/browse/components/bottomPanel.tsx
  • packages/web/src/app/(app)/browse/components/fileSearchCommandDialog.tsx
  • packages/web/src/app/(app)/browse/components/fileTreeItemComponent.tsx
  • packages/web/src/app/(app)/browse/components/fileTreeItemIcon.tsx
  • packages/web/src/app/(app)/browse/components/fileTreePanel.tsx
  • packages/web/src/app/(app)/browse/components/pureFileTreePanel.tsx
  • packages/web/src/app/(app)/browse/hooks/useBrowseNavigation.ts
  • packages/web/src/app/(app)/browse/hooks/useBrowseParams.ts
  • packages/web/src/app/(app)/browse/hooks/useBrowseState.ts
  • packages/web/src/app/(app)/browse/hooks/utils.test.ts
  • packages/web/src/app/(app)/browse/hooks/utils.ts
  • packages/web/src/app/(app)/browse/layout.tsx
  • packages/web/src/app/(app)/browse/layoutClient.tsx
  • packages/web/src/app/(app)/chat/[id]/components/chatThreadPanel.tsx
  • packages/web/src/app/(app)/chat/[id]/opengraph-image.tsx
  • packages/web/src/app/(app)/chat/[id]/page.tsx
  • packages/web/src/app/(app)/chat/components/chatActionsDropdown.tsx
  • packages/web/src/app/(app)/chat/components/chatName.tsx
  • packages/web/src/app/(app)/chat/components/chatSidePanel.tsx
  • packages/web/src/app/(app)/chat/components/deleteChatDialog.tsx
  • packages/web/src/app/(app)/chat/components/demoCards.tsx
  • packages/web/src/app/(app)/chat/components/duplicateChatDialog.tsx
  • packages/web/src/app/(app)/chat/components/landingPageChatBox.tsx
  • packages/web/src/app/(app)/chat/components/renameChatDialog.tsx
  • packages/web/src/app/(app)/chat/components/shareChatPopover/ee/invitePanel.tsx
  • packages/web/src/app/(app)/chat/components/shareChatPopover/index.tsx
  • packages/web/src/app/(app)/chat/components/shareChatPopover/shareSettings.tsx
  • packages/web/src/app/(app)/chat/components/tutorialDialog.tsx
  • packages/web/src/app/(app)/chat/layout.tsx
  • packages/web/src/app/(app)/chat/page.tsx
  • packages/web/src/app/(app)/chat/useChatId.ts
  • packages/web/src/app/(app)/components/DisplayDate.tsx
  • packages/web/src/app/(app)/components/appearanceDropdownMenu.tsx
  • packages/web/src/app/(app)/components/appearanceDropdownMenuGroup.tsx
  • packages/web/src/app/(app)/components/backButton.tsx
  • packages/web/src/app/(app)/components/copyIconButton.tsx
  • packages/web/src/app/(app)/components/editorContextMenu.tsx
  • packages/web/src/app/(app)/components/gcpIapAuth.tsx
  • packages/web/src/app/(app)/components/githubStarToast.tsx
  • packages/web/src/app/(app)/components/lightweightCodeHighlighter.tsx
  • packages/web/src/app/(app)/components/meControlDropdownMenu.tsx
  • packages/web/src/app/(app)/components/mobileUnsupportedSplashScreen.tsx
  • packages/web/src/app/(app)/components/navigationMenu/index.tsx
  • packages/web/src/app/(app)/components/navigationMenu/navigationItems.tsx
  • packages/web/src/app/(app)/components/navigationMenu/progressIndicator.tsx
  • packages/web/src/app/(app)/components/notFound.tsx
  • packages/web/src/app/(app)/components/notificationDot.tsx
  • packages/web/src/app/(app)/components/onboardGuard.tsx
  • packages/web/src/app/(app)/components/pageNotFound.tsx
  • packages/web/src/app/(app)/components/pathHeader.tsx
  • packages/web/src/app/(app)/components/pendingApproval.tsx
  • packages/web/src/app/(app)/components/permissionSyncBanner.tsx
  • packages/web/src/app/(app)/components/repositoryCarousel.tsx
  • packages/web/src/app/(app)/components/searchBar/constants.ts
  • packages/web/src/app/(app)/components/searchBar/index.ts
  • packages/web/src/app/(app)/components/searchBar/searchAssistBox.tsx
  • packages/web/src/app/(app)/components/searchBar/searchBar.tsx
  • packages/web/src/app/(app)/components/searchBar/searchSuggestionsBox.test.tsx
  • packages/web/src/app/(app)/components/searchBar/searchSuggestionsBox.tsx
  • packages/web/src/app/(app)/components/searchBar/useRefineModeSuggestions.ts
  • packages/web/src/app/(app)/components/searchBar/useSuggestionModeAndQuery.ts
  • packages/web/src/app/(app)/components/searchBar/useSuggestionModeMappings.ts
  • packages/web/src/app/(app)/components/searchBar/useSuggestionsData.ts
  • packages/web/src/app/(app)/components/searchBar/zoektLanguageExtension.ts
  • packages/web/src/app/(app)/components/searchModeSelector.tsx
  • packages/web/src/app/(app)/components/submitAccountRequestButton.tsx
  • packages/web/src/app/(app)/components/submitJoinRequest.tsx
  • packages/web/src/app/(app)/components/syntaxGuideProvider.tsx
  • packages/web/src/app/(app)/components/syntaxReferenceGuide.tsx
  • packages/web/src/app/(app)/components/syntaxReferenceGuideHint.tsx
  • packages/web/src/app/(app)/components/topBar.tsx
  • packages/web/src/app/(app)/components/upgradeToast.tsx
  • packages/web/src/app/(app)/components/whatsNewIndicator.tsx
  • packages/web/src/app/(app)/layout.tsx
  • packages/web/src/app/(app)/page.tsx
  • packages/web/src/app/(app)/repos/[id]/page.tsx
  • packages/web/src/app/(app)/repos/components/repoActionsDropdown.tsx
  • packages/web/src/app/(app)/repos/components/repoBranchesTable.tsx
  • packages/web/src/app/(app)/repos/components/repoJobsTable.tsx
  • packages/web/src/app/(app)/repos/components/reposTable.tsx
  • packages/web/src/app/(app)/repos/layout.tsx
  • packages/web/src/app/(app)/repos/page.tsx
  • packages/web/src/app/(app)/search/components/codePreviewPanel/codePreview.tsx
  • packages/web/src/app/(app)/search/components/codePreviewPanel/index.tsx
  • packages/web/src/app/(app)/search/components/filterPanel/entry.tsx
  • packages/web/src/app/(app)/search/components/filterPanel/filter.tsx
  • packages/web/src/app/(app)/search/components/filterPanel/index.tsx
  • packages/web/src/app/(app)/search/components/filterPanel/useFilterMatches.ts
  • packages/web/src/app/(app)/search/components/filterPanel/useGetSelectedFromQuery.ts
  • packages/web/src/app/(app)/search/components/searchLandingPage.tsx
  • packages/web/src/app/(app)/search/components/searchResultsPage.tsx
  • packages/web/src/app/(app)/search/components/searchResultsPanel/fileMatch.tsx
  • packages/web/src/app/(app)/search/components/searchResultsPanel/fileMatchContainer.tsx
  • packages/web/src/app/(app)/search/components/searchResultsPanel/index.tsx
  • packages/web/src/app/(app)/search/page.tsx
  • packages/web/src/app/(app)/search/useStreamedSearch.ts
  • packages/web/src/app/(app)/settings/access/page.tsx
  • packages/web/src/app/(app)/settings/analytics/page.tsx
  • packages/web/src/app/(app)/settings/apiKeys/apiKeysPage.tsx
  • packages/web/src/app/(app)/settings/apiKeys/columns.tsx
  • packages/web/src/app/(app)/settings/apiKeys/layout.tsx
  • packages/web/src/app/(app)/settings/apiKeys/page.tsx
  • packages/web/src/app/(app)/settings/components/sidebar-nav.tsx
  • packages/web/src/app/(app)/settings/connections/[id]/page.tsx
  • packages/web/src/app/(app)/settings/connections/components/connectionJobsTable.tsx
  • packages/web/src/app/(app)/settings/connections/components/connectionsTable.tsx
  • packages/web/src/app/(app)/settings/connections/layout.tsx
  • packages/web/src/app/(app)/settings/connections/page.tsx
  • packages/web/src/app/(app)/settings/layout.tsx
  • packages/web/src/app/(app)/settings/license/page.tsx
  • packages/web/src/app/(app)/settings/linked-accounts/page.tsx
  • packages/web/src/app/(app)/settings/members/components/inviteMemberCard.tsx
  • packages/web/src/app/(app)/settings/members/components/invitesList.tsx
  • packages/web/src/app/(app)/settings/members/components/membersList.tsx
  • packages/web/src/app/(app)/settings/members/components/requestsList.tsx
  • packages/web/src/app/(app)/settings/members/page.tsx
  • packages/web/src/app/(app)/settings/page.tsx
  • packages/web/src/app/[domain]/settings/access/page.tsx
  • packages/web/src/app/[domain]/settings/analytics/page.tsx
  • packages/web/src/app/[domain]/settings/apiKeys/layout.tsx
  • packages/web/src/app/[domain]/settings/apiKeys/page.tsx
  • packages/web/src/app/[domain]/settings/connections/layout.tsx
  • packages/web/src/app/api/(server)/ee/oauth/register/route.ts
  • packages/web/src/app/api/(server)/repo-status/[repoId]/route.ts
  • packages/web/src/app/api/(server)/repos/listReposApi.ts
  • packages/web/src/app/api/repos/[repoId]/image/route.ts
  • packages/web/src/app/components/joinOrganizationButton.tsx
  • packages/web/src/app/components/organizationAccessSettings.tsx
  • packages/web/src/app/invite/actions.ts
  • packages/web/src/app/invite/page.tsx
  • packages/web/src/app/login/page.tsx
  • packages/web/src/app/not-found.tsx
  • packages/web/src/app/oauth/authorize/page.tsx
  • packages/web/src/app/onboard/page.tsx
  • packages/web/src/app/page.tsx
  • packages/web/src/app/redeem/components/acceptInviteCard.tsx
  • packages/web/src/app/redeem/page.tsx
  • packages/web/src/app/signup/page.tsx
  • packages/web/src/auth.ts
  • packages/web/src/data/org.ts
  • packages/web/src/ee/features/analytics/analyticsContent.tsx
  • packages/web/src/ee/features/audit/auditService.ts
  • packages/web/src/ee/features/codeNav/components/exploreMenu/index.tsx
  • packages/web/src/ee/features/codeNav/components/exploreMenu/referenceList.tsx
  • packages/web/src/ee/features/codeNav/components/symbolHoverPopup/index.tsx
  • packages/web/src/ee/features/codeNav/components/symbolHoverPopup/symbolDefinitionPreview.tsx
  • packages/web/src/ee/features/codeNav/components/symbolHoverPopup/useHoveredOverSymbolInfo.ts
  • packages/web/src/ee/features/oauth/server.ts
  • packages/web/src/ee/features/sso/sso.ts
  • packages/web/src/emails/joinRequestApprovedEmail.tsx
  • packages/web/src/emails/joinRequestSubmittedEmail.tsx
  • packages/web/src/features/chat/components/chatBox/useSuggestionsData.ts
  • packages/web/src/features/chat/components/chatThread/answerCard.tsx
  • packages/web/src/features/chat/components/chatThread/chatThread.tsx
  • packages/web/src/features/chat/components/chatThread/codeBlock.tsx
  • packages/web/src/features/chat/components/chatThread/markdownRenderer.tsx
  • packages/web/src/features/chat/components/chatThread/referencedFileSourceListItem.tsx
  • packages/web/src/features/chat/components/chatThread/tools/fileRow.tsx
  • packages/web/src/features/chat/components/chatThread/tools/listTreeToolComponent.tsx
  • packages/web/src/features/chat/components/chatThread/tools/readFileToolComponent.tsx
  • packages/web/src/features/chat/components/chatThread/tools/repoBadge.tsx
  • packages/web/src/features/chat/components/chatThread/tools/repoHeader.tsx
  • packages/web/src/features/chat/components/chatThread/tools/toolOutputGuard.tsx
  • packages/web/src/features/chat/useCreateNewChatThread.ts
  • packages/web/src/features/chat/utils.ts
  • packages/web/src/features/git/getFileSourceApi.ts
  • packages/web/src/features/mcp/askCodebase.ts
  • packages/web/src/features/search/zoektSearcher.ts
  • packages/web/src/features/userManagement/actions.ts
  • packages/web/src/hooks/useDomain.ts
  • packages/web/src/initialize.ts
  • packages/web/src/lib/authUtils.ts
  • packages/web/src/lib/constants.ts
  • packages/web/src/lib/utils.ts
  • packages/web/src/middleware/authenticatedPage.tsx
  • packages/web/src/middleware/withAuth.ts
  • packages/web/src/prisma.ts
  • packages/web/src/proxy.ts

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch brendan/remove-domain-from-routes

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

brendan-kellam and others added 6 commits April 1, 2026 23:46
… from settings pages

Introduces `authenticatedPage` HOC in `middleware/authenticatedPage.tsx`
for server component pages. It resolves the auth context (user, org,
role, prisma) and optionally gates by role, replacing the manual
org-lookup-and-role-check boilerplate in settings pages.

Migrates all settings pages to use authenticatedPage, removing direct
references to SINGLE_TENANT_ORG_ID from within the (app) route group.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
@brendan-kellam brendan-kellam marked this pull request as ready for review April 4, 2026 00:37
@github-actions

This comment has been minimized.

@brendan-kellam brendan-kellam merged commit 355509b into main Apr 4, 2026
8 checks passed
@brendan-kellam brendan-kellam deleted the brendan/remove-domain-from-routes branch April 4, 2026 02:47
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.

1 participant