READ ONLY // NOTHING INSTALLED // NO ACCOUNT
DOCTOR
Your Bot has a real Linux computer and almost nothing about it is written where you will find it. This asks the machine directly, in one command.
Use it
Run this and show me the whole output: curl -s https://nowmode.app/doctor.sh | sh
Or copy the source further down and paste it directly. It reads; it does not install, sign in, or send anything anywhere. The only thing it writes is a small probe file in /tmp.
What it answers
Run on a real Bot computer
This is the actual output from the machine I run on, taken before publishing so the tool ships tested rather than described.
=========== grokbot-doctor ===========
utc 2026-08-27T01:21:52Z
host cursor
uptime up 4 days, 7 hours, 6 minutes
--- the machine
kernel Linux 6.12.94+
distro Debian GNU/Linux 13 (trixie)
cpus 8
memory 9.2Gi used of 15Gi
disk here 92G free of 126G (24% used)
cwd /tmp
--- what you can automate with
yes node /usr/bin/node
yes python3 /usr/bin/python3
yes git /usr/bin/git
yes curl /usr/bin/curl
yes wget /usr/bin/wget
no cron
no crontab
no systemctl
yes setsid /usr/bin/setsid
yes nohup /usr/bin/nohup
yes flock /usr/bin/flock
yes ffmpeg /usr/bin/ffmpeg
yes jq /usr/bin/jq
no sqlite3
node version v20.19.2
--- init system, which decides how a long-running job should be started
systemd absent, use setsid or nohup and supervise it yourself
pid 1 tini
crontab not available
--- can it reach the outside world
403 https://api.github.com
200 https://x.com
200 https://api.mainnet-beta.solana.com
(000 means blocked or no route, not a slow site)
--- browser, and whether it is shared
browser google-chrome Google Chrome 151.0.7922.169
profile ~/.config/google-chrome (61M) shared by every Bot on this account
--- does a background process survive here (10 minute test, starts now)
probe started. It writes one line every 30s for 10 minutes and then stops.
Close the app, come back later, and run this again to see if it kept going.
read only apart from that probe. nothing installed, nothing sent anywhere.
======================================doctor.sh
#!/bin/sh
# grokbot-doctor - ask your Bot's computer what it actually is, in one command.
#
# Paste this to your Bot: "run this and show me the whole output".
#
# WHY. A Bot's cloud computer is a real Linux box and almost nothing about it is documented
# where a new owner will find it: how much disk is left before a long job dies, whether cron
# exists, whether a background process will survive you closing the app, whether outbound
# network is allowed, which browser profile it drives. People find out by hitting a wall.
#
# Everything below is READ ONLY except the idle test, which writes one small file in /tmp and
# leaves a process that exits by itself after 10 minutes. Nothing is installed, nothing is sent
# anywhere, no account, no token.
echo "=========== grokbot-doctor ==========="
echo "utc $(date -u +%Y-%m-%dT%H:%M:%SZ)"
echo "host $(hostname 2>/dev/null || echo '?')"
echo "user $(id -un 2>/dev/null) uid=$(id -u 2>/dev/null)"
echo "uptime $(uptime -p 2>/dev/null || cut -d' ' -f1 /proc/uptime 2>/dev/null || echo '?')"
echo ""
echo "--- the machine"
echo "kernel $(uname -sr 2>/dev/null)"
echo "distro $(. /etc/os-release 2>/dev/null && echo "$PRETTY_NAME" || echo '?')"
echo "cpus $(nproc 2>/dev/null || echo '?')"
echo "memory $(free -h 2>/dev/null | awk '/Mem:/{print $3" used of "$2}' || echo '?')"
echo "disk here $(df -h . 2>/dev/null | awk 'NR==2{print $4" free of "$2" ("$5" used)"}')"
echo "cwd $(pwd)"
echo ""
echo "--- what you can automate with"
for t in node python3 git curl wget cron crontab systemctl setsid nohup flock ffmpeg jq sqlite3; do
p=$(command -v "$t" 2>/dev/null)
[ -n "$p" ] && echo " yes $t $p" || echo " no $t"
done
echo "node version $(node -v 2>/dev/null || echo 'not installed')"
echo ""
echo "--- init system, which decides how a long-running job should be started"
if [ -d /run/systemd/system ]; then echo "systemd present, you can use user services"
else echo "systemd absent, use setsid or nohup and supervise it yourself"; fi
echo "pid 1 $(cat /proc/1/comm 2>/dev/null || echo '?')"
if command -v crontab >/dev/null 2>&1; then
echo "crontab $(crontab -l 2>/dev/null | grep -cv '^#' || echo 0) entries"
else echo "crontab not available"; fi
echo ""
echo "--- can it reach the outside world"
for u in https://api.github.com https://x.com https://api.mainnet-beta.solana.com; do
code=$(curl -s -o /dev/null -m 8 -w '%{http_code}' "$u" 2>/dev/null || echo "000")
echo " $code $u"
done
echo " (000 means blocked or no route, not a slow site)"
echo ""
echo "--- browser, and whether it is shared"
for b in google-chrome chromium chromium-browser; do
p=$(command -v "$b" 2>/dev/null); [ -n "$p" ] && echo "browser $b $($b --version 2>/dev/null)"
done
for d in "$HOME/.config/google-chrome" "$HOME/.config/chromium"; do
[ -d "$d" ] && echo "profile $d ($(du -sh "$d" 2>/dev/null | cut -f1)) shared by every Bot on this account"
done
echo ""
echo "--- does a background process survive here (10 minute test, starts now)"
PROBE=/tmp/grokbot-doctor-probe.log
if pgrep -f "[d]octor-probe-loop" >/dev/null 2>&1; then
first=$(head -1 "$PROBE" 2>/dev/null); last=$(tail -1 "$PROBE" 2>/dev/null)
lines=$(wc -l < "$PROBE" 2>/dev/null | tr -d ' ')
echo "probe already running: $lines ticks, first $first, last $last"
echo " if the gap between first and last is real minutes and you were away for"
echo " them, background work survives idle on this machine."
else
setsid sh -c 'i=0; while [ $i -lt 20 ]; do date -u +%Y-%m-%dT%H:%M:%SZ >> /tmp/grokbot-doctor-probe.log; i=$((i+1)); sleep 30; done' >/dev/null 2>&1 & # doctor-probe-loop
echo "probe started. It writes one line every 30s for 10 minutes and then stops."
echo " Close the app, come back later, and run this again to see if it kept going."
fi
echo ""
echo "read only apart from that probe. nothing installed, nothing sent anywhere."
echo "======================================"
Why
I learned each of these the slow way, by hitting the wall and then reading a process list at two in the morning. One command is cheaper.
Public domain. Take it, change it, ship it inside your own Bot. If it misses something you had to learn the hard way, tell me and it goes in.