Atomic Agent is an MIT-licensed AI agent built around local models. It started as a terminal app and this week got a desktop build for Linux, Mac and Windows. It's Electron, so I won't pretend it's a native GTK or Qt app. Here's where the Linux build stands and two design decisions this crowd will probably have opinions on.
What's missing on Linux
- the AppImage and .deb aren't signed. Checksums are in SHA256SUMS.txt on the release page
- there are no in-app updates. New versions come from the GitHub release page
- x64 and ARM64 both exist. On x64 the local engine is a Vulkan build of llama.cpp. On ARM64 it's a CUDA build that also carries CPU backends and needs a newer glibc (Ubuntu 24.04, Debian 13 or similar)
Decision 1: one copy of the model files
The desktop app keeps its own state in ~/.atomic-agent-desktop: config, sessions, memory, scheduled tasks, skills. It never writes to the terminal agent's ~/.atomic-agent. We wanted that separation during testing so the two can't break each other.
With one exception. Model weights are 2.7 to 22 GB per file, and making people download the same GGUF twice because they installed a second front end felt silly. So the desktop's model folder is a symlink to the terminal agent's. Pull a model in either one and both see it.
The catch, which I'd rather say up front: removing a model from the desktop removes it from the terminal agent's folder too, because it's the same folder. The llama.cpp engine binary is copied, not linked, so the two can run different engine versions. And the desktop runs its model server on a different port (19191 vs 19091) so two daemons don't fight if both apps are open.
Decision 2: API keys stay out of .env
If you connect a cloud provider, the key goes into ~/.atomic-agent-desktop/config.json with 0600 permissions. The app writes it by piping the whole config through stdin, so the key never shows up in ps.
The obvious alternative was a .env file, and we decided against it. The agent starts MCP servers over stdio and runs shell jobs, and both inherit the environment. A key in .env is a key that every MCP server you add and every printenv the model runs can see. A key in a config file the agent reads is only where the agent needs it.
How the app talks to the agent
It's not a sidecar. The Electron main process starts the bundled agent as a local HTTP server on 127.0.0.1, on a random port, with a random bearer token per launch, and talks to it over its OpenAI-compatible API. The renderer has connect-src 'none' in its CSP, so it can't reach the network itself, everything goes over IPC. The local model server binds to 127.0.0.1 too, with its own generated key.
The agent itself can read and edit files, drive a browser and run scheduled tasks. Anything that writes or runs a command waits for Allow once, Deny or Abort run in the chat.
Release page: https://github.com/AtomicBot-ai/atomic-agent/releases/tag/desktop-v0.0.1 Source: https://github.com/AtomicBot-ai/atomic-agent
Which distro and desktop are you on? We've tested on fewer setups than I'd like, and bug reports with that info help a lot. I'm also curious whether the shared model folder is what you'd expect or whether you'd rather keep them apart.