The SkateHive mobile app — a skateboarding community running on the HIVE blockchain. Skaters post clips and photos, vote on each other's tricks, map spots, and earn crypto rewards for it.
Built with React Native and Expo. Posts, votes and payouts live on-chain; media lives on IPFS.
Feed — short posts ("snaps") with photo and video, voting with an adjustable weight, threaded replies, and live payout values.
Videos — a full-screen vertical feed. Double-tap to vote.
Profiles — a media grid backed by poster frames, opening into a full-screen viewer.
Spot map — skate spots on a map, plus a camera flow for adding new ones from where you're standing.
iOS home screen widgets — nearest spot, a spot map, top spots, and a shortcut straight into the camera. Built with WidgetKit; iOS only.
Instagram cross-post — eligible accounts can mirror a snap to Instagram, choosing the cover frame and editing the caption before it goes out.
Two ways to sign in — a HIVE posting key, encrypted on-device and unlocked with Face ID or a PIN, or an email account with server-side custody for people who don't have a HIVE account yet.
| Runtime | Expo 54, React Native 0.81, New Architecture enabled |
| Routing | Expo Router (file-based) |
| Server state | TanStack Query |
| Blockchain | @hiveio/dhive against several HIVE RPC nodes with failover |
| Video | expo-video, transcoded through SkateHive's own worker and pinned to IPFS |
| Storage | expo-secure-store for keys, App Group UserDefaults for the widget |
Dark theme only. FiraCode throughout. Styling is plain StyleSheet, with every colour and spacing value coming from lib/theme.ts.
Requires Node 18+ and pnpm 9 — not corepack pnpm, which ignores this repo's node-linker=hoisted setting and leaves the bundler unable to resolve babel-preset-expo.
pnpm install
cp .env.example .envMost of the native surface here — the widget bridge, video, secure store — doesn't exist inside Expo Go, so day-to-day work uses a development build:
pnpm start # expo start --dev-client, then scan the QRExpo Go still works for screens that don't touch those modules: run npx expo start and press s to switch to it. The widget is invisible there, and pushing spot data to it silently does nothing.
pnpm ios # build and run on a connected device or simulator
pnpm androidiOS ships from a local Xcode archive, not EAS. ios/ is gitignored and regenerated by prebuild, so app.json is the only place a version number lives.
- Bump
expo.ios.buildNumberinapp.json. pnpm prebuild:ios— clean-prebuilds iOS, adds the widget target, and syncs the widget's build number to the app's. App Store Connect rejects an extension whose build number differs from the app's.- Open
ios/SkateHive.xcworkspace, set the destination to Any iOS Device, then Product → Archive → Distribute App.
app/ Expo Router screens — (tabs)/ holds feed, videos, map,
notifications and profile
components/ UI grouped by area (Feed/, Profile/, ui/, spotmap/)
lib/ Everything that isn't a screen: auth, HIVE operations,
uploads, hooks, theme
modules/ Local native modules — widget-bridge writes spot data into
the shared App Group
targets/widget/ The SkateSpots WidgetKit target (Swift)
scripts/ Build helpers
Worth reading first: lib/auth-provider.tsx for sessions and key handling, lib/hive-utils.ts for every blockchain operation, and lib/theme.ts for the design system.
AGENTS.md is the guide — architecture, conventions, security rules, and the gotchas that would otherwise cost you an afternoon. Read it before your first change. CLAUDE.md covers the build and release specifics.
Three rules that aren't negotiable:
- Private keys are never stored in plaintext and never logged.
- Dark theme only.
- Blockchain calls can fail on any node — wrap them.
There is no automated test suite. Changes are verified by running the app on a device.
- skatehive.app — the web app
- skatehive-api — the backend
- video-transcoder — video processing
- HIVE · Expo
