Skip to main content
NoteWise publishes a minimal two-stage Docker image to GitHub Container Registry (GHCR) on every release. The container runs as a non-root user (uid 1001) and is designed for stateless, reproducible runs.

Pulling the image

docker pull ghcr.io/whoisjayd/notewise:latest
You can also pin to a specific release tag:
docker pull ghcr.io/whoisjayd/notewise:1.0.0

Basic usage

The container’s entrypoint is the notewise binary. Pass any subcommand and flags as arguments to docker run. Mount /output to receive the generated notes on your host filesystem, and pass your API key as an environment variable:
docker run --rm \
  -e GEMINI_API_KEY="your_key" \
  -v "$(pwd)/output:/output" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/watch?v=VIDEO_ID"
The working directory inside the container is /output. NoteWise writes study notes there by default, so mounting -v "$(pwd)/output:/output" is all you need to get the files onto your host.

Using —no-ui in containers

The Rich live dashboard requires a TTY. In non-interactive environments (CI, scripts, cron), add --no-ui to print plain progress lines to stdout instead:
docker run --rm \
  -e GEMINI_API_KEY="your_key" \
  -v "$(pwd)/output:/output" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/watch?v=VIDEO_ID" --no-ui
If you do want the dashboard in an interactive terminal, allocate a TTY with -t:
docker run --rm -t \
  -e GEMINI_API_KEY="your_key" \
  -v "$(pwd)/output:/output" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/watch?v=VIDEO_ID"

Environment variables

Pass API keys and configuration as -e flags. The table below lists the most common variables:
VariableDescription
GEMINI_API_KEYGoogle Gemini API key (default provider)
OPENAI_API_KEYOpenAI API key
ANTHROPIC_API_KEYAnthropic API key
GROQ_API_KEYGroq API key
XAI_API_KEYxAI (Grok) API key
MISTRAL_API_KEYMistral API key
COHERE_API_KEYCohere API key
DEEPSEEK_API_KEYDeepSeek API key
DEFAULT_MODELOverride the default LLM model string
OUTPUT_DIROverride the output directory inside the container
TEMPERATURELLM sampling temperature (0.0–1.0)
MAX_TOKENSMax tokens per LLM response
MAX_CONCURRENT_VIDEOSParallel video processing limit
YOUTUBE_REQUESTS_PER_MINUTEYouTube request rate limit
YOUTUBE_COOKIE_FILEPath to Netscape cookie file inside the container
Use --env-file to pass multiple variables from a local file:
docker run --rm \
  --env-file .env \
  -v "$(pwd)/output:/output" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/playlist?list=PLAYLIST_ID" --no-ui
Never bake API keys into a Docker image layer. Always supply them at runtime via -e or --env-file.
To process private or restricted videos, mount your Netscape-format cookie file into the container and pass its in-container path with --cookie-file:
docker run --rm \
  -e GEMINI_API_KEY="your_key" \
  -v "$(pwd)/output:/output" \
  -v "$(pwd)/cookies.txt:/cookies.txt:ro" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/watch?v=VIDEO_ID" --cookie-file /cookies.txt
Mounting the file with :ro (read-only) is a good practice — the container does not need to write to it.

Persisting the cache and config

By default, each container run starts with an empty NoteWise state directory. To persist the cache and config across runs, mount the .notewise directory:
docker run --rm \
  -e GEMINI_API_KEY="your_key" \
  -v "$(pwd)/output:/output" \
  -v "$(pwd)/.notewise:/home/notewise/.notewise" \
  ghcr.io/whoisjayd/notewise:latest \
  process "https://youtube.com/watch?v=VIDEO_ID" --no-ui
The container stores its state at /home/notewise/.notewise (set by the NOTEWISE_HOME environment variable in the image). Mounting a host directory there means the cache database and log files survive between runs, and already-processed videos are skipped automatically.

Non-root user

The container runs as a dedicated non-root user named notewise with uid 1001 and gid 1001. If you are mounting host directories, ensure the host path is writable by uid 1001:
mkdir -p output
chown 1001:1001 output
On Linux hosts, this is required for the container to write into the mounted directory. On Docker Desktop for macOS and Windows, the bind mount permissions are handled automatically.

Build docs developers (and LLMs) love