v0.0.64 — Project Home
Released: 2026-05-12.
Project Home page
Clicking a project from the project list used to drop you straight into the 1,761-line Flow Builder. v0.0.64 introduces a home page first at the bare /projects/:projectSlug route — a Dataiku-style landing surface that orients the user before the heavy authoring views.
What lands on the home page
-
Header — project name, description, icon. The icon accepts emoji or short-name aliases (
folder → 📁,chart → 📊) and falls back to a default diamond. -
8-tile surfaces grid — Flow / Lineage / Datasets / Recipes / Dashboards / Cobuild / Agents / Settings. Each tile is a project-scoped link, with asset-typed tiles (Datasets / Recipes / Dashboards / Agents) showing live counts.
-
Mini Flow DAG — a
reactflowwidget between the header and the surfaces grid, lazy-loaded with a 20-node cap. Nodes are clickable and route to their detail page:dataset → /projects/{slug}/datasets/{name}recipe → /projects/{slug}/recipes/{name}dashboard → /projects/{slug}/dashboards/{id}agent → /projects/{slug}/agent-builder/{id}
Each node carries an emoji kind badge (📋 dataset, ⚗️ recipe, 📊 dashboard, 🤖 agent) and the widget exposes an Open in Flow → link to the full Flow Builder. (The earlier "View full lineage →" link pointed at the dbt Lineage Explorer, which only sees dbt models — confusing on a project with dashboards/agents but no dbt.)
-
Recent Cobuild sessions strip — last few sessions for the project, scoped to the URL project (not the JWT, see security fix below).
Pinned tiles
Users can pin any of the 8 tiles via a ☆ button (top-right on hover, solid ★ when pinned). Pinned tiles render in a Pinned row above the main grid; the main grid relabels to More surfaces and shows the unpinned remainder.
Persistence: one JSONB row per (user, project) in honeyframe.user_project_prefs, with free-form shape so future prefs (dismissed banners, density toggle) fold in without further migrations. GET / PUT /api/projects/{id}/preferences are gated by check_project_access — a caller cannot enumerate project existence via 200-vs-404 timing on a project they don't belong to.
Endpoints
| Endpoint | Description |
|---|---|
GET /api/projects/{id}/summary | {datasets, recipes, dashboards, agents} counts. Four parallel COUNT(*)s, 403-gated. |
GET /api/lineage/project-graph?project_id=X | Slim nodes + edges graph (5 fields per node vs ~50 from /api/lineage/dag). Edges inferred from flow_recipes.inputs / output_datasets. |
GET / PUT /api/projects/{id}/preferences | Per-user pinned tiles. |
Cobuild session list now scopes to URL project
Bug observed 2026-05-12 on the new home page: navigating to /projects/<slug-B> rendered project A's Cobuild sessions in the "Recent Cobuild sessions" strip. Root cause — GET /api/cobuild/sessions read project_id from the JWT's legacy "active project" stamp, so the list didn't follow when the URL did.
Fixed: the endpoint now accepts an optional ?project_id= query param. When supplied, the caller is validated via check_project_access and the org_id is pulled from the project row (not the JWT — superadmins routinely cross orgs and the JWT lags the URL). Without the param, the endpoint falls back to JWT-scoped resolution for back-compat with the F13 dock and older callers.
Project switcher navigates to project home
Before: clicking a different project in the ProjectPill dropdown called window.location.reload() — but the URL still pointed at the old project's slug. On reload the slug-sync re-resolved the old slug and stamped localStorage back to the old project_id. The dropdown looked dead.
Fixed: the switcher now window.location.assign(/projects/<new-slug>) — the address bar moves to the picked project's home before the navigation reload, so the new URL is what slug-sync sees, and the v0.0.64 home page renders URL-scoped data for the new project.
Backend dep pins
Twenty heavy backend deps (anthropic, boto3, chromadb, croniter, dbt-duckdb, dbt-postgres, deltalake, duckdb, email-validator, faiss-cpu, google-analytics-data, google-cloud-bigquery, google-cloud-storage, openpyxl, oss2, pyarrow, pymongo, reportlab, snowflake-connector-python) are now pinned to the versions resolved on the v0.0.63 known-good install. The Nuitka module follow tree had drifted from 186 modules (v0.0.62) to 218 modules (v0.0.63) — a 17% jump driven by >= floors letting each CircleCI build resolve a fresh "latest" within constraint. The drift invalidates ccache locality and was an input to the recent v0.0.63 build slowdowns. Bumps are now deliberate, one release at a time.
CI fix — docs job docusaurus binary
v0.0.63 build #34 failed at "Validate portal build" with sh: 1: docusaurus: not found. The Cut Docusaurus snapshot step only ran npm ci when versioned_docs/version-<v> didn't yet exist; on re-runs of the same tag the install was skipped, leaving the local docusaurus binary missing. npm ci --silent now runs unconditionally above the snapshot conditional.