How to use this app. Plain English. No jargon.
This app lets you see and eventually controlTerry — an AI agent that runs on your Hetzner server as a Linux user. Terry can read code, write code, and open pull requests. Right now he's turned off (since January 23). This app is how you'll monitor and manage him when he's back on.
The Docker containers (terry-backend, terry-performance, etc.) are not Terry. They just report on what Terry does. Terry himself is a Linux user account named terry that runs Claude CLI.
You open this app
↓
App reads data from terry-backend API
↓
terry-backend reads agents.json (updated every 5 min by a cron job)
↓
agents.json is collected from the actual Linux users on the server
Data is at most 5 minutes old. The Dashboard and Users pages auto-refresh every 30 seconds. Other pages require a browser reload.
What you see:Is Terry working? What's his current mission? How much is he costing vs. saving?
When to check:First thing when you open the app. If both health badges say "healthy", the system is up.
What you do:Pick a repo, then pick an issue from the dropdown (shows all open issues from GitHub), set priority, click "Assign to Terry".
Issue picker: When you select a repo, the form fetches open issues from GitHub and shows them in a dropdown with labels. You can also switch to manual entry if needed. Requires GitHub to be connected in /settings.
Right now:Terry's orchestrator is off, so assigned work will sit in the queue. It won't be lost — when Terry is re-enabled, he'll pick it up.
What you see: Every mission assigned to Terry — pending, in-progress, completed, or failed. Each mission shows the goal, repo, priority, duration, and result output.
Auto-refreshesevery 15 seconds. If Terry is actively working, you'll see status changes in near real-time.
Result output:Completed missions show Terry's output — what he did, which branch, which PR he created. This is the proof-of-work for each assignment.
Detail view: Click any mission card to see the full detail page — metadata, rules applied, result output, links to the GitHub issue and PR, and a session log timeline (when the backend logging endpoint is available).
What you see: Mission summary table (compact view), commits Terry made, and quality scores for each commit.
Known issue:Commits and quality scores show "unavailable" because the backend container is missing git. This will be fixed when the container is rebuilt.
What you see: ROI (is Terry worth the server cost?), work metrics (commits/day, quality), and AI-generated recommendations for improvement.
How to read ROI:The "Conservative" number compares Terry's cost to hiring a junior dev. The "Realistic" number compares to a freelancer. Higher % = better value.
What you see: Every Linux user on the server — what they can access, their cron jobs, running processes, Claude config, and file permissions.
Key things to look for:
mark and willy should have docker access. If terryshows "Yes", something is wrong.What you do: Manage all credentials and connections in one place.
Security:Only the Mark0025 GitHub account can sign in. Terry's PAT is set via server environment variable — never stored in the browser.
What you see:Terry's purpose (telos) and the guardrails (rules) that limit what he can do.
Right now: Both are empty. You need to create a terry-telos.md file and .terry-rules.md files in repos before Terry can be safely re-enabled.
Don't do these out of order. Each step depends on the one before it.
Create terry-telos.mdin the homelab repo. This defines Terry's purpose and boundaries. Without it, he has no guardrails. Check the /rules page — "Telos File" should change from "Not Created" to "Active".
Create .terry-rules.mdin each repo Terry will work on. These define what he can and can't touch in that specific repo. Check the /rules page — rule count should be > 0.
Clone repos into Terry's workspace. SSH into the server as mark, then clone repos into /home/terry/work/. Right now that directory is empty — Terry has nothing to work on.
Fix the terry-backend container. Add git to the Dockerfile and rebuild. This unblocks commit history and quality scores on the /history page.
Re-enable the orchestrator cron. SSH in as mark, uncomment the orchestrator line in crontab -e. Terry will start running autonomous cycles every 10 minutes.
Watch the dashboard.Current Mission should change from "Idle". Check /history for new commits. Check /users to see Terry's process count increase during active cycles.
"Everything says healthy but Terry isn't doing anything"
Correct. "Healthy" means the reporting containers are running. Terry's orchestrator cron is disabled — he won't do work until you follow the re-enable checklist above.
"I assigned work but nothing happened"
The mission is queued in terry-backend. Terry will pick it up when his orchestrator is running. Check /history — the mission should appear in the missions table with status "pending".
"Commits say unavailable"
The terry-backend Docker container doesn't have git installed. This is a known issue. The container needs to be rebuilt with git added to its Dockerfile.
"Users page shows old data"
Data is collected every 5 minutes by a cron job running as the mark user. Reload the browser page. If data is still stale, SSH into the server and check if the cron is running: crontab -l | grep collect
"The whole app is down / won't load"
SSH into the server and check the container:
docker ps | grep terry-managementIf it's not running, restart it:
cd /home/mark/terry-management && docker compose -f docker-compose.homelab.yml up -d"How do I deploy changes to this app?"
After merging a PR on GitHub:
ssh mark@178.156.203.55cd /home/mark/terry-managementgit pulldocker compose -f docker-compose.homelab.yml build --no-cachedocker compose -f docker-compose.homelab.yml up -dHETZNER SERVER (178.156.203.55)
Linux Users (the actual actors):
mark — you. admin. runs docker, sudo, 17+ cron jobs
terry — AI agent. no docker, no sudo. runs Claude CLI
terry-dev — unused test account
willy — Portainer service account
kasm — VDI (virtual desktop)
Docker Containers (the reporting layer):
terry-backend :8007 — API that reads agents.json
terry-performance :8009 — ROI and metrics
terry-management :8075 — THIS APP
terry-memory :8005 — session storage
terry-conversation :8006 — chat interface
Data Flow:
cron (every 5 min) → collect-agent-state.sh → agents.json
agents.json → terry-backend API → this app
terry.markcarpenter1.comterry-backend.markcarpenter1.comterry-performance-api.markcarpenter1.comgithub.com/Mark0025/terry-managementssh mark@178.156.203.55