{"id":27362541,"url":"https://github.com/wuvictor-95/boards","last_synced_at":"2025-10-06T07:42:33.312Z","repository":{"id":166645892,"uuid":"642092030","full_name":"wuvictor-95/boards","owner":"wuvictor-95","description":"Live collaboration tool built with Go backend and Next.js, Typescript, \u0026 Tailwind frontend","archived":false,"fork":false,"pushed_at":"2023-08-23T16:56:07.000Z","size":3068,"stargazers_count":48,"open_issues_count":0,"forks_count":4,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-08-11T04:24:53.702Z","etag":null,"topics":["golang","openapi","react","rest-api","typescript","websocket"],"latest_commit_sha":null,"homepage":"","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/wuvictor-95.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}},"created_at":"2023-05-17T19:59:46.000Z","updated_at":"2025-05-13T03:31:05.000Z","dependencies_parsed_at":"2024-09-30T15:20:29.051Z","dependency_job_id":null,"html_url":"https://github.com/wuvictor-95/boards","commit_stats":null,"previous_names":["wave-95/boards","wuvictor-95/boards"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/wuvictor-95/boards","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuvictor-95%2Fboards","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuvictor-95%2Fboards/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuvictor-95%2Fboards/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuvictor-95%2Fboards/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/wuvictor-95","download_url":"https://codeload.github.com/wuvictor-95/boards/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/wuvictor-95%2Fboards/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278577913,"owners_count":26009701,"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-10-06T02:00:05.630Z","response_time":65,"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":["golang","openapi","react","rest-api","typescript","websocket"],"created_at":"2025-04-13T03:07:59.426Z","updated_at":"2025-10-06T07:42:33.295Z","avatar_url":"https://github.com/wuvictor-95.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Boards\nBoards is a collaborative desktop web application for creating and organizing notes on a digital canvas. Boards is a demo project showcasing event-driven microservices written in Golang as well as a stateful, interactive UI built with Next.js, Tailwind, and [React DnD](https://react-dnd.github.io/react-dnd/about). The containerized applicaton is orchestrated using Kubernetes and hosted on AWS. Perhaps the most interesting aspect of the application is how data is synchronized in real-time across client connections using Redis Pub-Sub and WebSocket events (create, move, edit posts).\n\n\u003cimg src=\"frontend/public/Hero.png\" alt=\"Boards\" width=\"500\"/\u003e\n\n## Technology Stack\n#### Frontend\n- [Next.js 13](https://nextjs.org/)\n- [Tailwind CSS](https://tailwindcss.com/)\n- [React Drag and Drop](https://react-dnd.github.io/react-dnd/about)\n#### Backend\n- [Chi Router](https://github.com/go-chi/chi)\n- [Gorilla WebSockets](https://github.com/gorilla/websocket)\n- [RabbitMQ](https://www.rabbitmq.com/tutorials/tutorial-one-go.html)\n- [Redis PubSub](https://redis.io/docs/interact/pubsub/)\n#### Storage / DB\n- PostgreSQL\n- [sqlc](https://sqlc.dev/)\n- [pgx](https://github.com/jackc/pgx)\n- [Golang Migrate v4](https://github.com/golang-migrate/migrate)\n#### Infrastructure / Cloud\n- Docker\n- Kubernetes\n- AWS: EKS, EC2, Route 53\n\n## Architecture Overview\n![architecture](docs/architecture.svg)\n\n## Services\n\nNo. | Service | Local | Hosted\n--- | --- | --- | ---\n1 | backend-core | [http://localhost:8080](http://localhost:8080) | [https://api.useboards.com](https://api.useboards.com)\n2 | backend-notification | [http://localhost:8082](http://localhost:8082) |\n3 | web | [http://localhost:3000](http://localhost:3000) | [https://useboards.com](https://useboards.com)\n4 | docs | [http://localhost:8081](http://localhost:8081) | [https://docs.useboards.com](https://docs.useboards.com)\n\n## Relevant Blog Posts\n- [WebSockets Client and Hub Architecture](https://medium.com/@wu.victor.95/building-a-go-websocket-for-a-live-collaboration-tool-pt-1-f7e5374b1f47)\n- [Implementing Go WebSockets using TDD](https://medium.com/@wu.victor.95/building-a-go-websocket-for-a-live-collaboration-tool-pt-2-5728cd6ec801)\n- [Implementing User Authentication Event](https://medium.com/@wu.victor.95/building-a-go-websocket-for-a-live-collaboration-tool-pt-3-b9a6b23f7fef)\n- [Hashing Passwords and Authenticating Users](https://medium.com/@wu.victor.95/hashing-passwords-and-authenticating-users-with-bcrypt-dc2fdd978568)\n- [Building the Posts API](https://medium.com/@wu.victor.95/building-a-post-service-for-our-websocket-endpoint-using-clean-architecture-tdd-f39aae9b2041)\n- [Building Frontend with Next.js \u0026 Tailwind](https://medium.com/@wu.victor.95/intro-8435223725f0)\n- [Fuzzy Email Search](https://medium.com/@wu.victor.95/new-feature-invite-members-to-a-board-cddfb6657131)\n- [E2E Implementation for User Invites](https://medium.com/@wu.victor.95/new-feature-board-invitations-pt-2-549e071d0338)\n- [Setting up Kubernetes](https://medium.com/@wu.victor.95/deploying-with-kubernetes-d3a9e9aad767)\n- [Deploying Application Cluster to AWS](https://medium.com/@wu.victor.95/deploying-application-to-aws-1d9b4e758de0)\n- [Frontend: Grouping Posts](https://medium.com/@wu.victor.95/boards-new-feature-grouping-posts-pt-1-680a98701c9b)\n- [Frontend: Ordering Posts](https://medium.com/@wu.victor.95/boards-new-feature-ordering-posts-e3984adcdef5)\n- [Making Backend Server Stateless](https://medium.com/@wu.victor.95/stateless-websocket-server-using-redis-pubsub-bf5f70435ba0)\n- [Creating Email Notification Service using RabbitMQ](https://medium.com/@wu.victor.95/creating-a-notification-service-using-rabbitmq-a488c3d5b8bf)\n- [Implementing Email Verifications](https://medium.com/@wu.victor.95/sending-email-verifications-with-smtp-pt-1-c4ededf5442a)\n- [Using SMTP to Send Emails](https://medium.com/@wu.victor.95/handling-rabbitmq-tasks-and-sending-emails-with-smtp-d2fd6bac695e)\n\n## Project Setup\n\nBefore proceeding with the project setup, please ensure that you have [Docker](https://www.docker.com/) installed on your machine. \n\n```bash\ngit clone https://github.com/Wave-95/boards.git\n\ncd boards\n\ndocker-compose up\n```\n\nThis will start up the frontend, backend, and notification service as well as the PostgreSQL, Redis, and RabbitMQ servers on your local machine. Database migrations should automatically run when a container is created for the backend service during docker compose. If you would like to insert test data into the database, use `make testdata`. \n\n## Development\n\nThe `docker-compose.yml` file loads in env vars for the server and frontend containers in their respective `.env` files. Depending on the `ENV` env varaible, the containers will either boot up in development or production mode. The backend uses [air](https://github.com/cosmtrek/air) and the frontend uses `next dev`. Feel free to rename the `.env.example` files to `.env` to get local development up and running.\n\n## Database Migrations\n\nDatabase migrations are run using [`golang-migrate`](https://github.com/golang-migrate/migrate/tree/master/cmd/migrate). The `golang-migrate` dependency should already be available in the backend container. You can either run migrations manually via an interactive shell or use the `make` commands:\n\n```bash\nmake migrate-up\n\nmake migrate-down\n\nmake testdata\n\nmake migrate-create\n```\n\n## Run Tests\n\n```bash\nmake test\n```\n\n## To Do\n- WebSocket API documentation\n- Implement mobile responsiveness\n- Implement high throughput data storage solution\n- Refactor frontend components\n- Add post voting\n- Add board duplication\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwuvictor-95%2Fboards","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwuvictor-95%2Fboards","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwuvictor-95%2Fboards/lists"}