xkorfun / dockpin

dockpin manual

dockpin keeps the macOS Dock on the display you choose. This manual covers installing it, the menu, how it decides which edges to guard, and what to do when something looks off.

Install

Homebrew (recommended):

brew install --cask esteban-eg-kim/tap/dockpin

By hand: download dockpin-x.y.z.zip from Releases, unzip it, move dockpin.app to /Applications, then run once in Terminal:

xattr -dr com.apple.quarantine /Applications/dockpin.app

dockpin is signed with its own certificate but not notarized by Apple (that needs a paid developer account). Without the line above, macOS says the app "can't be opened". Homebrew does this step for you.

First launch: the one permission

Open dockpin. A pin appears in the menu bar and a welcome window asks for one permission.

Welcome window

  1. Click Open System Settings.
  2. Turn on dockpin in the list:
    • macOS 13–26: Privacy & Security › Accessibility
    • macOS 27: Privacy & Security › Device Control and Data Access
  3. Come back. Within a second the window says Access allowed. Click Done.

That is the only permission dockpin needs. It does not need Input Monitoring; that permission is for reading the keyboard, which dockpin never does.

On first launch dockpin pins the Dock to the display it is on right now.

The menu

Click the pin in the menu bar.

The dockpin menu

ItemWhat it does
Pin the DockTurns dockpin on or off. Off, the menu bar icon shows a crossed-out pin and the Dock behaves as macOS normally does.
Keep the Dock onLists your displays by name and resolution. The checked one is where the Dock lives. Picking another moves the Dock there at once.
If It's UnpluggedWhere the Dock goes while the pinned display is disconnected: Leave the Dock Where It Is (default), or a display of your choice. When the pinned display comes back, so does the Dock.
Hold ⌥ to Let It MoveWhile on, holding Option lets the Dock move the usual way.
Open at LoginStarts dockpin when you log in.
⚠️ Allow Accessibility Access…Shown only while the permission is missing. Opens the right page in System Settings.
About dockpin / Quit dockpinVersion info / quit (⌘Q).

The menu bar icon tells you the state at a glance: a solid pin means dockpin is guarding; a crossed-out pin means it is off or still waiting for permission.

Moving the Dock

There are two ways to put the Dock on another display.

Pick it in the menu. Choose the display under Keep the Dock on. For about half a second the pointer disappears; dockpin runs it into that display's Dock edge, the Dock follows, and the pointer comes back to where it was. Don't move the mouse in that half second; dockpin ignores it anyway.

Hold ⌥ and push. With Hold ⌥ to Let It Move on, hold Option and push the pointer against the bottom of another display. The Dock moves the way it always did. This does not change the pinned display: it is a one-off.

dockpin also brings the Dock home on its own whenever it ends up somewhere else: when you turn Pin the Dock back on, when dockpin starts, when the pinned display is plugged back in, and when macOS moves the Dock by itself. macOS does that when displays wake from sleep: it may put the Dock on whichever display wakes first. No mouse is involved, so it can't be blocked, but dockpin checks every two seconds and fetches the Dock back a few seconds after the displays settle.

It leaves the Dock alone after an Option move, since you moved it on purpose, and while a mouse button is held. It never touches the pointer while the screen is locked, the displays are asleep, or you are switched to another user; after you unlock, it waits a second and then checks. If three tries in a row don't bring the Dock back, dockpin stops trying until the displays or its settings change, rather than keep taking over the pointer.

When it does move the Dock, it puts the pointer back exactly where it was, and tells the Dock so, so its icons don't stay magnified.

Which edges are guarded

The Dock moves when the pointer presses against a display's Dock edge. dockpin watches mouse movement and drops the moves that land in a thin strip (4 points) along that edge, on every display except the pinned one. The pointer still moves normally; the Dock just never sees the push.

Only the outer parts of an edge are guarded. Where another display is attached beyond the edge, the pointer crosses over as usual:

Guarded and open edges

Here the Dock is pinned to the portrait display. The bottom of the main display is guarded except the stretch above the small panel, which stays open so you can move the pointer down into it. The panel's own bottom is guarded.

If your Dock is on the left or right side (System Settings › Desktop & Dock › Position on screen), dockpin guards the left or right edges instead. It notices the change by itself within a few seconds.

Everyday situations

