SEAN TEAM
Work · DESKTOP APPLICATION --:-- 서울 · macOS 로컬 빌드 · Electron

모든 웹 페이지를
적대적이라고
가정하는 브라우저.

ST Browser

엔진을 뺀 나머지는전부 누군가의 결정입니다.그 결정을 직접 내렸습니다.

ABOUT · WHAT IT DOES

ST Browser(앱 이름 Mars)는 Electron 으로 창틀부터 만든 데스크톱 브라우저입니다. 탭과 주소창, 새 탭, 비공개 탭 같은 셸 위에 광고·추적 차단, 권한 관문, 인증서 경고, 비밀번호 보관함, 확장 프로그램 서명 검증을 직접 얹었습니다. AI 가 페이지를 번호 매긴 목록으로 읽고 여러 동작을 한 번에 실행하도록 브라우저 도구 19개도 들어 있습니다.

처음에는 탭과 주소창을 직접 만드는 셸이었습니다. 지금은 JavaScript 의 47%가 보안·프라이버시 모듈 여덟 개입니다. 사용자 수요는 아직 검증하지 않았다고 설계 문서가 먼저 적어 둡니다.

01 — New tab

새 탭에 지금 이 시각의 태양계가 뜹니다.

Mars 새 탭 실제 화면(태양계 테마) — 실시간 궤도 위의 행성들, 가운데 Mars 워드마크와 검색창, 바로가기 6개
  1. 실제 궤도행성 위치는 JPL 궤도 요소로, 자전은 IAU 상수로 계산합니다. 거리와 크기만 줄였습니다.
  2. 행성을 누르면 테마가고른 천체가 강조색과 로고, 워드마크가 됩니다.
  3. 아이콘을 남에게 묻지 않습니다자주 가는 곳의 아이콘을 외부 파비콘 서비스에 요청하지 않습니다.
02 — When a page fails

빈 화면 대신 이유를 보여 줍니다.

security.js 는 브라우저가 설명해야 할 실패를 셋으로 봅니다. 틀린 인증서, 끊긴 네트워크, 막힌 주소. 인증서 화면의 값은 expired.badssl.com 의 실제 인증서입니다.

  1. ① Certificates

    이 연결은 비공개가 아닙니다

    인증서가 틀리면 페이지 대신 경고를 띄우고, 누르기 쉬운 버튼은 “돌아가기” 하나만 둡니다. 호스트와 오류 문자열처럼 네트워크에서 온 값은 전부 textContent 로만 씁니다.

  2. ② Proceeding anyway

    5초를 기다려야 합니다

    “그래도 계속”은 세부 정보를 펼쳐야 나타나고, 펼친 뒤 5초 동안 눌리지 않습니다. 근육 기억이나 가로챈 클릭으로 결정되지 않게 하려는 것입니다. 예외는 이 호스트와 이 인증서에만, Mars 를 끌 때까지만 적용되고 디스크에 남지 않습니다.

  3. ③ No such address

    오류 이름으로 설명합니다

    네트워크 오류는 번호가 아니라 Chromium 이 알려 주는 이름(ERR_NAME_NOT_RESOLVED 등)으로 골라 문장과 힌트를 붙입니다. 번호는 Chromium 버전 사이에 바뀐 적이 있기 때문입니다.

  4. ④ Blocked addresses

    웹 페이지는 파일을 열 수 없습니다

    웹 페이지가 로컬 파일, 브라우저 내부 페이지, 다른 앱을 열려고 하면 거절하고, 리디렉트로 끼워 넣어도 다시 거절합니다. 이 설명 화면들은 IPC 통로가 없는 평범한 파일이라, 실패를 설명하는 페이지가 더 많은 권한을 갖지 않습니다.

