Skip to content

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ReelStash

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.

Features

  • 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, or Done, 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.

Tech Stack

  • 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

Project Structure

├── 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)

Getting Started

npm install
npx expo start

Scan 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.

Building an APK (EAS)

npm install -g eas-cli
eas login
eas build:configure          # first time only
eas build --platform android --profile preview

The preview profile in eas.json is configured for buildType: apk, producing a directly-installable .apk rather than a Play Store .aab.

Data & Privacy

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.

Known Limitations

  • 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages