featured image

MyKpopLists: Building a Scalable Social Platform for K-pop Enthusiasts

MyKpopLists is a full-stack social networking platform tailored for K-pop fans, featuring comprehensive artist databases, privacy-aware social interactions, AI-powered content tagging, and gamified community engagement.

Published

Thu Sep 25 2025

Technologies Used

Laravel Vue.js Inertia.js PostgreSQL Redis PHP Typescript TailwindCSS SQL Docker Nginx Supervisor API Integration LLM OAuth S3

Live Demo

Loading demo...

Project Overview

MyKpopLists is a full-stack social networking platform designed specifically for the K-pop community. It serves as a comprehensive hub where fans can discover music, track their favorite artists, create curated lists, engage in discussions, and connect with fellow enthusiasts. The platform handles complex relationships between users, artists, albums, songs, and variety shows while maintaining robust privacy controls and real-time social interactions.

The Purpose: Solving Real Community Needs

The K-pop fandom is one of the most engaged and passionate communities online, yet fans often struggle with fragmented experiences across multiple platforms. Tracking comebacks, discovering new releases, maintaining bias lists, and connecting with like-minded fans requires juggling Reddit, Twitter, Spotify, and various fan wikis.

MyKpopLists addresses this fragmentation by providing a centralized platform where fans can:

  • Track debut anniversaries, birthdays, and release dates in one place
  • Curate and share personalized lists (bias rankings, favorite songs, must-watch variety shows)
  • Engage with community-generated content through posts, reviews, and comments
  • Build meaningful connections through a privacy-aware friend system
  • Participate in community polls and voting competitions
  • Earn recognition through a gamified leaderboard system

The platform recognizes that K-pop fans don’t just consume content—they create, curate, and collaborate. This isn’t just another social network; it’s a specialized tool built for a community that demands both depth and flexibility.

The Solution: Core Features

Comprehensive Artist & Content Database The platform maintains a rich, interconnected database of K-pop groups, solo artists (idols), albums, songs, and variety shows. Users can follow their favorite artists, track member lineups with join/leave dates, explore discographies with Spotify integration, and discover content through intelligent tagging. The system handles complex relationships like group formations, solo debuts, and collaborative releases with ease.

Social Networking with Privacy Controls Users can build their social graph through a friend request system that respects privacy boundaries. The platform implements granular privacy settings allowing users to control visibility of their lists, reviews, posts, comments, activity feed, and friend list. Each user can customize what they share publicly versus what remains visible only to friends, ensuring comfort and control over their digital presence.

Automated Content Aggregation The platform features an intelligent Reddit integration that automatically fetches posts from r/kpop, uses Google Gemini AI to analyze and tag content with relevant artists and songs, and processes posts gradually throughout the day to respect API rate limits. This automation keeps the community feed fresh without requiring manual curation, while the AI tagging ensures content is discoverable and properly categorized.

Gamification & Community Engagement A sophisticated scoring system ranks users based on their contributions and engagement. The leaderboard tracks all-time leaders and monthly risers, with scores calculated from post likes, review votes, comment engagement, and content creation. Real-time score updates through Laravel observers ensure the leaderboard reflects current community dynamics, encouraging quality contributions and active participation.

Advanced Search & Discovery Users can search across all content types with intelligent filtering by artist, content type, date ranges, and engagement metrics. The search system implements caching strategies to maintain performance at scale, with separate cache TTLs for different content types based on update frequency.

Tech Stack & Architecture

The Stack

Backend Foundation

  • Laravel 12 with PHP 8.3 for robust server-side logic
  • PostgreSQL for production data persistence with complex relational queries
  • Redis for high-performance caching and session management
  • Laravel Sanctum for API authentication
  • Laravel Fortify for user authentication with 2FA support

Frontend Experience

  • Vue.js 3 with Composition API for reactive, component-based UI
  • Inertia.js 2 for seamless SPA experience without API complexity
  • TypeScript for type safety across the frontend codebase
  • Tailwind CSS 4 for utility-first styling
  • Reka UI component library for accessible, reusable components

Infrastructure & DevOps

  • Docker multi-stage builds for optimized production images
  • Nginx as reverse proxy and static file server
  • Supervisor for process management (queue workers, SSR server)
  • Laravel Reverb for WebSocket connections and real-time features
  • Server-side rendering (SSR) for improved SEO and initial load performance

