Sno Station
Sno Station은 AI 에이전트를 하나의 팀으로 묶는 오픈소스 워크스테이션으로, 로컬 머신에서 에이전트 협업을 가능하게 함
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Console-style spatial navigation for the web. Use your D-pad or stick to jump between links, buttons, iframes, and scrollable panels. Available as a browser extension and userscript.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Website, live demo and one-click install: https://mmis1000.me/SofaNav/
Console-style controller navigation for any web page. The D-pad and left stick
move a focus ring between links and buttons by their position on screen (like
an Xbox/TV app), not a mouse cursor.
Ships as a browser extension (Chrome, Edge, Firefox) and as a userscript built
from the same source.README 전문 보기 ↗Website, live demo and one-click install: https://mmis1000.me/SofaNav/
Console-style controller navigation for any web page. The D-pad and left stick move a focus ring between links and buttons by their position on screen (like an Xbox/TV app), not a mouse cursor.
Ships as a browser extension (Chrome, Edge, Firefox) and as a userscript built from the same source.
extension/ the extension; content.js is the single source for everything
manifest.json MV3, runs in all frames
background.js LB/RB tab switching (extension only)
content.js all navigation logic (engine in the top frame, client in iframes)
build-userscript.js builds dist/sofanav.user.js from extension/content.js
scripts/record-demo.js records demo/sofanav-demo.mp4 with Playwright
scripts/regressions.js automated regression checks (npm run test:regress)
scripts/build-site.js assembles the website into _site/ (npm run site)
site/ the website / landing page (runs SofaNav itself)
.github/workflows/ CI: build check + regression checks, then deploys the website
dist/ generated userscript (do not edit)
test/
index.html main test page, one section per behaviour / past bug
frame.html page loaded into the test page's iframes
stress.html Twitter-sized page for performance checks
docs/
test-cases.md what to check, and every edge case / bug found so far
chrome://extensions (or edge://extensions) → Developer mode →
Load unpacked → pick extension/. Firefox: about:debugging → Load Temporary
Add-on → extension/manifest.json.npm run build, then install dist/sofanav.user.js. LB/RB do nothing there.
Each build is stamped with a hash of content.js (shown in the
description and a // Build <hash> comment under the header, logged as [sofanav] build … in the console, and in the View
on/off toast) and gets a newer @version whenever the code changed, so the
manager offers it as an update.dist/sofanav.user.js into the DevTools console.| Input | Action |
|---|---|
| D-pad | Move between elements (4-direction scored graph) |
| Left stick | Free aim at any angle (ray cast) |
| A | Click / focus a text field |
| B | Leave text field → leave container → close dialog / popover → Escape to whatever covers the page (menus, overlays) → otherwise history back |
| Hold B | Always history back (if a popup won't close) |
| L3 (click left stick) | Mouse mode on/off: left stick moves a cursor, D-pad nudges it, A clicks, right stick / LT / RT scroll under it, hover events are sent. The escape hatch for anything focus navigation can't reach |
| X | Enter the focused container (a post card, or a scrollable panel — A also enters a panel) |
| Y | Cycle graph view: off → focused item → whole screen |
| LB / RB | Previous / next tab (extension only) |
| LT / RT | Page up / down |
| Right stick | Scroll (a focused scrollable panel scrolls itself, without entering) |
| View | Turn navigation on/off |
| Menu (☰) | Debug report: log the focused element, how it's classified, and where each D-pad direction goes and why (graph / rescued / return / fallback) |
| Alt+Shift+G (keyboard) | Same as Y |
| Alt+Shift+D (keyboard) | Same as Menu (some sites swallow this shortcut; use Menu there) |
ANGLE_PENALTY, rejecting anything > MAX_DEVIATION off or merely
beside. Then a graph pass rescues elements nothing points to.AIM_TOLERANCE; wedges narrower than
MIN_WEDGE are merged. The pie in the graph view is this exact table.@sandbox DOM, Violentmonkey @inject-into content),
otherwise only same-origin frames take part. Frame
elements become proxies with translated rects, so all logic treats them alike.
A frame whose page scrolls is a container (one stop, enter with A/X); frames
that don't scroll are flattened into the page.Tunable constants are at the top of extension/content.js (stick thresholds,
repeat timing, scoring, wedge sizes); each has a comment.
npm run serve
Automated checks (Playwright, server running): npm run test:regress, and
npm run test:security (loads the real extension; forged-command attack).
Then open http://localhost:8765/test/ (the cross-origin frame loads from
127.0.0.1, so use localhost in the address). See docs/test-cases.md.
?timer drives polling with a timer instead of animation frames (for automated
runs in a background tab).window.__sofanavDebug = true, which exposes window.__sofanav
(candidates(), buildGraph(), current(), scopes(), focus(el),
state(), ...) for inspection and scripted tests.demo/sofanav-demo.mp4 (≈60 s): D-pad, graph view, stick pie, post cards, a scrollable comments panel, scrolling iframes as containers, and a non-scrolling iframe whose buttons belong to the page.
To re-record (after changes), with the test server running:
npm install
npx playwright install chromium
npm run demo
scripts/record-demo.js drives the test page with Playwright through the
keyboard stand-in and the virtual stick, adds captions and an input badge, and
writes demo/sofanav-demo.webm plus an .mp4 if ffmpeg is installed.
VERBOSE=1 npm run demo logs where focus lands after every press.
site/index.html is the landing page at https://mmis1000.me/SofaNav/. It
runs the built script itself, so visitors can try SofaNav with a controller (or
an opt-in keyboard mode). npm run build && npm run site assembles _site/:
the page, sofanav.user.js (install/update URL), sofanav-extension.zip,
the demo video and its poster. Preview locally with npm run serve:site.
.github/workflows/ci.yml runs on every push and pull request: it checks that
dist/sofanav.user.js was rebuilt from the current content.js, runs the
regression checks in Chromium, builds the site, and on main deploys it to
GitHub Pages.