DEV Community

Cover image for DualClip - Update_2026.04.12.
Im Woojin
Im Woojin

Posted on

DualClip - Update_2026.04.12.

Last week, I shared the first round of updates for DualClip, my open-source macOS clipboard manager. Since then, I’ve crossed off three major items from the roadmap—including the one I’m most excited about: you can finally download DualClip without needing to build it from source.

Here is the breakdown of what’s new in v1.1.0.

🔒 Secure Input Field Detection

This was at the top of my "What’s Next" list for a reason: Privacy.

When macOS has a password field focused, the system activates a mode called Secure Event Input. DualClip now checks for this state before every copy and paste operation. If you're typing a password into Safari, 1Password, or a terminal sudo prompt, DualClip silently steps back.

Swift
func isSecureInputActive() -> Bool {
    return IsSecureEventInputEnabled()
}
Enter fullscreen mode Exit fullscreen mode

The guard is dead simple—one line in handleCopy and one in handlePaste:

Swift
guard !AccessibilityService.shared.isSecureInputActive() else { return }
Enter fullscreen mode Exit fullscreen mode

It’s the kind of feature that, when it works correctly, you never notice. And that’s exactly the point.

📦 Prebuilt Binaries (No Xcode Required!)

The biggest friction point in my original post was: "There's no prebuilt binary yet." Starting with v1.1.0, every release is signed with a Developer ID certificate and notarized by Apple. This means:

  • No more Gatekeeper warnings.

  • No "Open Anyway" dance in System Settings.

  • Just download, drag to Applications, and go.

🏗 The CI/CD Saga: 3 Bugs and a Notarization Pipeline

Getting the automated release pipeline working was... an adventure. I’m using GitHub Actions to handle the heavy lifting. The workflow triggers on version tags (v*..) and follows this sequence:

  1. Build: swift build -c release on a macOS 14 ARM runner.

  2. Import: Decode the .p12 certificate from GitHub Secrets.

  3. Bundle: Assemble the .app structure.

  4. Sign: codesign with hardened runtime and a timestamp.

  5. Notarize: Submit to Apple, poll for completion, and staple the ticket.

Sounds clean on paper. In practice, it took four attempts and taught me three very humbling lessons:

Bug 1: The One-Character Typo
I spent 10 minutes staring at a 401 Unauthorized error from Apple’s API. It turned out to be a typo in my app-specific password secret: fjhk vs tihk. CI/CD reminds you that your eyes see what they want to see, not what’s actually there.

Bug 2: The Service Outage
Three consecutive submissions got stuck at "In Progress" for hours. I thought my script was hung. It turns out Apple's notarization service was actually having a global outage. Even the best pipeline can’t fix a broken cloud.

Bug 3: The awk Failure
My polling script used awk '{print $2}' to extract the status from notarytool info. However, the status string for a pending job is In Progress (two words). awk captured only "In," which matched nothing in my logic.
The Fix: Switched to sed 's/.*status: //' to grab the full string.

🔄 Updated Roadmap

Feature Status
Secure input field detection ✅ Shipped
RAM zeroing on termination ✅ Shipped
Image/rich text support ✅ Shipped
GitHub Actions CI/CD + Notarization ✅ Shipped
Homebrew Cask distribution 🔜 Next
Sparkle auto-update 📅 Planned


Try it out

If you’ve been waiting for a downloadable build, it’s ready for you:

  1. Go to the Latest Releases.

  2. Download DualClip-1.1.0-arm64.zip.

  3. Unzip, move to Applications, and launch.

  4. Grant Accessibility permission when prompted.

No Xcode. No build steps. No friction.

🔗 GitHub: https://github.com/RAKKUNN/DualClip

If you find a bug or have a feature request, feel free to open an issue or a PR!

Top comments (0)