External Integrations

  • Google Gemini AI for intelligent content tagging
  • Reddit API for automated content aggregation
  • Spotify API for music metadata enrichment
  • Google OAuth for social authentication
  • AWS S3 for scalable file storage (production)

The Decision Matrix

Why Inertia.js Over Traditional REST APIs? For a social platform with complex, nested data requirements, Inertia.js eliminates the impedance mismatch between backend and frontend. Traditional REST APIs require maintaining separate endpoint contracts, handling serialization/deserialization, and managing state synchronization. Inertia allows the backend to directly pass Eloquent models and collections to Vue components, reducing boilerplate by approximately 40% while maintaining the benefits of a modern SPA. The server-side routing also simplifies authorization—policies are enforced at the controller level before data ever reaches the client.

Why PostgreSQL Over MySQL? The platform’s data model involves extensive many-to-many relationships (users-groups, posts-tags, group-idol memberships) and polymorphic associations (comments on posts/reviews, likes on multiple content types). PostgreSQL’s superior handling of complex joins, JSON column support for flexible metadata storage, and robust indexing capabilities make it ideal for this use case. The activity feed query, for instance, requires joining across six tables with privacy filters—PostgreSQL’s query planner handles this efficiently where MySQL would struggle.

Why Redis for Caching? Social platforms face unique caching challenges: user profiles must reflect real-time friendship status, activity feeds need sub-second freshness, but static content (artist bios, album details) can be cached longer. Redis provides the flexibility to implement tiered caching with different TTLs per content type. The SocialCacheService implements pattern-based cache invalidation using Redis SCAN, allowing surgical cache updates when friendships change without flushing unrelated data. This granular control would be impossible with file-based or database caching.

Technical Challenges

Privacy-Aware Activity Aggregation

One of the most complex aspects of the platform is the friends’ activity feed feature. The challenge lies in aggregating activities from multiple users while respecting each user’s individual privacy settings in real-time.

The system must answer questions like: “Show me what my friends have been doing, but only if they’ve made their activity public, and only show content types they’ve chosen to share, and filter out activities on content I don’t have permission to see.”

The solution implements a multi-layered filtering approach. First, the query identifies all accepted friendships bidirectionally (where the user is either requester or addressee). Then, it applies privacy filters at the database level by joining through the privacy settings table to exclude users who haven’t opted into activity sharing. Finally, it applies content-type-specific filters based on what each friend has chosen to make visible.

The complexity multiplies when considering polymorphic relationships—a “like” activity could reference a post, comment, review, song, or album. The activity transformation layer must intelligently resolve these relationships, loading the appropriate related models, and presenting them consistently to the frontend regardless of the underlying type.

Performance optimization required implementing strategic eager loading to avoid N+1 queries, using Redis caching for frequently accessed privacy settings, and creating composite database indexes on user_id, activity_type, and created_at columns. The result is a feed that loads in under 200ms even with hundreds of friends and thousands of activities.

AI-Powered Content Tagging at Scale

The Reddit integration presents a fascinating technical challenge: automatically categorizing user-generated content from an external source without human intervention. A single r/kpop post might mention multiple groups, reference specific songs, and discuss variety show appearances—all requiring accurate tagging for discoverability.

The system uses Google Gemini AI as an intelligent intermediary. When processing a Reddit post, the service constructs a prompt containing the post title, content, and flair, along with a curated list of all groups, idols, songs, and variety shows currently in the database. Gemini analyzes the content and returns structured JSON identifying relevant entities.

The challenge lies in mapping Gemini’s natural language responses back to database IDs. The service implements fuzzy matching algorithms to handle variations in artist names (stage names vs. birth names, romanization differences, group name abbreviations). It also implements confidence thresholds—only creating tags when Gemini expresses high certainty to avoid false positives.

Rate limiting adds another layer of complexity. Reddit’s API allows 60 requests per minute, while Gemini has daily quotas. The solution uses Laravel’s job queue system to spread processing across 12 hours, with exponential backoff on failures. Each job is idempotent (checking for existing reddit_id before creating posts) and includes retry logic with jitter to handle transient API failures gracefully.

