A modern, cross-platform media stash app with on-device AI — save, organize, and rediscover your content, all locally and privately.
Getting Started · Tech Stack · Project Structure · Contributing
NeoStash is a privacy-first media organization app built with React Native and Expo. It lets you stash, browse, and intelligently manage your local media — powered entirely by on-device AI using HuggingFace Transformers and ONNX Runtime. No cloud required. Your data stays on your device.
- 📦 Local-first — everything stored in SQLite, nothing leaves your device
- 🤖 On-device AI — smart organization and processing via HuggingFace + ONNX Runtime
- ⚡ Blazing fast — Shopify FlashList + Reanimated for silky smooth performance
- 🌙 Dark mode — automatic light/dark theming
- 📱 Cross-platform — runs on iOS, Android, and Web from a single codebase
Make sure you have the following installed:
# 1. Clone the repository
git clone https://github.com/sid-rudani/neostash.git
cd neostash
# 2. Install dependencies
npm install
# 3. Start the development server
npx expo startOnce the dev server is running, you can open the app in:
| Target | Command |
|---|---|
| Expo Go (quick preview) | Scan the QR code with the Expo Go app |
| Android Emulator | Press a in the terminal |
| iOS Simulator | Press i in the terminal |
| Web Browser | Press w in the terminal |
| Development Build | npx expo run:android or npx expo run:ios |
Note: On-device AI features (HuggingFace / ONNX) require a development build and won't work in Expo Go.
If you want to wipe the starter boilerplate and start fresh:
npm run reset-projectThis moves the example code to app-example/ and gives you a blank app/ directory.
| Category | Technology |
|---|---|
| Framework | Expo ~54 + React Native 0.81 |
| Language | TypeScript 5.9 |
| Navigation | Expo Router (file-based) |
| Database | expo-sqlite |
| On-Device AI | @huggingface/transformers + onnxruntime-react-native |
| Media | expo-media-library · expo-image · expo-image-manipulator |
| Performance | @shopify/flash-list · react-native-reanimated |
| Gestures | react-native-gesture-handler |
| Background Tasks | expo-background-fetch · expo-task-manager |
| Icons | @expo/vector-icons · lucide-react-native |
| Animations | react-native-animatable |
neostash/
├── app/ # App screens & routes (Expo Router file-based routing)
├── components/ # Reusable UI components
├── constants/ # App-wide constants (colors, sizes, etc.)
├── hooks/ # Custom React hooks
├── assets/
│ └── images/ # Icons, splash screen, adaptive icons
├── scripts/ # Utility scripts (e.g. reset-project)
├── app.json # Expo configuration
├── package.json # Dependencies & scripts
└── tsconfig.json # TypeScript configuration
| Script | Description |
|---|---|
npm start |
Start the Expo development server |
npm run android |
Build and run on Android |
npm run ios |
Build and run on iOS |
npm run web |
Start the web version |
npm run lint |
Lint the codebase with ESLint |
npm run reset-project |
Reset to a blank app (moves boilerplate to app-example/) |
Key settings live in app.json:
- Scheme:
neostash(used for deep links) - Orientation: Portrait
- New Architecture: Enabled (
newArchEnabled: true) - React Compiler: Enabled (experimental)
- Typed Routes: Enabled (experimental)
- Bundle ID (iOS):
com.sid.m.rudani.neostash - Splash Screen: Light/dark variants supported
- Edge-to-Edge (Android): Enabled
Contributions are welcome! Here's how to get involved:
- Fork the repository
- Create a feature branch:
git checkout -b feat/amazing-feature - Commit your changes:
git commit -m 'feat: add amazing feature' - Push to your branch:
git push origin feat/amazing-feature - Open a Pull Request
Please follow the existing code style and run npm run lint before submitting.
- Expo Documentation — Framework fundamentals and API reference
- Expo Router Docs — File-based routing guide
- React Native Docs — Core concepts
- HuggingFace Transformers.js — On-device ML
- ONNX Runtime React Native — Inference engine
Made with ❤️ by sid