Your personal content vault. Save and organize posts from TikTok, Instagram, YouTube, and more in a beautiful, distraction-free feed.
Nestly is a native iOS app that transforms how you save and revisit content from social media. Share any post to Nestly, and it's automatically organized with smart tags, searchable metadata, and a cinematic browsing experience.
Share content from any app directly to Nestly via iOS Share Sheet:
- Instagram posts and reels
- TikTok videos
- YouTube videos
- Twitter/X posts
- Reddit threads
- Safari links
- And more!
Posts are automatically categorized using:
- AI-powered classification (OpenAI integration)
- Rule-based tagging for instant categorization
- Multi-label support (Food, Travel, Tech, Fitness, etc.)
- Grid view with immersive thumbnails
- Glass morphism design with smooth animations
- Dark mode optimized interface
- Haptic feedback for tactile interactions
- 60fps scrolling with virtualized lists
- Full-text search across titles, captions, and authors
- Tag filters with multi-select
- Platform filters (Instagram, TikTok, YouTube, Other)
- Natural language date parsing ("2 weeks ago", "yesterday")
- Docked search rail for quick access
- Create custom collections
- Organize posts by theme or topic
- Add posts to multiple collections
- Manage from dedicated collections screen
- Inbox mode to track unread items
- Notes on any saved post
- Deep linking to native apps when possible
- Metadata extraction (title, caption, author, thumbnail)
- Offline support for saved content
- React Native (0.81) with New Architecture
- Expo (SDK 54) for development and builds
- Expo Router for file-based navigation
- TypeScript for type safety
- React Native Reanimated for 60fps animations
- Expo Image for optimized image loading
- Supabase for authentication and database
- PostgreSQL with Row Level Security
- Supabase Edge Functions (Deno) for serverless logic
- OpenAI API (optional) for AI-powered tagging
expo-share-intent- iOS Share Extension integration@expo-google-fonts/sora- Custom typographyexpo-haptics- Native haptic feedbackreact-native-youtube-iframe- Embedded YouTube playerzod- Runtime type validation
- Node.js 20+
- iOS device or simulator
- Supabase account
- (Optional) OpenAI API key for AI tagging
-
Clone the repository
git clone https://github.com/yourusername/nestly.git cd nestly -
Install dependencies
npm install
-
Set up environment variables Create a
.envfile in the root:EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co EXPO_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
-
Set up Supabase
- Create a new Supabase project
- Run the schema:
supabase/schema.sql - Deploy Edge Functions:
npx supabase functions deploy unfurl npx supabase functions deploy classify
- (Optional) Set
OPENAI_API_KEYsecret for AI tagging
-
Start the development server
npx expo start
-
Run on iOS
- Press
ifor iOS simulator - Or scan QR code with Expo Go app on your iPhone
- Press
eas build --profile development --platform ios# Build for App Store
eas build --profile production --platform ios
# Submit to TestFlight/App Store
eas submit --platform ios --latestnestly/
βββ app/ # Expo Router screens
β βββ (auth)/ # Authentication screens
β βββ (tabs)/ # Main tab navigation
β β βββ all.tsx # Home feed (grid view)
β β βββ add.tsx # Manual add link
β β βββ profile.tsx # User profile
β β βββ search.tsx # Dedicated search screen
β βββ collections/ # Collections management
β βββ item/[id].tsx # Post detail view
β βββ settings/ # App settings
β βββ share.tsx # Share handler (auto-save)
β βββ tags/ # Tag management
βββ components/ # Reusable UI components
β βββ home/ # Home screen components
β βββ navigation/ # Navigation components
β βββ player/ # Video/content players
β βββ ui/ # Design system atoms
βββ hooks/ # Custom React hooks
βββ lib/ # Utilities and services
β βββ api.ts # Supabase API calls
β βββ supabase.ts # Supabase client
β βββ deeplinks.ts # Deep linking logic
β βββ analytics.ts # Event tracking
βββ ios/ # Native iOS code
β βββ ShareExtension/ # iOS Share Extension
βββ supabase/
β βββ functions/ # Edge Functions
β β βββ unfurl/ # Metadata extraction
β β βββ classify/ # AI tagging
β βββ schema.sql # Database schema
βββ tests/ # Test suites
Native iOS Share Extension that appears in the system share sheet. Captures URLs from any app and passes them to Nestly via deep linking.
Implementation:
ios/ShareExtension/ShareViewController.swift- Native Swift codeapp/share.tsx- Auto-save screen with platform detectionhooks/useShareHandler.ts- Deep link interception
Server-side unfurling of shared URLs to extract rich metadata.
Flow:
- URL shared to Nestly
unfurlEdge Function fetches Open Graph/oEmbed data- Extracts: title, caption, author, thumbnail, platform
- Stores in PostgreSQL with user association
- Triggers
classifyfunction for auto-tagging
Intelligent categorization using AI or rule-based logic.
Tags: Food, Travel, Tech, Fitness, Home, Style, Finance, Learning, Events, DIY, Beauty, Health, Parenting, Pets, Other
Implementation:
- AI: OpenAI GPT-4 zero-shot classification
- Rules: Pattern matching on title/caption keywords
- Fallback: Rules used if OpenAI unavailable
Multi-dimensional search and filtering system.
Capabilities:
- Full-text search (PostgreSQL GIN index)
- Tag filtering (multi-select)
- Platform filtering (Instagram/TikTok/YouTube/Other)
- Date range filtering
- Sort by: Recent, Oldest
UI:
- Docked search rail (appears on scroll)
- Persists when filtering active
- Debounced input (250ms)
- Instant filter chips
- Virtualized lists with
FlatListfor infinite scroll - Lazy image loading with
expo-image - Debounced search to reduce API calls
- Request animation frame for smooth scrolling
- Memoized components to prevent re-renders
- React Context for global state (auth, dock state)
- Custom hooks for data fetching (
usePosts,useSession) - Optimistic updates for instant UI feedback
- Local storage (AsyncStorage) for preferences
- Row Level Security (RLS) in Supabase
- Parameterized queries to prevent SQL injection
- JWT authentication with Supabase Auth
- Secure storage for sensitive data
- Cached images with
expo-image - Local preferences with AsyncStorage
- Optimistic UI for immediate feedback
- Retry logic for failed requests
# Run test suites
node --loader ts-node/esm tests/rules.test.ts
node --loader ts-node/esm tests/canonicalize.test.ts
node --loader ts-node/esm tests/deeplinks.parseIncomingShare.test.ts
# Lint
npm run lint- Font: Sora (Google Fonts)
- Weights: 300, 400, 500, 600, 700
- Scale: 28px (heading), 16px (body), 13px (small)
- Dark theme primary with glass morphism
- Accent: Purple (#7A5CFF) and Cyan (#5CE1E6)
- Glass effects for elevated surfaces
- Gradient overlays for depth
All components follow a consistent design language:
Button- Primary CTA with loading statesChip- Filter pills with haptic feedbackGlass- Glassmorphic containerIconButton- Circular icon buttonsSearchBar- Debounced input with clear button
- DOCS.md - Comprehensive app guide
- STATUS.md - Project status and roadmap
- QUICK_TEST_GUIDE.md - Testing instructions
- Android support - Share Extension for Android
- Light mode - Complete light theme
- Export - Export data as JSON/CSV
- Vector search - Semantic search with pgvector
- Push notifications - Reminders for saved content
- Tag aliases - Flexible tag naming
- Collaborative collections - Share collections with others
-
Cross-app sharingβ -
Collectionsβ -
Tag managementβ -
Platform filteringβ
Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
- Expo for the incredible mobile development framework
- Supabase for backend infrastructure
- React Native community for amazing libraries
- OpenAI for AI-powered classification
- GitHub: @uwaisishaq
- Project Link: https://github.com/uwaisishaq/nestly
Made with β€οΈ for content collectors everywhere