A modern, beautiful streaming platform for your personal media library
Features β’ Installation β’ Development β’ Architecture β’ Contributing
Raffi is a modern, cross-platform streaming application inspired by Stremio, designed to be a faster, more beautiful alternative with enhanced features. Built with modern web technologies, it provides a Netflix-like experience while leveraging the Stremio addon ecosystem for content discovery and streaming.
Like Stremio, Raffi uses community addons to aggregate streaming sources, but goes beyond with a reimagined interface, improved performance, and additional features like synchronized watch parties, enhanced progress tracking, and Discord integration.
- Beautiful, responsive UI with smooth animations
- Auto-playing trailers on hover
- Multiple video quality options
- Audio and subtitle track selection
- Picture-in-picture and fullscreen support
- Windows -
.exeand.msiinstallers - Linux -
.deb,.rpm, and.AppImagepackages - macOS -
.dmgand.zipdistributions - iOS & Android - Mobile companion app (React Native/Expo)
- Real-time watch parties with synchronized playback
- Chat and presence indicators
- Host controls for play/pause/seek
- Custom lists and collections
- Continue watching with progress tracking
- Episode and season management
- Search across all content
- Full Stremio addon support - Use any Stremio addon for content sources
- Community addon ecosystem for movies, TV shows, and more
- Multiple addon sources simultaneously
- Easy addon management and configuration
- Optional direct link mode with user-supplied movie and series URL templates
- Direct links can open as provider embeds or play through Raffi's player when compatible
- Source settings sync with your account while keeping addon and direct configurations separate
- Configurable seek bar styles
- Subtitle delay adjustment
- Theme customization
- Torrent/magnet link streaming
- Local file playback
- Discord Rich Presence integration
- Auto-updater
- Offline mode support
Visit raffi.al or check the Releases page for the latest version.
- Installer:
Raffi-Setup-x.x.x.exe - Portable:
Raffi-x.x.x.msi
# Debian/Ubuntu
sudo dpkg -i Raffi-x.x.x.amd64.deb
# Fedora/RHEL
sudo rpm -i Raffi-x.x.x.x86_64.rpm
# AppImage (Universal)
chmod +x Raffi-x.x.x.AppImage
./Raffi-x.x.x.AppImage- DMG: Mount and drag to Applications
- ZIP: Extract and move to Applications
- Node.js 18+ or Bun 1.0+
- Go 1.21+ (for server binary)
- Git
raffi/
βββ apps/
β βββ desktop/ # Electron desktop shell
β βββ web/ # SvelteKit + Cloudflare web app
β βββ mobile/ # React Native + Expo
βββ packages/
β βββ app/ # Shared Svelte Raffi UI and app logic
β βββ shared/ # Platform-agnostic utilities and types
β βββ platform-types/
βββ services/
β βββ sync/ # Cloud sync API (Cloudflare Workers + D1)
β βββ server/ # Local streaming server (Go)
βββ marketing/ # Public raffi.al site
- Framework: Electron 39 with Svelte 5 and TypeScript
- Platforms: Windows, macOS, Linux
- Features: Full desktop experience with watch parties, Discord integration, local file playback
- Build: electron-builder for multi-platform releases
- Framework: SvelteKit with Cloudflare adapter
- Purpose: Browser-first Raffi for direct HTTP and debrid streams
- UI: Consumes the same shared Svelte package as desktop
- Installable: PWA manifest and Cloudflare deployment target
- Framework: React Native with Expo SDK 54
- Platforms: iOS and Android
- Features: Browse content, search, continue watching, native video playback
- Sync: Shares authentication and watch progress with desktop through Raffi Sync
- Native Module: Custom torrent-streamer module for on-device streaming
- Framework: Svelte 5
- Purpose: The reusable Raffi app experience mounted by desktop and web
- Playback: Browser-compatible direct playback where possible, desktop-only gates for local/server-dependent features
- Runtime: Cloudflare Workers
- Storage: Cloudflare D1 for account data and Durable Objects for watch-party state
- Features: Ave-authenticated cloud sync, Trakt token integration, watch-party coordination
- Language: Go
- Purpose: HLS transcoding server for video streams
- Bundled: Compiled binaries included with desktop app
- Mobile: Can be used as remote transcoding server for mobile devices
- Framework: SvelteKit
- Purpose: Marketing site and download page
- Hosted at: raffi.al
# Clone the repository
git clone https://github.com/kaleidal/raffi.git
cd raffi
bun install
# Desktop app
bun run dev:desktop
# Web app
bun run dev:web
# Build for production
bun run build:desktop
bun run build:webbun install
# Run in development mode (builds server + starts electron)
bun run dev:desktop
# Run electron only (if server already built)
bun --filter @raffi/desktop electron:dev:only
# Build production release
bun --filter @raffi/desktop distbun install
# Start the browser app
bun run dev:web
# Typecheck and build for Cloudflare
bun run check:web
bun run build:webcd apps/mobile
# Install dependencies
bun install
# Start Expo development server
bun run start
# Run on iOS simulator
bun run ios
# Run on Android emulator
bun run android
# Build for production
bunx expo build:ios
bunx expo build:androidNote: Mobile app requires the desktop server running for torrent streams. Update STREAMING_SERVER in apps/mobile/app/player.tsx with your local IP.
cd services/server
# Build server binary
go build -o decoder .
# Run server
./decodercd marketing
# Install dependencies
bun install
# Run development server
bun run dev
# Build for production
bun run build- Frontend: Svelte 5, TypeScript, Tailwind CSS
- Desktop Runtime: Electron 39
- Video Player: HLS.js for adaptive streaming
- Storage: Local app data with Raffi Sync cloud backup
- Build: Vite + electron-builder
- Key Libraries:
@lucide/svelte,posthog-js,@ryuziii/discord-rpc
- Frontend: SvelteKit, TypeScript, Tailwind CSS
- Deployment: Cloudflare Pages/Workers
- Playback: Native video and HLS.js for direct HTTP/debrid streams
- Limitations: Torrent, local file, export, and local server features stay desktop-only
- Frontend: React Native (React 19), TypeScript
- Framework: Expo SDK 54 with new architecture enabled
- Video Player: Expo Video (native)
- Navigation: Expo Router (file-based routing)
- State Management: Zustand
- Sync: Raffi Sync API shared with desktop
- Native Module: Custom torrent-streamer for on-device torrenting
- Key Features: Tab navigation, dark theme, cross-device sync
- Runtime: Cloudflare Workers
- Database: Cloudflare D1
- State Coordination: Durable Objects for active watch parties
- Auth: Ave ID tokens verified at the API edge
- Language: Go 1.21+
- Functionality: HLS transcoding, torrent handling
- Deployment: Bundled with desktop, standalone for mobile
- Compatible with Stremio addons - Reuses the proven Stremio addon protocol
- Addon discovery and installation
- Multi-source aggregation from different addons
- Torrent/magnet link support via addons
- Community-maintained content catalogs
- Custom video player with HLS support
- Multiple quality selection
- Subtitle parsing (SRT/VTT)
- Audio track switching
- Seek bar with time-remaining display
- Synchronized playback state through Raffi Sync
- Durable Object-backed party state
- Host/participant role system
- Automatic reconnection
- Local and cloud sync
- Per-episode progress
- Resume from last position
- Watched/unwatched states
- Shared authentication via Ave across desktop, web, and mobile
- Watch progress sync - Start on desktop or web, continue on another client
- Library sync - Custom lists and favorites across devices
- Addon settings - Configured addons available on all platforms
# Windows
bun --filter @raffi/desktop dist -- --win
# Linux
bun --filter @raffi/desktop dist -- --linux
# macOS
bun --filter @raffi/desktop dist -- --mac
# All platforms
bun --filter @raffi/desktop distOutput will be in apps/desktop/release/
cd apps/mobile
# Development builds
bunx expo run:ios # iOS
bunx expo run:android # Android
# Production builds (requires EAS account)
bunx eas build --platform ios
bunx eas build --platform androidBuilds will be available via Expo Application Services (EAS) dashboard.
Desktop (apps/desktop/package.json):
- App metadata (name, version, author)
- Build targets (Windows, Linux, macOS)
- Icon paths and file associations
- Auto-update settings
Mobile (apps/mobile/app.json):
- App metadata and identifiers
- iOS bundle ID:
al.kaleid.mobile - Android package:
al.kaleid.raffimobile - Splash screen and icon configuration
- Expo plugins and experiments
Contributions are welcome! Please feel free to submit a Pull Request.
- Code Style: Follow existing patterns, use TypeScript
- Commits: Write clear, descriptive commit messages
- Testing: Test on multiple platforms when possible
- Documentation: Update README for significant changes
- π Bug fixes
- β¨ New features
- π¨ UI/UX improvements
- π Documentation
- π Translations
- π§ͺ Testing
This project is licensed under the MIT License - see the LICENSE file for details.
- Built with β€οΈ by Kaleidal
- Inspired by Stremio and its addon ecosystem
- Icons by Lucide
- Powered by the community-driven Stremio addon protocol
- Website: raffi.al
- GitHub: github.com/kaleidal/raffi
- Issues: Report a bug
