New Features
Customer Apps Platform
A code-first platform for Oxy engineering teams to build and ship data apps — React + Vite bundles, git-versioned, AI-native, and backed by Oxy’s data products. Apps are built once and served to many customers; each app runs against an Oxy project with authentication, access control, and the full data API handled by the platform.- One-Way Publish Pipeline — A single
oxy publishcommand builds a versioned bundle, pushes it to Oxy as the immutable source of truth, and moves the channel pointer — no multi-step build and deploy dance, no per-app infrastructure to manage. - Channel-Based Deployments — Every publish lands in a draft channel first. Promote it to live (or roll back to any retained build) in one click from the deployment console — a pure pointer move with no bytes copied.
- Session-Based Auth — Apps are gated by the visitor’s Oxy session. The SDK’s
useQuery, semantic query, agent, and procedure hooks carry the session cookie automatically at the same origin — no API keys, no token wiring, no per-app auth setup. - Data API Surface — Bundles call into Oxy’s data plane through typed HTTP endpoints: inline SQL (
useQuery), semantic-layer queries (useSemanticQuery), streaming agent runs (useAgentRun), and long-running batch procedures (useProcedureRun). Access is scoped to what the visiting user can already read — a bundle cannot escalate beyond the user’s org membership. - Externally Hosted Apps — Apps that live on a separate server can be reverse-proxied through Oxy at the same origin, so the bundle’s SDK calls ride the visitor’s session with no extra setup. Register the upstream URL once in the admin UI — no
oxy publishstep needed. - Deployment Console — The app detail view shows the live and draft channel pointers side by side, with a full build history, publisher attribution, and one-click Make Live / rollback for any retained build.
Zero-Config Subdomains for Customer Apps
Externally hosted customer apps are now reachable at a dedicated subdomain with no per-app configuration:- Dedicated App Subdomain — Each app gets a
<org>--<slug>.customer-apps.oxygen-hq.comURL where the upstream app sees/as its own root, so root-relative assets, runtimefetchcalls, dynamic routes, and server actions all resolve correctly without setting abasePathor any Oxy-specific environment variable. The original subpath URL keeps working as a fallback. - Dual-URL Admin View — The app detail view lists both the subdomain and subpath URLs side by side, each with copy and open buttons, with the recommended subdomain URL clearly tagged.
More Airway ELT Sources
A new source type for.airway.yml ELT pipelines, wired into the New Pipeline wizard with credentials kept in the secret manager (never written to the pipeline YAML):
- ClickHouse Source — Pull tables from ClickHouse (including ClickHouse Cloud) into your warehouse over its HTTP interface, with optional incremental sync via a cursor field for high-watermark loads.
Platform Improvements
SQL IDE Reliability
- DuckDB tables load again in the SQL IDE — After the Vite 8.0.13+ upgrade, opening the SQL IDE could leave DuckDB tables stuck on a perpetual loading spinner. The bundled DuckDB worker is now initialized as an ES module on both the local and CDN code paths, so query results render normally in development builds and production.
Warehouse Query Reliability
- Empty-result queries no longer 500 on DuckDB, Snowflake, MotherDuck, and connectorx — Certain zero-row metadata and CSV-probe queries could trigger a panic in the Arrow-version bridge used by every warehouse query path, surfacing as an intermittent 500 from a single request. Each query path now short-circuits to the empty-result shape it already supports, so these queries return cleanly without affecting non-empty inputs.
Semantic Layer Reliability
- Worktree and state copies no longer break semantic discovery — Semantic file discovery now consistently skips hidden and build-output directories —
.worktrees,.git,.oxy_state,target,node_modules,dist, andbuild— so duplicate copies of a.view.ymlor.topic.ymlliving under those folders are not re-discovered. This prevents spurious “duplicate view name” errors that could block the semantic engine from loading on workspaces using Git worktrees or local state directories.
Pre-Aggregation Resilience
- Pre-aggregation cycles skip views with unconfigured datasources — When a semantic view referenced a database that wasn’t listed in
config.yml, the background pre-aggregation worker would hard-fail the entire heartbeat, marking each cycle as failed and producing log spam on every tick. Such views are now skipped up front and reported via a newRollupSkippedNoDatasourceevent, so the coordinator dashboard and logs stay clean for workspaces that have a mix of configured and unconfigured datasources.
Orchestrator Performance
- Faster run-detail loading — The Orchestrator run tree now batches event lookups into a single query instead of one database round-trip per node, cutting load and latency when inspecting large workflow trees.
- Smoother orchestrator overview — The Overview timeline now caches per-schedule occurrence computations and only recomputes missing run slots once per minute, eliminating UI lag when unrelated schedules update — especially for sparse (e.g., monthly) crons.
Customer Apps
- Unpublished apps default to the draft channel — Customer apps that haven’t been published yet now resolve to their draft build by default, so in-progress apps no longer fall back to an unexpected channel.
- Real connector errors surface on query failures — When a customer app’s
useQuerycall hits a database error (connection refused, authentication failure, TLS, or DNS lookup failure), the 500 response now includes the underlying connector message instead of a generic “could not resolve database.” App authors can diagnose failures from the response itself, without digging through server logs. - No spurious manifest error for externally hosted apps — The admin AppInfo tab no longer shows a misleading “Manifest error” for externally hosted apps, which have no Oxy-side bundle. These apps now display as externally hosted with their upstream URL.
Git Subdirectory Workspaces
- Branch switching works for subdirectory workspaces — For a workspace that lives in a subdirectory of a git repo, switching branches could fail to load the project with an “Unable to load workspace configuration” error. Oxy now resolves the workspace’s in-repo subdirectory inside the worktree, so
config.ymlis found and branch switches load correctly. Workspaces at the repo root are unaffected. - Copyable configuration errors — When a workspace config fails to load, the error is now shown in a click-to-open popover with selectable, monospace text and a Copy button — in both the sidebar and the IDE — instead of a hover-only tooltip you couldn’t select.