DeepSeek Harness Remote
DeepSeek Harness Remote: DeepSeek Harness 실행 PC와 모바일·PC를 안전하게 연결해 어디서나 작업 이어받기
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기One tap. Your Mac handles the rest.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗One-tap Mac tools in Control Center and the menu bar. Built for people who vibe code and just want things to work.
Tapdeck has no window, no Dock icon and no settings. Its tools show up as native controls you add to Control Center or pin to the menu bar, and as actions in Spotlight and the Shortcuts app.
Turns off the screen and keyboard light while the Mac keeps running, so a long agent run, build or download continues in the dark.
A toggle that keeps the Mac running, even with the lid closed. It's the same as:
sudo pmset -a disablesleep 1 # on
sudo pmset -a disablesleep 0 # off
pmset -a disablesleep 0|1 and only accepts calls from Tapdeck signed by the same team. macOS asks you to approve it once.Don't carry a closed Mac in a bag with Stay Awake on. It keeps running, gets warm and drains the battery.
Check it from Terminal:
pmset -g | grep SleepDisabled # 1 = on, 0 = off
pmset -g stats # Sleep Count stays the same if the Mac never slept
A toggle that mutes every microphone at once, the way the mute button on an external mic does.
Tapdeck --status lists every input and whether it can be muted.Spotlight: press ⌘ Space and type Lights Out, Toggle Stay Awake or Toggle Mic Mute. For a keyboard shortcut (a mute key, say), add the action to a shortcut in the Shortcuts app and choose Add Keyboard Shortcut.
Requires macOS 26 Tahoe or later. Universal (Apple silicon and Intel).
Tapdeck keeps running in the background, so Finder says the item “Tapdeck” is in use if you replace it directly. Quit it first:
pkill -x Tapdeck; pkill -x TapdeckControls
Then drag the new Tapdeck into Applications, choose Replace, and open it. Your settings and Control Center buttons stay as they are.
If a new tool doesn't show up in Edit Controls afterwards, or a button looks old, macOS is still using an older copy of Tapdeck it remembers (in Downloads, the Trash or an old disk image). This makes it forget every copy outside Applications and reload the buttons:
LSR=/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister
pkill -x Tapdeck; pkill -x TapdeckControls
"$LSR" -dump | grep -E "^path: +/.*/Tapdeck\.app( |$)" | sed -E 's/^path: +//; s/ \(0x[0-9a-f]+\)$//' | sort -u | grep -v "^/Applications/Tapdeck.app$" | while read -r old; do echo "Forgetting old copy: $old"; "$LSR" -u "$old"; done
"$LSR" -f /Applications/Tapdeck.app
pluginkit -a /Applications/Tapdeck.app/Contents/PlugIns/TapdeckControls.appex
killall chronod
open /Applications/Tapdeck.app
echo "Tapdeck version: $(defaults read /Applications/Tapdeck.app/Contents/Info.plist CFBundleShortVersionString)"
The last line should show the version you installed. If it shows an older one, the new Tapdeck never reached Applications: download it again and drag it in.
Every tool can also be read and switched from outside Control Center, with no server running:
/Applications/Tapdeck.app/Contents/MacOS/Tapdeck install-cli # once: adds `tapdeck` to ~/.local/bin
tapdeck status --json
tapdeck mic toggle
tapdeck awake on
tapdeck lights out
Browser extensions reach Tapdeck through Chrome's native messaging: run tapdeck chrome install, then load the sample extension (download the zip, or use extensions/chrome). Its popup shows all three tools, and Alt+Shift+M toggles the mic.
The full guide, with every command, the JSON format, building your own extension and troubleshooting, is in docs/integrations.md.
Requires Xcode 26 or later and an Apple Development certificate. Put your Team ID in a local config file (git ignores it):
cp Config/Local.xcconfig.example Config/Local.xcconfig # then edit DEVELOPMENT_TEAM
./scripts/install.sh
| Script | What it does |
|---|---|
scripts/build.sh | Builds Tapdeck.app (Release, universal) with a fresh build number |
scripts/install.sh | Builds, installs to /Applications and registers the controls |
scripts/make-dmg.sh | Builds dist/Tapdeck-<version>.dmg, dist/Tapdeck.dmg and dist/tapdeck-chrome-extension.zip for a release |
scripts/make-icon.swift | Draws the app icon and the website icons |
Every build gets a new build number because WidgetKit caches each extension's list of controls by build number. install.sh also stops the old extension process so Control Center redraws with the new code.
./scripts/make-dmg.sh
gh release create v1.2 dist/Tapdeck.dmg dist/tapdeck-chrome-extension.zip --title "Tapdeck 1.2"
The website's download buttons point to releases/latest/download/Tapdeck.dmg, so they always serve the newest release.
The landing page is site/index.html (English and Arabic, light and dark). .github/workflows/pages.yml publishes it to GitHub Pages on every push that changes site/. To preview it locally:
python3 -m http.server 8765 --directory site
App/ The app (not sandboxed). Does the real work.
Features/ One folder per tool: LightsOut, StayAwake, MicMute
Hardware/ Display brightness, keyboard light, input activity, root helper client
AppShortcuts.swift Spotlight and Shortcuts actions
ControlsExtension/ WidgetKit extension with the Control Center controls
Shared/ Code in both the app and the extension: TapdeckAction, ControlKind, App Intents, AudioInputs
Helper/ TapdeckHelper, the root launchd daemon (SMAppService)
HelperInterface/ XPC protocol shared by the app and the helper
Config/ Info.plists, entitlements, the helper's launchd plist, Signing.xcconfig
site/ The landing page
On macOS 26, a control's intent runs inside the sandboxed, short-lived widget extension. It can't touch hardware or keep watching for input, so it hands the action to the app by opening tapdeck://<action> in the background. The app launches if needed, never takes focus, and does the work.
TapdeckAction in Shared/TapdeckAction.swift.App/TapdeckActionHandler.swift, ideally in its own folder under App/Features/.Shared/Intents/ that calls TapdeckAction.<case>.run().ControlKind, a ControlWidget in ControlsExtension/Controls/, and list it in TapdeckBundle.App/AppShortcuts.swift and give it a card on the website.Anything that needs root becomes a new, narrowly scoped method on TapdeckHelperProtocol, never "run this command".
/Applications/Tapdeck.app/Contents/MacOS/Tapdeck --status
Prints what Tapdeck can see and control (displays, brightness, keyboard light, Stay Awake, helper approval, every microphone and whether it can be muted) without changing anything.
/usr/bin/log show --last 10m --style compact --predicate 'subsystem == "com.ibtkrgo.Tapdeck"'
Logs from the app, the extension and the helper. In zsh, log is a shell builtin, so use the full path.
To uninstall: turn Stay Awake and Mic Mute off, run Tapdeck --unregister-helper (same path as above), quit with pkill -x Tapdeck, and move the app to the Trash.
DisplayServices and CoreBrightness frameworks. That rules out the Mac App Store and may break with a macOS update; --status shows it right away.MIT. See LICENSE.