record.page_policy = "untrusted", and that a program a project
names runs only when the machine sets record.programs to ask or run. Such a program runs with
your user’s rights and can read every file you can, .env included, and it reaches whatever your
user can reach. The default is refuse, and decktalk check lists every program a project names, as
programs a project names says.
Requests that carry your content
These requests carry text from your project. Every one of them is made only by a command you run on purpose. Every one sent to a cloud service needs an API key that you supply, and the local voice needs none.
Narration to
api.elevenlabs.io. The request carries the value of ELEVENLABS_API_KEY in a header, to the host [elevenlabs] base_url names. Only this machine’s own file, environment or --set can name it, and a project file that sets it is refused, because the key goes wherever it points. The context is drawn only from the sections a run selects, so a run narrowed with --section to one section read by one voice sends no neighbouring text. A run with --no-spend sends nothing at all.
Narration by the local voice to 127.0.0.1:9361. No key is sent. The host is the one [dtsp] base_url names, 127.0.0.1:9361 by default, and only this machine’s own file, environment or --set can name another. A project file that sets it is refused. The local voice bills nothing, so a run with --no-spend still sends the text. At the default address the text never leaves the machine.
Word timing by the local aligner to 127.0.0.1:9361. No key is sent. The host is the one [dtsp] base_url names, the same server the local voice speaks to, and only this machine’s own file, environment or --set can name another. The aligner bills nothing. A take whose aligned words are kept in takes/aligned/ plays them without asking it, so a build of a project that commits them sends nothing.
Sound effects and ambience to api.elevenlabs.io. The request carries the value of ELEVENLABS_API_KEY in a header. The prompt is text you wrote in decktalk.toml, so you decide what it describes.
Music to api.elevenlabs.io. The request carries the value of ELEVENLABS_API_KEY in a header. Each part of the music is bought once into the score directory, score/ unless [score] dir names another, and the ledger there keeps it from being bought again. Deleting build/ sends nothing.
Reading a request before you make it
decktalk check --json prices the narration of a voiced run with no API key and no request. Its cost object
reports the sections a voiced run would pay for, their character count, the price per thousand
characters and the layer that set it, so a reviewer can read exactly what would be sent before
anything is sent. decktalk build stops at the same point and names the price before it buys
anything, and --max-cost N refuses the whole run before the first call when the ceiling is above N.
Set narration.context_characters = 0 when the neighbouring sections must stay on the machine. Each
section is then sent on its own, with no surrounding text.
One-time downloads
DeckTalk fetches the tools a recording needs, once per machine: the first command that opens a page downloads the browser, the first command that encodes downloads the media tool, anddecktalk install does both up front. These requests carry nothing from your project, and after they succeed
a build that does not spend needs no network at all, unless a page loads something from another host.
cdn.playwright.dev. This is Playwright’s own download host. PLAYWRIGHT_DOWNLOAD_HOST points it at a mirror, and [tools] chromium skips the download by recording with a browser the machine already has.
github.com. GitHub answers a release download with a redirect to its asset host, so a proxy rule needs both. The archive is checked against a pinned SHA-256 digest and discarded when the digest does not match.
evermeet.cx. The archives are checked against pinned SHA-256 digests and discarded when a digest does not match.
ffmpeg.martin-riedl.de. The archives are checked against pinned SHA-256 digests and discarded when a digest does not match.
Requests a page makes
A deck is a web page, and its own script runs in the browser that records it. DeckTalk serves the page and the files the project declares from inside that browser, so none of those requests leaves the machine. A request the page makes for any other host is the page’s, not DeckTalk’s.
A page’s own requests. Under the default
record.page_policy = "trusted" the request goes to the network the way it would in the author’s browser, through the machine’s own proxy. Under untrusted it is refused before it leaves the browser, whatever its scheme. Either way the run names every other origin the page reached for, as PAGE_CDN_ASSET, so a reviewer reads which hosts a deck depends on from decktalk check --json before anything is recorded.
What never leaves
DeckTalk has no telemetry. It reports no usage, no errors and no project contents to its authors, and it has no update check. Nothing about a build is sent anywhere unless a command in the first table above sends it, or a page you record sends it itself. DeckTalk’s log records are written to the run’s own events file. When DeckTalk runs inside a program of your own, the same records also reach that program’s logging, with every credential DeckTalk holds already replaced by its variable name. Where that logging goes is the program’s choice. No DeckTalk environment variable has its value printed, logged or placed in a request body. An error message that quotes a reply from a service has every credential the request carried replaced before the quote is cut to length, whatever header carried it. A redirect to another host, scheme or port never carries a header that holds a credential. KaTeX ships inside the wheel, so an equation needs no download and no content delivery network.The agent is a second service
The six DeckTalk skills run inside your coding agent. When you ask an agent to write a script, place cues or fix a finding, the agent puts yourscript.md, your decktalk.toml, your cues.json
and the JSON that DeckTalk prints in front of whatever model that agent runs. That model is a cloud
service of its own, under its vendor’s terms and not under DeckTalk’s, and a policy review that
covers the speech service should cover it too. Running DeckTalk from the command line alone contacts
no model.
On a managed machine
A laptop with an intercepting proxy, no administrator rights and a policy review needs five things, and none of them is a DeckTalk feature you have to wait for.- Build with no voice and no key.
decktalk build --no-spendplays every take on disk, writes placeholder narration where a take is missing, and makes a complete video. It contacts no service, so you can show a finished internal video before any approval comes back. - Use the browser the machine already has. Set
tools.chromiumwithdecktalk config set tools.chromium PATH --scope machine, or point[tools] cache_dirat a directory whosems-playwrightfolder your administrators have already filled. Both are machine keys, so a project file that sets either is refused. The pinned build is the reference, and a managed browser is supported and unverified. - Use the ffmpeg the machine already has.
[tools] ffmpegand[tools] ffprobename executables directly, and a build that finds them downloads nothing from the second table. Both are machine keys, so they belong in this machine’s settings file rather than in a project that ships to somebody else. - Bypass the proxy for the preview server alone. A recorded page is served at
http://project.localhost/from inside the browser: no socket opens, no port is chosen and no proxy sees that host, so recording needs no proxy rule.decktalk serveis the one command that opens a real server, for previewing a deck in your own browser. It binds to127.0.0.1by default and takes--hostand--port, so a proxy that intercepts the loopback address needs a bypass for it. - Refuse what a page reaches for. Set
record.page_policytountrustedwithdecktalk config set record.page_policy untrusted --scope machinewhen the machine records pages it should not trust with the network. A page someone else wrote says what that policy holds.
[tools] keys.
decktalk doctor reports what is installed and which browser and media build a run would use. It
fetches nothing unless it is on a terminal, where it offers once to fetch what is missing, or --fix is
passed, and decktalk doctor --json prints the same reading as one object with
no credential in it.