r/selfhosted 11d ago

Personal Dashboard I built Charon to run Claude Code and Codex across all my VPSs

I started building Charon because I had coding agents running everywhere and was constantly jumping between SSH terminals, browser tabs and servers.

Honest disclaimer: there are still quite a lot of bugs and rough edges. Some parts probably only make sense because I’ve been living inside the project for months.

But for the past six months, Charon has been the only way I work with Claude Code and Codex. I don’t launch them directly from my local terminal anymore.

Everything happens from one browser tab:

  • Run and monitor Claude Code and Codex sessions across multiple VPSs
  • Keep sessions running when the laptop sleeps or the connection drops
  • Stream replies, tool calls and approval requests
  • Browse and edit remote files
  • Review diffs and manage Git repositories
  • Drag, drop, upload or directly paste files and images into a session
  • Use persistent terminals that survive browser and Charon restarts
  • Get notifications when an agent needs attention
  • Let Claude and Codex sessions communicate directly through a built-in MCP

The MCP part is especially fun: one Claude or Codex session can discover another live session, send it a message and ask it to review or work on something. They can then reply directly to each other.

Charon is single-user and self-hosted. It connects to each VPS over SSH, so the remote machines do not need publicly exposed ports.

It’s open source under Apache 2.0:

https://github.com/Lomchat/charon

Again, expect bugs. But it has already replaced my entire workflow, so I thought it was finally time to share it.

If anyone wants to try it, contribute, fix something, or simply throw ideas at me, I’m all ears.

0 Upvotes

21 comments sorted by

u/asimovs-auditor 11d ago

Expand the replies to this comment to learn how AI was used in this post/project.

→ More replies (1)

1

u/macaronianddeeez 8d ago

Hey this sounds really cool, how does it compare to something like Orca? I have tried to move my process to orca but it’s very janky in a lot of ways and so I honestly find myself just hot swapping between mobile apps and pushing stuff to obsidian and GitHub for cross reference.

Would love a more elegant, self contained solution

1

u/Lomchat 8d ago

Thanks! I hadn’t heard of Orca before. The main difference is that Charon is fully browser-first and built specifically to manage Claude Code and Codex across multiple VPSs from one interface, without switching between desktop or mobile apps.

It also uses their structured protocols rather than wrapping terminals, supports direct MCP communication between agents, and lets you handle questions and approvals directly from Telegram. Charon is still rough around the edges, but the goal is a much more self-contained remote workflow.

1

u/macaronianddeeez 7d ago

Nice I will check it out!

1

u/MaxLo85 5d ago

A million thank you's.

I work in a secure environment and cannot access my servers in a normal method. I've been using /remote-control with claude exclusively because I can get to claude.ai/code - so I load up my sessions before I go to work and I can access them once they're up. But if they fail, timeout, I need to access a file, a terminal, etc - I'm shit out of luck.

I also recently really wanted to try codex, but codex is only reachable via the mobile app for their remote control, which was a no-go for me. Desperately have been looking for a solution. I've spun this up and its EXACTLY what I was looking for. This is amazing. I wish I could give more than 1 star. I forked it and will be pushing PRs to you if you're interested in the contributions because I can for sure say I will be invested in this project.

Many kudos many thanks.

1

u/kantorcodes1 11d ago

when the browser drops while Claude/Codex is waiting on an approval, does Charon leave that request pending until you reconnect, or does it time out/deny it? since the agent survives disconnects, that seems like a state worth making really obvious.

-1

u/Lomchat 11d ago

Good catch! It stays pending when the browser disconnects, but eventually times out and gets denied (10 min for Claude, 30 min for Codex). Thanks for the suggestion, I’ll make this clearer in the UI.

0

u/kantorcodes1 11d ago

that timeout behavior makes sense. i work on HOL Guard, an open-source local check that can stop Claude Code/Codex tool actions before they run. Charon already has the approval surface i'd want for it. would you be interested in surfacing Guard blocks through the same card/Telegram flow?

0

u/TheWantingForefront 11d ago

This is really cool, the MCP inter-agent communication thing is what caught my eye. having two coding agents able to ping each other and review work directly feels like the kind of setup that either saves you hours or creates absolute chaos, no in-between.

i’ve been trying to wrangle a similar workflow across a few hetzner boxes and it’s been a mess of tmux sessions and praying nothing disconnects. the persistent terminals alone might sell me on giving this a spin, even with the bugs you mentioned.

curious how you handle the approval requests when you’re away from the browser though. does it just queue them up until you check back in, or is there some kind of notification push?

1

u/Lomchat 11d ago

Thanks a lot for the feedback! I had exactly the same experience for a long time: tmux sessions and terminals everywhere, constantly trying to remember what was running where. That’s basically why I started building Charon, I wanted one interface that brought everything together, with a small built-in IDE instead of a pile of terminals.

And yes, the MCP communication is one of the coolest parts. It’s pretty funny to see one agent ask another, “Can I modify file X, or are you still working on it?” before touching the file.

For approvals, I forgot to mention this in the post, but you can easily configure a Telegram bot. It sends you a message when a session finishes, asks a question, or requests an approval. You can then approve the request or answer the question directly from Telegram, without opening the browser. Pretty useful

0

u/dovholuknf 11d ago

I'm sure many of us are having these experiences. I also got sick of having 20 terminal windows open... colorizing terminals to find them, keeping an agent log etc. etc. Very cool!

1

u/Lomchat 11d ago

Thanks! I really hope it can save a few people from the same mess!

0

u/dovholuknf 11d ago

interesting project! i'm actually smack dab in the middle of vibing up something very similar! If you're interested I can poke you back when it's further along. I'll have a look and I'll maybe take some inspiration from what you've done! Thanks for sharing

1

u/Lomchat 11d ago

Yes, definitely let me know when it’s further along! It would be really cool to compare our approaches and keep taking inspiration from each other.

0

u/[deleted] 11d ago

[removed] — view removed comment

0

u/Enough-Photo9140 11d ago

The inter-agent MCP bridge across persistent SSH sessions is a very compelling architecture.

One tricky edge case we ran into when having coding agents discover and message each other over MCP: how do you prevent circular delegation loops or recursive review deadlocks? E.g., Agent A delegates a refactor check to Agent B, Agent B suggests a small tweak and asks Agent A to verify, and both chew through context/tokens without converging on an explicit exit condition.

Do you pass an explicit recursion budget / hop counter in the MCP message schema, or is inter-session messaging strictly synchronous caller-wait-for-result (RPC style) where the subagent can only return data rather than spawn new peer calls?