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/* contains speechToText.ts and summarizer.ts; the actual move/rename logic lives in src/main/opencode/* and is triggered via IPC calls from the renderer.
  • Document creation – UI components such as renderer/pages/Execution.tsx call the OpenCodeAdapter (found in packages/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 by src/main/config.ts.

How It Is Wired

  1. Entry point – Electron boots via apps/desktop/src/main/index.ts.
  2. IPC bootstrap – src/main/ipc/handlers.ts registers handlers defined in src/main/ipc/handlers/*. Each handler validates input (validation.ts) and forwards to service or skill code.
  3. Skill dispatch – src/main/skills/SkillsManager.ts loads skill definitions from bundled-skills/ and routes UI requests (e.g., “run skill X”) to the appropriate adapter.
  4. Provider call – The adapter (OpenCodeAdapter.ts) imports the hub module packages/agent-core/src/common/types/provider.ts (the most‑connected hub, 15 dependents) and invokes the selected provider implementation.
  5. Result flow – Responses travel back over IPC to the renderer, where components like Execution.tsx update state and write logs via src/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.ts 691 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 install instead of npm 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 USER directive).
  • 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.