Contributing to RClick
July 10, 2026 ยท View on GitHub
Thank you for your interest in contributing to RClick! ๐
RClick is a macOS Finder enhancement tool built with Swift 6.2 and SwiftUI. This guide will help you get set up and make your first contribution.
Table of Contents
- Code of Conduct
- Getting Started
- Development Workflow
- Coding Guidelines
- Testing
- Finding Issues to Work On
Code of Conduct
This project follows the Contributor Covenant Code of Conduct. By participating, you are expected to uphold this code. Please report unacceptable behavior to the project maintainers.
Getting Started
Development Environment
| Tool | Version |
|---|---|
| macOS | 15.6 (Sequoia) or later |
| Xcode | 16.4 or later |
| Swift | 6.2 or later |
Building the Project
# Clone the repository
git clone https://github.com/wflixu/RClick.git
cd RClick
# Open in Xcode
open RClick.xcodeproj
# Or build from CLI
xcodebuild -project RClick.xcodeproj -scheme RClick -destination 'platform=macOS'
Note: The FinderSync Extension requires code signing. When building for development, Xcode will automatically use your development team. You may need to adjust the signing settings in Signing & Capabilities.
Project Structure
RClick/
โโโ RClick/ # Main application target
โ โโโ RClickApp.swift # App entry point
โ โโโ AppState.swift # Global state management
โ โโโ Model/ # SwiftData models
โ โโโ Settings/ # Settings UI (SwiftUI)
โ โโโ Shared/ # Utilities & services
โ โโโ Assets.xcassets/ # Images, icons, templates
โโโ FinderSyncExt/ # Finder extension target
โ โโโ FinderSyncExt.swift # Extension entry point
โ โโโ MenuItemClickable.swift # Menu item handlers
โโโ specs/ # Feature specifications & contracts
Development Workflow
Branching Strategy
mainโ Production-ready releases. Always stable.devโ Integration branch. All feature branches merge here first.- Feature branches โ
feature/your-feature-nameorfix/your-bug-fix
# Start new feature
git checkout dev
git pull origin dev
git checkout -b feature/my-new-feature
# Start a bug fix
git checkout -b fix/my-bug-fix
Commit Conventions
We follow Conventional Commits. Please structure your commit messages as:
<type>(<scope>): <description>
[optional body]
[optional footer]
Types:
| Type | Usage |
|---|---|
feat | New feature |
fix | Bug fix |
docs | Documentation changes |
refactor | Code refactoring (no feature/fix) |
perf | Performance improvement |
test | Adding or updating tests |
chore | Build, CI, dependencies |
style | Formatting, whitespace |
Examples:
feat(settings): add dark mode toggle to general settings
fix(finder): resolve menu item not appearing on first launch
docs: update README with installation guide
refactor(ipc): simplify messaging layer with async/await
Pull Request Process
- Fork the repository and create your branch from
dev. - Implement your changes, following the coding guidelines below.
- Test your changes thoroughly (build, run, verify in Finder).
- Update documentation if your changes affect user-facing behavior.
- Submit a PR targeting the
devbranch. - Fill out the PR template โ describe what changed, why, and how to test.
- Wait for review โ a maintainer will review your PR. CI checks must pass.
PR titles should also follow Conventional Commits, e.g., feat: add AirDrop sharing support.
Coding Guidelines
Swift Style
- Use Swift 6.2 syntax โ no legacy patterns.
- Prefer
letovervarwhere possible. - Use
async/awaitfor concurrency. Avoid completion handlers. - Use
@MainActorwhen updating@Publishedproperties from background contexts. - Mark types and methods with appropriate access control (
private,internal). - Use
guardfor early returns, not nestedifstatements. - Prefer value types (
struct,enum) over reference types when identity isn't needed.
SwiftUI Best Practices
- All UI must be SwiftUI โ no AppKit UI components (e.g., no
NSViewRepresentablewrappers for visual elements). - AppKit is ONLY for system integration:
NSWorkspace,NSPasteboard, file operations, etc. - Use
@StateObjectfor view-ownedObservableObjectinstances; use@ObservedObjectfor injected ones. - Keep views small and composable. Extract reusable components.
- Use SF Symbols for icons to ensure native look and dark mode support.
Architecture Constraints
These are hard constraints from the project constitution:
- Swift 6.2 syntax only โ no older Swift patterns.
- SwiftUI for all UI โ no AppKit UI components.
- AppKit limited to system integration โ
NSWorkspace,NSPasteboard, file operations, etc. - Target macOS 15 Sequoia and above only โ no backward compatibility hacks.
Dual-Process Communication:
- Main app and FinderSync Extension communicate via
DistributedNotificationCenter. - Message protocol is defined in
RClick/Shared/Messager.swift. - Always handle
isHostAppOpenstate โ don't block if the main app isn't running.
Testing
Before submitting a PR, please verify:
# Build the main app
xcodebuild -project RClick.xcodeproj -scheme RClick -destination 'platform=macOS'
# Build the extension
xcodebuild -project RClick.xcodeproj -scheme FinderSyncExt -destination 'platform=macOS'
# Run tests (if applicable)
xcodebuild test -project RClick.xcodeproj -scheme RClick -destination 'platform=macOS'
Manual testing checklist:
- App launches and appears in the menu bar
- Right-click menu appears in Finder with all configured items
- Dark mode works correctly (icons adapt)
- Settings persist across app restarts
- File operations work (create, delete, copy path, etc.)
- Extension loads after system restart
Finding Issues to Work On
- Browse open issues โ look for
good first issueorhelp wantedlabels. - If you have an idea, open a discussion first to get feedback before writing code.
Thank you for contributing! ๐