Releases: superbasedapp/observer
Release list
v1.22.0
Added
- Take control back at your native terminal. The missing leg of the
session-control triangle: after a dashboard Jump-in, just start typing in
the terminal that launched the session (observer claude/codex) — the
daemon returns the writer lease, delivers that keystroke, prints a
one-line notice, and re-pushes your terminal's geometry so a TUI the
dashboard left at foreign dimensions heals in the same gesture. Machine
bytes never reclaim (terminal emulators auto-answer TUI queries on stdin);
arrow keys or a bare ESC alone won't either, by design. Config:
[terminal.attach].reclaim_on_input(default on). The dashboard seat goes
honestly read-only — "control returned to the native terminal — click to
take back". - Original-size restore for broken TUIs. The daemon now tracks each
session's launch-time and current PTY dimensions; every dashboard terminal
gets a fit / original-size toggle that pins the launch geometry (auto-refit
suppressed) to recover a TUI corrupted by resizes, and a seat re-asserts
its own geometry whenever it regains control. - Keyboard shortcuts reach the dashboard terminal. Ctrl+A/E/K/. and
friends now go to the TUI instead of the page while the terminal is
focused; Ctrl+Alt push-to-talk chords pass through untouched;
copy-with-selection stays native. Browser-reserved keys (Ctrl+W/T/N)
honestly can't be intercepted in a normal tab — the new fullscreen
focus mode (Keyboard Lock, Chromium) is where they reach the TUI. - Watch a bare session read-only. Sessions started outside observer
(plainclaude,codex, …) that are actively producing events now show a
"live · watch" badge: a read-only, auto-following view of the conversation
(4s refresh, stick-to-bottom) in the session panel. "Jump in" stays
honestly disabled — a bare launch's terminal belongs to the shell that
started it — with "Watch instead (read-only)" offered in its place. - Collapsible sidebar. The dashboard's left nav collapses to a compact
icon rail on desktop (persisted, tooltips); the mobile drawer is unchanged.
Fixed
- Post-v1.21.0 CI red: six golangci-lint findings in the release's new code
(behavior-preserving refactors) and the missed website version sweep.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.22.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.22.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.22.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.22.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.22.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.22.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.22.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.22.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.22.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.21.0
Added
- Browser-chat capture (opt-in MV3 extension). Full-detail capture of
ChatGPT, Claude.ai, Perplexity, Gemini, and consumer Copilot web sessions
from Chrome (WSL + Windows) via a native-messaging bridge into the new
browserchatadapter — prompts, responses, models, and estimated tokens,
with best-effort redaction and health telemetry (observer browser health).
Load-unpacked only for now. Seedocs/browser-extension.md. - Session attach: join and drive live sessions from the dashboard.
Observer-launchedclaude/codexsessions are daemon-owned PTYs the
dashboard can now join ("live · joinable" badge → Jump in), while your
native terminal stays fully interactive. Closed sessions gain one-click
native Resume (observer claude --resume <id>composed server-side)
from the session panel. Remote (paired-device) viewing of attach/resume
terminals stays deny-by-default behind the new[remote].allow_terminal_view
read opt-in. - Resilient default-on attach. Interactive
observer claude/observer codex
launches attach by default when the daemon is reachable
([terminal.attach].default_on, Settings-togglable;--no-attachopts out
per launch). Graceful daemon restarts stamp a durableend_reason
(migration 072) and the attach client offers prompt-with-timeout
auto-resume onto the same transcript; every skipped default-attach prints
an honest one-line reason. - Terminal Workspace dock grid. The Terminals page is now a workspace:
an auto-compacting responsive grid of live terminals — drag tiles by their
header, resize from edges, add running sessions from the tray, "⊞ Add to
grid" directly on any floating terminal window, "⬈ Open as window" to
undock a tile back into a user-resizable, size-persisted floating
window. Layouts persist server-side (node-localworkspace_layouts,
migration 073) and render read-only on paired remote devices. Honest close
semantics: "Remove from grid" keeps the session running; "Stop & close"
actually ends the process.[terminal].max_concurrentdefault raised to 9.
Existing policy/status/history content lives under a Settings tab. - Standing-access hardening toggle. Opt-in
[remote].revoke_standing_on_takeover: a desktop takeover of a remote
writer that held control through the standing secret also revokes the
standing secret itself (identical teardown to the explicit revoke). Default
stays seamless — takeover revokes only the live lease.
Fixed
- Daemon-down no longer breaks claude launches.
observer initbakes the
proxy route into claude's ownsettings.json, which outranks the process
environment — so a "bare" fallback launch used to route API calls into a
dead proxy. The launchers now resolve the effective route across every
settings scope claude honors (managed/CLI/local/project/user, including
inline-JSON--settingsand--continue-fromworking directories) and
neutralize observer routes with a one-shot CLI-scope--settingsoverride
(signal-safe temp file); un-overridable cases (managed scope, your own
--settings, codex's config-file route) refuse with copy naming the exact
fix. Third-party gateway routes are always honored, never clobbered. - "Stop & close" now actually stops the process. Since detach-replay, a
websocket close only detached the embedded terminal; every stop control now
issues the explicit server-side reap. - Mobile layout no longer breaks on long project paths. One shared
tail-preserving truncation primitive (ellipsis at the head, leaf visible,
full path on hover) across all pages, plus explicit horizontal-scroll
containment on the Overview table. - Terminal runs killed by a daemon shutdown no longer show as running forever
in the run history; floating-terminal resize no longer minimizes the window
on release.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.21.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.21.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.21.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.21.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.21.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.21.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.21.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.21.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.21.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.20.0
Added
- Remote dashboard + terminal control (Phase 4, explicit opt-in). Drive a
node from another device over your tailnet: multi-device pairing, a draggable
launch dock, in-dashboard terminals, and a mobile-friendly dashboard layout.
Remote execute (launching AI tools / running terminal commands from the
dashboard) is gated behind an explicit standing grant
([remote].allow_standing_terminal_control, default off) with per-session
terminal leases, fanout bounds, revoked-lease handling, an execute-tier CSP,
and a full audit lifecycle. Tailnet-only; nothing is exposed to the public
internet. Seedocs/remote-access.md. - Process-network body capture + attribution wave. For observed processes
routed through the proxy, capture proxied/plaintext request/response bodies
into the newprocess_network_bodiesstore (agent migration 067) — never a
claim of TLS visibility. Broader process observation and attribution: five
adapters seed the pid bridge directly, a background attribution sweep and
per-wave basenames tighten which session a process belongs to, and the
dashboard gains process + raw-events surfaces. See
docs/process-observability.md. - GPT-5.6 / OpenAI cache-write token capture. The proxy now parses
input_tokens_details.cache_write_tokensfrom OpenAI/Responses usage (both
the provider and streaming paths), nets cache-write against gross input
correctly, and feeds the cachetrack engine so implicit-write events are
observed instead of silently dropped. Wire field + expiry semantics
documented indocs/general_info/openai_cache_expiry.mdand
docs/cache-tracking.md. - Dashboard time-window dropdown. A new date-range control adds 1h / 12h /
1d windows plus explicit custom ranges alongside the existing options,
resolvingsince/untilwith hours taking precedence over days. The range
params thread through every dashboard page. - Benchmark integrity: retry-as-attempt + ephemeral runs. Each retry is now
recorded as its own attempt (agent migration 068) so benchmark integrity
reflects real attempt counts instead of collapsing retries. New ephemeral
runs execute without persisting into the main corpus. - Compression: no-drop capability + honest lossy-eviction display. A new
disable_dropscapability lets thecodex-saferecipe compress without lossy
content eviction. All lossy eviction now routes through one classifier owner,
and evicted bytes are subtracted from reported compression savings so
"saved" reflects genuine, retrievable compression only — evicted content is
surfaced additively (still recoverable viasearch_past_outputsmarkers,
never counted as a saving). - M365 Copilot org analytics + browser-extension capture fixes. New
observer-org m365command and M365 Copilot analytics surface (Graph auth +
surface_graph) on the org server — server-side only, never on the agent
wire. Browser-extension capture (native-messaging host + service worker + the
loopback ingest receiver) is fixed, with per-browser/per-OS host manifest
writers including Windows registry hostfiles. [dashboard].addrconfig knob (#8). The dashboard bind address is now
configurable via[dashboard].addr(and theOBSERVER_DASHBOARD_ADDR
environment override).- Kimi K3 model pricing added to the cost engine and the settings surface.
Changed
- Codex fork/subagent token de-duplication + session lineage. Replayed
fork/subagent turns are now skipped so a forked Codex session no longer
double-counts tokens already attributed to its parent. New parent/child
session-lineage tracking (agent migration 069, surfaced in the session-detail
panel) makes the relationship explicit, and the new--codex-fork-dedup
backfill pass reconciles historical fork double-counting.
Fixed
- VS Code extension activation stall (#5). Fixed extension activation and
observer-binary resolution; a newpreferPathBinarysetting lets the
extension use aPATH-resolved observer instead of its bundled copy. - Codex 16 MiB record limit (#7). The Codex JSONL scanner's 16 MiB record
cap is replaced with a sharedreadRecord(64 MiB bound + per-record skip) so
an oversized record no longer aborts a whole session parse. - Prune now reclaims disk space.
observer pruneactually reclaims disk
instead of only shedding rows, and startup latency previously spent in
on-open integrity work is cut.
Upgrade notes
- Agent DB migrates to schema 69 (migrations 061–069); the org server stays at
schema 21 — both automatic. - Restart the daemon via the safe order (route off → stop → relaunch → route
on;scripts/restart-daemon.sh) so the new binary and migrations load. - Remote execute + standing terminal control stay fully inert until you set
[remote].allow_standing_terminal_control = true; pairing and remote viewing
are tailnet-only. - Run
observer backfill --codex-fork-dedup(orobserver backfill --all) to
reconcile historical Codex fork double-counting.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.20.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.20.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.20.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.20.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.20.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.20.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.20.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.20.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.20.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.19.0
Added
- Email notifications. New
[email]config block (stdlib SMTP:
STARTTLS/implicit-TLS, AUTH PLAIN/LOGIN; default off, fail-soft —
a delivery failure never affects evaluation). Rides the existing alert
evaluators: org budget alerts, org obs-alert rules, and node-side
[observability.alerts]. Seedocs/email-notifications.md. - Scheduled cost digests. Weekly/monthly digest emails on both the node
([digest]) and the org server: period spend, per-model/per-project (org:
per-developer) breakdowns, movers vs prior period. Restart-safe send-once
de-dup via the newdigest_statetable (agent migration 060, server
migration 021). Test on demand withobserver digest send --dry-run/
observer-org digest send --dry-run. - Shareable cost card.
observer report share [--period week|month] [--markdown]renders a 1200×630 SVG social card + markdown summary of your
observed spend (period total, cache-read share, model/tool leaderboards).
Aggregates only — project names/paths never appear (pinned by test). No
network. - Admin dashboard (web2) onboarding & navigation. First-run checklist for
a fresh org server, command-palette data search (teams / projects /
people / recent sessions), teaching empty states across pages, breadcrumbs
on detail routes, and sidebar count badges. - Plane-A general-observability upgrades. web2 Admission center
(/trajectories/admission, read-only policy viewer) + T6 admission
org-wire tier ([org_client.share.obs].admission, default off; server
migration 019) with audited deep reads; T7 per-item eval tier
(.eval_items, server migration 020) with per-item EvalRun detail and
run-vs-run compare; per-end-user spend page; node-side alert
evaluation for share-off deployments ([observability.alerts], default
off); LLM-judge robustness (map-reduce chunking, per-criterion prompts,
hardened client) +observer obs admission verify; SDKs attach
prompt/response content by default (OBSERVER_CAPTURE_CONTENT=0to
disable) and target the correct node port:8081;POST /policy?persist=1
write-through. - M365 Copilot org-tier connector (server-side native-console poller,
server migration 018; never on the agent wire). - Browser-chatbot capture extension (preview). Opt-in MV3 extension
capturing ChatGPT / Claude.ai / Perplexity / Gemini / consumer-Copilot web
chats via a native-messaging bridge (observer browser hook). Load-unpacked
only for now — not yet published to the Chrome Web Store; all token
counts are estimates. - Website. Text-first, fully indexable homepage (the Observer Quest
arcade lives on at/arcade); product deck at/deckwith a downloadable
PDF; 28 per-tool "track costs" pages generated from the adapter
registry; 6 comparison pages; 21-term glossary; a public two-planes
explainer;llms.txt+ JSON-LD + an explicit GEO robots posture
(retrieval crawlers allowed, training crawlers opted out).
Changed
- READMEs and store listings overhauled around the durable story:
proxy-accurate billed-token attribution, local-first privacy, free node →
team layer. One true adapter count (26) everywhere; npm/PyPI/VS Code
listing descriptions rewritten; MCP tool census corrected to 25 (21
always-on + 4 conditional) anddocs/mcp-tools.mdfully rewritten. - Org-server retention is now enforced.
server.data_retention_days
(default 730) actively prunes: upgraded org servers begin deleting
rows older than the configured window (identity/config/audit/guard-chain
tables are never pruned). Set the knob before upgrading if you need longer
retention. - Guard alerting (desktop toasts, Slack/Discord/PagerDuty webhooks) and
process observability are now documented on the main surfaces.
Fixed
- VS Code walkthrough listed a nonexistent "Continue" adapter; stale
"seventeen tools" counts across README/website/listings; dead help entries
in the node dashboard; org migrate-test schema assertion; a date-dependent
test (TestAggregateForOrg) that failed once its hardcoded day aged out.
Upgrade notes
- Agent DB migrates to schema 60; org server to 21 — both automatic.
- Restart the daemon via the safe order (route off → stop → relaunch →
route on;scripts/restart-daemon.sh) so the new binary and migrations
load. - Email/digests stay inert until you set
[email].enabled = trueplus the
per-consumer opt-ins.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.19.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.19.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.19.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.19.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.19.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.19.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.19.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.19.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.19.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.18.0
Added
observer devin --continue-fromlauncher. Devin CLI joins the
session-handoff launchers:observer devin --continue-from <session-id>
distills a handover and seeds it as Devin's first prompt. Devin takes its
prompt as a clap last-only positional after the--separator
(devin -- "<prompt>", operator-verified on a real TTY), so the launcher
uses a newinjectTrailingPositionalAfterDashDashinject kind. The launch is
seed-only and non-proxied (Cognition backend,native_exempt, no
base-URL knob);child.Diris threaded from the continue-from cwd per the
cross-OS handoff contract. The launchable set grows to 19 launchers
(17 Seeded + 2 DocAssisted); the Devin registry row gainsInjectPromptLaunchand drops its unverified-seed caveat.
Changed
qwen-codepromoted to a live, observer-driven proxy route. qwen-code
resolves its active model by the(id, baseUrl)pair, so rewriting
model.baseUrlalone was ignored when it matched nomodelProvidersentry —
the grounded 2026-07-09 probe failure (qwen fell back toapi.openai.comand
bypassed the proxy).RegisterQwenCodenow also retargets every OpenAI-lane
modelProvidersentry on the known default host to the proxy URL, keeping
each entry'sid+envKeyuntouched, tolerating both live schema shapes
(array + object form), and synthesizing an entry only when none matched (same
guard matrix: refuse-foreign-URL, idempotent,.bak, temp+rename,
ConfigMissing skip; API keys never touched). Live-verified 2026-07-09: a
qwen -pturn through:8820landedapi_turns23728–23730 (gpt-4o,
provider=openai). The registry row is promoted toroutable_nowwith an
observer-driven Proxy route;ProxyProbeis KEPT — it remains the
persistent config-lane writerobserver initdispatches on.- GPT-5.6 cache/effort grounding closed against live traffic. A live
gpt-5.6 session (019f4801) confirms the launch pricing: the model ids
gpt-5.6-{sol,terra}hit their pricing rows exactly and a live terra turn
recomputes to the stored cost to the digit; no effort levels beyond
low/medium/high manifested. NO cache-write usage field exists on the Codex
wire — onlycached_input_tokens(read discount). OpenAI docs confirm the
write tier we priced (1.25× uncached input, 90% read discount, 30-min minimum
TTL, explicit-breakpoint mode), but Codex's ChatGPT-plan credit formula has no
write term, which is why the field never appears on our wire. The shipped
write-tier pricing therefore stays present-but-dormant and harmless, and
parsing acache_write_tokensfield is deliberately DEFERRED until the
netting semantics can be arithmetic-grounded on live traffic — additive
billing without grounding would repeat the reasoning-double-bill trap.
docs/cache-tracking.mdgained a GPT-5.6 cache-expiry subsection.
Fixed
- Codex reasoning tokens were double-billed. The OpenAI/Codex wire reports
GROSSoutput_tokenswith reasoning as a subset (input + output == totalon every livetoken_countevent — arithmetic-verified on gpt-5.6
traffic). The codex adapter emitted that gross value alongside
ReasoningTokens, and the cost engine's additive reasoning-at-output-rate
rule then billed every codex reasoning token twice. The adapter now nets
reasoning out at both emit sites (clamped ≥ 0, mirroring thenetInput
pattern), andTokenBundle.Reasoninggained a hard documented precondition:
netting is a per-wire property — OpenAI/Codex fold reasoning into output
(subset), whereas gemini/antigravity report it disjoint (the additive rule is
correct only for disjoint wires). Migration 058 corrects the stored history
one-shot (1,991 gross codex rows / 436k double-billed reasoning tokens on
the reference node): historical rows are corrected automatically at the first
startup of the upgraded binary, because a rescan cannot lower counts past the
ON CONFLICTMAX-upgrade and the run-once ordering makes the subtraction
idempotent by construction. Scoped totool='codex'only —
gemini/antigravity are disjoint-correct. - grok ACP update content was dropped when polymorphic.
tool_call_update
content arrives as an array of text/diff blocks (andrawOutput.output
as a byte array); the single-object decode dropped 38 records across the two
fresh captures.search_replace(grok's in-place edit) was also unmapped and
landed asunknown; it now maps toedit_file(with defensive
deletefile/removefilehandling — grok exposes no distinct delete tool).
Rescan: warnings 38 → 0, unknown 2 → 0. - Adapter rescans now reclassify
action_typefrom theunknownsentinel.
insertActionSQL'sON CONFLICTclause never refreshedaction_type, so a
rescan (observer scan --force) could not reclassify rows stored as
unknownbefore a mapping fix landed — which blocked the grok
search_replacefix above from healing the two liveunknownrows. The
conflict clause now upgrades onlyunknown→ a real type; it never
rewrites one known type to another and never downgrades tounknown/empty
(all three invariants pinned by table-driven tests).
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.18.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.18.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.18.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.18.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.18.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.18.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.18.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.18.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.18.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.17.0
Added
-
Nine new tool adapters — the 10-tool adapter wave (freebuff descoped).
Observer now captures 26 adapters total. Each new adapter ships with a
testdata fixture, an operator doc, an integration-registry row, a dashboard
tool color, and adocs/cross-adapter-schema-mapping.mdsection (§3.11–3.19):qwen-code— Qwen Code CLI (Gemini-CLI fork), Claude-Code-shaped JSONL
under~/.qwen; GROSS input netted against cached.kiro-cli— AWS Kiro CLI; mode-dependent dual store (interactive flat
bundles vs--no-interactiveSQLiteconversations_v2keyed by the RAW
cwd, translated through crossmount); SigV4, native-exempt.crush— Charmbracelet Crush; project-local.crush/crush.db
discovered viaprojects.json; Unix-SECONDS timestamps.kimi-code— Moonshot Kimi CLI;wire.jsonlusage.record
(inputOtheris already NET); no seed lane (DocAssisted only).grok— xAI Grok CLI; 8-file ACP session bundles, with per-request
token splits pulled from the GLOBAL~/.grok/logs/unified.jsonl
correlated bysid(no timestamp heuristics).devin— Devin CLI; SQLitemessage_nodesTREE walked along
main_chain_idto dedupe regeneration branches so tokens never
double-count; per-messagemetadata.metricstokens.aider— Aider; per-repo.aider.chat.history.mdMarkdown, with watch
roots = discovered transcript FILE paths (a bounded breadth-first
native-home walk memoized once per process); prose tokens GROSS→netted.qoder— Alibaba Qoder CLI; Claude-Code-shaped JSONL under
~/.qoder/projects; NO local model or tokens (server-side only —
honest-zero, native-exempt).goose— Block Goose; WAL SQLitesessions.dbwith SESSION-level
tokens only (accumulated_*+accumulated_cost); input GROSS→netted vs
cache_read;SessionIDis store-scoped (<id>@<sha8(store)>) so the
YYYYMMDD_seqids can't collide across a WSL + Windows store pair.
Fresh installs pick all nine up automatically; an EXPLICIT
enabled_adapters
list must add the new tool names (qwen-code,kiro-cli,crush,
kimi-code,grok,devin,aider,qoder,goose) — the startup WARN
names any that are missing. -
Seeded session-handoff launchers for the new adapters —
observer qwen,
observer kiro,observer kimi,observer grok,observer qoder, and
observer gooseaccept--continue-from <session-id>to distill a handover
and seed it as the tool's first prompt (18 launchers total).qwen,
kiro,grok,qoder, andgooseseed directly;kimiis DocAssisted
(no-pseed lane).devin,aider, andcrushdeliberately ship no
launcher (no scriptable seed lane). -
The watcher and adapter registry now accept a FILE as a watch root
(not only a directory), which theaideradapter needs for its per-repo
transcript-file watch set. -
Guarded proxy-route config-lane writers —
internal/proxyroutegained
RegisterKimiCode(TOMLbase_urlin~/.kimi-code/config.toml),
RegisterCrush(JSON map-merge incrush.json), andRegisterQwenCode
(rewrites~/.qwen/settings.jsonmodel.baseUrl, stricter guard: refuses
any custom host). Each backs up (.bak) and writes via temp/rename, skips
benignly when the config is missing, is idempotent when already observer,
and refuses a foreign URL; API keys are never touched. A new additive
registry fieldCapability.ProxyProbemarks "writer ready, promotion
pending a live probe"; these writers fire ONLY throughobserver init—
batch under--all(honoring--skip-proxy-route), or one per-tool consent
prompt in the interactive checklist (default NO).⚠️ Once a tool is routed,
stopping the daemon breaks it until reverted (the standard routed-tool
caveat — see the daemon-restart runbook). -
Per-adapter Backfill scan modes in the dashboard — Settings → Backfill
now derives onescan-<tool>row per integration-registry adapter (26 rows),
backed by the genericobserver scan --force --adapter <tool>lane
(idempotent; overridesenabled_adaptersfor the run). A future adapter's
Backfill row appears automatically. -
Pricing: GPT-5.6 and Grok 4.5 model launches. Added
gpt-5.6-sol
($5/$30),gpt-5.6-terra($2.50/$15),gpt-5.6-luna($1/$6), and a
gpt-5.6family row. GPT-5.6 introduces the first non-Anthropic explicit
cache-write tier (writes at 1.25× uncached input, reads keep the 90%
discount); the write rate is wired into the cost table but INERT until a live
5.6 response grounds the cache-write usage field. Addedgrok-4.5($2/$6,
the new xAI flagship — previously under-billed via thegrokfamily row at
4.3 rates) andgrok-build-0.1/grok-build($1/$2); bumped thegrok
family prefix to flagship rates.docs/pricing-reference.mdupdated.
Changed
- Adapter routability promotions.
aider,goose, andgrokwere
live-grounded through the:8820proxy and promoted toroutable_now
(observer drives no route today; the launchers stay non-proxied).
kimi-codeandcrushwere promoted further to observer-driven Proxy
routes after live turns landedapi_turnsrows through their config-lane
writers.qwen-codestays route-blocked — its (empty)modelProvidersmap
overridesmodel.baseUrl, so the env/base-URL lanes are grounded-dead and
the writer needs a matching provider entry first. - Dashboard tool-identity colors for the 10 previously-uncolored adapters
(light + dark tokens, CVD-validated), plus the missingtools.tsentries.
Fixed
- Actions page window selector was a no-op. The 7d/14d/30d window computed
windowDaysbut never passed it to/api/actions(only the Timeline
day-counts honored it)./api/actionsgained the same optionaldays
contract as/api/sessions(0 = unwindowed; legacy callers unchanged) and
the page now threads the selected window. - antigravity-cli cross-OS + guard coverage. Added the antigravity-cli
cross-OS project-root anchors and its guard watcher-conformance row.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.17.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.17.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.17.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.17.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.17.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.17.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.17.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.17.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.17.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.16.0
Added
- Richer session-handoff content — two complementary "full" carry modes.
fullcarries the excerpted flow plus a[msg <id>]tag on every message
and an MCP-hint line; a target with the Observer MCP pulls any full body on
demand via the newget_session_messagetool (always-on MCP tool count
19 → 20), which re-reads ONE un-excerpted message by
(session_id, message_id|index)from the source transcript and never
persists it.full_cacheinlines the un-excerpted read/tool bodies INTO the
handover doc so the new session starts warm with zero MCP round-trips (uses
theFullTranscriptReadercapability — claude-code + codex; other tools
degrade tofullwith a stated reason), size-capped by
[handoff] max_cache_bytes(8 MB default).models.TranscriptMessagegained
anIDlifted from each source format's own record id where grounded. - Antigravity CLI (
agy) adapter — the newer Antigravity CLI is now a
first-class, separately-tagged adapter (antigravity-cli):
plaintext-protobuf SQLite.dbconversations parsed directly,.pb
conversations via the existing transcript fallback, name-gated so the desktop
and CLI layouts each claim only their own files, with
observer backfill --antigravity-cli-rescanand an integration-registry row.
Add"antigravity-cli"to an explicitenabled_adapterslist to enable it. observer antigravity-clihandoff launcher (aliasesantigravity,
agy) —--continue-fromdistills a handover and seeds it viaagy -i
(non-proxied).- Community links surfaced in the dashboard Settings page and the
observer initfooter.
Changed
- Obs share flags nested under
[org_client.share.obs]; the dashboard Settings
Observability section is now plane-tagged (Plane A admin vs Plane B
developer) for legibility. - Website download counter refreshed (npm 14,893 / PyPI 9,242).
Fixed
- Antigravity CLI sessions are now tagged
antigravity-cliinstead of blending
into the desktopantigravitytool — the parse helpers hardcoded the tool
constant;ParseSessionFilenow re-tags every event to the adapter's own
name at the boundary. - MCP
observer serveskips the SQLitequick_checkso a large DB can't blow
the init timeout. - Session handoff resolves a foreign-OS project root for the doc + launch cwd
(cross-OS WSL case).
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.16.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.16.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.16.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.16.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.16.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.16.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.16.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.16.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.16.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.15.0
Added
- Session Handoff (continue-anywhere) —
observer handoff <session-id> [--to <tool>]distills any captured session from the source tool's OWN
transcript files into a scrubbedHANDOFF-<id>.mdthe target tool reads in
the project root, priced per carry mode (metadata / distilled /
distilled_tail / full) at the target model. Fork from any stable point of
the message history (snap table refuses cuts inside unresolved tool chains).
NOT cache migration — provider caches are server-side and prefix-exact; the
estimate's stay option (next-message predict band + live cache
value-at-risk) is the honest surface of that fact. Surfaces: CLI
(observer handoff,handoff list), dashboard session-detail
"Continue in…" modal with fork picker
(GET /api/session/<id>/handoff/estimate+POST /api/session/<id>/handoff),
MCPcontinue_session(tool count 19 → 20). Transcript readers:
claude-code, codex, cursor, cline, cline-cli, hermes, opencode. Node-local
handoffstable (migration 055) stores counts/enums/hashes only — never
the doc. Docs:docs/session-handoff.md. - Session Handoff — dashboard "Launch
<tool>here" (embedded web
terminal). The Continue-in… modal can now START the target tool in the
browser instead of only writing a handover file: for a launchable target
(claude-code / codex / gemini-cli / pi) the daemon spawns
observer <tool> --continue-from <id>in a PTY inside its own OS and
streams the TUI into an xterm.js panel over a/ws/launch/<handle>
websocket — working uniformly local, remote, or WSL-daemon/Windows-browser
(no cross-OS shell). New pure-logicinternal/termsession(PTY session
registry behind an injected spawner; process-group reaping on unix,
concurrent cap + idle reaper) and theHandoffCapability.Launchregistry
field. Server-derived argv only; CSWSH-defended (256-bitcrypto/rand
handle minted only by the Origin-checkedPOST /api/session/<id>/launch,
pluscoder/websocketcross-origin rejection). On by default, kill-switch
[handoff].allow_dashboard_launch.GET /api/launch/sessions+
DELETE /api/launch/<handle>for the live-session list. Unix-only PTY
backend (native-Windows daemon reports unsupported → run under WSL). Docs:
docs/session-handoff.md(Launch here),docs/security.mdledger. - Session Handoff — armed hook delivery (
--deliver hook, claude-code).
observer handoff <id> --to claude-code --deliver hookarms the handover
for the NEXT claude-code session in the project: it injects as SessionStart
additionalContext(same seam as the advisor digest), one-shot, expiring
after[handoff] hook_ttl_minutes(default 240). The payload is hard-
budgeted to[handoff] hook_max_bytes(default 8192; Phase 0 D-P0.2's 8KB
intact cap) — the compact doc when it fits, else the document head plus a
pointer to read the on-diskHANDOFF-*.md. Doc content stays on disk; the
handoffsrow (migration 056:hook_expires_at/hook_delivered_at/
project_root) records only the arming window and file path. The claim is
a single guardedUPDATE … RETURNING(race-safe). Delivery dispatches on
the target'sintegration.HandoffCapabilityinject set — only claude-code
declaresinject_hook; other tools error honestly. - Session Handoff — launcher
--continue-from(prompt delivery).
observer claude --continue-from <session-id>and
observer codex --continue-from <session-id>run the handoff for the
launcher's OWN tool (deliveryinject_prompt) and seed the rendered
handover as the tool's first user prompt before exec'ing it — no
copy/paste. Mirrorsobserver handoffflags (--carry,--from-message,
--from-time; default fork = last message). claude gets the doc prepended
as its leading positional prompt, codex appended as the trailing positional
(TUI +exec); forwarding your own positional prompt errors honestly (two
prompts — forward value-flags as--flag=value). Handovers over 100KB
degrade to a marker-carrying pointer prompt (the full doc is on disk). The
observer handoff … --to claude-code|codexoutput now prints a
--continue-fromtip. Delivery still dispatches on the target's
integration.HandoffCapability— a prompt handoff to a tool without the
lane errors honestly. - Session Handoff —
--continue-fromextended toobserver geminiand
observer pi. Both now accept--continue-from(plus--carry,
--from-message,--from-time), seeding the handover as the tool's first
prompt: gemini via its-i/--prompt-interactiveflag ("Execute the
provided prompt and continue in interactive mode"), pi as a trailing
positional message (pi[messages...]start an interactive session). The
injection strategy is now a declaredpromptInjectiondescriptor (leading
positional / trailing positional / flag value) applied by a shared
injectPrompthelper — noswitch tool; claude and codex are refactored
onto the same helper.hermesstays deferred: its only prompt flag
(-z/--oneshot,chat -q) is headless one-shot (answer once and exit),
not an interactive seed, so wiring it would change the run mode.
opencode(TUI positional is a project path),copilot-cli(headless
-ponly),openclaw(proxy runtime-block) andcline-cli(not
verifiable on the grounding node) also remain deferred. - Session Handoff — best-effort target-session linker. Every rendered
handover carries a<!-- superbased-handoff <shortid> -->marker that
rides into the target session on every delivery lane (injected prompt,
SessionStart context, or the model readingHANDOFF-<shortid>.md).
observer handoff listnow runs a time-boxed best-effort sweep first:
for each delivered handoff of the last 7 days still missing a target,
it re-reads candidate sessions of the target tool in the same project
(started after the handoff) via the shared transcript-reader dispatch and
stampshandoffs.target_session_idon the first whose transcript carries
the marker. The link is written once (guarded UPDATE); the list gains a
TARGETcolumn. Pure marker scan lives ininternal/handoff
(ScanMarkers/ContainsMarker); store seam addsLinkTargetSession,
ListUnlinkedHandoffs,CandidateTargetSessions. Short-id is recovered
from the delivered doc's file name (delivery_ref). Everything is
best-effort — an unreadable candidate is skipped and one handoff's failure
never aborts the sweep. - Session Handoff —
handoff_rehydrationcache accounting. A handoff
target's first turn is a large cold cache write BY DESIGN (the handover
doc arrives as the first prompt / SessionStart context / an early
HANDOFF-<id>.mdread). It is now annotated as a new
cause=handoff_rehydration(samereanchorkind, so kind-based
denominators are unchanged) instead of a plainreanchor, so it no
longer trips the advisor'ssession_balloon/cache_write_waste
detectors orobserver cache-health's cause-concentration WARN. Fired
live in cachetrack when thesuperbased-handoffmarker is present on the
first observed turn (proxyparseRequestbody scan + Tier-2 store
block-body scan), and applied retroactively by the advisor via
handoffs.target_session_id(the belt for non-proxied targets). Docs:
docs/cache-tracking.md→ "Session-handoff accounting". - Session Handoff — implicit-cache lane consults the handoff marker. The
§15.3 implicit / OpenAI-Codex attribution path now mirrors the Anthropic
lane: on the bootstrap turn with thesuperbased-handoffmarker set,
ruleImplicitHandoffRehydrationfirescause=handoff_rehydrationwith the
sameimplicit_writekind the plain reanchor uses, so every
denominator/exclusion is unmoved (the kind routes tobucketSkipped+
isRateSkipped, and the bootstrap turn is already excluded from
ImplicitCacheConsistency) — only the cause differs. The marker flag,
already scanned provider-agnostically by the proxy'sparseRequest, is now
threaded through the OpenAI branch ofbuildCacheObserveInput(it was
previously dropped) and consumed byobserveImplicit. Live coverage is
proxy-only; a non-proxied codex Tier-2 target carries no reconstructed
block bodies to scan, so that lane stays covered by the advisor's
retroactive handoff-target belt. - Session Handoff — retention sweep +
observer doctorprobe (P4). The
node-localhandoffstable is now pruned by the shared retention runner
(observer prune, andprune_on_startuponobserver start/watch)
viastore.PruneHandoffRows, gated by the new[handoff] retention_days
(default 180;0= keep forever). Theprunesummary line reports
handoff_rows=<n>.observer doctorgains a handoff readers check:
per adapter it reports the declared transcript tier + delivery lanes and,
where a session exists from the last 30 days and the adapter implements
the reader, runs a read-only, time-boxed (2s) readability probe against
the latest session — honestread OK/metadata handover only/
reader-declared-but-unreadable WARN, dispatched on capability shape (no
tool-name branching).
Changed
- The node/developer dashboard is now purely coding-agent (Plane B). The
general-observability surfaces — Trajectories, Evals, and the
Admission policy editor / per-end-user budgets — were removed from the
local dashboard nav. These observe an LLM application you host at the
admin level (end-user traces, evals, and input guardrails), not your own
coding assistant, so their home is the admin dashboard (web2, the
Trajectories nav group). A node still captures and pushes obs data when
[observability]is enabled; it just no longer renders the obs UI locally.
The obs backend,/api/obs/*endpoints, andobserver obs …/observer evalCLIs are unchanged. See the new [`docs/deployment-m...
v1.14.0
Security
- Whole-product security review + remediation (see
docs/audits/security-review-2026-07-02.md; tracked indocs/security.md).
A six-surface review plusgovulncheckfound and fixed 4 high, 8 medium, and
6 low findings;govulncheckreachable advisories went 28 → 0.- Org server access control (high). Three privileged
/api/org/*routes
(routing-policy publish, routing-summaries export, enrolment-token mint)
were gated on SAML-session presence only, so any SSO-capable member could
reach them — publish a fleet-wide routing policy, export every developer's
email and spend, or mint an enrolment token for an arbitrary user (ingest
impersonation). They now require org-admin authority (admin_emails). - SAML signature bypass (high). Bumped
goxmldsig1.4.0 → 1.6.0
(GO-2026-4753, reachable from assertion validation),golang.org/x/net
0.53 → 0.55, and the build toolchain to go1.25.11 (clears ~25 stdlib
advisories includinghtml/templateXSS reachable from the org dashboard). - Dashboard CSRF / DNS-rebinding (high). The local dashboard exposed
state-changing endpoints with no origin or Host validation; a malicious web
page could drive them. Added a same-origin + loopback-Host guard and a
non-loopback-bind warning. - Watcher symlink escape (high). A symlink planted under a watch root
could be followed out of the tree and its contents excerpted into the DB;
such symlinks are now skipped. - Privacy / attribution (medium). Ingested
user_emailis pinned to the
authenticated pusher (was forgeable on aggregate rows), andgit_branchis
no longer shipped in the default metadata-only sharing posture. - Denial-of-service hardening (medium/low). Enforced the previously-dead
[watcher].max_file_size_mb, added watcher panic recovery, a protobuf
recursion-depth cap, and a proxy request-body size cap; plus a proxy
guard-mask JSON backstop, WSL hook-command quoting, gitgitdir:traversal
rejection, and PowerShell path escaping.
- Org server access control (high). Three privileged
Added
- Config auto-migration rail. Deprecated config keys are now rewritten
to their current names on disk instead of only being mapped in memory (which
reprinted aconfig: deprecation:warning on every load). A new pure,
table-driven registry (internal/config/migrate) surgically renames keys —
preserving your values, comments, ordering, and every untouched section —
drops keys with no analog, and stamps[observer] config_version. It runs
automatically once onobserver start(the daemon is the sole writer; a
config.toml.bakbackup is written first) and on demand viaobserver config migrate/observer config migrate --dry-run. Idempotent and
fail-safe: a value it can't edit by line surgery is left untouched, never
corrupted. Registry v1 migrates the decommissioned[compression.code_graph]
/[intelligence.code_graph]blocks onto[codeintel].
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.14.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.14.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.14.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.14.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.14.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.14.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.14.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.14.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.14.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-privatev1.13.0
Added
- Output Composition (verbosity) — code vs. explanation, by language, with
estimated cost. Measures what actually comes through an AI assistant's
output: narrative explanation vs. shown (fenced) display artifacts vs.
authored code (file writes + shell commands), resolved by language, at turn /
session / aggregate levels. A new pureinternal/verbositylayer owns the
markdown fence scanner, a comprehensive extension/filename/fence-tag →
language+category table, the byte breakdown, and the token/cost apportionment
(output tokens split by per-class chars-per-token, priced at the model's
output rate). Capture adds the node-localactions.content_bytescolumn
(migration 054) — an exact byte length of the code the model authored in each
action, computed at ingest from the untruncated tool input with the content
itself discarded; it is deliberately not on the org-push wire. Surfaces:
theobserver verbosity <session> | --by model|project|day | --unknown-ext
CLI,GET /api/session/<id>/verbosity+ a SessionDetailPanel card,GET /api/verbosity/aggregate+ an Analysis Output-composition section, and the
always-onget_output_compositionMCP read tool. Bytes are exact; token and
dollar figures are labelled estimates.
Changed
- "CCR" reversibility surface renamed to "SROD" (Stash & Retrieve on
Demand). The user-facing label is renamed across the Compression page
panel, the help glossary, the savings-by-mechanism donut, and the Settings
label; internal identifiers are unchanged. - SROD stash previews. The opaque "Top retrieved SHAs" list is replaced
with a "What's getting stashed" preview — a short, scrubbed, single-line
snippet of each recent stashed body (with size and a retrieved badge), read
from the stash dir by the stash event'sbody_hash. Snippets are scrubbed
for display (the stashed body is the model's raw pre-scrub tool output);
LRU-evicted shas are skipped.
Downloads
Pre-built binaries for each supported platform are attached below. Linux variants bundle antigravity-bridge.exe next to the observer binary for WSL2 users of the Antigravity adapter.
| Platform | Asset |
|---|---|
| Linux x86_64 | observer-v1.13.0-linux-x64.tar.gz |
| Linux arm64 | observer-v1.13.0-linux-arm64.tar.gz |
| macOS x86_64 (Intel) | observer-v1.13.0-darwin-x64.tar.gz |
| macOS arm64 (Apple Silicon) | observer-v1.13.0-darwin-arm64.tar.gz |
| Windows x86_64 | observer-v1.13.0-win32-x64.zip |
Verify with sha256sum -c SHA256SUMS (or shasum -a 256 -c SHA256SUMS on macOS) from the directory containing the downloads.
Also available via npm: npm install -g @superbased/observer@1.13.0
Org server (Docker)
The self-hosted org server ships as a Docker image and as per-platform observer-org-v1.13.0-* archives (attached below).
docker pull ghcr.io/marmutapp/observer-org:v1.13.0The image is keyless-signed with cosign. Verify it:
cosign verify ghcr.io/marmutapp/observer-org:v1.13.0 \
--certificate-identity-regexp 'https://github.com/marmutapp/superbased-observer-private/.*' \
--certificate-oidc-issuer https://token.actions.githubusercontent.comSupply chain
CycloneDX SBOMs are attached: observer.cdx.json and observer-org.cdx.json.
SLSA Level 3 build provenance for the binaries is attached below as a *.intoto.jsonl attestation. The build runs on the private origin repo, so pass that as the source when verifying an extracted binary with slsa-verifier v2.7.0 or newer (older versions fail with unexpected tlog entry type: expected intoto:0.0.2, got dsse:0.0.1):
slsa-verifier verify-artifact ./observer \
--provenance-path *.intoto.jsonl \
--source-uri github.com/marmutapp/superbased-observer-private