diff --git a/bskyweb/templates/base.html b/bskyweb/templates/base.html
index eaa31aa4a3..03686ef5c4 100644
--- a/bskyweb/templates/base.html
+++ b/bskyweb/templates/base.html
@@ -32,6 +32,53 @@
   <link rel="preload" as="font" type="font/otf" href="/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf">
   -->
 
+  <style>
+    /**
+     * Minimum styles required to render splash.
+     *
+     * ALL OTHER STYLES BELONG IN `src/style.css`
+     *
+     * THIS NEEDS TO BE DUPLICATED IN `bskyweb/templates/base.html`
+     */
+    html {
+      background-color: white;
+      scrollbar-gutter: stable both-edges;
+    }
+    @media (prefers-color-scheme: dark) {
+      html {
+        background-color: black;
+      }
+    }
+    html,
+    body {
+      margin: 0px;
+      padding: 0px;
+      font-family: 'Inter-Regular', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Liberation Sans', Helvetica, Arial, sans-serif;
+      text-rendering: optimizeLegibility;
+      /* Platform-specific reset */
+      -webkit-overflow-scrolling: touch;
+      -webkit-text-size-adjust: 100%;
+      -webkit-font-smoothing: antialiased;
+      -moz-osx-font-smoothing: grayscale;
+      -ms-overflow-style: scrollbar;
+      font-synthesis-weight: none;
+    }
+    html,
+    body,
+    #root {
+      display: flex;
+      flex: 1 0 auto;
+      min-height: 100%;
+    }
+    #splash {
+      position: fixed;
+      width: 100px;
+      left: 50%;
+      top: 50%;
+      transform: translateX(-50%) translateY(-50%) translateY(-50px);
+    }
+  </style>
+
   {% include "scripts.html" %}
   <link rel="apple-touch-icon" sizes="180x180" href="/static/apple-touch-icon.png">
   <link rel="icon" type="image/png" sizes="32x32" href="/static/favicon-32x32.png">
@@ -48,7 +95,7 @@
 <body>
 {%- block body_all %}
   <div id="root">
-    <div id="preload">
+    <div id="splash">
       <!-- Bluesky SVG -->
       <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"><path fill="#0085ff" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/></svg>
     </div>
diff --git a/src/style.css b/src/style.css
index ebb0471584..980d92ef77 100644
--- a/src/style.css
+++ b/src/style.css
@@ -1,3 +1,11 @@
+/**
+ * IMPORTANT
+ *
+ * Some of these styles are duplicated in the `web/index.html` and
+ * `bskyweb/templates/base.html` files. Depending on what you're updating, you
+ * may need to touch all three. Ask Eric if you aren't sure.
+ */
+
 @font-face {
   font-family: 'Inter-Regular';
   src: local('Inter-Regular'),
@@ -96,90 +104,51 @@
 */
 
 /**
- * Extend the react-native-web reset:
- * https://github.com/necolas/react-native-web/blob/master/packages/react-native-web/src/exports/StyleSheet/initialRules.js
+ * BEGIN STYLES
+ *
+ * HTML & BODY STYLES IN `web/index.html` and `bskyweb/templates/base.html`
  */
-html,
-body,
-#root {
-  width: 100%;
-  /* To smooth any scrolling behavior */
-  -webkit-overflow-scrolling: touch;
-  margin: 0px;
-  padding: 0px;
-  /* Allows content to fill the viewport and go beyond the bottom */
-  min-height: 100%;
-}
-#root {
-  flex-shrink: 0;
-  flex-basis: auto;
-  flex-grow: 1;
-  display: flex;
-  flex: 1;
-}
-
-html {
-  /* Prevent text size change on orientation change https://gist.github.com/tfausak/2222823#file-ios-8-web-app-html-L138 */
-  -webkit-text-size-adjust: 100%;
-  height: calc(100% + env(safe-area-inset-top));
-  scrollbar-gutter: stable both-edges;
-}
-html,
-body {
-  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
-    'Liberation Sans', Helvetica, Arial, sans-serif;
-}
-
-#preload {
-  width: 100px;
-  position: fixed;
-  left: 50%;
-  top: 50%;
-  transform: translate(-50%, -50%);
-}
-
-/* Buttons and inputs have a font set by UA, so we'll have to reset that */
-button,
-input,
-textarea {
-  font: inherit;
-  line-height: inherit;
-}
-
-/* Color theming */
-/* Default will always be white */
 :root {
   --text: black;
   --background: white;
   --backgroundLight: hsl(211, 20%, 95%);
 }
