# Codeusse — Full Content > Mobile Agentic IDE & Persistent Terminal for remote AI workflows. ## Product Overview Codeusse connects to your machine over standard SSH and keeps your sessions alive with tmux. Run Claude Code, OpenCode, Aider, and Codex on your machine — full terminal UI, native performance. Features a code editor, shell client, file manager, and agent tools — all on your phone. No cloud lock-in, no sign-up required. Your SSH keys stay on your device. --- # Why Install Yet Another Remote Shell When SSH Is Already on Your Machine? > SSH comes pre-installed on every Linux distribution and macOS. Here's why that matters — and how Codeusse builds directly on what you already have. Mobile SSH apps have multiplied over the last few years. Some, like Mosh-based clients (including Moshi), promise a better terminal experience over flaky connections. Others layer on proprietary protocols, cloud relays, or custom daemons that need installing on your host. But there is a simpler starting point that often gets overlooked: **SSH is already on your machine.** Every major Linux distribution ships with OpenSSH. macOS has shipped with it for over a decade. You do not need to install anything on the server side to get started. This post looks at why that pre-installed foundation matters, how tools like Moshi diverge from it, and why Codeusse was built to embrace it. ## The silent advantage of built-in SSH Open a terminal on any Linux box or Mac. Type `ssh`. It is there. No package manager, no Homebrew, no compilation required. The protocol that secures remote access for millions of servers, cloud instances, and development machines is already baked into your operating system. That means: - **Zero server-side setup.** If you have enabled the SSH server (`sshd`) on your host, you are ready. No extra daemons, no additional ports to open, no new attack surfaces. - **Universal key management.** Your `~/.ssh/authorized_keys`, `ssh-agent`, and hardware security keys all work as expected. Nothing to duplicate or migrate. - **Proven security.** OpenSSH has been battle-tested for over two decades. It is audited, patched, and trusted by every major OS vendor. - **Ecosystem compatibility.** Git, rsync, scp, VS Code Remote, Ansible — the entire DevOps toolchain speaks SSH natively. ## Moshi and Mosh: a different path [Moshi](https://apps.apple.com/us/app/moshi-mosh-client/id1256618614) is a well-made Mosh client for iOS. [Mosh](https://mosh.org/) (Mobile Shell) was designed to improve SSH on high-latency or intermittent connections by using UDP and local echo. It works by installing a `mosh-server` binary on your remote host, which sits alongside (or replaces) your SSH session. Mosh solves a real problem — typing lag and dropped connections over cellular — but it comes with trade-offs that matter for a development workflow: ### What Mosh adds | Capability | How Mosh handles it | |---|---| | Roaming and reconnection | UDP-based session that survives IP changes | | Local echo | Types appear instantly before the server confirms | | Predictive rendering | Smart reduction of terminal redraw traffic | ### What Mosh gives up | Limitation | Impact on development | |---|---| | No scrollback | Once output scrolls off screen, it is gone. No `tmux` scrollback, no terminal buffer. | | No agent forwarding | Your SSH agent (`ssh -A`) does not work through Mosh. No key forwarding for Git operations inside the session. | | No port forwarding | `-L` and `-R` tunnels are unavailable. No tunneling a database or dev server through your connection. | | No `sshd` integration | Mosh bypasses the SSH server after authentication. Audit logging, `ForceCommand`, and server-side `sshd_config` policies do not apply. | | Server-side binary required | You must install `mosh-server` on every host you connect to. Not available by default on any OS. | | Extra firewall ports | Mosh uses a range of UDP ports (60000–61000 by default). Each connection needs a firewall opening. | For SSH administration — restarting a service, checking logs — Mosh can be a nice upgrade. But for a development environment where you run AI coding agents, use `tmux` for session persistence, forward ports, and audit access? The trade-offs start to hurt. ## Why Codeusse stays on standard SSH Codeusse connects over vanilla SSH. No UDP layer, no custom protocol, no server-side binary you need to install. The same `sshd` that ships with Ubuntu, Debian, Fedora, Arch, and macOS is the only requirement. ### What you get with standard SSH in Codeusse | Feature | Moshi (Mosh) | Codeusse | |---|---|---| | Server-side requirements | Install `mosh-server` | Enable SSH (already installed) | | Protocol | UDP + SSH bootstrap | Standard SSH (TCP) | | Session persistence | No (stateless) | Automatic tmux sessions | | Scrollback | None | Full tmux scrollback | | AI coding agents | Not supported | First-class support | | Code editor | No | Built-in touch editor | | File manager | No | Full file browser | | Agent forwarding | No | Yes | | Port forwarding | No | Yes (`-L` / `-R`) | | Firewall ports | 1 SSH + UDP range | 1 SSH port | | Audit logging via sshd | No (bypasses sshd) | Yes | | Works on a Pi, VPS, or old laptop | Needs `mosh-server` | Works out of the box | ### tmux is the persistence story Mosh sells itself on reconnecting after network changes. That is genuinely useful. But Codeusse achieves the same goal — and more — through `tmux`, running over standard SSH. If your network drops, your `tmux` session keeps running on the server. When you reconnect, you attach right back where you left off. No UDP tricks, no port ranges, no extra server binary. Just `tmux`, which is available on practically every server and trivial to install if missing. The difference is philosophical. Mosh tries to solve the flaky-network problem at the **transport layer**. Codeusse solves it at the **session layer**. The transport layer approach requires everyone to install new software. The session layer approach works with what already exists. ### Security stays where it belongs Because Codeusse uses standard SSH, every connection inherits your host's existing security posture. Your `sshd_config` rules apply. Your `AllowUsers` and `AllowGroups` restrictions apply. Your audit logs capture every authentication. Your fail2ban or crowdsec rules fire as expected. Mosh authenticates through SSH initially, then pivots to a UDP channel that bypasses `sshd` entirely. For teams or organisations that rely on server-side access controls, that gap is significant. ## When should you use Mosh? Mosh has its place. If you are SSH-ing into a server over a spotty 4G connection to check on a long-running process, and you do not need scrollback, agent forwarding, or any of the SSH ecosystem features — Mosh is excellent at what it does. Moshi provides a polished iOS client for that workflow. But if you are: - Running AI coding agents like Claude Code, Aider, or OpenCode on a remote machine - Maintaining long-lived `tmux` sessions for development - Pushing and pulling from Git repositories via SSH - Tunneling databases or dev servers through your connection - Writing, reviewing, and editing code from your phone ... then the standard SSH stack with `tmux` gives you everything that Mosh can, plus the full ecosystem that Mosh cannot. ## Getting started The best part is how little you need to do. On your Linux or macOS host, make sure the SSH server is running: - **macOS:** `System Settings` → `General` → `Sharing` → enable `Remote Login` ([full guide](/blog/enable-ssh-server-on-macos)) - **Ubuntu/Debian:** `sudo systemctl enable --now ssh` - **Fedora/RHEL:** `sudo systemctl enable --now sshd` - **Raspberry Pi:** Use the Raspberry Pi Imager to pre-configure SSH ([full guide](/blog/setup-raspberry-pi-ssh-codeusse)) That is it. No extra packages. No UDP port ranges. No custom daemons. Just `ssh`, which is already there. Install Codeusse from the [App Store](https://apps.apple.com/us/app/codeusse-ssh-client/id6757916854), add your host, and start coding. Your agents get a persistent `tmux` session, a touch-first code editor, and a file manager — all over the SSH protocol your machine has understood since the day you installed it. --- # Transitioning from Termius and Blink Shell to Codeusse for Remote AI Agents > A comparison of mobile SSH clients — Termius, Blink Shell, and Codeusse — and why AI coding agents need a different kind of mobile terminal. If you code on the go, you have probably tried one of the big-name mobile SSH clients. Termius and Blink Shell each solve part of the remote access problem. But if your workflow now includes AI coding agents — Claude Code, Aider, OpenCode, or Codex — the requirements change. This post compares what each tool offers and why Codeusse was built specifically for the agent-first developer. ## The landscape at a glance | Feature | Termius | Blink Shell | Codeusse | |---|---|---|---| | Platform | iOS, Android, Desktop | iOS | iOS (iPad + iPhone) | | SSH terminal | Yes | Yes | Yes | | AI agent coding | No | No | Yes | | Built-in code editor | No | No | Yes | | File manager | Snippets only | No | Yes | | tmux session persistence | Manual | Manual | Automatic | | Agent tool integration | No | No | Yes | | No cloud relay required | Depends on plan | Yes | Yes | ## Termius: the cross-platform powerhouse [Termius](https://termius.com/) is the most widely known mobile SSH client, and for good reason. It syncs your connections across devices, supports key-based authentication, and has a polished UI on every platform. The snippet system is genuinely useful for saving common commands, and the SFTP client covers basic file transfers. **Where Termius falls short for agents:** Termius treats SSH as a pipe for a human typing commands. That works for manual administration — restart a service, tail a log, run a one-off script. But AI coding agents need a *persistent environment*. They expect long-running sessions, working directories that survive disconnects, and a terminal that the agent can drive through structured tool calls. Termius has no concept of an agent tool protocol, no tmux-first session management, and no code editor for reviewing or tweaking agent output on the go. ## Blink Shell: the power user's terminal [Blink Shell](https://blink.sh/) earned its reputation by building a fast, native terminal for iOS. If you want a raw Unix shell on your iPad that feels like a desktop terminal, Blink is excellent. Its keyboard support and scripting capabilities appeal to developers who want maximum control. **Where Blink Shell falls short for agents:** Blink gives you a terminal — period. There is no file browser, no code editor, and no awareness of AI coding agents. You can certainly SSH into a machine and run `claude` or `aider` inside a tmux session, but Blink provides zero integration around that workflow. No tool pipeline, no context management, no agent-specific UI. It is a fantastic terminal emulator, but an agentic IDE it is not. ## Why Codeusse was built differently Codeusse does not compete with these tools on being a generic SSH terminal. It assumes you already have a terminal, and builds the rest of the agent coding stack around it. ### Agent-first design Codeusse is aware of coding agents as a first-class concept. It connects over standard SSH, attaches to a dedicated tmux session, and lets agents like Claude Code and OpenCode run on your machine with full terminal UI and native performance. The agent runs where your code lives — not in a sandbox, not on a cloud relay. ### Built-in tools that agents need - **Code Editor:** Touch-first editing with syntax awareness and fast file switching. When an agent proposes a diff, you can review and tweak it on your phone before applying. - **Shell:** A genuine SSH terminal that runs the same commands you would on a laptop. The agent surfaces proposed shell steps for your approval. - **File Manager:** Browse your project as files and folders. Open, rename, organize, or share without leaving the app. Bookmark directories for quick access. - **Agent Tools:** The refactor agent pulls in external context — documentation, APIs, known patterns — so suggestions match real-world constraints. ### tmux for persistence, not as an afterthought Termius and Blink Shell both *support* tmux — if you set it up yourself, remember to attach to the right session, and hope nothing goes wrong between connections. Codeusse makes tmux the default. It creates dedicated `codeusse-` prefixed sessions, uploads a custom configuration, and falls back to a plain shell only when tmux is genuinely unavailable. Detach, reattach, lose your network — your session is exactly where you left it. ### Security without compromise Every connection is encrypted over industry-standard SSH. Your private keys stay on your device — no credentials are stored on our servers. You control which hosts you connect to and can revoke access at any time. There is no mandatory cloud relay, no third-party proxy inspecting your traffic. Just SSH, the way it was designed. ## Making the switch If you are currently using Termius or Blink Shell for general SSH access, you do not have to abandon them. They remain excellent at what they do. The question is whether your workflow has grown to include AI coding agents — and if it has, Codeusse fills the gap those tools were never designed to address. Install Codeusse from the [App Store](https://apps.apple.com/us/app/codeusse-ssh-client/id6757916854), enable SSH on your host (check our guides for [macOS](/blog/enable-ssh-server-on-macos) and [Raspberry Pi](/blog/setup-raspberry-pi-ssh-codeusse)), and give your agents a terminal that was built for them. --- # Introducing Codeusse Connect: Secure Tunneling for Mobile Access > Codeusse Connect bridges your mobile device and local machine over SSH, so you can code from anywhere while your dev environment stays right where it belongs. Codeusse lets you code from your phone. But your projects, tools, and terminals live on a real machine — your laptop, a desktop, or a server back home. Codeusse Connect is the secure bridge between them. Under the hood, Codeusse Connect is an SSH tunneling service. It uses [sish](https://docs.ssi.sh/), an open-source SSH-tier reverse tunneling server, to route traffic from the Codeusse mobile app back to your machine — all over an encrypted SSH connection. No port forwarding on your router, no third-party proxies inspecting your traffic. Just SSH. ## How It Works When you run `npx codeusse-connect` on your machine, three things happen: 1. The CLI opens an SSH connection to `connect.codeusse.com:40074`, Codeusse's sish server. 2. It requests a **reverse port forward** — sish allocates a public-facing port from a small, predefined range, and starts forwarding any traffic that hits that port back through the SSH tunnel. 3. The CLI displays a **QR code** containing the SSH address (e.g., `ssh://connect.codeusse.com:40076`). You scan it with the Codeusse app, and you're connected. The architecture is split into a backend and a CLI: | Component | What It Does | |---|---| | **Backend** | Docker Compose deployment of the sish server, plus a key generation script. A single `antoniomika/sish:latest` container runs in host network mode, listening for SSH tunnel requests on port `40074`. | | **CLI** (`cli/`) | The `codeusse-connect` npm package. Uses `ssh2` under the hood to connect to sish, request a reverse forward, and pipe incoming TCP connections to your local SSH daemon on `127.0.0.1:22`. | ## The sish Setup sish is configured for **SSH-only tunneling**. TCP-level forwarding is explicitly disabled, which means all traffic flows through the SSH protocol layer. No raw TCP ports are opened directly — every connection is negotiated inside an SSH channel. The server uses an ED25519 host key, and the client never sees or stores credentials for the sish server itself. The port range is deliberately small. This isn't a public ngrok-style gateway designed for thousands of concurrent users. It's a focused service for Codeusse users who need a short-lived tunnel to their own machine. ## Security: The Tunnel Is Not the Gate This is the part that matters most. A reverse SSH tunnel is a **pipe**, not a passport. When sish forwards a connection through the tunnel, it doesn't authenticate the inbound client — it just routes the bytes. The real authentication happens at the **end of the pipe**: your local SSH server (`sshd`). Here's the full security flow:
The usual approach is Homebrew:
brew install tmux
References: Homebrew formula: tmux · tmux wiki — Installing
raspberrypi), try resolving it with **mDNS**:
- raspberrypi.local (replace with your hostname)
The default image often uses `raspberrypi` as the hostname, so **raspberrypi.local** may work if you didn't change it. You can test from a computer on the same network:
ping -c 3 raspberrypi.local
If ping works, you can use raspberrypi.local (or your-hostname.local) as the **Host** in Codeusse instead of the numeric IP.
### Option B: Your Router's Admin Page
Log in to your Wi-Fi router's admin interface (often printed on the router or documented in its manual). Look for **DHCP client list**, **connected devices**, or **LAN status**. Find the device named like your Pi's hostname or "raspberrypi" and note its **IP address**.
### Option C: From the Mac Terminal (ARP Scan)
After the Pi has been on for a minute, your Mac's ARP table may list it. This is quick but not always labeled clearly:
```bash
arp -a | grep -i "192.168\|10.0"
```
Compare with devices you know, or cross-check with the router list.
### Option D: If You Have a Monitor and Keyboard Attached
On the Pi itself, run:
```bash
hostname -I
```
The first address is typically your Pi's LAN IP.
> **Tip:** Local IP addresses can change when the router assigns them via DHCP. If your Pi's IP keeps moving, set a **DHCP reservation** or **static IP** for the Pi in your router's settings.
Write down the IP (or your working `hostname.local`) — you'll need it in the next step.
If you already know your Pi's IP address, you can enter it below so the connection details in Step 6 match what you found:
192.168.1.50) **or** raspberrypi.local if mDNS works on your network
- **Port**: `22` (the default)
- **Username**: The username you set in Raspberry Pi Imager (Step 3), e.g. pi
- **Authentication**: Password — use the **same password** you configured in Imager (not your Wi-Fi password), e.g. your SSH password

