OpenHands is a self-hosted open-source alternative to Devin that runs autonomous coding agents and automations across local and cloud Docker runtimes.
OpenHands is a self-hosted platform for autonomous software engineering agents and background developer automations. Its decoupled architecture separates a web-based control canvas from sandboxed execution runtimes, allowing teams to run multi-step coding tasks locally in Docker or across private servers. Rather than locking codebases into a proprietary cloud, it provides an open execution harness that integrates with existing version control and internal infrastructure.
Devin packages an autonomous software engineer into a proprietary subscription where Cognition manages compute, sandboxes, and model orchestration. OpenHands reproduces that core loop—reading issues, editing repositories, running test suites, and browsing docs inside isolated containers—as a self-hosted system under your operational control. Instead of exposing private repositories and secrets to a third-party tenant, engineering teams run OpenHands agents inside their own VPCs or on local hardware, using their own API keys or self-hosted model endpoints.
From a workflow perspective, the tradeoff is convenience versus infrastructure ownership. Devin eliminates setup overhead by managing runtime sandboxing, but restricts teams to vendor prompts, closed model pipelines, and metered tiers. OpenHands shifts operational responsibility to DevOps engineers, who must configure container networks, manage workspace volume mounts, and monitor token burn. In exchange, teams gain complete auditability over tool calls and shell operations, integration with private registries, and freedom to swap underlying models as benchmarks evolve.
host.docker.internal timeouts on Linux, complicate initial setup when connecting backend runtimes to local microservices.Is OpenHands free for commercial use? Yes. OpenHands is free and open-source software; users pay only for their compute infrastructure and third-party model API tokens.
OpenHands vs Devin — which one should engineering teams choose? Devin fits organizations wanting a turnkey, managed software engineering agent with zero infrastructure upkeep, whereas OpenHands is the choice for teams requiring on-premises execution, model flexibility, and complete source code privacy.
Can OpenHands run locally without Docker? Yes, OpenHands can execute directly on a host machine using Node.js and Python, though the maintainers recommend container sandboxes to isolate autonomous shell commands from your primary operating system.
OpenHands is the right choice when your organization demands data sovereignty, model independence, and deep integration with internal infrastructure, but it is not the tool for teams unwilling to manage their own containers and API budgets. The project sees continuous community development with frequent pushes to its unarchived repository, and its permissive MIT license ensures you can deploy, modify, or embed the agent runtime across enterprise environments without commercial restrictions.
We started this exact setup from scratch in a clean Linux machine on Nov 1, 2026 and checked it through OpenHands's own API: every check passed. Recipes are re-checked regularly and removed if they stop working.
mkdir -p openhands && cd openhands
curl -fsSL https://open-source.store/tools/openhands/compose.yml -o compose.ymlcat > .env <<EOF
LOCAL_BACKEND_API_KEY=$(openssl rand -hex 32)
OH_SECRET_KEY=$(openssl rand -hex 32)
OH_WEB_URL=http://localhost:8000
EOFLOCAL_BACKEND_API_KEY — Session API key for authenticating to Agent Canvas and backend services. Generated above; keep it secret.OH_SECRET_KEY — Encryption key for securing persisted settings and secrets. Generated above; keep it secret.OH_WEB_URL — Public URL where OpenHands is reached (e.g. http://<your-server>:8000 or https://openhands.example.com); set this to your server's public URL.docker compose up -dservices:
openhands:
image: ghcr.io/openhands/agent-canvas:1.34.0
ports:
- "8000:8000"
environment:
LOCAL_BACKEND_API_KEY: ${LOCAL_BACKEND_API_KEY}
OH_SESSION_API_KEYS_0: ${LOCAL_BACKEND_API_KEY}
SESSION_API_KEY: ${LOCAL_BACKEND_API_KEY}
OH_SECRET_KEY: ${OH_SECRET_KEY}
OH_WEB_URL: ${OH_WEB_URL}
volumes:
- openhands-data:/home/openhands/.openhands
restart: always
healthcheck:
test: ["CMD-SHELL", "python3 -c \"import urllib.request; urllib.request.urlopen('http://localhost:8000/health')\" || exit 1"]
interval: 10s
timeout: 5s
retries: 5
start_period: 30s
volumes:
openhands-data:
Free IDE for Java, Kotlin, Go, TypeScript and Python. Built on IntelliJ Community, fully open source, 300+ plugins.
Show that OpenHands is listed as an open-source alternative. Paste into your README:
Ubuntu 24.04 · Apple container, Docker 29.1.3, Compose 2.40.3+ds1-0ubuntu1~24.04.1. Images pulled in 201 s: ghcr.io/openhands/agent-canvas:1.34.0.
Based on the upstream setup. Official Docker container for OpenHands Agent Canvas. Generated session and encryption keys for local auth. The /projects workspace mount and --privileged are dropped (the agent works only inside container storage and cannot run docker), the port is published on all interfaces instead of 127.0.0.1, and product telemetry is on unless AGENT_CANVAS_DISABLE_TELEMETRY=1.
openhands-1 | 2026-11-01T06:16:23.192142632Z at ServerResponse._storeHeader (node:_http_outgoing:476:11)
openhands-1 | 2026-11-01T06:16:23.192143799Z at ServerResponse.writeHead (node:_http_server:496:8)
openhands-1 | 2026-11-01T06:16:23.192144882Z at redirectToMountedPath (file:///opt/agent-canvas/static-server.mjs:581:7)
openhands-1 | 2026-11-01T06:16:23.192146132Z at handleStatic (file:///opt/agent-canvas/static-server.mjs:626:10)
openhands-1 | 2026-11-01T06:16:23.192147257Z at Server.<anonymous> (file:///opt/agent-canvas/static-server.mjs:729:5)
openhands-1 | 2026-11-01T06:16:23.192148757Z at Server.emit (node:events:514:28)
openhands-1 | 2026-11-01T06:16:23.192149882Z at parserOnIncoming (node:_http_server:1293:12)
openhands-1 | 2026-11-01T06:16:23.192153466Z at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17) {
openhands-1 | 2026-11-01T06:16:23.192154799Z code: 'ERR_INVALID_CHAR'
openhands-1 | 2026-11-01T06:16:23.192155841Z }
openhands-1 | 2026-11-01T06:16:23.193619966Z Static handler error for /%0A/interact.sh/: TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Location"]
openhands-1 | 2026-11-01T06:16:23.193627966Z at storeHeader (node:_http_outgoing:612:5)
openhands-1 | 2026-11-01T06:16:23.193629091Z at processHeader (node:_http_outgoing:607:3)
openhands-1 | 2026-11-01T06:16:23.193630049Z at ServerResponse._storeHeader (node:_http_outgoing:476:11)
openhands-1 | 2026-11-01T06:16:23.193631091Z at ServerResponse.writeHead (node:_http_server:496:8)
openhands-1 | 2026-11-01T06:16:23.193632257Z at redirectToMountedPath (file:///opt/agent-canvas/static-server.mjs:581:7)
openhands-1 | 2026-11-01T06:16:23.193633257Z at handleStatic (file:///opt/agent-canvas/static-server.mjs:626:10)
openhands-1 | 2026-11-01T06:16:23.193634216Z at Server.<anonymous> (file:///opt/agent-canvas/static-server.mjs:729:5)
openhands-1 | 2026-11-01T06:16:23.193635507Z at Server.emit (node:events:514:28)
openhands-1 | 2026-11-01T06:16:23.193636424Z at parserOnIncoming (node:_http_server:1293:12)
openhands-1 | 2026-11-01T06:16:23.193637341Z at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17) {
openhands-1 | 2026-11-01T06:16:23.193638632Z code: 'ERR_INVALID_CHAR'
openhands-1 | 2026-11-01T06:16:23.193639507Z }
openhands-1 | 2026-11-01T06:16:23.198450591Z Static handler error for /%00: TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Location"]
openhands-1 | 2026-11-01T06:16:23.198466424Z at storeHeader (node:_http_outgoing:612:5)
openhands-1 | 2026-11-01T06:16:23.198467382Z at processHeader (node:_http_outgoing:607:3)
openhands-1 | 2026-11-01T06:16:23.198468049Z at ServerResponse._storeHeader (node:_http_outgoing:476:11)
openhands-1 | 2026-11-01T06:16:23.198468674Z at ServerResponse.writeHead (node:_http_server:496:8)
openhands-1 | 2026-11-01T06:16:23.198469216Z at redirectToMountedPath (file:///opt/agent-canvas/static-server.mjs:581:7)
openhands-1 | 2026-11-01T06:16:23.198469757Z at handleStatic (file:///opt/agent-canvas/static-server.mjs:626:10)
openhands-1 | 2026-11-01T06:16:23.198470341Z at Server.<anonymous> (file:///opt/agent-canvas/static-server.mjs:729:5)
openhands-1 | 2026-11-01T06:16:23.198476757Z at Server.emit (node:events:514:28)
openhands-1 | 2026-11-01T06:16:23.198478132Z at parserOnIncoming (node:_http_server:1293:12)
openhands-1 | 2026-11-01T06:16:23.198478716Z at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17) {
openhands-1 | 2026-11-01T06:16:23.198479257Z code: 'ERR_INVALID_CHAR'
openhands-1 | 2026-11-01T06:16:23.198479799Z }
openhands-1 | 2026-11-01T06:16:23.199161341Z {"asctime": "2026-11-01 06:16:23,199", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/get_device_details HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/get_device_details", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:23.202036716Z Static handler error for /unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/etc/passwd: TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Location"]
openhands-1 | 2026-11-01T06:16:23.202044591Z at storeHeader (node:_http_outgoing:612:5)
openhands-1 | 2026-11-01T06:16:23.202045591Z at processHeader (node:_http_outgoing:607:3)
openhands-1 | 2026-11-01T06:16:23.202046299Z at ServerResponse._storeHeader (node:_http_outgoing:476:11)
openhands-1 | 2026-11-01T06:16:23.202046882Z at ServerResponse.writeHead (node:_http_server:496:8)
openhands-1 | 2026-11-01T06:16:23.202047591Z at redirectToMountedPath (file:///opt/agent-canvas/static-server.mjs:581:7)
openhands-1 | 2026-11-01T06:16:23.202048299Z at handleStatic (file:///opt/agent-canvas/static-server.mjs:626:10)
openhands-1 | 2026-11-01T06:16:23.202049007Z at Server.<anonymous> (file:///opt/agent-canvas/static-server.mjs:729:5)
openhands-1 | 2026-11-01T06:16:23.202049757Z at Server.emit (node:events:514:28)
openhands-1 | 2026-11-01T06:16:23.202050299Z at parserOnIncoming (node:_http_server:1293:12)
openhands-1 | 2026-11-01T06:16:23.202050799Z at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17) {
openhands-1 | 2026-11-01T06:16:23.202051299Z code: 'ERR_INVALID_CHAR'
openhands-1 | 2026-11-01T06:16:23.202051799Z }
openhands-1 | 2026-11-01T06:16:23.202507466Z Static handler error for /unauthenticated/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/..%01/etc/passwd: TypeError [ERR_INVALID_CHAR]: Invalid character in header content ["Location"]
openhands-1 | 2026-11-01T06:16:23.202514841Z at storeHeader (node:_http_outgoing:612:5)
openhands-1 | 2026-11-01T06:16:23.202515507Z at processHeader (node:_http_outgoing:607:3)
openhands-1 | 2026-11-01T06:16:23.202516007Z at ServerResponse._storeHeader (node:_http_outgoing:476:11)
openhands-1 | 2026-11-01T06:16:23.202516549Z at ServerResponse.writeHead (node:_http_server:496:8)
openhands-1 | 2026-11-01T06:16:23.202517049Z at redirectToMountedPath (file:///opt/agent-canvas/static-server.mjs:581:7)
openhands-1 | 2026-11-01T06:16:23.202523674Z at handleStatic (file:///opt/agent-canvas/static-server.mjs:626:10)
openhands-1 | 2026-11-01T06:16:23.202524424Z at Server.<anonymous> (file:///opt/agent-canvas/static-server.mjs:729:5)
openhands-1 | 2026-11-01T06:16:23.202525091Z at Server.emit (node:events:514:28)
openhands-1 | 2026-11-01T06:16:23.202525632Z at parserOnIncoming (node:_http_server:1293:12)
openhands-1 | 2026-11-01T06:16:23.202526132Z at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17) {
openhands-1 | 2026-11-01T06:16:23.202526674Z code: 'ERR_INVALID_CHAR'
openhands-1 | 2026-11-01T06:16:23.202527174Z }
openhands-1 | 2026-11-01T06:16:23.202954382Z {"asctime": "2026-11-01 06:16:23,202", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/jolokia/read%3Csvg%20onload%3Dalert%28document.domain%29%3E?mimeType=text/html HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/jolokia/read%3Csvg%20onload%3Dalert%28document.domain%29%3E?mimeType=text/html", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:23.203493216Z {"asctime": "2026-11-01 06:16:23,203", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/jolokia/read%3Csvg%20onload%3Dalert%28document.domain%29%3E?mimeType=text/html HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/jolokia/read%3Csvg%20onload%3Dalert%28document.domain%29%3E?mimeType=text/html", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.177524008Z {"asctime": "2026-11-01 06:16:24,172", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/search?type=dash-db HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/search?type=dash-db", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.177571841Z {"asctime": "2026-11-01 06:16:24,173", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/search?type=dash-db HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/search?type=dash-db", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.180820049Z {"asctime": "2026-11-01 06:16:24,180", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/dashboards/home HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/dashboards/home", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.183438799Z {"asctime": "2026-11-01 06:16:24,183", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/dashboards/home HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/dashboards/home", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.194080341Z {"asctime": "2026-11-01 06:16:24,193", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/org HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/org", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.196472091Z {"asctime": "2026-11-01 06:16:24,196", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/%3Cimg%20src%3D%22%22%20onerror%3Dalert%28document.domain%29%3E HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/%3Cimg%20src%3D%22%22%20onerror%3Dalert%28document.domain%29%3E", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:24.196764091Z {"asctime": "2026-11-01 06:16:24,196", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/%3Cimg%20src%3D%22%22%20onerror%3Dalert%28document.domain%29%3E HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/%3Cimg%20src%3D%22%22%20onerror%3Dalert%28document.domain%29%3E", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.178264508Z {"asctime": "2026-11-01 06:16:25,172", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/userlist?pageindex=0&pagesize=10 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/userlist?pageindex=0&pagesize=10", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.178296675Z {"asctime": "2026-11-01 06:16:25,173", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/v1/userlist?pageindex=0&pagesize=10 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/v1/userlist?pageindex=0&pagesize=10", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.179826300Z {"asctime": "2026-11-01 06:16:25,179", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/users HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/users", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.181364717Z {"asctime": "2026-11-01 06:16:25,180", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/model_report/file/download?index=/&ext=/etc/passwd HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/model_report/file/download?index=/&ext=/etc/passwd", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.181376508Z {"asctime": "2026-11-01 06:16:25,181", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /api/org HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/api/org", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.181727342Z {"asctime": "2026-11-01 06:16:25,181", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/model_report/file/download?index=/&ext=/etc/passwd HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/model_report/file/download?index=/&ext=/etc/passwd", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.188567592Z {"asctime": "2026-11-01 06:16:25,188", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/users HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/users", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.189245258Z {"asctime": "2026-11-01 06:16:25,189", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /api/v1/repos/search?q=%27)%09UNION%09SELECT%09*%09FROM%09(SELECT%09null)%09AS%09a1%09%09JOIN%09(SELECT%091)%09as%09u%09JOIN%09(SELECT%09user())%09AS%09b1%09JOIN%09(SELECT%09user())%09AS%09b2%09JOIN%09(SELECT%09null)%09as%09a3%09%09JOIN%09(SELECT%09null)%09as%09a4%09%09JOIN%09(SELECT%09null)%09as%09a5%09%09JOIN%09(SELECT%09null)%09as%09a6%09%09JOIN%09(SELECT%09null)%09as%09a7%09%09JOIN%09(SELECT%09null)%09as%09a8%09%09JOIN%09(SELECT%09null)%09as%09a9%09JOIN%09(SELECT%09null)%09as%09a10%09JOIN%09(SELECT%09null)%09as%09a11%09JOIN%09(SELECT%09null)%09as%09a12%09JOIN%09(SELECT%09null)%09as%09a13%09%09JOIN%09(SELECT%09null)%09as%09a14%09%09JOIN%09(SELECT%09null)%09as%09a15%09%09JOIN%09(SELECT%09null)%09as%09a16%09%09JOIN%09(SELECT%09null)%09as%09a17%09%09JOIN%09(SELECT%09null)%09as%09a18%09%09JOIN%09(SELECT%09null)%09as%09a19%09%09JOIN%09(SELECT%09null)%09as%09a20%09%09JOIN%09(SELECT%09null)%09as%09a21%09%09JOIN%09(SELECT%09null)%09as%09a22%09where%09(%27%25%27=%27 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/api/v1/repos/search?q=%27)%09UNION%09SELECT%09*%09FROM%09(SELECT%09null)%09AS%09a1%09%09JOIN%09(SELECT%091)%09as%09u%09JOIN%09(SELECT%09user())%09AS%09b1%09JOIN%09(SELECT%09user())%09AS%09b2%09JOIN%09(SELECT%09null)%09as%09a3%09%09JOIN%09(SELECT%09null)%09as%09a4%09%09JOIN%09(SELECT%09null)%09as%09a5%09%09JOIN%09(SELECT%09null)%09as%09a6%09%09JOIN%09(SELECT%09null)%09as%09a7%09%09JOIN%09(SELECT%09null)%09as%09a8%09%09JOIN%09(SELECT%09null)%09as%09a9%09JOIN%09(SELECT%09null)%09as%09a10%09JOIN%09(SELECT%09null)%09as%09a11%09JOIN%09(SELECT%09null)%09as%09a12%09JOIN%09(SELECT%09null)%09as%09a13%09%09JOIN%09(SELECT%09null)%09as%09a14%09%09JOIN%09(SELECT%09null)%09as%09a15%09%09JOIN%09(SELECT%09null)%09as%09a16%09%09JOIN%09(SELECT%09null)%09as%09a17%09%09JOIN%09(SELECT%09null)%09as%09a18%09%09JOIN%09(SELECT%09null)%09as%09a19%09%09JOIN%09(SELECT%09null)%09as%09a20%09%09JOIN%09(SELECT%09null)%09as%09a21%09%09JOIN%09(SELECT%09null)%09as%09a22%09where%09(%27%25%27=%27", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.189567300Z {"asctime": "2026-11-01 06:16:25,189", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/change_setting?second_value=no_reload&disable_sequence=true&value=../../../../../../../etc/passwd HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/change_setting?second_value=no_reload&disable_sequence=true&value=../../../../../../../etc/passwd", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.194314092Z {"asctime": "2026-11-01 06:16:25,194", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/datasources HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/datasources", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.195079883Z {"asctime": "2026-11-01 06:16:25,194", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /api/change_setting?second_value=no_reload&disable_sequence=true&value=../../../../../../../etc/passwd HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/api/change_setting?second_value=no_reload&disable_sequence=true&value=../../../../../../../etc/passwd", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.199390258Z {"asctime": "2026-11-01 06:16:25,199", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /api/datasources HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/api/datasources", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.200912758Z {"asctime": "2026-11-01 06:16:25,200", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/frontend/settings HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/frontend/settings", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.202329842Z {"asctime": "2026-11-01 06:16:25,202", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/v1/repos/search?q=%27)%09UNION%09SELECT%09*%09FROM%09(SELECT%09null)%09AS%09a1%09%09JOIN%09(SELECT%091)%09as%09u%09JOIN%09(SELECT%09user())%09AS%09b1%09JOIN%09(SELECT%09user())%09AS%09b2%09JOIN%09(SELECT%09null)%09as%09a3%09%09JOIN%09(SELECT%09null)%09as%09a4%09%09JOIN%09(SELECT%09null)%09as%09a5%09%09JOIN%09(SELECT%09null)%09as%09a6%09%09JOIN%09(SELECT%09null)%09as%09a7%09%09JOIN%09(SELECT%09null)%09as%09a8%09%09JOIN%09(SELECT%09null)%09as%09a9%09JOIN%09(SELECT%09null)%09as%09a10%09JOIN%09(SELECT%09null)%09as%09a11%09JOIN%09(SELECT%09null)%09as%09a12%09JOIN%09(SELECT%09null)%09as%09a13%09%09JOIN%09(SELECT%09null)%09as%09a14%09%09JOIN%09(SELECT%09null)%09as%09a15%09%09JOIN%09(SELECT%09null)%09as%09a16%09%09JOIN%09(SELECT%09null)%09as%09a17%09%09JOIN%09(SELECT%09null)%09as%09a18%09%09JOIN%09(SELECT%09null)%09as%09a19%09%09JOIN%09(SELECT%09null)%09as%09a20%09%09JOIN%09(SELECT%09null)%09as%09a21%09%09JOIN%09(SELECT%09null)%09as%09a22%09where%09(%27%25%27=%27 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/v1/repos/search?q=%27)%09UNION%09SELECT%09*%09FROM%09(SELECT%09null)%09AS%09a1%09%09JOIN%09(SELECT%091)%09as%09u%09JOIN%09(SELECT%09user())%09AS%09b1%09JOIN%09(SELECT%09user())%09AS%09b2%09JOIN%09(SELECT%09null)%09as%09a3%09%09JOIN%09(SELECT%09null)%09as%09a4%09%09JOIN%09(SELECT%09null)%09as%09a5%09%09JOIN%09(SELECT%09null)%09as%09a6%09%09JOIN%09(SELECT%09null)%09as%09a7%09%09JOIN%09(SELECT%09null)%09as%09a8%09%09JOIN%09(SELECT%09null)%09as%09a9%09JOIN%09(SELECT%09null)%09as%09a10%09JOIN%09(SELECT%09null)%09as%09a11%09JOIN%09(SELECT%09null)%09as%09a12%09JOIN%09(SELECT%09null)%09as%09a13%09%09JOIN%09(SELECT%09null)%09as%09a14%09%09JOIN%09(SELECT%09null)%09as%09a15%09%09JOIN%09(SELECT%09null)%09as%09a16%09%09JOIN%09(SELECT%09null)%09as%09a17%09%09JOIN%09(SELECT%09null)%09as%09a18%09%09JOIN%09(SELECT%09null)%09as%09a19%09%09JOIN%09(SELECT%09null)%09as%09a20%09%09JOIN%09(SELECT%09null)%09as%09a21%09%09JOIN%09(SELECT%09null)%09as%09a22%09where%09(%27%25%27=%27", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:25.204518592Z {"asctime": "2026-11-01 06:16:25,204", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/frontend/settings HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/frontend/settings", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:26.182738592Z {"asctime": "2026-11-01 06:16:26,181", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/v1/applications HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/v1/applications", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:26.185022759Z {"asctime": "2026-11-01 06:16:26,184", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/v1/applications HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/v1/applications", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:26.187599675Z {"asctime": "2026-11-01 06:16:26,187", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/dp/rptsvcsyncpoint?ccid=1 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/dp/rptsvcsyncpoint?ccid=1", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:26.189515842Z {"asctime": "2026-11-01 06:16:26,189", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /api/dp/rptsvcsyncpoint?ccid=1 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/api/dp/rptsvcsyncpoint?ccid=1", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:26.652669592Z {"asctime": "2026-11-01 06:16:26,652", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46148 - \"GET /health HTTP/1.1\" 200", "http.client_ip": "127.0.0.1:46148", "http.method": "GET", "http.url": "/health", "http.version": "1.1", "http.status_code": 200}
openhands-1 | 2026-11-01T06:16:27.172252718Z {"asctime": "2026-11-01 06:16:27,170", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/metrics HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/metrics", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.175159801Z {"asctime": "2026-11-01 06:16:27,174", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/metrics HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/metrics", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.182239009Z {"asctime": "2026-11-01 06:16:27,182", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/data?chart=system.cpu&format=json&points=125&group=average>ime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-120&dimensions=iowait HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/data?chart=system.cpu&format=json&points=125&group=average>ime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-120&dimensions=iowait", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.184138051Z {"asctime": "2026-11-01 06:16:27,183", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/data?chart=system.cpu&format=json&points=125&group=average>ime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-120&dimensions=iowait HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/data?chart=system.cpu&format=json&points=125&group=average>ime=0&options=ms%7Cflip%7Cjsonwrap%7Cnonzero&after=-120&dimensions=iowait", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.191780218Z {"asctime": "2026-11-01 06:16:27,191", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/kernels HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/kernels", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.192310384Z {"asctime": "2026-11-01 06:16:27,192", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/4/config HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/4/config", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.197499551Z {"asctime": "2026-11-01 06:16:27,197", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/4/config HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/4/config", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.198863009Z {"asctime": "2026-11-01 06:16:27,198", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/kernels HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/kernels", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.201245509Z {"asctime": "2026-11-01 06:16:27,201", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/tags HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/tags", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.201252051Z {"asctime": "2026-11-01 06:16:27,201", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/confup?mode=lean&uid=1'%20UNION%20select%201,2,3,sqlite_version();-- HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/confup?mode=lean&uid=1'%20UNION%20select%201,2,3,sqlite_version();--", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:27.201498593Z {"asctime": "2026-11-01 06:16:27,201", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/confup?mode=lean&uid=1'%20UNION%20select%201,2,3,sqlite_version();-- HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/confup?mode=lean&uid=1'%20UNION%20select%201,2,3,sqlite_version();--", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:28.175817468Z {"asctime": "2026-11-01 06:16:28,175", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/tags HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/tags", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:28.194255593Z {"asctime": "2026-11-01 06:16:28,194", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/monitor/messages HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/monitor/messages", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:28.194443218Z {"asctime": "2026-11-01 06:16:28,194", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/v1/monitor/messages HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/v1/monitor/messages", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.185166385Z {"asctime": "2026-11-01 06:16:29,184", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/v1/workflows/argo HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/v1/workflows/argo", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.185851343Z {"asctime": "2026-11-01 06:16:29,185", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/workflows/argo HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/workflows/argo", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.186824802Z {"asctime": "2026-11-01 06:16:29,186", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/v1/ndconfig?mode&uid=1'%20UNION%20select%201,2,3,sqlite_version();-- HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/v1/ndconfig?mode&uid=1'%20UNION%20select%201,2,3,sqlite_version();--", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.188798927Z {"asctime": "2026-11-01 06:16:29,188", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/v1/ndconfig?mode&uid=1'%20UNION%20select%201,2,3,sqlite_version();-- HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/v1/ndconfig?mode&uid=1'%20UNION%20select%201,2,3,sqlite_version();--", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.196727052Z {"asctime": "2026-11-01 06:16:29,196", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46142 - \"GET /api/trpc/integration.all HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46142", "http.method": "GET", "http.url": "/api/trpc/integration.all", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.197289469Z {"asctime": "2026-11-01 06:16:29,197", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/experimental/patternfile?order=id%3Bselect(md5(999999999))&page=0&page_size=0 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/experimental/patternfile?order=id%3Bselect(md5(999999999))&page=0&page_size=0", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.197636677Z {"asctime": "2026-11-01 06:16:29,197", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/trpc/integration.all HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/trpc/integration.all", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.198139094Z {"asctime": "2026-11-01 06:16:29,198", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:34954 - \"GET /api/experimental/patternfile?order=id%3Bselect(md5(999999999))&page=0&page_size=0 HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:34954", "http.method": "GET", "http.url": "/api/experimental/patternfile?order=id%3Bselect(md5(999999999))&page=0&page_size=0", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.201009760Z {"asctime": "2026-11-01 06:16:29,200", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:34954 - \"GET /api/setup-complete HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:34954", "http.method": "GET", "http.url": "/api/setup-complete", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.201773427Z {"asctime": "2026-11-01 06:16:29,201", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:34954 - \"GET /api/setup-complete HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:34954", "http.method": "GET", "http.url": "/api/setup-complete", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.204300260Z {"asctime": "2026-11-01 06:16:29,204", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:34954 - \"GET /api/v1/messages HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:34954", "http.method": "GET", "http.url": "/api/v1/messages", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.205469719Z {"asctime": "2026-11-01 06:16:29,205", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:34954 - \"GET /api/v1/messages HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:34954", "http.method": "GET", "http.url": "/api/v1/messages", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.206332052Z {"asctime": "2026-11-01 06:16:29,206", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:46158 - \"GET /api/logout?redirect_to=http://oast.pro/ HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:46158", "http.method": "GET", "http.url": "/api/logout?redirect_to=http://oast.pro/", "http.version": "1.1", "http.status_code": 404}
openhands-1 | 2026-11-01T06:16:29.206350260Z {"asctime": "2026-11-01 06:16:29,206", "levelname": "INFO", "name": "uvicorn.access", "message": "127.0.0.1:59734 - \"GET /api/logout?redirect_to=http://oast.pro/ HTTP/1.1\" 404", "http.client_ip": "127.0.0.1:59734", "http.method": "GET", "http.url": "/api/logout?redirect_to=http://oast.pro/", "http.version": "1.1", "http.status_code": 404}