id
One sentence about this skill. Use this skill when: "keyword1" "keyword combination"
SKILL.md
| Name | id |
| Description | One sentence about this skill. Use this skill when: "keyword1" "keyword combination" |
Movies Deluxe
A Nuxt application for discovering and managing free legal movie streams.
Visit Movies Deluxe
<img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-collections.png?raw=true" alt="Curated Collections" width="60%" /> <img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-liked.png?raw=true" alt="Liked Movies" width="16%" /> <img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-movie.png?raw=true" alt="Movie View" width="18%" />
Filter, Sort, and Theme
<img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-filters.png?raw=true" alt="Advanced Filters" width="25%" /> <img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-themes.png?raw=true" alt="Theme Options" width="25%" />
About
I dreamt about his project for while, but it flet too big to start. Finally this Christmas break 2025 I took the curage and started. I heavily relied on agentic development (as an additional learning goal) using OpenCode (with Sonnet 4.5 and Gemini 3 Flash and the beads tracker). With this huge amount of data (31,477 movies) the curation and linking to the correct metadata is not easy and there are many wrong matches and "bad" entries like trailers and clips. Over time I will implement more data curation strategies, so please be patient.
Change Log
For detailed information about recent updates and feature additions, please see the CHANGELOG.md.
Tech Stack
This project is built with
The server API is exclusively used for local administration tasks for data collection, while the production build runs entirely client-side without a backend server. In production, movie data is queried using an in-browser SQLite database via WebAssembly, enabling offline-capable search functionality directly in the user's browser, next to static files.
Embedding Models: Learn about the different semantic search models available (Nomic, BGE Micro, Potion) with detailed comparisons of dimensions, file sizes, and performance trade-offs.
Architecture Diagrams
-
SQLite Browser Architecture: Detailed architecture of the in-browser SQLite database including WebAssembly initialization, database worker with message queue, embeddings attach/detach pattern, query execution flow, and caching strategy.
-
Embedding Generation & Vector Search: Complete architecture for semantic search including embedding worker, BGE and Potion providers, text preprocessing, model inference, and vector search with sqlite-vec.
SQLite Browser Architecture Flow
flowchart TB
subgraph UI["Main Thread"]
UIComp["UI Components"]
Comp["useDatabase Composable"]
end
subgraph Worker["Web Worker"]
Queue["Message Queue"]
Handler["handleMessage()"]
Cache["Movie Cache"]
subgraph SQLite["SQLite Core"]
WASM["SQLite WASM"]
MainDB["Main DB<br/>:memory:"]
EmbDB["Embeddings DB"]
Vec["sqlite-vec"]
end
end
subgraph Storage["Storage"]
MoviesDB["movies.db"]
EmbeddingsDB["embeddings-{model}.db"]
end
UIComp -->|"init / query / attach"| Comp
Comp -->|"postMessage()"| Queue
Queue -->|"FIFO"| Handler
Handler -->|"Load"| MoviesDB
Handler -->|"Deserialize"| MainDB
Handler -->|"Attach"| EmbeddingsDB
Handler -->|"ATTACH"| EmbDB
WASM -->|"Extension"| Vec
MainDB <-->|"JOIN"| EmbDB
Handler -->|"Cache"| Cache
Handler -->|"Return"| Comp
Embedding Generation & Vector Search Flow
flowchart TB
subgraph UI["Main Thread"]
UIComp["UI Components"]
VS["useVectorSearch"]
BE["useBrowserEmbedding"]
end
subgraph Worker["Embedding Worker"]
Handler["Message Handler"]
subgraph Providers["Providers"]
BGE["BGE<br/>(transformers.js)"]
Potion["Potion<br/>(onnxruntime-web)"]
end
end
subgraph Models["Models"]
BGE2["BGE-micro-v2<br/>384d"]
Potion2["Potion-base-2M<br/>64d"]
end
subgraph DB["SQLite Database"]
Vec["sqlite-vec"]
Table["vec_movies"]
end
UIComp -->|"search(query)"| VS
VS -->|"init / embed"| BE
BE -->|"postMessage()"| Handler
Handler -->|"Load"| BGE
Handler -->|"Load"| Potion
BGE -->|"Fetch"| BGE2
Potion -->|"Fetch"| Potion2
Handler -->|"Generate Embedding"| Providers
Providers -->|"Return"| BE
VS -->|"vectorSearch"| Vec
Vec -->|"Similarity"| Table
Table -->|"Results"| VS
VS -->|"Display"| UIComp
Data Sources
Data is collected via multiple APIs
as well as with the help of a local LLM (using Ollama). The curation of the data is done with various regexes, small algorithms and manually via the admin UI of this project.
Setup
Install dependencies and set up data.
pnpm install
pnpm db:generate
pnpm posters:extract
Database Generation Options
The pnpm db:generate command supports several options for customizing the database generation:
-m, --embedding-model <model>: Select the embedding model to use for semantic search.nomic: Nomic Embed Text (768D, default)bge-micro: BGE Micro v2 (384D)potion: Potion Base 2M (64D)
--skip-json: Skip generating individual movie JSON files (faster if only the SQLite database needs updating).-h, --help: Show help message.
Example:
pnpm db:generate -m bge-micro --skip-json
For more details on embedding models, see the Embedding Models Documentation.
API Keys Setup
API Keys Setup: Configuration guide for admin features requiring external API access.
Project Structure
movies-deluxe/
├── app/ # Frontend application (Nuxt 4)
│ ├── assets/ # Processed assets (images, SVGs)
│ ├── components/ # Vue components (auto-imported)
│ ├── composables/ # Composables (auto-imported)
│ ├── constants/ # Application constants
│ ├── layouts/ # Layout components
│ ├── pages/ # File-based routing
│ ├── plugins/ # Nuxt plugins (dark mode, splash screen)
│ ├── stores/ # Pinia stores (auto-imported)
│ ├── types/ # Frontend TypeScript types
│ ├── utils/ # Utility functions (auto-imported)
│ └── workers/ # Web Workers (database worker)
├── config/ # Configuration files
│ └── youtube-channels.json # YouTube channel configuration
├── data/ # Raw data files
│ ├── movies.json # Source movie database
│ ├── failed-*.json # Failed operation tracking
│ └── posters-*.tar.gz # Archived poster images
├── docs/ # Project documentation
├── prompts/ # AI prompts for data extraction
├── public/ # Static assets (served at root)
│ ├── data/ # Generated data files
│ │ ├── collections.json # Curated movie collections (top-movies, etc.)
│ │ └── stats.json # Database statistics and metrics
│ ├── posters/ # Downloaded poster images (13,000+ files)
│ └── sqlite-wasm/ # SQLite WebAssembly files (sql.js)
├── scripts/ # Maintenance and migration scripts
├── server/ # Backend API (Nuxt server, localhost only)
│ ├── api/ # API endpoints
│ │ ├── admin/ # Admin API (scraping, enrichment, etc.)
│ │ └── movies.get.ts # Public movie data API
│ ├── plugins/ # Server plugins
│ └── utils/ # Server utilities
└── shared/ # Shared code between frontend and backend
├── types/ # Shared TypeScript types
└── utils/ # Shared utility functions
Admin Dashboard
The admin dashboard started of as individual scripts that were migrated to server API endpoints. Progress is reported via SSE in real time since the actions can take from minutes to multiple days.
The dashboard can only be reached on localhost at /admin.
<img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-admin-stats.png?raw=true" alt="Admin Statistics" width="20%" /> <img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-admin-scrape.png?raw=true" alt="Admin Scrape" width="20%" /> <img src="https://github.com/select/movies-deluxe/blob/main/docs/screenshots/movies-deluxe-admin-collection.png?raw=true" alt="Admin Collection Manager" width="20%" />