brainstorming
brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or planning anything new, in software or out of it (a talk, a business, a renovation).
peertubeBrowse PeerTube federated video from the terminal — instance stats, latest videos, video detail, comment threads, channels, accounts, instance-local search, and OAuth2 login with per-instance token persistence. Set PEERTUBE_SERVER to any instance; point it at sepiasearch.org for fediverse-wide search. Use when the user mentions PeerTube, federated video, Se…
Independent GitHub snapshot · Automated classification · Original documentation governs
requests. Reads are anonymous; authenticated
commands (me, my-videos) need a token from scripts/peertube login. Tokens persist
per-instance to ~/.config/peertube/token.json (owner-only).
metadata:
tags: peertube, federated-video, activitypub, video-platform, sepiasearch, api-client
sources: https://docs.joinpeertube.org/api-rest-reference.html, https://sepiasearch.org/Browse any PeerTube instance — a federated deployment, not a single API — from the
terminal: instance stats, latest videos, full video detail, comment threads, channels,
accounts, and instance-local search. Authenticate with OAuth2 only for your own account
commands. Every command is read-only except login/logout.
export PEERTUBE_SERVER="https://<INSTANCE_HOST>" # e.g. https://tilvids.com
To search the whole fediverse instead of one instance, point the same variable at the
public search index: PEERTUBE_SERVER=https://sepiasearch.org (same API shape — see
references/search-and-discovery.md).
Nothing else is required to browse: videos, search, channels, comments, and instance info are anonymous reads.
(Optional) Log in only for your own account commands (me, my-videos):
scripts/peertube login --username <NAME> --prompt
PeerTube uses plain OAuth2 with per-instance client credentials: the CLI anonymously
fetches the client pair from GET /api/v1/oauth-clients/local (singular local), then
exchanges your username/password for a bearer token at POST /api/v1/users/token
(grant_type=password, form-encoded). The token rides Authorization: Bearer <token>,
lives for the instance's configured lifetime (read expires_in from the response — do not
assume a fixed number), and is refreshed automatically when it expires. The token file is
written owner-only to ~/.config/peertube/token.json keyed by server URL.
Do not commit tokens — they are account credentials; revoke with scripts/peertube logout (POST /users/revoke-token) when done. Current production instances mask
client_secret in the API response; the CLI detects this and explains the workaround.
Details and wire-level error signatures:
references/auth-and-tokens.md.
scripts/peertube server # name, description, user/video/view counters
scripts/peertube server --json
Composes GET /config/about + GET /server/stats (canonical paths — there is no
/instance/stats).
scripts/peertube videos # latest 15, offset pagination
scripts/peertube videos --limit 50 --offset 50
scripts/peertube videos --sort -views --json # popular first
Pagination is start/count offsets (max count 100) — the API has no page
parameter.
scripts/peertube search --query "linux" # instance-local (searchTarget=local)
scripts/peertube search -q "docker" --limit 20 --json
PEERTUBE_SERVER="https://sepiasearch.org" scripts/peertube search -q "linux" # fediverse-wide
The bundled CLI performs instance-local search only (searchTarget=local). For
fediverse-wide search, point PEERTUBE_SERVER at SepiaSearch — same commands, wider
index. Search results carry channel.host/url, the origin instance of federated hits.
scripts/peertube video --id <UUID> # numeric id, UUID, or shortUUID all work
scripts/peertube video --id <UUID> --json | jq '{name, description, views, url}'
scripts/peertube comments --id <UUID> # GET /videos/{id}/comment-threads
scripts/peertube comments --id <UUID> --limit 30 --json
scripts/peertube channels --limit 20 --json # instance channel list
scripts/peertube channel --handle framasoft@framatube.org # name or name@host
scripts/peertube account --name chocobozzz@framatube.org
channel shows metadata plus the channel's uploads (offset-paginated).
scripts/peertube me --json | jq '.role.label'
scripts/peertube my-videos --limit 50 --json
scripts/peertube login --username <NAME> --prompt # hidden prompt
echo "<PASSWORD>" | scripts/peertube login --username <NAME> --password-stdin
scripts/peertube login --username <NAME> --otp <CODE> # 2FA-enabled accounts
scripts/peertube logout # revoke server-side + delete file
scripts/peertube --json videos # flag before or after the subcommand
scripts/peertube videos --json
scripts/peertube --dry-run search --query test # request plan, zero network
scripts/peertube --verbose videos --limit 2 # trace requests on stderr
scripts/peertube --server https://tilvids.com server # per-invocation instance override
--dry-run emits {"dry_run": true, "method", "path", "params"} (login adds
form_fields names only, never values) — use it to verify a jq chain before running it
live. --help and --dry-run never require credentials.
scripts/peertube search --query "linux" --limit 5 --json | jq -r '.videos[0].uuid'
scripts/peertube video --id "$(scripts/peertube search -q linux --limit 1 --json | jq -r '.videos[0].uuid')" --json
scripts/peertube channel --handle framasoft@framatube.org --limit 100 --offset 0 --json | jq -r '.videos[].name'
# loop: advance --offset by the returned count until you reach .total (no page param exists)
scripts/peertube server --json | jq '{name: .instance.name, videos: .stats.totalLocalVideos, users: .stats.totalUsers, views: .stats.totalLocalVideoViews}'
scripts/peertube login --username <NAME> --prompt
scripts/peertube me --json | jq '{username, role: .role.label, quota_bytes: .videoQuota}'
scripts/peertube logout
--json output keys are stable snake_case wrappers around raw API objects: videos
(the API's {total, data} list objects), channels, threads (+ total_not_deleted),
instance + stats, channel, dry_run/method/path/params for plans. Video
objects keep PeerTube's own field names — uuid, shortUUID, name, duration
(seconds), views, publishedAt, account{name,displayName,host},
channel{name,displayName,host} — so jq selectors transfer directly to raw curl
against /api/v1. Example: jq -r '.videos[] | [.name, .views, .channel.displayName] | @tsv'.
channel.host, video url).searchTarget=local searches the
instance's own catalog; search-index (or SepiaSearch's base URL) searches the
fediverse via an external index. Omitting searchTarget gives the instance's own
scope on current servers, not the fediverse. The bundled CLI is instance-local unless
you point it at sepiasearch.org.page does not exist — collections paginate with start/count (max 100).
Clients sending page= silently re-read the first page forever./comment-threads (hyphenated) — /comments and
/commentthreads are not routes (they 400 on current servers)./server/stats (operation titled
"instance stats"), about at /config/about, config at /config. No
/instance/* metadata paths exist.client_secret — oauth-clients/local answers
"********************************" on current production instances; a token request
with the masked value 400s. The CLI detects it and explains the front-end-asset
workaround. response_type=code appears in old quick-start curls but is not part of
the current token schema — the CLI omits it.expires_in per response; the
CLI persists the absolute expires_at and refreshes automatically. Store tokens
owner-only, never commit them, revoke on logout (deleting the file alone leaves the
session live).x-peertube-otp on the token request; the CLI maps a
bare 401 to "pass --otp".Retry-After and back off. Errors use RFC7807 application/problem+json bodies, and
unknown routes answer 400 (not 404) — read the body.duration is seconds; ids are triple (id, uuid, shortUUID — all accepted by
detail endpoints); role is an object {id, label}; videoQuota is bytes./users/me* and mutations always do.Use this skill for read-only interaction with PeerTube instances: browsing and filtering videos, instance-local or fediverse-wide search (via SepiaSearch), video detail and comments, channel/account exploration, instance stats, and managing your own account session with OAuth2 (login, profile, my videos, logout).
Do not use this skill for YouTube, Vimeo, or other platform uploads or any video editing/transcoding (route to those platforms' own tooling and ffmpeg); for installing, hosting, or administering a PeerTube server (instance administration is out of scope — the bundled CLI is read-only plus login/logout); or for generic ActivityPub/Mastodon federation questions (use a Mastodon or ActivityPub skill).
| File | Use it for |
|---|---|
| references/auth-and-tokens.md | OAuth2 flow (oauth-clients/local, password grant), secret masking, refresh/revocation, token-file hygiene, wire error signatures |
| references/search-and-discovery.md | searchTarget local vs search-index, SepiaSearch semantics, search parameters and sorts |
| references/endpoint-catalog.md | Every read endpoint's parameters, response shapes, pagination, rate limits |
| references/gotchas-field-guide.md | Symptom → cause → fix table for every failure signature and version drift |
| references/worked-recipes.md | Multi-step CLI/jq workflows, raw curl auth chain, jq processing patterns |
scripts/peertube — the bundled Python CLI (--json, --dry-run, --verbose,
--server override). Imports only the standard library and requests.scripts/test_peertube.py — offline test suite (pytest + unittest compatible); all
HTTP is mocked, zero network egress.requests. Any reachable PeerTube instance (or SepiaSearch)
works; no credentials exist or are required by default. No service is started by this
skill.