// PROJECT_

Bumerán

React Native

01. LIVE_DEMO

// DEMO
LIVE

// LIVE PREVIEW

Bumerán

VISIT_SITE

02. PROJECT_OVERVIEW

Born from a real observation: in any neighborhood, one person's unused drill is another person's weekend-saver, and skills like language tutoring or furniture assembly are sitting idle just a few blocks away. But there's no local platform built around this — Facebook groups are noisy, Marketplace is for selling, and no one reads community boards. Boomerang fixes that. The tagline says it all: "Lo que das, vuelve" — what you give, comes back. The app opens with a single question: do you need help, or do you want to give it? That answer shapes the entire feed. Posts come in three types — necesito (I need something), ofrezco (I'm offering help), and regalo (I'm giving something away for free) — and each intention maps to complementary content. Someone who says 'I need help' only sees offers and gifts; someone who wants to help only sees requests. No noise. From there, a GPS-filtered map and a swipeable bottom sheet list show available posts nearby. Users can search by keyword, filter by 13 categories (tools, gardening, pets, transport, moving, languages, cleaning, paperwork, repairs, assembly, tech, urgent, and more), filter by type, and save favorites. Posts have a configurable expiration so the feed stays fresh. Connecting to a post triggers a safety modal with real-world safety tips before redirecting to WhatsApp — because location is only shared in chat once both parties agree. The connection then enters a full lifecycle: pending → accepted → completed (or cancelled), all tracked in the Connections screen with separate tabs for received and sent requests. A review system lets neighbors rate each other after a completed exchange, building local reputation over time. Built in Spanish, English and German (ES/EN/DE) from day one via expo-localization. Authentication via Google Sign-In — an OAuth 2.0 ID token sent to the NestJS backend for verification and user creation. Backend on NestJS 11 with Prisma and PostgreSQL, deployed on Railway. Solo project under Dual-Stack Studio, currently in active development. Built with Claude Sonnet 4.6 (Anthropic) as an engineering partner throughout — architecture, API design, navigation flows, i18n strategy and component structure.

Status

Active Development

Scope

Full-Stack Architecture

Primary Stack

React Native

Repo

Public

03. TECH_STACK & ARCHITECTURE

//Team project under Dual-Stack Studio — in active development, targeting Android first with EAS Build

//Co-developed with Claude Sonnet 4.6 (Anthropic) — pairing partner from architecture through feature implementation

//WelcomeScreen intent gate: 'necesito' → shows ofrezco+regalo feed; 'ofrezco' → shows necesito feed only

//Map + bottom sheet (20/45/85% snap) — color-coded pins per tipo, Haversine distance computed client-side for sort

//Contact flow: safety modal → WhatsApp redirect → connection created (pendiente → aceptada → completada/cancelada)

//Exact GPS location never shown publicly — only shared in WhatsApp chat once both parties agree

//NestJS modular: Auth, Favores, Conexiones, Reviews, Verificacion — ValidationPipe rejects unknown DTO fields globally

//Google Sign-In: ID token → google-auth-library verify → User upsert → custom JWT issued

React Native 0.85 + Expo SDK 56

Frontend — Mobile Framework

Cross-platform iOS/Android from a single TypeScript codebase. Expo managed workflow with expo-dev-client for native module support. EAS Build will generate signed APKs for distribution once the feature set is stable.

NativeWind (Tailwind CSS)

Frontend — Styling

Tailwind utility classes applied directly to React Native components via NativeWind. Consistent design tokens across the whole app — no StyleSheet juggling for layout and spacing.

react-native-maps + expo-location

Frontend — Maps & GPS

Full-screen MapView with color-coded pins per post type (orange = necesito, green = ofrezco, blue = regalo). expo-location captures the user's GPS position when creating a post — stored per-favor in the DB. Exact location is never shown publicly; it's only shared via WhatsApp chat once both parties agree.

@gorhom/bottom-sheet + react-native-reanimated 4

Frontend — Gestures & UI

The main screen is a full-screen map with a bottom sheet that snaps to 20%, 45% or 85% — swipe up to browse, swipe down to see the map. Reanimated 4 drives the search bar hide/show animation on scroll.

Intent-aware feed + FiltersModal

Frontend — Core UX

WelcomeScreen asks 'do you need help or want to give it?' — the answer pre-filters the feed so users never see irrelevant posts. FiltersModal lets them further narrow by tipo (necesito/ofrezco/regalo), estado (abierto/en_proceso/cerrado), and a 'saved only' toggle. Haversine distance calculated client-side and used for secondary sort.

Connections lifecycle + Safety Modal

Frontend — Social Flow

Tapping 'contact' on a post triggers a safety modal with real-world tips (meet in public, never send money upfront, share location only via chat). On confirm, the user is sent to WhatsApp. The connection then tracks states: pendiente → aceptada → completada/cancelada — visible in ConexionesScreen with separate tabs for received and sent requests.

Reviews system

Frontend — Reputation

After a connection is marked completed, both parties can leave a review. ReviewScreen handles the rating flow — building local reputation so the community can self-regulate trust over time.

Context API + expo-localization (ES/EN/DE)

Frontend — State & i18n

AuthContext holds JWT + user info with AsyncStorage persistence. FavoritosContext manages saved posts. LanguageContext drives full EN/ES/DE translations via a flat t.key lookup — all UI strings externalized, including categories, safety tips, error messages and form labels.

NestJS 11 + TypeScript

Backend — Framework

Modular architecture: AuthModule, FavoresModule, UsuariosModule, ConexionesModule, ReviewsModule, VerificacionModule. Global ValidationPipe with whitelist mode — unknown DTO fields rejected at the boundary before reaching any controller.

Prisma v7 + PostgreSQL

Backend — Database & ORM

Schema: User (googleId unique, UUID pk), Favor (tipo enum, estado enum, GPS lat/lng, expiraEn), Conexion (pendiente/aceptada/completada/cancelada), Review. Prisma migrations version-control the schema — dev uses Docker Compose PostgreSQL, prod uses Railway DATABASE_URL.

Google OAuth + JWT

Frontend + Backend — Authentication

Frontend sends Google ID token via @react-native-google-signin. NestJS verifies it with google-auth-library, upserts the User in DB and issues a custom JWT. Token stored in AsyncStorage — injected as Bearer header on all protected calls via AuthGuard.

@nestjs/throttler + Helmet

Backend — Security

ThrottlerGuard applied globally — 100 req/min per IP. Trust proxy enabled so Railway's reverse proxy doesn't collapse all clients into one IP. Helmet adds HSTS, X-Frame-Options and other standard security headers.

Claude Sonnet 4.6 (Anthropic)

AI-Assisted Development

Co-developed with Claude Sonnet 4.6 as an engineering partner throughout the build — architecture decisions, NestJS module design, navigation flows, i18n strategy, the connections lifecycle state machine and the safety modal UX.