Turning a Spare Mini PC into an Always-On Claude Code Machine (Remote Control + tmux + cron)
Hi, I'm Shu. I'm building Memotori, an on-device transcription and summary app, for both Mac and Windows. Almost all of the code is written by AI (Claude). To make it easier to hand that work off at any time, I installe
Hi, I'm Shu. I'm building Memotori, an on-device transcription and summary app, for both Mac and Windows. Almost all of the code is written by AI (Claude).
To make it easier to hand that work off at any time, I installed Ubuntu on a spare mini PC (ASUS VC65) and turned it into a dedicated, always-on Claude Code machine.
Now I can start Claude Code sessions against the Memotori folder on that box from the Claude mobile app or from a browser (claude.ai/code), at any time. I can ask it to fix a bug while I'm out and review the diff when I get home.
The key feature is Claude Code's Remote Control, which is available on the Pro and Max plans too.
This post walks through:
- Installing Claude Code and logging in
- Starting Remote Control (and choosing a spawn mode)
- Keeping it running with tmux
- Starting it automatically at boot with cron
Setup
- Machine: ASUS VC65 mini PC
- OS: Ubuntu Desktop
- Claude Code (CLI)
- tmux
- cron (
@reboot)
Remote Control vs. similar options
| Option | What it does | Plans |
|---|---|---|
| Remote Control | Drive Claude Code sessions running on your own machine from your phone or the web | Includes Pro / Max |
| Claude desktop app | Lets claude.ai chats reach your PC's folders and screen (Windows / Mac) | All plans |
| Self-hosted runner | Registers your own servers as the execution target for an organization's cloud sessions | Team / Enterprise |
For a personal always-on box, Remote Control is the simplest choice.
The CLI and the desktop app are not interchangeable:
- CLI (Remote Control): remote shell, file, and coding work. Runs headless.
- Desktop app: connects claude.ai chats to your PC, including computer use (seeing and operating the screen).
If your work is mostly coding, the CLI alone is enough. You can also run both.
How Memotori's folders are laid out
The Mac and Windows versions of Memotori live in separate git repositories. Above them sits a shared workspace (also a git repository) that holds the specs both versions follow and the working rules for the AI (CLAUDE.md).
Memotori/
├── Memotori-mac/ ← the Mac repository
├── Memotori-win/ ← the Windows repository
├── spec/ ← specs shared by both versions
├── promo/ ← promotion notes and drafts (including this post)
└── CLAUDE.md ← working rules for the AI
I run Remote Control in that shared folder. Sessions started from my phone read CLAUDE.md too, so rules like "explain the plan and get my OK before changing code" still apply.
I wrote about this shared spec folder in detail in an earlier dev log.
1. Install Claude Code
curl -fsSL https://claude.ai/install.sh | bash
claude --version
If claude isn't found, open a new terminal or run source ~/.bashrc.
Then log in:
claude
Follow the browser login, then type /exit.
2. Start Remote Control
Go to your project folder and start it:
cd ~/develop/projects/myapp
claude remote-control
The first time, it asks:
Spawn mode for this project:
[1] same-dir — sessions share the current directory (default)
[2] worktree — each session gets an isolated git worktree
This setting decides which directory each new session works in when you start one from your phone or the web.
| Mode | Behavior | Best for |
|---|---|---|
| same-dir | All sessions share the current directory | One task at a time, or folders without git |
| worktree | Each session gets its own git worktree (an isolated working copy) | Running several sessions in parallel |
Pass the mode as a flag so you aren't prompted again:
claude remote-control --spawn=worktree
Notes on worktree mode
- The folder must be a git repository with at least one commit:
git init
git add . && git commit -m "init"
- Each session works on its own branch, so you (or Claude) merge the results.
- Untracked files such as
.envare not copied into worktrees. - Clean up occasionally: check with
git worktree list, then rungit worktree prune.
3. Keep it running with tmux
Run it inside tmux so it survives SSH disconnects:
sudo apt install -y tmux
tmux new -s claude
claude remote-control --spawn=worktree
Detach with Ctrl+B then D. Reattach with tmux attach -t claude.
4. Start automatically at boot
Startup script
First, find the full paths:
which claude # e.g. /home/user/.local/bin/claude
which tmux # e.g. /usr/bin/tmux
cron runs with a minimal PATH, so use full paths.
~/scripts/start-claude-myapp.sh
#!/bin/bash
sleep 20 # wait for the network to come up
cd /home/user/develop/projects/myapp
/usr/bin/tmux new -d -s claude-myapp "/home/user/.local/bin/claude remote-control --spawn=worktree 2>&1 | tee /home/user/claude-rc-myapp.log"
What each part does:
-
sleep 20: the network may not be ready right after boot. -
tmux new -d -s <name>: starts a named, detached session. -
tee ...log: keeps a log for troubleshooting. - When you add more projects, use a separate session name and log file for each so they don't overwrite each other.
Make it executable and test it:
chmod +x ~/scripts/start-claude-myapp.sh
~/scripts/start-claude-myapp.sh
tmux attach -t claude-myapp
Register it in crontab
crontab -e # edit
crontab -l # list
crontab -r # remove ALL entries (no confirmation!)
Add this line at the bottom with crontab -e:
@reboot /home/user/scripts/start-claude-myapp.sh
Verify
sudo reboot
# after the reboot
tmux ls
If you see claude-myapp, you're done.
Tips
- Disable sleep on an always-on machine:
sudo systemctl mask sleep.target suspend.target
- Be careful with auto-approval. At first, approve permission prompts from your phone as they come up.
- If it doesn't start, check the log file. Answer any interactive prompts up front with flags so nothing blocks at boot.
Wrap-up
- A spare PC plus Claude Code Remote Control gives you a personal AI work machine you can hand tasks to anytime.
- Use worktree spawn mode for parallel work, or same-dir for simplicity.
- tmux plus cron
@rebootbrings it back automatically after a reboot.
Firing off a quick request from my phone and just reviewing the diff later has turned out to be a pretty comfortable way to work. It's how I handle most small fixes to Memotori now.
The app I build on this machine
Finally, let me introduce Memotori, the app this machine works on.
It transcribes and summarizes meetings entirely on your device. Your audio and transcripts never leave it. It can also pull to-dos out of a meeting so you can check them off.
Version 1.2.0 adds a "Getting started" guide for first-time users and a reminder when you forget to stop recording.
- Mac (App Store): https://apps.apple.com/app/memotori/id6814051112?pt=359959&ct=devto-rc-en&mt=8
- Windows (Microsoft Store): https://apps.microsoft.com/detail/9N7KPTFRFX2M?cid=devto-rc-en
- Questions, bug reports, and requests on Discord: https://discord.gg/rrH2DnJJjr
Previous dev logs:
- I Built an On-Device Transcription App for Mac and Windows with AI — Without Touching the Code
- One Week of Promoting My Indie App: The Real Numbers, and Two Traps I Fell Into
- How I Keep the Mac and Windows Versions of My App in Sync When AI Writes the Code: One Home for the Specs
Thanks for reading.
References
Originally published on Medium.
Originally published by Dev.to AI. Aggregated on AIWithGhost for educational purposes — full credit and traffic to the original publisher.