Skip to content

내장 브라우저

VMark는 문서 창 안에 진짜 웹 브라우저를 호스팅할 수 있습니다 — 웹 페이지가 마크다운 문서와 나란히 일급 탭이 됩니다. 이것은 외부 Chrome 창이나 임베디드 프레임이 아니라 진짜 네이티브 웹뷰(macOS WKWebView)입니다.

실험적 기능

내장 브라우저는 초기 기능이며 이 빌드에서는 macOS 전용입니다. Windows와 Linux 지원은 이후에 제공됩니다 — 해당 플랫폼에서는 아래 설정이 아예 나타나지 않습니다.

워크스페이스 레일

실험적 워크스페이스 레일이 활성화되면 브라우저 페이지는 창 전역입니다: 창 안의 모든 워크스페이스에서 계속 접근할 수 있으며 특정 워크스페이스의 탭에 묶이지 않습니다.

끄기

브라우저는 macOS에서 기본적으로 켜져 있습니다. 새 브라우저 탭파일 메뉴(Alt + Mod + Shift + B)와 명령 팔레트에 있습니다 — 먼저 활성화할 것이 없습니다.

끄려면 설정 → 고급 → macOS로 가서 내장 브라우저를 끕니다. 그러면 열려 있는 브라우저 탭도 모두 닫히고 아래에서 설명하는 AI 자동화 표면도 철회됩니다.

두 가지 AI 자세 설정이 토글 바로 아래에 있으며 켜져 있을 때만 나타납니다. 둘 다 보수적으로 출고되며 브라우저를 활성화해도 변경되지 않습니다:

설정기본값의미
AI 세션SandboxAI가 구동하는 페이지는 로그인된 세션을 공유하는 대신 격리된 세션을 받습니다
루프백 허용localhost / 사설 네트워크 주소로의 AI 탐색이 거부됩니다

사이트 권한은 설정에 없습니다 — 해당 권한을 소유한 창의 브라우저 사이드바에 있습니다.

사용하기

브라우저 탭은 문서와 나란히 에디터 영역에 열립니다 — 사이드바, 탭 스트립, 터미널, 상태 바는 모두 원래 자리에 남아 있습니다. 그 컨트롤은 페이지 위에 놓입니다: macOS에서는 VMark가 직접 제목 표시줄을 그리므로 컨트롤이 창의 제목 표시줄을 공유합니다. 시스템이 대신 제목 표시줄을 그리는 곳(Windows, Linux)에서는 다른 모든 데스크톱 브라우저가 배치하는 방식대로 페이지 위 창 안에 놓입니다.

컨트롤동작
‹ / ›뒤로 / 앞으로. 갈 곳이 없으면 흐리게 표시됩니다
⟳ / ✕새로 고침, 또는 진행 중인 로드 중지
주소 표시줄옴니박스: URL을 입력하면 그곳으로 이동하고, 그 외의 것을 입력하면 검색합니다
☆ / ★이 페이지를 북마크

주소 표시줄은 페이지를 자동으로 추적합니다: 사이트가 리디렉션하거나 링크가 다른 곳으로 데려가면, 표시줄이 실제로 있는 곳을 보여주도록 갱신됩니다.

사이드바는 탭을 따라갑니다

브라우저 탭이 활성화되면 사이드바에는 탐색 기록북마크가 표시됩니다. 문서로 다시 전환하면 파일 탐색기, 아웃라인, 파일 기록이 다시 표시됩니다 — 자동으로. 동기화를 유지해야 할 두 번째 모드가 없으며, 각 측면은 마지막에 열어 두었던 것을 기억하므로 브라우저 탭을 힐끗 본다고 해서 사용 중이던 파일 트리를 잃지 않습니다.

기록은 창별로 유지되며 세션 동안만 존재합니다: 디스크에 절대 기록되지 않습니다. (그래도 지우기 버튼은 있습니다 — "종료하면 사라진다"는 것과 "지금 없앨 수 있다"는 것은 같지 않습니다.) 새로 고침은 중복 항목을 추가하지 않으며, 리디렉션하는 사이트는 가는 길의 모든 경유지가 아니라 방문하려던 의도한 페이지를 기록합니다.

