A desktop GUI for Claude Code, built on a codebase I did not write
opcode-lucho is a desktop application (Tauri 2 + Rust on the backend, React 18 + TypeScript on the
frontend) that gives Claude Code a graphical interface: project and session management, custom agents,
MCP servers, checkpoints, and a token-usage dashboard. It is not an original product of mine or a web
service, and it is not affiliated with Anthropic.
It is a fork of winfunc/opcode, licensed under AGPL-3.0. GitHub
does not mark it as a technical fork because the repository is independent and imported the upstream
history, so the only way to make that known is for me to say it: of the repository’s 522 commits,
321 are mine (250 excluding merges, across ten days of work from July 2 to July 11, 2026). The rest—
the app concept, Tauri scaffolding, Claude Code agents, MCP, checkpoints, and many components—came from
upstream. Cargo.toml still credits the original authors; I did not touch that line.

What I inherited, exactly as it was
The fork starts at commit 70c16d8 (October 13, 2025, the last upstream commit before my first one).
The README says it directly in an [!IMPORTANT] notice:
“This is a fork.
opcode-luchois a personal fork ofwinfunc/opcode(originally by Asterisk), licensed under AGPL-3.0… do not report issues about this fork upstream.”
I inherited the app’s entire concept and scaffolding: Tauri 2 + React, Claude Code agents, MCP,
checkpoints, the web server (web_server.rs), and most of src/components/. I also inherited the
AGPL-3.0 license and credits for the highest-volume upstream authors (Vivek R, Mufeed VH, Kiran Johns),
which I left untouched in Cargo.toml.
What I did not inherit was any of the how it is maintained: no green CI, no internal documentation, and no navigation model I knew from memory. That is what follows.
Navigation and project detail, from scratch
Sidebar and navigation
LeftSidebar.tsx, a new 1,067+ line file: a per-project tab strip, a custom Windows-style title bar, and a Home view that did not exist.
Project detail
ProjectDetail.tsx (new, +502), ProjectFileTree.tsx, SessionAside.tsx, and SessionPickerDialog.tsx: the missing view for entering a project and navigating its sessions without getting lost.
CLAUDE.md templates and backups
claude_templates.rs, claude_backups.rs, and claude_fs.rs on the backend, plus ClaudeTemplatesView.tsx (+394) on the frontend.
Application settings
app_settings.rs + ApplicationSettings.tsx, both new, with settings wired to real app behavior rather than a decorative form.
None of this existed upstream. Every piece entered through its own PR—72 in total, with all work
reviewed before it merged into master.
16 documents that made unfamiliar code changeable
Before rewriting a view, I had to understand how the existing one worked, and upstream did not include
that documentation. I ended up writing docs/views/: 16 English documents, one per view, written
after building each corresponding feature—not as plans, but as the maps that would have saved me time
had they existed earlier.
navigation-model.md is the one I use most. It describes how the sidebar, tab manager, and title bar
relate, exactly the area rebuilt above. Documenting an unfamiliar codebase became as much a part of the
work as writing new code.
Rewriting the metrics backend, not only the view
The token-usage dashboard came from upstream, but I ended up rewriting it end to end, and it is the
piece where I invested the most time. src-tauri/src/commands/usage.rs (+1,383 / −329 lines) is the most
modified file in the entire repository—more than any navigation file. On the frontend, there is a whole
new src/components/usage-detail/ directory (17 files), plus dashboard/DashboardBento.tsx and
aggregation logic extracted to lib/usageAggregation.ts (+349).

The screenshot shows the result, not the starting point. Upstream had a usage view with disconnected metrics. I rewrote both how they are calculated (the Rust backend, where most of the diff landed) and how they are read: an eleven-metric bento at a glance, a model filter panel, and a temporal chart that crosses cost, tokens, and sessions with three representations—bars, candles, and line—instead of one fixed chart.
Upstream describes the improvement as “much faster loading on large histories.” I do not have a measured
before-and-after for that claim, so I will not invent a number. It does match why I touched the backend
in the first place: the original usage view did not handle a large session history well, and rewriting
usage.rs answered that problem rather than a design whim.
Separating aggregation into a pure module (usageAggregation.ts) instead of mixing it into components
was deliberate. It is the same criterion applied to the other twelve new modules under src/lib/:
derived frontend logic lives apart from the view consuming it.
Inheriting code also means inheriting its infrastructure
The inherited CI had never been green
The pr-check.yml workflow failed on EVERY PR for two stacked causes, neither related to the code. First, it never installed Tauri's system dependencies on ubuntu-latest ("Package glib-2.0 was not found"), although the correct list already existed in another workflow. After fixing that, it still failed because bun run check executes tsc and cargo check, and cargo check needs dist/index.html (through include_str! in web_server.rs)—something tsc never produces because it only type-checks. The frontend had to be built before cargo check. Today pr-check passes in 7m51s.
Why there are no distributable binaries
There is a v0.3.1 tag on master, the fork's first release, but no published GitHub Release. The macOS workflow requires seven signing and notarization secrets from the original project's Apple Developer account, which are not inherited by a fork. Without them and without a signature, macOS Gatekeeper blocks the app. This is an external constraint, not a technical omission.
I also protected master and dev with no-bypass rulesets, including for me as admin. They require a PR
and a green bun run check, and block force pushes. One fact I learned along the way: protection
rulesets do not exist on GitHub Free for private repositories. The order was forced into public
first, protection second, and that is what I did.
The project is closed as a version, not distributed. Anything from here will be targeted fixes, not a return to this pace of work.