Real-Time Score Calculation with Observer Pattern

The leaderboard system must maintain accurate user scores based on dozens of different engagement signals—post likes, review votes, comment reactions, content creation—all updating in real-time as users interact with the platform.

A naive approach would recalculate scores on every page load, but this would create unacceptable database load. The solution implements a hybrid approach using Laravel’s observer pattern combined with scheduled batch processing.

Observers listen for model events (like creation, vote changes) and trigger incremental score updates. When a post receives a like, the PostLikeObserver immediately updates the author’s score by adding the appropriate points. This ensures the leaderboard reflects recent activity without delay.

However, observers can’t catch everything—deleted content, cascading relationship changes, and data inconsistencies require periodic reconciliation. A scheduled command runs nightly to recalculate all scores from scratch, identifying and correcting any drift. The command uses chunked queries to process users in batches, preventing memory exhaustion on large datasets.

The scoring algorithm itself balances multiple factors with different weights: high-value actions (review upvotes) contribute more than low-value actions (comment creation), while negative signals (review downvotes) subtract points. The monthly increase calculation compares current scores against a snapshot from 30 days ago, requiring careful handling of new users and deleted accounts.

Lessons Learned

Privacy is a Feature, Not an Afterthought Building privacy controls into the foundation of the application architecture proved far easier than retrofitting them later. By establishing the PrivacyService early and consistently routing all content access through it, the platform maintains consistent privacy enforcement across dozens of controllers and API endpoints. The lesson: treat privacy as a cross-cutting concern from day one, not a feature to add later.

Caching Strategy Requires Domain Knowledge Generic caching advice (“cache everything” or “cache nothing”) fails in practice. The SocialCacheService implements seven different TTL tiers based on content volatility: profile data (5 minutes), activity feeds (1 minute), friend data (10 minutes), static content (1 hour). This granularity emerged from observing actual usage patterns and understanding which data changes frequently versus rarely. The lesson: effective caching requires deep understanding of your domain’s data access patterns.

AI Integration Demands Defensive Programming Working with AI APIs like Gemini requires assuming nothing about response format, handling partial failures gracefully, and implementing comprehensive fallback strategies. The tagging service includes JSON validation, fuzzy matching for entity resolution, confidence thresholds, and manual override capabilities. The lesson: AI is a powerful tool but requires robust error handling and human oversight mechanisms.

Future Directions

Real-Time Collaboration Features The platform’s current architecture supports WebSocket connections through Laravel Reverb, but these capabilities remain underutilized. Future development could implement live collaborative list editing (multiple users curating a “Best B-Sides of 2024” list simultaneously), real-time comment threads with typing indicators, and instant notifications for friend activity. The infrastructure exists; it’s a matter of building the UI components and synchronization logic.

Advanced Recommendation Engine The platform collects rich behavioral data—what users follow, like, review, and list—but doesn’t yet leverage this for personalized recommendations. A recommendation system could suggest new artists based on similar users’ preferences, surface trending content within a user’s interest graph, and predict which upcoming releases a user might enjoy. This would require implementing collaborative filtering algorithms and potentially integrating machine learning models.

Mobile-First Progressive Web App While the current responsive design works on mobile devices, the experience isn’t optimized for mobile-first usage patterns. Converting to a PWA with offline support, push notifications, and app-like navigation would significantly improve mobile engagement. The Inertia.js architecture supports this transition, but it requires rethinking UI patterns for touch interfaces and implementing service workers for offline functionality.

Content Moderation Tools As the community grows, manual moderation becomes unsustainable. Future development should include automated content flagging using AI, community-driven reporting systems with reputation-based moderation privileges, and admin dashboards for reviewing flagged content. The ban system exists but needs expansion to handle temporary suspensions, content-specific restrictions, and appeal processes.

Analytics and Insights Dashboard Users would benefit from personal analytics showing their engagement trends, most-listened artists, review patterns, and social graph growth. Admins need platform-wide analytics for monitoring community health, identifying trending topics, and understanding user retention. The ActivityTrackingService already collects this data; it needs visualization and aggregation layers.

Try It Out

Check out the live demo.

We respect your privacy.

← View All Projects

Related Tutorials

    Ask me anything!