Mori is a modern, privacy-first media downloader that saves photos, videos, and audio from 14 platforms. Built with a client-only architecture, all scraping runs on-device β no backend, no tracking, maximum privacy.
- TikTok Scraper Migrated (SnapTik β TikTokIO): Replaced the broken SnapTik-based scraper with a new implementation using
tiktokio.com/api/v1/tk/html. Direct POST request viaCapacitorHttp, regex-based HTML parsing (no DOM dependency), supports video (no watermark / HD) and MP3 downloads. - Douyin Photo Slideshow: Added support for Douyin photo posts (
aweme_type2). Multiple images display as a swipeable slideshow β same as TikTok photo experience. - Consolidated User-Agent: Removed scattered hardcoded UA strings across all scrapers β replaced with a single
CHROME_UAconstant fromutils.js. Only Douyin keeps its mobile Safari UA intentionally. - Bugfixes:
- Instagram URL cleaning: Now uses
getCleanUrl()before stripping query params β prevents failure when pasting text with embedded URLs. - Douyin thumbnail: Falls back to first photo URL when
item.video.coveris undefined (photo slideshows). - TikTok URL query params: Strips
?parameters before sending to TikTokIO API β was causing "Paste correct link" errors.
- Instagram URL cleaning: Now uses
- SoundCloud Removed: Replaced SoundCloud with Bilibili, Douyin, and RedNote (Xiaohongshu) scrapers.
- Bilibili (Mainland & International): Full DASH support with video + audio stream extraction. Mainland China links use seekin.ai API fallback, while bilibili.tv links extract episode IDs from HTML
window.__initialStateand query the official playurl gateway directly. - Douyin: Direct page parsing with
window._ROUTER_DATAextraction β supports both watermarked and no-watermark video. - RedNote (Xiaohongshu): Download media via seekin.ai server action with CDN URL extraction.
- Download Quality Labels: Platform scrapers now include descriptive quality labels (
1080p,320kbps, etc.) displayed in the download list. - Platform Icons Updated: Douyin uses TikTok icon, Bilibili uses official Bilibili SVG icon, RedNote uses RedNote icon in the supported platforms table.
- Update Notification Modal: Both manual and auto-update checks now show a polished modal with "Don't show again" option for auto-check. Supports EN/ID/JA translations.
- Preview Optimization: Resolved infinite loading on Bilibili, Douyin, and RedNote previews.
- Bilibili: Now uses static image preview (similar to YouTube) to optimize layout and prevent player overhead.
- Douyin: Plays directly from the direct CDN watermark stream to prevent 302 redirect header-stripping issues and signature invalidation.
- RedNote: Loads the first 3MB chunk in memory as a
Blob(via range headers) and converts it to a local Object URL to bypass CDN referrer restrictions.
- JavaScript (ES6+): Core application logic and scraping engine.
- HTML5 & CSS3: Custom design system without bloated frameworks.
- CapacitorJS: Native Android bridge for filesystem, clipboard, and biometrics.
- pdf-lib: Client-side PDF generation and bundling.
Mori/
βββ android/ # Capacitor Android native project
β βββ app/src/main/ # Android manifest, resources, assets
β βββ gradle/ # Gradle wrapper & build config
βββ assets/ # Screenshots & branding assets
βββ public/
β βββ css/
β β βββ style.css # Design system & all component styles
β βββ js/
β β βββ i18n.js # Multi-language translations (EN/ID/JA)
β β βββ pdf-lib.min.js # PDF generation library (vendor)
β β βββ player.js # Custom video player with touch controls
β β βββ scrapers.js # Platform scrapers (TikTok, IG, YT, etc.)
β β βββ script.js # App init, navigation, settings, history
β β βββ ui.js # Media slider, results, history renderer
β β βββ utils.js # Filesystem, cookie utils, helpers
β βββ index.html # Single-page entry point
βββ capacitor.config.json # Capacitor configuration
βββ package.json # Dependencies & scripts
βββ .gitignore
βββ LICENSE
βββ README.md
- Multi-Platform Support: High-quality downloads from TikTok (No Watermark), Instagram (Reels/Photos), YouTube, Twitter (X), Spotify, Pinterest, Apple Music, Facebook, Threads, Bandcamp, Pixiv (R-18/R-18G), Bilibili (DASH), Douyin (No WM), and RedNote (Xiaohongshu).
- Live Media Previews: View images, play videos, and listen to audio directly within the app before downloading.
- Standalone PDF Document Export: Convert image galleries from any platform into high-quality PDF files for offline viewing.
- Private History Manager: Downloaded files are managed internally with local playback support and offline badge detection.
- Share Intent Integration: Send links directly to Mori from other apps via the system Share menu.
- Auto Clipboard Paste: Automatically detects and pastes links from clipboard when you return to the app.
- Auto Update Check: Checks for new versions on startup via GitHub Releases and shows a popup modal when an update is available.
- Biometric Privacy Lock: Secure your history with native fingerprint/FaceID authentication.
- Export/Import Data: Full data portability β backup and restore your history, settings, and paths as a JSON file.
- Intelligent Error Handling: Real-time feedback for IP blocks or network issues via premium Toast notifications.
- Premium Minimalist UI: A distraction-free glassmorphism interface with smooth transitions, dark mode, and accent colors.
- Copy a link from a supported platform or Share it directly to Mori.
- Use the Paste button or let the auto-detection handle the link.
- Tap Analyze to verify the content.
- Preview the media (swipe through carousels if available).
- Choose your format and tap Download.
- Files are saved to your internal history for offline access.
Mori is built using Capacitor and Vanilla JS for high performance.
- On Android: Uses
CapacitorHttpto bypass CORS and download directly from the device IP. - On Web: Preview mode only β runs directly in the browser with limited functionality.
# 1. Sync Capacitor with Android
npx cap sync android
# 2. Build the debug APK
cd android && ./gradlew assembleDebug
# 3. The APK is output at:
# android/app/build/outputs/apk/debug/Mori v{VERSION}.apkFor a release APK, generate a signed keystore and run:
cd android && ./gradlew assembleReleaseDeveloped with β€οΈ by coflyn. GitHub: https://github.com/coflyn Instagram: @_coflyn
Mori is released under the MIT License. Feel free to use, modify, and distribute it.





