{"id":13550953,"url":"https://github.com/jacklul/pihole-updatelists","last_synced_at":"2025-05-14T15:10:09.883Z","repository":{"id":39913302,"uuid":"235402141","full_name":"jacklul/pihole-updatelists","owner":"jacklul","description":"Update Pi-hole's lists from remote sources easily","archived":false,"fork":false,"pushed_at":"2025-04-02T07:47:15.000Z","size":613,"stargazers_count":1523,"open_issues_count":0,"forks_count":84,"subscribers_count":35,"default_branch":"master","last_synced_at":"2025-04-12T01:51:52.088Z","etag":null,"topics":["customization","pi-hole","pi-hole-blocklists","pihole","pihole-blocklists","raspberry-pi"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jacklul.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,"zenodo":null}},"created_at":"2020-01-21T17:34:51.000Z","updated_at":"2025-04-12T01:43:03.000Z","dependencies_parsed_at":"2023-02-15T10:16:03.270Z","dependency_job_id":"2f8055b5-fbf6-4daa-8482-6f0381461ec0","html_url":"https://github.com/jacklul/pihole-updatelists","commit_stats":{"total_commits":305,"total_committers":7,"mean_commits":43.57142857142857,"dds":"0.032786885245901676","last_synced_commit":"752d78a7f5ee7c6d66deec05ad5d3d1d4f7439d5"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacklul%2Fpihole-updatelists","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacklul%2Fpihole-updatelists/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacklul%2Fpihole-updatelists/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jacklul%2Fpihole-updatelists/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jacklul","download_url":"https://codeload.github.com/jacklul/pihole-updatelists/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254170049,"owners_count":22026219,"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":["customization","pi-hole","pi-hole-blocklists","pihole","pihole-blocklists","raspberry-pi"],"created_at":"2024-08-01T12:01:40.197Z","updated_at":"2025-05-14T15:10:09.845Z","avatar_url":"https://github.com/jacklul.png","language":"PHP","funding_links":[],"categories":["PHP"],"sub_categories":[],"readme":"# Update Pi-hole's lists from remote sources\n\nWhen using remote lists like [this](https://v.firebog.net/hosts/lists.php?type=tick) it's a hassle to manually check for changes and update - this script will do that for you!\n\nUser-created entries will not be touched and those removed from the remote list will be disabled instead.\n\n\u003e [!WARNING]\n\u003e If you're not using remote lists like the ones mentioned above then this script will be useless to you - Pi-hole already updates the lists weekly automatically.\n\n## Requirements\n\n- **Pi-hole V6** installed (fresh install preferred)\n- **php-cli \u003e=7.0** and **a few extensions** (`filter pdo pdo_sqlite curl openssl intl pcntl posix`)\n- **systemd** is optional but recommended\n\nSometimes the base PHP package may already include certain extensions because each distribution package it differently.\n\n**PHP install commands for known distros/environments:**\n\nDebian: `apt install php-cli php-sqlite3 php-curl php-intl`  \nAlpine: `apk add php php-pdo_sqlite php-curl php-openssl php-intl php-pcntl php-posix`  \nArch: `pacman -S php php-sqlite`  \nFedora: `dnf install php-cli php-pdo php-intl php-process`  \nCentOS: `yum install php-cli php-pdo php-intl php-process`  \nEntware: `opkg install php8-cli php8-mod-filter php8-mod-pdo-sqlite php8-mod-curl php8-mod-openssl php8-mod-intl php8-mod-pcntl`  \n\n## Install\n\n\u003e [!NOTE]\n\u003e Docker users - [look below](#install-with-docker).\n\nThis command will install this script to `/usr/local/sbin`:\n\n```bash\nwget -O - https://raw.githubusercontent.com/jacklul/pihole-updatelists/master/install.sh | sudo bash\n```\n\n_Alternatively you can clone this repo and `sudo bash install.sh`._\n\nIf **systemd** is available this script will also add service and timer unit files to the system, otherwise a crontab entry in `/etc/cron.d/pihole-updatelists` will be created.\n\n\u003e [!NOTE]\n\u003e If for some reason the install script does not copy service and timer files while your distro has systemd scheduler available you can force the installation by passing `systemd` as a parameter to the install script - modifying the install command above with `sudo bash -s systemd` instead.\n\nNote that in most cases you will be able to execute this script globally as `pihole-updatelists` command but some will require you to add `/usr/local/sbin` to `$PATH` or execute it via `/usr/local/sbin/pihole-updatelists`.\n\n\u003e [!IMPORTANT]\n\u003e**This script does nothing by default (except running `pihole updateGravity`) - you have to [configure it](#configuration).**\n\n\u003e [!TIP]\n\u003e To quickly update the script run `sudo pihole-updatelists --update` which will check for script differences and re-run the install script when needed.\n\n### Disable default gravity update schedule\n\n\u003e [!TIP]\n\u003e If you don't plan on updating blocklists or want to keep Pi-hole's gravity update schedule you should skip this section and set `UPDATE_GRAVITY=false` in the configuration file.\n\nYou should disable entry with `pihole updateGravity` command in `/etc/cron.d/pihole` as this script already runs it:\n\n```bash\nsudo nano /etc/cron.d/pihole\n```\nPut a `#` before this line (numbers might be different):\n```\n#49 4   * * 7   root    PATH=\"$PATH:/usr/local/bin/\" pihole updateGravity \u003e/var/log/pihole_updateGravity.log || cat /var/log/pihole_updateGravity.log\n```\nAlternatively, the following `sed` command will disable the same entry:\n```bash\nsudo sed -e '/pihole updateGravity/ s/^#*/#/' -i /etc/cron.d/pihole\n```\n\n**You might have to do this manually after each Pi-hole update.**\n\n\u003e [!TIP]\n\u003e You can override `pihole-FTL.service` to disable the cron entry automatically after each update:\n\u003e \n\u003e ```bash\n\u003e sudo systemctl edit pihole-FTL.service\n\u003e ```\n\u003e ```\n\u003e [Service]\n\u003e ExecStartPre=-/bin/sh -c \"[ -w /etc/cron.d/pihole ] \u0026\u0026 /bin/sed -e '/pihole \u003e updateGravity/ s/^#*/#/' -i /etc/cron.d/pihole\"\n\u003e ```\n\n### Migrating lists and domains\n\nIf you already imported any of the remote lists manually you should migrate their entries to allow the script to disable them in case they are removed from the remote list.\n\nIf you used [pihole5-list-tool](https://github.com/jessedp/pihole5-list-tool) to import adlists and whitelist you can use these commands to do this quickly:\n```bash\nsudo sqlite3 /etc/pihole/gravity.db \"UPDATE adlist SET comment = 'Managed by pihole-updatelists' WHERE comment LIKE '%Firebog |%' OR comment LIKE '%[ph5lt]'\"\nsudo sqlite3 /etc/pihole/gravity.db \"UPDATE domainlist SET comment = 'Managed by pihole-updatelists' WHERE comment LIKE '%AndeepND |%' OR comment LIKE '%[ph5lt]'\"\n```\n_(code up to date as of pihole5-list-tool 0.6.0)_\n\nAlternatively, some manual work is required - pick one:\n\n- Manually modify comment field of all imported domains/adlists to match the one this script uses (see `COMMENT` variable in **Configuration** section) **(recommended but might be a lot of work)**\n- Manually delete all imported domains/adlists from the web interface (might be a lot of work)\n- Wipe all adlists and domains (not recommended but fast - use this if you want to start fresh)\n  - backup your lists and custom entries (write them down somewhere, do not use the Teleporter)\n  - run the following command:\n    ```bash\n    sudo pihole -g -r recreate\n    ```\n  - keep reading and configure the script then run `sudo pihole-updatelists` to finish up\n  - (only when `UPDATE_GRAVITY=false`) run `pihole updateGravity`\n\n## Install with Docker\n\nFollow the [official instructions](https://hub.docker.com/r/pihole/pihole/) but use `jacklul/pihole:latest` image instead, pass [configuration variables](#configuration) as environment variables in `docker-compose.yml`.\n\nIf you need to pull a specific version of Pi-hole image you have no other choice but to use [custom Dockerfile](#using-official-image).\n\n### Using custom image\n\nUse [`jacklul/pihole:latest`](https://hub.docker.com/r/jacklul/pihole) image instead of `pihole/pihole:latest`. [Version-specific tags](https://hub.docker.com/r/jacklul/pihole/tags) are also available but keep in mind they will contain version of the script that was available at the time of that particular version.\n\n### Using official image\n\nIf you don't want to use my image you can write custom `Dockerfile` based on the one in this repository:\n\n```\nFROM pihole/pihole:latest\n\nRUN apk add --no-cache php php-pdo_sqlite php-curl php-openssl php-intl php-pcntl php-posix\n\nRUN wget -O - https://raw.githubusercontent.com/jacklul/pihole-updatelists/master/install.sh | bash -s docker\n```\n\nThen build your image locally and use that image in your `docker-composer.yml` or launch command line.\nYou will have to update your local image manually each time update is released.\n\n### Container Configuration\n\nYour `docker-compose.yml` file should look similar to this:\n\n```yml\nversion: \"3\"\n\nservices:\n  pihole:\n    container_name: pihole\n    image: jacklul/pihole:latest\n    ports:\n      - \"53:53/tcp\"\n      - \"53:53/udp\"\n      - \"67:67/udp\"\n      - \"80:80/tcp\"\n    environment:\n      TZ: 'Europe/London'\n      # ... https://docs.pi-hole.net/docker/\n      #CRONTAB_STRING: '25 2 * * 6'\n      BLOCKLISTS_URL: 'https://v.firebog.net/hosts/lists.php?type=tick'\n      #ALLOWLISTS_URL: ''\n      #WHITELIST_URL: ''\n      #REGEX_WHITELIST_URL: ''\n      #BLACKLIST_URL: ''\n      REGEX_BLACKLIST_URL: 'https://raw.githubusercontent.com/mmotti/pihole-regex/master/regex.list'\n    volumes:\n      - './etc-pihole/:/etc/pihole/'\n      #- './etc-dnsmasq.d/:/etc/dnsmasq.d/'\n      # If you need advanced configuration create a mount to access the config file:\n      #- './etc-pihole-updatelists/:/etc/pihole-updatelists/'\n    cap_add:\n      - NET_ADMIN\n    restart: unless-stopped\n```\n_(for more up to date `docker-compose.yml` see [pi-hole/docker-pi-hole](https://github.com/pi-hole/docker-pi-hole/#quick-start))_\n\nIf you already have existing `gravity.db` you should also check out [Migrating lists and domains](#migrating-lists-and-domains) section, keep in mind that you will have to adjust paths in the commands mentioned there.\n\n## Configuration\n\nDefault configuration file is `/etc/pihole-updatelists.conf`.\n\n```bash\nsudo nano /etc/pihole-updatelists.conf\n```\n\n### Available variables\n\n| Variable | Default | Description |\n|----------|---------|-------------|\n| BLOCKLISTS_URL | \" \" | Remote list URL containing list of blocklists to import \u003cbr\u003e**URLs to single lists should be added manually** |\n| ALLOWLISTS_URL | \" \" | Remote list URL containing list of allowlists to import \u003cbr\u003e**URLs to single lists should be added manually** |\n| WHITELIST_URL | \" \" | Remote list URL containing exact domains to whitelist \u003cbr\u003e**This is specifically for handcrafted lists only, do not use regular allowlists here!** |\n| REGEX_WHITELIST_URL | \" \" | Remote list URL containing regex rules for whitelisting |\n| BLACKLIST_URL | \" \" | Remote list URL containing exact domains to blacklist \u003cbr\u003e**This is specifically for handcrafted lists only, do not use regular blocklists here!** |\n| REGEX_BLACKLIST_URL | \" \" | Remote list URL containing regex rules for blacklisting |\n| COMMENT | \"Managed by pihole-updatelists\" | Comment string used to know which entries were created by the script \u003cbr\u003e**You can still add your own comments to individual entries as long you keep this string intact** |\n| GROUP_ID | 0 | Assign additional group to all inserted entries, to assign only the specified group (do not add to the default) make the number negative \u003cbr\u003e`0` is the default group, you can view ID of the group in Pi-hole's web interface by hovering mouse cursor over group name field on the 'Group management' page \u003cbr\u003e**Multiple groups are not supported** |\n| PERSISTENT_GROUP | true | Makes sure entries have the specified group assigned on each script run \u003cbr\u003eThis does not prevent you from assigning more groups through the web interface but can remove entries from the default group if GROUP_ID is a negative number \u003cbr\u003e**When disabled but an entry has no groups assigned and is about to be enabled then it will be re-added to the groups it's supposed to be in** \u003cbr\u003e**WARNING: This option might be buggy when running multiple different configurations with same lists** |\n| REQUIRE_COMMENT | true | Prevent touching entries not created by this script by comparing comment field \u003cbr\u003eWhen `false` any user-created entry will be disabled, only those created by the script will be active |\n| MIGRATION_MODE | 1 | Decides how to migrate disabled entries from another config sections \u003cbr\u003e1 - replace comment field \u003cbr\u003e2 - append to comment field \u003cbr\u003e0 - disables migration, entry will be ignored\n| GROUP_EXCLUSIVE | false | Causes defined group in `GROUP_ID` to contain one defined list exclusively - only entries from the last list inserted will be enabled \u003cbr\u003e**This option is experimental**\n| UPDATE_GRAVITY | true | Update gravity after lists are updated? (runs `pihole updateGravity`) \u003cbr\u003eWhen `false` invokes lists reload instead \u003cbr\u003eSet to `null` to do nothing |\n| VERBOSE | false | Show more information while the script is running |\n| DEBUG | false | Show debug messages for troubleshooting purposes \u003cbr\u003e**If you're having issues - this might help tracking it down** |\n| DOWNLOAD_TIMEOUT | 60 | Maximum time in seconds one list download can take before giving up \u003cbr\u003eYou should increase this when downloads fail because of timeout |\n| IGNORE_DOWNLOAD_FAILURE | false | Ignore download failures when using multiple lists \u003cbr\u003e **This will cause entries from the lists that failed to download to be disabled** |\n| GRAVITY_DB | \"/etc/pihole/gravity.db\" | Path to `gravity.db` in case you need to change it |\n| LOCK_FILE | \"/var/lock/pihole-updatelists.lock\" | Process lockfile to prevent multiple instances of the script from running \u003cbr\u003e**You shouldn't change it - unless `/var/lock` is unavailable** |\n| LOG_FILE | \" \" | Log console output to file \u003cbr\u003eIn most cases you don't have to set this as you can view full log in the system journal \u003cbr\u003ePut `-` before path to overwrite file instead of appending to it |\n| PIHOLE_CMD | \"/usr/local/bin/pihole\" | Path to `pihole` script, \u003cbr\u003eChange this only if it isn't in the default location |\n| GIT_BRANCH | \"master\" | Branch to pull remote checksum and update from |\n\n\u003e [!NOTE]\n\u003e String values should be put between `\" \"`, otherwise weird things might happen.\n\n\u003e [!TIP]\n\u003e You can also give paths to the local files instead of URLs, for example setting `WHITELIST_URL` to `/home/pi/whitelist.txt` will fetch this file from filesystem.\n\n### Environment variables\n\nIt is also possible to load configuration variables from the environment by using `--env` parameter - this will overwrite values in default section of the config file.\n\n\u003e [!IMPORTANT]\n\u003e Some variables will have to be prefixed with `PHUL_` for compatibility:\n\u003e ```\n\u003e CONFIG_FILE, GRAVITY_DB, LOCK_FILE, PIHOLE_CMD, LOG_FILE, VERBOSE, DEBUG, GIT_BRANCH\n\u003e ```\n\n### Multiple configurations\n\nYou can specify alternative config file by passing the path to the script through `config` parameter: `pihole-updatelists --config=/home/pi/pihole-updatelists2.conf` - this combined with different `COMMENT` string can allow multiple script configurations for the same Pi-hole instance.\n\n**A more advanced way is to use sections in the configuration file:**\n\n\u003e [!WARNING]\n\u003e This method can sometimes be buggy or have weird behaviors when using lists that have shared entries!\n\n```\n(bottom of the file)\n\n[GroupA_adlists]\nWHITELIST_URL=\"https://raw.githubusercontent.com/you/adlists/master/my_whitelist1.txt\"\nGROUP_ID=-1\nCOMMENT=\"pihole-updatelists - whitelist1\"\n\n[GroupB_adlists]\nWHITELIST_URL=\"https://raw.githubusercontent.com/you/adlists/master/my_whitelist2.txt\"\nGROUP_ID=-2\nCOMMENT=\"pihole-updatelists - whitelist2\"\n```\n\nConfigurations where one of the lists contains entries from the other are not officially supported but may work:\n\n```\n; When one of the lists contains entries from the other\n; it's best to have it defined after the other one\n\n; Group with ID=1 will use 'tick' list of adlists\n[GroupA_adlists]\nBLOCKLISTS_URL=\"https://v.firebog.net/hosts/lists.php?type=tick\"\nGROUP_ID=-1\nCOMMENT=\"pihole-updatelists - firebog (tick)\"\n\n; Group with ID=2 will use 'nocross' list of adlists\n[GroupB_adlists]\nBLOCKLISTS_URL=\"https://v.firebog.net/hosts/lists.php?type=nocross\"\nGROUP_ID=-2\nCOMMENT=\"pihole-updatelists - firebog (nocross)\"\n```\n\n\u003e [!IMPORTANT]\n\u003e You will want to have a different `COMMENT` value in each section, they have to be unique and one must not match the other!\n\nMain configuration (the one without section header) is processed first, then the sections in the order of their appearance.\n\n\u003e [!IMPORTANT]\n\u003e You can only use selected variables in sections:\n\u003e ```\n\u003e BLOCKLISTS_URL, ALLOWLISTS_URL, WHITELIST_URL, REGEX_WHITELIST_URL, BLACKLIST_URL, REGEX_BLACKLIST_URL, COMMENT, GROUP_ID, PERSISTENT_GROUP, GROUP_EXCLUSIVE, IGNORE_DOWNLOAD_FAILURE\n\u003e ```\n\n### Multiple list URLs\n\nYou can pass multiple URLs to the list variables by separating them with whitespace (space or new line):\n\n```bash\nBLOCKLISTS_URL=\"https://v.firebog.net/hosts/lists.php?type=tick https://raw.githubusercontent.com/you/adlists/master/my_adlists.txt\"\n```\n\nIf one of the lists fails to download nothing will be affected for that list type.\n\n### Recommended lists\n\n| List | URL/Variable value | Description |\n|----------|-------------|-------------|\n| Blocklists\u003cbr\u003e(BLOCKLISTS_URL) | https://v.firebog.net/hosts/lists.php?type=tick | https://firebog.net - safe lists only |\n| Regex blacklist\u003cbr\u003e(REGEX_BLACKLIST_URL) | https://raw.githubusercontent.com/mmotti/pihole-regex/master/regex.list | https://github.com/mmotti/pihole-regex - basic regex rules |\n\nPlease note that [mmotti/pihole-regex](https://github.com/mmotti/pihole-regex) list can sometimes block domains that should not be blocked - any false positives should be [reported to the repository](https://github.com/mmotti/pihole-regex/issues) to be included in the [whitelist](https://github.com/mmotti/pihole-regex/blob/master/whitelist.list) - in that case you might consider adding that list to allowlists through Pi-hole's interface.\n\n## Extra information\n\n### Runtime options\n\nThese can be used when executing `pihole-updatelists`.\n\n| Option | Description |\n|----------|-------------|\n| `--help, -h` | Show help message, which is simply this list |\n| `--no-gravity, -n` | Force gravity update to be skipped |\n| `--no-reload, -b` | Force lists reload to be skipped\u003cbr\u003eOnly if gravity update is disabled either by configuration (`UPDATE_GRAVITY=false`) or `--no-gravity` parameter |\n| `--verbose, -v` | Turn on verbose mode |\n| `--debug, -d`  | Turn on debug mode |\n| `--config=\u003cfile\u003e` | Load alternative configuration file |\n| `--env, -e` | Load configuration from environment variables |\n| `--git-branch=\u003cbranch\u003e` | Select git branch to pull remote checksum and update from \u003cbr\u003eCan only be used with `--update` and `--version` |\n| `--update` | Update the script using selected git branch |\n| `--rollback` | Rollback script version to previous |\n| `--force` | Force update without checking for newest version |\n| `--yes, -y` | Automatically reply YES to all questions |\n| `--version `| Show script checksum (and also if update is available) |\n\n### Changing the schedule\n\nBy default, the script runs at random time (between 03:00 and 04:00) on Saturday, to change it you'll have to override [timer unit](https://www.freedesktop.org/software/systemd/man/systemd.timer.html) file:\n\n```bash\nsudo systemctl edit pihole-updatelists.timer\n```\n```\n[Timer]\nRandomizedDelaySec=5m\nOnCalendar=\nOnCalendar=Sat *-*-* 00:00:00\n```\n\nIf systemd is not available you just modify the crontab entry in `/etc/cron.d/pihole-updatelists`:\n\n```bash\n14 6 * * 6   root   /usr/local/sbin/pihole-updatelists\n```\n\nWhen using Docker - set `CRONTAB_STRING` environment variable to desired schedule string then restart the container.\n\n### Running custom commands before/after scheduled run\n\nOverride [service unit](https://www.freedesktop.org/software/systemd/man/systemd.service.html) file:\n\n```bash\nsudo systemctl edit pihole-updatelists.service\n```\n```\n[Service]\nType=oneshot\nExecStartPre=echo \"before\"\nExecStartPost=echo \"after\"\n```\n\nIf systemd is not available you just modify the crontab entry in `/etc/cron.d/pihole-updatelists`:\n\n```bash\n30 3 * * 6   root   /home/pi/before.sh \u0026\u0026 /usr/local/sbin/pihole-updatelists \u0026\u0026 /home/pi/after.sh\n```\n\n\u003e [!TIP]\n\u003e You can use `;` instead of `\u0026\u0026` if you don't want the execution to stop on previous command failure.\n\n### Changing comment value after running the script\n\n```bash\nsudo sqlite3 /etc/pihole/gravity.db \"UPDATE adlist SET comment = 'NEWCOMMENT' WHERE comment LIKE '%Managed by pihole-updatelists%'\"\nsudo sqlite3 /etc/pihole/gravity.db \"UPDATE domainlist SET comment = 'NEWCOMMENT' WHERE comment LIKE '%Managed by pihole-updatelists%'\"\n```\n\nReplace `NEWCOMMENT` with your new desired comment value. This assumes `Managed by pihole-updatelists` is the old comment value, replace it with your old custom value when needed.\n\n### Custom comments for entries\n\nIf you wish to add custom comments to entries you can use the following file syntax:\n\n```\nexample-domain.com # your comment\n```\n\nWhich will cause `example-domain.com` to have `comment` set to `your comment | Managed by pihole-updatelists`.\n\nYou can also add your comments directly through the Pi-hole's web interface by either appending or prepending the comment field for entries.\n\n### Uninstalling\n\n```bash\nwget -O - https://raw.githubusercontent.com/jacklul/pihole-updatelists/master/install.sh | sudo bash -s uninstall\n```\n\nor remove files manually:\n\n```bash\nsudo rm -vf /usr/local/sbin/pihole-updatelists /etc/bash_completion.d/pihole-updatelists /etc/systemd/system/pihole-updatelists.service /etc/systemd/system/pihole-updatelists.timer /etc/cron.d/pihole-updatelists\n```\n\n## License\n\n[MIT License](/LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacklul%2Fpihole-updatelists","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjacklul%2Fpihole-updatelists","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjacklul%2Fpihole-updatelists/lists"}