Save, organize, and track links from TikTok, YouTube, Instagram, Facebook — or any website — in one place. Built with Expo (React Native) and React Native Paper.
- Save any link — video platforms get auto-detected icons, thumbnails, and titles (via oEmbed / Open Graph scraping); generic websites are saved just as easily.
- Universal progress tracking — mark items
Saved,In Progress, orDone, whether it's a video or an article. - Categories — single-tag categorization with auto-assigned, consistent colors per category.
- Collections — user-created folders (many-to-many) with a custom icon per folder, separate from categories.
- Search — dedicated full-screen search across titles, notes, categories, and tags.
- Bulk actions — long-press to multi-select, then bulk move (category) or bulk delete.
- Swipe-to-delete on individual cards.
- Share intent — share a link directly into ReelStash from other apps (TikTok, YouTube, etc.) via Android's native Share sheet. (Requires a custom build — not available in Expo Go.)
- Light / Dark mode — fully theme-aware across the app, persisted across restarts.
- Export / Clear data — export all saved data as a JSON file, or wipe everything from the Profile tab.
- Custom bottom tab bar — Feed, Collections, Search, and Profile, with a raised center button to quickly add a new link.
- Framework: Expo SDK 54 (React Native)
- Navigation: React Navigation v6 (native-stack + bottom-tabs)
- UI Library: React Native Paper
- Gestures: react-native-gesture-handler (swipe actions)
- Storage: AsyncStorage (fully offline, on-device — no backend/accounts)
- Sharing: expo-share-intent, expo-sharing, expo-file-system
- Build: EAS Build
├── assets/ App icons, adaptive icon, splash icon, favicon
├── src/
│ ├── components/ Reusable UI pieces
│ │ ├── CategoryPickerModal.js Bottom sheet for bulk "move to category"
│ │ ├── CollectionPickerModal.js Bottom sheet for "add to collection" (multi-select + create)
│ │ ├── CustomTabBar.js Bottom tab bar with the raised center Add button
│ │ ├── SplashScreen.js Animated splash shown on top of the native splash
│ │ ├── StatusBadge.js Small colored pill for Saved / In Progress / Done
│ │ └── VideoCard.js The saved-link card (thumbnail, swipe-to-delete, selection mode)
│ ├── constants/
│ │ ├── statuses.js Status list + colors, category color hashing, platform detection
│ │ └── theme.js Light/dark color palettes, spacing, radius, typography, shadows
│ ├── context/
│ │ └── ThemeContext.js App-wide light/dark theme provider (persisted)
│ ├── screens/
│ │ ├── HomeScreen.js / .styles.js Feed tab - main saved-links list, filters, selection mode
│ │ ├── AddEditScreen.js / .styles.js Save/edit a link, live preview, URL validation
│ │ ├── VideoDetailScreen.js / .styles.js Full details for one saved link
│ │ ├── CollectionsScreen.js / .styles.js Collections tab - list of folders
│ │ ├── CollectionDetailScreen.js / .styles.js Links inside one collection
│ │ ├── SearchScreen.js / .styles.js Search tab
│ │ ├── ProfileScreen.js / .styles.js Profile tab - stats, appearance, account, danger zone
│ │ └── MainTabs.js Bottom tab navigator wiring
│ └── utils/
│ ├── storage.js All AsyncStorage read/write logic (videos, categories, collections, profile, settings)
│ ├── thumbnail.js Thumbnail + title resolution (YouTube/TikTok oEmbed, Open Graph scraping)
│ ├── time.js Relative time formatting ("3 hours ago")
│ └── validation.js URL format validation
├── App.js Root: theming, navigation, share-intent handling, splash sequencing
├── app.json Expo config (icons, splash, Android intent filters, plugins)
├── eas.json EAS Build profiles (preview = APK, production = AAB)
└── .npmrc Forces legacy-peer-deps resolution (needed for expo-share-intent on SDK 54)
npm install
npx expo startScan the QR code with Expo Go (Android) or the Camera app (iOS) — note that share-intent functionality requires a custom build and will not work in Expo Go.
npm install -g eas-cli
eas login
eas build:configure # first time only
eas build --platform android --profile previewThe preview profile in eas.json is configured for buildType: apk, producing a directly-installable .apk rather than a Play Store .aab.
Everything is stored locally on-device via AsyncStorage. There is no backend, no user accounts, and no data leaves the device except when the user explicitly uses "Export My Stash" (which opens the native share sheet) or opens a saved link. Features like Change Password, Linked Accounts, and Sign Out are shown in the UI for completeness but are not functional, since there is no account system.
- Thumbnail/title fetching for Instagram and Facebook relies on scraping public Open Graph tags and can fail for private or JS-rendered content.
- "Auto-play previews," "Compact card view," and the notification toggles in Profile are saved preferences but don't yet change app behavior.
- Share-intent requires a custom Android build; it will not function inside Expo Go.