Skip to content

gunsole

A desktop log viewer that doesn't suck. Send structured logs from any app — frontend, backend, whatever — and actually see what's happening. Locally. Instantly. No cloud. No account required. No bullshit.
Gunsole log viewer with an expanded error entry showing stack trace context, tags, and session metadata

Local-first

Your logs stay on your machine. No telemetry, no cloud sync, no “enterprise tier” upsell. SQLite database, localhost server, done.

Type-safe buckets & tags

Define buckets once, get callable accessors with autocomplete. Lock down tag keys with TypeScript generics. Typos and invalid keys caught at compile time, not in production.

Real-time streaming

Logs appear as they happen. Batched for performance, virtualized for scale. Handles 100K+ entries without breaking a sweat.

Dynamic tag filtering

Tags are auto-discovered from your logs. No config, no schema. Send a tag, it appears as a filter. Add more tags, get more filters.

Multi-project

One app, many projects. Organize with workspaces. Your API server, your React app, your cron jobs — all in one place, separated cleanly.

SDK in 3 lines

Install, configure, log. The JS SDK handles batching, compression, retries, rate limiting. You write one line of code to send a log. That’s it.

Live Widgets

Turn logs into real-time cards, progress bars, tables, and charts on your project dashboard. Tag a log with a liveId and watch the widget update live.


Your App → SDK (batches + gzip) → localhost:17655 → Gunsole Desktop

The SDK collects logs in your application, batches them (default: every 10 logs or 5 seconds), compresses the payload, and sends it to the Gunsole desktop app running on localhost. The desktop app stores everything in a local SQLite database and shows it in a fast, filterable log viewer.

No intermediary. No cloud service. Your logs go from your process to your screen.


import { createGunsoleClient } from "@gunsole/web";
type Tags = { route: string; method: string; status: string };
const gunsole = createGunsoleClient<Tags>({
projectId: "my-app",
mode: "desktop",
buckets: ["api", "auth", "payments"] as const,
});
// Type-safe bucket accessor — autocomplete + compile-time check
gunsole.api("POST /users → 201", {
context: { userId: "u_382", latency: 45 },
tags: { route: "/users", method: "POST", status: "201" },
});
// Typo? TypeScript catches it before you ship.
gunsole.paymets("..."); // ❌ compile error
gunsole.api("...", { tags: { rout: "/x" } }); // ❌ compile error

That log shows up in the desktop app immediately. Buckets, context, tags, and level — all parsed, filterable, and type-safe.

Read the full docs →