Route two of three

No subscription. No card. No cloud, if you want.

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.

Pick how the writing happens

Three routes. Same deck, same portal.

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.

Step one

One command installs it.

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-
Step two

Point it at what you already wrote.

01

Any document you already have

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
02

One line changes the whole shape

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.

From the notes alone
  1. Quarterly platform review for Acme Logistics
  2. Where we are
  3. What it costs
  4. What we propose
  5. Proposed timeline
  6. What we need from you
  7. Ready to move
Asked to lead with the cost, in five slides
  1. Quarterly platform review for Acme Logistics
  2. What it costs
  3. Where we are
  4. What we propose
  5. What we need from you
03

Then it goes to one named person

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
Why this route

A free or local model, and what it buys you.

Nothing to sign up for

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.

Genuinely offline

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.

The credential is never ours

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 repair budget you control

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.

It cannot break your brand

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.

You always know who wrote it

Every run names the backend and the model before it starts, because two models write visibly different decks from the same notes.

Choosing a model

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.

Self-host it

It runs on your box, not ours.

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.