Skip to main content
ClaudeWave
psyb0t avatar
psyb0t

docker-flickies

Ver en GitHub

Self-hosted video API in one Docker container. Lipsync (LatentSync 1.5, Wav2Lip), face restoration (GFPGAN), ffmpeg ops (trim/concat/transcode/scale/mux/extract/thumbnail/gif), ffprobe metadata, async jobs + webhooks. REST + MCP. CPU + CUDA. Drive from shell, generated Go/Python clients, or LLM agent.

MCP ServersRegistry oficial1 estrellas0 forksPythonWTFPLActualizado today
Install in Claude Code / Claude Desktop
Method: UVX (Python) · docker-flickies
Claude Code CLI
claude mcp add docker-flickies -- uvx docker-flickies
claude_desktop_config.json (Claude Desktop)
{
  "mcpServers": {
    "docker-flickies": {
      "command": "uvx",
      "args": ["docker-flickies"],
      "env": {
        "FLICKIES_AUTH_TOKEN": "<flickies_auth_token>"
      }
    }
  }
}
1. Run the command above in your terminal (Claude Code), or paste the JSON config into claude_desktop_config.json (Claude Desktop).
2. Replace any <placeholder> values with your API keys or paths.
3. Restart Claude. The MCP server and its tools appear automatically.
💡 Package name inferred from the repository name. Verify it exists on PyPI, or clone https://github.com/psyb0t/docker-flickies and follow its README.
Detected environment variables
FLICKIES_AUTH_TOKEN
Casos de uso

Resumen de MCP Servers

# flickies

