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. No bullshit.

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.


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: "local",
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 →