Skip to Content

Frequently Asked Questions

TL;DR

Answers to common questions about CMDOP: sessions persist through disconnections with a 30-second grace period, the agent runs on Raspberry Pi and IPv6 networks, self-hosted air-gapped deployment is supported, and the Python SDK requires Python 3.10+. Free, Pro, and Enterprise plans are available with a free tier for open source projects.

What are the general questions about CMDOP?

What happens if my internet drops during a long-running command?

Your command continues running on the server. CMDOP sessions persist independently of your connection. When you reconnect, you’ll see any output that was produced while disconnected.

There’s a 30-second grace period after disconnection. If you reconnect within this window, you maintain the same session. After 30 seconds, the session closes but your processes keep running (if started with nohup or in the background).

Can I use CMDOP on a Raspberry Pi?

Yes. The CMDOP agent supports:

  • Raspberry Pi 4 and 5 (arm64)
  • Raspberry Pi 3 (armv7l)
  • Raspberry Pi Zero 2 W (arm64)

Install with:

# Install the CMDOP agent on Raspberry Pi curl -sSL https://cmdop.com/install.sh | bash # Register and connect the device to your workspace cmdop connect

What’s the maximum number of machines per workspace?

There’s no hard limit on machines per workspace. Practical limits depend on your plan:

PlanMachinesConcurrent Sessions
Free52
Pro10020
EnterpriseUnlimitedUnlimited

How long are sessions retained?

Session data is retained for:

  • Audit logs: 90 days (Pro), 1 year (Enterprise)
  • Session history: 30 days
  • Command output: Until session closes

Can I use CMDOP without an internet connection (air-gapped)?

Yes, with self-hosted deployment. In air-gapped mode:

  1. Deploy Control Plane on internal network
  2. Agents connect to internal server
  3. No external internet required

See Self-Hosted Deployment.

What data is sent to the cloud?

When using CMDOP Cloud:

  • Machine metadata (hostname, OS, IP)
  • Session metadata (start time, duration, commands)
  • Terminal output (encrypted in transit)
  • File metadata (not file contents by default)

We never store:

  • Plaintext passwords
  • SSH private keys
  • Decrypted session content

How do I report a security vulnerability?

Email: [email protected]

Include:

  • Description of vulnerability
  • Steps to reproduce
  • Potential impact

We respond within 24 hours and offer bounties for valid reports.

What are common technical issues and solutions?

Why does my session show GRACE_PERIOD status?

GRACE_PERIOD means your client disconnected but the server is waiting for reconnection. This happens when:

  • Network temporarily drops
  • You close laptop lid
  • Mobile app goes to background

The grace period is 30 seconds. Either:

  • Wait and reconnect within 30 seconds
  • Wait for it to close and create new session

How do I fix β€œcertificate verify failed” errors?

This usually means your system clock is wrong or CA certificates are outdated.

Fix:

  1. Sync time:

    # Synchronize system clock with NTP servers sudo timedatectl set-ntp true
  2. Update CA certificates:

    # Ubuntu/Debian sudo apt update && sudo apt install ca-certificates # CentOS/RHEL sudo yum update ca-certificates # macOS brew install ca-certificates

Can I use CMDOP with IPv6-only networks?

Yes. CMDOP supports:

  • IPv6-only connections
  • Dual-stack (IPv4 + IPv6)
  • NAT64/DNS64 environments

Configure agent:

# Enable IPv6-preferred connections for the agent export CMDOP_PREFER_IPV6=true cmdop connect

Why is file transfer slow?

Common causes:

  1. Large files over mobile: 100MB limit on iOS
  2. Network congestion: Check bandwidth
  3. Chunk size: Default is 10MB chunks

Optimize:

# Compress before transfer tar -czf archive.tar.gz directory/ # Use sync for incremental updates cmdop files sync ./local server:/remote

How do I handle commands with special characters?

Use proper quoting:

# Single quotes for literal strings cmdop exec server 'echo $HOME' # Prints $HOME # Double quotes for variable expansion cmdop exec server "echo $HOME" # Prints actual home path # Escape special characters cmdop exec server "echo \$HOME"

Can I run graphical applications (X11 forwarding)?

