Manifest & store.toml
Every package has two files next to its script. manifest.toml goes into the zip and is read by
Vivi; store.toml only feeds plugins.viviplayer.app and is
not packaged, so editing it needs no new version.
manifest.toml
id = "night-mode" # lowercase-with-dashes, equals the folder name
name = "Night Mode"
version = "1.0.0" # semver; bump it for every change
description = "..." # one or two sentences, shown on the card
author = "You"
kind = "mpv-lua" # mpv-lua | mpv-js (wasm reserved)
entry = "night-mode.lua" # file name = mpv script name = id
min_vivi = "0.8.0" # older Vivi shows "Needs Vivi x"
icon = "night" # Settings icon key (optional)
lucide = "moon" # marketplace icon from lucide.dev
permissions = [] # network | filesystem | subprocess
binaries = [] # native helpers built from helpers/ (optional)
size_note = "+ ffmpeg if needed" # extra note next to the size in Browse (optional)
[[settings]]
key = "strength"
title = "Strength"
type = "choice" # toggle | choice | text | secret | action
options = ["Medium", "Light", "Strong"]
default = "Medium"
| Field | Required | Meaning |
|---|---|---|
id |
yes | Stable id, also the config key [plugins.<id>] and the script-opts prefix. |
name, description, author |
yes | Shown in Settings and the marketplace. |
version |
yes | Semver. A released version is immutable. |
kind |
yes | mpv-lua or mpv-js. |
entry |
yes | Entry script inside the package. |
min_vivi |
yes | Lowest Vivi version that can run it. |
permissions |
no | Declared capabilities, see Permissions & sandbox. |
settings |
no | Setting specs, see Settings. |
binaries |
no | Native helper names, see System binaries & ffmpeg. |
icon, lucide, size_note |
no | Presentation. |
scripts/package-plugins.py validates the required fields and fails on anything missing.
store.toml
# Marketplace listing (plugins.viviplayer.app). Not part of the package zip.
categories = ["Video", "Tools"]
tags = ["audio", "dynamic-range", "dialogue"]
screenshots = ["night-mode-settings"] # docs/screenshots/plugins/<name>.png (+ webp/)
[[changelog]]
version = "1.0.0"
date = "2026-10-14"
notes = "First release."
Add a [[changelog]] entry for every version; the marketplace shows it on the plugin page and in
the update feed. Prefer real in-player screenshots over
settings cards.