Inspiration

In 2025, over 200M+ stray and shelter dogs are waiting for homes—yet many face barriers to cross-border adoption (language, trust, logistics, and visibility). We asked a simple question:

What if every social post could become a path to a forever home?

Korea’s vibrant photo-taking & sharing culture inspired a photo challenge that spreads stories of adoptable dogs globally. The entry point is intentionally light: snap → frame → share → scan. From there, prospective adopters land on a clear, trustworthy detail page.


What it does

  • Photo Challenge (client-only, privacy-first): Take a picture, pick a frame, add a short quote (“Fortune of the day”), and share. We don’t store user photos; previews live only on the device.
  • Viral-ready sharing: One tap exports a shareable image + QR that deep-links to the dog’s detail page.
  • Meet Your Match: Swipe through adoptable dogs with clear traits (age, sex, breed mix, size, location).
  • Localized guidance: Auto-translate key info and show cross-border adoption primers (fees, documents, travel).
  • For rescues: Low-friction listings and global visibility via QR and share flows.

How we built it

  • Frontend: React + Next.js (App Router), TypeScript, Tailwind CSS

    • Client-only image composition (canvas/html-to-image), safe memory handling, and no server uploads by design.
    • QR generation on the client for deep links.
  • State & data: Lightweight state (Zustand/Context). Listings fetched from public rescue APIs (e.g., Petfinder).

  • i18n & accessibility: Token-based copy (EN/KR first), alt text, focus order, and keyboard paths.

  • Testing: Playwright for core flows (choose frame → preview → export → scan deep link).

  • Deployment: Vercel (edge-friendly routes, CDN).

  • Analytics (opt-in): Minimal, anonymized events (e.g., share/scan) to estimate funnel conversion.

Security/Privacy principles:

  • No photo uploads to our servers.
  • No persistent PII by default.
  • Dog data cached ephemerally; follow source usage guidelines.

Challenges we ran into

  • Privacy vs. delight: Achieving crisp, framed images with quotes without uploading required careful client-side rendering (DPR handling, padding so ears don’t get cropped, font fallbacks).
  • International details: Cross-border adoption varies (fees, quarantine, transport). We distilled this into plain-language guides and surfaced them contextually.
  • Content freshness: Rescue inventories change quickly. We built defensive UI states (placeholder art, graceful fallbacks, “Photo unavailable” variant) to avoid dead ends.
  • Names & breeds: Many dogs are mixed or mislabeled; we emphasize personality and care notes over strict breed identity.

What we learned

  • Friction kills sharing. Every removed step boosts spread.
  • Client-side image pipelines can be production-grade if you budget for fonts, DPR, and memory.
  • Explain the “why.” Short, trustworthy primers reduce the cognitive load of international adoption.
  • Small copy changes matter. “Share a frame, change a fate” outperformed generic CTAs in our tests.

Results & impact (early)

Let ( S ) be shares, ( r ) the scan rate per share, ( c ) the contact rate per scan, and ( a ) the adoption rate per contact. Expected adoptions: Even modest improvements in any factor (e.g., clearer CTA → higher ( r )) compound across the funnel.


Built with


“Try it out” links


What’s next

  • Deeper rescue integrations (Australia, Taiwan, etc.) with mapped attributes and attribution.
  • Sharepack variants (portrait/square, dark/light, festival themes).
  • In-app translation memory for consistent terminology.
  • Shelter dashboard for easy listing refresh and QR print kits.
  • Impact measurement (privacy-preserving): scans → contacts → outcomes via opt-in rescue feedback.

Built With

Share this project:

Updates