인증서 경고 실제 화면 — This connection is not private, expired.badssl.com, net::ERR_CERT_DATE_INVALID, Go back 버튼
세부 정보를 펼친 화면 — 발급 대상 *.badssl.com, 발급자 COMODO, 유효기간 2015년 4월, 지문, 아직 눌리지 않는 ‘Continue anyway (3)’
네트워크 오류 실제 화면 — That address does not exist, https://naver.comm/, 오타 확인 힌트, ERR_NAME_NOT_RESOLVED (-105)
차단 실제 화면 — Mars blocked this, file:///etc/passwd, scheme: file:

셸 위에 얹은 것들.

탭과 주소창은 시작이었습니다. 그 위에 새 탭과 비공개 탭, 테마, 그리고 AI 가 읽는 페이지가 올라갔습니다.

page_mapact Mars 의 AI 보기(ai-view-guest.js)를 Hacker News 에 켠 화면 — 링크마다 번호가 붙은 목록 AI 보기페이지를 번호 매긴 목록으로 바꿔 AI 에게 건넵니다. 90개에서 자르면 자른 사실과 전체 수를 함께 알립니다. 이 Hacker News 첫 화면은 230개 중 90개였습니다.
WebGL태양계 테마 태양계 테마에서 지구를 고른 새 탭 — Earth 워드마크와 파란 강조색 행성을 고르면 테마가태양계 테마에서 천체를 누르면 그 천체가 강조색과 새 탭 로고가 됩니다. 지구를 고르면 워드마크도 Earth 로 바뀝니다.
in-memory 세션 비공개 탭 실제 화면 — You're browsing privately, 기록 없음 · 쿠키와 로그인 분리 · 디스크에 캐시 없음 비공개 탭메모리에만 있는 별도 세션을 씁니다. 기록에 남지 않고, 쿠키와 로그인이 분리되며, Mars 를 끄면 전부 사라집니다. 회사와 통신사는 여전히 볼 수 있다는 것도 적어 둡니다.
해커 테마DuckDuckGo 해커 테마 새 탭 — 초록 모노스페이스 글자와 ‘Search with DuckDuckGo or enter address’ 테마 다섯 · 검색 엔진 일곱시스템 · 다크 · 라이트 · 해커 · 태양계. 검색은 Google · Bing · DuckDuckGo · Naver · Daum · Yandex · YouTube 중에서 고르고, 새 탭 검색창이 지금 엔진을 이름으로 보여 줍니다.

처음 켤 때부터 광고·추적 차단HTTPS 전용제3자 쿠키 차단Do Not TrackGlobal Privacy Control리퍼러 줄이기추적 파라미터 제거권한은 기본 거부 켜져 있습니다.

기본 차단 엔진 하나가 목록 14개의 규칙 157,204개를 들고 있습니다. 빌드할 때 미리 직렬화해 두어, 첫 실행에도 목록을 받으러 나가지 않습니다.

01

모든 페이지는 적대적입니다

<webview> 의 설정은 붙는 순간 메인 프로세스가 다시 씁니다. 렌더러가 무엇을 요청했든 게스트는 샌드박스에 격리됩니다. 렌더러도, 페이지도 믿지 않는다는 것이 security.js 의 첫 문장입니다.

02

권한은 요청한 곳에 매깁니다

카메라 · 마이크 · 위치 같은 요청은 사용자가 그 사이트에 허락한 적이 있거나 지금 허락할 때만 통과합니다. 시간 초과도, 창 닫힘도 거부입니다. iframe 이 요청하면 최상위 페이지가 아니라 그 iframe 의 출처로 기록합니다.

03

아이콘도 흔적입니다

예전에는 파비콘을 Google 과 DuckDuckGo 서비스에 물어, 연 페이지의 호스트를 전부 넘기고 있었습니다. 지금은 사이트 자신에게서 그 탭의 세션으로 받아 64KB 이하 PNG 로 다시 그립니다. SVG 는 받지 않습니다.

04

확장은 서명부터

CRX3 서명을 검증하고, 확장 ID 가 서명 키에서 나온 것인지 확인하고, 권한을 알린 뒤에야 설치합니다. 전에는 헤더를 떼고 그냥 풀었습니다. 테스트 17개가 변조된 패키지와 남의 ID 를 사칭한 패키지를 거절하는지 확인합니다.

