{"id":35193141,"url":"https://github.com/walshyb/whiteboard","last_synced_at":"2026-04-09T23:51:02.006Z","repository":{"id":325880937,"uuid":"1102695401","full_name":"walshyb/whiteboard","owner":"walshyb","description":"My own Muro / Excalidraw clone to learn about HTML canvas, web sockets, and Golang","archived":false,"fork":false,"pushed_at":"2025-11-30T22:51:32.000Z","size":347,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-03T05:59:54.693Z","etag":null,"topics":["canvas","go-channels","golang","mongodb","protobuf","react","redis","terraform","websocket"],"latest_commit_sha":null,"homepage":"https://bwal.sh/whiteboard","language":"Go","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/walshyb.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-23T22:57:19.000Z","updated_at":"2025-11-30T22:51:35.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/walshyb/whiteboard","commit_stats":null,"previous_names":["walshyb/whiteboard"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/walshyb/whiteboard","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walshyb%2Fwhiteboard","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walshyb%2Fwhiteboard/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walshyb%2Fwhiteboard/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walshyb%2Fwhiteboard/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/walshyb","download_url":"https://codeload.github.com/walshyb/whiteboard/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/walshyb%2Fwhiteboard/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28111428,"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","status":"online","status_checked_at":"2025-12-29T02:00:07.021Z","response_time":58,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["canvas","go-channels","golang","mongodb","protobuf","react","redis","terraform","websocket"],"created_at":"2025-12-29T06:11:20.039Z","updated_at":"2025-12-29T06:11:20.958Z","avatar_url":"https://github.com/walshyb.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Real-time Whiteboard\n\nMy own Muro / Excalidraw clone!\n\nThis just started off as an idea for a real-time whiteboard app, purely for learning purpose because I was recently asked to design this actually in a systems design interview. I wasn't expected to know the workings of web sockets and was able to cobble together a solution, but realized I had HUGE gaps in my knowledge that I definitely need to fill.\n\nI originally thought \"oh yeah, this can just be a quick little project where I just throw down a canvas, hook up a little websocket, and badda bing!\" But as I continued down the path of learning, I kept finding more things that I should learn before progressing, or kept adding my own scope creep as I got more ideas.\n\nAll in all, this project (thus far) has helped me learn more about: Golang, websockets, HTML canvas, MongoDB (and nosql), Protobufs (AHH I love protobufs; idk how i ever built apis without server/client type safety??)\n\n## System Requirements\n\n- Node ^25.2.x\n- [Protoc](https://protobuf.dev/installation/) ^25.2\n- Go ^1.25.x\n- make ^3.x\n- Redis\n- MongoDB\n- Terraform (for deployment configuration)\n\n## Getting Started\n\n### clone the repo\n\n```bash\ngit clone git@github.com:walshyb/whiteboard.git \u0026\u0026 cd whiteboard\n```\n\n## Using Docker:\n\n### Build the docker images and run the mongo, redis, and server containers:\n\n```bash\n# Note: Default behavior binds to local ports, so ensure that ports 8080, 27017, and 6379 are free\ndocker compose up --build -d\n```\n\n### Run the frontend\n\n```bash\n# Install Client deps\ncd client \u0026\u0026 npm install\ncd .. and make\ncd client \u0026\u0026 npm run dev\n```\n\n## Full Local Development:\n\n### Download and build dependencies\n\n```bash\n# Install Client deps\ncd client\nnpm install\ncd ..\n\n# Install Go deps\ngo mod download\n\n# Build protobuf files\nmake\n```\n\n### Run the services\n\n- Run Redis (system-dependent)\n- Run MongoDB (system-dependent)\n\n```bash\n# Run the backend\ngo run .\n\n# And in a new terminal shell in current workspace,\n# Run the client:\ncd client\nnpm run dev\n```\n\n_Note_: Currently the frontend and backend run separately.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalshyb%2Fwhiteboard","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwalshyb%2Fwhiteboard","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwalshyb%2Fwhiteboard/lists"}