diff --git a/app/layout.tsx b/app/layout.tsx
index bfc3470..9350629 100644
--- a/app/layout.tsx
+++ b/app/layout.tsx
@@ -5,6 +5,7 @@ import 'yet-another-react-lightbox/styles.css'
 import 'yet-another-react-lightbox/plugins/thumbnails.css'
 import 'yet-another-react-lightbox/plugins/captions.css'
 import { ToastContainer } from 'react-toastify'
+import { PublicEnvScript } from 'next-runtime-env';
 
 import { Shell } from '@/shell/Shell'
 import { CommandPaletteRoot } from '@/shell/CommandPalette/Root'
@@ -36,6 +37,7 @@ export default function RootLayout({
         isDarkModeEnabled() ? 'dark' : ''
       }`}
     >
+      <head>
       <title>Ozone</title>
       <link
         rel="icon"
@@ -43,6 +45,8 @@ export default function RootLayout({
         sizes="any"
       />
       <meta name="viewport" content="width=device-width, initial-scale=1" />
+      <PublicEnvScript />
+      </head>
       <body className="h-full overflow-hidden">
         <ToastContainer
           position="bottom-right"
diff --git a/environment.d.ts b/environment.d.ts
index 7a47cc2..33ab29f 100644
--- a/environment.d.ts
+++ b/environment.d.ts
@@ -9,6 +9,8 @@ declare global {
       NEXT_PUBLIC_OZONE_SERVICE_DID?: string // e.g. did:plc:xxx#atproto_labeler
       NEXT_PUBLIC_OZONE_PUBLIC_URL?: string // e.g. https://ozone.example.com (falls back to window.location.origin)
       NEXT_PUBLIC_SOCIAL_APP_URL?: string // e.g. https://bsky.app
+      NEXT_PUBLIC_SOCIAL_APP_DOMAIN?: string // e.g. bsky.app
+      NEXT_PUBLIC_HANDLE_RESOLVER_URL?: string // e.g. https://api.bsky.app
     }
   }
 }
diff --git a/lib/constants.ts b/lib/constants.ts
index fe7c0e8..c286ac6 100644
--- a/lib/constants.ts
+++ b/lib/constants.ts
@@ -1,29 +1,32 @@
+import { env } from 'next-runtime-env';
+
 export const OAUTH_SCOPE = 'atproto transition:generic'

 export const OZONE_SERVICE_DID =
-  process.env.NEXT_PUBLIC_OZONE_SERVICE_DID || undefined
+  env('NEXT_PUBLIC_OZONE_SERVICE_DID') || undefined

 export const OZONE_PUBLIC_URL =
-  process.env.NEXT_PUBLIC_OZONE_PUBLIC_URL || undefined
+  env('NEXT_PUBLIC_OZONE_PUBLIC_URL') || undefined

 export const PLC_DIRECTORY_URL =
-  process.env.NEXT_PUBLIC_PLC_DIRECTORY_URL ||
+  env('NEXT_PUBLIC_PLC_DIRECTORY_URL') ||
   (process.env.NODE_ENV === 'development'
     ? 'http://localhost:2582'
     : 'https://plc.directory')
 
-export const QUEUE_CONFIG = process.env.NEXT_PUBLIC_QUEUE_CONFIG || '{}'
+export const QUEUE_CONFIG = env('NEXT_PUBLIC_QUEUE_CONFIG') || '{}'

-export const QUEUE_SEED = process.env.NEXT_PUBLIC_QUEUE_SEED || ''
+export const QUEUE_SEED = env('NEXT_PUBLIC_QUEUE_SEED') || ''

+export const SOCIAL_APP_DOMAIN = env('NEXT_PUBLIC_SOCIAL_APP_DOMAIN') || 'bsky.app'
 export const SOCIAL_APP_URL =
-  process.env.NEXT_PUBLIC_SOCIAL_APP_URL ||
+  env('NEXT_PUBLIC_SOCIAL_APP_URL') ||
   (process.env.NODE_ENV === 'development'
     ? 'http://localhost:2584'
-    : 'https://bsky.app')
+    : `https://${SOCIAL_APP_DOMAIN}`)

 export const HANDLE_RESOLVER_URL =
-  process.env.NEXT_PUBLIC_HANDLE_RESOLVER_URL ||
+  env('NEXT_PUBLIC_HANDLE_RESOLVER_URL') ||
   (process.env.NODE_ENV === 'development'
     ? 'http://localhost:2584'
     : 'https://api.bsky.app')
diff --git a/lib/util.ts b/lib/util.ts
index 0aa4460..ecec7d1 100644
--- a/lib/util.ts
+++ b/lib/util.ts
@@ -1,5 +1,5 @@
 import { CollectionId } from '@/reports/helpers/subject'
-import { SOCIAL_APP_URL } from './constants'
+import { SOCIAL_APP_URL, SOCIAL_APP_DOMAIN } from './constants'
 import { AtUri } from '@atproto/api'
 
 export function classNames(...classes: (string | undefined)[]) {
@@ -57,7 +57,7 @@ export function takesKeyboardEvt(el?: EventTarget | null) {
   )
 }
 
-const blueSkyUrlMatcher = new RegExp('(https?://)?.*bsky.app')
+const blueSkyUrlMatcher = new RegExp('(https?://)?.*'+ `${SOCIAL_APP_DOMAIN}`)
 
 export const isBlueSkyAppUrl = (url: string) => blueSkyUrlMatcher.test(url)
 
diff --git a/package.json b/package.json
index 8919841..750dce9 100644
--- a/package.json
+++ b/package.json
@@ -37,6 +37,7 @@
     "kbar": "^0.1.0-beta.45",
     "lande": "^1.0.10",
     "next": "15.2.4",
+    "next-runtime-env": "^3.2.1",
     "react": "19.1.0",
     "react-dom": "19.1.0",
     "react-dropzone": "^14.3.5",