# coflyn/mori architecture

> Architecture diagram of the GitHub repository coflyn/mori, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-27). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/coflyn/mori
- Repository: https://github.com/coflyn/mori

## Overview

Mori is a cross-platform, on-device social-media downloader. Its main workflow is link intake (clipboard, manual entry, or Android sharing), platform-specific resolution, preview and format selection, then saving media to device storage. Batch downloads, playlist support, media preview, photo-to-PDF, settings and privacy locks, and scraper hot-patching are distinct product capabilities. The excerpts show app startup, batch scraping, and storage behavior; several feature connections below follow the README because their implementation was not sampled.

Main entry points: [`public/js/downloader/index.js`](https://github.com/coflyn/mori/blob/main/public/js/downloader/index.js) (Downloader core), [`public/js/scrapers/index.js`](https://github.com/coflyn/mori/blob/main/public/js/scrapers/index.js) (Scraper dispatch), [`public/js/app.js`](https://github.com/coflyn/mori/blob/main/public/js/app.js) (App entry), [`public/js/modules/intents.js`](https://github.com/coflyn/mori/blob/main/public/js/modules/intents.js) (Link intents)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_intake["Link intake"]
  node_app["App entry<br/>[app.js]"]
  node_intents["Link intents<br/>[intents.js]"]
  node_batch["Batch manager<br/>[batchManager.js]"]
end

subgraph group_resolve["Media resolution"]
  node_scrapers["Scraper dispatch<br/>[index.js]"]
  node_resolver["Media resolver<br/>[resolver.js]"]
  node_updates["Scraper hot-patching<br/>[updateScrapers.js]"]
end

subgraph group_downloads["Download and storage"]
  node_download["Download orchestration<br/>[download.js]"]
  node_downloader["Downloader core<br/>[index.js]"]
  node_headers["Request headers<br/>[headers.js]"]
  node_filename["Filename handling<br/>[filename.js]"]
  node_postprocess["Media post-process<br/>[postProcess.js]"]
  node_storage["File storage<br/>[storage.js]"]
end

subgraph group_experience["App experience"]
  node_result["Download result UI<br/>[result.js]"]
  node_history["Download history<br/>[history.js]"]
  node_player["Media player<br/>[player.js]"]
  node_pdf["Photo to PDF<br/>[pdfHelper.js]"]
  node_settings["Settings and storage<br/>[index.js]"]
  node_auth["Privacy lock<br/>[authManager.js]"]
end

subgraph group_native["Platform integration"]
  node_android["Android bridge<br/>[MainActivity.java]"]
  node_background["Background downloads"]
  node_tauri["Desktop native commands<br/>[lib.rs]"]
end

node_user(("User"))
node_providers["Scraper providers"]
node_localfiles[("Device files")]
node_clipboard["Clipboard"]

node_user -->|"opens app"| node_app
node_clipboard -->|"provides link"| node_intents
node_user -.->|"shares link"| node_intents
node_app -->|"handles paste"| node_intents
node_user -->|"submits links"| node_batch
node_batch -->|"requests scrape"| node_scrapers
node_intents -->|"requests scrape"| node_scrapers
node_scrapers -->|"requests media data"| node_providers
node_scrapers -->|"returns results"| node_result
node_result -->|"starts download"| node_download
node_download -->|"dispatches download"| node_downloader
node_downloader -->|"resolves media"| node_resolver
node_downloader -->|"prepares headers"| node_headers
node_downloader -->|"prepares filename"| node_filename
node_downloader -->|"processes media"| node_postprocess
node_downloader -->|"saves file"| node_storage
node_storage -->|"writes media"| node_localfiles
node_history -->|"reads saved items"| node_localfiles
node_app -->|"renders history"| node_history
node_user -->|"previews media"| node_player
node_user -->|"creates PDF"| node_pdf
node_user -->|"configures app"| node_settings
node_settings -->|"manages storage"| node_localfiles
node_user -->|"unlocks app"| node_auth
node_app -->|"verifies lock"| node_auth
node_updates -.->|"patches engines"| node_scrapers
node_android -.->|"starts service"| node_background
node_storage -.->|"invokes native download"| node_tauri

click node_app "https://github.com/coflyn/mori/blob/main/public/js/app.js"
click node_intents "https://github.com/coflyn/mori/blob/main/public/js/modules/intents.js"
click node_batch "https://github.com/coflyn/mori/blob/main/public/js/modules/batchManager.js"
click node_scrapers "https://github.com/coflyn/mori/blob/main/public/js/scrapers/index.js"
click node_resolver "https://github.com/coflyn/mori/blob/main/public/js/downloader/resolver.js"
click node_result "https://github.com/coflyn/mori/blob/main/public/js/ui/result.js"
click node_download "https://github.com/coflyn/mori/blob/main/public/js/modules/download.js"
click node_downloader "https://github.com/coflyn/mori/blob/main/public/js/downloader/index.js"
click node_headers "https://github.com/coflyn/mori/blob/main/public/js/downloader/headers.js"
click node_filename "https://github.com/coflyn/mori/blob/main/public/js/downloader/filename.js"
click node_postprocess "https://github.com/coflyn/mori/blob/main/public/js/downloader/postProcess.js"
click node_storage "https://github.com/coflyn/mori/blob/main/public/js/downloader/storage.js"
click node_history "https://github.com/coflyn/mori/blob/main/public/js/modules/history.js"
click node_player "https://github.com/coflyn/mori/blob/main/public/js/components/player.js"
click node_pdf "https://github.com/coflyn/mori/blob/main/public/js/utils/pdfHelper.js"
click node_settings "https://github.com/coflyn/mori/blob/main/public/js/modules/settings/index.js"
click node_auth "https://github.com/coflyn/mori/blob/main/public/js/modules/authManager.js"
click node_updates "https://github.com/coflyn/mori/blob/main/public/js/modules/updateScrapers.js"
click node_android "https://github.com/coflyn/mori/blob/main/android/app/src/main/java/com/mori/downloader/MainActivity.java"
click node_background "https://github.com/coflyn/mori/blob/main/android/app/src/main/java/com/mori/downloader/DownloadForegroundService.java"
click node_tauri "https://github.com/coflyn/mori/blob/main/src-tauri/src/lib.rs"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_app,node_intents,node_batch,node_user toneBlue
class node_scrapers,node_resolver,node_updates,node_localfiles toneAmber
class node_download,node_downloader,node_headers,node_filename,node_postprocess,node_storage toneMint
class node_result,node_history,node_player,node_pdf,node_settings,node_auth toneRose
class node_android,node_background,node_tauri,node_providers,node_clipboard toneIndigo
```

## Components

### Link intake

- [App entry](https://github.com/coflyn/mori/blob/main/public/js/app.js): `public/js/app.js`
- [Link intents](https://github.com/coflyn/mori/blob/main/public/js/modules/intents.js): `public/js/modules/intents.js`
- [Batch manager](https://github.com/coflyn/mori/blob/main/public/js/modules/batchManager.js): `public/js/modules/batchManager.js`

### Media resolution

- [Scraper dispatch](https://github.com/coflyn/mori/blob/main/public/js/scrapers/index.js): `public/js/scrapers/index.js`
- [Media resolver](https://github.com/coflyn/mori/blob/main/public/js/downloader/resolver.js): `public/js/downloader/resolver.js`
- [Scraper hot-patching](https://github.com/coflyn/mori/blob/main/public/js/modules/updateScrapers.js): `public/js/modules/updateScrapers.js`

### Download and storage

- [Download orchestration](https://github.com/coflyn/mori/blob/main/public/js/modules/download.js): `public/js/modules/download.js`
- [Downloader core](https://github.com/coflyn/mori/blob/main/public/js/downloader/index.js): `public/js/downloader/index.js`
- [Request headers](https://github.com/coflyn/mori/blob/main/public/js/downloader/headers.js): `public/js/downloader/headers.js`
- [Filename handling](https://github.com/coflyn/mori/blob/main/public/js/downloader/filename.js): `public/js/downloader/filename.js`
- [Media post-process](https://github.com/coflyn/mori/blob/main/public/js/downloader/postProcess.js): `public/js/downloader/postProcess.js`
- [File storage](https://github.com/coflyn/mori/blob/main/public/js/downloader/storage.js): `public/js/downloader/storage.js`

### App experience

- [Download result UI](https://github.com/coflyn/mori/blob/main/public/js/ui/result.js): `public/js/ui/result.js`
- [Download history](https://github.com/coflyn/mori/blob/main/public/js/modules/history.js): `public/js/modules/history.js`
- [Media player](https://github.com/coflyn/mori/blob/main/public/js/components/player.js): `public/js/components/player.js`
- [Photo to PDF](https://github.com/coflyn/mori/blob/main/public/js/utils/pdfHelper.js): `public/js/utils/pdfHelper.js`
- [Settings and storage](https://github.com/coflyn/mori/blob/main/public/js/modules/settings/index.js): `public/js/modules/settings/index.js`
- [Privacy lock](https://github.com/coflyn/mori/blob/main/public/js/modules/authManager.js): `public/js/modules/authManager.js`

### Platform integration

- [Android bridge](https://github.com/coflyn/mori/blob/main/android/app/src/main/java/com/mori/downloader/MainActivity.java): `android/app/src/main/java/com/mori/downloader/MainActivity.java`
- [Background downloads](https://github.com/coflyn/mori/blob/main/android/app/src/main/java/com/mori/downloader/DownloadForegroundService.java): `android/app/src/main/java/com/mori/downloader/DownloadForegroundService.java`
- [Desktop native commands](https://github.com/coflyn/mori/blob/main/src-tauri/src/lib.rs): `src-tauri/src/lib.rs`

### Other components

- **User**
- **Scraper providers**
- **Device files**
- **Clipboard**

## Connections

- User → App entry: opens app
- Clipboard → Link intents: provides link
- User → Link intents: shares link
- App entry → Link intents: handles paste
- User → Batch manager: submits links
- Batch manager → Scraper dispatch: requests scrape
- Link intents → Scraper dispatch: requests scrape
- Scraper dispatch → Scraper providers: requests media data
- Scraper dispatch → Download result UI: returns results
- Download result UI → Download orchestration: starts download
- Download orchestration → Downloader core: dispatches download
- Downloader core → Media resolver: resolves media
- Downloader core → Request headers: prepares headers
- Downloader core → Filename handling: prepares filename
- Downloader core → Media post-process: processes media
- Downloader core → File storage: saves file
- File storage → Device files: writes media
- Download history → Device files: reads saved items
- App entry → Download history: renders history
- User → Media player: previews media
- User → Photo to PDF: creates PDF
- User → Settings and storage: configures app
- Settings and storage → Device files: manages storage
- User → Privacy lock: unlocks app
- App entry → Privacy lock: verifies lock
- Scraper hot-patching → Scraper dispatch: patches engines
- Android bridge → Background downloads: starts service
- File storage → Desktop native commands: invokes native download
