{"id":13622016,"url":"https://github.com/flathunters/flathunter","last_synced_at":"2025-10-02T14:32:10.639Z","repository":{"id":37583524,"uuid":"264873293","full_name":"flathunters/flathunter","owner":"flathunters","description":"A bot to help people with their rental real-estate search. 🏠🤖","archived":false,"fork":true,"pushed_at":"2024-08-16T01:50:17.000Z","size":1936,"stargazers_count":836,"open_issues_count":50,"forks_count":180,"subscribers_count":16,"default_branch":"main","last_synced_at":"2024-09-25T01:06:21.445Z","etag":null,"topics":["2captcha","chromedriver","crawlers","idealista","imagetyperz","immobiliare","immobilienscout24","immowelt","kleinanzeigen","mattermost-bot","python","real-estate","realestate","rental","selenium","subito","telegram-bot","vrmimmo","wg-gesucht"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"mordax7/flathunter","license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flathunters.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.de.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2020-05-18T08:15:31.000Z","updated_at":"2024-09-24T05:10:09.000Z","dependencies_parsed_at":"2023-10-03T17:20:12.723Z","dependency_job_id":"a9382609-8f3b-4e38-a726-31c22e476e75","html_url":"https://github.com/flathunters/flathunter","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flathunters%2Fflathunter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flathunters%2Fflathunter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flathunters%2Fflathunter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flathunters%2Fflathunter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flathunters","download_url":"https://codeload.github.com/flathunters/flathunter/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219875712,"owners_count":16554705,"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":["2captcha","chromedriver","crawlers","idealista","imagetyperz","immobiliare","immobilienscout24","immowelt","kleinanzeigen","mattermost-bot","python","real-estate","realestate","rental","selenium","subito","telegram-bot","vrmimmo","wg-gesucht"],"created_at":"2024-08-01T21:01:12.947Z","updated_at":"2025-10-02T14:32:10.632Z","avatar_url":"https://github.com/flathunters.png","language":"HTML","funding_links":[],"categories":["automated Bots","HTML"],"sub_categories":["Flats"],"readme":"# Flathunter\n\n[![standard-readme compliant](https://img.shields.io/badge/readme%20style-standard-brightgreen.svg?style=flat)](https://github.com/RichardLitt/standard-readme)\n[![Lint Code Base](https://github.com/flathunters/flathunter/actions/workflows/linter.yml/badge.svg)](https://github.com/flathunters/flathunter/actions/workflows/linter.yml)\n[![Tests](https://github.com/flathunters/flathunter/actions/workflows/tests.yml/badge.svg)](https://github.com/flathunters/flathunter/actions/workflows/tests.yml)\n[![codecov](https://codecov.io/gh/flathunters/flathunter/branch/master/graph/badge.svg)](https://codecov.io/gh/flathunters/flathunter)\n\nA bot to help people with their rental real-estate search. 🏠🤖\n\n## Flathunter will not solve your problem\n\nThe rents are too high - you can't find a flat at a reasonable price in a place you actually want to live. Too many people apply for the good flats - you need to get apply very quickly to have any chance of getting a place. A bot seems like a good solution to this, but it's really just making things worse.\n\nUse this bot to help with your flatsearch - it's a much better use of your time and resources than hitting refresh on a property portal every five minutes. Once you found a place for yourself, consider supporting alternatives like the [Mietshäusersyndikat](https://www.syndikat.org/en/the-joint-venture/). The MHS projects (like [the one I live in](https://teichwiesel.de/unterstuetzen/)) are always [looking for funding](https://www.syndikat.org/en/funding/) in the form of interest-bearing loans from individuals. If you have some thousand euros sitting around on your bank account, you can improve the housing situation in Germany and earn some interest on your savings by [lending cash](https://www.syndikat.org/en/direct-loans/) to one of the projects for a year or two.\n\n## If you are not a Python developer / power-user\n\nSetting up this project on your local machine can be a bit complicated if you have no experience with Python. This `README` is detailed, and there is a configuration wizard, but it's not super user-friendly. If you are searching for properties in Berlin, you can use the hosted version at https://flathunter.codders.de . You can login there with your Telegram ID and setup a basic search without downloading the project.\n\n## Description\n\nFlathunter is a Python application which periodically [scrapes](https://en.wikipedia.org/wiki/Web_scraping) property listings sites, configured by the user, to find new rental real-estate listings, reporting them over messaging services.\n\nCurrently available messaging services are [Telegram](https://telegram.org/), [Mattermost](https://mattermost.com/), [Apprise](https://github.com/caronc/apprise) and [Slack](https://slack.com/).\n\n## Table of Contents\n- [Background](#background)\n- [Install](#install)\n  - [Prerequisites](#prerequisites)\n  - [Installation on Linux](#installation-on-linux)\n- [Usage](#usage)\n  - [Configuration](#configuration)\n    - [URLs](#urls)\n    - [Telegram](#telegram)\n    - [Capmonster](#capmonster)\n    - [Proxy](#proxy)\n    - [Google API](#google-api)\n  - [Command-line Interface](#command-line-interface)\n  - [Web Interface](#web-interface)\n  - [Docker](#docker)\n  - [Google Cloud Deployment](#google-cloud-deployment)\n- [Testing](#testing)\n- [Maintainers](#maintainers)\n- [Credits](#credits)\n  - [Contributers](#contributers)\n- [Contributing](#contributing)\n\n## Background\n\nThere are at least four different rental property marketplace sites that are widely used in Germany - [ImmoScout24](https://www.immobilienscout24.de/), [Immowelt](https://www.immowelt.de/), [WG-Gesucht](https://www.wg-gesucht.de/) and [Kleinanzeigen](https://www.kleinanzeigen.de/). Most people end up searching through listings on all four sites on an almost daily basis during their rental search.\nIn Italy on the other hand, [idealista](https://www.idealista.it), [Subito](https://www.subito.it) and [Immobiliare.it](https://www.immobiliare.it) are very common for real-estate hunting.\n\nWith ```Flathunter```, instead of visiting the same pages on the same  sites every day, you can set the system up to scan every site, filtering by your search criteria, and notify you when new rental property becomes available that meets your criteria.\n\n## Prerequisites\n* [Python 3.10+](https://www.python.org/)\n* [pipenv](https://pipenv.pypa.io/en/latest/)\n* [Chromium](https://www.chromium.org/) / [Google Chrome](https://www.google.com/chrome/) (*optional to scan ads on immobilienscout24.de, and Kleinanzeigen)\n* [Docker]() (*optional*)\n* [GCloud CLI]() (*optional*)\n\n## Install\n\nStart by installing all dependencies inside a virtual environment using ```pipenv``` from the project's directory:\n\n```sh\n$ pipenv install\n```\n\n(Note that the `Pipfile.lock` shipped with the project is built on a Linux x86 system and installs packages from [Pypi](https://pypi.python.org/). If you are installing on a different platform with a different package repository, you may need to update the source URL in the Pipfile to point to your python package repository, and install using `pipenv install --skip-lock` - see [#314](https://github.com/flathunters/flathunter/issues/314))\n\nOnce the dependencies are installed, as well as every time you come back to the project in a new shell, run:\n\n```sh\n$ pipenv shell\n```\n\nto launch a Python environment with the dependencies that your project requires. **Now that you are inside the virtual environment, all commands you run in the shell will run with the required dependencies available**\n\nBefore you run the program for the first time, you need to generate a configuration file. There is an example\nfile shipped with the project (`config.yaml.dist`), but you can also use the configuration wizard to generate\na configuration for simple projects:\n\n```sh\n$ python config_wizard.py\n```\n\nThe wizard will create a new `config.yaml` file in the current working directory that you can use to run Flathunter:\n\n```sh\n$ python flathunt.py\n```\n\n**To directly run the program without entering the venv first, use:**\n\n```sh\n$ pipenv run python flathunt.py\n```\n\n### Installation on Linux\n(tested on CentOS Stream)\n\nFirst clone the repository\n```sh\n$ cd /opt\n$ git clone https://github.com/flathunters/flathunter.git\n```\nadd a new User and configure the permissions\n```sh\n$ useradd -m flathunter\n$ chown flathunter:flathunter -R flathunter/\n```\nNext install pipenv for the new user\n```sh\n$ sudo -u flathunter pip install --user pipenv\n$ cd flathunter/\n$ sudo -u flathunter /home/flathunter/.local/bin/pipenv install\n```\nNext configure the config file and service file to your liking. Then move the service file in place:\n```sh\n$ mv flathunter/sample-flathunter.service /lib/systemd/system/flathunter.service\n```\nAt last you just have to start flathunter\n```sh\n$ systemctl enable flathunter --now\n```\nIf you're using SELinux the following policy needs to be added:\n```sh\n$ chcon -R -t bin_t /home/flathunter/.local/bin/pipenv\n```\n\n## Usage\n\n### Configuration\n\nBefore running the project for the first time, you need to create a valid configuration file. You can\nlook at `config.yaml.dist` to see an example config - copying that to `config.yaml` and editing the `urls`\nand `telegram` sections will allow you to run Flathunter. Alternatively, you can use the configuration wizard\nto generate a basic configuration:\n\n```sh\n$ python config_wizard.py\n```\n\n#### URLs\n\nTo configure the searches, simply visit the property portal of your choice (e.g. ImmoScout24), configure the search on the website to match your search criteria, then copy the URL of the results page into the config file. You can add as many URLs as you like, also multiple from the same website if you have multiple different criteria (e.g. running the same search in different areas).\n\n * Currently, Kleinanzeigen, Immowelt, WG-Gesucht and Idealista only crawl the first page, so make sure to **sort by newest offers**.\n * Your links should point to the German version of the websites (in the case of Kleinanzeigen, Immowelt, ImmoScout24 and WG-Gesucht), since it is tested only there. Otherwise you might have problems.\n * For Idealista, the link should point to the Italian version of the website, for the same reason reported above.\n * For Immobiliare, the link should point to the Italian version of the website, for the same reasons reported above.\n * For Subito, the link should point to the Italian version of the website, for the same reasons reported above.\n\n#### Telegram\n\nTo be able to send messages to you over Telegram, you need to register a new bot with the [BotFather](https://telegram.me/BotFather) for `Flathunter` to use. Through this process, a \"Bot Token\" will be created for you, which should be configured under `bot_token` in the config file.\n\nTo know who should Telegram messages should be sent to, the \"Chat IDs\" of the recipients must be added to the config file under `receiver_ids`. To work out your own Chat ID, send a message to your new bot, then run:\n\n```\n$ curl https://api.telegram.org/bot[BOT-TOKEN]/getUpdates\n```\n\nto get list of messages the Bot has received. You will see your Chat ID in there.\n\n#### Bot Detection\n\nSome sites (including Kleinanzeigen and ImmoScout24) implement bot detection to prevent scripts from scraping their sites. Flathunter includes support for running a headless Chrome browser to simulate human requests to the websites. **For crawling Kleinanzeigen and ImmoScout24, you will need to install Google Chrome**\n\n#### Captchas\n\nSome sites (including ImmoScout24) implement a Captcha to avoid being crawled by evil web scrapers. Since our crawler is not an evil one, the people at [2Captcha](https://2captcha.com), [Imagetyperz](https://imagetyperz.com/) and [Capmonster](https://capmonster.cloud/) provide services that help you solve them. You can head over to one of those services and buy some credit for captcha solving. You will need to install the API key for your captcha-solving account in the `config.yaml`. Check out `config.yaml.dist` to see how to configure `2Captcha`, `Imagetyperz` or `Capmonster` with Flathunter. **At this time, ImmoScout24 can not be crawled by Flathunter without using Capmonster. Buying captcha solutions does not guarantee that you will get past the ImmoScout24 bot detection (see [#296](https://github.com/flathunters/flathunter/issues/296), [#302](https://github.com/flathunters/flathunter/issues/302))**.\n\n#### Capmonster\n\nCurrently, [Capmonster](https://capmonster.cloud/) is the only implemented captcha-solving service that solves the captchas on ImmoScout24. You will need to set\nthe `FLATHUNTER_CAPMONSTER_KEY` environment variable or add the key to your `config.yaml` to solve the captchas.\n\n#### ImmoScout24 Cookie Override\n\nYou may find that even with the Captcha-solving support, your browser is detected as a bot. In this case, as a short-term fix, you can visit the ImmoScout website with your normal web-browser - actual humans generally pass the bot detection - and copy the `reese84` cookie into your Flathunter config file:\n\n```\nimmoscout_cookie: 2:pJP9F...OU4Q=\n```\n\nThis should allow you to bypass the bot detection for a short period of time, but you will need periodically to get a new cookie.\n\n#### Proxy\n\nIt's common that websites use bots and crawler protections to avoid being flooded with possibly malicious traffic. This can cause some issues when crawling, as we will be presented with a bot-protection page.\nTo circumvent this, we can enable proxies with the configuration key `use_proxy_list` and setting it to `True`.\nFlathunt will crawl a [free-proxy list website](https://free-proxy-list.net/) to retrieve a list of possible proxies to use, and cycle through the so obtained list until an usable proxy is found.  \n*Note*: there may be a lot of attemps before such an usable proxy is found. Depending on your region or your server's internet accessibility, it can take a while.\n\n#### Google API\n\nTo use the distance calculation feature a [Google API-Key](https://developers.google.com/maps/documentation/javascript/get-api-key) is needed, as well as to enable the [Distance Matrix API](https://developers.google.com/maps/documentation/distance-matrix/overview) (This is NOT free).\n\n### Command-line Interface\n\nBy default, the application runs on the commandline and outputs logs to `stdout`. It will poll in a loop and send updates after each run. The `processed_ids.db` file contains details of which listings have already been sent to the Telegram bot - if you delete that, it will be recreated, and you may receive duplicate listings.\n\n```\nusage: flathunt.py [-h] [--config CONFIG]\n\nSearches for flats on Immobilienscout24.de and wg-gesucht.de and sends results\nto Telegram User\n\noptional arguments:\n  -h, --help            show this help message and exit\n  --config CONFIG, -c CONFIG\n                        Config file to use. If not set, try to use\n                        '~git-clone-dir/config.yaml'\n  --heartbeat INTERVAL, -hb INTERVAL\n\t\t\tSet the interval time to receive heartbeat messages to check that the bot is\n                        alive. Accepted strings are \"hour\", \"day\", \"week\". Defaults to None.\n```\n\n### Web Interface\n\nYou can alternatively launch the web interface by running the `main.py` application:\n\n```\n$ python main.py\n```\n\nThis uses the same config file as the Command-line Interface, and launches a web page at [http://localhost:8080](http://localhost:8080).\n\nAlternatively, run the server directly with Flask:\n\n```\n$ FLASK_APP=flathunter.web flask run\n```\n\n### Docker\n\nYou can either use just Docker or Docker Compose to run the app containerized. We recommend Docker Compose for easier configuration.\n\n#### With Docker Compose\n\n1. Configure your `config.yaml` file (see [Configuration](#configuration)) or adjust the environment variables in the `docker-compose.yaml` file (see [Environment Configuration](#environment-configuration)). You can also combine both options, but in this case the environment variables have priority.\n2. To build the image, run inside the project's root directory:\n\n```sh\ndocker compose build\n```\n\n3. To run the docker container, run inside the project's root directory:\n\n```sh\ndocker compose up\n```\n\n#### With plain Docker\n\nFirst build the image inside the project's root directory:\n\n```sh\n$ docker build -t flathunter .\n```\n\n**When running a container using the image, a config file needs to be mounted on the container at `/config.yaml` or configuration has to be supplied using environment variables.** The example below provides the file `config.yaml` off the current working directory:\n\n```sh\n$ docker run --mount type=bind,source=$PWD/config.yaml,target=/config.yaml flathunter python flathunt.py -c /config.yaml\n```\n\n#### Environment Configuration\n\nTo make deployment with docker easier, most of the important configuration options can be set with environment variables. The current list of recognised variables includes:\n\n - FLATHUNTER_TARGET_URLS - a semicolon-separated list of URLs to crawl\n - FLATHUNTER_DATABASE_LOCATION - the location on disk of the sqlite database if required\n - FLATHUNTER_GOOGLE_CLOUD_PROJECT_ID - the Google Cloud Project ID, for Google Cloud deployments\n - FLATHUNTER_VERBOSE_LOG - set to any value to enable verbose logging\n - FLATHUNTER_LOOP_PERIOD_SECONDS - a number in seconds for the crawling interval\n - FLATHUNTER_RANDOM_JITTER_ENABLED - whether a random delay should be added to the crawling interval, truthy/falsy value expected\n - FLATHUNTER_MESSAGE_FORMAT - a format string for the notification messages, where `#CR#` will be replaced by newline\n - FLATHUNTER_NOTIFIERS - a comma-separated list of notifiers to enable (e.g. `telegram,mattermost,slack`)\n - FLATHUNTER_TELEGRAM_BOT_TOKEN - the token for the Telegram notifier\n - FLATHUNTER_TELEGRAM_RECEIVER_IDS - a comma-separated list of receiver IDs for Telegram notifications\n - FLATHUNTER_MATTERMOST_WEBHOOK_URL - the webhook URL for Mattermost notifications\n - FLATHUNTER_SLACK_WEBHOOK_URL - the webhook URL for Slack notifications\n - FLATHUNTER_WEBSITE_SESSION_KEY - the secret session key used to secure sessions for the flathunter website deployment\n - FLATHUNTER_WEBSITE_DOMAIN - the public domain of the flathunter website deployment\n - FLATHUNTER_2CAPTCHA_KEY - the API key for 2captcha\n - FLATHUNTER_IMAGETYPERZ_TOKEN - the API token for ImageTyperz\n - FLATHUNTER_IS24_COOKIE - set to the value of the reese84 immoscout cookie to help with bot detection\n - FLATHUNTER_HEADLESS_BROWSER - set to any value to configure Google Chrome to be launched in headless mode (necessary for Docker installations)\n - FLATHUNTER_FILTER_EXCLUDED_TITLES - a semicolon-separated list of words to filter out from matches\n - FLATHUNTER_FILTER_MIN_PRICE - the minimum price (integer euros)\n - FLATHUNTER_FILTER_MAX_PRICE - the maximum price (integer euros)\n - FLATHUNTER_FILTER_MIN_SIZE - the minimum size (integer square meters)\n - FLATHUNTER_FILTER_MAX_SIZE - the maximum size (integer square meters)\n - FLATHUNTER_FILTER_MIN_ROOMS - the minimum number of rooms (integer)\n - FLATHUNTER_FILTER_MAX_ROOMS - the maximum number of rooms (integer)\n - FLATHUNTER_FILTER_MAX_PRICE_PER_SQUARE - the maximum price per square meter (integer euros)\n\n### Google Cloud Deployment\n\nYou can run `Flathunter` on Google's App Engine, in the free tier, at no cost if you don't need captcha solving. If you need to solve captchas, you can use Google Cloud Run as described later. To get started, first install the [Google Cloud SDK](https://cloud.google.com/sdk/docs) on your machine, and run:\n\n```\n$ gcloud init\n```\n\nto setup the SDK. You will need to create a new cloud project (or connect to an existing project). The Flathunters organisation uses the `flathunters` project ID to deploy the application. If you need access to deploy to that project, contact the maintainers.\n\n```\n$ gcloud config set project flathunters\n```\n\nYou will need to provide the project ID to the configuration file `config.yaml` as value to the key `google_cloud_project_id` or in the `FLATHUNTER_GOOGLE_CLOUD_PROJECT_ID` environment variable.\n\nGoogle Cloud [doesn't currently support Pipfiles](https://stackoverflow.com/questions/58546089/does-google-app-engine-flex-support-pipfile). To work around this restriction, the `Pipfile` and `Pipfile.lock` have been added to `.gcloudignore`, and a `requirements.txt` file has been generated using `pip freeze`. \n\nIf the Pipfile has been updated, you will need to remove the line `pkg-resources==0.0.0` from `requirements.txt` for a successful deploy.\n\n#### Google App Engine Deployment\n\nTo deploy the app to Google App Engine, run:\n\n```\n$ gcloud app deploy\n```\n\nYour project will need to have the [Cloud Build API](https://console.developers.google.com/apis/api/cloudbuild.googleapis.com/overview) enabled, which requires it to be linked to a billing-enabled account. It also needs [Cloud Firestore API](https://console.cloud.google.com/apis/library/firestore.googleapis.com) to be enabled for the project. Firestore needs to be configured in [Native mode](https://cloud.google.com/datastore/docs/upgrade-to-firestore).\n\nInstead of running with a timer, the web interface depends on periodic calls to the `/hunt` URL to trigger searches (this avoids the need to have a long-running process in the on-demand compute environment). You can configure Google Cloud to automatically hit the URL by deploying the cron job:\n\n```\n$ gcloud app deploy cron.yaml\n```\n\n#### Google Cloud Run Deployment\n\nIf you need captcha support (for example to scrape Immoscout), you will need to deploy using [Google Cloud Run](https://cloud.google.com/run/), so that you can embed the Chrome browser and Selenium Webdriver in the docker image. A seperate `Dockerfile.gcloud.job` exists for this purpose.\n\nFirst, ensure that `requirements.txt` has been created (per [Google Cloud Deployment](#google-cloud-deployment)), then either run:\n\n```\ndocker build -t flathunter-job -f Dockerfile.gcloud.job .\n```\n\nto build the docker image locally, or edit the `cloudbuild.yaml` file to point to the container registry for your own Google Cloud Project, and run:\n\n```\ngcloud builds submit --region=europe-west1\n```\n\nto have [Google Cloud Build](https://cloud.google.com/build) build and tag the image for you.\n\nYou will need to create a new [Google Cloud Run Job](https://console.cloud.google.com/run/jobs) to execute the crawl/notify. The job should be configured with 1GB of memory and 1 CPU, and the environment variables to should be set appropriately.\n\nYou can trigger the job using [Google Cloud Scheduler](https://console.cloud.google.com/cloudscheduler), using an HTTP POST to:\n\n```\nhttps://[REGION]-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/[PROJECT_ID]/jobs/[JOB_NAME]:run\n```\n\nFor more information checkout [the Cloud Scheduler documentation](https://cloud.google.com/run/docs/execute/jobs-on-schedule).\n\nBecause the image uses Firestore to read details of user notification preferences and store crawled exposes, the job can run without any additional configuration. If you are hosting the webinterface somewhere on Google Cloud (either App Engine or Google Cloud Run), the job here will find the appropriate Firebase database.\n\n## Testing\n\nThe test suite can be run with `pytest`:\n\n```sh\n$ pytest\n```\n\nfrom the project root. If you encounter the error `ModuleNotFoundError: No module named 'flathunter'`, run:\n\n```sh\n$ pip install -e .\n```\n\nto make the current project visible to your pip environment.\n\n## Maintainers\n\nThis project is maintained by the members of the [Flat Hunters](https://github.com/flathunters) Github organisation, which is a collection of individual unpaid volunteers who have all had their own processes with flat-hunting in Germany. If you want to join, just ping one of us a message!\n\n## Credits\n\nThe original code was contributed by [@NodyHub](https://github.com/NodyHub), whose original idea this project was.\n\n### Contributers\n\nOther contributions were made along the way by:\n\n- Bene\n- [@tschuehly](https://github.com/tschuehly)\n- [@Cugu](https://github.com/Cugu)\n- [@GerRudi](https://github.com/GerRudi)\n- [@xMordax](https://github.com/xMordax)\n- [@codders](https://github.com/codders)\n- [@alexanderroidl](https://github.com/alexanderroidl)\n\n## Contributing\n\nIf you want to make a contribution, please check out the contributor code of conduct ([EN 🇬🇧](CODE_OF_CONDUCT.en.md)/[DE 🇩🇪](CODE_OF_CONDUCT.de.md)) first. Pull requests are very welcome, as are [issues](https://github.com/flathunters/flathunter/issues). If you file an issue, please include as much information as possible about how to reproduce the issue.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflathunters%2Fflathunter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflathunters%2Fflathunter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflathunters%2Fflathunter/lists"}