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
- Live demo: https://www.gihoe.site
- Backend GitHub: https://github.com/GCU-Second-Chance/SecondChance-Global-backend
- Frontend GitHub: https://github.com/GCU-Second-Chance/SecondChance-Global-frontend
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
- argo-cd
- gcp
- gemini
- go
- google-cloud
- javascript
- next.js
- react
- tailwindcss
- typescript
Log in or sign up for Devpost to join the conversation.