The Problem
Teams that rely on desktop AI assistants often have to trust cloud‑hosted services that keep files and prompts on external servers. When data residency, API‑key control, or offline operation matter, there is no ready‑to‑run, open‑source desktop agent that can orchestrate file moves, document generation, and browser automation while keeping every request on the local machine.
What This Does
Accomplish™ is a self‑contained Electron app that runs on macOS and Windows. The core runtime lives under apps/desktop/src/main/ (e.g. index.ts, ipc/handlers.ts) and exposes IPC endpoints to the renderer UI (src/renderer/). Skills are defined in src/main/skills/ and invoked from the UI components in src/renderer/components/.
- File management –
src/main/services/*containsspeechToText.tsandsummarizer.ts; the actual move/rename logic lives insrc/main/opencode/*and is triggered via IPC calls from the renderer. - Document creation – UI components such as
renderer/pages/Execution.tsxcall theOpenCodeAdapter(found inpackages/agent-core/src/internal/classes/OpenCodeAdapter.ts) which forwards prompts to the selected provider (OpenAI, Anthropic, Ollama, etc.) and returns generated text. - Provider flexibility – Provider modules are under
src/main/providers/(e.g.vertex.ts) and are selected by the settings UI (renderer/components/settings/shared/). API keys are read from the user‑supplied JSON config loaded bysrc/main/config.ts.
How It Is Wired
- Entry point – Electron boots via
apps/desktop/src/main/index.ts. - IPC bootstrap –
src/main/ipc/handlers.tsregisters handlers defined insrc/main/ipc/handlers/*. Each handler validates input (validation.ts) and forwards to service or skill code. - Skill dispatch –
src/main/skills/SkillsManager.tsloads skill definitions frombundled-skills/and routes UI requests (e.g., “run skill X”) to the appropriate adapter. - Provider call – The adapter (
OpenCodeAdapter.ts) imports the hub modulepackages/agent-core/src/common/types/provider.ts(the most‑connected hub, 15 dependents) and invokes the selected provider implementation. - Result flow – Responses travel back over IPC to the renderer, where components like
Execution.tsxupdate state and write logs viasrc/main/logging/*.
The import graph shows 354 internal modules with 0 circular dependencies. The most‑connected hub (provider.ts) has a low instability score (0.06) but a high blast radius; any change there ripples to 15 downstream modules.
How To Use It
# Clone the repo
git clone https://github.com/moses-y/accomplish
cd accomplish
# Install dependencies with pnpm (lockfile present)
pnpm install --frozen-lockfile
# Build the Electron app (script defined in apps/desktop/package.json)
pnpm --filter ./apps/desktop run build # or `pnpm run dev` for hot reload
# Run the built binary (macOS example)
./apps/desktop/dist/Accomplish.app/Contents/MacOS/Accomplish
Configuration – API keys are expected in a JSON file loaded by src/main/config.ts. The repo ships a placeholder apps/desktop/e2e/provider-tests/secrets.example.json; replace it with real credentials before first run. No .env template is provided, so developers must create the config manually.
Real‑World Use
A marketing team can drop a folder of raw copy into a watched directory. Accomplish detects new files via the FileWatcher (wired through src/main/opencode/auth-browser.ts), triggers the “Document Writing” skill, and writes polished drafts back to the folder—all without any network request leaving the workstation.
Code Health & Issues
Measured findings (static analysis)
- High – Deep nesting (8 files, e.g.,
renderer/pages/Execution.tsx): indentation depth 8, hard to follow. - High – Oversized files (9 files, e.g.,
OpenCodeAdapter.ts691 lines). - High – Duplicated code blocks (repeated 6‑line snippets across 110 files).
- Medium – Hub module (3 files under
common/types/provider*): 15 dependents, high churn risk. - Medium – High branching density (10 files, e.g.,
waiting-detection.ts): >18 branches in <50 lines.
Code‑health audit (GitHub Actions & Docker)
- High – Pin third‑party actions to commit SHA (
.github/workflows/*). - High – CI never runs tests (4 workflows lack a test step).
- Medium – Least‑privilege GITHUB_TOKEN missing in
ci.yml. - Medium – Use lockfile in CI (
npm installinstead ofnpm ci). - Medium – Pin Docker base image by digest (
apps/desktop/e2e/docker/Dockerfile). - Medium – No dependency vulnerability scan in CI.
- Medium – Checkout persists token; should set
persist-credentials: false. - Medium – Run container as non‑root (no
USERdirective). - Medium – Postinstall script executes untrusted code; consider disabling scripts in CI.
- Low – No job timeout on
pr-preview-release.yml.
Other hygiene – Tests exist (71 files) but are not invoked by CI; a secret‑shaped example file is committed; licence (MIT) present; lockfile (pnpm-lock.yaml) present.
The Bottom Line
Accomplish delivers a functional, locally‑run AI desktop agent with a clear separation between UI, IPC, and provider adapters. The codebase is sizeable and suffers from deep nesting, oversized modules, and duplicated logic, which will increase maintenance cost. CI gaps and Docker hardening issues should be addressed before production use. It is suitable for teams that need full data control and are prepared to invest in refactoring and CI hardening.