Skip to content

May 2026

Skills, a top-to-bottom web app refresh on Svelte 5, smarter login flows, org switching, fast column type changes, and reliability improvements for large datasets.


Skills are reusable analysis recipes you teach Querri once and reuse forever. A skill bundles a title, a free-form set of instructions, and an optional example plan — enough context for the planner agent to handle a recurring kind of question the way you’d handle it yourself.

Skills are personal to whoever creates them. Admins can promote a skill to the whole organization with one toggle so the team can stop re-explaining the same thing.

Where they help:

  • Recurring reports — month-end close, weekly KPI rollups, board-deck financials. Structure is fixed; only the time window changes.
  • Domain-specific analyses — anywhere the right answer depends on knowing your data. Customer-cohort retention, product-line attribution, sales-cycle stage definitions.
  • Onboarding — capture how your team actually does the analysis so new users can ask the same question and get the same shape of answer.

Creating skills:

  • From the canvas — finish an analysis you’d want to repeat, then click Save as Skill. Querri extracts the steps, drafts a title and description, and pre-fills an editable form.
  • From scratch — go to Skills in the sidebar and click + New Skill to write the instructions and plan by hand.
  • Imported — receive a .qskill file from someone else, click Import, and review before saving. Round-trip stable: export a skill on one Querri instance, import it on another.

Using skills in chat:

When a skill is relevant, Querri now surfaces it as a suggestion pill in the chat bar — visually distinct with a brand-color glow. Click to load. You can also pick from your library via the skill loader. Loaded skills ride with each message, so the planner sees them every turn.

Sharing:

Personal by default. Admins see an Org-shared toggle on each skill card; flipping it makes the skill visible to everyone in the organization. Non-admins can still author and use their own skills without admin involvement.

See the Skills documentation for the full guide — creating, using, sharing, and .qskill import/export.


