Index: frontend/src/components/Sidebar.tsx
===================================================================
--- frontend/src/components/Sidebar.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/components/Sidebar.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -5,23 +5,5 @@
 import { usePlayer } from "../context/playerContext";
 import type { BasicPlaylist, BasicSong, SidebarProps } from "../utils/types";
-
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
-		}
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		return url;
-	} catch {
-		return url;
-	}
-};
+import { toEmbedUrl } from "../utils/utils";
 
 const Sidebar = ({ isOpen, onClose }: SidebarProps) => {
Index: frontend/src/components/SongItem.tsx
===================================================================
--- frontend/src/components/SongItem.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
+++ frontend/src/components/SongItem.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -0,0 +1,259 @@
+import { useEffect, useRef, useState } from "react";
+import { useNavigate } from "react-router-dom";
+import { usePlayer } from "../context/playerContext";
+import { toEmbedUrl } from "../utils/utils";
+
+export interface SongItemData {
+	id: number;
+	title: string;
+	cover?: string | null;
+	genre?: string;
+	link?: string | null;
+	releasedBy?: string;
+	isLikedByCurrentUser?: boolean;
+}
+
+interface SongItemProps {
+	song: SongItemData;
+	/** Optional label shown before the artist, e.g. "Song" for search results */
+	label?: string;
+	/** Optional role badge for artist contributions, e.g. "PERFORMER" */
+	role?: string;
+	/** Optional index number for playlist/collection views */
+	index?: number;
+	/** Callback when the like button is clicked */
+	onLikeToggle?: (songId: number) => void;
+}
+
+const ROLE_COLORS: { [key: string]: string } = {
+	COMPOSER: "bg-purple-500/20 text-purple-300",
+	PERFORMER: "bg-blue-500/20 text-blue-300",
+	PRODUCER: "bg-green-500/20 text-green-300",
+	MAIN_VOCAL: "bg-pink-500/20 text-pink-300",
+};
+
+const SongItem = ({
+	song,
+	label,
+	role,
+	index,
+	onLikeToggle,
+}: SongItemProps) => {
+	const navigate = useNavigate();
+	const { play, currentSong } = usePlayer();
+	const [playlistOpen, setPlaylistOpen] = useState(false);
+	const dropdownRef = useRef<HTMLDivElement>(null);
+
+	const isPlaying = currentSong?.id === song.id;
+
+	useEffect(() => {
+		const handleClickOutside = (event: MouseEvent) => {
+			if (
+				dropdownRef.current &&
+				!dropdownRef.current.contains(event.target as Node)
+			) {
+				setPlaylistOpen(false);
+			}
+		};
+		if (playlistOpen) {
+			document.addEventListener("mousedown", handleClickOutside);
+		}
+		return () => document.removeEventListener("mousedown", handleClickOutside);
+	}, [playlistOpen]);
+
+	const handleAddToPlaylist = (playlistName: string) => {
+		console.log(`Adding song ${song.id} to ${playlistName}`);
+		// TODO: Implement actual API call
+		setPlaylistOpen(false);
+	};
+
+	const handleCreateNewPlaylist = () => {
+		console.log(`Creating new playlist for song ${song.id}`);
+		// TODO: Implement actual playlist creation
+		setPlaylistOpen(false);
+	};
+
+	// Build subtitle
+	const subtitleParts: string[] = [];
+	if (label) subtitleParts.push(label);
+	if (song.releasedBy) subtitleParts.push(song.releasedBy);
+	const subtitle = subtitleParts.join(" • ");
+
+	return (
+		<div
+			onClick={() => navigate(`/songs/${song.id}`)}
+			className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
+		>
+			{/* Optional index */}
+			{index != null && (
+				<span className="text-gray-500 font-medium w-8 text-center text-sm shrink-0">
+					{index}
+				</span>
+			)}
+
+			{/* Cover */}
+			<img
+				src={song.cover || "/favicon.png"}
+				alt={song.title}
+				className="w-12 h-12 rounded object-cover shrink-0"
+				onError={(e) => {
+					(e.target as HTMLImageElement).src = "/favicon.png";
+				}}
+			/>
+
+			{/* Title & subtitle */}
+			<div className="flex-1 min-w-0">
+				<p
+					className={`font-medium truncate ${
+						isPlaying ? "text-[#1db954]" : "text-white"
+					}`}
+				>
+					{song.title}
+				</p>
+				{subtitle && (
+					<p className="text-sm text-gray-400 truncate">{subtitle}</p>
+				)}
+			</div>
+
+			{/* Role badge (artist contributions) */}
+			{role && (
+				<span
+					className={`px-3 py-1 rounded-full text-xs font-medium hidden sm:block ${
+						ROLE_COLORS[role] || "bg-white/10 text-gray-300"
+					}`}
+				>
+					{role.replace("_", " ")}
+				</span>
+			)}
+
+			{/* Genre */}
+			{song.genre && (
+				<span className="text-xs text-gray-500 uppercase tracking-wider mr-2 hidden sm:block">
+					{song.genre}
+				</span>
+			)}
+
+			{/* Play button */}
+			{song.link && (
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						play({
+							id: song.id,
+							title: song.title,
+							artist: song.releasedBy || "",
+							cover: song.cover,
+							embedUrl: toEmbedUrl(song.link!),
+						});
+					}}
+					className={`p-2 rounded-full transition-all cursor-pointer ${
+						isPlaying
+							? "bg-white text-[#1db954] opacity-100"
+							: "bg-[#1db954] text-black hover:scale-110 opacity-0 group-hover:opacity-100"
+					}`}
+					aria-label={isPlaying ? "Now playing" : "Play song"}
+				>
+					{isPlaying ? (
+						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+							<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" />
+						</svg>
+					) : (
+						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+							<path d="M8 5v14l11-7z" />
+						</svg>
+					)}
+				</button>
+			)}
+
+			{/* Like button */}
+			{onLikeToggle && (
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						onLikeToggle(song.id);
+					}}
+					className="p-2 hover:bg-white/10 rounded-full transition-colors cursor-pointer"
+					aria-label={song.isLikedByCurrentUser ? "Unlike" : "Like"}
+				>
+					<svg
+						className="w-5 h-5"
+						fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
+						stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
+						strokeWidth="2"
+						viewBox="0 0 24 24"
+					>
+						<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+					</svg>
+				</button>
+			)}
+
+			{/* Three-dot menu */}
+			<div className="relative" ref={dropdownRef}>
+				<button
+					onClick={(e) => {
+						e.stopPropagation();
+						setPlaylistOpen((prev) => !prev);
+					}}
+					className="p-2 hover:bg-white/10 rounded-full transition-colors cursor-pointer text-gray-400 hover:text-white"
+					aria-label="More options"
+				>
+					<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
+						<circle cx="12" cy="5" r="1.5" />
+						<circle cx="12" cy="12" r="1.5" />
+						<circle cx="12" cy="19" r="1.5" />
+					</svg>
+				</button>
+
+				{playlistOpen && (
+					<div className="absolute right-0 bottom-full mb-2 w-48 bg-[#282828] border border-white/10 rounded-lg shadow-lg py-1 z-50">
+						<div className="px-3 py-2 text-xs text-gray-400 border-b border-white/10">
+							Add to playlist
+						</div>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleAddToPlaylist("Playlist 1");
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-white hover:bg-white/10 transition-colors"
+						>
+							Playlist 1
+						</button>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleAddToPlaylist("Playlist 2");
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-white hover:bg-white/10 transition-colors"
+						>
+							Playlist 2
+						</button>
+						<button
+							onClick={(e) => {
+								e.stopPropagation();
+								handleCreateNewPlaylist();
+							}}
+							className="w-full text-left px-4 py-2 text-sm text-[#1db954] hover:bg-white/10 transition-colors border-t border-white/10 flex items-center gap-2"
+						>
+							<svg
+								className="w-4 h-4"
+								fill="none"
+								stroke="currentColor"
+								viewBox="0 0 24 24"
+							>
+								<path
+									strokeLinecap="round"
+									strokeLinejoin="round"
+									strokeWidth={2}
+									d="M12 4v16m8-8H4"
+								/>
+							</svg>
+							Create new playlist
+						</button>
+					</div>
+				)}
+			</div>
+		</div>
+	);
+};
+
+export default SongItem;
Index: frontend/src/components/search/SongResult.tsx
===================================================================
--- frontend/src/components/search/SongResult.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/components/search/SongResult.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,87 +1,25 @@
-import { useNavigate } from "react-router-dom";
-import { usePlayer } from "../../context/playerContext";
+import axiosInstance from "../../api/axiosInstance";
 import type { Song } from "../../utils/types";