-/* This gives us a black background when system is dark and we have not loaded the theme/color scheme values in JS */
 @media (prefers-color-scheme: dark) {
   :root {
+    color-scheme: dark;
     --text: white;
     --background: black;
     --backgroundLight: hsl(211, 20%, 20%);
-    color-scheme: dark;
   }
 }
 
-/* Overwrite those preferences with the selected theme */
 html.theme--light {
   --text: black;
   --background: white;
   --backgroundLight: hsl(211, 20%, 95%);
+  background-color: white;
 }
 html.theme--dark {
+  color-scheme: dark;
+  background-color: black;
   --text: white;
   --background: black;
   --backgroundLight: hsl(211, 20%, 20%);
-  color-scheme: dark;
 }
 html.theme--dim {
+  color-scheme: dark;
+  background-color: hsl(211, 28%, 12%);
   --text: white;
   --background: hsl(211, 20%, 4%);
   --backgroundLight: hsl(211, 20%, 10%);
-  color-scheme: dark;
+}
+
+/* Buttons and inputs have a font set by UA, so we'll have to reset that */
+button,
+input,
+textarea {
+  font: inherit;
+  line-height: inherit;
 }
 
 /* Remove autofill styles on Webkit */
@@ -200,19 +169,6 @@ input::-webkit-date-and-time-value {
   text-align: left;
 }
 
-body {
-  display: flex;
-  /* Allows you to scroll below the viewport; default value is visible */
-  overflow-y: auto;
-  overscroll-behavior-y: none;
-  text-rendering: optimizeLegibility;
-  background-color: var(--background);
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  -ms-overflow-style: scrollbar;
-  font-synthesis-weight: none;
-}
-
 /* Remove default link styling */
 a {
   color: inherit;
diff --git a/web/index.html b/web/index.html
index 512178327f..71e5ac0892 100644
--- a/web/index.html
+++ b/web/index.html
@@ -36,6 +36,53 @@
     <link rel="preload" as="font" type="font/otf" href="/static/media/Inter-Black.66e9a87f1c921e844ed4.otf">
     <link rel="preload" as="font" type="font/otf" href="/static/media/Inter-BlackItalic.27b9f0ad06fd13a7b9da.otf">
     -->
+
+    <style>
+      /**
+       * Minimum styles required to render splash.
+       *
+       * ALL OTHER STYLES BELONG IN `src/style.css`
+       *
+       * THIS NEEDS TO BE DUPLICATED IN `bskyweb/templates/base.html`
+       */
+      html {
+        background-color: white;
+        scrollbar-gutter: stable both-edges;
+      }
+      @media (prefers-color-scheme: dark) {
+        html {
+          background-color: black;
+        }
+      }
+      html,
+      body {
+        margin: 0px;
+        padding: 0px;
+        font-family: 'Inter-Regular', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Liberation Sans', Helvetica, Arial, sans-serif;
+        text-rendering: optimizeLegibility;
+        /* Platform-specific reset */
+        -webkit-overflow-scrolling: touch;
+        -webkit-text-size-adjust: 100%;
+        -webkit-font-smoothing: antialiased;
+        -moz-osx-font-smoothing: grayscale;
+        -ms-overflow-style: scrollbar;
+        font-synthesis-weight: none;
+      }
+      html,
+      body,
+      #root {
+        display: flex;
+        flex: 1 0 auto;
+        min-height: 100%;
+      }
+      #splash {
+        position: fixed;
+        width: 100px;
+        left: 50%;
+        top: 50%;
+        transform: translateX(-50%) translateY(-50%) translateY(-50px);
+      }
+    </style>
   </head>
 
   <body>
@@ -90,7 +137,7 @@
 
     <!-- The root element for your Expo app. -->
     <div id="root">
-      <div id="preload">
+      <div id="splash">
         <!-- Bluesky SVG -->
         <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 360 320"><path fill="#0085ff" d="M180 142c-16.3-31.7-60.7-90.8-102-120C38.5-5.9 23.4-1 13.5 3.4 2.1 8.6 0 26.2 0 36.5c0 10.4 5.7 84.8 9.4 97.2 12.2 41 55.7 55 95.7 50.5-58.7 8.6-110.8 30-42.4 106.1 75.1 77.9 103-16.7 117.3-64.6 14.3 48 30.8 139 116 64.6 64-64.6 17.6-97.5-41.1-106.1 40 4.4 83.5-9.5 95.7-50.5 3.7-12.4 9.4-86.8 9.4-97.2 0-10.3-2-27.9-13.5-33C336.5-1 321.5-6 282 22c-41.3 29.2-85.7 88.3-102 120Z"/></svg>
       </div>