{"id":19483477,"url":"https://github.com/librity/nc_zoom","last_synced_at":"2026-04-08T20:41:29.087Z","repository":{"id":99704481,"uuid":"409243268","full_name":"librity/nc_zoom","owner":"librity","description":"  Nomad Coders - Zoom Clone - A clone for all them Zoomers.","archived":false,"fork":false,"pushed_at":"2022-08-27T20:36:04.000Z","size":1354,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-25T17:46:10.712Z","etag":null,"topics":["express","javascript","nodejs","nomad-coders","socket-io","webrtc","zoom"],"latest_commit_sha":null,"homepage":"https://zoomclone1776.herokuapp.com/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/librity.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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}},"created_at":"2021-09-22T14:46:52.000Z","updated_at":"2021-12-14T01:12:01.000Z","dependencies_parsed_at":"2023-07-31T13:16:29.708Z","dependency_job_id":null,"html_url":"https://github.com/librity/nc_zoom","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/librity/nc_zoom","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fnc_zoom","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fnc_zoom/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fnc_zoom/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fnc_zoom/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/librity","download_url":"https://codeload.github.com/librity/nc_zoom/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/librity%2Fnc_zoom/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31573788,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-08T14:31:17.711Z","status":"ssl_error","status_checked_at":"2026-04-08T14:31:17.202Z","response_time":54,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["express","javascript","nodejs","nomad-coders","socket-io","webrtc","zoom"],"created_at":"2024-11-10T20:15:15.457Z","updated_at":"2026-04-08T20:41:29.070Z","avatar_url":"https://github.com/librity.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Nomad Coders - Zoom Clone](https://nomadcoders.co/noom)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/demo.png\"\u003e\n\u003c/p\u003e\n\n## Table of Contents\n\n- [About](#about)\n- [Getting Started](#getting_started)\n- [Notes](#notes)\n- [License](#license)\n- [Packages](#packages)\n- [Docs](#docs)\n- [Resources](#resources)\n\n## About \u003ca name = \"about\"\u003e\u003c/a\u003e\n\nA Zoom clone made with WebRTC and SocketIO.\n\n- [Production App](https://zoomclone1776.herokuapp.com/)\n- [Take the course too!](https://nomadcoders.co/noom)\n- [Certificate of Completion](https://nomadcoders.co/certs/181c4ba0-2592-4cbb-bc3e-971d700210ef)\n\n## Getting Started \u003ca name = \"getting_started\"\u003e\u003c/a\u003e\n\n### Prerequisites\n\n- `node \u003e= 14.0.0`\n\n### Installation\n\n1. Clone this repo locally and install the required packages:\n\n```bash\n$ git clone https://github.com/librity/nc_zoom.git\n$ cd nc_zoom\n$ npm install\n```\n\n2. Start a development server:\n\n```bash\n$ npm run dev\n```\n\n3. Open http://localhost:3000 on your web browser.\n\n#### Mobile w/ LocalTunnel\n\nTo run on mobile, start the development server\nand run `localtunnel` in another shell:\n\n```bash\n$ npm i -g localtunnel\n$ lt --port 3000\n```\n\nThis will return a temporary https URL that tunnels to your server.\n\n#### Format\n\nFormat all source files with Prettier:\n\n```bash\n$ npm run format\n```\n\n## Notes \u003ca name = \"notes\"\u003e\u003c/a\u003e\n\n### WebRTC means fine Peer2Peer (W.R./M.F.P.)\n\n\u003e It's Toasted 🚬\n\nWeb Real-Time Communication is an API native to modern browsers\nthat facilitates video streaming with a peer-to-peer protocol.\nIt also supports `datachannel`s that let peers share arbitrary data.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/webrtc_diagram.png\"\u003e\n\u003c/p\u003e\n\nSince WebRTC doesn't have any signaling (peer discovery),\nso we use a SocketIO server to establish the initial\nhandshake between both peers.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/webrtc_details.png\"\u003e\n\u003c/p\u003e\n\nThe (SDP)offer contains the source address of the first peer\nand details about the audio and video being shared,\nlike timing information and the encoding/decoding algorithm.\n\nThe second peer accepts this offer\nand generates and answer.\nThe answer contains information about the second peer,\nlike its address and any ICE candidates.\n\nAn ICE candidate is a possible connection path between the peers.\nAs one can imagine, there are many different ways that two computers\ncan connect with one another, especially over long distances.\nThere are also considerations over which protocols are available (UDP, TCP)\nand if any of the peers are using Network Address Translation.\n\nOnce both peers accepted the offer and answer\n(which is like the contract of the peer to peer connection),\nthey choose a route/`icecandidate` that will hopefully offer\nthe fastest connection possible.\n\n- https://developer.mozilla.org/en-US/docs/Glossary/SDP\n- https://developer.mozilla.org/en-US/docs/Glossary/ICE\n- https://en.wikipedia.org/wiki/Network_address_translation\n\n### Scalability\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/webrtc_mesh.jpg\"\u003e\n\u003c/p\u003e\n\nThe architecture we use in this project performs\npoorly with more than a couple peers.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\".github/webrtc_sfu.webp\"\u003e\n\u003c/p\u003e\n\nThere are better alternatives like multipoint control unit (MCU)\nand the selective forwarding unit (SFU).\n\n- https://voximplant.com/blog/an-introduction-to-selective-forwarding-units\n- https://github.com/livekit/livekit-server\n\n### STUN Server\n\n\u003e STUN Servers allow clients to find out their public address,\n\u003e the type of NAT they are behind\n\u003e and the Internet side port associated\n\u003e by the NAT with a particular local port.\n\n## License \u003ca name = \"license\"\u003e\u003c/a\u003e\n\nThis project is [MIT licensed](LICENSE).\n\n## Packages \u003ca name = \"packages\"\u003e\u003c/a\u003e\n\n- https://github.com/remy/nodemon/\n- https://github.com/babel/babel\n- https://github.com/expressjs/express\n- https://github.com/pugjs/pug\n- https://github.com/websockets/ws\n- https://github.com/socketio/socket.io\n- https://github.com/socketio/socket.io-admin-ui\n- https://github.com/localtunnel/localtunnel\n\n## Docs \u003ca name = \"docs\"\u003e\u003c/a\u003e\n\n- https://babeljs.io/docs/en/\n- https://pugjs.org/api/getting-started.html\n- https://expressjs.com/en/guide/routing.html\n- https://socket.io/docs/v4/\n- https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API\n- https://developer.mozilla.org/en-US/docs/Web/API/WebRTC_API\n- https://developer.mozilla.org/en-US/docs/Web/API/RTCPeerConnection/createDataChannel\n\n## Resources \u003ca name = \"resources\"\u003e\u003c/a\u003e\n\n- https://www.w3schools.com/nodejs/met_path_join.asp\n- https://andybrewer.github.io/mvp/?ref=producthunt\n- https://admin.socket.io\n- https://babel.dev/docs/en/babel-cli\n\n### Vanilla Javascript\n\n- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map\n- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set\n- https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia\n- https://www.javatpoint.com/how-to-add-a-class-to-an-element-using-javascript\n\n### WebRTC\n\n- https://github.com/webrtc\n- https://github.com/webrtc/apprtc\n- https://github.com/webrtc/samples\n- https://github.com/webrtc/test-pages\n\n### Networking\n\n- https://www.3cx.com/pbx/what-is-a-stun-server/\n- https://en.wikipedia.org/wiki/Network_address_translation\n- https://en.wikipedia.org/wiki/STUN\n\n### CSS\n\n- https://stackoverflow.com/questions/15310158/add-border-radius-to-webcam-video-element\n- https://css-tricks.com/almanac/properties/b/border-radius/\n\n### Heroku Deploy\n\n- https://github.com/musekorea/fullstack-ZoomClone\n- https://www.freecodecamp.org/news/how-to-deploy-your-site-using-express-and-heroku/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibrity%2Fnc_zoom","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flibrity%2Fnc_zoom","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flibrity%2Fnc_zoom/lists"}