Skip to content

Go SDK ​

The renderer behind vibeview export is an importable Go package. Programs that embed it produce session pages themselves — no vibeview binary on the user's PATH, no subprocess.

sh
go get github.com/driangle/vibeview/apps/lib@v0.2.0

The shared module github.com/driangle/vibeview/apps/lib is versioned separately from the CLI, with tags of the form apps/lib/vX.Y.Z.

Rendering a session ​

go
package main

import (
    "os"

    "github.com/driangle/vibeview/apps/lib/sessionhtml"
)

func main() {
    page, err := sessionhtml.RenderSessionHTML(sessionhtml.Request{
        Session: "877fff1e", // session ID, prefix, or path to a .jsonl transcript
    })
    if err != nil {
        panic(err)
    }
    os.WriteFile("session.html", page, 0o644)
}

RenderSessionHTML returns a complete HTML document with the session and the viewer inlined: it opens from disk, offline, with no external requests. sessionhtml.Render is the same function under a shorter name.

Request ​

FieldDefaultDescription
Session—Session ID (full or unique prefix), or a path to a .jsonl transcript. Required.
ClaudeDir~/.claudeWhere sessions are looked up. Ignored when Session is a file path.
CostEnabledfalseShow cost ($) figures. Token counts always render.

An unknown session, an ambiguous prefix, or an unreadable transcript comes back as an error.

What the page contains ​

The same session view the web interface serves — conversation, tool calls, timeline, subagent conversations, and token/cost totals. Two things differ, because there is no backend behind the page:

  • Conversation search is omitted. The Timeline tab's filter is client-side and still works.
  • Code blocks in less common languages render unhighlighted.

Pages are roughly 800 KB plus the session's own content.

Releases ​

Versions are cut automatically. When a change to apps/lib/** lands on main, CI tags the next apps/lib/vX.Y.Z, pushes it, and repoints apps/cli/go.mod at it — so go get github.com/driangle/vibeview/apps/lib@latest always includes what is on main.

The bump is a patch by default. Pre-1.0 a breaking API change is a minor bump, which a diff cannot detect, so flag it in the commit that makes the break:

feat(sdk): rename Request.Session to Request.Ref

sdk-bump: minor

Any commit touching apps/lib since the last tag carrying that line promotes the whole batch. Get it wrong and the mistake is permanent — module versions are immutable once the proxy has fetched them.

To release by hand from a clean tree:

sh
make release-sdk VERSION=0.2.1   # tags, pushes, repoints the pin, commits
make check-sdk                   # is there anything unreleased?
make verify-sdk                  # does the latest tag resolve for consumers?

Reading a session without rendering ​

github.com/driangle/vibeview/apps/lib/sessiondetail exposes the payload itself — messages, insights, timeline and usage — for programs that want the data rather than a page:

go
target, err := session.ResolveTarget(claudeDir, "877fff1e")
detail, err := sessiondetail.Build(target.BaseDir, target.Meta)

This is the same assembly the HTTP API and the static page both use.