23 Agustus 2026

Mengakses Agent AI dari Ponsel dengan Paseo

Paseo mengubah sesi AI coding agent di mesin headless menjadi bisa dipantau dan dikontrol dari ponsel, lewat relay terenkripsi end-to-end atau koneksi langsung dengan alur pairing QR.

AI coding agent seperti OpenCode, Claude Code, atau Codex biasanya hidup di terminal mesin kerja. Masalah muncul saat sesi berjalan lama — misalnya agent sedang refactor di server headless — sementara saya tidak di depan mesin itu. SSH dari ponsel bisa, tapi terminal di layar kecil tidak nyaman untuk memantau output agent. Paseo menjawabnya: daemon yang mengelola agent di mesin, plus aplikasi mobile, desktop, web, dan CLI untuk melihat serta menjalankan sesi dari mana saja. Catatan: Paseo mengelola agent, tidak membundelnya; minimal satu CLI agent (misalnya OpenCode) harus terpasang di mesin yang sama.

Mengapa Paseo Dipertimbangkan

Agent di mesin headless tidak punya antarmuka; hasil sesi hanya terlihat kalau menempel di terminal. Alternatif yang pernah dicoba tidak memuaskan:

  • SSH dari ponsel bekerja, tapi tidak ada tampilan chat/stream yang nyaman untuk agent berjalan lama.
  • VNC atau remote desktop berat untuk membaca log dan boros data seluler.
  • Port forwarding manual membuka permukaan serangan tanpa penjagaan.

Yang dicari: latensi rendah, tanpa port sembarangan, aman di jaringan tak dipercaya — Paseo menyediakan dua jalur: relay dan koneksi langsung.

Arsitektur dan Cara Kerja

Paseo memakai arsitektur client-server mirip Docker. Daemon berjalan di mesin tempat agent dieksekusi, default mendengarkan di 127.0.0.1:6767 dengan endpoint HTTP/WebSocket, dan mengelola lifecycle agent: memulai, menghentikan, meneruskan output. Klien (ponsel, CLI, web) terhubung melalui WebSocket untuk menampilkan chat dan terminal agent secara real-time.

Dua cara koneksi klien:

  1. Relay (direkomendasikan): daemon membuka koneksi keluar ke relay; klien bertemu di sana. Tanpa port forwarding atau firewall. Traffic dienkripsi end-to-end: keypair ECDH persistent di daemon, kunci publik diterima ponsel lewat QR, lalu kedua sisi membuka kanal NaCl box (Curve25519 + XSalsa20-Poly1305). Relay dirancang tak bisa dipercaya: hanya melihat IP, ukuran pesan, dan ID sesi.
  2. Koneksi langsung: daemon mendengarkan di alamat jaringan (LAN, Tailscale, VPN) dan klien menghubungi host:6767. Di jaringan tak dipercaya butuh TLS atau VPN sendiri.

Konfigurasi dan state di PASEO_HOME (default ~/.paseo): config.json dan keypair daemon.

Deployment dan Setup

CLI dipasang lewat npm:

npm install --global @getpaseo/cli
paseo

Run pertama memulai daemon, menawarkan relay, dan mencetak QR pairing. Pairing ulang:

paseo daemon pair

Di Docker Compose, image resmi menjalankan daemon sekaligus web UI bawaan:

services:
  paseo:
    image: ghcr.io/getpaseo/paseo:latest
    container_name: paseo
    restart: unless-stopped
    ports:
      - "6767:6767"
    environment:
      PASEO_PASSWORD: "change-me"
      # PASEO_HOSTNAMES: "paseo.example.com,.lan"
    volumes:
      - ./paseo-home:/home/paseo
      - ./workspace:/workspace

UI diakses di http://localhost:6767. Image tidak membundel CLI agent; buat child image dari ghcr.io/getpaseo/paseo:latest dan pasang agent yang dibutuhkan, atau login provider langsung di kontainer. Credential agent tersimpan di /home/paseo, jadi scope mount harus ketat.

Akses dari luar tanpa relay lewat Cloudflare Tunnel:

cloudflared tunnel --url http://localhost:6767

Daemon dimulai dengan hostname yang diizinkan:

paseo daemon start --web-ui --hostnames "paseo.example.com"

Yang sering salah saat troubleshooting:

  • Timeout koneksi langsung: di klien isi port 443 (HTTPS tunnel/proxy), bukan 6767, dan aktifkan SSL.
  • 403 Host not allowed: domain belum di allowlist; tambahkan via --hostnames atau PASEO_HOSTNAMES.
  • UI load tapi tidak connect: proxy harus meneruskan upgrade WebSocket dan X-Forwarded-Proto; tanpa itu aplikasi tidak tahu memakai wss://.

Keamanan dan Operasional

  • Wajib password. paseo daemon set-password atau PASEO_PASSWORD; hash bcrypt di config.json. Password melindungi akses, bukan traffic — jaringan tak dipercaya tetap butuh relay atau TLS.
  • Host allowlist. Daemon memvalidasi header Host sebagai proteksi DNS rebinding; default hanya localhost dan IP. Domain kustom lewat daemon.hostnames.
  • Jangan bind 0.0.0.0 tanpa password. Siapa pun di jaringan sama bisa memakai agent.
  • QR/pairing link = trust anchor. Berisi kunci publik daemon; perlakukan seperti password.
  • State perlu dijaga. PASEO_HOME berisi config.json dan keypair daemon; salin untuk recovery bersama volume workspace. Log di $PASEO_HOME/daemon.log. Ubah konfigurasi: paseo reload untuk sebagian besar pengaturan; yang bersifat startup butuh paseo daemon restart.

Keterbatasan yang Jujur

  • Tidak membundel agent. Setiap CLI agent harus dipasang dan login-nya dirawat sendiri di mesin.
  • Relay default mati. Akses remote tidak aktif sebelum pairing; relay juga dependensi eksternal, meski E2E membuatnya tak bisa membaca traffic.
  • Password bukan TLS. Di jaringan publik tanpa relay/HTTPS, traffic bisa dibaca; keamanan URL publik bergantung pada proxy/tunnel.
  • Permukaan serangan nyata. Agent bisa menyentuh workspace dan credential yang di-mount; membuka daemon ke internet menambah risiko.
  • Orchestration butuh pendamping. Beberapa fitur memakai gh (GitHub CLI) yang terautentikasi terpisah.
  • Bukan high availability. Sesi hidup di satu mesin; mesin mati, sesi ikut mati.

Kesimpulan

Paseo paling cocok untuk pola sederhana: satu pengguna, satu mesin kerja, dan kebutuhan mengikuti sesi agent dari ponsel. Setup awal menuntut disiplin — password, allowlist hostname, scope mount — tapi setelah itu ia bekerja baik sebagai jembatan antara agent headless dan layar kecil. Untuk multi-user atau multi-mesin ia bukan pilihan utama; batasan konteks yang wajar.

Referensi