DEV Community

Cover image for Multi Shelter Manager: an open-source, multi-tenant app for animal shelters, with Laravel 13, Livewire and a one-click demo
Ze Horta
Ze Horta

Posted on

Multi Shelter Manager: an open-source, multi-tenant app for animal shelters, with Laravel 13, Livewire and a one-click demo

Small animal shelters usually run on spreadsheets, paper cards and WhatsApp groups. Vaccination dates get lost, nobody knows which cage a dog is in, and adoption requests arrive as Instagram DMs.

Multi Shelter Manager is a free, MIT-licensed web app that replaces all of that. Several shelters share one installation, each fully isolated, and it already runs three real shelters, from the Azores to Lisbon and Porto. It's made in Portugal with Laravel 13 and Livewire.

👉 Try it now: https://demo.focinhos.pt (one click, no sign-up, you get your own sandbox shelter)

Code: https://github.com/zhoorta/multi-shelter-manager

Dashboard

What it does

  • Pets: identification, microchip, health, photos, and a status (available / adopted / ...) worked out automatically.
  • Facilities → wings → cages: model the physical space, see occupancy, and always know where every animal is.
  • Vaccinations and treatments with due dates and daily e-mail reminders.
  • Adoptions, sponsorships, volunteers, members and their fees.
  • Foster families and cat colonies (CED/CER programmes).
  • Reports for managers, with printable yearly activity report.
  • Public adoption portal with filters and an application form.
  • 10 languages and light/dark mode.

The interesting parts, technically

Multi-tenancy by shelter_id. One database, one install, any number of shelters. Every shelter-owned table carries a shelter_id, and a trait scopes queries so a shelter can never see another's data. Users can belong to several shelters with a different role in each (admin, manager, staff, viewer).

Livewire + Flux UI + Tailwind. Classic split components (class plus Blade view), no JavaScript framework. Tables, modals and forms come from Flux, so the UI stays consistent with very little custom CSS.

Auditing for free. A Blameable trait fills created_by, updated_by and deleted_by on the core models, which matters when volunteers and staff share an account of what happened to an animal.

Ten languages from day one. All UI strings go through __() with a JSON file per locale. Retrofitting this later is painful; doing it from the start was cheap.

A public demo that costs almost nothing. People should be able to try it without installing anything, but a shared demo database turns into a mess in minutes. So in DEMO_MODE every visitor gets a throwaway shelter cloned from a template, and a demo:prune command (every 10 minutes) deletes old ones. It runs in a single FrankenPHP container with SQLite on a RAM-backed volume, behind nginx on a small server. A restart wipes everything and re-seeds in about a minute. The one rule to remember: every new shelter-owned table must be added to the sandbox's table list, or it won't be copied or cleaned up.

Why open source

Shelters have no budget for software, and each country has a handful of tools that are either paid per animal or abandoned. This is a cause project, not a business: if it helps another shelter, great. If you run one, or know someone who does, the README has a quick start, and the docs folder has a step-by-step guide with screenshots.

Feedback welcome

Feedback is very welcome, from other Laravel developers (what would you do differently in the tenancy layer?), and from anyone who works with shelters (what's missing?). Issues and PRs are open.

Top comments (0)