+import SongItem from "../SongItem";
 
 interface SongResultProps {
 	song: Song;
+	/** Propagate like state change upward if needed */
+	onLikeToggled?: (songId: number, isLiked: boolean) => void;
 }
 
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
+const SongResult = ({ song, onLikeToggled }: SongResultProps) => {
+	const handleLike = async (songId: number) => {
+		try {
+			const response = await axiosInstance.post(
+				`/musical-entity/${songId}/like`,
+			);
+			onLikeToggled?.(songId, response.data.isLiked);
+		} catch (err) {
+			console.error("Error toggling like:", err);
 		}
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		return url;
-	} catch {
-		return url;
-	}
-};
+	};
 
-const SongResult = ({ song }: SongResultProps) => {
-	const navigate = useNavigate();
-	const { play, currentSong } = usePlayer();
-
-	return (
-		<div
-			onClick={() => navigate(`/songs/${song.id}`)}
-			className="flex items-center gap-4 p-3 rounded-lg hover:bg-white/5 cursor-pointer transition-colors group"
-		>
-			<img
-				src={song.cover || "/favicon.png"}
-				alt={song.title}
-				className="w-12 h-12 rounded object-cover"
-				onError={(e) => {
-					(e.target as HTMLImageElement).src = "/favicon.png";
-				}}
-			/>
-			<div className="flex-1 min-w-0">
-				<p className="text-white font-medium truncate">{song.title}</p>
-				<p className="text-sm text-gray-400 truncate">
-					Song • {song.releasedBy}
-				</p>
-			</div>
-			<span className="text-xs text-gray-500 uppercase tracking-wider mr-2">
-				{song.genre}
-			</span>
-			{song.link && (
-				<button
-					onClick={(e) => {
-						e.stopPropagation();
-						play({
-							id: song.id,
-							title: song.title,
-							artist: song.releasedBy,
-							cover: song.cover,
-							embedUrl: toEmbedUrl(song.link!),
-						});
-					}}
-					className={`p-2 rounded-full transition-all opacity-0 group-hover:opacity-100 ${
-						currentSong?.id === song.id
-							? "bg-white text-[#1db954]"
-							: "bg-[#1db954] text-black hover:scale-110"
-					}`}
-					aria-label={currentSong?.id === song.id ? "Now playing" : "Play song"}
-				>
-					{currentSong?.id === song.id ? (
-						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
-							<path d="M6 19h4V5H6v14zm8-14v14h4V5h-4z" />
-						</svg>
-					) : (
-						<svg className="w-5 h-5" fill="currentColor" viewBox="0 0 24 24">
-							<path d="M8 5v14l11-7z" />
-						</svg>
-					)}
-				</button>
-			)}
-		</div>
-	);
+	return <SongItem song={song} label="Song" onLikeToggle={handleLike} />;
 };
 
Index: frontend/src/components/userProfile/ArtistView.tsx
===================================================================
--- frontend/src/components/userProfile/ArtistView.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/components/userProfile/ArtistView.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,209 +1,149 @@
+import { Disc3, Music } from "lucide-react";
+import { useState } from "react";
 import { useNavigate } from "react-router-dom";
-import { useState } from "react";
-import { Music, Disc3, Play, Plus } from "lucide-react";
+import { toast } from "react-toastify";
+import axiosInstance from "../../api/axiosInstance";
 import type { ArtistContribution } from "../../utils/types";
