Index: chapterx-frontend/src/App.tsx
===================================================================
--- chapterx-frontend/src/App.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/App.tsx	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -52,5 +52,4 @@
 
   if (!currentUser) {
-    addToast('Please sign in to access this page.', 'warning')
     return <Navigate to="/login" replace />
   }
@@ -68,9 +67,10 @@
 
 function App() {
-  const { fetchStories, fetchChapters, fetchReadingLists } = useStoryStore()
+  const { fetchStories, fetchChapters, fetchCollaborations, fetchReadingLists } = useStoryStore()
 
   useEffect(() => {
     fetchStories()
     fetchChapters()
+    fetchCollaborations()
     fetchReadingLists()
   }, [])
Index: chapterx-frontend/src/components/writer/CollaboratorManager.tsx
===================================================================
--- chapterx-frontend/src/components/writer/CollaboratorManager.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/components/writer/CollaboratorManager.tsx	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -32,5 +32,5 @@
 }) => {
   const { collaborations, addCollaboration, removeCollaboration, updateCollaborationPermission } = useStoryStore()
-  const { allUsers } = useAuthStore()
+  const { allUsers, fetchAllUsers } = useAuthStore()
   const { addNotification } = useNotificationStore()
   const { addToast } = useUIStore()
@@ -43,5 +43,5 @@
   const storyCollabs = collaborations.filter(c => c.story_id === storyId)
   const collabUserIds = new Set(storyCollabs.map(c => c.user_id))
-  const availableUsers = allUsers.filter(u => u.user_id !== ownerId && !collabUserIds.has(u.user_id))
+  const availableUsers = allUsers.filter(u => u.user_id !== ownerId && !collabUserIds.has(u.user_id) && (u.role === 'writer' || u.role === 'admin'))
 
   const handleInvite = () => {
@@ -62,8 +62,7 @@
     addCollaboration(newCollab)
     addNotification({
-      user_id: user.user_id,
+      recipientUserId: user.user_id,
       type: 'collaboration',
-      title: 'Collaboration Invite',
-      message: `You've been invited to collaborate on "${storyTitle}" as ${selectedRole}.`,
+      content: `You've been invited to collaborate on "${storyTitle}" as ${selectedRole}.`,
       link: `/story/${storyId}`,
     })
@@ -86,5 +85,5 @@
           <span className="text-xs text-slate-500">({storyCollabs.length})</span>
         </div>
-        <Button size="sm" onClick={() => setInviteOpen(true)}>
+        <Button size="sm" onClick={() => { fetchAllUsers(); setInviteOpen(true) }}>
           <UserPlus size={14} />
           Invite
@@ -149,5 +148,5 @@
               {availableUsers.map(u => (
                 <option key={u.user_id} value={u.username}>
-                  @{u.username} ({u.role})
+                  @{u.username}
                 </option>
               ))}
Index: chapterx-frontend/src/pages/story/StoryDetailPage.tsx
===================================================================
--- chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/pages/story/StoryDetailPage.tsx	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -102,4 +102,5 @@
 
   const isOwner = currentUser?.user_id === story.user_id
+  const isCollaborator = currentUser ? storyCollabs.some(c => c.user_id === currentUser.user_id) : false
 
   return (
@@ -162,5 +163,5 @@
               </Button>
             )}
-            {isOwner && (
+            {(isOwner || isCollaborator) && (
               <Button variant="ghost" size="sm" onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}>
                 Edit Story
@@ -173,5 +174,5 @@
             <div className="flex items-center justify-between mb-4">
               <h2 className="font-serif text-xl font-bold text-white">Chapters</h2>
-              {isOwner && (
+              {(isOwner || isCollaborator) && (
                 <Button size="sm" onClick={() => navigate(`/writer/create-chapter/${story.story_id}`)}>
                   <Plus size={14} />
Index: chapterx-frontend/src/pages/writer/WriterDashboard.tsx
===================================================================
--- chapterx-frontend/src/pages/writer/WriterDashboard.tsx	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/pages/writer/WriterDashboard.tsx	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -22,10 +22,14 @@
   const navigate = useNavigate()
   const { currentUser } = useAuthStore()
-  const { stories } = useStoryStore()
+  const { stories, collaborations } = useStoryStore()
   const { notifications } = useNotificationStore()
 
   if (!currentUser) return null
 
-  const myStories = stories.filter(s => s.user_id === currentUser.user_id)
+  const ownedStories = stories.filter(s => s.user_id === currentUser.user_id)
+  const collabStoryIds = new Set(collaborations.filter(c => c.user_id === currentUser.user_id).map(c => c.story_id))
+  const collabStories = stories.filter(s => collabStoryIds.has(s.story_id))
+  const myStories = ownedStories
+  const allDashboardStories = [...ownedStories, ...collabStories]
   const published = myStories.filter(s => s.status === 'published')
   const drafts = myStories.filter(s => s.status === 'draft')
@@ -76,5 +80,5 @@
             <h2 className="font-serif text-xl font-bold text-white">My Stories</h2>
           </div>
-          {myStories.length === 0 ? (
+          {allDashboardStories.length === 0 ? (
             <div className="bg-slate-800 border border-slate-700 rounded-2xl p-12 text-center">
               <BookOpen size={40} className="mx-auto mb-4 text-slate-600" />
@@ -88,24 +92,33 @@
           ) : (
             <div className="space-y-3">
-              {myStories.map(story => (
-                <div key={story.story_id} className="flex items-center gap-4 p-4 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/40 transition-colors">
-                  <div className="flex-1 min-w-0">
-                    <div className="flex items-center gap-2 mb-1">
-                      <h3 className="text-white font-medium text-sm truncate">{story.title}</h3>
-                      <StatusBadge status={story.status} />
+              {allDashboardStories.map(story => {
+                const isCollab = collabStoryIds.has(story.story_id)
+                return (
+                  <div key={story.story_id} className="flex items-center gap-4 p-4 bg-slate-800 border border-slate-700 rounded-xl hover:border-indigo-500/40 transition-colors">
+                    <div className="flex-1 min-w-0">
+                      <div className="flex items-center gap-2 mb-1">
+                        <h3 className="text-white font-medium text-sm truncate">{story.title}</h3>
+                        <StatusBadge status={story.status} />
+                        {isCollab && (
+                          <span className="px-2 py-0.5 text-xs font-medium rounded-full bg-violet-500/20 text-violet-400 border border-violet-500/30">
+                            Collaborator
+                          </span>
+                        )}
+                      </div>
+                      <div className="flex items-center gap-3 text-slate-500 text-xs">
+                        {isCollab && <span className="text-slate-500">by {story.author_username}</span>}
+                        <span className="flex items-center gap-1"><Eye size={11} /> {story.total_views.toLocaleString()}</span>
+                        <span className="flex items-center gap-1"><Heart size={11} /> {story.total_likes}</span>
+                        <span className="flex items-center gap-1"><MessageCircle size={11} /> {story.total_comments}</span>
+                        <span>{story.total_chapters} chapters</span>
+                      </div>
                     </div>
-                    <div className="flex items-center gap-3 text-slate-500 text-xs">
-                      <span className="flex items-center gap-1"><Eye size={11} /> {story.total_views.toLocaleString()}</span>
-                      <span className="flex items-center gap-1"><Heart size={11} /> {story.total_likes}</span>
-                      <span className="flex items-center gap-1"><MessageCircle size={11} /> {story.total_comments}</span>
-                      <span>{story.total_chapters} chapters</span>
+                    <div className="flex gap-2 flex-shrink-0">
+                      <Button size="sm" variant="ghost" onClick={() => navigate(`/story/${story.story_id}`)}>View</Button>
+                      <Button size="sm" variant="secondary" onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}>Edit</Button>
                     </div>
                   </div>
-                  <div className="flex gap-2 flex-shrink-0">
-                    <Button size="sm" variant="ghost" onClick={() => navigate(`/story/${story.story_id}`)}>View</Button>
-                    <Button size="sm" variant="secondary" onClick={() => navigate(`/writer/edit-story/${story.story_id}`)}>Edit</Button>
-                  </div>
-                </div>
-              ))}
+                )
+              })}
             </div>
           )}
Index: chapterx-frontend/src/store/authStore.ts
===================================================================
--- chapterx-frontend/src/store/authStore.ts	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/store/authStore.ts	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -19,4 +19,5 @@
   updateUserRole: (userId: number, role: UserRole) => void
   addUser: (user: User) => void
+  fetchAllUsers: () => Promise<void>
 }
 
@@ -135,4 +136,25 @@
       addUser: (user: User) =>
         set(state => ({ allUsers: [...state.allUsers, user] })),
+
+      fetchAllUsers: async () => {
+        try {
+          const res = await axios.get(`${API_BASE}/users`)
+          const data: any[] = res.data?.users ?? res.data ?? []
+          const users: User[] = data.map((u: any) => ({
+            user_id: u.id,
+            username: u.username,
+            email: u.email ?? '',
+            name: u.name ?? u.username,
+            surname: u.surname ?? '',
+            role: (u.role ?? 'regular') as UserRole,
+            created_at: u.createdAt ?? new Date().toISOString(),
+            follower_count: 0,
+            following_count: 0,
+          }))
+          set({ allUsers: users })
+        } catch {
+          // keep existing
+        }
+      },
     }),
     {
Index: chapterx-frontend/src/store/storyStore.ts
===================================================================
--- chapterx-frontend/src/store/storyStore.ts	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
+++ chapterx-frontend/src/store/storyStore.ts	(revision 7fbb91c66b46c3063caa934a83d6d0681406c83c)
@@ -73,4 +73,5 @@
   fetchStories: () => Promise<void>
   fetchChapters: () => Promise<void>
+  fetchCollaborations: () => Promise<void>
   fetchReadingLists: () => Promise<void>
   fetchUserReadingLists: (userId: number) => Promise<void>
@@ -98,7 +99,7 @@
 
   // Collaboration actions
-  addCollaboration: (collab: Collaboration) => void
+  addCollaboration: (collab: Collaboration) => Promise<void>
   updateCollaborationPermission: (userId: number, storyId: number, level: PermissionLevel) => void
-  removeCollaboration: (userId: number, storyId: number) => void
+  removeCollaboration: (userId: number, storyId: number) => Promise<void>
 
   // AI Suggestion actions
@@ -175,4 +176,25 @@
     } catch {
       // keep mock data on failure
+    }
+  },
+
+  fetchCollaborations: async () => {
+    try {
+      const res = await axios.get(`${API}/collaborations`)
+      const data: any[] = res.data ?? []
+      const collaborations: Collaboration[] = data.map((c: any) => ({
+        collab_id: c.id,
+        story_id: c.storyId,
+        user_id: c.userId,
+        username: c.username ?? '',
+        name: c.name ?? c.username ?? '',
+        story_title: '',
+        role: 'editor' as any,
+        permission_level: 3 as any,
+        joined_at: c.createdAt,
+      }))
+      set({ collaborations })
+    } catch {
+      // keep existing
     }
   },
@@ -364,6 +386,16 @@
     get().likedStories.some(l => l.userId === userId && l.storyId === storyId),
 
-  addCollaboration: (collab) =>
-    set(state => ({ collaborations: [...state.collaborations, collab] })),
+  addCollaboration: async (collab) => {
+    set(state => ({ collaborations: [...state.collaborations, collab] }))
+    try {
+      await axios.post(`${API}/collaborations`, {
+        userId: collab.user_id,
+        storyId: collab.story_id,
+        role: collab.role,
+      }, { headers: getAuthHeaders() })
+    } catch {
+      // keep optimistic
+    }
+  },
 
   updateCollaborationPermission: (userId, storyId, level) =>
@@ -376,10 +408,16 @@
     })),
 
-  removeCollaboration: (userId, storyId) =>
+  removeCollaboration: async (userId, storyId) => {
     set(state => ({
       collaborations: state.collaborations.filter(
         c => !(c.user_id === userId && c.story_id === storyId)
       ),
-    })),
+    }))
+    try {
+      await axios.delete(`${API}/collaborations/user/${userId}/story/${storyId}`, { headers: getAuthHeaders() })
+    } catch {
+      // keep optimistic
+    }
+  },
 
   fetchSuggestions: async () => {
