# Deploy Meme Search with Easypanel

URL: /templates/meme-search

Meme Search is a self-hosted app for indexing and searching your local meme collection with natural language instead of scrolling through a camera roll. Every image gets an AI-generated description, embedded into PostgreSQL with pgvector, and made searchable by meaning rather than filename. Image descriptions can be generated locally with a bundled vision model or offloaded to any OpenAI-compatible API.

## Installation notes

Open the app URL and drag memes into the direct-upload area, or mount
your own meme folders into the web and jobs services under
/rails/public/memes to bulk-import an existing collection. New uploads
are picked up by the background jobs service, described by the local
vision model (or your configured OpenAI-compatible API), and embedded
into Postgres automatically, after which they become searchable from the
home page.


## Benefits

### Search by Meaning, Not Filename

Every meme is described by a vision model and embedded with pgvector, so a search for "cat looking confused" finds it even if the file is named IMG_4213.jpg.

### No External API Required

The bundled local vision model generates image descriptions on your own hardware by default, so nothing leaves your server unless you choose to switch to an OpenAI-compatible API.

### Bulk Import Existing Collections

Mount an existing folder of memes straight into the container to index a whole collection at once, instead of uploading files one by one.

## Features

### Drag-and-Drop Uploads

Drop new memes directly into the browser and they are picked up by the background jobs service automatically.

### Natural Language Search

Search results are ranked by semantic similarity to your query using pgvector, not just keyword matching.

### Pluggable Vision Backend

Switch between the bundled local model and any OpenAI-compatible vision API by changing a single environment variable.

### Rescan and Re-Index

Trigger a rescan from the UI to pick up new files added to a mounted meme directory or regenerate descriptions after switching providers.

## Configuration

- `appServiceName` (App Service Name, required): meme-search

- `webImage` (Web/Jobs Image, required): ghcr.io/neonwatty/meme_search:v2.2.0

- `generatorImage` (Local Vision Model Image, required): ghcr.io/neonwatty/image_to_text_generator:v2.2.0

- `imageDescriptionProvider` (Image Description Provider, required): Local (bundled vision model, no API key needed) / OpenAI-compatible API

- `openaiApiBaseUrl` (OpenAI-Compatible API Base URL): Set during installation — Only used when Image Description Provider is set to OpenAI-compatible API.

- `openaiApiKey` (OpenAI-Compatible API Key): Set during installation — Only used when Image Description Provider is set to OpenAI-compatible API.

- `openaiVisionModel` (OpenAI-Compatible Vision Model): Set during installation — Only used when Image Description Provider is set to OpenAI-compatible API.

## Services

- meme-search: app (ghcr.io/neonwatty/meme_search:v2.2.0)

- meme-search-jobs: app (ghcr.io/neonwatty/meme_search:v2.2.0)

- meme-search-generator: app (ghcr.io/neonwatty/image_to_text_generator:v2.2.0), optional

- meme-search-db: postgres

## Resources

- [Website](https://meme-search.neonwatty.com)

- [GitHub](https://github.com/neonwatty/meme-search)

- [Documentation](https://github.com/neonwatty/meme-search/blob/main/README.md)

- [Template source](https://github.com/easypanel-io/templates/tree/main/templates/meme-search)