05

진짜 클릭을 보냅니다

AI 의 클릭이 합성 이벤트면 isTrusted 가 false 라, 사용자 동작을 요구하는 사이트는 아무 말 없이 무시합니다. 그래서 좌표를 구해 sendInputEvent 로 실제 입력을 보내고, 테스트가 isTrusted === true 를 확인합니다.

06

낡은 번호로는 누르지 않습니다

페이지 지도의 번호에는 세대 표시가 붙습니다. 페이지가 바뀐 뒤 옛 번호로 누르려 하면 엉뚱한 요소를 누르는 대신 stale_map 으로 거절합니다. 한 단계가 실패해도 나머지 단계는 계속 돕니다.

03 — Counted from the repo · 2026-09-25
18,058줄의 JavaScript · 생성 파일과 테스트 제외
157,204개의 차단 규칙 · 목록 14개
52개의 테스트 검사 · CRX 17 + 렌더러 35
19개의 AI 브라우저 도구
7번의 커밋 · 9월 9일
ROLE
단독 개발 — 셸 · 보안 · AI 도구
SHELL
Electron 44 · JavaScript · <webview>
BLOCKING
Ghostery adblocker 2.18 · 빌드 때 직렬화한 엔진
AI
Claude Code · Codex · Gemini CLI, 또는 Anthropic API
PLATFORM
macOS · 한국어와 영어
STATUS
LOCAL ELECTRON BUILD
WHY

만들면서 스스로에게
물은 것들.

왜 브라우저를 직접 만들었나요?

Electron 이 주는 것은 창 하나와 렌더링 엔진뿐입니다. 탭, 주소창, 북마크, 새 탭, 경고 화면까지 브라우저라고 부를 만한 것은 전부 직접 정해야 합니다. 엔진은 어디까지고 제품 결정은 어디부터인지 확인하고 싶었습니다. 해 보니 결정의 절반 가까이가 보안이었습니다.

Chrome 보다 나은 곳이 있나요?

하나는 분명합니다. Chrome 의 확장은 Manifest V3 규칙 상한에 묶이지만, Mars 의 차단 엔진은 규칙 157,204개를 그대로 듭니다. 반대로 콜드 스타트와 기본 메모리는 집니다. Widevine 이 없어 Netflix · Disney+ · Spotify 는 재생되지 않습니다. 설계 문서는 둘 다 적어 둡니다.

AI 는 마우스를 어떻게 쓰나요?

마우스를 쓰지 않습니다. page_map 이 페이지를 #7 button "Sign in" 같은 번호 목록으로 돌려주고, act 는 그 번호로 된 동작 배열을 한 번에 실행한 뒤 새 지도를 돌려줍니다. 스크린샷을 찍고 좌표를 고르는 왕복이 줄어듭니다. 지도는 90개, 한 번의 동작은 24단계에서 자르고, 자른 사실을 결과에 적습니다.

AI 비용은 누가 내나요?

기본 경로는 사용자의 Claude Code, Codex 같은 CLI 에 일을 넘기는 방식이라, 모델 비용은 Mars 가 아니라 그 CLI 계정에서 나갑니다. Anthropic API 를 직접 쓰는 경로에는 프롬프트 캐싱과 출력 effort 제한을 넣었습니다. 설계 문서의 계산으로는 출력 토큰 단가가 입력의 다섯 배라, effort 가 가장 큰 비용 레버입니다.

지금 어디까지 왔나요?

macOS 에서 도는 로컬 빌드입니다. 설계 문서는 수요 증거가 없다는 사실을 첫머리에 적었습니다 — 유료 고객도, 무료 사용자도 아직 없습니다. 먼저 고칠 목록 13개 중 12개를 9월 9일에 반영했고, 캐시를 무효화할 수 있는 한 항목은 따로 측정하려고 보류했습니다.

엔진을 뺀 나머지를직접 정한 브라우저.

프로젝트 전체 보기 →