{"slug": "ulka-browser-agent-powered-by-jev-and-fx-sh-experimental", "title": "Ulka: Browser agent powered by Jev and fx.sh (experimental)", "summary": "Developer razaanstha released Ulka, an experimental browser-agent extension that runs locally in Chromium-based browsers and routes model requests through the user's own Vercel AI Gateway API key. Ulka pairs the fx orchestration engine with Jev (typesafe-ai/jev) for constrained action selection and uses the zai/glm-5.2-fast language model, reading Chromium's accessibility tree to validate targets, request approvals, and record evidence. The preview requires Bun 1.4.2, a Chromium browser with side panels and the debugger API, and a Gateway key, and the developer warns users to supervise it, especially on signed-in sites.", "body_md": "[https://x.com/razaanstha/status/2100708222847853043](https://x.com/razaanstha/status/2100708222847853043)\n\n**Experimental:** Ulka is an early preview. Expect bugs and incomplete tasks. Supervise browser actions and review results.\n\n- **FX** orchestrates browser tasks and tool calls.\n- **Jev** (`typesafe-ai/jev` ) selects constrained browser actions from observed page elements.\n- **Vercel AI Gateway** routes AI requests using the user's API key.\n- **Ulka browser runtime** reads Chromium’s accessibility tree for roles, names, states, and UI hierarchy, validates targets, requests approvals, executes actions, and records evidence.\n\nAn experimental browser-agent extension. Runs locally in your browser, with model requests sent through Vercel AI Gateway. No application backend required.\n\nfx plans browser subgoals, GLM handles language tasks, and Jev selects constrained actions from observed page elements. Ulka validates targets, executes browser actions, and checks outcomes. It can still make mistakes: supervise it, especially on signed-in sites.\n\nRequirements: [Bun](https://bun.sh) 1.4.2, a Chromium-based browser with side panels and the debugger API, and your own [Vercel AI Gateway](https://vercel.com/ai-gateway) key with access to the configured models. Development has been tested in Helium on macOS. Other browsers/platforms are not yet verified. Run the commands below from the repository root.\n\n```\nbun install --frozen-lockfile\nbun run build\n```\n\n1. Open your browser's extensions page (`helium://extensions` or`chrome://extensions` ).\n2. Enable Developer mode, choose **Load unpacked** , and select`apps/extension/dist` .\n3. Open Ulka's side panel, click **··· (Settings)** , paste your**Gateway API key** , and click**Save** . The status should say**Saved** .\n4. Start with a low-risk task, such as opening Wikipedia and summarizing an article.\n\nYou can add or replace the key in Settings at any time. **No rebuild or extension reload is needed for key changes.** New requests use the saved key; stop an active task before replacing it. The key persists in this browser profile only. Each user supplies their own key, and no key belongs in source code, build files, or an `.env` file. **Saved** confirms local storage, not whether the key or model access is valid.\n\nAfter rebuilding code, reload the extension **and refresh existing web pages** to update the injected progress controls. A separate test browser profile is recommended.\n\nThe default **fx + Jev** engine requires WebAssembly JSPI. If unsupported, select **Classic** in advanced settings. WASM is bundled at build time; it is not fetched as executable code at runtime.\n\nChoose **Settings → Tab behavior → Background** before starting a task. Start on the tab Ulka should use, then switch to another tab to keep browsing. Ulka keeps its task target, creates inactive tabs, and switches its own target without activating tabs. The setting applies to both engines and is fixed for each running task. Keep the side panel open for progress and approvals. Foreground remains the default.\n\nBackground mode uses the original task tab, not a duplicate. Some sites may pause work when hidden or require visible interaction; background compatibility is not guaranteed. Closing the current task tab stops work.\n\n- Language model: `zai/glm-5.2-fast` , configured in`apps/extension/src/agent/models.ts` .\n- Action selection: `typesafe-ai/jev` , configured in`apps/extension/src/agent/vercel-jev.ts` .\n- Model availability and usage costs depend on Gateway and its providers. No subscriptions or credits are included.\n\nSupported tools include page reading, typing, clicks, keyboard input, scrolling, navigation, tab creation/switching/grouping, download-link clicks, and download metadata. Conversations are saved locally. Streamed answers support Markdown; exposed reasoning is shown separately when available.\n\nAccessibility semantics drive observation; DOM nodes provide execution targets and last-moment validation. Disabled, occluded, and offscreen accessibility controls remain context without executable actions. Diagnostics report `accessibility` or `dom-fallback` when Chromium cannot provide a tree. There are no dedicated Facebook, X, or flight-booking scripts. Iframes, shadow DOM, complex widgets, browser-internal pages, and native browser menus have limited or no support. Verification is model-based, not proof that a task succeeded. Stop or Take over cancels the run; it does not undo completed actions.\n\nPage text, element labels, relevant field values, task history, and your messages may be sent to Gateway and its selected model providers. This is **not an offline assistant**.\n\nThe Gateway key, chats, and diagnostic events live in `chrome.storage.local`. The key is not an encrypted secret vault. Use a personal, limited-budget key. Never share it or put it in source files.\n\nPermissions: `debugger` executes and observes page actions; `tabs` and `tabGroups` manage tabs; `downloads` reads download status; `storage` saves local settings/history; `sidePanel` provides the UI; `activeTab` supports current-tab access. HTTP(S) content scripts display progress controls. Gateway host access permits model requests.\n\nApproval checks are heuristic and not a comprehensive security boundary. Do not rely on them to protect sensitive accounts or prevent every destructive action. See [SECURITY.md](https://github.com/razaanstha/ulka/blob/main/SECURITY.md).\n\n```\nbun run check\nbun run test-page\n```\n\n`check` runs typechecking, builds the extension, then runs tests. `bun run scripts/smoke-accessibility.ts` additionally tests delayed chat opening and editor targeting in isolated headless Chrome (set `BROWSER_BINARY` when Chrome is installed elsewhere). Build must precede tests because asset tests inspect `dist`. The optional fixture server runs at `http://localhost:8765`; override with `PORT`.\n\n- `apps/extension/src/agent` : observation, execution, orchestration, verification.\n- `apps/extension/src` : background worker, chat UI, progress controls, diagnostics.\n- `apps/extension/public` : manifest, styles, icons.\n- `packages/protocol` : shared schemas and types.\n- `tests` : unit tests and local page fixtures.\n\nSee [CONTRIBUTING.md](https://github.com/razaanstha/ulka/blob/main/CONTRIBUTING.md). Generated output and dependencies are ignored; keep them out of commits.\n\nUse settings → **Download logs** after a failure. Include reproduction steps, browser version, build ID, and expected versus actual behavior. Review logs before sharing: redaction is best-effort, and error/reason strings can include page-derived information. Never attach browser profiles, API keys, or private conversation exports.\n\nEach completed task logs `model_usage_summary`, with reported input/output tokens separated into FX turns, Jev evaluations, text generation, and verification (plus Classic planning/page answers when used). Missing provider usage is counted explicitly; totals are not a billing estimate and may exclude failed requests or provider-internal retries.\n\n`model_unavailable` / `system_overloaded` indicates a provider failure. A blocked result can also mean stale targets, missing approvals, unsuccessful verification, or a bounded retry/scroll limit. Automated tests do not establish live-site compatibility.\n\nUlka's original code, documentation, logo, and derived icons are licensed under the [MIT License](https://github.com/razaanstha/ulka/blob/main/LICENSE). Dependencies retain their own licenses; see [THIRD_PARTY_NOTICES.md](https://github.com/razaanstha/ulka/blob/main/THIRD_PARTY_NOTICES.md).", "url": "https://wpnews.pro/news/ulka-browser-agent-powered-by-jev-and-fx-sh-experimental", "canonical_source": "https://github.com/razaanstha/ulka", "published_at": "2026-09-18 11:24:15+00:00", "updated_at": "2026-09-18 11:56:10.152559+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "ai-products", "large-language-models", "developer-tools"], "entities": ["Ulka", "Jev", "Vercel AI Gateway", "razaanstha", "typesafe-ai/jev", "zai/glm-5.2-fast", "Bun"], "alternates": {"html": "https://wpnews.pro/news/ulka-browser-agent-powered-by-jev-and-fx-sh-experimental", "markdown": "https://wpnews.pro/news/ulka-browser-agent-powered-by-jev-and-fx-sh-experimental.md", "text": "https://wpnews.pro/news/ulka-browser-agent-powered-by-jev-and-fx-sh-experimental.txt", "jsonld": "https://wpnews.pro/news/ulka-browser-agent-powered-by-jev-and-fx-sh-experimental.jsonld"}}