X11 forwarding is not currently supported. CMDOP focuses on terminal access.

For graphical apps, consider:

  • VNC tunneling (coming soon)
  • Remote desktop solutions
  • Web-based interfaces

How do I handle interactive prompts (sudo password)?

For sudo, use:

# Run with pseudo-terminal cmdop terminal server sudo apt update # Enter password interactively

Or configure passwordless sudo for specific commands:

# /etc/sudoers.d/cmdop deploy ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart app

How does CMDOP compare to other tools?

CMDOP vs SSH: When should I still use SSH?

Use SSH for:

  • X11 forwarding (not yet in CMDOP)
  • SOCKS proxy
  • Legacy system integration
  • Lowest latency requirements

Use CMDOP for:

  • Team access with audit logs
  • Session persistence
  • AI-assisted operations
  • Mobile access
  • Zero firewall configuration

CMDOP vs Tailscale: Can they work together?

Yes. Use together for:

  • Tailscale: Network connectivity (VPN)
  • CMDOP: Session management and access control

Setup:

  1. Machines connect via Tailscale
  2. CMDOP agent uses Tailscale IP
  3. Best of both worlds

CMDOP vs traditional RMM tools: Key differences?

FeatureCMDOPTraditional RMM
Terminal accessNative PTYOften web-based
Session persistenceYesUsually no
AI integrationBuilt-inAdd-on
Open source agentYesRarely
Developer focusHighLow

What SDK questions are frequently asked?

What Python version is required?

Python 3.10 or later.

Is there a Node.js SDK?

Not currently. The Python SDK is the primary SDK. REST API is available for other languages.

How do I handle async operations?

Use AsyncCMDOPClient:

import asyncio from cmdop import AsyncCMDOPClient async def main(): # Create an async client connected to a remote machine async with AsyncCMDOPClient.remote(api_key="...") as client: # Execute a command and capture the output result = await client.terminal.execute("ls") print(result.output) # Run the async function using asyncio event loop asyncio.run(main())

What’s the difference between local and remote mode?

ModeConnectionAuthUse Case
LocalUnix socketUID verificationSame machine as agent
RemotegRPC over TLSAPI keyDifferent machine

What about the mobile app?

Why does the iOS app require iOS 18?

iOS 18 is required for:

  • Swift 6 concurrency features
  • Modern actor isolation
  • Enhanced background tasks

Older iOS versions are not supported.

Why is the file size limit 100MB on mobile?

iOS memory constraints and App Store guidelines limit file operations. For larger files:

  • Use CLI
  • Split files
  • Use compression

How do I clear the app cache?

  1. Settings > General > iPhone Storage
  2. Find CMDOP
  3. Tap β€œOffload App”
  4. Reinstall from App Store

How do I set up self-hosted CMDOP?

What database is required?

PostgreSQL 15 or later.

Redis 7 is optional but recommended for:

  • Caching
  • Real-time subscriptions
  • Rate limiting

Can I use MySQL instead of PostgreSQL?

No. CMDOP requires PostgreSQL for:

  • JSON support
  • Full-text search
  • Row-level security

How do I backup the database?

# PostgreSQL dump pg_dump cmdop > backup.sql # With compression pg_dump cmdop | gzip > backup.sql.gz

Schedule daily backups with cron:

0 2 * * * pg_dump cmdop | gzip > /backups/cmdop-$(date +\%Y\%m\%d).sql.gz

How does billing work?

What counts as an active machine?

A machine is β€œactive” if it connected to CMDOP in the billing period (monthly).

Are test/staging machines billed the same?

Yes. All machines count equally regardless of purpose.

What happens when I hit rate limits?

You’ll receive RateLimitError with:

  • retry_after_seconds - when to retry
  • limit - your current limit
  • remaining - requests remaining

Handle in SDK:

from cmdop.exceptions import RateLimitError try: result = client.agent.run("task") except RateLimitError as e: # Wait for the recommended cooldown period before retrying await asyncio.sleep(e.retry_after_seconds) # Retry the operation after the rate limit window passes

Is there a free tier for open source projects?

Yes. Contact [email protected] with:

  • Project URL
  • GitHub stars
  • Brief description

We offer free Pro plans for qualifying open source projects.

Last updated on