diff --git a/frontend/src/contexts/NightMode.tsx b/frontend/src/contexts/NightMode.tsx
new file mode 100644
index 0000000..0f8f00c
--- /dev/null
+++ b/frontend/src/contexts/NightMode.tsx
@@ -0,0 +1,18 @@
+import { createContext, useContext, useState, type ReactNode } from 'react';
+
+interface NightModeCtx { on: boolean; toggle: () => void; }
+const Ctx = createContext({ on: false, toggle: () => {} });
+
+export function NightModeProvider({ children }: { children: ReactNode }) {
+ const [on, setOn] = useState(() => localStorage.getItem('astronome_night') === '1');
+
+ const toggle = () => setOn(v => {
+ const next = !v;
+ localStorage.setItem('astronome_night', next ? '1' : '0');
+ return next;
+ });
+
+ return {children};
+}
+
+export const useNightMode = () => useContext(Ctx);
diff --git a/frontend/src/styles/global.css b/frontend/src/styles/global.css
index 0ab1f35..6ac96c0 100644
--- a/frontend/src/styles/global.css
+++ b/frontend/src/styles/global.css
@@ -107,6 +107,7 @@ input:focus, select:focus, textarea:focus {
/* Sidebar hidden; bottom nav shown */
.app-sidebar { display: none !important; }
.bottom-nav { display: flex !important; }
+ .night-fab { display: flex !important; }
/* Main content: zero out PageShell padding; bottom-nav clearance */
.app-main { padding: 0 0 68px 0 !important; }