Qalam is an Electron app that runs an autonomous coding agent on your machine. It ships with a bundled LiteLLM proxy so a single install works with ~100 model providers (Anthropic, OpenAI, Google, xAI, DeepSeek, Groq, Mistral, OpenRouter, Ollama, LM Studio, vLLM, and the rest). Your code stays on your filesystem; your keys stay in your keychain.

The name (Arabic: قلم) means pen.

قلم تطبيق سطح مكتب يُشغّل وكيل برمجة ذكي على جهازك مباشرة، دون إرسال شيفرتك إلى خوادم خارجية. مبني على Electron، ويأتي مع وكيل LiteLLM مدمج يمنحك واجهة موحّدة لأكثر من 100 مزوّد نماذج: Anthropic وOpenAI وGoogle وxAI وDeepSeek وGroq وMistral وOpenRouter، إضافةً إلى محرّكات محلية مثل Ollama وLM Studio وvLLM.

ما الذي يميّز قلم؟

  • مفاتيحك الخاصة، تطبيق واحد. تختار المزوّد وتُلصق المفتاح، فيتواصل قلم مباشرة مع المزوّد دون وسيط.
  • يبقى الكود على جهازك. لا تتبّع، ولا تحليلات، ولا طبقة سحابية بينك وبين المزوّد.
  • أدوات حقيقية: تعديل الملفات، تنفيذ الأوامر، طرفية مدمجة، بحث على الويب، مهارات قابلة للتركيب، ووكلاء فرعيون.
  • ذاكرة المشروع: يقرأ AGENTS.md وCLAUDE.md تلقائياً ويبني خريطة للمستودع قبل أول استجابة.
  • جهد التفكير موحّد: none / low / medium / high يعمل على كل نموذج تفكير، ويترجمه LiteLLM إلى الشكل الذي يفهمه كل مزوّد.

التثبيت على macOS (سطر واحد):

curl -fsSL https://github.com/IsTrU/qalam/releases/latest/download/install.sh | bash

Install

macOS — one line

curl -fsSL https://github.com/IsTrU/qalam/releases/latest/download/install.sh | bash

Pulls the right DMG for Apple Silicon or Intel, copies the app into /Applications, and clears the quarantine attribute so the unsigned build opens cleanly. No sudo.

Manual

Pick the installer for your platform from the latest release:

Platform File
macOS (Apple Silicon) Qalam-*-arm64.dmg
macOS (Intel) Qalam-*.dmg
Windows Qalam.Setup.*.exe
Linux Qalam-*.AppImage

On macOS, after dragging to /Applications:

xattr -dr com.apple.quarantine /Applications/Qalam.app

First run

  1. Open the app. Settings → Provider.
  2. Click Add provider, pick e.g. Anthropic, paste your key.
  3. Choose a model from the catalog (anthropic/claude-sonnet-4-5, openai/gpt-5, google/gemini-2.5-pro, …).
  4. Start a session in any project folder.

Qalam reads AGENTS.md / CLAUDE.md / .qalam/SETUP.md at the project root for conventions, and builds a lightweight repo map so the agent doesn't have to grep blind on the first turn.

What you get

  • One app, ~100 providers. Anthropic, OpenAI, Google, xAI, DeepSeek, Groq, Mistral, OpenRouter, Together, Fireworks, Perplexity, Cohere, AWS Bedrock, Azure, Vertex, Ollama, LM Studio, vLLM, llama.cpp, and most things LiteLLM speaks.
  • Reasoning effort, normalized. none / low / medium / high works on every reasoning-capable model. LiteLLM translates to the upstream shape (OpenAI reasoning_effort, Anthropic thinking budgets, Gemini thinkingBudget).
  • Real tools, not toys. File read/edit/write, glob, grep, shell, PTY terminals, web fetch + search, MCP servers, sub-agents, hooks, custom slash commands, project memory, repo map, verify.
  • Skills out of the box. Workflow skills from obra/superpowers (brainstorming, TDD, debugging, code review) installed by default.
  • Prompt caching. Anthropic + OpenAI cache hints injected so the system prompt and tool definitions don't pay for themselves every turn.
  • Local-first. Keys in your keychain. No telemetry. No cloud auth layer between you and the provider.

Architecture

┌────────────┐   MessageChannel    ┌──────────────┐
│  Renderer  │ ◀──────────────────▶│ Main process │
│  (React)   │                     │              │
└────────────┘                     │  storage     │
                                   │  proxy mgmt  │
                                   └──────┬───────┘
                                          │ utilityProcess.fork
                                          ▼
                                   ┌──────────────┐
                                   │ Agent loop   │
                                   │ tools + MCP  │
                                   └──────┬───────┘
                                          │ HTTP
                                          ▼
                                   ┌──────────────┐
                                   │ LiteLLM proxy│  → any provider
                                   │ (bundled)    │
                                   └──────────────┘
  • Renderer — React 19 + Vite. contextIsolation: true, sandbox: true, strict CSP, no node integration. Talks to the agent over MessageChannelMain.
  • Main — windows, JSON + sqlite storage, safeStorage-encrypted secrets, terminal manager, LiteLLM lifecycle, plugin / skill registry.
  • Agent (utilityProcess.fork) — AI loop, MCP client, tool runtime. Isolated from both main and renderer.
  • LiteLLM — a portable Python runtime ships in resources/python, bound to localhost:4000, used purely to translate request shapes.

Cross-tier IPC types live in shared/protocol.ts and are validated at the boundary by zod schemas in electron/safety.ts.

Build from source

Requirements: Node 22+, ~500 MB free disk for the LiteLLM runtime.

npm install            # also installs portable Python + LiteLLM
npm run dev            # Electron + Vite + LiteLLM in dev mode
npm run typecheck      # strict TS
npm run test           # vitest
npm run package        # → dist/ (electron-builder)

Other scripts:

Command Purpose
npm run build compile main + preload + renderer to out/
npm run lint ESLint flat config
npm run test:watch vitest watch
npm run litellm:setup (re)download the portable Python runtime
npm run providers:sync regenerate the provider catalog from LiteLLM

Repo layout

electron/         # main + agent processes (Node, TypeScript)
  agent/          # AI loop, tool runtime, sub-agents
  litellmProxy.ts # bundled LiteLLM lifecycle
src/              # renderer (React 19, Vite)
  components/     # composer, transcript, settings, terminals…
  lib/            # store, i18n, providers, platform bridge
shared/           # wire-format types between renderer and agent
scripts/          # setup + maintenance + release scripts
resources/        # bundled runtime (LiteLLM Python)
test/             # vitest specs

Privacy

  • API keys live on your machine in your settings file, encrypted with Electron safeStorage (macOS Keychain, Linux libsecret, Windows DPAPI).
  • Requests go straight from the bundled proxy to the upstream provider. Nothing is routed through Qalam-controlled infrastructure.
  • No analytics. No crash reporting. The only network call we initiate on your behalf is electron-updater checking the GitHub releases feed for new versions.

Contributing

PRs welcome. See CONTRIBUTING.md for the dev setup and house style.

License

MIT — see LICENSE. Third-party attributions in NOTICE.md.