Build once. Launch everywhere.
Kunkun is an open-source app launcher — and a portable platform: a command palette, a tool-using AI, local knowledge search, and an extension ecosystem where Raycast extensions compatibility out of the box.
- Clipboard HistoryBrowse & paste anything you copiedCommand
- Translate SelectionDeepL · selected textExtension
- Color PickerPick a pixel · copy hex/rgbExtension
- Kill ProcessSearch by name · CPU / memoryCommand
- Search FilesNative SQLite metadata indexCommand
One app: a launcher, a tool-using AI, local knowledge search, and an extension store.
See it in action
A quick tour of Kunkun — the launcher, extensions, and the store.
Not an Electron app — a portable core with an Electron shell
The same business logic, database, plugin runtime, and AI agent run unchanged across hosts. Electron is just today's desktop shell — the CLI, a headless server, and the browser console drive the very same core.
Every extension declares what it can touch
Permissions are scoped in the manifest and enforced host-side across seven layers. On Deno, a network grant compiles to --allow-net=domain — process-level, not a promise. Users grant extra access at runtime.
{ "kunkun": { "identifier": "com.you.git-repos", "permissions": [ "clipboard-read", { "permission": "fs-read", "allow": ["$EXTENSION_SUPPORT/**"] }, { "permission": "network", "domains": ["*.github.com"] }, { "permission": "shell", "commands": [{ "program": "git" }] } ] }}“Git Repos” wants file access
Requested at runtime · you decide
fs-read$HOME/Documents/**Reason: “Import the files you selected.”
Enforced host-side · revocable anytime in Settings.
Extensions that call each other — safely
An extension can expose typed service methods. Other extensions call them through the service broker, the AI agent picks them up as tools, and external MCP clients like Claude Desktop can mount them — every call permission-checked.
ffmpeg.compress()plugin__ffmpeg__*HTTP · bearer tokencompress()convert()transcript()metadata()A low-permission extension can't escalate by calling a powerful service — the broker intersects the caller's and provider's grants on every dispatch.
A real composed workflow: YouTube Podcast
com.kunkun.youtube-podcast-generatoryoutube.transcript()preset: "flash" | "power"voice:synthesizemedia.generateSpeech()One extension, four capabilities it never had to build — each behind its own declared permission. Trigger it from the launcher, or from the button Kunkun injects right on the youtube.com player.
A local AI that actually does things
The agent doesn't just chat — it calls real tools: your files and shell, any MCP server, installed plugin services, and even other coding agents over ACP. Every plugin service is automatically an agent tool. Bring your own keys and compare models side by side.
- Tool-using agent. File, shell, network + MCP + plugin + ACP tools in one loop
- Two-way MCP. Connect to MCP servers — or expose your toolset to Claude, Cursor & Zed
- Runs anywhere. Same agent loop over HTTP/SSE, or as a Telegram bot
mcp__{server}__*plugin__{id}__*Six ways to build an extension
Every command declares one runtime mode — from a fully custom UI window down to a headless background service — so you pick the minimum sandbox you need. It's just an npm package with a kunkun manifest, the SDK is Raycast-compatible, and existing Raycast extensions install straight from the store.
custom-viewCustom View
Isolated window
A static SPA you fully control — any framework, full DOM.
worker-viewWorker View
Web Worker
React written with SDK primitives, rendered as native components — Raycast-style.
node-viewNode View
Node / Bun / Deno
Same UI model, plus real Node: fs, child_process, native addons.
worker-headlessWorker Headless
Web Worker · no UI
Background logic in the browser sandbox — react to events, exit.
node-headlessNode Headless
Node process · no UI
Cron-style sync jobs with full fs / shell / network access.
services[]Service
Typed · schema-validated
Methods other extensions — and the AI agent — can call through the broker.
One codebase → npx CLI · Web app · Kunkun plugin
A transport-free core plus thin adapters ship the same engine three ways. Real submodules — kkterminal and space-lens — prove it.
Your first command in minutes
Every extension is an npm package with a kunkun manifest. Pick a command mode, write a component, build, and load — no host boilerplate.
- 1Add the SDK to any npm package.
- 2Export a component using @kunkunsh/sdk/ui primitives.
- 3Bundle to a self-contained dist/ with the Bun build plugin.
- 4Load it in Settings → Developer, or publish to the store.
import { useState } from "react";import { Button, Div, H2, P } from "@kunkunsh/sdk/ui";import { Clipboard, showToast, Toast } from "@kunkunsh/sdk";export default function App() { const [text, setText] = useState(""); return ( <Div className="p-6"> <H2>My Extension</H2> <Button title="Read Clipboard" variant="primary" onClick={async () => { const t = await Clipboard.readText(); setText(t); await showToast({ title: t, style: Toast.Style.Success }); }} /> {text && <P>{text}</P>} </Div> );}A batteries-included platform
A portable core, a typed SDK, and a permission model users can actually trust — with the plumbing real extensions need.
Record storage
A real per-extension SQLite store — queries, FTS5 search, cursor pagination, and live-updating UI. Not a KV junk drawer.
Services & backends
Expose typed, contract-first services between extensions, and spawn persistent Node/Bun/Deno backends over kkrpc.
Extension store
Extensions are ordinary npm packages — browse, install, and update straight from the registry. Plus the entire Raycast store catalog.
MCP bridge — both ways
Connect Kunkun to any MCP server, or expose your permission-gated toolset to Claude Desktop, Cursor, and Zed.
Local API server
A bearer-token HTTP API lets scripts and coding agents drive Kunkun — the same routes back the desktop and headless hosts.
Real OS-level sandbox
Deno-first spawning turns manifest scopes into process flags, so a plugin literally cannot reach a domain it was not granted.
Let your AI agent build it
Install the Kunkun skill into Claude Code, Cursor, or any coding agent. It walks your assistant through choosing an extension type, scaffolding the project, and wiring the manifest — reading these docs on demand via llms.txt.
Install the skill
npx skills install kunkunsh/kunkun…or paste this into any agent
Build a Kunkun extension by following the guide athttps://docs.kunkun.sh/instruction.mdReady to build your first extension?
Start with a five-minute quickstart, or explore the architecture that makes Kunkun portable across desktop and server hosts.
Prefer to ask? Hit the Ask AI button — it searches the whole documentation.