--- title: Limits and behaviors | Lightcone description: Platform behaviors and constraints you'll hit in practice, grouped by area, each with a workaround. --- This page collects platform behaviors that aren’t obvious from the API surface. Read it before debugging; most “why is it doing that?” moments are listed here. ## Browser sessions | Behavior | Details | What to do | | --------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- | | Google domains blocked | Navigation to `google.com` and its subdomains is blocked (URLs merely containing `google.com`, like redirect params, are fine) | Use a different search engine, e.g. Bing or DuckDuckGo | | `chrome://` URLs blocked | Internal browser pages can’t be navigated to | Use API endpoints for browser state (e.g. `/tabs` for tab info) | | Max 5 tabs | Opening a sixth tab fails; the last remaining tab can’t be closed | Close tabs you’re done with; reuse a tab by navigating it | | No `right_click` | Right-click is not supported in browser sessions and returns a not-supported error | Use keyboard shortcuts or in-page UI instead; or use a desktop session | | Downloads disabled | The browser denies all file downloads | Fetch the file’s URL with a shell `curl` on a desktop session, or extract content via `html()` | | HTML is cached \~2 s | `html()` responses are cached for 2 seconds per URL | Wait 2 s (or navigate) before re-reading if you need fresh DOM | | Typing is per-keystroke | `type()` sends real keystrokes at \~100 characters/second | Budget \~1 s per 100 chars; don’t set tight `timeout_ms` on long text | | Navigation waits for network idle | `navigate()` waits for network idle up to 5 s, then returns anyway | For slow SPAs, add a short `wait()` and screenshot to confirm rendering | ## Desktop sessions | Behavior | Details | What to do | | ------------------------------------ | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | | Scrolling is quantized | Scroll deltas snap to \~50 px wheel clicks | Use deltas that are multiples of 50; verify position with a screenshot | | Uploads land in `/workspace/uploads` | File uploads go there; max 512 MB per file, transferred in 8 MB chunks | Reference uploaded files by that path in shell commands and apps | | No file-download action | There’s no action that returns a file from the machine | Return small files via shell stdout (`base64 file.bin`); capture images via screenshots | | Firefox may ignore `navigate` | Desktop Firefox sometimes doesn’t react to the navigate action | Fall back to `hotkey(["ctrl", "l"])`, type the URL, press Enter | | Shell cwd is `/workspace` | `exec` commands run in `/workspace` unless you pass `cwd` | Pass `cwd` explicitly or use absolute paths | ## Sessions | Behavior | Details | What to do | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------- | | Idle reaping | Sessions terminate after `inactivity_timeout_seconds` with no activity. Any executed action (screenshots included) or a `keepalive` call resets the clock, but if you pause between calls longer than the idle window, the session is reaped | Set `inactivity_timeout_seconds` to 20+ minutes for interactive development; call `keep_alive()` during long pauses | | Hard lifetime cap | `max_lifetime_seconds` always applies, regardless of activity | Set it to cover your longest expected run; save state with `persistent=True` if you need to resume | | One action at a time | Actions on a session are serialized; concurrent requests queue and can hit the timeout | Await each action before sending the next; use [batch](/guides/computers#batch-actions/index.md) for sequences | ## Actions | Behavior | Details | What to do | | --------------------------------- | ------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | | Coordinates are screenshot pixels | `x`/`y` are pixel positions in the screenshot’s coordinate space | Take a fresh screenshot before clicking; don’t hardcode coordinates | | Per-action timeout | Each action accepts a `timeout_ms` | Raise it for slow operations (long typing, heavy pages) | | Batch stops on first error | A batch executes in order, stops at the first failure, and returns the results so far | Check `executed` vs `total` in the response and resume from the failed action | ## Screenshots | Behavior | Details | What to do | | -------------- | ------------------------------------------------------- | -------------------------------------------------------------------- | | Presigned URLs | Screenshot URLs are presigned and expire after \~7 days | Download images you want to keep when you receive them | | JPEG format | Screenshots are JPEG-compressed | Fine for vision models and review; don’t expect pixel-exact fidelity | ## Concurrency | Behavior | Details | What to do | | ------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | | Concurrent computer limit | The number of simultaneously running computers is plan-dependent; exceeding it returns a 429 with “Concurrent limit reached” | Delete computers when done, retry with backoff, or upgrade your plan in the [dashboard](https://lightcone.ai/dashboard) | If a session behaves unexpectedly and it isn’t listed here, watch it happen: every computer has a live view at `https://lightcone.ai/c/{computer_id}`. See [Observability](/guides/observability/index.md). ## See also - [**Computers**](/guides/computers/index.md): computer lifecycle and actions - [**Observability**](/guides/observability/index.md): live view, screencast, and traces - [**Shell commands**](/guides/shell-commands/index.md): run terminal commands - [**Troubleshooting**](/guides/troubleshooting/index.md): common issues and solutions