Skip to content

Developer tools · built by one person

Four tools that keep your data on your own machine.

FirLab is where sunerpy builds developer tools. Four so far: feed, search and statistics automation for private trackers, a deterministic code knowledge graph, a usage archive for coding agents, and voice input aimed at editors and terminals. All self-hosted — the index, the archive and the credentials stay on the host you run them on.

01

pt-tools

Feed, search and statistics automation for private trackers · Go

Takes over the repetitive parts of running an account on a private tracker: parsing RSS feeds and handing matching torrents to a downloader, searching across sites, collecting upload, download, ratio and bonus figures into one table, and cleaning up finished torrents by seed time or ratio. Torrents are paused when their free window closes, and H&R protection and a disk floor are hard constraints rather than suggestions. Everything is self-hosted — site cookies and statistics exist only on your own machine.

RSS
Feeds are polled and matching torrents pushed to a downloader. With no filter rule enabled it downloads free torrents only; keyword, wildcard and regex rules are what widen it beyond that.
Search
Search torrents across sites, then batch-download, batch-push to a downloader, or save the .torrent files locally.
Statistics
Upload, download, ratio, bonus points and level progress collected across every configured site, and renderable as a shareable data card image.
Downloaders
Multiple downloader instances, each with its own save directory and post-add start policy.
Cleanup
Torrents are removed by seed time, ratio or inactivity, subject to H&R protection and a minimum free-disk floor. Paused automatically when a free window ends; incomplete torrents can optionally be deleted at that point.
Remote control
A web management UI, plus two ChatOps channels verified end to end — QQ (OneBot / NapCat) and Telegram — with 13 built-in commands.
Deployment
A single Go 1.25+ binary under MIT. Docker images are published; Linux and Windows are supported.

Run it

# Docker

$ docker pull sunerpy/pt-tools

# or take a binary for your platform off the releases page

$ pt-tools --help
Actively released
Version
v0.46.0
Released
2026-08-10
02

CodeGraph

Deterministic code knowledge graph · CLI + MCP

tree-sitter parses a repository into a project-level index of symbols, calls and dependencies, then answers structural questions against it: who calls this, what does this reach, what does changing it touch. There is no model anywhere in the binary — no embeddings, no vectors, no LLM — so the same question returns the same bytes on every machine. That is what makes it safe to hand to an agent, and safe to diff in CI.

Languages
38 parsed — 29 with full symbol extraction, 6 through embedded and template markup, 3 at file level only.
Queries
Symbol search, callers, callees, dependencies, change-impact radius, and a whole-graph export ranked by PageRank centrality.
Interfaces
One index, three front doors: the CLI for you, MCP over stdio for a coding agent, MCP over HTTP on 127.0.0.1:8111 for an editor.
Storage
Per-project SQLite with FTS5, written to .codegraph/ inside the repository. SQLite is statically linked — no system library to install.
Platforms
Prebuilt for six targets: Linux x86_64 and aarch64 (musl, static), macOS x86_64 and Apple Silicon, Windows x86_64 and ARM64.

Install

# Linux and macOS

$ curl -fsSL https://raw.githubusercontent.com/sunerpy/codegraph-rust/main/scripts/install.sh | sh

# or from source — not published to crates.io

$ cargo install --git https://github.com/sunerpy/codegraph-rust codegraph-rs

# then, in any repository

$ codegraph init && codegraph index
Actively released
Version
v0.42.10
Released
2026-08-07
03

AgentLens

Usage archive for coding agents · desktop

A cross-platform desktop dashboard for the question "what have these agents actually been doing, and on which machines". It pulls usage records off the local host and off remote hosts over SSH into a single durable archive, then lets you slice it by timezone, agent, model or project. The care went into the parts that are easy to get quietly wrong: history that outlives its sources, remote access that only reads, and cost figures that admit when they are estimates.

Sources
OpenCode, Claude Code, Codex and Hermes usage records.
Hosts
This machine, plus remote hosts over SSH. Remote collection is read-only: a statically linked collector is pushed, its SHA-256 verified, and it removes itself on exit.
Archive
One local SQLite archive treated as authoritative history — not truncated when a source database rotates, a backup is deleted, or a remote host is cleaned up.
Analysis
Grouped by timezone, agent, model or project.
Cost
Records carrying an upstream amount, records with no price in the catalogue, and locally comparable estimates are kept apart. An unknown cost is marked missing, never rendered as zero.
Stack
Rust · Tauri 2 · React 18 · SQLite. Packaged for Linux, Windows and macOS.
Released · early
Version
v0.0.5
Released
2026-08-12
04

Voxera

Voice input for desktop and coding agents

Dictation aimed at the places developers actually type — an editor, a terminal, a prompt to a coding agent. Speech is captured on a global hotkey, transcribed locally or by an engine you configured yourself, and handed to the focused input or to a bridge bound to 127.0.0.1. It is not a voice assistant, not a meeting recorder, and not an input method: it does one thing, into whatever already has your cursor.

Capture
A global hotkey, anywhere in the desktop session.
Recognition
An offline local engine, or a cloud engine you configure yourself. Offline is a first-class path, not a fallback.
Delivery
Text lands in whatever input has focus, or goes to an agent bridge that listens only on 127.0.0.1.
Control
Custom replacement rules and hotwords. Local history is off unless you turn it on.
Stack
Rust · Tauri 2 · React 19.
In development

No public repository and no release yet. There is nothing to download; this entry is here so the shape of the work is on the record.

How these are built

  1. Local-first

    The index, the archive and the transcription all land on the machine you run them on. Remote access is read-only, and off by default.

  2. Deterministic first

    The same input returns the same bytes. No model takes part in a structural query, so the result can go into CI, be diffed, and be reused by an agent.

  3. No guessing

    An unknown cost is marked missing rather than rendered as zero; unfinished work is not written up, and is not given an invented version number.