Index: ChapterX.API/Controllers/CommentsController.cs
===================================================================
--- ChapterX.API/Controllers/CommentsController.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.API/Controllers/CommentsController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.Comment.Commands;
 using ChapterX.Application.Comment.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,10 +14,29 @@
     {
         private readonly IMediator _mediator;
+        private readonly ICommentRepository _commentRepository;
         private readonly ILogger<CommentsController> _logger;
 
-        public CommentsController(IMediator mediator, ILogger<CommentsController> logger)
+        public CommentsController(IMediator mediator, ICommentRepository commentRepository, ILogger<CommentsController> logger)
         {
             _mediator = mediator;
+            _commentRepository = commentRepository;
             _logger = logger;
+        }
+
+        [HttpGet("story/{storyId:int}")]
+        [AllowAnonymous]
+        public async Task<ActionResult> GetByStory(int storyId)
+        {
+            var comments = await _commentRepository.GetByStoryIdAsync(storyId);
+            var result = comments.Select(c => new
+            {
+                id = c.Id,
+                content = c.Content,
+                userId = c.UserId,
+                storyId = c.StoryId,
+                username = c.User?.Username ?? "",
+                createdAt = c.CreatedAt,
+            });
+            return Ok(result);
         }
 
Index: ChapterX.API/Controllers/LikesController.cs
===================================================================
--- ChapterX.API/Controllers/LikesController.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.API/Controllers/LikesController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.Likes.Commands;
 using ChapterX.Application.Likes.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,10 +14,29 @@
     {
         private readonly IMediator _mediator;
+        private readonly ILikesRepository _likesRepository;
         private readonly ILogger<LikesController> _logger;
 
-        public LikesController(IMediator mediator, ILogger<LikesController> logger)
+        public LikesController(IMediator mediator, ILikesRepository likesRepository, ILogger<LikesController> logger)
         {
             _mediator = mediator;
+            _likesRepository = likesRepository;
             _logger = logger;
+        }
+
+        [HttpGet("story/{storyId:int}")]
+        [AllowAnonymous]
+        public async Task<ActionResult> GetByStory(int storyId)
+        {
+            var likes = await _likesRepository.GetByStoryIdAsync(storyId);
+            return Ok(new { count = likes.Count(), userIds = likes.Select(l => l.UserId).ToList() });
+        }
+
+        [HttpDelete("user/{userId:int}/story/{storyId:int}")]
+        [Authorize]
+        public async Task<ActionResult> DeleteByUserAndStory(int userId, int storyId)
+        {
+            var deleted = await _likesRepository.DeleteByUserAndStoryAsync(userId, storyId);
+            if (!deleted) return NotFound();
+            return Ok();
         }
 
@@ -43,5 +63,7 @@
         public async Task<ActionResult> Add([FromBody] AddRequest request)
         {
-            _logger.LogInformation("Adding a new like for ChapterId: {ChapterId}", request.ChapterId);
+            _logger.LogInformation("Adding a new like for StoryId: {StoryId}", request.StoryId);
+            var exists = await _likesRepository.ExistsAsync(request.UserId, request.StoryId);
+            if (exists) return Ok();
             var response = await _mediator.Send(request);
             return Ok(response);
Index: ChapterX.API/Controllers/NotificationsController.cs
===================================================================
--- ChapterX.API/Controllers/NotificationsController.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.API/Controllers/NotificationsController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.Notification.Commands;
 using ChapterX.Application.Notification.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,10 +14,40 @@
     {
         private readonly IMediator _mediator;
+        private readonly INotificationRepository _notificationRepository;
         private readonly ILogger<NotificationsController> _logger;
 
-        public NotificationsController(IMediator mediator, ILogger<NotificationsController> logger)
+        public NotificationsController(IMediator mediator, INotificationRepository notificationRepository, ILogger<NotificationsController> logger)
         {
             _mediator = mediator;
+            _notificationRepository = notificationRepository;
             _logger = logger;
+        }
+
+        [HttpGet("user/{userId:int}")]
+        [Authorize]
+        public async Task<ActionResult> GetByUser(int userId)
+        {
+            var notifications = await _notificationRepository.GetByUserIdAsync(userId);
+            var result = notifications.Select(n => new
+            {
+                id = n.Id,
+                content = n.Content,
+                isRead = n.IsRead,
+                createdAt = n.CreatedAt,
+                type = n.Type ?? "info",
+                link = n.Link,
+            });
+            return Ok(result);
+        }
+
+        [HttpPut("{id:int}/read")]
+        [Authorize]
+        public async Task<ActionResult> MarkRead(int id)
+        {
+            var notification = await _notificationRepository.GetByIdAsync(id);
+            if (notification == null) return NotFound();
+            notification.IsRead = true;
+            await _notificationRepository.UpdateAsync(notification);
+            return Ok();
         }
 
Index: ChapterX.API/Controllers/ReadingListItemsController.cs
===================================================================
--- ChapterX.API/Controllers/ReadingListItemsController.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.API/Controllers/ReadingListItemsController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.ReadingListItems.Commands;
 using ChapterX.Application.ReadingListItems.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,9 +14,11 @@
     {
         private readonly IMediator _mediator;
+        private readonly IReadingListItemsRepository _readingListItemsRepository;
         private readonly ILogger<ReadingListItemsController> _logger;
 
-        public ReadingListItemsController(IMediator mediator, ILogger<ReadingListItemsController> logger)
+        public ReadingListItemsController(IMediator mediator, IReadingListItemsRepository readingListItemsRepository, ILogger<ReadingListItemsController> logger)
         {
             _mediator = mediator;
+            _readingListItemsRepository = readingListItemsRepository;
             _logger = logger;
         }
@@ -70,4 +73,13 @@
             return Ok(response);
         }
+
+        [HttpDelete("{listId:int}/story/{storyId:int}")]
+        [Authorize]
+        public async Task<ActionResult> DeleteByListAndStory(int listId, int storyId)
+        {
+            _logger.LogInformation("Removing story {StoryId} from list {ListId}", storyId, listId);
+            var deleted = await _readingListItemsRepository.DeleteByListAndStoryAsync(listId, storyId);
+            return deleted ? Ok() : NotFound();
+        }
     }
 }
Index: ChapterX.API/Controllers/ReadingListsController.cs
===================================================================
--- ChapterX.API/Controllers/ReadingListsController.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.API/Controllers/ReadingListsController.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -1,4 +1,5 @@
 using ChapterX.Application.ReadingList.Commands;
 using ChapterX.Application.ReadingList.Queries;
+using ChapterX.Domain.Repositories;
 using MediatR;
 using Microsoft.AspNetCore.Authorization;
@@ -13,10 +14,22 @@
     {
         private readonly IMediator _mediator;
+        private readonly IReadingListRepository _readingListRepository;
         private readonly ILogger<ReadingListsController> _logger;
 
-        public ReadingListsController(IMediator mediator, ILogger<ReadingListsController> logger)
+        public ReadingListsController(IMediator mediator, IReadingListRepository readingListRepository, ILogger<ReadingListsController> logger)
         {
             _mediator = mediator;
+            _readingListRepository = readingListRepository;
             _logger = logger;
+        }
+
+        [HttpGet("user/{userId:int}")]
+        [Authorize]
+        public async Task<ActionResult> GetByUser(int userId)
+        {
+            _logger.LogInformation("Fetching reading lists for user {UserId}", userId);
+            var lists = await _readingListRepository.GetByUserIdAsync(userId);
+            var result = lists.Select(l => MapList(l));
+            return Ok(result);
         }
 
@@ -26,7 +39,28 @@
         {
             _logger.LogInformation("Fetching all reading lists");
-            var response = await _mediator.Send(new GetAllRequest());
-            return Ok(response);
+            var lists = await _readingListRepository.GetAllAsync();
+            var result = lists.Select(l => MapList(l));
+            return Ok(result);
         }
+
+        private static object MapList(Domain.Entities.ReadingList l) => new
+        {
+            id = l.Id,
+            name = l.Name,
+            content = l.Content,
+            isPublic = l.IsPublic,
+            userId = l.UserId,
+            createdAt = l.CreatedAt,
+            username = l.User?.Username ?? "",
+            readingListItems = l.ReadingListItems.Select(i => new
+            {
+                listId = i.ListId,
+                storyId = i.StoryId,
+                addedAt = i.AddedAt,
+                storyTitle = i.Story?.ShortDescription ?? "",
+                authorUsername = i.Story?.Writer?.User?.Username ?? "",
+                genres = i.Story?.HasGenres.Select(hg => hg.Genre?.Name).Where(n => n != null).ToList() ?? []
+            }).ToList()
+        };
 
         [HttpGet("{id:int}")]
Index: ChapterX.Application/Likes/Commands/AddHandler.cs
===================================================================
--- ChapterX.Application/Likes/Commands/AddHandler.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Likes/Commands/AddHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -21,5 +21,5 @@
             {
                 UserId = request.UserId,
-                StoryId = request.ChapterId,
+                StoryId = request.StoryId,
                 CreatedAt = DateTime.UtcNow
             };
Index: ChapterX.Application/Likes/Commands/AddRequest.cs
===================================================================
--- ChapterX.Application/Likes/Commands/AddRequest.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Likes/Commands/AddRequest.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -3,4 +3,4 @@
 namespace ChapterX.Application.Likes.Commands
 {
-    public record AddRequest(int UserId, int ChapterId) : IRequest<AddResponse>;
+    public record AddRequest(int UserId, int StoryId) : IRequest<AddResponse>;
 }
Index: ChapterX.Application/Notification/Commands/AddHandler.cs
===================================================================
--- ChapterX.Application/Notification/Commands/AddHandler.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Notification/Commands/AddHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -22,5 +22,8 @@
                 Content = request.Content,
                 IsRead = false,
-                CreatedAt = DateTime.UtcNow
+                CreatedAt = DateTime.UtcNow,
+                RecipientUserId = request.RecipientUserId,
+                Type = request.Type,
+                Link = request.Link,
             };
 
Index: ChapterX.Application/Notification/Commands/AddRequest.cs
===================================================================
--- ChapterX.Application/Notification/Commands/AddRequest.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Notification/Commands/AddRequest.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -3,4 +3,4 @@
 namespace ChapterX.Application.Notification.Commands
 {
-    public record AddRequest(string Content) : IRequest<AddResponse>;
+    public record AddRequest(string Content, int? RecipientUserId = null, string? Type = null, string? Link = null) : IRequest<AddResponse>;
 }
Index: ChapterX.Application/Story/Commands/AddHandler.cs
===================================================================
--- ChapterX.Application/Story/Commands/AddHandler.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Story/Commands/AddHandler.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -8,9 +8,13 @@
     {
         private readonly IStoryRepository _storyRepository;
+        private readonly IGenreRepository _genreRepository;
+        private readonly IHasGenreRepository _hasGenreRepository;
         private readonly ILogger<AddHandler> _logger;
 
-        public AddHandler(IStoryRepository storyRepository, ILogger<AddHandler> logger)
+        public AddHandler(IStoryRepository storyRepository, IGenreRepository genreRepository, IHasGenreRepository hasGenreRepository, ILogger<AddHandler> logger)
         {
             _storyRepository = storyRepository;
+            _genreRepository = genreRepository;
+            _hasGenreRepository = hasGenreRepository;
             _logger = logger;
         }
@@ -31,4 +35,11 @@
             await _storyRepository.AddAsync(story, cancellationToken);
 
+            foreach (var genreName in request.Genres ?? [])
+            {
+                var genre = await _genreRepository.GetByNameAsync(genreName, cancellationToken);
+                if (genre == null) continue;
+                await _hasGenreRepository.AddAsync(new Domain.Entities.HasGenre { StoryId = story.Id, GenreId = genre.Id }, cancellationToken);
+            }
+
             return new AddResponse(story.Id);
         }
Index: ChapterX.Application/Story/Commands/AddRequest.cs
===================================================================
--- ChapterX.Application/Story/Commands/AddRequest.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Application/Story/Commands/AddRequest.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -3,4 +3,4 @@
 namespace ChapterX.Application.Story.Commands
 {
-    public record AddRequest(bool MatureContent, string ShortDescription, string? Image, string Content, int UserId) : IRequest<AddResponse>;
+    public record AddRequest(bool MatureContent, string ShortDescription, string? Image, string Content, int UserId, List<string> Genres) : IRequest<AddResponse>;
 }
Index: ChapterX.Domain/Entities/Notification.cs
===================================================================
--- ChapterX.Domain/Entities/Notification.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Domain/Entities/Notification.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -14,4 +14,7 @@
         public bool IsRead { get; set; }
         public DateTime CreatedAt { get; set; }
+        public int? RecipientUserId { get; set; }
+        public string? Type { get; set; }
+        public string? Link { get; set; }
 
         public ICollection<ContentType> ContentTypes { get; set; } = [];
Index: ChapterX.Domain/Repositories/ICommentRepository.cs
===================================================================
--- ChapterX.Domain/Repositories/ICommentRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Domain/Repositories/ICommentRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -6,4 +6,5 @@
     {
         Task<IEnumerable<Comment>> GetByChapterIdAsync(int chapterId, CancellationToken cancellationToken = default);
+        Task<IEnumerable<Comment>> GetByStoryIdAsync(int storyId, CancellationToken cancellationToken = default);
     }
 }
Index: ChapterX.Domain/Repositories/ILikesRepository.cs
===================================================================
--- ChapterX.Domain/Repositories/ILikesRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Domain/Repositories/ILikesRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -5,4 +5,7 @@
     public interface ILikesRepository : IRepository<Likes>
     {
+        Task<IEnumerable<Likes>> GetByStoryIdAsync(int storyId, CancellationToken cancellationToken = default);
+        Task<bool> DeleteByUserAndStoryAsync(int userId, int storyId, CancellationToken cancellationToken = default);
+        Task<bool> ExistsAsync(int userId, int storyId, CancellationToken cancellationToken = default);
     }
 }
