A native macOS SwiftUI application that helps organize directory contents into relevant, semantically-named folders.
![]() |
![]() |
![]() |
|---|---|---|
| Organize your workspace | Preview every move before applying it | Review duplicate files clearly |
- Intelligent Organization: Sorty understands file content and context for accurate categorization.
- The Learnings Profile: A passive learning system that trains from your existing folder structures, manual corrections, and even cancelled organizations to continuously improve future suggestions.
- Custom Personas: Create and edit specialized profiles for different workflows (e.g., Developer, Photographer, Student).
- Multiple AI Providers:
- OpenAI, Anthropic, Gemini, GitHub Copilot, Groq, OpenRouter, Ollama, and custom OpenAI-compatible endpoints.
- Apple Foundation Models (on-device and privacy-focused; requires macOS 26+ with Apple Intelligence).
- Vision Support: Multimodal analysis for providers that support it to understand image content when organizing.
- Finder Extension: Right-click any folder in Finder to instantly start the organization process.
- App-Wide Deeplinks: Control the app externally via
sorty://URL schemes for automation and shortcuts. - Menu Bar Controls: Quick access with keyboard shortcuts for common actions.
- Interactive Preview: Review and tweak suggested organization before any files are moved.
- Organization History: Track all operations with detailed analytics, reasoning, and rollback support.
- Automatic Updates: Background update checking on app launch (once per 24 hours) with manual check available via menu.
- Storage Locations: Define custom storage destinations for organized files.
- HUD Notifications: Non-intrusive visual feedback and actions for operations and status updates.
- Safe by Design: Includes dry-run modes, comprehensive validation, duplicate protection settings, and exclusion rules.
- macOS 15.0 or later
- Xcode 16.0 or later
- (Optional) API key for OpenAI or compatible provider
- Download the latest
.zipfrom the Releases page. - Unzip and drag
Sorty.appto your/Applicationsfolder.Note: Moving the app to
/Applicationsis highly recommended. It ensures that security bookmarks for "Watched Folders" persist reliably across app restarts. - Important: Since the app is not notarized (no Apple Developer certificate), you need to remove the quarantine attribute:
Paste the command into Terminal, press Return, and enter your Mac password. Terminal does not show the password while you type it.
sudo xattr -cr /Applications/Sorty.app
- Open Sorty from
/Applications.
Note
The command changes extended attributes only on the Sorty.app copy in /Applications, clearing the quarantine metadata that can block an unsigned app. Use it only for a copy downloaded from this repository.
Using Make (Recommended):
git clone https://github.com/sorty-organizer/Sorty.git
cd Sorty
make runUsing Xcode:
- Open
Sorty.xcodeprojin Xcode. - Select the
Sortyscheme and your Mac as the destination. - Press
⌘Rto build and run.
- Navigate to the Settings tab in the app.
- Configure your preferred provider:
- OpenAI-Compatible: Enter the API URL and your private key.
- Apple Foundation Models: Requires macOS 26+ with Apple Intelligence enabled.
Sorty includes Finder Integration as a core app feature:
- Open Settings -> Finder Integration.
- Use Activate or Repair if the Finder extension needs attention.
- Use Open Extensions and confirm SortyFinderSync is enabled in macOS Extensions settings.
Important
The Finder extension requires App Groups to be configured in both the main app and extension targets using the identifier group.com.sorty.app.
- Add folders to the "Watched" list in the sidebar to enable automatic background monitoring.
- Note: The "Auto-Organize" feature will remain disabled until a valid provider is configured in Settings.
Sorty is designed with security and privacy in mind:
Data Handling:
- File analysis happens via your chosen provider, including supported cloud services, Ollama, or Apple Foundation Models
- Sorty sends relative folder structure and available file metadata to your selected provider; Deep Scan additionally extracts supported content locally and sends bounded text and metadata summaries
- API keys are stored in the macOS Keychain
- The Learnings profile is encrypted with AES-256 and protected by Touch ID or your Mac login password
- Privacy Mode: Enabled by default, blurs sensitive handles until hover and hides API keys with a manual reveal toggle.
Release Signing: Pre-built releases are NOT code-signed. You will need to remove macOS quarantine flags after installation (see Installation section). Build from source if you prefer complete control.
Best Practices:
- Use Ollama or Apple Foundation Models for on-device processing. For very large directories, choose a model with enough context capacity.
- Review which files are being sent to cloud AI providers
- Enable Safe Deletion for duplicate management
- Regularly backup important directories
For detailed security information, see SECURITY.md.
If you see an error indicating that access to a watched folder has been lost (e.g., "Permission Denied" or missing bookmarks):
- This is often due to macOS App Sandbox restrictions.
- Ensure the app is running from the
/Applicationsfolder. - Remove the folder from the Watched list and add it again to refresh the security bookmark.
- If "Auto-Organize" is grayed out or not functioning, check Settings -> AI Provider.
- A valid API configuration (or Apple Intelligence setup) is required for the app to analyze and sort files.
- If update checks fail, verify you have an active internet connection.
- Check if you can access GitHub Releases in your browser.
- Rate limiting may occur if too many requests are made; wait a few minutes and try again.
- Open Settings and click Check for Updates.
- If the app shows "Up to date", you have the latest version.
- Alternatively, compare the version in About with the latest release.
New installations use the version-independent Sorty.zip download. Move Sorty.app to /Applications; Sorty opens onboarding until setup is completed.
Sources/SortyLib/: Shared product logic, services, models, and SwiftUI views.Sources/SortyApp/: Main macOS application entry and navigation.Sources/SortyFinderSync/: Finder Sync extension entry point.Sources/SortyWidgets/: WidgetKit extension and shared widget surfaces.Tests/SortyTests/: Unit and integration tests.Tests/SortyUITests/: macOS UI and accessibility tests.website/: Public Next.js website and current product screenshots.scripts/: Build and automation scripts.
flowchart LR
subgraph EntryPoints["Entry Points"]
User["User"]
Finder["Finder right-click<br/>SortyFinderSync"]
Shortcuts["Shortcuts and App Intents<br/>sorty:// deeplinks"]
WatchEvents["Watched folders<br/>FSEvents and schedules"]
MenuBar["Menu bar extra<br/>global shortcuts"]
Widgets["Widgets<br/>SortyWidgetSnapshotStore"]
end
subgraph AppShell["App Shell - Sources/SortyApp"]
SortyApp["SortyApp<br/>SwiftUI scenes"]
MainWindow["MainWindowRootView<br/>ContentView navigation"]
Coordinator["AppCoordinator<br/>background automation"]
ExtensionListener["ExtensionListener"]
DeeplinkHandler["DeeplinkHandler"]
WidgetSync["SortyWidgetSyncManager"]
end
subgraph StateAndSettings["Shared State and Managers"]
AppState["AppState"]
Settings["SettingsViewModel<br/>AIConfig"]
Personas["PersonaManager<br/>CustomPersonaStore"]
WatchedFolders["WatchedFoldersManager"]
Storage["StorageLocationsManager"]
Exclusions["ExclusionRulesManager"]
Notifications["NotificationManager<br/>HUD and native alerts"]
ModelCatalog["ModelCatalog"]
Auth["Keychain and auth managers<br/>ProviderAuthResolver"]
end
subgraph OrganizePipeline["Organization Pipeline - Sources/SortyLib"]
FolderOrganizer["FolderOrganizer<br/>idle -> scanning -> organizing -> ready -> applying -> completed"]
Scanner["DirectoryScanner"]
Content["ContentAnalyzer"]
Vision["VisionAnalyzer<br/>ImageVisionAnalyzer"]
PromptContext["PromptContextHelper<br/>directory and folder context"]
PromptBuilder["PromptBuilder<br/>system and user prompts"]
AIClientFactory["AIClientFactory"]
AIClient["AIClientProtocol"]
ResponseParser["ResponseParser"]
Plan["OrganizationPlan"]
Preview["PreviewManager<br/>PreviewView"]
end
subgraph AIProviders["AI Providers"]
OpenAI["OpenAI-compatible<br/>OpenAI, Groq, OpenRouter, Gemini, Ollama"]
Anthropic["Anthropic"]
Copilot["GitHub Copilot"]
Codex["Codex subscription"]
AppleFM["Apple Foundation Models"]
end
subgraph ApplyAndSafety["Apply, Safety, and Recovery"]
Normalizer["StorageDestinationNormalizer"]
Validator["FileOrganizationValidator"]
Duplicates["DuplicateDetector<br/>SemanticDuplicateDetector"]
FileSystem["FileSystemManager<br/>create, move, tag, restore"]
History["OrganizationHistory<br/>analytics and rollback"]
Conflicts["Conflict resolution"]
end
subgraph Learning["Learnings System"]
LearningsManager["LearningsManager"]
ContinuousLearning["ContinuousLearningObserver"]
FSMonitor["LearningsFSMonitor"]
RuleEngines["RuleInducer<br/>LocalRuleInferenceEngine<br/>LLMRuleInducer"]
LearningsProfile["LearningsProfile<br/>rules, examples, corrections"]
end
subgraph Persistence["Persistence and System Integration"]
Defaults["UserDefaults and AppStorage"]
AppGroup["App group IPC<br/>group.com.sorty.app"]
Bookmarks["Security-scoped bookmarks"]
Keychain["Keychain"]
Sparkle["SparkleUpdateManager"]
end
subgraph FeatureSurfaces["Feature Surfaces"]
OrganizeView["Organize and preview"]
WatchedFoldersView["Watched folders"]
DuplicatesView["DuplicatesView"]
LearningsView["LearningsView"]
SettingsView["Settings"]
HistoryView["History"]
end
User --> SortyApp
Finder --> ExtensionListener
ExtensionListener --> MainWindow
Shortcuts --> DeeplinkHandler
DeeplinkHandler --> MainWindow
WatchEvents --> Coordinator
MenuBar --> MainWindow
Widgets --> WidgetSync
SortyApp --> MainWindow
SortyApp --> Coordinator
MainWindow --> AppState
MainWindow --> FeatureSurfaces
FeatureSurfaces --> FolderOrganizer
FeatureSurfaces --> StateAndSettings
Coordinator --> WatchedFolders
Coordinator --> FolderOrganizer
Coordinator --> Notifications
WidgetSync --> AppGroup
FolderOrganizer --> Scanner
Scanner --> Content
Content --> Vision
FolderOrganizer --> PromptContext
FolderOrganizer --> PromptBuilder
PromptBuilder --> LearningsProfile
PromptBuilder --> AIClientFactory
AIClientFactory --> Settings
AIClientFactory --> Auth
AIClientFactory --> ModelCatalog
AIClientFactory --> AIClient
AIClient --> OpenAI
AIClient --> Anthropic
AIClient --> Copilot
AIClient --> Codex
AIClient --> AppleFM
AIClient --> ResponseParser
ResponseParser --> Plan
Plan --> Normalizer
Normalizer --> Validator
Validator --> Preview
Preview --> FileSystem
FileSystem --> Duplicates
FileSystem --> History
FileSystem --> Conflicts
History --> ContinuousLearning
Coordinator --> ContinuousLearning
FSMonitor --> ContinuousLearning
ContinuousLearning --> LearningsManager
LearningsManager --> RuleEngines
RuleEngines --> LearningsProfile
LearningsProfile --> PromptBuilder
Settings --> Defaults
Personas --> Defaults
WatchedFolders --> Defaults
Storage --> Defaults
Exclusions --> Defaults
WatchedFolders --> Bookmarks
Auth --> Keychain
ExtensionListener --> AppGroup
Sparkle --> SortyApp
We welcome contributions. See CONTRIBUTING.md for:
- Detailed development environment setup
- Architecture overview and code style guidelines
- How to add new AI providers
- Testing requirements and PR process
Please read our Code of Conduct before participating.
Blacksmith-backed GitHub Actions are the source of truth for commit, push, PR, and release confidence. The default Swift CI workflow runs security checks on Blacksmith Ubuntu and builds/tests/packages on Blacksmith macOS.
Prefer frequent small commits and pushes. Push each coherent change to the branch so Blacksmith validates the real PR state early; continue with follow-up commits when more work remains.
Use local commands only for fast diagnosis before pushing:
make dev # Fast debug build, no tests
make now # Fast debug build + launch, no tests
swift test --disable-sandbox --filter SortyTests.TestClass/testMethodmake ci, make test, and make test-full still exist for local troubleshooting, but they do not replace Blacksmith checks.
For PRs and releases, rely on the GitHub Actions checks:
- Swift CI: security scan, SPM build, current test inventory, parallel unit tests, app bundle build.
- Release: changelog preparation, current test inventory, parallel unit tests, universal app build, Sparkle appcast generation, release artifact upload.
Tests are located in Tests/SortyTests/ and cover the following areas:
- Unit Tests: Core functionality including file organization, duplicate detection, exclusion rules, response parsing, and utility functions.
- Integration Tests: End-to-end workflows for AI providers, file system operations, and history management.
- Component Tests: Individual modules such as personas, learnings manager, deeplinks, and security.
Key test files include:
SortyTests.swift- Core organization logicLearningsManagerTests.swift- Passive learning systemFinderIntegrationStatusTests.swift- Finder Sync diagnostics, registration parsing, and auto-repairStorageDestinationNormalizerTests.swift- Storage location path resolution and normalizationStorageLocationsReliabilityTests.swift- Storage validation and reliabilityPrivacyPathMaskerTests.swift- Privacy-sensitive path redactionCustomPersonaTests.swift- Persona managementDeeplinkTests.swift- URL scheme handling
Sorty supports the sorty:// URL scheme for automation and external control:
| Deeplink | Description |
|---|---|
sorty://organize?path=<path>&persona=<id>&autostart=true |
Start organization |
sorty://duplicates?path=<path>&autostart=true |
Scan for duplicates |
sorty://learnings?action=stats |
Open Learnings statistics |
sorty://settings?section=ai |
Open specific settings section |
sorty://history |
Open organization history |
sorty://persona?generate=true&prompt=<text> |
Generate a persona |
sorty://watched?action=add&path=<path> |
Add watched folder |
sorty://rules?action=add&pattern=<pattern> |
Add exclusion rule |
sorty://help?section=<topic> |
Open help section |
This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.
- Documentation: See HELP.md for detailed usage guides
- Bug Reports: Use the Bug Report template
- Feature Requests: Use the Feature Request template
- Security Issues: Use GitHub private vulnerability reporting (do not open public issues)
- Questions: Open a GitHub Discussion