The main app has been rebuilt on Svelte 5. The new app — previously available at /builder/* — now serves from the root path and replaces the previous version. Everything you’d expect to find is in the same place; the underlying framework is faster, more reactive, and uses less memory across long sessions.

What this means in practice:

  • Snappier interactions across the app — chat input, dashboard widgets, dataflow nodes, and project navigation all benefit from Svelte 5’s fine-grained reactivity.
  • Bookmarks keep working — old /builder/* links permanently redirect to the equivalent new path. Nothing for you to update.
  • Same features, same data — no migration step. Log in and you’re on the new app.

The previous version is preserved for reference but is no longer served by default. If you find a regression, please reach out — we want to know about it.


Logging in now adapts to how you actually authenticate:

  • Email lookup auto-redirects OAuth users — enter your email and if it matches a known Google or Microsoft identity, you go straight to your provider instead of seeing a password prompt that would never work.
  • Forgot password pre-fills your email — if you typed it on the login form, you don’t have to type it again.
  • Org selection shows progress — clicking your organization now displays a “Signing into …” spinner for the 3–15 seconds the login takes, so it never feels like the click was lost.
  • Faster post-login routing — authenticated users go directly to /home instead of bouncing through an extra redirect.

Admins can also gate public sign-up via the new PUBLIC_ENABLE_SIGNUP environment variable. With it disabled, both the /signup route and the underlying API are blocked, and the “Sign up” link disappears from the login form.


Switching between organizations is now flicker-free. Cached project, dashboard, and file data is cleared, custom theme variables reset, and the correct organization-specific theme loads instantly so the UI doesn’t briefly flash the wrong colors.

The sidebar also picks up a few changes alongside this:

  • Skills is now its own top-level navigation item, available to every user.
  • Settings is restricted to admins and is hidden inside embedded contexts.
  • Avatars and menu styling are unified for consistency across themes.

The embedded chat experience picks up several new controls and reliability improvements:

  • Chrome hidden by default in iframes — embedded views default to a clean look without app navigation. Use the embed config to opt back in if you need it.
  • Dynamic theming via postMessage — the parent application can push color updates without reloading the iframe.
  • Skills and Faster Mode toggles — control whether embedded users see the Skills loader and Faster Mode button.
  • Better error reporting — chat stream errors now include a clear title, an inferred category (rate limit, network, etc.), and a support reference ID for easier diagnosis.
  • Init timeout — if the parent app’s init message doesn’t arrive within 10 seconds, the embed shows a friendly error and emits an init_timeout event instead of spinning forever.
  • Branded OG share cards — share links now generate Open Graph preview images that respect your white-label theme.

Connector Forms — Amplitude, Customer.io, Mixpanel, NetSuite

Section titled “Connector Forms — Amplitude, Customer.io, Mixpanel, NetSuite”

Configuration UIs for four connectors are now available in the app, closing out the gap from the recent connector backend work:

ConnectorNotes
AmplitudeAPI Key + Secret with US/EU region selection
Customer.ioApp API Key with Global/EU region selection
MixpanelService Account auth with paste-a-URL flow that extracts your numeric project ID automatically
NetSuiteToken-Based Authentication (TBA) — account ID, consumer key/secret, token ID/secret

Changing a column’s type — for example, telling Querri that a VARCHAR column is actually a DATE — used to require a full source resync. It now applies as a presentation-layer cast at materialization time, so iteration is fast and the underlying source stays untouched.

The same change rebuilds the UI read path on top of a parquet “companion” file, which makes browsing large sources dramatically faster. Production was previously seeing 60-second timeouts on a 314k-row source preview; that’s gone.

You’ll notice:

  • Type changes from the column dropdown apply within seconds, not a full sync cycle.
  • Friendlier type labels in the dropdown (e.g. Decimal instead of DECIMAL(10,2)).
  • An on-error mode that lets you choose between strict cast-or-fail and best-effort.
  • Column previews load instantly on large sources.

When a vendor changes the format of a column between syncs (e.g. a date field flipping from MM/DD/YYYY to YYYY-MM-DD), persisted type overrides used to silently null every new row. Querri now samples freshly-synced data and verifies each column’s persisted cast still works. Columns that drifted are dropped from the sync’s plan with a [CAST_DRIFT] warning surfaced on the sync run, so the column stays as raw text (slow but correct) instead of evaporating.

Operators see drift warnings in the sync history UI alongside any other sync warnings.


A multi-tier set of changes makes Querri much more dependable on sources with tens of millions of rows:

TierImprovement
Executor memoryThe executor now drains gracefully under memory pressure instead of getting killed by the kernel. Three-tier cgroup poller catches pressure early and lets in-flight jobs finish cleanly.
Planner guardrailsWhen a step’s source has more than 10M rows, the planner prompt steers the model away from “Cleaned X” / “Filtered X” intermediate steps that would explode memory, and toward folding cleaning predicates into leaf steps.
Post-sync compaction hintsWhen a synced source ends up with more than 50 small data files, a [COMPACTION_RECOMMENDED] hint goes into the structured logs so ops automation can pick it up.
Per-org orphan recoveryIf an executor dies mid-step, the recovery service now correctly resets orphaned RUNNING steps back to PENDING in the right per-org database. Previously, projects with that history could wedge with leaf chart steps spinning indefinitely.
DuckDB 1.5.2Bumped from 1.5.1, picking up an Iceberg AVRO read fix.

AreaChange
Chat inputAction buttons (Skills, Faster Mode, Extended Thinking) integrate cleanly into the input footer; layout is consistent in embedded contexts.
Chat draftsDrafts are now scoped per chat instead of globally, so an unsent message in one conversation no longer bleeds into another. Existing global drafts are migrated automatically.
Dashboard widgetsWidgets now use a stale-while-revalidate strategy — they show cached data immediately and refresh from the server in the background, comparing the cached qdf_uuid against the current one to avoid stale displays.
Dataflow status overlaysPending, error, and cancelled status indicators on step nodes are now compact bottom-anchored pills instead of full-tile overlays — cleaner, especially in view-only mode.
Loading screensThemed loading GIFs now fall back to the default spinner if the themed asset fails to load.
Internal navigationAll in-app navigation now consistently uses SvelteKit’s goto() for smooth client-side routing — no more surprise full-page reloads on internal links.
AccessibilityAdded aria-label attributes to copy, send, stop, and dropdown trigger buttons across the chat interface.
Dark mode proseChat metrics, reasoning displays, and other prose content now correctly inherit dark-theme colors instead of using fixed light-theme palette.
ThemingCentralized CSS variable system across light, night, and white-label palettes. New shadow tokens for cards and sidebars. Refined night theme color palette using oklch for improved contrast.
Sentry noiseBenign AbortError network requests no longer get logged as errors.
API authNew in-memory rate limiting on auth endpoints to throttle abuse without a Redis round-trip.

AreaFix
NotificationsToast action buttons (e.g. “View Dashboard” after a save) now actually navigate when clicked.
Chat updatesFixed an HTTP method mismatch (PATCH vs PUT) that prevented some chat metadata updates from saving.
Chat submissionsStale chat-client lifecycle effects no longer self-abort the message you’re trying to send.
Library drag-dropA file row uploaded via drag-and-drop now appears immediately in the library list.
Dashboard widget tablesTables inside dashboard widgets no longer render as a smaller rounded box nested inside the widget tile.
Dashboard scrollingRestored a scrollbar that disappeared on tall dashboard tables.
Infinite scrollTables in maximize mode again load more rows as you scroll to the bottom.
Conditional formattingRange serialization fixed so saved formatting rules round-trip correctly.
Project statePending steps no longer get stuck in optimistic state if a long-poll times out.
/dashboards 404Visiting /dashboards directly now redirects properly instead of 404’ing.
Wrapped presentationsFixed an infinite-fetch loop on the wrapped presentation route.
Recast UXThe --recast post-processing flow is usable on real sources again — it now materializes its sniff result and uses LIMIT rather than USING SAMPLE for predictability.
Iceberg recoveryDuckDB recovery retries are smarter — fail-fast on FATAL errors, auto-cast on JOIN type mismatches, and provide a VARCHAR[] hint on common cast failures.

Release Date: May 7, 2026