Spürhund is live. A GraphQL client. Browser-based. No account. No cloud. Just you and your schema.

Go try it: spuerhund.dev

The landscape is surprisingly bad

I work with GraphQL daily. Production APIs, schema introspection, debugging queries across environments. The tool you use for that matters.

Here is what exists:

Altair is the current best-in-class dedicated client. Angular-based, no AI, no cross-session sync. It works until it doesn’t — auth handling gets confused, the schema browser feels like an afterthought, and the UI has that specific kind of friction where you notice it forty times a day but never enough to stop and fix it.

Yaak is modern but REST-first. GraphQL is a checkbox feature, not the core.

Apollo and Postman both require accounts and cloud connections. If your queries contain production credentials or internal schemas, “sign in to continue” is not a feature. It is a liability.

GraphQL Playground has been dead since 2019.

That is the field. A bunch of tools that are either abandoned, bloated, or treating GraphQL as a secondary concern.

Spürhund—tracker dog—fills that gap. Lean, local, GraphQL-only, browser-first.

How it works

You add a server. Endpoint URL, auth config, done. Spürhund introspects the schema automatically and caches it in IndexedDB. From there you write queries with full autocomplete from your actual schema — not some generic GraphQL grammar, your types, your fields, your arguments.

The editor is CodeMirror 6 with a custom Deep Indigo theme. Amber caret, purple keywords, emerald strings. Three tabs per query: the query itself, variables (JSON mode), and custom headers (also JSON mode). ⌘⇧F prettifies whatever tab you are in — graphql.print(parse()) for queries, JSON.stringify for JSON.

Auth supports four modes: none, bearer token, API key with configurable header name, or raw custom headers. Servers marked as production get a red warning badge in the header, because mixing up environments should be hard, not easy.

The schema browser

This is the part I wanted most and could not find done well anywhere else.

The schema browser opens as a fullscreen overlay. It works like macOS Finder column navigation — click a type, its fields appear in the next column, click a field that returns another type, drill into that type’s fields. Unlimited depth. You follow the shape of your schema the way you think about it: by walking through relationships.

Types are grouped by kind: Root Types, Objects, Input Objects, Enums, Interfaces, Unions, Scalars. Each kind gets its own color — amber for root types, zinc for objects, green for enums, sky for inputs, orange for interfaces and unions, purple for scalars. The color coding is not decoration. When you are six columns deep, the colors tell you what layer of the schema you are looking at without reading every label.

Deprecated fields show with a strikethrough and a red badge. Markdown descriptions from the schema render properly — headings, bold, italic, code, links. Long descriptions collapse to 120 characters with a “Show more” toggle so fields stay visible instead of drowning in documentation text.

The browser has a filter, a reload button to re-introspect, and a pop-out button that opens it as a standalone page. That last one is useful when you want the schema reference next to your editor in a separate window.

Per-query history navigation

Every time you execute a query, Spürhund stores the query text, the variables, and the full response. Not just in a log somewhere — navigable.

Back and forward arrows in the editor tab bar step through past executions of the active query. Navigate back and the editor shows the old query text while the result pane shows the old response. A position indicator reads “live” when you are at the current state, or “24 / 27” when you are viewing execution 24 of 27. The indicator turns amber when you are looking at history — a visual cue that the data on screen is not the latest.

You can execute from any history position. That creates a new entry and resets the cursor to live.

Auto-save pauses while you are browsing history so it does not overwrite your saved query with historical content. Switching to a different query reloads that query’s own history and resets the cursor.

This is the kind of feature that sounds minor until you need it. “What did the response look like before I changed that filter argument?” is a question you answer in two clicks instead of re-running and hoping you remember the old variables.

Browser-first architecture

Spürhund was originally planned as a full client-server architecture with SQLite and WebSocket sync. I scrapped that and went browser-first.

The reasons were practical:

  • Zero infrastructure — static site on Cloudflare Pages, no backend to maintain or pay for
  • Instant onboarding — open the URL, start working, data stays in your browser
  • Privacy — queries, credentials, and schemas never leave your machine
  • Portability — export your full workspace as JSON, import it anywhere

The data model is four IndexedDB stores: servers, queries, schema cache, and execution history. Eight Zustand stores manage the UI state. The whole thing is a React 19 SPA with Vite 8 and TailwindCSS 4.

There is an optional server component built on Bun and Effect-TS with SQLite persistence. That is kept for future AI features and self-hosted deployments where cross-session sync matters. The contracts package defines the WebSocket protocol for when that path is needed. But the browser version is the product.

The small things that add up

Quick-open with ⌘P — fuzzy search across all queries from all servers. When you have thirty queries across five environments, the sidebar is not enough.

CORS error detection with a clear explanation and a one-click “retry with CORS proxy” option. Because the first time a browser-based client hits a CORS wall, most people think the tool is broken.

Copy as cURL generates the full command including auth headers. Hand it to a colleague, paste it into a script, debug from a server that does not have a browser.

Export/import uses a versioned JSON format: servers, queries, schema cache, history. Version 1 today, forward-compatible by design.

Dark and light mode that follows system preference or manual toggle. The editor theme adapts. The schema browser adapts. Everything adapts.

Stack

LayerTechnology
FrontendReact 19, Vite 8, TailwindCSS 4, Zustand 5
EditorCodeMirror 6, cm6-graphql
PersistenceIndexedDB (browser-native)
DesktopElectron 40
DeploymentCloudflare Pages
Server (optional)Bun, Effect-TS, SQLite

The kind of stack where nothing is surprising and everything is fast. Chunk splitting keeps CodeMirror, GraphQL, and React as separate bundles. First load is quick. Subsequent loads are instant.

What is next

Query tab management for parallel queries. Subscription support over WebSocket. Schema diff to compare introspections across environments. Request cancellation. And eventually, AI features — query generation from natural language with your schema as context, error explanation, documentation generation.

The AI path is the reason the server component exists. But the core product is and stays the browser client.

Try it

spuerhund.dev — open it, add a server, run a query. The welcome screen has three public GraphQL APIs (Countries, SpaceX, Rick & Morty) to get started in seconds.

This is my Werkzeug—my daily driver for GraphQL work. If your current client annoys you — and it probably does — give Spürhund a spin. Updates are rolling out regularly.

Paste into LinkedIn articles, Notion, or any rich text editor.