[![Docker Pulls](https://img.shields.io/docker/pulls/psyb0t/flickies?style=flat-square)](https://hub.docker.com/r/psyb0t/flickies)
[![Docker Hub](https://img.shields.io/docker/v/psyb0t/flickies?sort=semver&label=Docker%20Hub&style=flat-square)](https://hub.docker.com/r/psyb0t/flickies)
[![License: WTFPL](https://img.shields.io/badge/License-WTFPL-brightgreen.svg?style=flat-square)](http://www.wtfpl.net/)
[![Python 3.12+](https://img.shields.io/badge/python-3.12+-blue.svg?style=flat-square)](https://www.python.org/downloads/)

**Video toolkit. One port. Zero cloud. Lipsync, face restore, ffmpeg. Fire-and-forget async jobs. Webhooks. Spec-first OpenAPI; typed Go + Python clients generated from the same spec.**

The video sibling of [audiolla](https://github.com/psyb0t/docker-audiolla) (audio) and [talkies](https://github.com/psyb0t/docker-talkies) (speech). Same wire format, same async-job model, same bind-mount-`/data` story, same Makefile shape, same `:latest` + `:latest-cuda` split, same opt-in non-commercial gate.

POST a JSON body. Get a video back. Drive it from curl, shell scripts, the generated Go/Python clients, or point an LLM agent at the MCP endpoint.

No account. No subscription. `docker run` and you're done.

---

## What's in the box

| | |
|--|--|
| 👄 **Lipsync** | **LatentSync 1.5** (ByteDance, Apache-2.0, default on CUDA) + **Wav2Lip / Wav2Lip-GAN** (Rudrabha, fast/low-VRAM, behind `FLICKIES_ENABLE_NONCOMMERCIAL=1`) |
| 🧹 **Face restore** | **GFPGAN v1.4** (TencentARC, Apache-2.0) — chains after Wav2Lip to fix the soft 96×96 mouth crop, or use standalone |
| ⚙️ **ffmpeg ops** | Trim · concat · transcode (incl. gif + fps + codec change) · scale · mux audio · extract audio · thumbnail grid — pure ffmpeg, CPU |
| 📋 **Info** | ffprobe metadata at `/v1/video/info` — duration, codec, fps, dimensions, bitrate |
| 🔗 **MCP server** | All endpoints exposed as MCP tools so function-calling LLMs can drive the pipeline |
| 📜 **Spec-first** | `openapi.yaml` is the single source of truth — server-side Pydantic, Go client, and Python client all regenerated from one file |
| 🐳 **Hot-swap eviction + idle unload** | One GPU pool. Different model requested → current model evicted. Idle longer than `FLICKIES_IDLE_UNLOAD_SECS` (default 600s) → unloaded by the sweeper. |

## Quick start

```bash
docker run -d --name flickies \
  -v $HOME/flickies-data:/data \
  -p 8000:8000 \
  psyb0t/flickies:latest

curl -s -X POST http://localhost:8000/v1/video/info \
  -H "Content-Type: application/json" \
  -d '{"file_path": "uploads/clip.mp4"}' | jq
```

CUDA image at `psyb0t/flickies:latest-cuda` runs every engine at usable speed. CPU image runs all ffmpeg ops (trim/concat/transcode incl. gif/scale/mux/extract/thumbnail-grid/info) + Wav2Lip-CPU (~44s for a 3s clip; OK for short ones). GFPGAN + LatentSync 1.5 are CUDA-only — CPU image refuses to load them.

Weights live in the standard HuggingFace cache layout under `/data/hf/hub/models--<org>--<name>/{blobs,snapshots,refs}/…` — content-addressed blobs, snapshot-named symlinks, reusable by any other HF-aware tool sharing the bind mount (not just flickies). Sources:

| engine | HF repo |
|---|---|
| `wav2lip` / `wav2lip-gan` | `Nekochu/Wav2Lip` |
| S3FD detector | `ByteDance/LatentSync-1.5` (bundled in `auxiliary/`) |
| `gfpgan` | `leonelhs/gfpgan` |
| `latentsync-1.5` | `ByteDance/LatentSync-1.5` |

**Lazy by default** — each engine fetches its repo on first request. Set `FLICKIES_ENABLED_ENGINES=wav2lip,gfpgan` (or `FLICKIES_PREFETCH_ALL=1`) to pull at boot before uvicorn starts. `FLICKIES_OFFLINE=1` disables auto-download (operators stage the snapshot dir manually).

## Auth

Bearer token set via env. Any string works:

```bash
docker run -e FLICKIES_AUTH_TOKEN=testme ...
# clients then send: curl -H "Authorization: Bearer testme" ...
```

Unset → auth disabled. `/healthz` is always probe-exempt.

## Logging

Structured JSON to **both** stderr AND a rotating file at `FLICKIES_LOG_FILE` (default `/data/logs/flickies.log`, 50 MB × 5 backups). Every line carries `time` (ISO 8601 UTC sub-ms), `level`, `logger`, `file`, `line`, `func`, `msg`, `trace_id`, `request_id` + typed extras.

Inbound `X-Request-Id` (UUID v4 OR ULID; garbage → server mints fresh) threads onto the logging scope via `ContextVar` + echoes back on the response. Outbound httpx fetches forward `X-Request-Id` + `X-Trace-Id` so the next hop's logs correlate. Sensitive keys (`authorization`, `cookie`, `*token*`, `*secret*`, `hf_*`, `sk-ant-*`) get `[REDACTED]` automatically at format time.

Default level is `INFO`; set `FLICKIES_LOG_LEVEL=DEBUG` for reconstruction-grade tracing: every ffmpeg/ffprobe command + result, each transform's decision (e.g. trim `stream_copy` vs `precise_reencode`) + output size, engine inference timing (`wall_secs`), URL fetch/upload byte counts, and job lifecycle. Logged URLs are stripped of their query string so presigned credentials never reach the logs.

## MCP

Eleven tools at `/v1/mcp` via streamable-HTTP JSON-RPC: `list_engines`, `info`, `lipsync`, `restore`, `transcode`, `trim`, `concat`, `scale`, `mux_audio`, `extract_audio`, `thumbnail_grid`. Point a function-calling LLM at it (LibreChat, Cursor, Claude desktop with the MCP connector) and it drives the pipeline.

## Hardware ceiling

Tested target: **RTX 3060 12 GB**. Fits LatentSync 1.5 (~8 GB) with headroom. Wav2Lip + GFPGAN chain peaks at ~5 GB. One engine resident at a time — different model request triggers hot-swap eviction.

## License posture

Wav2Lip variants are trained on LRS2 (non-commercial). The server **refuses to load them** unless `FLICKIES_ENABLE_NONCOMMERCIAL=1` is set in the server env. LatentSync 1.5 (Apache-2.0) is the commercial-safe default — no gate.

| Engine | License | Gate |
|--------|---------|------|
| LatentSync 1.5 | Apache-2.0 | none |
| Wav2Lip / Wav2Lip-GAN | LRS2 non-commercial | `FLICKIES_ENABLE_NONCOMMERCIAL=1` |
| GFPGAN | Apache-2.0 | none |
| ffmpeg / ffprobe (not an engine; standard CPU helper) | LGPL (ffmpeg) | none |

Same pattern as audiolla's MusicGen / matchering gates.

## Spec-first

Every request/response shape lives in [`openapi.yaml`](openapi.yaml). The Pydantic models in `src/flickies/schema/_generated.py`, the Go client in `pkg/clients/go/client.gen.go`, and the Python client in `pkg/clients/python/flickies-client/` are all generated from that single file.

```bash
make generate              # regenerate all three (server models + Go client + Python client)
make generate-models       # just server-side Pydantic
make generate-client-go    # just the Go client
make generate-client-python # just the Python client
make generate-check        # CI gate — fail if generated files drift from openapi.yaml
```

Never hand-edit generated files. Edit `openapi.yaml`, run `make generate`, commit everything together.

## Generated clients

### Go

```bash
go get github.com/psyb0t/docker-flickies/pkg/clients/go@latest
```

```go
import flickies "github.com/psyb0t/docker-flickies/pkg/clients/go"

c, _ := flickies.NewClient("http://localhost:8000")
resp, err := c.PostVideoLipsync(ctx, flickies.VideoLipsyncRequest{...})
```

### Python

```bash
pip install "git+https://github.com/psyb0t/docker-flickies.git#subdirectory=pkg/clients/python/flickies-client"
```

```python
from flickies_client import Client
from flickies_client.api.lipsync import post_video_lipsync
from flickies_client.models import VideoLipsyncRequest

client = Client(base_url="http://localhost:8000")
result = post_video_lipsync.sync(client=client, body=VideoLipsyncRequest(...))
```

## aigate integration

Mounts in [aigate](https://github.com/psyb0t/aigate) at `/flickies/` and `/flickies-cuda/` behind the same nginx → `make run-bg` lives. `FLICKIES=1` and `FLICKIES_CUDA=1` toggle the variants.

## License

WTFPL for flickies itself. Bundled models follow their upstream licenses — review before commercial redistribution.
async-jobscudadockerface-restorationfastapiffmpeggenerated-clientsgfpganlatentsynclipsyncllm-agentsmcpopenapipythonself-hostedtranscodingvideovideo-processingwav2lipwebhooks

Lo que la gente pregunta sobre docker-flickies

¿Qué es psyb0t/docker-flickies?

+

psyb0t/docker-flickies es mcp servers para el ecosistema de Claude AI. Self-hosted video API in one Docker container. Lipsync (LatentSync 1.5, Wav2Lip), face restoration (GFPGAN), ffmpeg ops (trim/concat/transcode/scale/mux/extract/thumbnail/gif), ffprobe metadata, async jobs + webhooks. REST + MCP. CPU + CUDA. Drive from shell, generated Go/Python clients, or LLM agent. Tiene 1 estrellas en GitHub y se actualizó por última vez today.

¿Cómo se instala docker-flickies?

+

Puedes instalar docker-flickies clonando el repositorio (https://github.com/psyb0t/docker-flickies) o siguiendo las instrucciones del README en GitHub. ClaudeWave también te ofrece bloques de instalación rápida en esta misma página.

¿Es seguro usar psyb0t/docker-flickies?

+

psyb0t/docker-flickies aún no ha sido auditado por nuestro agente de seguridad. Revisa el repositorio original en GitHub antes de usarlo en producción.

¿Quién mantiene psyb0t/docker-flickies?

+

psyb0t/docker-flickies es mantenido por psyb0t. La última actividad registrada en GitHub es de today, con 0 issues abiertos.

¿Hay alternativas a docker-flickies?

+

Sí. En ClaudeWave puedes explorar mcp servers similares en /categories/mcp, ordenados por popularidad o actividad reciente.

Despliega docker-flickies en tu cloud

Lleva este repo a producción en minutos. Cada plataforma genera su propio entorno con variables de entorno editables.

¿Mantienes este repo? Añade un badge a tu README

Pega el badge en tu README de GitHub para mostrar que está auditado por ClaudeWave. Cada badge enlaza de vuelta a esta página y muestra el Trust Score actual.

Featured on ClaudeWave: psyb0t/docker-flickies
[![Featured on ClaudeWave](https://claudewave.com/api/badge/psyb0t-docker-flickies)](https://claudewave.com/repo/psyb0t-docker-flickies)
<a href="https://claudewave.com/repo/psyb0t-docker-flickies"><img src="https://claudewave.com/api/badge/psyb0t-docker-flickies" alt="Featured on ClaudeWave: psyb0t/docker-flickies" width="320" height="64" /></a>

Más MCP Servers

Alternativas a docker-flickies