One tunnelfor your whole dev team.

Circle what looks wrong, say one sentence, move to the next case. The repro steps write themselves.

Pick up, build, hand back. The task, the branch and the proof keep themselves current — and a bug arrives already reproduced.

The board is the status report, and it writes itself while the work happens.

Start freenpm i -g @vitrinka/cli

Open any compartment

The whole loop, in one take

A tester circles what looks wrong. An agent picks it up, fixes it, and hangs the after-shot beside the original. No repro steps in between.

0:31

Who is on the other end

Three roles, one tunnel.

The same board is read differently by each of them — nobody has to learn the others' tools.

Which one are you?

QA and testers

Writing the same repro steps for the third time this week.

Circle what is wrong on the screen and say one sentence. The recording, the network log and the console go with it.

Run the loop yourself

Developers

“Cannot reproduce — works on my machine.”

Your day is the record. Picking a task up and handing it back writes its timeline; the commit trailer, the runs, the pull requests and — once you opt in — the time you and your agents spend attach themselves. When something breaks, the frozen frame, the DOM replay and the failing request are waiting before you open the editor.

See how the day records itself

Product managers

A status meeting to find out what actually shipped.

Every task keeps its history, its evidence and its decisions, and Eve distils them into the morning brief. Keep Jira if you want it; the project mirrors, and nothing depends on it.

See how the memory works

Look inside the vitrína

Everything the team made, behind one pane of glass.

01

Boards

An infinite canvas where the screen itself is the ticket.

Annotate on the thing itselfRead the QA docs
  • Draw a regionCircle what is wrong directly on the screenshot. No coordinates, no repro steps.
  • One sentenceYour sentence becomes a work item, with the surrounding context already attached.
  • The agent answersA listening agent picks it up, fixes it, and hangs the after-shot beside the original.
  • Anyone can joinA browser link is enough — designers, PMs and clients never install anything.

02

Sessions

A recording of what actually happened, not a description of it.

DOM replay, network, consoleRead about sessions
  • DOM replayScrub the session back and annotate any frozen frame of it.
  • Network waterfallEvery request with timing and status, lined up against the recording.
  • ConsoleErrors and logs captured in the same timeline as the clicks.
  • One digestThe agent reads a compact digest of the session — about 1% of the raw stream.

04

Diagrams

Architecture drawn from your real configuration, not from memory.

Drawn from your real configRead about diagrams
  • From your repoRead from docker-compose, OpenAPI, SQL schema or a live database.
  • Server lays it outYou describe the semantics; the layout is not your problem.
  • RefreshableRe-run it after a change and the diagram catches up.

05

Documents

Reports and pages an agent wrote, live on the canvas and still true next month.

Reports and pages that stay liveRead about authoring documents
  • Real HTMLNot a screenshot of a report — the actual page, interactive on the board.
  • Bound to your filesA page can be tied to a repo file and refreshed after every edit.
  • Linked to the diagramDeep-link a paragraph to the exact node it explains.
  • Stays liveRe-publish and the card updates in place, keeping its URL.

06

Connect

Your agent publishes to it in one command.

Claude Code, Codex, any MCPRead about connecting an agent
  • Claude Code and CodexInstall the plugin from the vitrinka-kit marketplace and the skills come with it.
  • Any MCP clientPoint it at your deployment's MCP address and the board becomes a tool your agent can use — nothing runs locally.
  • Or just curlA tar pipe is enough to publish a set from any CI job.

07

PM

The project's memory, designed for the speed agents work at rather than for a ticket written once.

The memory behind the workThe day that writes itWhat shipped, per releaseRead the PM docs
  • Everything keptEvery change is a ledger row; every file is a version; transcripts, decisions and commits hang off the task by kind.
  • Read in numbersAn agent asks for a report and the server counts in SQLite, instead of paging through tasks.
  • Eve distilsThe morning brief and plan proposals, each a draft until a person says yes.
  • Beside JiraA per-project mirror with a chosen truth side. Keep the tracker, or run here alone.

Try it as a tester

Reporting a bug should cost one sentence.

Turn it on and do it yourself. This is the whole loop — nothing is hidden behind a sign-up.

Try it as a developer

See what arrives on your side.

Report something on this mock the way your tester would, then read what the work item actually carries. That is what you would have been handed.

Try it as a PM

Watch one sentence become a shipped fix.

This is the whole trail you would read later: who found it, what they saw, what changed. No one wrote a status update to produce it.

Checkout — pass 3
1
Pick what looks wrong
Drag a box around whatever looks off to you.
2
Describe it
One sentence is enough — no repro steps.
3
Send
It becomes a work item with the whole context attached.
Your basket3
Ceramic mugSand · 350 ml320 Kč
Pour-over kettleMatte steel808 Kč
Filter papersSize 02 · 100 pcs120 Kč
SPRING10Promo applied
Subtotal1 248
Discount SPRING10−124
Discount SPRING10−124
DeliveryFree
Total1 000 Kč
Pay now

And the people who use what you ship

One sentence, from your own customers.

A small “report a problem” widget that lives inside your product. Your customer circles what looks wrong and says one sentence — your team gets the session that produced it, on the same board as everything else.

Nothing to install

It is already part of your product. No account, no download, nothing to learn — the person reporting never sees vitrinka at all.

The context comes free

The screen, the console and the failing request are attached by the widget, not typed out by an annoyed customer who has stopped caring.

It lands where you already work

The report lands in your project beside the ones your testers file, held for an admin to approve first — every word in it came from outside — and then works like any other item, with the same thread and evidence.

Where it sits

Beside your tracker when you want it. On its own when you don't.