-import axiosInstance from "../../api/axiosInstance";
+import SongItem from "../SongItem";
 
 interface ArtistViewProps {
-  contributions: ArtistContribution[];
+	contributions: ArtistContribution[];
 }
 
 const ArtistView = ({ contributions }: ArtistViewProps) => {
-  const navigate = useNavigate();
-  const [items, setItems] = useState(contributions);
-  const [toast, setToast] = useState<{ message: string; show: boolean }>({
-    message: "",
-    show: false,
-  });
+	const navigate = useNavigate();
+	const [items, setItems] = useState(contributions);
 
-  const albums = items.filter((c) => c.entityType === "ALBUM");
-  const songs = items.filter((c) => c.entityType === "SONG");
+	const albums = items.filter((c) => c.entityType === "ALBUM");
+	const songs = items.filter((c) => c.entityType === "SONG");
 
-  const getRoleColor = (role: string) => {
-    const colors: { [key: string]: string } = {
-      COMPOSER: "bg-purple-100 text-purple-700",
-      PERFORMER: "bg-blue-100 text-blue-700",
-      PRODUCER: "bg-green-100 text-green-700",
-      MAIN_VOCAL: "bg-pink-100 text-pink-700",
-    };
-    return colors[role] || "bg-gray-100 text-gray-700";
-  };
+	const getRoleColor = (role: string) => {
+		const colors: { [key: string]: string } = {
+			COMPOSER: "bg-purple-500/20 text-purple-300",
+			PERFORMER: "bg-blue-500/20 text-blue-300",
+			PRODUCER: "bg-green-500/20 text-green-300",
+			MAIN_VOCAL: "bg-pink-500/20 text-pink-300",
+		};
+		return colors[role] || "bg-white/10 text-gray-300";
+	};
 
-  const showToast = (message: string) => {
-    setToast({ message, show: true });
-    setTimeout(() => {
-      setToast({ message: "", show: false });
-    }, 2000);
-  };
+	const handleLike = async (id: number, title: string) => {
+		try {
+			const response = await axiosInstance.post(`/musical-entity/${id}/like`);
+			const data = response.data;
 
-  const handleLike = async (id: number, title: string) => {
-    try {
-      const response = await axiosInstance.post(`/musical-entity/${id}/like`);
-      const data = response.data;
+			setItems((prevItems) =>
+				prevItems.map((item) =>
+					item.id === data.entityId
+						? { ...item, isLikedByCurrentUser: data.isLiked }
+						: item,
+				),
+			);
+			toast.success(
+				data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to like the item");
+		}
+	};
 
-      setItems((prevItems) =>
-        prevItems.map((item) =>
-          item.id === data.entityId
-            ? { ...item, isLikedByCurrentUser: data.isLiked }
-            : item,
-        ),
-      );
+	return (
+		<div className="mt-8">
+			{albums.length > 0 && (
+				<div className="mb-12">
+					<div className="flex items-center gap-3 mb-6">
+						<Disc3 className="w-6 h-6 text-[#1db954]" />
+						<h2 className="text-2xl font-bold text-white">Albums</h2>
+					</div>
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{albums.map((album) => (
+							<div
+								key={album.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/album/${album.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg mb-3 overflow-hidden shadow-md group-hover:shadow-xl transition-all duration-300 bg-[#181818]">
+									<img
+										src={album.cover || "/favicon.png"}
+										alt={album.title}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
 
-      showToast(
-        data.isLiked ? `Liked "${title}"` : `Removed ${title} from likes`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error);
-    }
-  };
+									<button
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
+										title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
+										onClick={(e) => {
+											e.stopPropagation();
+											handleLike(album.id, album.title);
+										}}
+									>
+										<svg
+											className="w-5 h-5"
+											fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
+											stroke={
+												album.isLikedByCurrentUser ? "#ef4444" : "#9ca3af"
+											}
+											strokeWidth="2"
+											viewBox="0 0 24 24"
+										>
+											<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+										</svg>
+									</button>
 
-  return (
-    <div className="mt-8">
-      {toast.show && (
-        <div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-fade-in-up">
-          <div className="bg-gray-900 text-white px-6 py-3 rounded-full shadow-lg text-sm font-medium">
-            {toast.message}
-          </div>
-        </div>
-      )}
+									<div className="absolute bottom-0 left-0 right-0 bg-linear-to-t from-black/80 to-transparent p-3">
+										<span
+											className={`text-xs px-2 py-1 rounded-full font-medium ${getRoleColor(album.role)}`}
+										>
+											{album.role.replace("_", " ")}
+										</span>
+									</div>
+								</div>
+								<h3 className="font-semibold text-sm line-clamp-2 text-white group-hover:text-[#1db954] transition-colors">
+									{album.title}
+								</h3>
+							</div>
+						))}
+					</div>
+				</div>
+			)}
 
-      {albums.length > 0 && (
-        <div className="mb-12">
-          <div className="flex items-center gap-3 mb-6">
-            <Disc3 className="w-6 h-6 text-gray-700" />
-            <h2 className="text-2xl font-bold text-gray-800">Albums</h2>
-          </div>
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {albums.map((album) => (
-              <div
-                key={album.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/album/${album.id}`)}
-              >
-                <div className="relative aspect-square bg-gradient-to-br from-blue-400 to-purple-500 rounded-lg mb-3 overflow-hidden shadow-md group-hover:shadow-lg transition-all duration-300">
-                  <div className="absolute inset-0 flex items-center justify-center">
-                    <Disc3 className="w-16 h-16 text-white opacity-30" />
-                  </div>
+			{songs.length > 0 && (
+				<div className="mb-12">
+					<div className="flex items-center gap-3 mb-6">
+						<Music className="w-6 h-6 text-[#1db954]" />
+						<h2 className="text-2xl font-bold text-white">Songs</h2>
+					</div>
+					<div className="space-y-1">
+						{songs.map((song) => (
+							<SongItem
+								key={song.id}
+								song={{
+									id: song.id,
+									title: song.title,
+									cover: song.cover,
+									genre: song.genre,
+									link: song.link,
+									isLikedByCurrentUser: song.isLikedByCurrentUser,
+								}}
+								role={song.role}
+								onLikeToggle={() => handleLike(song.id, song.title)}
+							/>
+						))}
+					</div>
+				</div>
+			)}
 
-                  <button
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
-                    title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(album.id, album.title);
-                    }}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={
-                        album.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
-                      }
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-
-                  <div className="absolute bottom-0 left-0 right-0 bg-gradient-to-t from-black/60 to-transparent p-3">
-                    <span
-                      className={`text-xs px-2 py-1 rounded-full font-medium ${getRoleColor(album.role)}`}
-                    >
-                      {album.role.replace("_", " ")}
-                    </span>
-                  </div>
-                </div>
-                <h3 className="font-semibold text-sm line-clamp-2 text-gray-900 group-hover:text-blue-600 transition-colors">
-                  {album.title}
-                </h3>
-              </div>
-            ))}
-          </div>
-        </div>
-      )}
-
-      {songs.length > 0 && (
-        <div className="mb-12">
-          <div className="flex items-center gap-3 mb-6">
-            <Music className="w-6 h-6 text-gray-700" />
-            <h2 className="text-2xl font-bold text-gray-800">Songs</h2>
-          </div>
-          <div className="space-y-2">
-            {songs.map((song) => (
-              <div
-                key={song.id}
-                className="group relative flex items-center gap-4 p-3 rounded-lg hover:bg-gray-50 transition-all cursor-pointer"
-                onClick={() => navigate(`/musical-entity/${song.id}`)}
-              >
-                <div className="relative shrink-0">
-                  <div className="w-12 h-12 bg-gradient-to-br from-blue-400 to-purple-500 rounded flex items-center justify-center shadow-sm">
-                    <Music className="w-6 h-6 text-white" />
-                  </div>
-                  <button
-                    className="absolute inset-0 bg-black/60 rounded flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity duration-200"
-                    aria-label="Play song"
-                  >
-                    <Play className="w-6 h-6 text-white fill-white" />
-                  </button>
-                </div>
-
-                <div className="flex-1 min-w-0">
-                  <h3 className="font-semibold text-base text-gray-900 group-hover:text-blue-600 transition-colors truncate">
-                    {song.title}
-                  </h3>
-                  <div className="flex items-center gap-2 mt-1">
-                    <span className="text-sm text-gray-600">{song.genre}</span>
-                  </div>
-                </div>
-
-                <span
-                  className={`px-3 py-1 rounded-full text-sm font-medium ${getRoleColor(song.role)}`}
-                >
-                  {song.role.replace("_", " ")}
-                </span>
-
-                <div className="flex items-center gap-2">
-                  <button
-                    className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                    title="Add to playlist"
-                  >
-                    <Plus className="w-5 h-5 text-gray-600" />
-                  </button>
-
-                  <button
-                    className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                    title={song.isLikedByCurrentUser ? "Unlike" : "Like"}
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(song.id, song.title);
-                    }}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-                </div>
-              </div>
-            ))}
-          </div>
-        </div>
-      )}
-
-      {contributions.length === 0 && (
-        <div className="flex flex-col items-center justify-center py-16 text-gray-400">
-          <Music className="w-20 h-20 mb-4 opacity-20" />
-          <p className="text-lg font-medium">No contributions yet</p>
-          <p className="text-sm mt-2">Start creating music to see it here</p>
-        </div>
-      )}
-    </div>
-  );
+			{contributions.length === 0 && (
+				<div className="flex flex-col items-center justify-center py-16 text-gray-500">
+					<Music className="w-20 h-20 mb-4 opacity-20" />
+					<p className="text-lg font-medium">No contributions yet</p>
+					<p className="text-sm mt-2">Start creating music to see it here</p>
+				</div>
+			)}
+		</div>
+	);
 };
 
Index: frontend/src/components/userProfile/ListenerView.tsx
===================================================================
--- frontend/src/components/userProfile/ListenerView.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/components/userProfile/ListenerView.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,333 +1,285 @@
+import { Album, Bookmark, Heart, ListMusic, Music } from "lucide-react";
+import { useState } from "react";
 import { useNavigate } from "react-router-dom";
-import { Heart, ListMusic, Music, Album, Bookmark } from "lucide-react";
-import type { Playlist, MusicalEntity } from "../../utils/types";
+import { toast } from "react-toastify";
 import axiosInstance from "../../api/axiosInstance";
-import { useState } from "react";
+import type { MusicalEntity, Playlist } from "../../utils/types";
+import SongItem from "../SongItem";
 
 interface ListenerViewProps {
-  likedEntities: MusicalEntity[] | [];
-  createdPlaylists: Playlist[] | [];
-  savedPlaylists: Playlist[] | [];
+	likedEntities: MusicalEntity[] | [];
+	createdPlaylists: Playlist[] | [];
+	savedPlaylists: Playlist[] | [];
 }
 
 const ListenerView = ({
-  likedEntities,
-  createdPlaylists,
-  savedPlaylists,
+	likedEntities,
+	createdPlaylists,
+	savedPlaylists,
 }: ListenerViewProps) => {
-  const navigate = useNavigate();
-  const [items, setItems] = useState(likedEntities);
-  const [savedItems, setSavedItems] = useState(savedPlaylists);
-  const [toast, setToast] = useState<{ message: string; show: boolean }>({
-    message: "",
-    show: false,
-  });
-
-  const showToast = (message: string) => {
-    setToast({ message, show: true });
-    setTimeout(() => {
-      setToast({ message: "", show: false });
-    }, 2000);
-  };
-
-  const likedSongs = items.filter((e) => e.type === "SONG");
-  const likedAlbums = items.filter((e) => e.type === "ALBUM");
-
-  const handleSavePlaylist = async (
-    e: React.MouseEvent,
-    playlistId: number,
-    playlistName: string,
-  ) => {
-    e.stopPropagation();
-
-    try {
-      const response = await axiosInstance.post(`/playlist/${playlistId}/save`);
-      const data = response.data;
-
-      setSavedItems((prevItems) =>
-        data.isSaved
-          ? [...prevItems, prevItems.find((p) => p.id === playlistId)!]
-          : prevItems.filter((p) => p.id !== playlistId),
-      );
-
-      showToast(
-        data.isSaved
-          ? `Saved "${playlistName}"`
-          : `Removed "${playlistName}" from saved playlists`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error || "Failed to save playlist");
-    }
-  };
-
-  const handleLike = async (id: number, title: string) => {
-    try {
-      const response = await axiosInstance.post(`/musical-entity/${id}/like`);
-      const data = response.data;
-
-      setItems((prevItems) =>
-        prevItems.map((item) =>
-          item.id === data.entityId
-            ? { ...item, isLikedByCurrentUser: data.isLiked }
-            : item,
-        ),
-      );
-
-      showToast(
-        data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
-      );
-    } catch (err: any) {
-      showToast(err.response?.data?.error);
-    }
-  };
-
-  return (
-    <div className="mt-8 space-y-12">
-      {toast.show && (
-        <div className="fixed bottom-8 left-1/2 -translate-x-1/2 z-50 animate-fade-in-up">
-          <div className="bg-gray-900 text-white px-6 py-3 rounded-full shadow-lg text-sm font-medium">
-            {toast.message}
-          </div>
-        </div>
-      )}
-
-      {createdPlaylists && createdPlaylists.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <ListMusic className="w-6 h-6 text-gray-700" />
-            <h3 className="text-2xl font-bold text-gray-800">
-              Created Playlists
-            </h3>
-            <span className="text-sm text-gray-500">
-              ({createdPlaylists.length})
-            </span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {createdPlaylists.map((playlist) => (
-              <div
-                key={playlist.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gray-100 mb-3 shadow-md group-hover:shadow-lg transition-all">
-                  {playlist.cover ? (
-                    <img
-                      src={playlist.cover}
-                      alt={playlist.name}
-                      className="w-full h-full object-cover"
-                    />
-                  ) : (
-                    <div className="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
-                      <ListMusic className="w-16 h-16 text-white opacity-30" />
-                    </div>
-                  )}
-
-                  <button
-                    onClick={(e) =>
-                      handleSavePlaylist(e, playlist.id, playlist.name)
-                    }
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
-                    title={playlist.isSavedByCurrentUser ? "Unsave" : "Save"}
-                  >
-                    <Bookmark
-                      className={`w-5 h-5 ${
-                        playlist.isSavedByCurrentUser
-                          ? "fill-blue-600 text-blue-600"
-                          : "text-gray-600"
-                      }`}
-                    />
-                  </button>
-                </div>
-                <p className="text-sm font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {playlist.name}
-                </p>
-                <p className="text-xs text-gray-500 truncate">
-                  {playlist.creatorName}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {savedItems && savedItems.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Bookmark className="w-6 h-6 text-blue-600 fill-blue-600" />
-            <h3 className="text-2xl font-bold text-gray-800">
-              Saved Playlists
-            </h3>
-            <span className="text-sm text-gray-500">({savedItems.length})</span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {savedItems.map((playlist) => (
-              <div
-                key={playlist.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gray-100 mb-3 shadow-md group-hover:shadow-lg transition-all">
-                  {playlist.cover ? (
-                    <img
-                      src={playlist.cover}
-                      alt={playlist.name}
-                      className="w-full h-full object-cover"
-                    />
-                  ) : (
-                    <div className="w-full h-full bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center">
-                      <ListMusic className="w-16 h-16 text-white opacity-30" />
-                    </div>
-                  )}
-
-                  <button
-                    onClick={(e) =>
-                      handleSavePlaylist(e, playlist.id, playlist.name)
-                    }
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
-                    title="Unsave"
-                  >
-                    <Bookmark className="w-5 h-5 fill-blue-600 text-blue-600" />
-                  </button>
-                </div>
-                <p className="text-sm font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {playlist.name}
-                </p>
-                <p className="text-xs text-gray-500 truncate">
-                  {playlist.creatorName}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedSongs && likedSongs.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Heart className="w-6 h-6 text-red-500 fill-red-500" />
-            <h3 className="text-2xl font-bold text-gray-800">Liked Songs</h3>
-            <span className="text-sm text-gray-500">
-              ({likedSongs?.length})
-            </span>
-          </div>
-
-          <div className="space-y-2">
-            {likedSongs.map((song, index) => (
-              <div
-                key={song.id}
-                className="flex items-center gap-4 p-3 rounded-lg hover:bg-gray-50 cursor-pointer group transition-colors"
-                onClick={() => navigate(`/musical-entity/${song.id}`)}
-              >
-                <span className="text-gray-500 font-medium w-8 text-center">
-                  {index + 1}
-                </span>
-                <div className="w-12 h-12 rounded bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center flex-shrink-0 shadow-sm">
-                  <Music className="w-6 h-6 text-white" />
-                </div>
-                <div className="flex-1 min-w-0">
-                  <p className="font-semibold text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                    {song.title}
-                  </p>
-                  <p className="text-sm text-gray-600 truncate">
-                    {song.releasedBy}
-                  </p>
-                </div>
-                <span className="text-sm text-gray-600 px-3 py-1 bg-gray-100 rounded-full">
-                  {song.genre}
-                </span>
-
-                <button
-                  onClick={(e) => {
-                    e.stopPropagation();
-                    handleLike(song.id, song.title);
-                  }}
-                  className="p-2 hover:bg-gray-200 rounded-full transition-colors duration-200 cursor-pointer"
-                  title={song.isLikedByCurrentUser ? "Unlike" : "Like"}
-                >
-                  <svg
-                    className="w-5 h-5"
-                    fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
-                    stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                    strokeWidth="2"
-                    viewBox="0 0 24 24"
-                  >
-                    <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                  </svg>
-                </button>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedAlbums && likedAlbums.length > 0 && (
-        <section>
-          <div className="flex items-center gap-3 mb-6">
-            <Album className="w-6 h-6 text-gray-700" />
-            <h3 className="text-2xl font-bold text-gray-800">Liked Albums</h3>
-            <span className="text-sm text-gray-500">
-              ({likedAlbums.length})
-            </span>
-          </div>
-
-          <div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
-            {likedAlbums.map((album) => (
-              <div
-                key={album.id}
-                className="group cursor-pointer"
-                onClick={() => navigate(`/collection/album/${album.id}`)}
-              >
-                <div className="relative aspect-square rounded-lg overflow-hidden bg-gradient-to-br from-blue-400 to-purple-500 mb-3 flex items-center justify-center shadow-md group-hover:shadow-lg transition-all">
-                  <Album className="w-16 h-16 text-white opacity-30" />
-
-                  <button
-                    onClick={(e) => {
-                      e.stopPropagation();
-                      handleLike(album.id, album.title);
-                    }}
-                    className="absolute top-2 right-2 p-2 bg-white/90 hover:bg-white rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
-                    title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={
-                        album.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
-                      }
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-                </div>
-                <p className="font-semibold text-sm text-gray-900 truncate group-hover:text-blue-600 transition-colors">
-                  {album.title}
-                </p>
-                <p className="text-xs text-gray-600 truncate mt-1">
-                  {album.releasedBy}
-                </p>
-              </div>
-            ))}
-          </div>
-        </section>
-      )}
-
-      {likedEntities &&
-        likedEntities.length === 0 &&
-        (!createdPlaylists || createdPlaylists.length === 0) &&
-        (!savedItems || savedItems.length === 0) && (
-          <div className="flex flex-col items-center justify-center py-16 text-gray-400">
-            <Music className="w-20 h-20 mb-4 opacity-20" />
-            <p className="text-lg font-medium">Nothing here yet</p>
-            <p className="text-sm mt-2">
-              Start exploring music to build your collection
-            </p>
-          </div>
-        )}
-    </div>
-  );
+	const navigate = useNavigate();
+	const [items, setItems] = useState(likedEntities);
+	const [savedItems, setSavedItems] = useState(savedPlaylists);
+
+	const likedSongs = items.filter((e) => e.type === "SONG");
+	const likedAlbums = items.filter((e) => e.type === "ALBUM");
+
+	const handleSavePlaylist = async (
+		e: React.MouseEvent,
+		playlistId: number,
+		playlistName: string,
+	) => {
+		e.stopPropagation();
+
+		try {
+			const response = await axiosInstance.post(`/playlist/${playlistId}/save`);
+			const data = response.data;
+
+			setSavedItems((prevItems) =>
+				data.isSaved
+					? [...prevItems, prevItems.find((p) => p.id === playlistId)!]
+					: prevItems.filter((p) => p.id !== playlistId),
+			);
+
+			toast.success(
+				data.isSaved
+					? `Saved "${playlistName}" to your library`
+					: `Removed "${playlistName}" from your library`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to save the playlist");
+		}
+	};
+
+	const handleLike = async (id: number, title: string) => {
+		try {
+			const response = await axiosInstance.post(`/musical-entity/${id}/like`);
+			const data = response.data;
+
+			setItems((prevItems) =>
+				prevItems.map((item) =>
+					item.id === data.entityId
+						? { ...item, isLikedByCurrentUser: data.isLiked }
+						: item,
+				),
+			);
+
+			toast.success(
+				data.isLiked ? `Liked "${title}"` : `Removed "${title}" from likes`,
+			);
+		} catch (err: any) {
+			toast.error(err.response?.data?.error || "Failed to like the item");
+		}
+	};
+
+	return (
+		<div className="mt-8 space-y-12">
+			{createdPlaylists && createdPlaylists.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<ListMusic className="w-6 h-6 text-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Created Playlists</h3>
+						<span className="text-sm text-gray-500">
+							({createdPlaylists.length})
+						</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{createdPlaylists.map((playlist) => (
+							<div
+								key={playlist.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={playlist.cover || "/favicon.png"}
+										alt={playlist.name}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) =>
+											handleSavePlaylist(e, playlist.id, playlist.name)
+										}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
+										title={playlist.isSavedByCurrentUser ? "Unsave" : "Save"}
+									>
+										<Bookmark
+											className={`w-5 h-5 ${
+												playlist.isSavedByCurrentUser
+													? "fill-[#1db954] text-[#1db954]"
+													: "text-gray-400"
+											}`}
+										/>
+									</button>
+								</div>
+								<p className="text-sm font-semibold text-white truncate group-hover:text-[#1db954] transition-colors">
+									{playlist.name}
+								</p>
+								<p className="text-xs text-gray-400 truncate">
+									{playlist.creatorName}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{savedItems && savedItems.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Bookmark className="w-6 h-6 text-[#1db954] fill-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Saved Playlists</h3>
+						<span className="text-sm text-gray-500">({savedItems.length})</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{savedItems.map((playlist) => (
+							<div
+								key={playlist.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/playlist/${playlist.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={playlist.cover || "/favicon.png"}
+										alt={playlist.name}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) =>
+											handleSavePlaylist(e, playlist.id, playlist.name)
+										}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100"
+										title="Unsave"
+									>
+										<Bookmark className="w-5 h-5 fill-[#1db954] text-[#1db954]" />
+									</button>
+								</div>
+								<p className="text-sm font-semibold text-white truncate group-hover:text-[#1db954] transition-colors">
+									{playlist.name}
+								</p>
+								<p className="text-xs text-gray-400 truncate">
+									{playlist.creatorName}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedSongs && likedSongs.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Heart className="w-6 h-6 text-red-500 fill-red-500" />
+						<h3 className="text-2xl font-bold text-white">Liked Songs</h3>
+						<span className="text-sm text-gray-500">
+							({likedSongs?.length})
+						</span>
+					</div>
+
+					<div className="space-y-1">
+						{likedSongs.map((song, index) => (
+							<SongItem
+								key={song.id}
+								song={{
+									id: song.id,
+									title: song.title,
+									cover: song.cover,
+									genre: song.genre,
+									link: (song as any).link,
+									releasedBy: song.releasedBy,
+									isLikedByCurrentUser: song.isLikedByCurrentUser,
+								}}
+								index={index + 1}
+								onLikeToggle={() => handleLike(song.id, song.title)}
+							/>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedAlbums && likedAlbums.length > 0 && (
+				<section>
+					<div className="flex items-center gap-3 mb-6">
+						<Album className="w-6 h-6 text-[#1db954]" />
+						<h3 className="text-2xl font-bold text-white">Liked Albums</h3>
+						<span className="text-sm text-gray-500">
+							({likedAlbums.length})
+						</span>
+					</div>
+
+					<div className="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-6">
+						{likedAlbums.map((album) => (
+							<div
+								key={album.id}
+								className="group cursor-pointer"
+								onClick={() => navigate(`/collection/album/${album.id}`)}
+							>
+								<div className="relative aspect-square rounded-lg overflow-hidden bg-[#181818] mb-3 shadow-md group-hover:shadow-xl transition-all">
+									<img
+										src={album.cover || "/favicon.png"}
+										alt={album.title}
+										className="w-full h-full object-cover"
+										onError={(e) => {
+											(e.target as HTMLImageElement).src = "/favicon.png";
+										}}
+									/>
+
+									<button
+										onClick={(e) => {
+											e.stopPropagation();
+											handleLike(album.id, album.title);
+										}}
+										className="absolute top-2 right-2 p-2 bg-black/70 hover:bg-black/90 rounded-full shadow-md transition-all duration-200 opacity-0 group-hover:opacity-100 cursor-pointer"
+										title={album.isLikedByCurrentUser ? "Unlike" : "Like"}
+									>
+										<svg
+											className="w-5 h-5"
+											fill={album.isLikedByCurrentUser ? "#ef4444" : "none"}
+											stroke={
+												album.isLikedByCurrentUser ? "#ef4444" : "#9ca3af"
+											}
+											strokeWidth="2"
+											viewBox="0 0 24 24"
+										>
+											<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+										</svg>
+									</button>
+								</div>
+								<p className="font-semibold text-sm text-white truncate group-hover:text-[#1db954] transition-colors">
+									{album.title}
+								</p>
+								<p className="text-xs text-gray-400 truncate mt-1">
+									{album.releasedBy}
+								</p>
+							</div>
+						))}
+					</div>
+				</section>
+			)}
+
+			{likedEntities &&
+				likedEntities.length === 0 &&
+				(!createdPlaylists || createdPlaylists.length === 0) &&
+				(!savedItems || savedItems.length === 0) && (
+					<div className="flex flex-col items-center justify-center py-16 text-gray-500">
+						<Music className="w-20 h-20 mb-4 opacity-20" />
+						<p className="text-lg font-medium">Nothing here yet</p>
+						<p className="text-sm mt-2">
+							Start exploring music to build your collection
+						</p>
+					</div>
+				)}
+		</div>
+	);
 };
 
Index: frontend/src/components/userProfile/UserListModal.tsx
===================================================================
--- frontend/src/components/userProfile/UserListModal.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/components/userProfile/UserListModal.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,3 +1,4 @@
 import { useNavigate } from "react-router-dom";
+import { baseURL } from "../../api/axiosInstance";
 import type { BaseNonAdminUser } from "../../utils/types";
 
@@ -16,14 +17,13 @@
 }: ModalProps) => {
 	const navigate = useNavigate();
-	const baseURL = import.meta.env.VITE_API_BASE_URL;
 
 	return (
-		<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/50 backdrop-blur-sm">
-			<div className="bg-white rounded-xl shadow-2xl w-full max-w-md max-h-[70vh] flex flex-col">
-				<div className="p-4 border-b flex justify-between items-center">
-					<h2 className="text-xl font-bold">{title}</h2>
+		<div className="fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm">
+			<div className="bg-[#1a1a2e] border border-white/10 rounded-xl shadow-2xl w-full max-w-md max-h-[70vh] flex flex-col">
+				<div className="p-4 border-b border-white/10 flex justify-between items-center">
+					<h2 className="text-xl font-bold text-white">{title}</h2>
 					<button
 						onClick={onClose}
-						className="text-gray-500 hover:text-black text-2xl cursor-pointer"
+						className="text-gray-400 hover:text-white text-2xl cursor-pointer transition-colors"
 					>
 						&times;
@@ -38,5 +38,5 @@
 							<div
 								key={u.username}
-								className="flex items-center justify-between p-3 hover:bg-gray-50 rounded-lg transition-colors"
+								className="flex items-center justify-between p-3 hover:bg-white/5 rounded-lg transition-colors"
 							>
 								<div
@@ -47,5 +47,5 @@
 									}}
 								>
-									<div className="w-10 h-10 rounded-full bg-blue-100 overflow-hidden shrink-0 flex items-center justify-center">
+									<div className="w-10 h-10 rounded-full bg-[#282828] overflow-hidden shrink-0 flex items-center justify-center">
 										{u.profilePhoto ? (
 											<img
@@ -55,21 +55,24 @@
 											/>
 										) : (
-											<span className="text-blue-600 font-bold">
+											<span className="text-[#1db954] font-bold">
 												{u.fullName.charAt(0)}
 											</span>
 										)}
 									</div>
-									<p className="font-semibold text-gray-900">{u.fullName}</p>
+									<div>
+										<p className="font-semibold text-white">{u.fullName}</p>
+										<p className="text-sm text-gray-400">@{u.username}</p>
+									</div>
 								</div>
 
 								<button
 									onClick={() => onFollowToggle(u.username)}
-									className={`px-4 py-1 text-sm font-medium rounded-md transition-colors cursor-pointer ${
+									className={`px-4 py-1.5 text-sm font-medium rounded-full transition-colors cursor-pointer ${
 										u.isFollowedByCurrentUser
-											? "bg-gray-200 text-gray-700 hover:bg-gray-300"
-											: "bg-blue-500 text-white hover:bg-blue-600"
+											? "bg-white/10 text-white hover:bg-white/20"
+											: "bg-[#1db954] text-black hover:bg-[#1ed760]"
 									}`}
 								>
-									{u.isFollowedByCurrentUser ? "Unfollow" : "Follow"}
+									{u.isFollowedByCurrentUser ? "Following" : "Follow"}
 								</button>
 							</div>
Index: frontend/src/pages/LandingPage.tsx
===================================================================
--- frontend/src/pages/LandingPage.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/pages/LandingPage.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -12,24 +12,5 @@
 	Song,
 } from "../utils/types";
-
-// Convert a regular YouTube URL to an embeddable URL
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
-		}
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		return url;
-	} catch {
-		return url;
-	}
-};
+import { toEmbedUrl } from "../utils/utils";
 
 const CATEGORIES: { value: SearchCategory; label: string }[] = [
Index: frontend/src/pages/MusicalCollection.tsx
===================================================================
--- frontend/src/pages/MusicalCollection.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/pages/MusicalCollection.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,206 +1,247 @@
 import { useEffect, useState } from "react";
-import { useNavigate, useParams } from "react-router-dom";
+import { Link, useParams } from "react-router-dom";
 import axiosInstance from "../api/axiosInstance";
-import LoadingSpinner from "../components/LoadingSpinner";
-import type { Song, Album, Playlist } from "../utils/types";
+import SongItem from "../components/SongItem";
 import { handleError } from "../utils/error";
+import type { Album, Playlist, Song } from "../utils/types";
 interface CollectionView {
-  id: number;
-  title: string;
-  genre?: string;
-  type: string;
-  releasedBy: string;
-  isLikedByCurrentUser?: boolean;
-  songs: Song[];
+	id: number;
+	title: string;
+	cover?: string | null;
+	genre?: string;
+	type: string;
+	releasedBy: string;
+	isLikedByCurrentUser?: boolean;
+	songs: Song[];
 }
 
 const MusicalCollection = () => {
-  const { type, id } = useParams();
-  const navigate = useNavigate();
-  const [collection, setCollection] = useState<CollectionView | null>(null);
-  const [isLoading, setIsLoading] = useState(true);
-  const [error, setError] = useState<string | null>(null);
-
-  const normalizeCollection = (
-    data: Album | Playlist,
-    type: string,
-  ): CollectionView => {
-    if (type === "album") {
-      const album = data as Album;
-      return {
-        id: album.id,
-        title: album.title,
-        genre: album.genre,
-        type: album.type,
-        releasedBy: album.releasedBy,
-        isLikedByCurrentUser: album.isLikedByCurrentUser,
-        songs: album.songs,
-      };
-    } else {
-      const playlist = data as Playlist;
-      return {
-        id: playlist.id,
-        title: playlist.name,
-        genre: undefined,
-        type: "PLAYLIST",
-        releasedBy: playlist.creatorName,
-        isLikedByCurrentUser: undefined,
-        songs: playlist.songsInPlaylist,
-      };
-    }
-  };
-
-  useEffect(() => {
-    const fetchData = async () => {
-      setIsLoading(true);
-      setError(null);
-      try {
-        const endpoint =
-          type === "album" ? `/albums/${id}` : `/playlists/${id}`;
-        const response = await axiosInstance.get(endpoint);
-
-        const normalized = normalizeCollection(response.data, type!);
-        setCollection(normalized);
-      } catch (err: any) {
-        setError(handleError(err));
-      } finally {
-        setIsLoading(false);
-      }
-    };
-    fetchData();
-  }, [id, type]);
-
-  if (isLoading) {
-    return <LoadingSpinner />;
-  }
-
-  if (error) {
-    return (
-      <div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
-        <h2 className="font-bold">Error</h2>
-        <p>{error}</p>
-      </div>
-    );
-  }
-
-  if (!collection) return null;
-
-  return (
-    <div className="container mx-auto p-6">
-      <button
-        onClick={() => navigate(-1)}
-        className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200 cursor-pointer"
-      >
-        ← Back
-      </button>
-
-      <div className="bg-white shadow-lg rounded-lg p-8">
-        <div className="flex items-start gap-6 mb-8">
-          <div className="shrink-0">
-            <div className="w-40 h-40 rounded-lg bg-gradient-to-br from-blue-400 to-purple-500 flex items-center justify-center text-white text-5xl font-bold shadow-lg">
-              {collection.title.charAt(0).toUpperCase()}
-            </div>
-          </div>
-
-          <div className="flex-1">
-            <span className="inline-block px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm font-medium mb-2">
-              {collection.type}
-            </span>
-            <h1 className="text-4xl font-bold mb-3">{collection.title}</h1>
-
-            <div className="flex items-center gap-3 text-gray-700 mb-4">
-              <span className="font-semibold">{collection.releasedBy}</span>
-              {collection.genre && (
-                <>
-                  <span>•</span>
-                  <span className="text-gray-600">{collection.genre}</span>
-                </>
-              )}
-              {collection.songs && (
-                <>
-                  <span>•</span>
-                  <span className="text-gray-600">
-                    {collection.songs.length} song
-                    {collection.songs.length !== 1 ? "s" : ""}
-                  </span>
-                </>
-              )}
-            </div>
-
-            {type === "album" && (
-              <button
-                className="flex items-center gap-2 px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg transition-colors duration-200"
-                aria-label={collection.isLikedByCurrentUser ? "Unlike" : "Like"}
-              >
-                <svg
-                  className="w-5 h-5"
-                  fill={collection.isLikedByCurrentUser ? "#ef4444" : "none"}
-                  stroke={
-                    collection.isLikedByCurrentUser ? "#ef4444" : "#6b7280"
-                  }
-                  strokeWidth="2"
-                  viewBox="0 0 24 24"
-                >
-                  <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                </svg>
-                <span className="text-sm font-medium text-gray-700">
-                  {collection.isLikedByCurrentUser ? "Liked" : "Like"}
-                </span>
-              </button>
-            )}
-          </div>
-        </div>
-
-        <div className="border-t pt-6">
-          <h2 className="text-2xl font-bold mb-4 text-gray-800">Songs</h2>
-
-          {collection.songs && collection.songs.length > 0 ? (
-            <div className="space-y-2">
-              {collection.songs.map((song, index) => (
-                <div
-                  key={song.id}
-                  className="flex items-center gap-4 p-3 rounded-lg hover:bg-gray-50 transition-colors duration-150"
-                >
-                  <span className="text-gray-500 font-medium w-8 text-center">
-                    {index + 1}
-                  </span>
-
-                  <div className="flex-1 min-w-0">
-                    <p className="font-semibold text-gray-900 truncate">
-                      {song.title}
-                    </p>
-                    <p className="text-sm text-gray-600 truncate">
-                      {song.releasedBy}
-                    </p>
-                  </div>
-
-                  <span className="text-sm text-gray-600 px-3 py-1 bg-gray-100 rounded-full">
-                    {song.genre}
-                  </span>
-
-                  <button
-                    className="p-2 hover:bg-gray-100 rounded-full transition-colors duration-200"
-                    aria-label={song.isLikedByCurrentUser ? "Unlike" : "Like"}
-                  >
-                    <svg
-                      className="w-5 h-5"
-                      fill={song.isLikedByCurrentUser ? "#ef4444" : "none"}
-                      stroke={song.isLikedByCurrentUser ? "#ef4444" : "#6b7280"}
-                      strokeWidth="2"
-                      viewBox="0 0 24 24"
-                    >
-                      <path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
-                    </svg>
-                  </button>
-                </div>
-              ))}
-            </div>
-          ) : (
-            <p className="text-center text-gray-500 py-8">No songs available</p>
-          )}
-        </div>
-      </div>
-    </div>
-  );
+	const { type, id } = useParams();
+	const [collection, setCollection] = useState<CollectionView | null>(null);
+	const [isLoading, setIsLoading] = useState(true);
+	const [error, setError] = useState<string | null>(null);
+
+	const normalizeCollection = (
+		data: Album | Playlist,
+		type: string,
+	): CollectionView => {
+		if (type === "album") {
+			const album = data as Album;
+			return {
+				id: album.id,
+				title: album.title,
+				cover: album.cover,
+				genre: album.genre,
+				type: album.type,
+				releasedBy: album.releasedBy,
+				isLikedByCurrentUser: album.isLikedByCurrentUser,
+				songs: album.songs,
+			};
+		} else {
+			const playlist = data as Playlist;
+			return {
+				id: playlist.id,
+				title: playlist.name,
+				cover: playlist.cover,
+				genre: undefined,
+				type: "PLAYLIST",
+				releasedBy: playlist.creatorName,
+				isLikedByCurrentUser: undefined,
+				songs: playlist.songsInPlaylist,
+			};
+		}
+	};
+
+	const toggleLike = async (songId: number) => {
+		try {
+			await axiosInstance.post(`/musical-entity/${songId}/like`);
+			setCollection((prev) => {
+				if (!prev) return null;
+				return {
+					...prev,
+					songs: prev.songs.map((s) =>
+						s.id === songId
+							? { ...s, isLikedByCurrentUser: !s.isLikedByCurrentUser }
+							: s,
+					),
+				};
+			});
+		} catch (err) {
+			console.error("Error toggling like:", err);
+		}
+	};
+
+	const toggleCollectionLike = async () => {
+		if (!collection) return;
+		try {
+			await axiosInstance.post(`/musical-entity/${collection.id}/like`);
+			setCollection((prev) => {
+				if (!prev) return null;
+				return { ...prev, isLikedByCurrentUser: !prev.isLikedByCurrentUser };
+			});
+		} catch (err) {
+			console.error("Error toggling collection like:", err);
+		}
+	};
+
+	useEffect(() => {
+		const fetchData = async () => {
+			setIsLoading(true);
+			setError(null);
+			try {
+				const endpoint =
+					type === "album" ? `/albums/${id}` : `/playlists/${id}`;
+				const response = await axiosInstance.get(endpoint);
+
+				const normalized = normalizeCollection(response.data, type!);
+				setCollection(normalized);
+			} catch (err: any) {
+				setError(handleError(err));
+			} finally {
+				setIsLoading(false);
+			}
+		};
+		fetchData();
+	}, [id, type]);
+
+	if (isLoading) {
+		return (
+			<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] flex items-center justify-center">
+				<div className="flex flex-col items-center gap-4">
+					<div className="w-12 h-12 border-4 border-white/10 border-t-[#1db954] rounded-full animate-spin" />
+					<p className="text-gray-400 text-lg">Loading collection…</p>
+				</div>
+			</div>
+		);
+	}
+
+	if (error) {
+		return (
+			<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] flex items-center justify-center">
+				<div className="text-center">
+					<p className="text-red-400 text-xl mb-4">{error}</p>
+					<Link to="/" className="text-[#1db954] hover:underline text-sm">
+						← Back to Home
+					</Link>
+				</div>
+			</div>
+		);
+	}
+
+	if (!collection) return null;
+
+	return (
+		<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] text-white">
+			<div className="max-w-5xl mx-auto px-6 py-10">
+				{/* Back link */}
+				<Link
+					to="/"
+					className="inline-flex items-center gap-1 text-gray-400 hover:text-white text-sm mb-8 transition-colors"
+				>
+					<svg
+						className="w-4 h-4"
+						fill="none"
+						stroke="currentColor"
+						viewBox="0 0 24 24"
+					>
+						<path
+							strokeLinecap="round"
+							strokeLinejoin="round"
+							strokeWidth={2}
+							d="M15 19l-7-7 7-7"
+						/>
+					</svg>
+					Back to Home
+				</Link>
+
+				{/* Hero section */}
+				<div className="flex flex-col md:flex-row gap-8 mb-10">
+					{/* Cover art */}
+					<div className="w-full md:w-72 shrink-0">
+						<div className="relative w-full pt-[100%] rounded-xl overflow-hidden shadow-2xl bg-[#181818]">
+							<img
+								src={collection.cover || "/favicon.png"}
+								alt={collection.title}
+								className="absolute inset-0 w-full h-full object-cover"
+								onError={(e) => {
+									(e.target as HTMLImageElement).src = "/favicon.png";
+								}}
+							/>
+						</div>
+					</div>
+
+					{/* Collection info */}
+					<div className="flex flex-col justify-end gap-3 min-w-0">
+						<span className="text-xs uppercase tracking-widest text-gray-400 font-medium">
+							{collection.genre ? `${collection.genre} • ` : ""}
+							{collection.type === "PLAYLIST" ? "Playlist" : "Album"}
+						</span>
+						<h1 className="text-4xl md:text-5xl font-extrabold leading-tight truncate">
+							{collection.title}
+						</h1>
+
+						<p className="text-xl text-gray-300 font-semibold">
+							{collection.releasedBy}
+						</p>
+
+						{collection.songs && (
+							<p className="text-sm text-gray-500">
+								{collection.songs.length} song
+								{collection.songs.length !== 1 ? "s" : ""}
+							</p>
+						)}
+
+						{/* Action buttons */}
+						<div className="flex items-center gap-3 mt-4">
+							{type === "album" && (
+								<button
+									onClick={toggleCollectionLike}
+									className={`flex items-center gap-2 px-5 py-3 rounded-full text-sm font-semibold transition-colors cursor-pointer ${
+										collection.isLikedByCurrentUser
+											? "bg-[#1db954] text-black"
+											: "bg-white/10 text-white hover:bg-white/20"
+									}`}
+								>
+									<svg
+										className="w-5 h-5"
+										fill={
+											collection.isLikedByCurrentUser ? "currentColor" : "none"
+										}
+										stroke="currentColor"
+										viewBox="0 0 24 24"
+									>
+										<path d="M20.84 4.61a5.5 5.5 0 0 0-7.78 0L12 5.67l-1.06-1.06a5.5 5.5 0 0 0-7.78 7.78l1.06 1.06L12 21.23l7.78-7.78 1.06-1.06a5.5 5.5 0 0 0 0-7.78z" />
+									</svg>
+									{collection.isLikedByCurrentUser ? "Liked" : "Like"}
+								</button>
+							)}
+						</div>
+					</div>
+				</div>
+
+				{/* Songs list */}
+				<div className="border-t border-white/10 pt-6">
+					<h2 className="text-2xl font-bold mb-4">Songs</h2>
+
+					{collection.songs && collection.songs.length > 0 ? (
+						<div className="space-y-1">
+							{collection.songs.map((song, index) => (
+								<SongItem
+									key={song.id}
+									song={song}
+									index={index + 1}
+									onLikeToggle={() => toggleLike(song.id)}
+								/>
+							))}
+						</div>
+					) : (
+						<div className="text-center py-12 text-gray-400">
+							<p className="text-lg">No songs available</p>
+						</div>
+					)}
+				</div>
+			</div>
+		</div>
+	);
 };
 
Index: frontend/src/pages/SongDetail.tsx
===================================================================
--- frontend/src/pages/SongDetail.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/pages/SongDetail.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,8 +1,10 @@
 import { useEffect, useRef, useState } from "react";
 import { Link, useParams } from "react-router-dom";
+import { toast } from "react-toastify";
 import axiosInstance from "../api/axiosInstance";
 import { useAuth } from "../context/authContext";
 import { usePlayer } from "../context/playerContext";
 import type { SongDetail as SongDetailType } from "../utils/types";
+import { toEmbedUrl } from "../utils/utils";
 
 const ROLE_LABELS: Record<string, string> = {
@@ -18,27 +20,4 @@
 const formatRole = (role: string): string => {
 	return ROLE_LABELS[role] || role.replace(/_/g, " ");
-};
-
-// convert a regular youtube URL to an embeddable URL
-const toEmbedUrl = (url: string): string => {
-	try {
-		const parsed = new URL(url);
-		// youtube.com/watch?v=ID
-		if (
-			(parsed.hostname === "www.youtube.com" ||
-				parsed.hostname === "youtube.com") &&
-			parsed.searchParams.has("v")
-		) {
-			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
-		}
-		// youtu.be/ID
-		if (parsed.hostname === "youtu.be") {
-			return `https://www.youtube.com/embed${parsed.pathname}`;
-		}
-		// already an embed URL or other provider – return as-is
-		return url;
-	} catch {
-		return url;
-	}
 };
 
@@ -137,5 +116,5 @@
 			setSong(response.data);
 		} catch (err) {
-			// todo :add toast
+			toast.error("Failed to delete review");
 			console.error("Error deleting review:", err);
 		}
@@ -152,4 +131,5 @@
 			);
 		} catch (err) {
+			toast.error("Failed to toggle like");
 			console.error("Error toggling like:", err);
 		}
Index: frontend/src/pages/UserDetail.tsx
===================================================================
--- frontend/src/pages/UserDetail.tsx	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/pages/UserDetail.tsx	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -1,5 +1,5 @@
 import { useEffect, useState } from "react";
-import { useNavigate, useParams } from "react-router-dom";
-import axiosInstance from "../api/axiosInstance";
+import { Link, useNavigate, useParams } from "react-router-dom";
+import axiosInstance, { baseURL } from "../api/axiosInstance";
 import LoadingSpinner from "../components/LoadingSpinner";
 import ArtistView from "../components/userProfile/ArtistView";
@@ -35,8 +35,5 @@
 
 const UserDetail = () => {
-	// user refers to the selected user NOT to the user from context
-	const baseURL = import.meta.env.VITE_API_BASE_URL;
 	const { username: usernameParam } = useParams();
-	// sintaksava dole znaci zemi go user od auth context i preimenuvaj go vo currentUser, za da ne se izmesa so user-ot dole
 	const { user: currentUser } = useAuth();
 	const navigate = useNavigate();
@@ -49,19 +46,21 @@
 	const [isFollowing, setIsFollowing] = useState(false);
 
-	// determine which username to use: URL param or current user's username
 	const username = usernameParam || currentUser?.username;
-
-	// if we're on /me route and no user is logged in, show error
+	const isOwnProfile = currentUser?.username === username;
+
 	if (!usernameParam && !currentUser) {
 		return (
-			<div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
-				<h2 className="font-bold">Authentication Required</h2>
-				<p>You must be logged in to view your profile.</p>
-				<button
-					onClick={() => navigate("/login")}
-					className="mt-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200 cursor-pointer"
-				>
-					Go to Login
-				</button>
+			<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] flex items-center justify-center">
+				<div className="text-center">
+					<p className="text-red-400 text-xl mb-4">
+						You must be logged in to view your profile.
+					</p>
+					<button
+						onClick={() => navigate("/login")}
+						className="text-[#1db954] hover:underline text-sm cursor-pointer"
+					>
+						Go to Login
+					</button>
+				</div>
 			</div>
 		);
@@ -95,5 +94,5 @@
 		try {
 			const response = await axiosInstance.post<FollowStatus>(
-				`/users/na/${username}/follow`,
+				`/users/na/${targetUsername}/follow`,
 			);
 
@@ -105,15 +104,4 @@
 				),
 			);
-
-			// if (user && user.id === targetId) {
-			//   setUser((prev) => {
-			//     if (!prev) return null;
-			//     return {
-			//       ...prev,
-			//       isFollowedByCurrentUser: response.data.isFollowing,
-			//       followers: response.data.followerCount,
-			//     };
-			//   });
-			// }
 		} catch (err: any) {
 			setError(handleError(err));
@@ -157,5 +145,4 @@
 			try {
 				const response = await axiosInstance.get(`/users/na/${username}`);
-				console.log(response.data);
 				setUser(response.data);
 			} catch (err: any) {
@@ -168,7 +155,11 @@
 	if (error) {
 		return (
-			<div className="p-6 bg-red-50 border border-red-200 text-red-700 rounded-lg">
-				<h2 className="font-bold">Error</h2>
-				<p>{error}</p>
+			<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] flex items-center justify-center">
+				<div className="text-center">
+					<p className="text-red-400 text-xl mb-4">{error}</p>
+					<Link to="/" className="text-[#1db954] hover:underline text-sm">
+						← Back to Home
+					</Link>
+				</div>
 			</div>
 		);
@@ -180,23 +171,38 @@
 
 	return (
-		<div className="container mx-auto p-6">
+		<div className="min-h-screen bg-linear-to-br from-[#1e1e2e] to-[#0f0f1e] text-white">
 			{isLoadingModal && (
-				<div className="fixed inset-0 z-40 bg-black/30 backdrop-blur-sm flex items-center justify-center">
-					<div className="flex items-center gap-3">
-						<div className="w-6 h-6 border-3 border-blue-500 border-t-transparent rounded-full animate-spin"></div>
-					</div>
+				<div className="fixed inset-0 z-40 bg-black/50 backdrop-blur-sm flex items-center justify-center">
+					<div className="w-10 h-10 border-4 border-white/10 border-t-[#1db954] rounded-full animate-spin" />
 				</div>
 			)}
-			<button
-				onClick={() => navigate(-1)}
-				className="mb-4 px-4 py-2 bg-blue-500 text-white rounded hover:bg-blue-600 transition-colors duration-200 cursor-pointer"
-			>
-				← Back
-			</button>
-
-			<div className="bg-white shadow-lg rounded-lg p-8">
-				<div className="flex items-start gap-6 mb-8">
-					<div className="shrink-0">
-						<div className="w-32 h-32 rounded-full bg-linear-to-br from-blue-400 to-purple-500 flex items-center justify-center text-white text-4xl font-bold shadow-lg overflow-hidden">
+
+			<div className="max-w-5xl mx-auto px-6 py-10">
+				{/* Back link */}
+				<Link
+					to="/"
+					className="inline-flex items-center gap-1 text-gray-400 hover:text-white text-sm mb-8 transition-colors"
+				>
+					<svg
+						className="w-4 h-4"
+						fill="none"
+						stroke="currentColor"
+						viewBox="0 0 24 24"
+					>
+						<path
+							strokeLinecap="round"
+							strokeLinejoin="round"
+							strokeWidth={2}
+							d="M15 19l-7-7 7-7"
+						/>
+					</svg>
+					Back to Home
+				</Link>
+
+				{/* Hero section */}
+				<div className="flex flex-col md:flex-row gap-8 mb-10">
+					{/* Profile photo */}
+					<div className="w-full md:w-48 shrink-0">
+						<div className="relative w-48 h-48 rounded-full overflow-hidden shadow-2xl bg-[#181818] mx-auto md:mx-0">
 							{user.profilePhoto ? (
 								<img
@@ -206,56 +212,103 @@
 								/>
 							) : (
-								user.fullName.charAt(0).toUpperCase()
+								<div className="w-full h-full bg-linear-to-br from-[#1db954] to-[#1ed760] flex items-center justify-center text-white text-5xl font-bold">
+									{user.fullName.charAt(0).toUpperCase()}
+								</div>
 							)}
 						</div>
 					</div>
 
-					<div className="flex-1">
-						<h1 className="text-4xl font-bold mb-2">{user.fullName}</h1>
-						<span className="inline-block px-3 py-1 bg-blue-100 text-blue-800 rounded-full text-sm font-medium mb-4">
-							{user.userType}
+					{/* User info */}
+					<div className="flex flex-col justify-end gap-3 min-w-0">
+						<span className="text-xs uppercase tracking-widest text-gray-400 font-medium">
+							{user.userType === "ARTIST" ? "Artist" : "Listener"} • Profile
 						</span>
-
-						<div className="flex gap-6 mb-4 text-gray-700">
+						<h1 className="text-4xl md:text-5xl font-extrabold leading-tight">
+							{user.fullName}
+						</h1>
+						<p className="text-gray-400">@{user.username}</p>
+
+						{/* Stats */}
+						<div className="flex items-center gap-6 mt-2">
 							<div
-								className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
+								className={`${user.userType === "LISTENER" ? "cursor-pointer hover:text-white" : ""} transition-colors`}
 								onClick={
 									user.userType === "LISTENER" ? displayFollowers : undefined
 								}
 							>
-								<span className="text-2xl font-bold">{user.followers}</span>
-								<span className="text-sm text-gray-500">Followers</span>
+								<span className="text-xl font-bold text-white">
+									{user.followers}
+								</span>
+								<span className="text-sm text-gray-400 ml-1">Followers</span>
 							</div>
 							<div
-								className={`flex flex-col ${user.userType == "LISTENER" ? "cursor-pointer" : "cursor-default"}`}
+								className={`${user.userType === "LISTENER" ? "cursor-pointer hover:text-white" : ""} transition-colors`}
 								onClick={
 									user.userType === "LISTENER" ? displayFollowing : undefined
 								}
 							>
-								<span className="text-2xl font-bold">{user.following}</span>
-								<span className="text-sm text-gray-500">Following</span>
+								<span className="text-xl font-bold text-white">
+									{user.following}
+								</span>
+								<span className="text-sm text-gray-400 ml-1">Following</span>
 							</div>
 						</div>
 
-						<button
-							onClick={handleFollow}
-							disabled={isFollowing}
-							className={`
-                px-6 py-2 font-semibold rounded-lg shadow-md 
-                transition-colors duration-200
-                ${
-									isFollowing
-										? "bg-gray-400 text-gray-200 cursor-not-allowed"
-										: user.isFollowedByCurrentUser
-											? "bg-gray-200 text-gray-700 hover:bg-gray-300 cursor-pointer"
-											: "bg-blue-500 text-white hover:bg-blue-600 cursor-pointer"
-								}
-              `}
-						>
-							{user.isFollowedByCurrentUser ? "Unfollow" : "Follow"}
-						</button>
+						{/* Follow button - hidden on own profile */}
+						{!isOwnProfile && (
+							<div className="mt-4">
+								<button
+									onClick={handleFollow}
+									disabled={isFollowing}
+									className={`flex items-center gap-2 px-6 py-3 rounded-full text-sm font-semibold transition-all cursor-pointer ${
+										isFollowing
+											? "bg-gray-700 text-gray-400 cursor-not-allowed"
+											: user.isFollowedByCurrentUser
+												? "bg-white/10 text-white hover:bg-white/20"
+												: "bg-[#1db954] text-black hover:bg-[#1ed760] hover:scale-105"
+									}`}
+								>
+									{user.isFollowedByCurrentUser ? (
+										<>
+											<svg
+												className="w-5 h-5"
+												fill="none"
+												stroke="currentColor"
+												viewBox="0 0 24 24"
+											>
+												<path
+													strokeLinecap="round"
+													strokeLinejoin="round"
+													strokeWidth={2}
+													d="M5 13l4 4L19 7"
+												/>
+											</svg>
+											Following
+										</>
+									) : (
+										<>
+											<svg
+												className="w-5 h-5"
+												fill="none"
+												stroke="currentColor"
+												viewBox="0 0 24 24"
+											>
+												<path
+													strokeLinecap="round"
+													strokeLinejoin="round"
+													strokeWidth={2}
+													d="M12 4v16m8-8H4"
+												/>
+											</svg>
+											Follow
+										</>
+									)}
+								</button>
+							</div>
+						)}
 					</div>
 				</div>
 
+				{/* Content */}
 				{user.userType === "ARTIST" ? (
 					<ArtistView contributions={user.contributions} />
Index: frontend/src/utils/types.ts
===================================================================
--- frontend/src/utils/types.ts	(revision 27660af8b50619221470b2bbb054bcc3db8ed385)
+++ frontend/src/utils/types.ts	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -15,4 +15,6 @@
 	entityType: string;
 	isLikedByCurrentUser: boolean;
+	cover?: string | null;
+	link?: string | null;
 }
 
Index: frontend/src/utils/utils.ts
===================================================================
--- frontend/src/utils/utils.ts	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
+++ frontend/src/utils/utils.ts	(revision 1579b4f9eaf503a14012d471db11e16e645306e3)
@@ -0,0 +1,21 @@
+export const toEmbedUrl = (url: string): string => {
+	try {
+		const parsed = new URL(url);
+		// youtube.com/watch?v=ID
+		if (
+			(parsed.hostname === "www.youtube.com" ||
+				parsed.hostname === "youtube.com") &&
+			parsed.searchParams.has("v")
+		) {
+			return `https://www.youtube.com/embed/${parsed.searchParams.get("v")}`;
+		}
+		// youtu.be/ID
+		if (parsed.hostname === "youtu.be") {
+			return `https://www.youtube.com/embed${parsed.pathname}`;
+		}
+		// already an embed URL or other provider – return as-is
+		return url;
+	} catch {
+		return url;
+	}
+};
