May 2026
May 7th
Section titled “May 7th”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.
What’s New
Section titled “What’s New”Skills
Section titled “Skills”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
.qskillfile 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.
Web App Refresh — Svelte 5
Section titled “Web App Refresh — Svelte 5”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.
Smarter Login
Section titled “Smarter Login”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
/homeinstead 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.
Org Switching
Section titled “Org Switching”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.
Embed Customization
Section titled “Embed Customization”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
initmessage doesn’t arrive within 10 seconds, the embed shows a friendly error and emits aninit_timeoutevent 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:
| Connector | Notes |
|---|---|
| Amplitude | API Key + Secret with US/EU region selection |
| Customer.io | App API Key with Global/EU region selection |
| Mixpanel | Service Account auth with paste-a-URL flow that extracts your numeric project ID automatically |
| NetSuite | Token-Based Authentication (TBA) — account ID, consumer key/secret, token ID/secret |
Fast Column Type Changes
Section titled “Fast Column Type Changes”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.
Decimalinstead ofDECIMAL(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.
Drift Detection at Sync Time
Section titled “Drift Detection at Sync Time”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.
Reliability for Large Datasets
Section titled “Reliability for Large Datasets”A multi-tier set of changes makes Querri much more dependable on sources with tens of millions of rows:
| Tier | Improvement |
|---|---|
| Executor memory | The 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 guardrails | When 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 hints | When 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 recovery | If 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.2 | Bumped from 1.5.1, picking up an Iceberg AVRO read fix. |
Improvements
Section titled “Improvements”| Area | Change |
|---|---|
| Chat input | Action buttons (Skills, Faster Mode, Extended Thinking) integrate cleanly into the input footer; layout is consistent in embedded contexts. |
| Chat drafts | Drafts 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 widgets | Widgets 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 overlays | Pending, 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 screens | Themed loading GIFs now fall back to the default spinner if the themed asset fails to load. |
| Internal navigation | All in-app navigation now consistently uses SvelteKit’s goto() for smooth client-side routing — no more surprise full-page reloads on internal links. |
| Accessibility | Added aria-label attributes to copy, send, stop, and dropdown trigger buttons across the chat interface. |
| Dark mode prose | Chat metrics, reasoning displays, and other prose content now correctly inherit dark-theme colors instead of using fixed light-theme palette. |
| Theming | Centralized 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 noise | Benign AbortError network requests no longer get logged as errors. |
| API auth | New in-memory rate limiting on auth endpoints to throttle abuse without a Redis round-trip. |
Bug Fixes
Section titled “Bug Fixes”| Area | Fix |
|---|---|
| Notifications | Toast action buttons (e.g. “View Dashboard” after a save) now actually navigate when clicked. |
| Chat updates | Fixed an HTTP method mismatch (PATCH vs PUT) that prevented some chat metadata updates from saving. |
| Chat submissions | Stale chat-client lifecycle effects no longer self-abort the message you’re trying to send. |
| Library drag-drop | A file row uploaded via drag-and-drop now appears immediately in the library list. |
| Dashboard widget tables | Tables inside dashboard widgets no longer render as a smaller rounded box nested inside the widget tile. |
| Dashboard scrolling | Restored a scrollbar that disappeared on tall dashboard tables. |
| Infinite scroll | Tables in maximize mode again load more rows as you scroll to the bottom. |
| Conditional formatting | Range serialization fixed so saved formatting rules round-trip correctly. |
| Project state | Pending steps no longer get stuck in optimistic state if a long-poll times out. |
| /dashboards 404 | Visiting /dashboards directly now redirects properly instead of 404’ing. |
| Wrapped presentations | Fixed an infinite-fetch loop on the wrapped presentation route. |
| Recast UX | The --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 recovery | DuckDB 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