Run it wherever you choose
Self-hosted, cloud-hosted, or air-gapped, with model routing built into the provider abstraction from day one — pick your infrastructure and provider, not the vendor's.
EU-sovereign · self-hostable
The AI coding agent that answers to you.
Skills, hooks, a plugin marketplace, full agentic power — running on infrastructure you choose, audit, and control.
Why now
Self-hosted, cloud-hosted, or air-gapped, with model routing built into the provider abstraction from day one — pick your infrastructure and provider, not the vendor's.
Packaged, reusable instruction sets and lifecycle hooks around every tool call.
Discover, cache, and install community plugins straight from the CLI or the TUI — extend the agent without forking anyone's config.
A residency policy that blocks disallowed model providers before any request is made, and an egress log of where every call went — config a procurement officer can actually review, not a vendor's word that your data stays put.
Cool tools
The residency policy is checked when a model is resolved, before any connection, so no surface can reach a blocked provider. Every outbound call is logged by destination host, never by content.
Subagents keep working while you do. /tasks lists each one with its agent, model, status and elapsed time; Enter opens it and ctrl+d cancels it.
Give each subagent its own model, let it inherit the main one, or let the main agent pick per task from a list you allow. Every choice is checked against the residency policy before the subagent starts.
A SKILL.md can declare allowed-tools, in Claude Code's format, enforced through the permission system until the turn ends. Hook scripts receive LUNOS_AGENT and LUNOS_SKILL, so they know who is calling.
One mode runs the whole cycle: discover, architect, plan, build and verify, with a human approval gate between phases. Plans and records land as Markdown in your repo, and /artifacts finds and opens them.
Every install previews what it will run and which config file it writes, then asks. Entries carrying config substitution tokens like {file:…} are refused, so a manifest can't make your config read a local file.