북마크는 유지됩니다. 북마크한 정확한 URL 아래에 저장됩니다 — 같은 페이지의 다른 섹션(#install#usage)은 두 개의 북마크이며, VMark는 URL의 쿼리 매개변수를 조용히 "정리"하지 않습니다. 다시 쓴 URL은 보았던 것으로 되돌려주지 않을 수 있기 때문입니다.

창은 페이지 주위에서 중립이 됩니다

VMark의 테마는 의도적으로 색조가 있습니다 — Paper는 따뜻한 회색이고, Mint와 Sepia는 더 그렇습니다. 그것은 글을 쓰기에는 좋지만 다른 사람의 웹 페이지를 감싸기에는 잘못되었습니다: 색이 있는 프레임은 그 안의 모든 색을 읽는 방식을 바꾸며, 이것이 어떤 진짜 브라우저도 자신의 크롬에 색조를 입히지 않는 이유입니다.

그래서 브라우저 탭이 포커스되면 주위 창은 평범한 중립색으로 전환되고 — 밝은 테마에서는 흰색, 어두운 테마에서는 어두운 색 — 문서로 돌아오는 순간 다시 전환됩니다. 테마는 변하지 않으며, 웹 페이지를 둘러싼 것만 변합니다.

터미널도 같은 규칙을 따릅니다. 브라우저 탭 옆에 터미널을 열어 두었다면, 터미널은 테마 색을 유지하는 대신 일치하는 중립색을 취하므로 창의 두 절반이 눈에 띄는 이음매에서 만나는 대신 서로 조화를 이룹니다. 어두운 테마는 흰색이 아니라 어두운 터미널을 받습니다 — 터미널의 색은 배경에 맞춰 조정되며, 흰색을 강제하면 어두운 테마의 출력을 읽기 어렵게 만들기 때문입니다.

페이지가 충돌하면

페이지의 웹 콘텐츠 프로세스가 죽으면, 탭은 빈 화면이나 멈춘 화면 대신 Reload 버튼이 있는 "This page crashed" 오버레이를 표시합니다. VMark는 일시적인 충돌에 대해 몇 차례 자동으로 새로 고칩니다. 페이지가 로드 시 계속 충돌하면 중지하고 수동으로 새로 고치기를 기다리므로, 새로 고침 루프에 갇히는 일이 없습니다.

어떻게 만들어졌는가 (그리고 왜 설계상 프라이빗한가)

VMark는 플랫폼 웹뷰를 직접 생성하여 창의 네이티브 자식으로 추가합니다 — 앱 프레임워크에 웹뷰를 요청하지 않습니다. 이것이 프라이버시에 중요합니다: 프레임워크가 생성한 웹뷰는 모든 페이지에 내부 메시징 브리지를 주입하여 어떤 사이트에든 앱으로 통하는 채널을 건네줍니다. VMark는 그런 브리지가 없는 갓 구성된 웹뷰를 소유하기 때문에, 브라우징된 페이지는 VMark로 통하는 채널이 없습니다. 페이지는 엄격히 단방향으로 구동됩니다(앱은 페이지를 읽고 작동시킬 수 있지만, 페이지는 되돌아올 수 없습니다).

세션(로그인, 쿠키)은 OS 웹뷰 자체의 데이터 저장소에 프로필별로 유지되므로, 각 사이트에 한 번만 로그인합니다. VMark 자체는 어떤 자격 증명도 저장하지 않습니다.

AI로 브라우저 구동하기

MCP를 통해 연결된 AI 어시스턴트는 브라우저 탭을 조작할 수 있습니다:

  • Read — 페이지의 구조화된 접근성 스냅샷을 얻습니다(각 상호작용 또는 구조 요소를 role + 접근 가능한 이름으로, 그리고 e5 같은 안정적인 ref 핸들과 함께).
  • Act — 대상을 클릭하거나 입력합니다. 이전 읽기에서 얻은 정확한 ref로, 또는 ARIA role + 접근 가능한 이름으로(예: "Learn more"라는 링크 클릭). ref는 이미 승인된 동작에 대해서만 인정됩니다. 승인이 필요한 것은 role + 이름을 사용하므로, 프롬프트가 읽을 수 있는 요소를 보여줄 수 있습니다. 클릭은 실제로 도달했는지 검증합니다: 대상을 화면 안으로 스크롤하고, 눈에 보이게 렌더링되어야 하며 — 접힌 섹션 안의 중복 버튼은 클릭되지 않고 건너뜁니다 — 클릭 지점을 히트 테스트하므로, 오버레이에 가려진 대상은 클릭을 관통하는 대신 "…에 가려짐"으로 보고됩니다. AI는 단지 시도했다는 것이 아니라 무엇이 일어났는지를 듣기 때문에, 조용히 잘못된 것에 작동하고 성공을 보고할 수 없습니다.
  • Scroll — 요소를(ref로) 화면 안으로 가져오거나, 픽셀 양만큼 스크롤합니다. Act 클래스(Click처럼 승인 게이트).
  • Key — 포커스된 요소나 ref에 키 입력(Enter, Escape, Tab, 화살표, 선택적으로 Ctrl/Shift/Alt/Meta 포함)을 보냅니다 — 예를 들어 폼을 제출하거나 대화 상자를 닫습니다. Act 클래스. 참고: 키와 스크롤은 합성 DOM 이벤트이므로, 실제 하드웨어 입력만 신뢰하는 사이트는 무시할 수 있습니다.
  • Query — 접근성 스냅샷이 명명할 수 없는(테이블, 계산된 값, 속성) 구조화된 DOM 탐지를 CSS 선택자로 수행합니다. Read 클래스.
  • Extract — 페이지를 리더 모드 마크다운으로(제목, 작성자, 기사 본문, 상용구 제거) 얻습니다. AI가 조작하기보다 읽고 싶은 페이지를 위한 것입니다. 사이트 플러그인이 출처별로 추출을 정제합니다 — 내장 Wikipedia 플러그인은 위키 크롬을 이름으로 제거합니다 — 일반 리더를 폴백으로 둡니다. 페이지는 바이트만 내보내고, 추출은 VMark 안에서 실행됩니다. Read 클래스.
  • Style — 인라인 스타일을 설정하거나, 클래스를 토글하거나, <style> 블록을 주입하여(선택자 범위가 아닌 페이지 전체) CSS를 조작합니다(막는 오버레이 제거, 대상 강조). Act 클래스이며, 승인은 정확한 스타일링에 묶입니다 — 허용한 후에 다른 CSS로 바꿀 수 없습니다.
  • Execute JS — 탈출구: 구조화된 동사로 표현할 수 없는 것을 위해 스크립트를 실행합니다. 격리된 콘텐츠 세계(DOM + CSS, 페이지 자체의 JavaScript는 절대 아님)에서 실행되고, 호출별로 승인되며(절대 기억되지 않음 — 여기에는 "이 사이트에서 허용"이 없습니다), 그 결과는 신뢰할 수 없는 것으로 취급됩니다. 승인 프롬프트는 정확한 스크립트를 보여주고, 실행되는 것은 바로 그 스크립트입니다 — AI는 한 스크립트를 승인하게 한 뒤 다른 스크립트를 실행할 수 없습니다. Query/Style를 선호하고, 이것은 그것들이 부족할 때만 사용하세요.
  • Session save / load — 탭의 현재 세션을 핸들(당신이 승인하는 이름) 아래에 저장하고, 나중에 복원하여 흐름이 이미 로그인된 상태로 시작되게 합니다 — AI가 쿠키나 토큰을 결코 보지 않고서. 값은 OS 키체인에 저장되고(저장 시 암호화됨), AI는 핸들과 개수 요약만 받습니다. 저장과 로드 모두 호출별로 승인되며, 한 핸들에 대한 승인을 다른 핸들에 쓸 수 없습니다. 복원은 저장된 것과 같은 출처의 페이지에만 적용됩니다. 이것은 자격 증명 참조 방식입니다: AI는 세션을 명명하고, VMark가 비밀을 보관합니다.
  • Console — 페이지의 캡처된 console.* 출력(log/warn/error…)을 읽습니다. 여기에 포착되지 않은 오류와 처리되지 않은 프로미스 거부도 포함됩니다 — 페이지 자체의 스크립트가 깨질 때 페이지가 내보내는 신호로, 평범한 console 로깅으로는 결코 드러나지 않습니다 — 그래서 AI가 구동 중인 페이지를 디버그할 수 있습니다. 읽기 전용이며, 출력은 신뢰할 수 없는 페이지 데이터로 취급됩니다. 이것은 설계상 프라이빗 보장을 지키도록 만들어졌습니다: 캡처는 페이지 자체의 DOM에 쓰고 VMark가 그곳에서 읽으므로, 앱으로 되돌아가는 메시징 채널이 열리지 않습니다.

Session save/load — 범위

저장된 세션은 localStorage와 쿠키를 다루며, 둘 다 저장 시 페이지가 커밋되었던 출처로 범위가 한정됩니다. 쿠키는 네이티브 쿠키 저장소를 통해 읽고 재생되며 양방향으로 도메인 범위가 한정됩니다 — 저장은 결코 쿠키 항아리 전체를 복사하지 않고, 복원은 결코 무관한 사이트 아래에 쿠키를 심지 않습니다.

  • Open — AI 소유 탭을 생성하고 HTTP(S) URL을 로드합니다.
  • Navigate — AI 소유 탭을 탐색하고 그 탐색 티켓을 기다립니다. 로드되는 페이지가 요청된 콘텐츠가 아니라 게이트로 읽힐 때 — 로그인 벽, 동의 중간 화면, 인간 검증 챌린지(reCAPTCHA/Turnstile), 또는 속도 제한 알림 — 결과가 그렇다고 알리고, AI는 우회하려 하지 말고 당신을 개입시키라는 지시를 받습니다. 탐지는 정밀도 우선입니다: "$429"를 언급하는 가격이나 "Cloudflare"라고 적힌 푸터는 그것을 발동시키지 않습니다.
  • Wait — 다른 로드를 시작하지 않고 특정 탐색 티켓을 기다립니다.
  • Wait for — 조건이 성립할 때까지(ref 또는 role + 이름으로 요소, 보이는 텍스트 조각, 또는 탭의 URL이 포함하는 부분 문자열 — 마지막은 클릭으로 촉발된 탐색이 도달했는지 확인합니다) 또는 타임아웃이 지날 때까지 폴링하며, 일치했는지 보고합니다. 다단계 흐름을 결정론적으로 만듭니다 — 작동시킨 뒤 결과를 기다리고 나서 읽기 — 추측하는 대신에.
  • Screenshot — 페이지의 현재 렌더링에 대한 JPEG 이미지를 얻어, 접근성 스냅샷이 명명하지 않는 레이아웃과 렌더링된 상태를 AI가 볼 수 있게 합니다. Read처럼 변경을 일으키지 않습니다: AI 소유 탭에서 허용되고, 인간 탭에서는 그것을 연결한 동안에만 허용됩니다.
  • Run a workflow — 저장된 짧은 단계 시퀀스(click / type / navigate / extract, 작은 텍스트 문법으로 작성되어 source로 전달됨)를 하나의 비동기 실행으로 재생합니다: 즉시 실행 id를 반환하고 당신이 그 상태를 폴링합니다. 다단계 실행은 단일 요청보다 오래 지속되기 때문입니다. 그 안의 모든 단계는 손으로 발행한 동작과 똑같이 개별적으로 승인 게이트를 거칩니다 — 워크플로우는 프롬프트를 우회하는 방법이 아닙니다 — 그리고 AI가 결정론적으로 수행할 수 없는 단계(자유 산문 "goal", "confirm")는 실행을 일시 정지하여 손으로 처리하게 합니다. 재실행은 이미 성공한 단계를 건너뛰므로, 일시 정지 후 재실행해도 결코 이중 제출하지 않습니다. 실행은 탭당 한 번에 하나로 제한되며, 취소할 수 있습니다 — 취소는 항상 허용되고, 브라우저를 직접 넘겨받으면 실행이 멈춥니다.
  • Record a workflow — 문법을 손으로 작성하는 대신, 기록할 수 있습니다: 당신의 승인을 받아 (매번 새로 요청됩니다 — 기록은 결코 상시 권한이 아닙니다) VMark가 탭에서 당신이 수행하는 클릭과 필드 편집을 캡처하여 곧바로 실행 가능한 워크플로우 텍스트를 돌려줍니다. 이는 구성상 값을 담지 않습니다: 당신이 입력하는 것은 저장되지 않으며 — 모든 필드는 재생 시 당신이 채워 넣는 이름이 지정된 {input}이 되고, 비밀번호 필드는 수동 confirm: 단계가 되며, URL은 origin + path로 축약됩니다. 당신이 만진 컨트롤이 무엇인지는 기록하지만, 당신이 입력한 것이 무엇인지는 결코 기록하지 않습니다.

AI 브라우저 자세는 설정 → 고급 → 내장 브라우저에서 구성합니다:

  • Sandbox(권장)는 하나의 공유되고 비지속적인 AI 웹뷰 저장소를 사용합니다. 다른 sandbox 탭과는 쿠키를 공유하지만 인간 탭과는 공유하지 않습니다.
  • Shared profile은 인간 웹뷰 저장소를 사용하며, 해당 출처에 일치하는 navigate 권한이 없는 한 각 AI 탐색 전에 목적지 승인을 요청합니다.

AI가 생성한 탭은 일시적이며 재시작 후 복원되지 않습니다. 그 URL, 모드, 제목, 세대, 로딩 상태는 session.get_state에 나타나고, 자격 증명은 MCP 응답에서 편집(redact)됩니다.

동작은 승인 게이트를 거칩니다: 당신이 승인하지 않은 작업은 수행되지 않습니다 — AI는 승인이 필요하다는 것을 듣고 기다립니다. 파일 업로드는 AI에게 절대 허용되지 않습니다(AI가 선택한 파일 업로드는 데이터 유출 경로가 될 것입니다). 그것은 엄격히 인간이 구동합니다.

동작 승인하기

AI가 작동을 요청하면, VMark는 프롬프트를 띄우고 페이지를 일시 정지합니다. 정확히 세 가지를 알려줍니다 — 사이트, 동작, 그리고 요소(그 role과 접근 가능한 이름, 예: button "Publish"):

  • 한 번 허용 — 그 한 동작을, 그 요소에, 그 페이지에 정확히 승인합니다. 즉시 소모되며 상시 권한이 되지 않습니다.
  • 이 사이트에서 허용 — AI가 그 사이트에서 그 작업을 다시 묻지 않고 수행할 수 있습니다. 다른 작업이나 다른 사이트로 넓어지지 않습니다.
  • 거부 — 아무 일도 일어나지 않습니다. Escape를 누르거나, 그냥 Enter를 눌러도 거부됩니다: 프롬프트는 의도적으로 거부 쪽으로 치우쳐 있습니다.

프롬프트는 페이지의 그림이 아니라 동작의 설명을 보여줍니다 — 그리고 그것은 의도적입니다. 웹 페이지는 자신의 픽셀을 제어하므로, 악의적인 페이지는 "Delete everything" 버튼을 "Publish"처럼 보이도록 스타일링할 수 있습니다. VMark가 보여주는 것은 보안 게이트가 강제하는 정확한 대상이며, 페이지 자체의 주장이 아니라 브라우저 엔진에서 가져온 것입니다.

권한은 또한 페이지가 탐색할 때 소멸됩니다. 프롬프트는 특정 페이지에서의 동작을 설명합니다. 당신이 결정하는 동안 페이지가 바뀌면, 요청은 대신 로드된 무언가에 적용되는 대신 폐기됩니다. 소모되지 않은 "한 번 허용"도 같은 방식으로 버려집니다.

이것은 페이지 안에서의 탐색을 포함합니다. 대부분의 현대 사이트는 새 페이지를 로드하지 않고 뷰 사이를 이동합니다 — 주소가 바뀌고 콘텐츠가 다시 쓰이지만, 사이트는 결코 떠나지 않습니다. 그것이 여기서 중요합니다. 사이트와 출처는 그대로인 반면 당신이 승인한 button "Publish"는 더 이상 그 이름 아래의 버튼이 아닐 수 있기 때문입니다. 그래서 VMark는 페이지 내 탐색을 다른 어떤 것과도 똑같이 취급합니다: 승인은 단지 페이지가 아니라 그것이 부여되었던 와 함께 소멸됩니다.

하지만 무게를 지는 것은 서술자(descriptor) 자체입니다. 사이트는 전혀 탐색하지 않고서도 언제든 자신의 콘텐츠를 다시 쓸 수 있으며, 어떤 브라우저 엔진도 그것을 보고하지 않습니다. 그래서 "한 번 허용"이 승인하는 것은 정확히 하나의 작업을, role과 접근 가능한 이름으로 식별되는 하나의 요소에, 하나의 사이트에서 — 그리고 즉시 소모됩니다. **"이 사이트에서 허용"**은 두 번 생각할 것입니다: 그것은 그 사이트에서 그 작업에 대한 상시 권한이며, 당신이 그것을 부여하는 사이트는 당신이 그것을 신뢰하는 사이트입니다.

권한 검토 및 취소

설정 → 고급 → 사이트 권한은 당신이 부여한 모든 사이트와 그것이 할 수 있는 것을 나열합니다. 취소는 즉시 되돌립니다 — 그 사이트에서의 다음 AI 동작은 다시 묻습니다.

사이트 권한은 메모리에만 보관됩니다: 디스크에 절대 기록되지 않으며 VMark가 종료되면 소멸됩니다. AI가 재시작을 넘어 사이트에서 클릭할 능력을 유지하게 두는 것은 보기보다 큰 약속이므로, VMark는 그것을 조용히 하지 않습니다.

AI가 인간이 생성한 탭을 대상으로 삼으면, VMark는 먼저 그 탭에 AI 접근을 연결할지 묻습니다. 연결은 현재 탐색 세대에 묶입니다. 한 번 허용은 한 번의 성공적인 읽기나 동작 후 소모됩니다. 탐색까지 허용은 다음 전체 또는 페이지 내 탐색, 닫기, 비활성화, 또는 재시작 시 만료됩니다.

AI 탐색은 기본적으로 루프백, 사설 LAN, 링크 로컬, 메타데이터, 형식이 잘못된, 지원되지 않는 스킴 대상을 거부합니다. DNS 리바인딩은 여전히 WebKit이 소유한 제한 사항입니다. VMark는 그것을 제거한다고 주장하지 않습니다.

공동 구동: 터미널에서 AI가 브라우저를 구동하는 것을 지켜보기

브라우저는 모드가 아니라 창(pane)입니다. 그것이 특정한 워크플로우를 가능하게 합니다: 브라우저 탭 옆에 터미널(Ctrl + `)을 열고, 그 안에서 AI 에이전트를 실행하며, 에이전트가 작동하는 동안 페이지가 반응하는 것을 지켜봅니다.

터미널과 브라우저는 나란히 앉습니다 — 브라우저는 가려지는 대신 공간을 만들기 위해 크기를 조정합니다. 그래서 에이전트가 페이지에 작동하는 내내 페이지를 보게 되고, 에이전트가 취하는 모든 동작은 여전히 당신을 거쳐야 합니다(위의 동작 승인하기 참조).

이것이 VMark에서 의도한 AI 브라우저 사용의 형태입니다: 에이전트는 제안하고, 페이지는 보이며, 당신이 승인합니다. 볼 수 없는 창에서 에이전트가 작업하는 것이 아닙니다.

제어권을 되찾는 것은 한 번의 동작입니다. AI 워크플로우 실행이 탭을 구동하는 동안, 그 크롬은 "AI가 제어 중 — 클릭하여 제어권 가져오기" 표시를 보여줍니다. 그것을 클릭하거나 — 또는 페이지나 주소 표시줄을 직접 조작하기만 하면 — 즉시 탭을 되찾고 실행을 멈춥니다. 에이전트의 터미널에서 정지 버튼을 찾을 필요가 결코 없습니다. 브라우저를 만지는 것이 정지 버튼입니다.

페이지 로드에 실패하면

오프라인 네트워크, 잘못된 호스트 이름, 거부된 인증서, 또는 거절된 연결은 모두 브라우저 창에 무엇이 잘못되었는지 알리는 메시지를 다시 시도 버튼과 함께 표시합니다. 이전 빌드는 대신 빈 창을 보여주었는데, 그것은 단지 느린 페이지와 구별할 수 없었습니다.

현재 제한 사항

  • 이 빌드에서는 macOS 전용.
  • JavaScript confirm() / prompt() 대화 상자는 현재 억제됩니다(alert()만 표면화됨). 팝업(window.open)은 새 탭으로 열리는 대신 차단됩니다.
  • 다운로드, 인쇄, 요청별 네트워크 정책은 아직 구현되지 않았습니다.

이것들은 점진적으로 채워지고 있습니다. 위의 페이지는 오늘 작동하는 것을 설명합니다.