Skip to content

πŸ§— Custom mobile & web UI for Social Boulder β€” track boulders, sends and progress. Built with Expo, NativeWind and DDP.

License

Notifications You must be signed in to change notification settings

gwenoleR/chalkboard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

31 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸ§— Chalkboard

A custom mobile & web UI for Social Boulder β€” track your climbing sessions, explore gym boulders, and follow your progress.

Built with ❀️ by climbers, for climbers. Connects directly to the Social Boulder backend via the DDP (Meteor.js WebSocket) protocol.


✨ Features

  • πŸ—ΊοΈ Browse boulders by gym, grade, and color β€” immersive card feed with full-width photos
  • πŸ” Sign in with your Social Boulder account β€” or browse as a guest
  • 🏟️ Multi-gym support β€” onboarding picker, switch gym from the header, search by name or city
  • πŸ–ΌοΈ Full-width boulder photos with holds color badge and label dot
  • πŸ“ Mini gym floor plan on each card with the boulder's zone highlighted
  • 🎬 Play beta videos full-screen on boulder detail (Mux HLS, works on iOS/Android/web)
  • βœ… Log sends and flashes β€” buttons adapt to your current status (sent/flashed)
  • ❀️ Like boulders β€” floating heart button, fills instantly
  • πŸ’¬ View user comments and beta videos on each boulder
  • ⏳ See the planned teardown date for each boulder
  • 🟒 Cards show your personal status (sent βœ“, flashed ⚑, liked β™₯) at a glance
  • πŸ“Š Stats update instantly on action (optimistic updates)
  • 🌍 Multi-language support (French & English)
  • πŸ‘€ Profile page β€” avatar, stats per gym (total sends incl. dismounted boulders, best grade, last send date)
  • πŸŒ™ Light & dark mode

πŸ› οΈ Tech stack

Layer Technology
Framework Expo + Expo Router
Styling NativeWind v4 (Tailwind CSS)
UI components react-native-reusables + lucide-react-native
Backend DDP over WebSocket (simpleddp)
Auth expo-secure-store (keychain) + expo-crypto (SHA-256)
Video expo-video (native) + hls.js (web)
i18n i18next + expo-localization
Design system French Rose #e35f8d Γ— Teal #2aab7e Β· Outfit + DM Sans
Storybook @storybook/react-native

πŸš€ Getting started

Prerequisites

  • Node.js 18+
  • Expo Go on your device, or an iOS/Android simulator

Install

npm install

Configure

Copy .env.example to .env and fill in your credentials:

cp .env.example .env

Run

# iOS
npm run ios

# Android
npm run android

# Web
npm run web

🎨 Storybook

Explore the design system components interactively:

npm run storybook

🧹 Code quality

# Lint
npm run lint

# Auto-fix lint issues
npm run lint:fix

# Format with Prettier
npm run format

# Check formatting
npm run format:check

πŸ“ Project structure

app/                  ← Expo Router screens
  login.tsx           ← Login screen (email/password + guest mode)
  onboarding.tsx      ← Gym selection on first launch (or when no gym selected)
  profile.tsx         ← Profile screen (avatar, gym stats, logout)
components/
  Avatar.tsx          ← Circular user avatar with initials fallback
  GymAvatar.tsx       ← Gym logo avatar (S3 logo + initials fallback)
  GymPickerModal.tsx  ← Bottom-sheet gym switcher with search + sections
  GymStatsCard.tsx    ← Gym stats card (sends incl. dismounted, best grade, last send)
  design-system/      ← Storybook stories
  ui/                 ← react-native-reusables components
lib/
  auth/               ← AuthProvider, useAuth(), secure storage
  i18n/               ← Translations (fr, en)
  known-gyms.ts       ← Static GymInfo list + getGymLogoUrl() + getGymDisplayName()
  theme.ts            ← Design tokens
  utils.ts            ← cn() helper
hooks/                ← Custom React hooks
  use-current-user.ts     ← Subscribe users.single β†’ current user profile
  use-gyms-list.ts        ← Dynamic gym list from _gyms.list DDP, merged with KNOWN_GYMS
  use-selected-gym.ts     ← AsyncStorage-backed selected gym (null β†’ redirect to onboarding)
  use-user-sends-count.ts ← _boulders.count for a user (incl. closed boulders)
exploration/          ← DDP reference scripts (Node.js)

πŸ“„ License

Creative Commons Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)

You are free to use, share, and adapt this project for non-commercial purposes, as long as you give appropriate credit. Commercial use is not permitted.

About

πŸ§— Custom mobile & web UI for Social Boulder β€” track boulders, sends and progress. Built with Expo, NativeWind and DDP.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •