wooden-umbrella-84098
04/16/2026, 11:32 PMmodern-fireman-99755
04/17/2026, 5:46 AMchilly-france-44439
04/17/2026, 1:31 PMwooden-umbrella-84098
04/17/2026, 7:08 PMwooden-umbrella-84098
04/17/2026, 7:08 PMwooden-umbrella-84098
04/17/2026, 7:25 PMnutritious-balloon-65098
04/17/2026, 7:25 PMnutritious-balloon-65098
04/17/2026, 7:32 PMopenhands_cli/entrypoint.py
◦ openhands_cli/tui/textual_app.py
◦ openhands_cli/version_check.py
◦ openhands_cli/stores/agent_store.py
◦ openhands_cli/tui/modals/settings/settings_screen.py
• I measured likely startup contributors and found:
◦ the current update check is a blocking PyPI HTTP request, not a pip subprocess
◦ it is still worth moving to the background, but it is not the main steady-state cost
◦ the largest cost is eager SDK imports plus repeated agent/context initialization
◦ MCP is not the issue when disabled
• My conclusion was:
◦ current best-case startup is roughly ~4s
◦ with bad update-check/network conditions, it can drift toward ~6s
◦ a realistic optimized target is ~0.5–1.0s to first usable UI
• Highest-ROI improvements I identified:
a. lazy-load heavy SDK/store imports
b. replace full load_or_create() checks with a lightweight startup preflight
c. avoid repeated agent/context loading during startup
d. move update checking to the background, ideally with caching
e. defer non-essential splash metadata until after first paint
Checklist:
• wooden-umbrella-84098
04/17/2026, 7:48 PMnutritious-balloon-65098
04/17/2026, 7:48 PMnutritious-balloon-65098
04/17/2026, 7:51 PMwooden-umbrella-84098
04/17/2026, 7:52 PMnutritious-balloon-65098
04/17/2026, 7:52 PMnutritious-balloon-65098
04/17/2026, 8:14 PMtests/tui/core/test_user_message_controller.py
• Pyright reports that _FakeRunners is being passed where UserMessageController expects a RunnerRegistry
• This occurs in 3 test call sites Conciseness • No additional code or unrelated edits were made after the previous summary.
• So there are no extra changes to revert from this latest activity. What remains To fully close this out, the test typing needs a small follow-up fix, then pyright/pre-commit should be rerun.nutritious-balloon-65098
04/17/2026, 8:16 PMruff-check auto-modified files.
• That means there is likely a new uncommitted lint-only change in the working tree that still needs to be reviewed and either committed or reverted, then hooks rerun. Conciseness • nutritious-balloon-65098
04/17/2026, 8:17 PMtests/tui/core/test_user_message_controller.py by explicitly casting the fake runner registry at the UserMessageController(...) call sites so pyright accepts the test double.
• Absorbed the subsequent Ruff auto-fix (a formatting-only blank-line change) and amended the follow-up commit.
Status:
• 23e8f2b — tests: satisfy pyright for startup controller fakes
So yes: the remaining issue after the earlier summary has been completely addressed, and the incremental changes were minimal and targeted.nutritious-balloon-65098
04/17/2026, 8:53 PMopenhands-workspace... branchmaintui/nonblocking-startup
• Draft PR: https://github.com/OpenHands/OpenHands-CLI/pull/679 Conciseness • wooden-umbrella-84098
04/17/2026, 9:37 PMwooden-umbrella-84098
04/17/2026, 9:38 PMnutritious-balloon-65098
04/17/2026, 9:38 PMlittle-architect-38123
04/17/2026, 9:39 PMlittle-architect-38123
04/17/2026, 9:39 PMnutritious-balloon-65098
04/17/2026, 9:43 PM_print_banner() is called.
• Verified from openhands/sdk/__init__.py that the SDK imports a large portion of its public surface first, then prints the banner at the end.
• Measured startup/import timing with python -X importtime and found the banner is delayed by about 2.9s of import work.
• Identified the main startup contributors before the banner:
◦ openhands.sdk.agent.agent
◦ openhands.sdk.security / event stack
◦ openhands.sdk.llm
◦ litellm
◦ conversation implementations
◦ skills/plugin/MCP-related imports
◦ logger setup and observability-related imports
• Confirmed that suppressing the banner does not materially improve startup time, which further shows the problem is the import graph, not printing.
Checklist:
• The banner prints late because importingeagerly initializes a large part of the SDK—especially Agent, LiteLLM/LLM, security/event, conversation, and plugin/MCP code—beforeopenhands.sdkis reached. The banner itself is cheap; the import-time framework bootstrap is what takes so long._print_banner()
little-architect-38123
04/17/2026, 9:55 PMsalmon-lock-64866
04/18/2026, 1:59 AMbland-bear-604
04/23/2026, 6:58 PMtui: move startup warmup off the critical path)
• that PR was later closed after local testing suggested it made ~0 difference, with the conclusion that SDK warmup / eager imports are now the real limiter
• I didn’t find an existing SDK issue tracking that root cause, so I opened software-agent-sdk#2930 to track the underlying blocker
So current state is:
1. CLI-side startup work was investigated and partially attempted
2. the remaining bottleneck now looks tracked on the SDK side
3. I’m not seeing an open SDK PR for that root cause yet
Small cat verdict: the prey has moved from CLI startup polish to SDK import-time weight. 🐾quick-window-91705
04/23/2026, 7:06 PMsalmon-lock-64866
04/23/2026, 11:04 PM