Index: ChapterX.Domain/Repositories/IReadingListItemsRepository.cs
===================================================================
--- ChapterX.Domain/Repositories/IReadingListItemsRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Domain/Repositories/IReadingListItemsRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -6,4 +6,5 @@
     {
         Task<bool> ExistsAsync(int listId, int storyId, CancellationToken cancellationToken = default);
+        Task<bool> DeleteByListAndStoryAsync(int listId, int storyId, CancellationToken cancellationToken = default);
     }
 }
Index: ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs
===================================================================
--- ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Data/DataContext/ApplicationDbContext.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -210,4 +210,7 @@
                 e.Property(x => x.IsRead).HasColumnName("is_read");
                 e.Property(x => x.CreatedAt).HasColumnName("created_at");
+                e.Property(x => x.RecipientUserId).HasColumnName("recipient_user_id");
+                e.Property(x => x.Type).HasColumnName("type");
+                e.Property(x => x.Link).HasColumnName("link");
             });
 
Index: ChapterX.Infrastructure/Repositories/CommentRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/CommentRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/CommentRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -19,9 +19,12 @@
 
         public async Task<IEnumerable<Comment>> GetByChapterIdAsync(int chapterId, CancellationToken cancellationToken = default)
-        {
-            return await _dbSet
-                .Where(c => c.StoryId == chapterId)
+            => await _dbSet.Where(c => c.StoryId == chapterId).ToListAsync(cancellationToken);
+
+        public async Task<IEnumerable<Comment>> GetByStoryIdAsync(int storyId, CancellationToken cancellationToken = default)
+            => await _dbSet
+                .Include(c => c.User)
+                .Where(c => c.StoryId == storyId)
+                .OrderByDescending(c => c.CreatedAt)
                 .ToListAsync(cancellationToken);
-        }
     }
 }