Tap **Save**. Then tap the newly created connection to open a session on your Pi.
> **iOS will ask for Local Network access.** The first time you connect, iOS may ask whether Codeusse can access devices on your local network. Tap **Allow** — this permission is required for Codeusse to reach your Pi over Wi-Fi. Without it, the connection will fail.
You now have an active SSH session on your Raspberry Pi. You can install tools, edit files, run services, and use the same workflows you'd use from a desktop terminal.
## Troubleshooting
### "Connection refused" error
- Confirm **SSH** was enabled in Raspberry Pi Imager before writing the card (Step 3).
- Make sure the Pi finished booting and is online (LED activity, or try `ping` to its IP).
- Double-check the **IP address** or **hostname.local** — typos are common.
### "Connection timed out" error
- Ensure your phone and the Pi are on the **same network** (same SSID for Wi-Fi; or same LAN segment for Ethernet).
- If you use a **guest Wi-Fi** network, many routers **isolate** clients from each other — use the main LAN Wi-Fi or adjust router settings.
- Some routers or firewalls block device-to-device traffic; check **AP isolation** / **client isolation** is off.
### "Permission denied" error
- Verify the **username** and **password** match what you set in **OS customization** in Imager (not your Apple ID or router password).
- If you only enabled **public key** authentication in Imager, password login will fail — re-flash with **password authentication** or add your key.
### `hostname.local` Does Not Resolve
- Not all networks forward mDNS reliably. Fall back to the **numeric IP** from your router or `hostname -I` on the Pi.
## What's Next?
Once you're connected over SSH, you can:
- **Edit files** on your Pi using Codeusse's editor
- **Run development servers** and reach them from your mobile browser (using the Pi's IP and the right port)
- **Use Git**, package managers, and your usual Linux tooling
- **Set up SSH keys** so you don't have to type your password each time
---
Have questions or ran into an issue? Drop by our [Reddit community](https://www.reddit.com/r/codeusse/) — we're happy to help.
---
# How to Enable the SSH Server on Your Mac
> Step-by-step guide to turning on Remote Login (SSH) on macOS so you can connect to your Mac from Codeusse over your local network.
Want to code on your Mac from your phone? With Codeusse's SSH support and macOS's built-in SSH server, you can connect to your Mac from anywhere on your local network and work with your full development environment. Here's how to set it up.
## What You'll Need
- A Mac running macOS Ventura (13) or later
- Your Mac and your mobile device connected to the same Wi-Fi network
- Codeusse installed on your phone or tablet
## Step 1: Open Sharing Settings
macOS has a built-in SSH server — Apple calls it **Remote Login**. You just need to turn it on.
Open **System Settings** and navigate to **General → Sharing**. You can get there quickly by clicking this link from your Mac:
[Open Sharing Settings](x-apple.systempreferences:com.apple.Sharing-Settings.extension)
Or, open **Terminal** and run:
```bash
open "x-apple.systempreferences:com.apple.Sharing-Settings.extension"
```
## Step 2: Enable Remote Login
Find **Remote Login** in the sharing services list and toggle it **on**. macOS will start the SSH server immediately.

### A Note on Full Disk Access
macOS protects certain folders — including **Documents**, **Downloads**, and **Desktop** — even over SSH. If your projects live in one of these directories, you may see "Operation not permitted" errors when trying to access them.
To fix this, you need to grant **Full Disk Access** to the SSH server process:

Then toggle "Allow full disk access for remote users" on:

Finally, click "Done" to save the changes.
## Step 3: Note Your Username
You'll need your macOS username to connect via SSH. If you're not sure what it is, open **Terminal** and run:
```bash
whoami
```
This prints your short username — the one you'll use to log in. For example, if the output is `alex`, your SSH login will be `alex@