{"id":28511120,"url":"https://github.com/gokulcodes/circles","last_synced_at":"2026-04-20T03:06:59.430Z","repository":{"id":296952772,"uuid":"988950127","full_name":"gokulcodes/circles","owner":"gokulcodes","description":"A text based distraction-free personal space for connecting with your closed circles.","archived":false,"fork":false,"pushed_at":"2025-06-11T06:06:29.000Z","size":903,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-11T06:31:53.497Z","etag":null,"topics":["graphql","graphql-subscriptions","mongodb","react","socket-io","superbase"],"latest_commit_sha":null,"homepage":"https://circles.gokulcodes.dev","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gokulcodes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-05-23T10:20:48.000Z","updated_at":"2025-06-11T06:06:32.000Z","dependencies_parsed_at":"2025-06-03T15:37:38.525Z","dependency_job_id":"8e76d028-164e-4eb3-987e-7e5c4b2e0501","html_url":"https://github.com/gokulcodes/circles","commit_stats":null,"previous_names":["gokulcodes/circles"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gokulcodes/circles","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gokulcodes%2Fcircles","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gokulcodes%2Fcircles/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gokulcodes%2Fcircles/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gokulcodes%2Fcircles/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gokulcodes","download_url":"https://codeload.github.com/gokulcodes/circles/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gokulcodes%2Fcircles/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263268585,"owners_count":23439979,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["graphql","graphql-subscriptions","mongodb","react","socket-io","superbase"],"created_at":"2025-06-08T23:07:15.392Z","updated_at":"2026-04-20T03:06:59.425Z","avatar_url":"https://github.com/gokulcodes.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"![Circles poster](https://github.com/gokulcodes/circles/blob/main/public/poster.png?raw=true)\n\n# Circles\n\nA text based distraction-free personal space for connecting with your closed circles.\n\n### Requirements:\n\n- User signup with Username(Unique), Email \u0026 Password\n  - Can't afford OTP's to verify email's for now\n- User login with Email \u0026 Password with Recaptcha3 enabled\n- No multimedia support\n  - Only text based chat to restrict unwanted abuse\n  - since we are not verifying email, it's highly possible to make this platform more vulnerable\n- Add friend feature\n  - In Circles, there is no social network, user has to enter username of their friends to add friends and chat with them\n- Reject friend request\n- List all your friends\n  - delete a contact and it's chat\n- Block friend\n- Profile view\n  - Auto generated avatar\n  - Username\n  - about\n  - Email address\n  - Change password\n  - Notification\n    - in app notification\n  - Delete account\n  - Online status\n  - Last seen time\n  - Block list\n    - unblock users\n- Chat\n  - Common for 1 : 1 chats view \u0026 Group chats\n    - message card\n      - message\n      - avatar\n      - time\n      - actions\n        - replay message - messageid\n        - delete - not reversable\n        - star / unstar\n        - pin / unpin\n        - react / unreact\n          - laugh, cry etc\n    - lazy loading when user scrolls to previous chat history\n      - pagination required\n    - message input box\n    - send button\n  - 1 : 1 message\n    - profile view inside chat\n      - avatar\n      - name\n      - online status\n      - last seen\n      - typing\n      - more info\n        - opens a full view panel of a user on the other side\n          - avatar\n          - username\n          - email - if publicaly viewable\n          - about\n          - block\n    - actions\n      - Clear history\n      - block / unblock\n  - Group chat\n    - profile view inside chat\n      - group avatar\n      - name\n      - total onlines\n      - total typing\n    - actions\n      - Exit group\n      - Add person - admin access\n      - Delete group - admin access\n      - Kick a person out - admin access\n      - Clear history\n\n### Security\n\n- I know this is overkill, but just to be sure that i don't endup paying unwanted server cost\n- Rate limiting\n- Basic End to End encryption\n  - basically, create a public and private key for two users in 1:1 chat\n  - public is shared between user's\n  - each message is encrypted with opposite person's public key which can be only decrypted by him with his private key\n  - here securing private key is main problem - how to secure it?\n\n### Core\n\n- Every Secured API call has to be attached with auth token in cookie\n- Use Socket's for messaging / other activiities too\n  - Website should update in realtime whenever any server event is sent\n- In Frontend we can user server sent events for making the app more reactive\n\n### Tech decisions\n\n- Backend\n  - Graphql / Rest API\n  - How to do sockets to open multiple socket connections from a server?\n  - CI/CD for backend ? - Over engineering for initial days\n  - message queues for handling tones of user interactions ? - Over engineering for initial days\n  - Host on EC2 instance - Minimal server cost for next 12 months\n  - Mongodb? - M0 Serverless instance - Free\n  - Domain - api.circles.gokulcodes.dev\n- Frontend\n  - NextJS\n    - App router\n    - Middleware for cookie attachments \u0026 auth\n    - partial server side rendering\n  - Vercel for hosting\n  - Domain - circles.gokulcodes.dev\n\nTodo\nOnline presence - realtime\nLast Seen mutation - realtime\nTyping Indicator - Done\nFriend Info - Done\nCancel Friend request - Done\nClear Chat history - Done\nEmoji Picker - Done\nDelete Message - Done\nchatRoom List redesign\n\nCreateGroupChat\nAdd members\nRemove members\nLeave group\n\nRender Optimization.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgokulcodes%2Fcircles","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgokulcodes%2Fcircles","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgokulcodes%2Fcircles/lists"}