Tasks, sprints, intake and the evidence around them live here natively. A project that lives in Jira turns on the mirror and keeps working in both.

Your tracker
A per-project mirror: pick Jira, pick which side is the truth, and the other side stays a faithful copy — one ticket, no double entry. Plane connects today for issue comments, and the mirror interface is built to take it next.
Your repo
Every set knows its project, branch, commit and pull request, so a screenshot is never orphaned from the code that made it.
Your agent
Claude Code, Codex, Cursor, or any MCP client that connects to a remote server. The board becomes a tool the agent can read and write.
Your CI
Wrap your test command in vitrinka qa run -- and the results it leaves behind — JUnit, Playwright, allure, wdio — land on the feature's QA record, with screenshots and a bug draft per failing case. Your tests do not change. Anything else is one tar | curl.
Everyone else
A browser link. Designers, PMs and clients install nothing and see the same canvas.

What goes on a board

Anything your agent produced, in the form it produced it.

Short clips, one per surface. Swipe through them.

Screenshots and journeys

0:26
  • Wires between screens — each one leaves from the element that was actually clicked.
  • Branches — a flow that forks renders as a signpost, not a straight line.
  • Passes — round two lands beside round one, so you can see what changed.

Where your work lives

One binary, your storage, your network.

Nothing about this needs to leave your infrastructure.

your network
Self-hostedA single Go binary with SQLite inside it. One compose file, one volume, and the schema migrates itself at boot.
  • Your bucketBlobs on local disk or any S3-compatible store — Hetzner, MinIO, AWS. You hold the keys.
  • Air-gappedAn offline licence and no outbound calls at all, for teams whose network never talks to the internet.
  • Your identity providerOIDC against Entra, Keycloak or Okta — including one only your own network can reach, behind your own certificate authority, once the operator allows it — with group-to-role mapping reapplied at every login.
  • AuditedSign-ins, role changes and break-glass use are all recorded.

no outbound calls

Read the operator docs

What it costs

One membership for your organization.

Start free during beta. Paid memberships and managed AI credits are not available yet; the monthly prices below are planned and exclude VAT. You can bring your own AI connection.

Free

$0

1.5 GiB or 100 boards per workspace, 5 seats. No card.

Starter

$8

Per organization / month. Prepaid AI credits, your own AI, or none.

Pro

$19

Per organization / month. More shared storage and seats.

Team

$59

Per organization / month. Room for several products.

Enterprise

Custom

SSO, self-hosting and air-gapped installs.

See what it costs

Measured, not estimated

148findings from 37 recorded user-testing sessions, every one answered across three PRs
web, admin, iOS
3.9 hof active tester time inside 56 hours of recording — the sessions did the reporting
37 sessions
$872in API tokens for the whole campaign — 327 files changed, +16,787 lines
three models

Before you ask

The questions we get first.

Do my testers need an account?

No. A board is a link — open it in a browser, draw on the screenshot, type the sentence. Installing anything is only for the people whose agent does the fixing.

How does a session get recorded?

Four ways, same board. The browser extension records manual testing in any web app — screenshots, clicks, requests, console, a DOM stream. The React recorder mounts inside your own web app, so testers on phones record too. The Expo recorder does the same inside a React Native app. A tester can sign any of them in by approving a device link, and the key it receives can only send recordings, into the sessions it started itself. And the report widget lets your own customers send one from inside your product.

Read about the recorders
Does this replace Jira or Plane?

Only where you want it to. Vitrinka is a full tracker on its own — tasks, sprints, intake, rules. A project that lives in Jira turns on the mirror, picks which side is the truth, and keeps working in both; nothing migrates. Confluence has no connector: pages here match it feature for feature, so a team keeps either.

What if we don't use AI agents yet?

It still works as a screenshot library, a session recorder and an annotation canvas. The agent loop is one more listener on the same queue — you can turn it on later, or never.

What does the agent actually read?

A compact digest of the session — around 1% of the raw event stream. A 55-minute, 6,010-event recording comes out at about 76,000 tokens, so a whole test session fits in one prompt.

Is there anything in it for me alone?

A diary, and your meetings. Each day has one personal board. The Snap menu-bar app drops a screenshot, a note or a hold-to-talk voice note onto it with one shortcut, and records meetings: your mic and the call's audio, captioned on the Mac. Your organization can also have the server transcribe them, and on a self-hosted install the audio never leaves your network. A meeting becomes a project task in one step, and Eve writes its notes. Your todos can wait on a condition — a pull request merging, a deploy, a release — and come back when it is met. Weekly, monthly and yearly views fold the days up.

Read about your day
Where does our data go?

Wherever you put the binary. SQLite for metadata, your own disk or S3-compatible bucket for the files, and an air-gapped mode for networks that never reach the internet.

How long does setup take?

One npm install and one command, on macOS, Linux or Windows. vitrinka setup prints what is missing, fixes the harmless parts itself, and asks before touching anything in your config.

Start

Three lines, then draw on something.

The whole install is one package with one binary, the CLI. There is no local MCP server: your deployment serves MCP over HTTP at /mcp, and setup registers it with each agent. You can re-run it, you can undo it, and it asks before it edits a config file.

  1. npm i -g @vitrinka/cliThe CLI, one package — macOS, Linux and Windows.
  2. vitrinka setupStatus-first: it shows the ✓/✗ table, then asks only about the config-touchers. It registers the plugin from the vitrinka-kit marketplace.
  3. /vitrinka:listenIn your app's repo — the session starts answering the board's work queue.

Health check any time with vitrinka doctor. Remove everything with vitrinka setup uninstall.

Read the install docs