Index: ChapterX.Infrastructure/Repositories/LikesRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/LikesRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/LikesRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -2,9 +2,5 @@
 using ChapterX.Domain.Repositories;
 using ChapterX.Infrastructure.Data.DataContext;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
+using Microsoft.EntityFrameworkCore;
 
 namespace ChapterX.Infrastructure.Repositories
@@ -15,4 +11,19 @@
         {
         }
+
+        public async Task<IEnumerable<Likes>> GetByStoryIdAsync(int storyId, CancellationToken cancellationToken = default)
+            => await _dbSet.Where(l => l.StoryId == storyId).ToListAsync(cancellationToken);
+
+        public async Task<bool> ExistsAsync(int userId, int storyId, CancellationToken cancellationToken = default)
+            => await _dbSet.AnyAsync(l => l.UserId == userId && l.StoryId == storyId, cancellationToken);
+
+        public async Task<bool> DeleteByUserAndStoryAsync(int userId, int storyId, CancellationToken cancellationToken = default)
+        {
+            var like = await _dbSet.FirstOrDefaultAsync(l => l.UserId == userId && l.StoryId == storyId, cancellationToken);
+            if (like == null) return false;
+            _dbSet.Remove(like);
+            await _context.SaveChangesAsync(cancellationToken);
+            return true;
+        }
     }
 }
