Cims is a mobile app to track your mountain summits and join hiking challenges. Users can:
- Log mountain summits and view their progress
- Join curated regional hiking challenges (Catalonia, GR-20, Alps…)
- Organize group hikes via Plans and coordinate through Chat
- Earn points based on mountain difficulty
- Climb the rankings and celebrate your achievements
This is a Yarn workspaces monorepo containing:
100cims/
├── packages/
│ ├── app/ # React Native mobile app (Expo)
│ └── api/ # Backend API (Next.js + Elysia)
├── package.json # Root workspace configuration
└── README.md # This file
packages/app- Mobile application built with Expo and React Nativepackages/api- Backend API built with Next.js and Elysia
- Node.js >= 24.0.0 (pinned in root
package.jsonengines) - Yarn 1.22.19+ (Yarn Classic — the repo uses workspaces, not Berry)
- Docker — used to run a local Postgres for the API (
yarn api db) - Xcode 26.4+ (iOS dev builds) and/or Android Studio (Android dev builds)
- A custom development build of the mobile app (Expo Go is not supported — the app uses native modules that require a dev client; see Mobile app — first run)
- Clone and install dependencies:
git clone https://github.com/jvidalv/100cims.git
cd 100cims
yarn install-
Set up environment variables:
- Copy
packages/app/.env.exampletopackages/app/.env.local - Copy
packages/api/.env.exampletopackages/api/.env.local - Fill in the required values (see package READMEs for details)
- Copy
-
Start the local database (Postgres in Docker):
yarn api db # starts the dockerized Postgres
yarn api db:migrate # applies drizzle migrations- Start development:
# Terminal 1: API server (Next.js, port 3000)
yarn dev:api
# Terminal 2: Metro bundler for the mobile app
yarn dev:appThe mobile app needs a custom development build installed on a device/simulator before yarn dev:app can connect — Expo Go cannot run it because the project uses native modules (maps, sharing, dynamic app icons, etc.).
First-time setup (or after adding any native dependency):
# iOS (simulator or connected device)
yarn app build:development:ios
# Android
yarn app build:development:androidAfter that, yarn dev:app just starts Metro and the installed dev client connects to it. Cloud builds via EAS are also available — see packages/app/README.md.
# Run an arbitrary command inside a package
yarn app <command> # → yarn workspace @100cims/app <command>
yarn api <command> # → yarn workspace @100cims/api <command>
# Development servers
yarn dev:app # Metro bundler for the mobile app
yarn dev:api # Next.js dev server for the API
# API production build (also runs db:migrate)
yarn build:api
# Mobile production builds go through EAS — see packages/app/README.mdThere's no monorepo-wide lint / type-check script. Run them per package:
# packages/app
yarn app lint
./node_modules/.bin/tsc --noEmit -p packages/app/tsconfig.json
# packages/api
yarn api lint
./packages/api/node_modules/.bin/tsc --noEmit -p packages/api/tsconfig.jsonSee individual package READMEs for detailed commands:
- Yarn Workspaces (Classic 1.x) - Dependency management
- TypeScript - 6.0 in
packages/app, 5.x inpackages/api - ESLint + Prettier - Code quality and formatting
- Expo SDK 56 - React Native development platform
- React Native 0.85 - Mobile framework (new architecture enabled)
- React 19.2
- expo-router 56 - File-based navigation
- NativeWind 5 (preview) - Tailwind CSS for React Native
- React Query 5 - Server state management
- OpenAPI TypeScript - Type-safe API client
- React Intl - Internationalization (en, ca, es)
- React Native Maps - Mountain location mapping
- Expo Auth Session - Google & Apple OAuth
- Analytics - reactanalytics.app
- Next.js 16 - React framework (App Router)
- Elysia 1.4 - Fast TypeScript API framework mounted under Next
- Drizzle ORM + drizzle-kit - Type-safe SQL toolkit + versioned migrations
- PostgreSQL - Relational database (local via Docker, prod on Railway)
- AWS S3 - Image storage (avatars, summit photos)
- Google Sheets API - Error/suggestion logging
- JWT - Authentication & authorization
- Swagger - API documentation (
/api/swagger/jsonin dev)
The app supports both Google and Apple sign-in via OAuth 2.0.
- Backend validates tokens and issues JWTs
- Protected API routes require valid JWT bearer tokens
- See API Authentication docs for details
Cims supports three languages:
- 🇬🇧 English (en)
- 🏴 Catalan (ca)
- 🇪🇸 Spanish (es)
Translations are managed with FormatJS. See app README for the update workflow.
- Mobile App: Deployed via EAS Build (Expo Application Services)
- Backend API: Deployed on Railway from
packages/api/Dockerfile. Migrations apply automatically on each deploy (next build && yarn db:migrate). - Domains:
fescims.comis the canonical domain; the legacycims-sempre-amunt.app301-redirects to it.
This project uses reactanalytics.app for privacy-focused mobile analytics.
Made with ❤️ by @jvidalv



