{"id":20790726,"url":"https://github.com/beakerandjake/quote-hero","last_synced_at":"2026-04-11T11:36:05.744Z","repository":{"id":234353740,"uuid":"788725219","full_name":"beakerandjake/quote-hero","owner":"beakerandjake","description":"Searching Wikiquote with Elasticsearch","archived":false,"fork":false,"pushed_at":"2024-04-26T17:39:27.000Z","size":210,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-26T22:46:06.834Z","etag":null,"topics":["docker-compose","elasticsearch","fastapi","python","react","wikimedia","wikiquote"],"latest_commit_sha":null,"homepage":"","language":"Python","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":"2024-04-19T00:46:48.000Z","updated_at":"2024-04-26T17:39:30.000Z","dependencies_parsed_at":"2024-04-26T18:52:03.857Z","dependency_job_id":null,"html_url":"https://github.com/beakerandjake/quote-hero","commit_stats":null,"previous_names":["beakerandjake/wikiquote-elastic-search","beakerandjake/quote-master","beakerandjake/quote-hero"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/beakerandjake/quote-hero","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fquote-hero","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fquote-hero/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fquote-hero/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fquote-hero/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/beakerandjake","download_url":"https://codeload.github.com/beakerandjake/quote-hero/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/beakerandjake%2Fquote-hero/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31679482,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-11T08:18:19.405Z","status":"ssl_error","status_checked_at":"2026-04-11T08:17:08.892Z","response_time":54,"last_error":"SSL_read: 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":["docker-compose","elasticsearch","fastapi","python","react","wikimedia","wikiquote"],"created_at":"2024-11-17T15:37:11.113Z","updated_at":"2026-04-11T11:36:05.724Z","avatar_url":"https://github.com/beakerandjake.png","language":"Python","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!-- PROJECT LOGO --\u003e\n\u003cdiv align=\"center\"\u003e\n  \u003ch1 align=\"center\"\u003equote-hero 💬\u003c/h1\u003e\n  \u003cp align=\"center\"\u003eSearching Wikiquote with Elasticsearch\u003c/p\u003e\n\u003c/div\u003e\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\n      \u003ca href=\"#usage\"\u003eUsage\u003c/a\u003e\n      \u003cul\u003e\n        \u003cli\u003e\u003ca href=\"#how-to-play\"\u003eHow To Play\u003c/a\u003e\u003c/li\u003e\n      \u003c/ul\u003e\n    \u003c/li\u003e\n    \u003cli\u003e\u003ca href=\"#license\"\u003eLicense\u003c/a\u003e\u003c/li\u003e\n  \u003c/ol\u003e\n\u003c/details\u003e\n\n\u003c!-- ABOUT THE PROJECT --\u003e\n\n## About\n\n![product-screenshot]\n\nquote-hero is a game where you attempt to match as many Wikiquote pages as possible using random words. Adding more words gives you a higher score, but is risky because you may not match any pages. Depending on how confident you are in your set of words you can choose an exact match or a forgiving match.\n\nquote-hero is made up of several applications orchestrated with Docker Compose:\n\n- A single node Elasticsearch cluster is used to search for matching Wikiquote pages.\n- The ingest process creates an ElasticSearch index and populates it with the most recent [dump][wikiquote-dump-url] published by Wikiquote.\n- The api returns random words (using the top [10,000 most frequent][common-words-url] english language words), and returns the matching pages.\n- The frontend allows users play quote-hero\n- An nginx reverse proxy serves the frontend and api.\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[![Elasticsearch][Elasticsearch]][Elasticsearch-url]\n[![Python][Python]][Python-url]\n[![FastAPI][FastAPI]][FastAPI-url]\n[![React][React]][React-url]\n[![TailwindCSS][TailwindCSS]][TailwindCSS-url]\n[![Vite][Vite]][Vite-url]\n[![Docker][Docker]][Docker-url]\n[![Nginx][Nginx]][Nginx-url]\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\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/quote-hero\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### Note\n\nDepending on your computer and internet connection it may take a while for the application to start up. The ingest process particularly may take a long time, it must download a very large Wikiquote dump file and then load that data into Elasticsearch. However this ingest process only occurs the first time you start the project. \n\nTo check on the progress of the ingest you can run the following command once the ingest container is running:\n\n```sh\ndocker logs --follow ingest\n```\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- USAGE EXAMPLES --\u003e\n\n## Usage\n\nAfter the project is running navigate to `http://localhost:8080` in your browser. \n\n### How To Play\n\n 1. Click the \"Add Word\" button to get a random word. \n 2. Now you must decide if you want to keep adding words or to use the words you have. Keep in mind you cannot delete words, once you add a word you are stuck with it.\n 3. Once you are satisfied with your words you have to choose how you want to match:\n    - If you are confident in your words you can click the **Match Exact** button. This will match any pages with the exact phrase formed by the words.\n    - Otherwise you can click the **Match Forgiving** button, this is a more lenient search. It finds any pages which contains all of the words at least once somewhere on the page.\n    - _Note_: If you only have one word you are only presented with one match button which performs an exact match. \n4. At any time you can click the **Reset** button to clear your words and the results and start over.\n\nThe goal is to use as many words as possible to match as many pages as possible.\n\n\u003cp align=\"right\"\u003e(\u003ca href=\"#readme-top\"\u003eback to top\u003c/a\u003e)\u003c/p\u003e\n\n\u003c!-- LICENSE --\u003e\n## License\n\nDistributed under the GPL-3.0 License. See `LICENSE.txt` 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\n\u003c!-- MARKDOWN LINKS \u0026 IMAGES --\u003e\n\u003c!-- https://www.markdownguide.org/basic-syntax/#reference-style-links --\u003e\n\n[product-screenshot]: https://github.com/beakerandjake/quote-hero/assets/1727349/413ffae3-071f-455d-9089-e001d61aa2ce\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[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[Python]: https://img.shields.io/badge/python-3670A0?style=for-the-badge\u0026logo=python\u0026logoColor=ffdd54\n[Python-url]: https://www.python.org/\n[FastAPI]: https://img.shields.io/badge/FastAPI-005571?style=for-the-badge\u0026logo=fastapi\n[FastAPI-url]: https://fastapi.tiangolo.com/\n[ElasticSearch]: https://img.shields.io/badge/-ElasticSearch-005571?style=for-the-badge\u0026logo=elasticsearch\n[ElasticSearch-url]: https://www.elastic.co/elasticsearch\n[install-docker-url]: https://docs.docker.com/engine/install/\n[common-words-url]: https://github.com/first20hours/google-10000-english \n[wikiquote-dump-url]: https://dumps.wikimedia.org/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerandjake%2Fquote-hero","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbeakerandjake%2Fquote-hero","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbeakerandjake%2Fquote-hero/lists"}