Index: ChapterX.Infrastructure/Repositories/NotificationRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/NotificationRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/NotificationRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -15,7 +15,8 @@
         // This method returns all notifications; adjust filter when a User relation is added.
         public async Task<IEnumerable<Notification>> GetByUserIdAsync(int userId, CancellationToken cancellationToken = default)
-        {
-            return await _dbSet.ToListAsync(cancellationToken);
-        }
+            => await _dbSet
+                .Where(n => n.RecipientUserId == userId)
+                .OrderByDescending(n => n.CreatedAt)
+                .ToListAsync(cancellationToken);
     }
 }
Index: ChapterX.Infrastructure/Repositories/ReadingListItemsRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/ReadingListItemsRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/ReadingListItemsRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -14,4 +14,13 @@
         public async Task<bool> ExistsAsync(int listId, int storyId, CancellationToken cancellationToken = default)
             => await _dbSet.AnyAsync(i => i.ListId == listId && i.StoryId == storyId, cancellationToken);
+
+        public async Task<bool> DeleteByListAndStoryAsync(int listId, int storyId, CancellationToken cancellationToken = default)
+        {
+            var item = await _dbSet.FirstOrDefaultAsync(i => i.ListId == listId && i.StoryId == storyId, cancellationToken);
+            if (item == null) return false;
+            _dbSet.Remove(item);
+            await _context.SaveChangesAsync(cancellationToken);
+            return true;
+        }
     }
 }
