Skip to main content

Sendit

Track your sends. Share your progress.

React NativeExpoAWSCoreMLTypeScript
current — working toward release

Ongoing Project

Sendit.

Track your sends. Share your progress.

A mobile-first bouldering tracker built for climbers who want more than a spreadsheet. Record climbs with video, see your grade progression over time, and share your best sends with a community of boulderers.

React NativeExpoAWSCoreMLiOS & Android
Sendit record screenSendit log screen

Overview

Overview

A training tool built by a climber, for climbers.

Most climbers track progress the hard way — mental notes, photo albums, or scattered spreadsheets. Sendit centralises everything: record a climb right from the wall, tag it with grade and style, and watch your improvement unfold in charts and stats.

The app is designed around the bouldering session. Climbs are grouped by date, filterable by grade, style, gym, and outcome, and the stats surface your peak grade, send rate, and session count at a glance.

Sendit calendar screenSendit calendar list screen
📱

Mobile First

Built entirely in React Native with Expo, targeting iOS and Android from a single codebase. File-based routing via Expo Router keeps the navigation structure clean and maintainable.

☁️

Cloud Backend

AWS powers the backend — Cognito for authentication, RDS for the database, and S3 for video storage. IAM policies enforce access control at the infrastructure layer.

📶

Offline Ready

A persistent offline queue lets climbers log sessions without a connection. Climbs sync automatically when the device reconnects, backed by a two-tier network cache for fast reads.

Features

Features

What's under the hood

Six core feature areas — each with distinct technical requirements.

🎥

Video Recording & Upload

Record climbs in-app or pick from the camera roll. Videos are compressed before upload using adaptive quality tiers, keeping storage usage low without sacrificing too much clarity.

expo-cameraexpo-image-pickerAWS S3
Key feature
🤖

AI Hold Detection

An on-device CoreML model runs body-pose estimation and oriented bounding-box hold detection on iOS. Results feed back into the climb tagging flow without any round-trip to a server.

CoreMLExpo Native ModuleSwiftiOS only
📊

Stats & Progress

Session grouping, grade distribution charts, send-rate tracking, and animated stat counters give a clear picture of improvement over time. Climbs can be filtered by grade, style, gym, and outcome.

React Contextreact-native-reanimatedAWS RDS
🏟️

Social Feed

Public climbs surface in a community feed, filterable by gym. Users can follow each other, like climbs, and leave comments — all backed by AWS with IAM policies enforcing privacy controls.

AWS IAMPostgreSQLOAuth
📶

Offline Queue & Sync

Climbs logged without a connection are held in a persistent offline queue (AsyncStorage) and automatically synced when the device comes back online. A two-tier network cache reduces redundant fetches.

AsyncStorageNetwork CacheExpo NetInfo
🔐

Authentication

Full auth via AWS Cognito with PKCE flow for security. Google and Apple sign-in supported via OAuth. Sessions are persisted and refreshed automatically so users stay signed in across app restarts.

AWS CognitoPKCEGoogle OAuthApple Sign In

Demo

Demo

Screen by screen

Four main screens, each handling a distinct part of the climbing workflow.

Sendit record screenSendit log screen
01

Record & Log

Full-screen camera interface with one-tap recording. Grade, style, and gym are tagged before saving. The home tab groups climbs by session date with animated stat counters.

Sendit community feed screen
02

Community Feed

Public climbs from followed users and nearby gyms appear in the Gyms tab. Video plays inline; likes and comments work in a tap.

Sendit gym screen
03

Gym

Browse gyms and discover climbs set at your local wall. Filter by grade, style, and rating. On iOS, the CoreML model can auto-detect hold colors directly from the wall.

Sendit profile screen
04

Profile

Three sub-tabs — Activity (list/calendar), Friends (follow graph), and Settings — live inside the profile tab. Progression charts and a heatmap calendar visualise long-term trends.

Conclusion

Tech Stack

Everything that makes it run

Framework
React Native 0.81Expo ~54Expo Router
Backend
AWS AmplifyPostgreSQLAWS S3
Auth
AWS Cognito (PKCE)Google OAuthApple Sign In
Native / iOS
CoreMLExpo Native ModuleSwift
Media
expo-cameraexpo-videoexpo-image-picker
Animations
react-native-reanimated
Local Storage
AsyncStorageexpo-file-system
Testing
Vitest

Conclusion

Built to solve a real problem.
Shipped on both stores.

Sendit started as a personal itch — there was no great way to keep a video log of bouldering progress that didn't live in a camera roll chaos. Building it from scratch forced decisions across the full stack: designing the database schema, wiring OAuth, writing a native Expo module in Swift, building an offline queue, and tuning video compression for a 500 MB storage budget.

The result is an app that handles the edge cases climbers actually hit — bad gym WiFi, recording 30-second dyno attempts, and wanting to see exactly when they cracked V7.

Sendit — a bouldering tracker by Zelong