diff --git a/content/post/checking-shelters/index.md b/content/post/checking-shelters/index.md new file mode 100644 index 0000000..f5b0091 --- /dev/null +++ b/content/post/checking-shelters/index.md @@ -0,0 +1,112 @@ +--- +title: "How to manually check hundreds of animal shelters - every 14 days" +date: 2025-11-03T12:05:10+02:00 +lastmod: 2025-11-03T16:05:10+02:00 +draft: false +image: "uploads/animal-shelters.png" +categories: [ 'English' ] +tags: [ 'notfellchen', 'animal shelter', 'animal welfare', 'django' ] +--- + +I run a website called [Notfellchen](https://notfellchen.org) that list animals that are waiting for adoption. It's +currently restricted to fancy rats in Germany and that for good reason: Running this website involves **checking every +shelter every two weeks manually**. You need to visit the website, check if there are new animals, contact the shelter +and add them to notfellchen if they allow it. This takes time. A lot. Here is how the process works in detail and how I +reduced it to a manageable effort. + +## General process + +Here is how the general process looks + +{{< html animal-discovery.drawio.html >}} + +## List of animal shelters + +Focusing on the first step: We want to check the website of an animal shelter - but where do we get a list of animal +shelters from? Luckily there is an easy answer: [OpenStreetMap](https://openstreetmap.org) and I wrote a +whole [other blog post on how I imported and improved this data](https://hyteck.de/post/improve-osm-by-using-it/). + +## Species-specific link + +Importing this data provides us (most of the time) with a link to the shelter's website. However, rats are usually not +listed on the home page but on a subsite. +In order to save time, I introduced the concept of a species-specific link per organization and species. + +So for the Tierheim Entenhausen this might look like this + +| Species | Species specific link | +|---------|--------------------------------------------------------| +| Cat | https://tierheim-entenhausen.de/adoption/cats | +| Rats | https://tierheim-entenhausen.de/adoption/small-mammals | + +As animal shelter pages look very different from each other, clicking this link provides an enormous time benefit +compared to clicking through a homepage manually. + +# Org check page + +I set up a special page to make it most efficient to check shelters. It's structured in four parts: + +* **Stats**: The stats show how many animal shelters are checked in the last two weeks and how many to go. +* **Not checked for the longest period**: Shows the animal shelters to check next, it's therefore sorted by the date + they were last checked +* **In active communication**: A overview of the organizations where there is communication (or an attempt thereof). + This can take multiple das or even weeks so the internal comment field is very useful to keep track. +* **Last checked** It sometimes happens that I accidentally set a organization to "Checked" by accident. I added this + section to make it easier to revert that. + +![](screenshot-checking-site.png) + +## Shortcuts + +To make it even faster to work through the organizations I added some shortcuts for the most common functionality and +documented the browser own shortcut to close a tab. + +* `O`: Open website of the first organization +* `CTRL+W`: Close tab (Firefox, Chrome) +* `C`: Mark first organization as checked + +## Results + +After implementing all this, how long does it take now to check all organizations? Here are the numbers + +| Measurement | | +|-----------------------------------------------------------|--------------| +| Time to check one organization (avg.) | 12.1s | +| Organization checked per minute | 4.96 org/min | +| Time to check all (eligible) german animal shelters (429) | 1 h 16 min | + +This excludes the time, it takes to add animals or contact rescue organizations. One of these actions must be taken +whenever an eligible animal is found on a website. Here you can see how this interrupts the process: + +![](progress.png) + +And here is the breakdown of time per activity. A big caveat here is, that I did not follow up on previous conversations +here, therefore the contacting number is likely an underestimation. + +| Activity | Time spent | Percentage | +|------------|------------|------------| +| Checking | 54 min 44s | 72.3% | +| Adding | 11 min 15s | 14.9% | +| Contacting | 9min 41s | 12.8% | + +To me, this looks like a pretty good result. I can't say which optimizations brought how much improvement, but I'd argue +they all play a role in reaching the 12s per rescue organizations that is checked. + +In order to check all german animal shelters, one needs to put in about 2 and a half hours every two weeks. That seems +reasonable to me. Further improvements of the likely do not lie in the organization check page but the contact process +and adoption notice form. + +For now, I'm happy with the results. + +# Addendum: Common annoyances + +When doing this over the last few months I encountered some recurring issues that not only were annoying but also take +up a majority of the time. Here are some that stood out + +* **Broken SSL encryption** So many animal shelters do not have a functioning SSL certificate. It takes time to work + around the warnings. +* **No results not indicated** More often than not, animal shelters do not have rats. However, when you visit a page + like [this](https://tierschutzliga.de/tierheime/tierparadies-oberdinger-moos/tiervermittlung/#?THM=TOM&Tierart=Kleintiere) + it's hard to know if there is a technical issue or if there are no animals for your search. +* **No static links** Sites where you have to click through a menu to get to the right page, but you can not link + directly to it. diff --git a/content/post/checking-shelters/progress.png b/content/post/checking-shelters/progress.png new file mode 100644 index 0000000..0f6a9dd Binary files /dev/null and b/content/post/checking-shelters/progress.png differ diff --git a/content/post/checking-shelters/screenshot-checking-site.png b/content/post/checking-shelters/screenshot-checking-site.png new file mode 100644 index 0000000..3f5cd42 Binary files /dev/null and b/content/post/checking-shelters/screenshot-checking-site.png differ