Index: ChapterX.Infrastructure/Repositories/ReadingListRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/ReadingListRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/ReadingListRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -15,5 +15,13 @@
         {
             return await _dbSet
+                .Include(r => r.User)
                 .Include(r => r.ReadingListItems)
+                    .ThenInclude(i => i.Story)
+                        .ThenInclude(s => s.Writer)
+                            .ThenInclude(w => w!.User)
+                .Include(r => r.ReadingListItems)
+                    .ThenInclude(i => i.Story)
+                        .ThenInclude(s => s.HasGenres)
+                            .ThenInclude(hg => hg.Genre)
                 .ToListAsync(cancellationToken);
         }
@@ -23,5 +31,13 @@
             return await _dbSet
                 .Where(r => r.UserId == userId)
+                .Include(r => r.User)
                 .Include(r => r.ReadingListItems)
+                    .ThenInclude(i => i.Story)
+                        .ThenInclude(s => s.Writer)
+                            .ThenInclude(w => w!.User)
+                .Include(r => r.ReadingListItems)
+                    .ThenInclude(i => i.Story)
+                        .ThenInclude(s => s.HasGenres)
+                            .ThenInclude(hg => hg.Genre)
                 .ToListAsync(cancellationToken);
         }
Index: ChapterX.Infrastructure/Repositories/StoryRepository.cs
===================================================================
--- ChapterX.Infrastructure/Repositories/StoryRepository.cs	(revision acf690c1403ecbecd948a46d950278f177f2d408)
+++ ChapterX.Infrastructure/Repositories/StoryRepository.cs	(revision 73b69b22fa1e9888b8530a66db4a150efb8f52bc)
@@ -12,4 +12,14 @@
         }
 
+        public override async Task<IEnumerable<Story>> GetAllAsync(CancellationToken cancellationToken = default)
+        {
+            return await _dbSet
+                .Include(s => s.HasGenres)
+                    .ThenInclude(hg => hg.Genre)
+                .Include(s => s.Writer)
+                    .ThenInclude(w => w!.User)
+                .ToListAsync(cancellationToken);
+        }
+
         public async Task<IEnumerable<Story>> GetByWriterIdAsync(int writerId, CancellationToken cancellationToken = default)
         {
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
