diff --git a/content/docs/introduction.mdx b/content/docs/introduction.mdx
index fd9674f..0755c56 100644
--- a/content/docs/introduction.mdx
+++ b/content/docs/introduction.mdx
@@ -23,6 +23,7 @@ Shadcn Hooks is a carefully curated collection of modern React hooks designed to
- [`useControllableValue`](/docs/hooks/use-controllable-value) - Manage a controllable value
- [`useCounter`](/docs/hooks/use-counter) - Create and manage counter state with increment, decrement, and reset
- [`useDebounce`](/docs/hooks/use-debounce) - A hook to debounce a value
+- [`useLocalStorageState`](/docs/hooks/use-local-storage-state) - Persist state in localStorage with SSR-safe synchronization
- [`useResetState`](/docs/hooks/use-reset-state) - Reset a state to its initial state
- [`useThrottle`](/docs/hooks/use-throttle) - A hook to throttle a value
- [`useToggle`](/docs/hooks/use-toggle) - Simple boolean toggle functionality
diff --git a/skills/shadcn-hooks/SKILL.md b/skills/shadcn-hooks/SKILL.md
index 0cc49e6..100cf8a 100644
--- a/skills/shadcn-hooks/SKILL.md
+++ b/skills/shadcn-hooks/SKILL.md
@@ -57,6 +57,7 @@ IMPORTANT: Each function entry includes a short `Description` and a detailed `Re
| [`useControllableValue`](references/useControllableValue.md) | Supports both controlled and uncontrolled component patterns | AUTO |
| [`useCounter`](references/useCounter.md) | Counter with `inc`, `dec`, `set`, `reset` helpers | AUTO |
| [`useDebounce`](references/useDebounce.md) | Debounced reactive value | AUTO |
+| [`useLocalStorageState`](references/useLocalStorageState.md) | SSR-safe localStorage state with synchronization | AUTO |
| [`useResetState`](references/useResetState.md) | State with a `reset` function to restore the initial value | AUTO |
| [`useThrottle`](references/useThrottle.md) | Throttled reactive value | AUTO |
| [`useToggle`](references/useToggle.md) | Toggle between two values with utility actions | AUTO |
diff --git a/skills/shadcn-hooks/references/useLocalStorageState.md b/skills/shadcn-hooks/references/useLocalStorageState.md
new file mode 100644
index 0000000..eae4562
--- /dev/null
+++ b/skills/shadcn-hooks/references/useLocalStorageState.md
@@ -0,0 +1,64 @@
+# useLocalStorageState
+
+Persist state in `localStorage` with SSR-safe snapshots and automatic same-tab / cross-tab synchronization.
+
+## Usage
+
+```tsx
+import { useLocalStorageState } from '@/hooks/use-local-storage-state'
+
+function Component() {
+ const [theme, setTheme, removeTheme] = useLocalStorageState('theme', 'light')
+
+ return (
+
+
Theme: {theme}
+
+
+
+
+ )
+}
+```
+
+## Type Declarations
+
+```ts
+import type { Dispatch, SetStateAction } from 'react'
+
+export interface UseLocalStorageStateOptions {
+ serializer?: (value: T) => string
+ deserializer?: (value: string) => T
+ onError?: (error: unknown) => void
+}
+
+export type UseLocalStorageStateReturn = [
+ T,
+ Dispatch>,
+ () => void,
+]
+
+export function useLocalStorageState(
+ key: string,
+ initialValue: T | (() => T),
+ options?: UseLocalStorageStateOptions,
+): UseLocalStorageStateReturn
+```
+
+## Parameters
+
+| Parameter | Type | Default | Description |
+| -------------- | -------------------------------- | ------- | --------------------------------------------------------- |
+| `key` | `string` | - | The `localStorage` key |
+| `initialValue` | `T \| (() => T)` | - | Fallback value during SSR or when storage value is absent |
+| `options` | `UseLocalStorageStateOptions` | `{}` | Serializer, deserializer, and optional error callback |
+
+## Returns
+
+| Type | Description |
+| -------------------------------- | ---------------------------------------------------- |
+| `[value, setValue, removeValue]` | Current value, React-style updater, and clear method |
diff --git a/src/registry/hooks/meta.json b/src/registry/hooks/meta.json
index dd5ccea..d922cf8 100644
--- a/src/registry/hooks/meta.json
+++ b/src/registry/hooks/meta.json
@@ -5,6 +5,7 @@
"use-controllable-value",
"use-counter",
"use-debounce",
+ "use-local-storage-state",
"use-reset-state",
"use-throttle",
"use-toggle",
diff --git a/src/registry/hooks/use-hash/demo/demo-01.tsx b/src/registry/hooks/use-hash/demo/demo-01.tsx
new file mode 100644
index 0000000..6de60ec
--- /dev/null
+++ b/src/registry/hooks/use-hash/demo/demo-01.tsx
@@ -0,0 +1,75 @@
+'use client'
+import { useState } from 'react'
+import { Button } from '~/components/ui/button'
+import {
+ Card,
+ CardContent,
+ CardDescription,
+ CardHeader,
+ CardTitle,
+} from '~/components/ui/card'
+import { Input } from '~/components/ui/input'
+import { useHash } from '..'
+
+const PRESET_HASHES = ['intro', 'api', 'faq']
+
+export function Demo01() {
+ const hash = useHash()
+ const [inputValue, setInputValue] = useState('demo-hash')
+
+ const setHash = (value: string) => {
+ const nextHash = value ? `#${value}` : ''
+ window.location.assign(
+ `${window.location.pathname}${window.location.search}${nextHash}`,
+ )
+ }
+
+ return (
+
+
+ useHash Demo
+
+ Update the URL hash and watch the hook value change in real time.
+
+
+
+
+ setInputValue(event.target.value)}
+ placeholder='Type hash without #'
+ />
+
+
+
+
+
+
+
+ {PRESET_HASHES.map((item) => (
+
+ ))}
+
+
+
+ Current hash:{' '}
+ {hash}
+
+
+
+ )
+}
diff --git a/src/registry/hooks/use-hash/index.mdx b/src/registry/hooks/use-hash/index.mdx
index cc9a632..47f1fcf 100644
--- a/src/registry/hooks/use-hash/index.mdx
+++ b/src/registry/hooks/use-hash/index.mdx
@@ -3,6 +3,10 @@ title: useHash
description: A hook to get current hash
---
+import { Demo01 } from './demo/demo-01'
+
+
+
## Installation
diff --git a/src/registry/hooks/use-local-storage-state/demo/demo-01.tsx b/src/registry/hooks/use-local-storage-state/demo/demo-01.tsx
new file mode 100644
index 0000000..5a8421f
--- /dev/null
+++ b/src/registry/hooks/use-local-storage-state/demo/demo-01.tsx
@@ -0,0 +1,42 @@
+'use client'
+import { Button } from '~/components/ui/button'
+import { Input } from '~/components/ui/input'
+import { useLocalStorageState } from '..'
+
+const DEMO_STORAGE_KEY = 'shadcn-hooks:demo:use-local-storage-state'
+
+export function Demo01() {
+ const [name, setName, clearName] = useLocalStorageState(
+ DEMO_STORAGE_KEY,
+ '',
+ )
+
+ return (
+
+
+
+ setName(event.target.value)}
+ placeholder='Type and refresh the page'
+ />
+