Unplugging the pinned display. While it is gone, dockpin keeps the Dock where it is now, or moves it to the display chosen under If It's Unplugged. Plug the pinned display back in and the Dock returns to it. A laptop that you sometimes use docked and sometimes alone is a typical case: pin the external display, and set the built-in display as the fallback.

Dock auto-hide. Works the same as a visible Dock: dockpin asks the Dock where it is, hidden or not. (If a future macOS removes that, dockpin falls back to looking at the screen layout, which can't see a hidden Dock; then it only moves the Dock when you pick a display.)

Displays waking from sleep. The Dock may briefly appear on another display while the displays come back, then return to the pinned one by itself.

Hot corners. Hot corners at the Dock edge of the other displays don't fire, because those moves are dropped. Hot corners on the pinned display and on the other edges work as usual.

Hovering at the very bottom. Apps on the other displays don't get hover events in the 4-point strip at their Dock edge. Clicks still go through.

Troubleshooting

The pin is crossed out, or the menu shows "⚠️ Allow Accessibility Access…". The permission is missing. Open System Settings from the menu item and turn dockpin on. If it already looks on, see the next item.

dockpin is switched on in System Settings, but it still waits for access. The entry belongs to an older copy of the app. In the list, select dockpin, click − to remove it, then use Open System Settings in dockpin (or +) to add it again and switch it on.

The Dock still moves to another display.

  • Check that the pin icon is solid and Pin the Dock is checked.
  • Check that you weren't holding Option.
  • Make sure the checked display under Keep the Dock on is the one you want.

Seeing what dockpin did. dockpin logs what it notices and does: displays changing, the Dock moving and why, fetching it back. Run this in Terminal while reproducing the problem, and include the output in an issue:

/usr/bin/log stream --predicate 'subsystem == "io.github.esteban-eg-kim.dockpin"'

Picking a display didn't move the Dock.

  • If the screen was locked, it waits until you unlock.
  • If the log says "giving up", three tries didn't work: pick the display again.
  • If the pinned display's whole Dock edge touches another display, there is no outer stretch to push against; dockpin can't move the Dock there. Move the Dock with Option, or rearrange displays in System Settings › Displays.

"dockpin can't be opened because Apple cannot check it for malicious software." Run xattr -dr com.apple.quarantine /Applications/dockpin.app once, or install with Homebrew.

Prefer no app at all?

macOS has one built-in way to keep the Dock in place: turn off Displays have separate Spaces (System Settings › Desktop & Dock › Mission Control), then log out and back in. The Dock and the menu bar then stay on the main display (set it in System Settings › Displays by dragging the menu bar).

The cost: only the main display gets a menu bar, a window can straddle displays, and full-screen apps take over every display instead of one. dockpin keeps separate Spaces and lets you put the Dock on any display, main or not.

Privacy

dockpin has no network code, collects nothing and stores only its own settings (which display is pinned and the menu toggles) in ~/Library/Preferences/io.github.esteban-eg-kim.dockpin.plist. It sees mouse movement and nothing else. The source is on GitHub.

Update and uninstall

brew upgrade --cask dockpin              # update
brew uninstall --cask --zap dockpin      # remove the app and its settings

By hand: quit dockpin, delete /Applications/dockpin.app, and remove dockpin from the Accessibility (or Device Control and Data Access) list.

Supported macOS versions

MinimummacOS 13 Ventura
TestedmacOS 27 on Apple silicon
ChipsApple silicon and Intel (one universal app)

macOS 13 is the floor because the menu bar menu and Open at Login rely on APIs added in 13. Versions 13–26 and Intel Macs are expected to work but haven't been tested by the author yet; reports are welcome in Issues.

Build from source

Only the Xcode Command Line Tools are needed (xcode-select --install).

git clone https://github.com/esteban-eg-kim/dockpin
cd dockpin
scripts/test.sh                 # unit tests for the edge geometry
ARCHS=arm64 scripts/bundle.sh   # → build/dockpin.app
open build/dockpin.app

Each ad-hoc build gets a new signature, and macOS ties the permission to the signature, so it asks again after every rebuild. To avoid that, sign with one self-signed code signing certificate: SIGN_ID="<name or SHA-1>" scripts/bundle.sh. See the comments at the top of scripts/bundle.sh for using a dedicated keychain, and docs/media/make.sh to regenerate the pictures and the demo video.

dockpin 사용 설명서

dockpin은 macOS Dock을 원하는 화면 하나에 고정합니다. 이 설명서는 설치, 메뉴, 어떤 가장자리를 막는지, 그리고 이상할 때 확인할 것을 다룹니다.

설치

Homebrew (권장):

brew install --cask esteban-eg-kim/tap/dockpin

직접 설치: Releases 에서 dockpin-x.y.z.zip 을 받아 압축을 풀고, dockpin.app 을 /Applications 로 옮긴 뒤 터미널에서 한 번 실행합니다:

xattr -dr com.apple.quarantine /Applications/dockpin.app

dockpin은 자체 인증서로 서명되어 있지만 Apple 공증(notarization)은 받지 않았습니다 (유료 개발자 계정이 필요). 위 명령이 없으면 macOS가 "앱을 열 수 없습니다"라고 합니다. Homebrew로 설치하면 이 단계를 대신 해 줍니다.

처음 실행: 권한 하나

dockpin을 열면 메뉴바에 핀 아이콘이 생기고, 환영 창이 권한 하나를 요청합니다.

환영 창

  1. Open System Settings 를 누릅니다.
  2. 목록에서 dockpin 을 켭니다:
    • macOS 13–26: 개인정보 보호 및 보안 › 손쉬운 사용
    • macOS 27: Privacy & Security › Device Control and Data Access
  3. 돌아오면 1초 안에 창이 Access allowed 로 바뀝니다. Done 을 누릅니다.

필요한 권한은 이것 하나입니다. 입력 모니터링은 필요 없습니다. 그건 키보드를 읽는 권한인데, dockpin은 키보드를 보지 않습니다.

처음 실행하면 지금 Dock이 있는 화면에 고정됩니다.

메뉴

메뉴바의 핀 아이콘을 누릅니다. 메뉴는 영어로 표시됩니다.

dockpin 메뉴

항목동작
Pin the Dockdockpin 켜기/끄기. 끄면 메뉴바 아이콘에 사선이 그어지고 Dock은 macOS 기본 동작으로 돌아갑니다.
Keep the Dock on연결된 화면을 이름과 해상도로 보여 줍니다. 체크된 화면이 Dock의 자리입니다. 다른 화면을 고르면 Dock이 바로 그리로 옮겨갑니다.
If It's Unplugged고정 화면이 연결되어 있지 않을 때 Dock을 둘 곳: Leave the Dock Where It Is(기본, 지금 자리에 둠) 또는 원하는 화면. 고정 화면이 돌아오면 Dock도 돌아옵니다.
Hold ⌥ to Let It Move켜 두면 Option 을 누르고 있는 동안은 Dock이 평소처럼 옮겨갑니다.
Open at Login로그인할 때 dockpin을 자동으로 실행합니다.
⚠️ Allow Accessibility Access…권한이 없을 때만 보입니다. 시스템 설정의 해당 화면을 엽니다.
About dockpin / Quit dockpin버전 정보 / 종료 (⌘Q).

메뉴바 아이콘으로 상태를 바로 알 수 있습니다. 꽉 찬 핀은 동작 중, 사선 그어진 핀은 꺼져 있거나 권한을 기다리는 중입니다.

Dock 옮기기

Dock을 다른 화면으로 옮기는 방법은 두 가지입니다.

메뉴에서 고르기. Keep the Dock on 에서 화면을 고르면, 0.5초쯤 커서가 사라졌다가 그 화면의 Dock 쪽 가장자리로 밀리고, Dock이 따라온 뒤 커서는 원래 자리로 돌아옵니다. 그 0.5초 동안 마우스를 움직여도 무시되니 기다리면 됩니다.

⌥ 누른 채 밀기. Hold ⌥ to Let It Move 가 켜져 있으면, Option 을 누른 채 다른 화면 아래쪽으로 커서를 밀면 Dock이 평소처럼 옮겨갑니다. 고정 화면 설정은 바뀌지 않는 일회성 이동입니다.

Dock이 다른 곳에 가 있으면 dockpin이 알아서 고정 화면으로 데려옵니다. Pin the Dock 을 다시 켤 때, dockpin이 시작될 때, 고정 화면을 다시 연결했을 때, 그리고 macOS가 직접 Dock을 옮겼을 때입니다. macOS는 모니터가 절전에서 깨어날 때 먼저 켜진 화면으로 Dock을 옮기기도 합니다. 마우스와 상관없는 일이라 막을 수는 없지만, dockpin이 2초마다 확인해서 화면이 안정되면 몇 초 안에 다시 데려옵니다.

Option 으로 일부러 옮긴 Dock과, 마우스 버튼을 누르고 있는 동안은 건드리지 않습니다. 화면이 잠겨 있거나, 모니터가 절전 중이거나, 다른 사용자로 전환된 동안에는 커서를 절대 움직이지 않고, 잠금을 풀면 1초 뒤에 확인합니다. 연속 세 번 시도해도 돌아오지 않으면, 커서를 계속 뺏지 않도록 화면 구성이나 설정이 바뀔 때까지 멈춥니다.

Dock을 옮긴 뒤에는 커서를 정확히 원래 자리로 돌려놓고 Dock에도 알려 주기 때문에, Dock 아이콘이 확대된 채로 남지 않습니다.

어떤 가장자리를 막나

Dock은 커서가 화면의 Dock 쪽 가장자리를 미는 것을 보고 옮겨갑니다. dockpin은 마우스 이동을 지켜보다가, 고정 화면이 아닌 모든 화면의 그 가장자리 얇은 띠(4pt) 안에서 생긴 움직임만 버립니다. 커서는 평소처럼 움직이고, Dock만 그 "밀기"를 못 봅니다.

가장자리 중 바깥쪽 부분만 막습니다. 가장자리 너머에 다른 화면이 붙어 있는 구간은 평소처럼 넘어갈 수 있습니다:

막힌 가장자리와 열린 구간

이 그림에서는 Dock이 세로 화면에 고정되어 있습니다. 메인 화면 아래쪽은 막히지만, 작은 패널 바로 위 구간은 열려 있어 커서를 아래 패널로 내릴 수 있습니다. 패널 자체의 아래쪽은 막힙니다.

Dock을 왼쪽이나 오른쪽에 두었다면(시스템 설정 › 데스크탑 및 Dock › 화면에서의 위치) 왼쪽/오른쪽 가장자리를 막습니다. 바꾸면 몇 초 안에 알아서 반영됩니다.

이럴 땐 이렇게 동작합니다

고정한 화면을 뽑았을 때. 그 화면이 없는 동안에는 Dock을 지금 있는 화면에 두거나, If It's Unplugged 에서 고른 화면으로 옮깁니다. 노트북을 외장 모니터에 연결해서도 쓰고 혼자서도 쓴다면, 외장 모니터에 고정하고 대체 화면을 내장 화면으로 정해 두면 됩니다. 고정 화면을 다시 연결하면 Dock이 그 화면으로 돌아갑니다.

Dock 자동 가리기. 보이는 Dock과 똑같이 동작합니다. dockpin이 Dock에게 직접 위치를 물어보기 때문에 숨어 있어도 압니다. (나중에 macOS에서 이 방법이 막히면 화면 배치로 추측하는 방식으로 돌아가는데, 그 방식은 숨은 Dock을 못 봅니다. 그때는 메뉴에서 화면을 직접 고를 때만 Dock을 옮깁니다.)

모니터가 절전에서 깨어날 때. 화면들이 켜지는 동안 Dock이 잠깐 다른 화면에 나타났다가, 곧 고정 화면으로 알아서 돌아옵니다.

핫코너. 다른 화면의 Dock 쪽 핫코너는 동작하지 않습니다(그 움직임을 버리기 때문). 고정 화면의 핫코너와 다른 모서리의 핫코너는 그대로 동작합니다.

맨 아래에서의 hover. 다른 화면의 Dock 쪽 4pt 띠 안에서는 앱이 hover 이벤트를 받지 못합니다. 클릭은 그대로 됩니다.

문제 해결

핀에 사선이 있거나, 메뉴에 "⚠️ Allow Accessibility Access…" 가 보인다. 권한이 없는 상태입니다. 그 메뉴로 시스템 설정을 열고 dockpin을 켜 주세요. 이미 켜져 있는 것처럼 보이면 다음 항목을 보세요.

시스템 설정에서는 켜져 있는데 계속 권한을 기다린다. 그 항목이 예전 버전의 앱 것입니다. 목록에서 dockpin 을 선택하고 − 로 지운 뒤, dockpin의 Open System Settings (또는 +)로 다시 추가하고 켜 주세요.

Dock이 여전히 다른 화면으로 넘어간다.

  • 핀 아이콘이 꽉 차 있고 Pin the Dock 이 체크되어 있는지 확인하세요.
  • Option 을 누르고 있지 않았는지 확인하세요.
  • Keep the Dock on 에서 체크된 화면이 원하는 화면인지 확인하세요.

dockpin이 무엇을 했는지 보기. dockpin은 화면 변경, Dock 이동과 그 이유, 되돌리기 시도를 로그로 남깁니다. 문제를 재현하면서 터미널에서 아래를 실행하고, 이슈에 출력을 붙여 주세요:

/usr/bin/log stream --predicate 'subsystem == "io.github.esteban-eg-kim.dockpin"'

화면을 골랐는데 Dock이 안 옮겨졌다.

  • 화면이 잠겨 있었다면 잠금을 풀 때까지 기다립니다.
  • 로그에 "giving up" 이 있으면 세 번 시도해도 안 된 것이니 화면을 다시 골라 주세요.
  • 고정 화면의 Dock 쪽 가장자리 전체가 다른 화면과 맞닿아 있으면 밀 수 있는 바깥 구간이 없어서 옮길 수 없습니다. Option 으로 옮기거나 시스템 설정 › 디스플레이에서 배치를 바꿔 주세요.

"Apple에서 악성 소프트웨어가 있는지 확인할 수 없기 때문에 dockpin을 열 수 없습니다." xattr -dr com.apple.quarantine /Applications/dockpin.app 을 한 번 실행하거나 Homebrew로 설치하세요.

앱 없이 하고 싶다면

macOS에도 Dock을 고정하는 방법이 하나 있습니다. 시스템 설정 › 데스크탑 및 Dock › Mission Control 에서 디스플레이마다 별도의 Spaces 사용(영문 Displays have separate Spaces) 을 끄고 로그아웃했다가 다시 로그인하면, Dock과 메뉴바가 주 디스플레이에만 머뭅니다(주 디스플레이는 시스템 설정 › 디스플레이에서 메뉴바를 끌어 정합니다).

대신 메뉴바가 주 디스플레이에만 생기고, 창이 두 화면에 걸칠 수 있으며, 전체 화면 앱이 한 화면이 아니라 모든 화면을 차지합니다. dockpin은 별도 Spaces를 그대로 두고, 주 디스플레이가 아닌 화면에도 Dock을 고정할 수 있습니다.

개인정보

dockpin에는 네트워크 코드가 없고, 아무것도 수집하지 않으며, 자기 설정(고정 화면과 메뉴 토글)만 ~/Library/Preferences/io.github.esteban-eg-kim.dockpin.plist 에 저장합니다. 보는 것은 마우스 움직임뿐입니다. 소스는 GitHub에 전부 있습니다.

업데이트와 삭제

brew upgrade --cask dockpin              # 업데이트
brew uninstall --cask --zap dockpin      # 앱과 설정 삭제

직접 설치했다면: dockpin을 종료하고 /Applications/dockpin.app 을 지운 뒤, 손쉬운 사용(또는 Device Control and Data Access) 목록에서 dockpin을 제거하세요.

지원하는 macOS 버전

최소macOS 13 Ventura
테스트macOS 27, Apple 실리콘
칩Apple 실리콘과 Intel (하나의 유니버설 앱)

메뉴바 메뉴와 로그인 시 실행이 macOS 13에서 추가된 API를 쓰기 때문에 13이 하한입니다. 13–26과 Intel 맥은 동작할 것으로 보지만 아직 직접 테스트하지는 못했습니다. Issues 에 결과를 알려 주시면 고맙겠습니다.

소스에서 빌드

Xcode Command Line Tools 만 있으면 됩니다 (xcode-select --install).

git clone https://github.com/esteban-eg-kim/dockpin
cd dockpin
scripts/test.sh                 # 가장자리 계산 단위 테스트
ARCHS=arm64 scripts/bundle.sh   # → build/dockpin.app
open build/dockpin.app

ad-hoc 빌드는 매번 서명이 바뀌고, macOS는 권한을 서명에 묶기 때문에 다시 빌드할 때마다 권한을 다시 물어봅니다. 피하려면 자체 서명 코드 서명 인증서 하나로 서명하세요: SIGN_ID="<이름 또는 SHA-1>" scripts/bundle.sh. 전용 키체인 사용법은 scripts/bundle.sh 맨 위 주석을, 그림과 데모 영상을 다시 만드는 법은 docs/media/make.sh 를 보세요.