Open-source screen annotation tool for macOS and Windows. Presentify alternative at $0 cost.
SFPoint is a screen annotation overlay for macOS and Windows. Toggle a hotkey, draw on your screen, keep teaching. Arrows, rectangles, circles, freehand, text, laser pointer — all on a transparent overlay that auto-fades after 3 seconds.
Built as a replacement for Presentify ($6.99). SFPoint is free, open-source, and fully customizable.
- 7 annotation tools — arrow, rectangle, circle, freehand, text, laser pointer, highlighter
- Toggle-based shortcuts — Ctrl+key to activate, same key or Esc to deactivate
- Auto-fade — annotations disappear after 3 seconds (configurable)
- Laser pointer — ambar Google Slides-style, click-through (doesn't block mouse), morado ripple on click
- No focus stealing — overlay floats above everything without interrupting your work (native OS APIs)
- Click-through — laser always passes clicks through; other tools only capture when active
- Floating toolbar — draggable pill showing current tool and color
- Rebindable shortcuts — settings panel (Ctrl+S) to customize keybindings
- Brand colors — morado (#8B5CF6) + ambar (#F59E0B) from SaaS Factory
Prerequisites: macOS 15+, Python 3.12+, Homebrew
# Clone
git clone https://github.com/daniel-carreon/sfpoint.git
cd sfpoint
# Python environment
python3.12 -m venv venv
source venv/bin/activate
pip install -r mac/requirements.txt
# Run
python3 main.pyOptional: Shell aliases — add to your ~/.zshrc:
alias sfpoint='pkill -f "sfpoint/main.py" 2>/dev/null; sleep 0.5; PYTHONPATH=~/Developer/software/sfpoint/venv/lib/python3.12/site-packages /opt/homebrew/Cellar/python@3.12/3.12.13/Frameworks/Python.framework/Versions/3.12/Resources/Python.app/Contents/MacOS/Python ~/Developer/software/sfpoint/main.py &>/dev/null & disown; echo "SFPoint running"'
alias sfpoint-off='pkill -f "sfpoint/main.py" 2>/dev/null; echo "SFPoint stopped"'Prerequisites: Windows 10+, Python 3.12+ (from python.org)
:: Clone
git clone https://github.com/daniel-carreon/sfpoint.git
cd sfpoint
:: Python environment
python -m venv venv
venv\Scripts\activate
pip install -r win\requirements.txt
:: Run
python main.pyDouble-click launcher: run win/start_sfpoint.bat directly (activates venv automatically).
| Action | Shortcut |
|---|---|
| Arrow | Ctrl+A |
| Rectangle | Ctrl+R |
| Circle | Ctrl+C |
| Freehand | Ctrl+F |
| Text | Ctrl+T (type, Enter to place) |
| Laser pointer | Ctrl+P (ambar glow trail) |
| Hide toolbar | Ctrl+H |
| Settings | Ctrl+S |
| Undo | Cmd+Z (macOS) / Ctrl+Z (Windows) |
| Clear all | Cmd+Shift+Z (macOS) / Ctrl+Shift+Z (Windows) |
| Deactivate | Esc or press same shortcut again |
All tool shortcuts are toggle-based: press once to activate, press again (or Esc) to deactivate.
Required in System Settings > Privacy & Security:
- Accessibility — for global hotkeys and overlay interaction (add your Terminal app)
- Input Monitoring — for keyboard listener (add your Terminal app)
No special permissions needed. If your antivirus blocks hotkeys, add an exception for pynput or the sfpoint folder.
Ctrl+Key (pynput) --> Toggle Tool On/Off --> Canvas Overlay (PyQt6 + platform backend)
|
QPainter Rendering
|
Auto-Fade (3s delay + 0.5s fade)
|
Floating Toolbar (pill UI)
Key technical decisions:
- Platform abstraction layer (
plat/) — macOS uses PyObjC/AppKit/CoreGraphics, Windows uses Win32 API via ctypes - Click-through toggle —
setIgnoresMouseEvents_on macOS,WS_EX_TRANSPARENTon Windows - Qt QueuedConnection for thread-safe signals between pynput and UI
- QPainter for all rendering (shapes, laser trail with radial gradients, text)
- Toggle-based hotkeys instead of hold-based for better ergonomics
Want to build this from scratch? Copy PRP.md and paste it to Claude (or any AI assistant) with:
"Build this project following the PRP phases. Execute all phases sequentially, validating each one before moving to the next."
The PRP contains the complete blueprint: architecture, gotchas, anti-patterns, and validation steps. It's designed so an AI agent can build the entire project in a single session.
See CLAUDE.md for detailed development instructions and troubleshooting.
All configuration lives in config.py:
# Shortcuts (toggle-based Ctrl+key)
TOOL_SHORTCUTS = {
"a": TOOL_ARROW, "r": TOOL_RECT, "c": TOOL_CIRCLE,
"f": TOOL_FREEHAND, "t": TOOL_TEXT, "p": TOOL_LASER,
}
# Fade timing
FADE_DELAY = 3.0 # seconds before fade starts
FADE_DURATION = 0.5 # seconds for fade animation
# Laser pointer (subtle, elegant)
LASER_DOT_RADIUS = 5.0
LASER_GLOW_RADIUS = 14.0
LASER_TRAIL_LENGTH = 18 # clean, short trail
# Toolbar
TOOLBAR_HEIGHT = 34
TOOLBAR_WIDTH = 180Custom shortcuts are saved to settings.json via the settings panel (Ctrl+S).
| Presentify | SFPoint | |
|---|---|---|
| Cost | $6.99 one-time | Free |
| Customizable | Limited | Fully |
| Open source | No | Yes |
| Laser pointer | Red | Ambar (Google Slides-style) |
| Auto-fade | Yes | Yes (configurable) |
| Rebindable shortcuts | No | Yes |
| Problem | Solution |
|---|---|
| Tool doesn't activate | Grant Accessibility + Input Monitoring to your Terminal |
| Overlay steals focus | Verify pyobjc-framework-Cocoa: pip install pyobjc-framework-Cocoa |
| Python version error | Requires 3.12+ — brew install python@3.12 |
sfpoint alias not found |
Run source ~/.zshrc after adding aliases |
| Background launch fails | Must use Framework Python binary (see CLAUDE.md) |
| Problem | Solution |
|---|---|
| Hotkeys don't work | Antivirus may block pynput — add sfpoint folder as exception |
| Overlay not on top | Run app at same privilege level as target app (avoid admin/user mismatch) |
| Cursor doesn't hide in laser mode | Known Win32 ShowCursor quirk — toggle laser off/on to reset |
python not found |
Reinstall Python 3.12+ with PATH option enabled |
win/start_sfpoint.bat closes instantly |
Run from cmd or PowerShell to read the error |
MIT License. Do whatever you want with it.
Built with Claude Opus 4.6 in a single session.
From daniel-carreon — SFPoint
