Skip to content

Repository files navigation

CARE Project - Cyprus Animals Rescue Effort

License: MIT Build Status

A 100% volunteer-run dog rescue platform helping stray and shelter-bound dogs across Cyprus find loving homes.

careproject.cy | UANA Foundation

CARE Project

About

CARE Project is the adoption platform for UANA Foundation, a registered nonprofit in Cyprus. We rescue stray dogs, cover their veterinary care, rehabilitate and socialize them, and coordinate adoptions locally and internationally to the UK, Germany, and the Netherlands.

100% volunteer. No paid staff. Every euro goes to the animals.

Why Open Source

Every rescue organization deserves a modern adoption platform. Most operate through social media DMs and spreadsheets. We built this site for CARE Project and are open-sourcing it so any animal rescue can fork it, add their animals, and deploy for free.

Tech Stack

Features

  • Dog profile pages with photos, breed, age, and adoption status
  • Adoption listings filtered by availability
  • Success stories gallery
  • Markdown-powered blog with Cyprus-specific pet care content
  • Static pages (About, Adopt, Foster, Donate, Get Involved)
  • SEO-optimized with sitemap generation
  • Social sharing (Open Graph, Twitter cards)
  • Responsive design
  • Ahrefs analytics integration

Getting Started

Prerequisites

  • Node.js 18+
  • npm

Installation

git clone https://github.com/careproject-cy/platform.git
cd platform
npm install

Configuration

Copy .env.example to .env and fill in a Postgres connection string and a Payload secret. Without S3_BUCKET set, image uploads fall back to local disk, which is fine for development.

cp .env.example .env
npm run migrate

Running your own instance needs a Postgres database (Neon's free tier is enough) and, for uploaded images, an S3 bucket. Set S3_PUBLIC_BASE_URL to the public URL your images are served from (e.g. a CloudFront or bucket URL) and next/image will allow that host automatically. DATABASE_URL is required at build time, not just at runtime, because pages are prerendered.

Development

npm run dev

Open http://localhost:3000 in your browser. The admin panel is at /admin - the first visit prompts you to create an admin account.

Content

Dog profiles and blog posts are managed in the CMS at /admin and publish without a deploy. Their body text is Markdown, rendered through Markdoc. Static pages remain Markdown files in data/pages/.

The legacy Markdown in data/dogs/ and data/blog/ is kept as the migration source; import it once with:

npm run import-content

Deploying

Builds do not run database migrations. Schema changes are applied deliberately, so that a preview build of an unmerged branch can never alter the production database and a rolled-back deploy never leaves an un-rolled-back schema behind.

When a change adds or alters a collection field:

npm run migrate:create <name>   # generate the migration, commit it
npm run migrate                 # apply it locally

Then, before merging to main, apply it to production with DATABASE_URL pointing at the production database, and confirm with npm run migrate:status that every migration reads Ran: Yes. Deploy after that, never before - the new code expects the new schema.

Migrations read .env (not .env.local), because that is what the Payload CLI loads.

Backups

.github/workflows/db-backup.yml runs pg_dump daily (03:00 UTC) and uploads a gzipped dump to S3, keeping 30 days. A dump contains password hashes and all content, so it must not go in the media bucket - that bucket is served publicly through CloudFront. Use a separate private bucket:

  1. Create an S3 bucket with Block Public Access on and no CloudFront distribution.
  2. Create an IAM user scoped to s3:PutObject, s3:GetObject, s3:DeleteObject, s3:ListBucket on that bucket only.
  3. Add these GitHub repository secrets (Settings -> Secrets and variables -> Actions): BACKUP_DATABASE_URL (Neon's unpooled connection string), BACKUP_S3_BUCKET, BACKUP_S3_REGION, BACKUP_S3_ACCESS_KEY_ID, BACKUP_S3_SECRET_ACCESS_KEY.

Run it on demand from the Actions tab ("Run workflow"). Restore with gunzip -c dump.sql.gz | psql "$DATABASE_URL" against a fresh database.

Build

npm run build

Project Structure

careproject/
  app/
    (frontend)/       # The public website
      blog/           # Blog pages
      dogs/           # Dog profile pages
      more/           # Static pages (adopt, foster, donate, etc.)
    (payload)/        # CMS admin panel and REST API
    components/       # React components (header, footer, dog cards, etc.)
    data/             # Constants and data fetching utilities
  collections/        # Payload collections (dogs, posts, media, users)
  payload.config.ts   # CMS configuration
  data/
    dogs/             # Legacy dog Markdown, kept as the migration source
    blog/             # Legacy blog Markdown, kept as the migration source
    pages/            # Static page content as Markdown
  public/             # Static assets (logos, images)
  lib/                # Content import and generation scripts

UANA Foundation

CARE Project operates under UANA Foundation, a registered Cyprus nonprofit (HE 442538) that supports animal rescuers across the island. UANA also runs:

  • Shelter Support: Financial aid to municipal pounds and private rescue centers
  • Emergency Foster Program: Temporary pet care for owners facing illness, unemployment, or domestic violence
  • Volunteer Coordination: Organizing shelter visits, dog walks, and care activities

Contact: info@uanafoundation.com

Contributing

We welcome contributions! Whether you're a developer, designer, or animal welfare advocate:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/your-feature)
  3. Make your changes
  4. Run linting and type checks (npm run lint && npm run typecheck)
  5. Commit your changes
  6. Push to the branch (git push origin feature/your-feature)
  7. Open a Pull Request

Social

License

MIT

About

100% volunteer-run dog rescue platform for Cyprus. Adoption listings, success stories, blog. Built with Next.js 16, VaneUI, Markdoc, and Tailwind CSS v4. Deployed on Vercel.

Topics

Resources

Contributing

Stars

3 stars

Watchers

1 watching

Forks

Contributors

Languages