Index: chapterx-frontend/src/components/layout/Navbar.tsx
===================================================================
--- chapterx-frontend/src/components/layout/Navbar.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/components/layout/Navbar.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -14,6 +14,10 @@
   const location = useLocation()
   const { currentUser, logout } = useAuthStore()
-  const { notifications } = useNotificationStore()
+  const { notifications, fetchUserNotifications } = useNotificationStore()
   const unread = notifications.filter(n => !n.is_read).length
+
+  useEffect(() => {
+    if (currentUser) fetchUserNotifications(currentUser.user_id)
+  }, [currentUser?.user_id])
 
   const [mobileOpen, setMobileOpen] = useState(false)
@@ -100,5 +104,5 @@
                 <div className="relative" ref={notifRef}>
                   <button
-                    onClick={() => { setNotifOpen(!notifOpen); setUserMenuOpen(false) }}
+                    onClick={() => { const opening = !notifOpen; setNotifOpen(opening); setUserMenuOpen(false); if (opening && currentUser) fetchUserNotifications(currentUser.user_id) }}
                     className="relative p-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-800 transition-colors"
                   >
Index: chapterx-frontend/src/components/notifications/NotificationDropdown.tsx
===================================================================
--- chapterx-frontend/src/components/notifications/NotificationDropdown.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/components/notifications/NotificationDropdown.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -14,4 +14,15 @@
     case 'system': return <Settings {...props} className="text-slate-400" />
     default: return <Bell {...props} className="text-slate-400" />
+  }
+}
+
+const typeTitle = (type: NotificationType) => {
+  switch (type) {
+    case 'like': return 'New Like'
+    case 'comment': return 'New Comment'
+    case 'collaboration': return 'Collaboration'
+    case 'follow': return 'New Follower'
+    case 'system': return 'System'
+    default: return 'Notification'
   }
 }
@@ -69,5 +80,5 @@
               </div>
               <div className="flex-1 min-w-0">
-                <p className="text-xs font-medium text-white">{n.title}</p>
+                <p className="text-xs font-medium text-white">{typeTitle(n.type)}</p>
                 <p className="text-xs text-slate-400 line-clamp-2">{n.message}</p>
                 <p className="text-xs text-slate-600 mt-0.5">{timeAgo(n.created_at)}</p>
Index: chapterx-frontend/src/components/story/CommentSection.tsx
===================================================================
--- chapterx-frontend/src/components/story/CommentSection.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/components/story/CommentSection.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,15 +1,18 @@
-import React, { useState } from 'react'
+import React, { useEffect, useState } from 'react'
 import { MessageCircle, Trash2, Send } from 'lucide-react'
+import axios from 'axios'
 import { useAuthStore } from '../../store/authStore'
-import { useStoryStore } from '../../store/storyStore'
 import { useNotificationStore } from '../../store/notificationStore'
 import { useUIStore } from '../../store/uiStore'
-import { Comment } from '../../types'
 import { Avatar } from '../ui/Avatar'
 import { Button } from '../ui/Button'
 
-interface CommentSectionProps {
-  storyId: number
-  authorUserId: number
+const API = 'https://localhost:7125/api'
+
+function getAuthHeaders() {
+  try {
+    const token = JSON.parse(localStorage.getItem('chapterx-auth') || '{}')?.state?.token
+    return token ? { Authorization: `Bearer ${token}` } : {}
+  } catch { return {} }
 }
 
@@ -24,41 +27,79 @@
 }
 
