DeckTrail needs no account with any model provider, ours included. Point it at a model on your own hardware and the entire path is local: your document, the model, the deck and the server that serves it. Nothing crosses your network at all.
DeckTrail does not care which model writes your deck, so you are not locked to one. Everything after the writing is identical, and switching later is a flag rather than a migration.
The first command does all of DeckTrail. Then install OpenCode, which is the piece that talks to models. Which model it uses, and whether that costs anything, is its configuration and not DeckTrail's.
Port 3000 already taken? Pass another and it is used end to end.
# one command, and it does the rest
git clone https://github.com/orbitqube-tech/decktrail
cd decktrail
./scripts/up.sh
# identical on macOS
git clone https://github.com/orbitqube-tech/decktrail
cd decktrail
./scripts/up.sh
# PowerShell git clone https://github.com/orbitqube-tech/decktrail cd decktrail .\scripts\up.ps1 # or from cmd.exe, same thing scripts\up.bat
DeckTrail Docker is running pnpm is available Port 3000 is free Wrote .env with a generated database password Starting the stack, which pulls images the first time Waiting for the portal, which sets itself up on a first boot Portal is healthy on http://localhost:3000 Building the command line tool Installed the decktrail command on your PATH Ready. Open this once to name yourself and set your brand: http://localhost:3000/setup?token=zPJ9074oR7G28PP8DSRbsl88Fb25ail-
Meeting notes, a PDF, a PowerPoint deck, a Word document, or a page you photographed. The text comes out on your machine, and a scan is read as a picture only when it carries no text of its own. Nothing is converted: the substance comes across and the original's layout does not.
# a real run, on a free model decktrail generate notes.md --client acme \ --prompt "lead with the cost, and keep it to five slides" \ --provider opencode --model opencode/deepseek-v4-flash-free no voice configured, using the neutral default with your prompt generating with opencode (opencode/deepseek-v4-flash-free) read notes.md as text wrote deck.json # check it before you send it decktrail validate deck.json valid: slide-deck
No template to fill in, no configuration file to write. Say what matters and the deck is rebuilt around it. Same notes, same route, one sentence of difference.
Each recipient gets their own link behind a passwordless sign in. No public URL, no anonymous forwarding, and every open ties to a person, which is what makes the record afterwards worth having.
decktrail push deck.json --recipient cfo@acme.example published: acme-logistics-qpr shared with cfo@acme.example
No subscription, no card, no key. If you want to try this on a real client document this afternoon, this is the route with no gate in front of it.
With Ollama, LM Studio or llama.cpp on your own machine, no part of the document leaves the room. For work under a confidentiality clause that is not a preference, it is the requirement.
If you do use a hosted free tier, its key lives in OpenCode's configuration. DeckTrail spawns a command and reads its output, so it cannot see, store or log a credential.
A deck has to satisfy a schema, and a smaller model gets the prose right more often than the structure. An invalid deck is handed back for repair rather than thrown away, and --repair-attempts is the dial that makes a small model practical.
The model picks a layout and fills its slots. It cannot emit styling or invent structure, which is why a free model's deck still looks like yours.
Every run names the backend and the model before it starts, because two models write visibly different decks from the same notes.
Free models vary more than paid ones, and the difference shows up in structure rather than
prose. If one returns a deck that will not validate even after a repair pass, raise
--repair-attempts or try another: switching is a flag, and the notes you started
from have not moved.
There is no account to make here, because there is nothing here to sign into. You clone it, you run it, and your clients' decks live on your server where they belong. We could not read them if we wanted to.