gunsole
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.
How it works
Section titled “How it works”Your App → SDK (batches + gzip) → localhost:17655 → Gunsole DesktopThe 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.
Quick taste
Section titled “Quick taste”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 checkgunsole.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 errorgunsole.api("...", { tags: { rout: "/x" } }); // ❌ compile errorThat log shows up in the desktop app immediately. Buckets, context, tags, and level — all parsed, filterable, and type-safe.