{"service":"circle","port":8080,"role":"realtime_chat_socket_api","r2Presign":true,"socket":{"url":"http://localhost:8080","clientEmit":["identify"],"serverEmit":["receive_message","message_deleted","identified","identify_error"]},"http":{"home":"/","health":"/health","circles":"/circles","session":"POST /api/session","authRegister":"POST /api/auth/register","authLogin":"POST /api/auth/login","authRefresh":"POST /api/auth/refresh","authVerifyEmail":"GET /api/auth/verify-email?token=","authResend":"POST /api/auth/resend-verification (Bearer)","circleContext":"GET /api/circles/:circleId/context","circleJoin":"POST /api/circles/:circleId/join","circleLeave":"POST /api/circles/:circleId/leave","dmList":"GET /api/dm","dmOpen":"POST /api/dm/open { peerUserId }","userLookupByCircleId":"GET /api/users/lookup-by-circle-id?circleId=BG#########","userDiscover":"GET /api/users/discover?search=&limit=30","privateChatByCircleId":"POST /api/private-chats/by-circle-id { circleId }","markRead":"POST /api/chats/:chatId/mark-read","chatMyStorageSummary":"GET /api/chats/:chatId/my-storage-summary","messages":"GET|POST /api/chats/:chatId/messages","deleteMessage":"DELETE /api/chats/:chatId/messages/:messageId","translate":"POST /api/translate","r2Presign":"POST /api/r2/presign","voicePresignLegacy":"POST /api/r2/voice-upload-url"},"note":"Expo web: npm run web in client → http://localhost:8003","database":"postgresql (DATABASE_URL / Neon)"}