curtain/.github/wiki/Installation.md

2.7 KiB

Installation

Prerequisites

  • macOS 13 or later (Apple Silicon recommended).
  • Screen Sharing enabled in System Settings > General > Sharing > Screen Sharing.
  • Admin rights on the machine (the install script needs one sudo prompt).

Install

git clone https://github.com/acamarata/curtain.git
cd curtain
./Scripts/install.sh

The script does the following in one go:

What it sets up Where Why
Curtain.app bundle /Applications/Curtain.app Ad-hoc codesigns the bundle so TCC (Accessibility) grants a stable identity.
Login LaunchAgent ~/Library/LaunchAgents/com.acamarata.curtain.plist Starts Curtain automatically when you log in.
Root helper /usr/local/bin/curtain-endsession Lets Curtain kill the Screen Sharing connection (owned by root) without a password prompt.
Sudoers rule /etc/sudoers.d/curtain-endsession NOPASSWD for the helper only. Requires one admin prompt during install.

After the script finishes, Curtain starts automatically and a 👁 icon appears in the menu bar.

Grant Accessibility

Curtain needs Accessibility permission to block physical keyboard and mouse input. Without it the curtain still covers the screen, but desk input reaches your apps.

  1. Open System Settings > Privacy & Security > Accessibility.
  2. Find Curtain in the list and turn it on.
  3. Relaunch Curtain: launchctl kickstart -k gui/$(id -u)/com.acamarata.curtain

If Curtain does not appear in the Accessibility list, run:

open -a Curtain

Then check again.

Set a password

From the menu-bar icon, choose Set Password… and type the password you want to use at the desk to end a remote session.

If you never set a password, the default is curtain.

Passwords are stored as a salted SHA-256 hash in ~/Library/Application Support/Curtain/config.json. The plaintext is never saved.

If you have any DisplayLink USB monitors, choose Mark Current Externals as DisplayLink from the menu. This tells Curtain to use a different cover mode for those displays.

To see which display is which first, choose Identify Displays — each monitor flashes its index number and serial for six seconds.

See How It Works — DisplayLink for why this matters.

Uninstall

./Scripts/uninstall.sh

This removes the app bundle, LaunchAgent, helper binary, and sudoers rule.

Manual LaunchAgent management

# Stop
launchctl unload ~/Library/LaunchAgents/com.acamarata.curtain.plist

# Start
launchctl load ~/Library/LaunchAgents/com.acamarata.curtain.plist

# Restart
launchctl kickstart -k gui/$(id -u)/com.acamarata.curtain