v1.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-private