Web and desktop harness for OpenCode — a project sidebar, usage dashboard, runs, workflows, artifacts and routines, with a polished composer.
- How it relates to OpenCode
- Highlights
- Status
- Repository layout
- Install
- Development
- Web app
- Documentation
- License
🌐 Website: flupcode.com · 🖥️ Web app: app.flupcode.com · 💻 Source: rldona/FlupCode · ⬇️ Download
FlupCode is built on OpenCode: it takes its terminal-grade feature set and packages it into a first-class web and desktop experience: a harness layout with a project sidebar, usage dashboard, runs, workflows, artifacts, routines and a polished composer — modelled on the Anthropic Claude Code desktop app.
Runs on OpenCode 2, with nothing to install for it. The desktop app and the
flupcodecommand fetch the pinned OpenCode 2 engine once, check it against its published integrity, and start it. The web app connects to one of them: the desktop app while it is open, orflupcode serve. See docs/OPENCODE-2.md.
Not affiliated with OpenCode or Anthropic. FlupCode is an independent project. "OpenCode" is the project by Anomaly, and "Claude Code" is a product of Anthropic. FlupCode is not built by, endorsed by, or affiliated with either of them.
OpenCode is already a client/server system: opencode serve exposes an HTTP + SSE API and every
front-end (terminal TUI, web app, desktop app, IDE plugins) is just a client. FlupCode runs the
official OpenCode 2 engine as it ships, and focuses entirely on the experience layer — the
shell, the design system and the harness features that OpenCode's default UI does not emphasise.
This repository started as a fork of OpenCode and no longer carries its source (ADR-0027).
- The official engine. FlupCode runs the official OpenCode 2 binary at a pinned version and extends it through plugins, never through patches (ADR-0027).
- Only FlupCode's code. The repository holds the web app, the desktop app, the harness server,
the CLI and the relay; the engine is reached through the generated
@opencode/client. - Upstream by version. A weekly pull request moves the pin to the newest OpenCode 2 release once it is three days old, and the engine suite and the live e2e judge it. See docs/UPSTREAM.md.
- Full TUI parity. Feature-for-feature mapping of the terminal UI to the web UI is tracked in docs/PARITY.md.
- Harness features. Usage dashboard, activity heatmap, multi-project workspaces, pinned items, artifacts and routines — see docs/ROADMAP.md.
- Runs that outlive the window. A harness server of its own keeps runs, tasks, routines and
artifacts: workflows written down as editable files and launched with
/feature …, checks the harness runs itself with the evidence kept, bounded retries when one fails, and human gates that hold a run until you let it through — see docs/USAGE.md. - Remote control. Drive your computer's sessions from your phone on any network, like Claude
Code's remote control: pair with a QR code, follow and start sessions, answer permission requests.
Traffic is end-to-end encrypted through a relay that cannot read it. Host it from the desktop app
or from a terminal with
flupcode remote— see docs/USAGE.md and ADR-0010.
v1.15.0. The web harness (Claude Code–style shell, TUI parity, dashboard, i18n), the Electron
desktop app and remote control (relay at relay.flupcode.com, phone view, flupcode remote) are
released, along with the harness server that owns runs: tasks, routines with history, verification
with evidence, workflows with human gates, and artifacts — now including the documents the agent
generates (kept in .flupcode/artifacts with the artifact_write tool, listed under Artifacts and
read by type: markdown, HTML, image, PDF). Editors for routines, agents and skills open in dialogs,
and Compare runs inside the chat layout. The release pipeline and the weekly engine bump are in place.
Desktop builds are not yet signed by Apple or Microsoft (see Install). See
docs/ROADMAP.md for the live status.
packages/harness # FlupCode web app (SolidJS + Vite) — our product code
packages/harness-desktop # Electron desktop app (also hosts remote control)
packages/remote # remote control protocol and host (shared by desktop, CLI, web)
packages/relay # remote control relay server (Bun, deployed on Fly.io)
packages/flupcode-cli # the `flupcode` command (`remote`, `serve`, `engine`)
packages/harness-server # loopback server: runs, routines, artifacts, the adaptive layer
packages/engine-contract # tests against the pinned OpenCode 2 binary
packages/landing # flupcode.com static site
docs/ # project documentation
Download the desktop app and the flupcode CLI from the
latest release:
| Platform | Desktop app | CLI |
|---|---|---|
| macOS (Apple Silicon) | FlupCode-mac-arm64.dmg |
flupcode-darwin-arm64 |
| macOS (Intel) | FlupCode-mac-x64.dmg |
flupcode-darwin-x64 |
| Windows | FlupCode-win-x64.exe |
flupcode-windows-x64.exe |
| Linux | FlupCode-linux-x64.AppImage, FlupCode-linux-x64.deb, FlupCode-linux-x64.rpm |
flupcode-linux-x64, flupcode-linux-arm64 |
The builds are not signed yet, so macOS shows "FlupCode Not Opened" / "No se ha abierto
FlupCode" and Windows shows SmartScreen. On macOS, click Done, then open System Settings →
Privacy & Security and click Open Anyway — or run
xattr -dr com.apple.quarantine /Applications/FlupCode.app. Details in
docs/USAGE.md.
Requirements: Bun 1.3+.
bun install
bun run dev:harness # the web app at http://localhost:4444
bun run dev:harness-desktop # the desktop appCorporate registry note. If your global
~/.npmrcpoints at a private registry, force the public registry for installs:npm_config_registry="https://registry.npmjs.org/" bun install --frozen-lockfile
Use the hosted UI at app.flupcode.com. It connects to OpenCode 2 on your
machine at http://localhost:4096, which either of these provides:
-
The desktop app, while it is open. It serves the web app too, with the same engine and sessions.
-
flupcode serve, without the desktop. It starts the pinned OpenCode 2 and leaves it running:flupcode serve # until Ctrl-C flupcode serve --install # at every login (macOS launchd, Linux systemd); --uninstall removes it
OpenCode 2 always asks for a password, and a web page cannot send one. So both sign in for the page,
and only for FlupCode's own pages: app.flupcode.com and localhost:4444, plus any you add with
FLUPCODE_WEB_ORIGINS. Every other page open in your browser is refused. Change the address in
Settings → Server if you use another port.
Controlling a computer from your phone needs none of this. The computer runs the desktop app (or
flupcode remote) and the phone pairs once; see docs/USAGE.md.
OpenCode 1.x is no longer supported. Your 1.x history can be imported; see docs/OPENCODE-2.md.
| Document | Purpose |
|---|---|
| docs/GETTING-STARTED.md | First run: the desktop app, the web app with flupcode serve, and fixing a blocked connection |
| docs/OPENCODE-2.md | FlupCode on OpenCode 2: what changed, importing 1.x history, staying on 1.x for now |
| docs/ARCHITECTURE.md | How the monorepo fits together and where FlupCode lives |
| docs/USAGE.md | Install, run, keyboard shortcuts and troubleshooting |
| docs/UPSTREAM.md | Following OpenCode: the pinned engine version |
| docs/DESIGN.md | Design system and the Claude Code–style harness direction |
| docs/PARITY.md | TUI ↔ Web feature parity matrix |
| docs/ROADMAP.md | Prioritised, ticket-based roadmap |
| docs/COMMUNITY-FEATURES.md | Community-requested OpenCode features prioritised for FlupCode |
| docs/RELEASE.md | Versioning and release process |
| docs/CONTRIBUTING.md | Language, conventions, workflow |
| docs/adr/ | Architecture Decision Records |
| docs/tickets/ | Per-phase ticket breakdowns |
MIT, inherited from OpenCode. See LICENSE. Upstream copyright and attribution are preserved.

