README.md
September 21, 2026 · View on GitHub
Your browser's next move. Chosen by Jev.
Aside observes the page and executes.
Jev picks the next action from your defined candidates.
Quick start · How it works · Speed duel · Latency · Install the extension · Validation
Aside Jev connects the Aside REPL with TypeSafe Jev. A toolbar toggle, a persistent REPL session, and bounded action selection work together in one browser workflow.
Current status: 0.2.0 source preview · not yet released
ON applies to new task instructions and the extension-specific MCP for the selected Aside account.jev_browser_rundelegates action selection to Jev. The extension does not intercept all built-in Aside tools.
Same Jev. Two strategies. One race.
New SDK client per request vs connection reuse. Watch both lanes on the same time scale, then compare p50, p95, and TCP connections.
20-second video · 1080p MP4 · Still image · 한국어 영상 · Remotion source & reproduction
What this measures: both methods use the same Jev SDK in a localhost transport benchmark. Actual browser task speed with the default Aside model versus Jev has not been measured. This animation expands measured p50 values; it is not a screen recording. Method and limitations
The dashboard and extension popup default to English. Choose Korean in the English / 한국어 menu; each surface remembers your selection. Localization guide
Small candidate sets. Clear execution.
| Bounded decisions | Grounded actions | Visible state |
|---|---|---|
| Compact the relevant observation and send only allowed candidates to Jev. | Use targets observed on the current page and check again before execution. | Inspect ON/OFF, connectivity, confidence, and timing. |
| The model does not invent code, selectors, or input values. | Stop on repetition, no progress, or stale observations. | Errors never silently switch to another model. |
See the decision
Actual local UI in demo mode. It displays candidate selection and timing; this screen does not automatically execute browser actions.
Keep the goal and candidates in the main workspace, with longer observations and model settings in a separate panel. Results show candidate probabilities, decision time, round-trip time, and the latest 20 records from the current session.
One connection. A continuous decision loop.
flowchart LR
A["Aside REPL<br/>Observe current page"] --> B["Compact context<br/>Build allowed candidates"]
B --> C["Jev<br/>Choose a candidate ID"]
C --> D{"Check confidence<br/>and current state"}
D -->|Allowed| E["Aside<br/>Execute selected action"]
E --> A
D -->|Completion verified| F["Complete"]
D -->|Stop condition| G["Stop · Resume manually"]
classDef surface fill:#F4F5EE,stroke:#9AA991,color:#193326
classDef decision fill:#203D2F,stroke:#203D2F,color:#F4F5EE
classDef result fill:#DCE8C8,stroke:#A9BC8D,color:#193326
class A,B,E surface
class C,D decision
class F,G result
One Aside MCP/REPL session stays open throughout a task. Refresh observations and candidates when the page changes, and execute only the valid candidate selected by Jev. Completion text and an optional URL condition are checked locally; the page is checked again after Jev selects finish.
| Condition | Behavior |
|---|---|
| Repeated page/action or a page cycle | Stop the loop |
| No observable change after execution | Stop with no_progress |
| Page changes after the decision | Do not execute stale candidates |
| Low confidence, unknown ID, or Jev error | Stop without an automatic fallback |
| Step or time budget exhausted | Return state for manual resumption |
| OFF or a higher confidence threshold during selection | Recheck policy before execution |
Install in a few steps
Windows and macOS · no Git, Python, or uv setup required. Install and sign in to Aside first.
- Download ZIP and extract it.
- Run
Install.cmdon Windows orInstall.commandon macOS. Choose your Aside account and enter your Jev key when prompted. Review the changes and confirm. - Reopen Aside → Extensions → Developer mode → Load unpacked, select the folder printed by setup, pin Aside Jev, and turn ON. Start a new task.
The installer prepares a private Python environment, copies the extension to a stable folder, and adds the Jev MCP connection while preserving your other settings. The extension ID is fixed across computers. Quit Aside before confirming setup so it cannot overwrite the account settings during installation.
Windows Native Messaging needs the registration key used by your Aside build. Setup proposes an existing Aside
NativeMessagingHostslocation when found; otherwise it asks for a verified key. We have not verified that final browser connection on a Windows PC. Windows details and troubleshooting →
If macOS does not open the downloaded .command, run bash scripts/install.sh in the extracted folder. Do not disable OS security checks. English is the default; use .\Install.cmd --lang ko or bash scripts/install.sh --lang ko for Korean prompts.
Installation details, update & removal →
Developer quick start / try without an API key
uv sync
uv run aside-jev setup --dry-run
uv run aside-jev dashboard --open
The local demo uses http://127.0.0.1:8766. Add --port 0 for an available port. Existing Python/uv users can run uv run aside-jev setup for guided connection setup.
On macOS, setup stores the API key in macOS Keychain, not in a plaintext file. Hidden terminal input and --env-file imports are supported; Windows retains its local environment-file storage. Keys never enter the popup. Key presence is not authentication proof. See Keychain migration, rotation, and deletion.
Use MCP without the popup
Start the general decision tools over stdio:
uv run aside-jev serve
To enforce the popup's ON/OFF state and Live-only policy, use the installed wrapper or the following command after configuring the extension connection:
uv run aside-jev serve --extension
./scripts/install.sh only installs the Python package. Account instructions, Native Messaging, and MCP registration are part of the separate installation process.
Browser loop example
Find the targetId of an already-open Aside tab and pass it to jev_browser_run:
{
"goal": "Follow Continue until the Journey complete page",
"target_id": "targetId-of-the-current-Aside-tab",
"action_rules": [
{"role": "link", "name": "Continue", "action": "click"}
],
"completion_text": "Journey complete",
"max_steps": 12,
"total_timeout_s": 90,
"min_confidence": 0.7
}
- Supported actions:
click,focus,fill.filluses only the specifiedvalue. - Rules: provide exact accessible names within the user's authorized scope. Missing or ambiguous targets stop execution.
- Completion: use distinctive
completion_text. Addcompletion_urlto require an exact URL match. - Default budget: 12 steps and 90 seconds total. Actions requiring separate approval must be approved before being added as candidates.
Reuse connections. Reduce overhead.
Reuse the SDK client and HTTP connection, and process MCP decision requests outside the event loop. Automatic retries are disabled; requests and tasks have explicit limits.
Local SDK transport benchmark · 30 requests per method · 2026-09-20
| Metric | New client per request | Connection reuse |
|---|---|---|
| p50 | 1.157ms | 0.540ms |
| p95 | 1.695ms | 0.747ms |
| TCP connections | 30 | 1 |
Transport-path p50 overhead fell by approximately 53.3% in this environment. This measures localhost SDK transport, not actual Jev inference speed. The default HTTP timeout of 15 seconds applies separately to connect, read, write, and pool waits.
Measurement method and boundaries →
A small toolset
| Tool | Purpose |
|---|---|
jev_browser_run | Observe → Jev selection → execute → verify in a persistent REPL session |
jev_extension_status | Inspect ON/OFF state and connection readiness |
jev_system_one | General Jev questions using Choice / Score / Noul |
jev_choose | Select one ID from app-owned candidates |
jev_step | Select, check confidence, and return the execution payload |
jev_validate | Locally verify that an ID belongs to the candidate set |
The general MCP/CLI jev_choose and jev_step support mock for testing. The extension-specific MCP and jev_browser_run are Live-only.
What has been verified
| Verified locally | Not yet verified |
|---|---|
| Recorded Python and JavaScript regression checks | Live Jev authentication, decision quality, and inference latency |
| Six local page transitions and completion in actual Aside — decisions supplied by a fixture stub | Success rates across general websites |
| Native Messaging, ON/OFF, and backup/recovery in temporary profiles | Extension installation and MCP registration in a real user account |
| Local demo UI, input errors, and narrow-screen layout | Forced routing of all built-in Aside tools |
See validation records for exact check counts and localization evidence.
Execution boundaries
- OFF removes the managed instruction block from the selected profile. The status-check skill file remains.
- OFF and timeouts do not undo browser actions already sent. If
execution_state: unconfirmed, inspect the page before resuming manually. - Completion conditions and action rules are task-specific. This has not been validated as a universal browser agent.
- Context sanitization limits size and masks credential patterns. It does not identify every possible personal or secret value.
- The hero is generated concept artwork. Actual UI and execution evidence are identified in the validation record.
Development
uv sync --extra dev
uv run pytest -q
node --test tests/test_extension_controller.mjs
uv run python scripts/benchmark_latency.py --samples 30
# Verify six localhost transitions in actual Aside.
# This exercises browser execution without calling the Jev API.
uv run python scripts/verify_browser_runtime.py
| Read more | Contents |
|---|---|
| Extension setup | Local connection, account setup, ON/OFF, disabling |
| Feature map | Entry points, source files, checks |
| Validation | Tests, runtime evidence, measurements, limits |
| Localization | English defaults, Korean dictionaries, localized media |
| Changelog | Changes by version |
Aside developer interface ·
TypeSafe SDK ·
MIT License
Defined candidates. Inspectable decisions. Controlled execution.