{"id":20790705,"url":"https://github.com/beakerandjake/kafka-hello-world","last_synced_at":"2026-04-12T13:07:20.076Z","repository":{"id":216384558,"uuid":"733252960","full_name":"beakerandjake/kafka-hello-world","owner":"beakerandjake","description":"Realtime (fake) stock prices with Kafka. ","archived":false,"fork":false,"pushed_at":"2024-04-24T22:55:05.000Z","size":340,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-18T10:32:40.611Z","etag":null,"topics":["fastify","kafka","kafka-consumer","kafka-producer","nodejs","postgresql","python","react"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/beakerandjake.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":"2023-12-18T22:59:36.000Z","updated_at":"2024-04-24T22:55:08.000Z","dependencies_parsed_at":"2024-11-17T15:52:09.881Z","dependency_job_id":null,"html_url":"https://github.com/beakerandjake/kafka-hello-world","commit_stats":null,"previous_names":["beakerandjake/kafka-hello-world"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fkafka-hello-world","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fkafka-hello-world/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fkafka-hello-world/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fkafka-hello-world/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beakerandjake","download_url":"https://codeload.github.com/beakerandjake/kafka-hello-world/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243136241,"owners_count":20241988,"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":["fastify","kafka","kafka-consumer","kafka-producer","nodejs","postgresql","python","react"],"created_at":"2024-11-17T15:37:02.182Z","updated_at":"2025-12-24T13:50:24.551Z","avatar_url":"https://github.com/beakerandjake.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003c!-- adapted from: https://github.com/othneildrew/Best-README-Template --\u003e\n\u003ca name=\"readme-top\"\u003e\u003c/a\u003e\n\n\u003c!-- logo --\u003e\n\u003cbr /\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"https://github.com/beakerandjake/kafka-hello-world\"\u003e\n    \u003cimg src=\"https://github.com/beakerandjake/kafka-hello-world/assets/1727349/84216fce-a0df-491b-8931-0b1a1349f973\" alt=\"Logo\" width=\"80\" height=\"80\"\u003e\n  \u003c/a\u003e\n  \u003ch2 align=\"center\"\u003ekafka-hello-world\u003c/h2\u003e\n  \u003cp align=\"center\"\u003e\n    Realtime (fake) stock prices with Kafka.\n  \u003c/p\u003e\n\u003c/div\u003e\n\n\n\u003c!-- table of contents --\u003e\n\u003cdetails\u003e\n  \u003csummary\u003eTable of Contents\u003c/summary\u003e\n  \u003col\u003e\n    \u003cli\u003e\n      \u003ca href=\"#about\"\u003eAbout\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#built-with\"\u003eBuilt With\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\n      \u003ca href=\"#getting-started\"\u003eGetting Started\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#prerequisites\"\u003ePrerequisites\u003c/a\u003e\u003c/li\u003e\n        \u003cli\u003e\u003ca href=\"#installation\"\u003eInstallation\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#architecture-diagram\"\u003eArchitecture Diagram\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\u003c!-- about --\u003e\n## About\n\n![project-screenshot]\n\nCreated while I was learning Kafka, I needed a stream of realtime data to work with and stock prices came to mind. \n\nThe project is composed of different applications which are orchestrated by docker compose. \n\nA single Producer continually publishes price change messages to a topic with multiple Consumers. \n\n- One Consumer saves each price event to a database.\n- Another Consumer aggregates these rows into time buckets.\n- A final Consumer pushes price events to the frontend via SSE. \n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n### Built With\n\n[![Kafka][Kafka]][Kafka-url]\n[![Postgres][Postgres]][Postgres-url]\n[![Nginx][Nginx]][Nginx-url]\n[![Docker][Docker]][Docker-url]\n[![Fastify][Fastify]][Fastify-url]\n[![Vite][Vite]][Vite-url]\n[![React][React]][React-url]\n[![Chart.js][Chart.js]][Chart.js-url]\n[![TailwindCSS][TailwindCSS]][TailwindCSS-url]\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- getting started --\u003e\n## Getting Started\n\nInstallation is easy thanks to docker compose, you just need to clone this repository then run the `up` command.\n\n### Prerequisites\n\nDocker Compose must be installed on your machine. It can be installed through docker desktop or [docker engine][install-docker-url].\n\n### Installation\n\n1. Clone this repo\n   ```sh\n   git clone https://github.com/beakerandjake/kafka-hello-world\n   ```\n2. Start the application\n   ```sh\n   docker compose up -d\n   ```\n\nTo stop the application\n   ```sh\n   docker compose down\n   ```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\u003c!-- USAGE EXAMPLES --\u003e\n## Usage\n\nOnce the containers are all started navigate to `http://localhost:8080` in your browser. You should see prices continually update, if you leave it running you can see the price chart change over time.\n\nTo view the price events you can create a console consumer:\n\n```sh\ndocker exec -it kafka kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic stock_price_changes\n```\n\nYou can also follow the consumer logs:\n```sh\ndocker logs consumer-realtime --follow\n```\n```sh\ndocker logs consumer-aggregate --follow\n```\n\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- Architecture Diagram --\u003e\n## Architecture Diagram\n\n![project-architecture]\n\nSee a specific component's README file for more information.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n[project-screenshot]: https://github.com/beakerandjake/kafka-hello-world/assets/1727349/d9f7bf11-d548-43e1-817c-0055e18a562e\n[project-architecture]: https://github.com/beakerandjake/kafka-hello-world/assets/1727349/fa3b1072-904c-4b7a-b4b8-6e6995e53df3\n\n[Kafka]: https://img.shields.io/badge/Apache%20Kafka-000?style=for-the-badge\u0026logo=apachekafka\n[Kafka-url]: https://kafka.apache.org/\n[Postgres]: https://img.shields.io/badge/PostgreSQL-316192?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\n[Postgres-url]: https://www.postgresql.org/\n[Nginx]: https://img.shields.io/badge/nginx-%23009639.svg?style=for-the-badge\u0026logo=nginx\u0026logoColor=white\n[Nginx-url]: https://nginx.org\n[Docker]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[Docker-url]: https://www.docker.com/\n[Fastify]: https://img.shields.io/badge/fastify-%23000000.svg?style=for-the-badge\u0026logo=fastify\u0026logoColor=white\n[Fastify-url]: https://fastify.dev/\n[Vite]: https://img.shields.io/badge/vite-%23646CFF.svg?style=for-the-badge\u0026logo=vite\u0026logoColor=white\n[Vite-url]: https://vitejs.dev/\n[React]: https://img.shields.io/badge/React-20232A?style=for-the-badge\u0026logo=react\u0026logoColor=61DAFB\n[React-url]: https://react.dev/\n[TailwindCSS]: https://img.shields.io/badge/Tailwind_CSS-38B2AC?style=for-the-badge\u0026logo=tailwind-css\u0026logoColor=white\n[TailwindCSS-url]: https://tailwindcss.com/\n[Chart.js]: https://img.shields.io/badge/chart.js-F5788D.svg?style=for-the-badge\u0026logo=chart.js\u0026logoColor=white\n[Chart.js-url]: https://www.chartjs.org/\n[install-docker-url]: https://docs.docker.com/engine/install/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerandjake%2Fkafka-hello-world","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeakerandjake%2Fkafka-hello-world","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerandjake%2Fkafka-hello-world/lists"}