···66 title: "iStream - Video on Demand",
77 description: "Watch videos from the stream.place community! The coolest VOD site inspired by iCarly.",
88 icons: {
99- icon: "/iStream_Logo.png",
1010- shortcut: "/iStream_Logo.png",
99+ icon: "/favicon-32.png",
1010+ shortcut: "/favicon-32.png",
1111 apple: "/iStream_Logo.png",
1212 },
1313 openGraph: {
+2-2
src/components/HomeClient.tsx
···5555 // Cache for resolved handles to avoid redundant requests
5656 const handleCache = new Map<string, string>();
57575858- // Resolve handles with batching to avoid rate limits
5858+ // Resolve handles using the correct AT Protocol endpoint
5959 const resolveHandle = async (did: string): Promise<string> => {
6060 // Check cache first
6161 if (handleCache.has(did)) {
···6565 try {
6666 // Add delay to avoid rate limiting
6767 await new Promise(resolve => setTimeout(resolve, 100));
6868- const handleRes = await fetch(`https://public.api.bsky.app/xrpc/com.atproto.identity.resolveDid?did=${did}`);
6868+ const handleRes = await fetch(`https://bsky.social/xrpc/com.atproto.repo.describeRepo?repo=${did}`);
69697070 if (!handleRes.ok) {
7171 // Silently cache the DID itself if resolution fails
+9-6
src/components/VideoCard.tsx
···2525 if (STREAM_DISPLAY_NAMES[handle]) {
2626 return STREAM_DISPLAY_NAMES[handle];
2727 }
2828- // If it's a DID, show shortened version
2828+ // If it's a full handle like "username.bsky.social", show just the username part
2929+ if (handle.includes('.')) {
3030+ return handle.split('.')[0];
3131+ }
3232+ // If it's a DID, show shortened version (fallback)
2933 if (handle.startsWith('did:')) {
3034 const parts = handle.split(':');
3135 const lastPart = parts[parts.length - 1];
3236 return lastPart.slice(0, 12) + '...';
3337 }
3434- // If it's a full handle like "username.bsky.social", show just the username part
3535- if (handle.includes('.')) {
3636- return handle.split('.')[0];
3737- }
3838 return handle;
3939}
4040···5050 const [showHandle, setShowHandle] = useState(false);
5151 const id = video.uri.split('/').pop();
5252 const displayName = getDisplayName(video.handle);
5353+5454+ // For hover, always show the full handle (not the DID)
5555+ const fullHandle = video.handle.startsWith('did:') ? displayName : video.handle;
53565457 return (
5558 <a
···7376 <div className="video-info">
7477 <h3 className="video-title">{video.value.title}</h3>
7578 <p className="video-creator">
7676- {showHandle ? video.handle : displayName}
7979+ {showHandle ? fullHandle : displayName}
7780 </p>
7881 </div>
7982 </div>