-export const CommentSection: React.FC<CommentSectionProps> = ({ storyId, authorUserId }) => {
+interface BackendComment {
+  id: number
+  content: string
+  userId: number
+  storyId: number
+  username: string
+  createdAt: string
+}
+
+interface CommentSectionProps {
+  storyId: number
+  authorUserId: number
+  onCountChange?: (count: number) => void
+}
+
+export const CommentSection: React.FC<CommentSectionProps> = ({ storyId, authorUserId, onCountChange }) => {
   const { currentUser } = useAuthStore()
-  const { comments, addComment, deleteComment } = useStoryStore()
   const { addNotification } = useNotificationStore()
   const { addToast } = useUIStore()
+  const [comments, setComments] = useState<BackendComment[]>([])
   const [text, setText] = useState('')
   const [submitting, setSubmitting] = useState(false)
 
-  const storyComments = comments
-    .filter(c => c.story_id === storyId)
-    .sort((a, b) => new Date(b.created_at).getTime() - new Date(a.created_at).getTime())
+  useEffect(() => {
+    axios.get(`${API}/comments/story/${storyId}`)
+      .then(res => {
+        const data = res.data ?? []
+        setComments(data)
+        onCountChange?.(data.length)
+      })
+      .catch(() => {})
+  }, [storyId])
 
   const handleSubmit = async () => {
     if (!text.trim() || !currentUser) return
     setSubmitting(true)
-    await new Promise(r => setTimeout(r, 300))
-    const comment: Comment = {
-      comment_id: Date.now(),
-      story_id: storyId,
-      user_id: currentUser.user_id,
-      username: currentUser.username,
-      content: text.trim(),
-      created_at: new Date().toISOString(),
+    try {
+      const res = await axios.post(`${API}/comments`, {
+        content: text.trim(),
+        userId: currentUser.user_id,
+        storyId,
+      }, { headers: getAuthHeaders() })
+      const newComment: BackendComment = {
+        id: res.data?.id ?? Date.now(),
+        content: text.trim(),
+        userId: currentUser.user_id,
+        storyId,
+        username: currentUser.username,
+        createdAt: new Date().toISOString(),
+      }
+      setComments(prev => { const next = [newComment, ...prev]; onCountChange?.(next.length); return next })
+      if (currentUser.user_id !== authorUserId) {
+        await addNotification({
+          recipientUserId: authorUserId,
+          type: 'comment',
+          content: `${currentUser.username} commented: "${text.trim().slice(0, 60)}${text.length > 60 ? '...' : ''}"`,
+          link: `/story/${storyId}`,
+        })
+      }
+      setText('')
+      addToast('Comment posted!')
+    } catch {
+      addToast('Failed to post comment.', 'error')
     }
-    addComment(comment)
-    if (currentUser.user_id !== authorUserId) {
-      addNotification({
-        user_id: authorUserId,
-        type: 'comment',
-        title: 'New Comment',
-        message: `${currentUser.username} commented: "${text.trim().slice(0, 60)}..."`,
-        link: `/story/${storyId}`,
-      })
+    setSubmitting(false)
+  }
+
+  const handleDelete = async (commentId: number) => {
+    try {
+      await axios.delete(`${API}/comments/${commentId}`, { headers: getAuthHeaders() })
+      setComments(prev => { const next = prev.filter(c => c.id !== commentId); onCountChange?.(next.length); return next })
+      addToast('Comment deleted', 'info')
+    } catch {
+      addToast('Failed to delete comment.', 'error')
     }
-    setText('')
-    setSubmitting(false)
-    addToast('Comment posted!')
   }
 
@@ -67,8 +108,7 @@
       <div className="flex items-center gap-2 mb-4">
         <MessageCircle size={18} className="text-indigo-400" />
-        <h3 className="text-white font-semibold">Comments ({storyComments.length})</h3>
+        <h3 className="text-white font-semibold">Comments ({comments.length})</h3>
       </div>
 
-      {/* Input */}
       {currentUser ? (
         <div className="flex gap-3">
@@ -83,10 +123,5 @@
             />
             <div className="flex justify-end mt-2">
-              <Button
-                size="sm"
-                onClick={handleSubmit}
-                loading={submitting}
-                disabled={!text.trim()}
-              >
+              <Button size="sm" onClick={handleSubmit} loading={submitting} disabled={!text.trim()}>
                 <Send size={14} />
                 Post Comment
@@ -103,18 +138,28 @@
       )}
 
-      {/* Comment list */}
       <div className="space-y-3">
-        {storyComments.length === 0 ? (
+        {comments.length === 0 ? (
           <div className="text-center py-8 text-slate-500 text-sm">
             No comments yet. Be the first to share your thoughts!
           </div>
         ) : (
-          storyComments.map(comment => (
-            <CommentCard
-              key={comment.comment_id}
-              comment={comment}
-              canDelete={currentUser?.user_id === comment.user_id || currentUser?.role === 'admin'}
-              onDelete={() => { deleteComment(comment.comment_id); addToast('Comment deleted', 'info') }}
-            />
+          comments.map(comment => (
+            <div key={comment.id} className="flex gap-3 p-4 bg-slate-800 rounded-xl border border-slate-700">
+              <Avatar name={comment.username} size="sm" />
+              <div className="flex-1 min-w-0">
+                <div className="flex items-center justify-between">
+                  <span className="text-sm font-medium text-white">{comment.username}</span>
+                  <div className="flex items-center gap-2">
+                    <span className="text-xs text-slate-500">{timeAgo(comment.createdAt)}</span>
+                    {(currentUser?.user_id === comment.userId || currentUser?.role === 'admin') && (
+                      <button onClick={() => handleDelete(comment.id)} className="text-slate-500 hover:text-rose-400 transition-colors">
+                        <Trash2 size={13} />
+                      </button>
+                    )}
+                  </div>
+                </div>
+                <p className="text-slate-300 text-sm mt-1 leading-relaxed">{comment.content}</p>
+              </div>
+            </div>
           ))
         )}
@@ -123,26 +168,2 @@
   )
 }
-
-const CommentCard: React.FC<{
-  comment: Comment
-  canDelete: boolean
-  onDelete: () => void
-}> = ({ comment, canDelete, onDelete }) => (
-  <div className="flex gap-3 p-4 bg-slate-800 rounded-xl border border-slate-700">
-    <Avatar name={comment.username} size="sm" />
-    <div className="flex-1 min-w-0">
-      <div className="flex items-center justify-between">
-        <span className="text-sm font-medium text-white">{comment.username}</span>
-        <div className="flex items-center gap-2">
-          <span className="text-xs text-slate-500">{timeAgo(comment.created_at)}</span>
-          {canDelete && (
-            <button onClick={onDelete} className="text-slate-500 hover:text-rose-400 transition-colors">
-              <Trash2 size={13} />
-            </button>
-          )}
-        </div>
-      </div>
-      <p className="text-slate-300 text-sm mt-1 leading-relaxed">{comment.content}</p>
-    </div>
-  </div>
-)
Index: chapterx-frontend/src/components/story/LikeButton.tsx
===================================================================
--- chapterx-frontend/src/components/story/LikeButton.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/components/story/LikeButton.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,9 +1,18 @@
-import React from 'react'
+import React, { useEffect, useState } from 'react'
 import { Heart } from 'lucide-react'
 import { useNavigate } from 'react-router-dom'
+import axios from 'axios'
 import { useAuthStore } from '../../store/authStore'
-import { useStoryStore } from '../../store/storyStore'
 import { useNotificationStore } from '../../store/notificationStore'
 import { useUIStore } from '../../store/uiStore'
+
+const API = 'https://localhost:7125/api'
+
+function getAuthHeaders() {
+  try {
+    const token = JSON.parse(localStorage.getItem('chapterx-auth') || '{}')?.state?.token
+    return token ? { Authorization: `Bearer ${token}` } : {}
+  } catch { return {} }
+}
 
 interface LikeButtonProps {
@@ -11,16 +20,30 @@
   authorUserId: number
   totalLikes: number
+  onCountChange?: (count: number) => void
 }
 
-export const LikeButton: React.FC<LikeButtonProps> = ({ storyId, authorUserId, totalLikes }) => {
+export const LikeButton: React.FC<LikeButtonProps> = ({ storyId, authorUserId, totalLikes, onCountChange }) => {
   const navigate = useNavigate()
   const { currentUser } = useAuthStore()
-  const { toggleLike, isLiked } = useStoryStore()
   const { addNotification } = useNotificationStore()
   const { addToast } = useUIStore()
+  const [liked, setLiked] = useState(false)
+  const [count, setCount] = useState(totalLikes)
+  const [loading, setLoading] = useState(false)
 
-  const liked = currentUser ? isLiked(currentUser.user_id, storyId) : false
+  useEffect(() => {
+    axios.get(`${API}/likes/story/${storyId}`)
+      .then(res => {
+        const c = res.data?.count ?? totalLikes
+        setCount(c)
+        onCountChange?.(c)
+        if (currentUser) {
+          setLiked((res.data?.userIds ?? []).includes(currentUser.user_id))
+        }
+      })
+      .catch(() => {})
+  }, [storyId, currentUser?.user_id])
 
-  const handleClick = () => {
+  const handleClick = async () => {
     if (!currentUser) {
       addToast('Please sign in to like stories.', 'info')
@@ -28,15 +51,30 @@
       return
     }
-    toggleLike(currentUser.user_id, storyId)
-    if (!liked && currentUser.user_id !== authorUserId) {
-      addNotification({
-        user_id: authorUserId,
-        type: 'like',
-        title: 'New Like',
-        message: `${currentUser.username} liked your story.`,
-        link: `/story/${storyId}`,
-      })
+    if (loading) return
+    setLoading(true)
+    try {
+      if (liked) {
+        await axios.delete(`${API}/likes/user/${currentUser.user_id}/story/${storyId}`, { headers: getAuthHeaders() })
+        setLiked(false)
+        setCount(c => { const n = c - 1; onCountChange?.(n); return n })
+        addToast('Removed from likes', 'info')
+      } else {
+        await axios.post(`${API}/likes`, { userId: currentUser.user_id, storyId }, { headers: getAuthHeaders() })
+        setLiked(true)
+        setCount(c => { const n = c + 1; onCountChange?.(n); return n })
+        if (currentUser.user_id !== authorUserId) {
+          await addNotification({
+            recipientUserId: authorUserId,
+            type: 'like',
+            content: `${currentUser.username} liked your story.`,
+            link: `/story/${storyId}`,
+          })
+        }
+        addToast('Added to likes!', 'success')
+      }
+    } catch {
+      addToast('Something went wrong.', 'error')
     }
-    addToast(liked ? 'Removed from likes' : 'Added to likes!', liked ? 'info' : 'success')
+    setLoading(false)
   }
 
@@ -44,4 +82,5 @@
     <button
       onClick={handleClick}
+      disabled={loading}
       className={`flex items-center gap-2 px-4 py-2 rounded-xl border transition-all duration-200 ${
         liked
@@ -51,5 +90,5 @@
     >
       <Heart size={16} className={liked ? 'fill-rose-400' : ''} />
-      <span className="text-sm font-medium">{totalLikes.toLocaleString()}</span>
+      <span className="text-sm font-medium">{count.toLocaleString()}</span>
     </button>
   )
Index: chapterx-frontend/src/pages/admin/AdminGenresPage.tsx
===================================================================
--- chapterx-frontend/src/pages/admin/AdminGenresPage.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/pages/admin/AdminGenresPage.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,3 +1,3 @@
-import React, { useState } from 'react'
+import React, { useState, useEffect } from 'react'
 import { useNavigate } from 'react-router-dom'
 import { ArrowLeft, Plus, Trash2, Tag } from 'lucide-react'
@@ -10,5 +10,5 @@
 export const AdminGenresPage: React.FC = () => {
   const navigate = useNavigate()
-  const { genres, addGenre, deleteGenre } = useStoryStore()
+  const { genres, fetchGenres, addGenre, deleteGenre } = useStoryStore()
   const { addToast } = useUIStore()
   const [addOpen, setAddOpen] = useState(false)
@@ -16,5 +16,7 @@
   const [deleteTarget, setDeleteTarget] = useState<Genre | null>(null)
 
-  const handleAdd = () => {
+  useEffect(() => { fetchGenres() }, [])
+
+  const handleAdd = async () => {
     if (!newName.trim()) return
     if (genres.some(g => g.name.toLowerCase() === newName.trim().toLowerCase())) {
@@ -22,17 +24,21 @@
       return
     }
-    addGenre({ genre_id: Date.now(), name: newName.trim(), story_count: 0 })
-    addToast(`Genre "${newName.trim()}" added!`)
-    setNewName('')
-    setAddOpen(false)
+    try {
+      await addGenre(newName.trim())
+      addToast(`Genre "${newName.trim()}" added!`)
+      setNewName('')
+      setAddOpen(false)
+    } catch {
+      addToast('Failed to add genre', 'error')
+    }
   }
 
-  const handleDelete = (genre: Genre) => {
-    if (genre.story_count > 0) {
-      addToast('Cannot delete genre with associated stories', 'error')
-      return
+  const handleDelete = async (genre: Genre) => {
+    try {
+      await deleteGenre(genre.genre_id)
+      addToast(`Genre "${genre.name}" deleted`, 'info')
+    } catch {
+      addToast('Failed to delete genre', 'error')
     }
-    deleteGenre(genre.genre_id)
-    addToast(`Genre "${genre.name}" deleted`, 'info')
     setDeleteTarget(null)
   }
Index: chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx
===================================================================
--- chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/pages/reading-list/CommunityListsPage.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,3 +1,3 @@
-import React, { useState } from 'react'
+import React, { useState, useEffect } from 'react'
 import { useNavigate } from 'react-router-dom'
 import { Globe, BookOpen, User } from 'lucide-react'
@@ -10,6 +10,8 @@
 export const CommunityListsPage: React.FC = () => {
   const navigate = useNavigate()
-  const { readingLists } = useStoryStore()
+  const { readingLists, fetchReadingLists } = useStoryStore()
   const [selectedList, setSelectedList] = useState<ReadingList | null>(null)
+
+  useEffect(() => { fetchReadingLists() }, [])
 
   const publicLists = readingLists.filter(l => l.is_public)
Index: chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx
===================================================================
--- chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/pages/reading-list/ReadingListPage.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -12,9 +12,13 @@
   const navigate = useNavigate()
   const { currentUser } = useAuthStore()
-  const { readingLists, fetchReadingLists, createReadingList, deleteReadingList, removeStoryFromList } = useStoryStore()
+  const { readingLists, fetchUserReadingLists, createReadingList, deleteReadingList, removeStoryFromList } = useStoryStore()
+  const [fetching, setFetching] = useState(false)
+  const [confirmRemove, setConfirmRemove] = useState<{ listId: number; storyId: number; title: string } | null>(null)
 
   useEffect(() => {
-    fetchReadingLists()
-  }, [])
+    if (!currentUser) return
+    setFetching(true)
+    fetchUserReadingLists(currentUser.user_id).finally(() => setFetching(false))
+  }, [currentUser?.user_id])
   const { addToast } = useUIStore()
   const [createOpen, setCreateOpen] = useState(false)
@@ -33,5 +37,5 @@
   }
 
-  const myLists = readingLists.filter(l => l.user_id === currentUser.user_id)
+  const myLists = readingLists.filter(l => l.user_id === currentUser!.user_id)
 
   const handleCreate = async () => {
@@ -73,5 +77,10 @@
       </div>
 
-      {myLists.length === 0 ? (
+      {fetching ? (
+        <div className="flex flex-col items-center py-20 text-slate-500">
+          <BookOpen size={48} className="mb-4 opacity-40 animate-pulse" />
+          <p className="text-sm">Loading your lists...</p>
+        </div>
+      ) : myLists.length === 0 ? (
         <div className="flex flex-col items-center py-20 text-slate-500">
           <BookOpen size={48} className="mb-4 opacity-40" />
@@ -124,22 +133,23 @@
                   <div className="space-y-2">
                     {list.stories.slice(0, 4).map(item => (
-                      <div key={item.item_id} className="flex items-center gap-3 p-2 rounded-lg hover:bg-slate-700/50 group">
-                        <div className="flex-1 min-w-0">
+                      <div key={item.item_id} className="flex items-center gap-2 p-2 rounded-lg hover:bg-slate-700/50">
+                        <div className="flex-1 min-w-0 overflow-hidden">
                           <button
                             onClick={() => navigate(`/story/${item.story_id}`)}
-                            className="text-white text-sm font-medium hover:text-indigo-300 transition-colors truncate block text-left"
+                            className="text-white text-sm font-medium hover:text-indigo-300 transition-colors truncate block text-left w-full"
                           >
                             {item.story_title}
                           </button>
                           <div className="flex items-center gap-2 mt-0.5">
-                            <span className="text-slate-500 text-xs">by {item.author_username}</span>
+                            <span className="text-slate-500 text-xs truncate">by {item.author_username}</span>
                             {item.genres.slice(0, 1).map(g => <GenreBadge key={g} genre={g} />)}
                           </div>
                         </div>
                         <button
-                          onClick={() => removeStoryFromList(list.list_id, item.story_id)}
-                          className="opacity-0 group-hover:opacity-100 text-slate-500 hover:text-rose-400 transition-all"
+                          onClick={() => setConfirmRemove({ listId: list.list_id, storyId: item.story_id, title: item.story_title })}
+                          className="flex-shrink-0 text-slate-500 hover:text-rose-400 hover:bg-rose-400/10 transition-all p-1.5 rounded-lg"
+                          title="Remove from list"
                         >
-                          <X size={14} />
+                          <Trash2 size={14} />
                         </button>
                       </div>
@@ -165,4 +175,22 @@
       )}
 
+      {/* Confirm remove modal */}
+      <Modal isOpen={!!confirmRemove} onClose={() => setConfirmRemove(null)} title="Remove Story">
+        <div className="space-y-4">
+          <p className="text-slate-300 text-sm">
+            Are you sure you want to remove <span className="text-white font-medium">"{confirmRemove?.title}"</span> from this list?
+          </p>
+          <div className="flex gap-3">
+            <Button variant="secondary" className="flex-1" onClick={() => setConfirmRemove(null)}>Cancel</Button>
+            <Button variant="danger" className="flex-1" onClick={async () => {
+              if (!confirmRemove) return
+              await removeStoryFromList(confirmRemove.listId, confirmRemove.storyId)
+              addToast('Story removed from list', 'info')
+              setConfirmRemove(null)
+            }}>Remove</Button>
+          </div>
+        </div>
+      </Modal>
+
       {/* Create modal */}
       <Modal isOpen={createOpen} onClose={() => setCreateOpen(false)} title="Create Reading List">
Index: chapterx-frontend/src/pages/story/StoryDetailPage.tsx
===================================================================
--- chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -23,4 +23,6 @@
   const [listModalOpen, setListModalOpen] = useState(false)
   const [newListName, setNewListName] = useState('')
+  const [liveLikes, setLiveLikes] = useState<number | null>(null)
+  const [liveComments, setLiveComments] = useState<number | null>(null)
 
   const story = stories.find(s => s.story_id === Number(id))
@@ -153,5 +155,5 @@
           {/* Action bar */}
           <div className="flex items-center gap-3 flex-wrap">
-            <LikeButton storyId={story.story_id} authorUserId={story.user_id} totalLikes={story.total_likes} />
+            <LikeButton storyId={story.story_id} authorUserId={story.user_id} totalLikes={story.total_likes} onCountChange={setLiveLikes} />
             {currentUser && (
               <Button variant="secondary" size="sm" onClick={() => setListModalOpen(true)}>
@@ -183,5 +185,5 @@
           {/* Comments */}
           <div className="border-t border-slate-700 pt-8">
-            <CommentSection storyId={story.story_id} authorUserId={story.user_id} />
+            <CommentSection storyId={story.story_id} authorUserId={story.user_id} onCountChange={setLiveComments} />
           </div>
         </div>
@@ -203,5 +205,5 @@
               <div className="flex justify-between">
                 <span className="text-slate-400">Likes</span>
-                <span className="text-white">{story.total_likes.toLocaleString()}</span>
+                <span className="text-white">{(liveLikes ?? story.total_likes).toLocaleString()}</span>
               </div>
               <div className="flex justify-between">
@@ -211,5 +213,5 @@
               <div className="flex justify-between">
                 <span className="text-slate-400">Comments</span>
-                <span className="text-white">{story.total_comments}</span>
+                <span className="text-white">{liveComments ?? story.total_comments}</span>
               </div>
               <div className="flex justify-between">
Index: chapterx-frontend/src/store/notificationStore.ts
===================================================================
--- chapterx-frontend/src/store/notificationStore.ts	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/store/notificationStore.ts	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,41 +1,86 @@
 import { create } from 'zustand'
+import axios from 'axios'
 import { Notification } from '../types'
-import { mockNotifications } from '../data/mockData'
+
+const API = 'https://localhost:7125/api'
+
+function getAuthHeaders() {
+  try {
+    const token = JSON.parse(localStorage.getItem('chapterx-auth') || '{}')?.state?.token
+    return token ? { Authorization: `Bearer ${token}` } : {}
+  } catch {
+    return {}
+  }
+}
 
 interface NotificationStore {
   notifications: Notification[]
-  addNotification: (n: Omit<Notification, 'notification_id' | 'created_at' | 'is_read'>) => void
-  markAllRead: () => void
-  markRead: (id: number) => void
+  fetchUserNotifications: (userId: number) => Promise<void>
+  addNotification: (n: { recipientUserId: number; type: string; content: string; link?: string }) => Promise<void>
+  markAllRead: () => Promise<void>
+  markRead: (id: number) => Promise<void>
   getUnreadCount: () => number
 }
 
 export const useNotificationStore = create<NotificationStore>((set, get) => ({
-  notifications: [...mockNotifications],
+  notifications: [],
 
-  addNotification: (n) =>
-    set(state => ({
-      notifications: [
-        {
-          ...n,
-          notification_id: Date.now(),
-          created_at: new Date().toISOString(),
-          is_read: false,
-        },
-        ...state.notifications,
-      ],
-    })),
+  fetchUserNotifications: async (userId) => {
+    try {
+      const res = await axios.get(`${API}/notifications/user/${userId}`, { headers: getAuthHeaders() })
+      const data: any[] = res.data ?? []
+      const notifications: Notification[] = data.map(n => ({
+        notification_id: n.id,
+        user_id: userId,
+        type: n.type ?? 'info',
+        title: n.type ?? 'Notification',
+        message: n.content,
+        link: n.link,
+        is_read: n.isRead,
+        created_at: n.createdAt,
+      }))
+      set({ notifications })
+    } catch {
+      // keep existing
+    }
+  },
 
-  markAllRead: () =>
-    set(state => ({
-      notifications: state.notifications.map(n => ({ ...n, is_read: true })),
-    })),
+  addNotification: async ({ recipientUserId, type, content, link }) => {
+    try {
+      await axios.post(`${API}/notifications`, {
+        content,
+        recipientUserId,
+        type,
+        link,
+      }, { headers: getAuthHeaders() })
+    } catch {
+      // silent — notification is for recipient, not current user
+    }
+  },
 
-  markRead: (id) =>
+  markAllRead: async () => {
+    const unread = get().notifications.filter(n => !n.is_read)
+    set(state => ({ notifications: state.notifications.map(n => ({ ...n, is_read: true })) }))
+    try {
+      await Promise.all(unread.map(n =>
+        axios.put(`${API}/notifications/${n.notification_id}/read`, {}, { headers: getAuthHeaders() })
+      ))
+    } catch {
+      // keep optimistic
+    }
+  },
+
+  markRead: async (id) => {
     set(state => ({
       notifications: state.notifications.map(n =>
         n.notification_id === id ? { ...n, is_read: true } : n
       ),
-    })),
+    }))
+    try {
+      await axios.put(`${API}/notifications/${id}/read`, {}, { headers: getAuthHeaders() })
+    } catch {
+      // keep optimistic
+    }
+  },
 
   getUnreadCount: () => get().notifications.filter(n => !n.is_read).length,
Index: chapterx-frontend/src/store/storyStore.ts
===================================================================
--- chapterx-frontend/src/store/storyStore.ts	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ chapterx-frontend/src/store/storyStore.ts	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -25,4 +25,25 @@
 const API = 'https://localhost:7125/api'
 
+function mapReadingList(l: any): ReadingList {
+  return {
+    list_id: l.id,
+    user_id: l.userId,
+    username: l.username ?? '',
+    name: l.name,
+    description: l.content ?? '',
+    is_public: l.isPublic,
+    created_at: l.createdAt,
+    stories: (l.readingListItems ?? []).map((i: any) => ({
+      item_id: i.listId ?? 0,
+      list_id: l.id,
+      story_id: i.storyId,
+      story_title: i.storyTitle ?? `Story #${i.storyId}`,
+      author_username: i.authorUsername ?? '',
+      added_at: i.addedAt ?? new Date().toISOString(),
+      genres: i.genres ?? [],
+    })),
+  }
+}
+
 function getAuthHeaders() {
   try {
@@ -53,4 +74,6 @@
   fetchChapters: () => Promise<void>
   fetchReadingLists: () => Promise<void>
+  fetchUserReadingLists: (userId: number) => Promise<void>
+  fetchGenres: () => Promise<void>
 
   // Story actions
@@ -86,6 +109,6 @@
 
   // Genre actions
-  addGenre: (genre: Genre) => void
-  deleteGenre: (id: number) => void
+  addGenre: (name: string) => Promise<void>
+  deleteGenre: (id: number) => Promise<void>
 
   // Reading list actions
@@ -103,5 +126,5 @@
   aiSuggestions: [...mockAISuggestions],
   genres: [...mockGenres],
-  readingLists: [...mockReadingLists],
+  readingLists: [],
   likedStories: [],
 
@@ -118,5 +141,5 @@
         mature_content: s.matureContent,
         status: 'published' as StoryStatus,
-        author_username: '',
+        author_username: s.writer?.user?.username ?? '',
         created_at: s.createdAt,
         updated_at: s.updatedAt,
@@ -125,5 +148,5 @@
         total_chapters: 0,
         total_views: 0,
-        genres: [],
+        genres: (s.hasGenres ?? []).map((hg: any) => hg.genre?.name ?? hg.name).filter(Boolean),
       }))
       if (stories.length > 0) set({ stories })
@@ -159,8 +182,9 @@
     const res = await axios.post(`${API}/stories`, {
       matureContent: story.mature_content,
-      shortDescription: story.title || story.short_description,
+      shortDescription: story.short_description || story.title,
       image: null,
       content: story.content,
       userId: story.user_id,
+      genres: story.genres ?? [],
     }, { headers: getAuthHeaders() })
     const backendId = res.data?.id ?? res.data
@@ -443,42 +467,54 @@
   },
 
-  addGenre: (genre) =>
-    set(state => ({ genres: [...state.genres, genre] })),
-
-  deleteGenre: (id) =>
-    set(state => ({ genres: state.genres.filter(g => g.genre_id !== id) })),
+  fetchGenres: async () => {
+    try {
+      const res = await axios.get(`${API}/genres`)
+      const data: any[] = res.data?.genres ?? res.data ?? []
+      const genres: Genre[] = data.map((g: any) => ({ genre_id: g.id, name: g.name }))
+      if (genres.length > 0) set({ genres })
+    } catch {
+      // keep mock data on failure
+    }
+  },
+
+  addGenre: async (name) => {
+    const res = await axios.post(`${API}/genres`, { name }, { headers: getAuthHeaders() })
+    const id = res.data?.id ?? res.data
+    set(state => ({ genres: [...state.genres, { genre_id: id, name }] }))
+  },
+
+  deleteGenre: async (id) => {
+    set(state => ({ genres: state.genres.filter(g => g.genre_id !== id) }))
+    try {
+      await axios.delete(`${API}/genres/${id}`, { headers: getAuthHeaders() })
+    } catch {
+      // optimistic delete already applied
+    }
+  },
 
   fetchReadingLists: async () => {
     try {
-      const [listsRes, storiesRes] = await Promise.all([
-        axios.get(`${API}/readinglists`),
-        axios.get(`${API}/stories`),
-      ])
-      const data: any[] = listsRes.data?.readingLists ?? listsRes.data ?? []
-      const storiesData: any[] = storiesRes.data?.stories ?? storiesRes.data ?? []
-      const lists: ReadingList[] = data.map((l: any) => ({
-        list_id: l.id,
-        user_id: l.userId,
-        username: '',
-        name: l.name,
-        description: l.content ?? '',
-        is_public: l.isPublic,
-        created_at: l.createdAt,
-        stories: (l.readingListItems ?? []).map((i: any) => {
-          const story = storiesData.find((s: any) => s.id === i.storyId)
-          return {
-            item_id: i.id ?? 0,
-            list_id: l.id,
-            story_id: i.storyId,
-            story_title: story?.title ?? story?.shortDescription ?? `Story #${i.storyId}`,
-            author_username: story?.authorUsername ?? '',
-            added_at: i.addedAt ?? new Date().toISOString(),
-            genres: story?.genres ?? [],
-          }
-        }),
-      }))
-      if (lists.length > 0) set({ readingLists: lists })
-    } catch {
-      // keep mock data on failure
+      const res = await axios.get(`${API}/readinglists`)
+      const data: any[] = res.data ?? []
+      const lists: ReadingList[] = data.map(mapReadingList)
+      set({ readingLists: lists })
+    } catch {
+      // keep existing data on failure
+    }
+  },
+
+  fetchUserReadingLists: async (userId) => {
+    try {
+      const res = await axios.get(`${API}/readinglists/user/${userId}`, { headers: getAuthHeaders() })
+      const data: any[] = res.data ?? []
+      const lists: ReadingList[] = data.map(mapReadingList)
+      set(state => ({
+        readingLists: [
+          ...state.readingLists.filter(l => l.user_id !== userId),
+          ...lists,
+        ]
+      }))
+    } catch (err) {
+      console.error('fetchUserReadingLists failed:', err)
     }
   },
@@ -525,9 +561,5 @@
     }))
     try {
-      // find the item id from backend list items to delete
-      const res = await axios.get(`${API}/readinglistitems`)
-      const items: any[] = res.data?.readingListItems ?? res.data ?? []
-      const item = items.find((i: any) => i.readingListId === listId && i.storyId === storyId)
-      if (item) await axios.delete(`${API}/readinglistitems/${item.id}`, { headers: getAuthHeaders() })
+      await axios.delete(`${API}/readinglistitems/${listId}/story/${storyId}`, { headers: getAuthHeaders() })
     } catch {
       // optimistic update already applied
