Agent Skill
2/7/2026

id

One sentence about this skill. Use this skill when: "keyword1" "keyword combination"

S
select
0GitHub Stars
1Views
npx skills add select/movies-deluxe

SKILL.md

Nameid
DescriptionOne 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%" />

Skills Info
Original Name:idAuthor:select