A native macOS window manager with smooth physics-based scrolling tiling.
Current Features:
- Window tracking via Accessibility API
- Horizontal tiling layout with smooth scrolling
- Spring physics animations for natural motion
- Velocity-based gesture tracking
- Touchpad swipe gestures with momentum
- Snap-to-column behavior
- Keyboard navigation (Cmd+Option+H/J/K/L)
- 120Hz ProMotion support via CVDisplayLink
- Automatic window management
- Multi-column support
In Development:
- Multi-monitor support (Phase 3)
- Workspace management (Phase 3)
- Visual feedback and borders (Phase 4)
- macOS 13.0 (Ventura) or later
- Accessibility permissions
cd MacTiler
swift build -c releaseswift runOn first launch, grant Accessibility permissions when prompted.
Cmd+Option+H- Focus window leftCmd+Option+L- Focus window rightCmd+Option+K- Focus window up (within column)Cmd+Option+J- Focus window down (within column)
- Two-finger horizontal swipe - Scroll through window columns
- Smooth physics-based scrolling
- Velocity tracking with momentum
- Automatic snap to nearest column
- Works on both trackpad and Magic Mouse
The animation system uses a critically-damped spring model for smooth, natural motion. Key properties:
- Damping Ratio: Controls how quickly oscillations settle (critically damped = 1.0 for no overshoot)
- Natural Frequency: Determines animation speed while maintaining physical plausibility
- Velocity Continuity: Animations can be interrupted and seamlessly transition to new targets
The spring equation x'' + 2ζωx' + ω²x = 0 is solved analytically for precise frame-by-frame positions.
The gesture system implements velocity estimation with several techniques:
- Exponential smoothing: Filters noisy input while preserving responsiveness
- Directional locking: Prevents diagonal drift during intentional horizontal/vertical swipes
- Momentum calculation: Converts final gesture velocity into animation parameters
The scrolling layout uses a column-based approach:
- Windows are organized into columns that tile horizontally
- Each column can contain multiple vertically-stacked windows
- The view scrolls horizontally, with one column designated as "active"
- Snap points are calculated based on column positions and widths
- Smooth interpolation handles the transition between discrete column positions
- Window tracking via Accessibility API
- Basic tiling layout
- Keyboard shortcuts
- Spring physics animations
- Velocity-based gesture tracking
- 120Hz smooth scrolling
- Snap-to-column behavior
- Per-monitor workspaces
- Vertical workspace switching
- Display hotplug support
- Visual feedback (borders, overlays)
- Configuration system
- Window rules
- Performance optimization
GPL-3.0-or-later
This project was inspired by niri, a scrollable-tiling Wayland compositor for GNOME Linux.