permiso-accessibility-permissions
Permission dialog UI for macOS accessibility and privacy settings, replicating the Codex Computer Use guided permissions flow
Best use case
permiso-accessibility-permissions is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Permission dialog UI for macOS accessibility and privacy settings, replicating the Codex Computer Use guided permissions flow
Teams using permiso-accessibility-permissions should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/permiso-accessibility-permissions/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How permiso-accessibility-permissions Compares
| Feature / Agent | permiso-accessibility-permissions | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Permission dialog UI for macOS accessibility and privacy settings, replicating the Codex Computer Use guided permissions flow
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Permiso — macOS Permission Dialog Helper
> Skill by [ara.so](https://ara.so) — Daily 2026 Skills collection.
Permiso provides a polished permission dialog UI for macOS apps that guides users through enabling accessibility and privacy settings — replicating the guided flow seen in OpenAI's Codex Computer Use product.
## What It Does
- Presents an animated, guided overlay panel directing users to open System Settings and enable specific permissions (e.g. Accessibility)
- Mirrors the UX pattern from Codex Computer Use: an on-screen assistant that walks users through enabling access
- Handles the common friction point of macOS permission flows with a clear, app-integrated UI
## Installation
### Swift Package Manager
Add to your `Package.swift`:
```swift
dependencies: [
.package(url: "https://github.com/zats/permiso", branch: "main")
]
```
Or in Xcode: **File → Add Package Dependencies** → enter `https://github.com/zats/permiso`
Then add `Permiso` to your target's dependencies:
```swift
.target(
name: "YourApp",
dependencies: ["Permiso"]
)
```
## Core API
### Basic Usage
```swift
import Permiso
@MainActor
func showAccessibilityHelper() {
PermisoAssistant.shared.present(panel: .accessibility)
}
```
### Triggering on App Launch
```swift
import SwiftUI
import Permiso
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.onAppear {
checkAndRequestAccessibility()
}
}
}
@MainActor
func checkAndRequestAccessibility() {
let trusted = AXIsProcessTrusted()
if !trusted {
PermisoAssistant.shared.present(panel: .accessibility)
}
}
}
```
### AppDelegate Pattern
```swift
import AppKit
import Permiso
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationDidFinishLaunching(_ notification: Notification) {
requestAccessibilityIfNeeded()
}
@MainActor
func requestAccessibilityIfNeeded() {
guard !AXIsProcessTrusted() else { return }
PermisoAssistant.shared.present(panel: .accessibility)
}
}
```
## Common Patterns
### Check Permission Before Sensitive Actions
```swift
import Permiso
import ApplicationServices
@MainActor
func performAccessibilityAction() {
guard AXIsProcessTrusted() else {
PermisoAssistant.shared.present(panel: .accessibility)
return
}
// Proceed with accessibility-dependent work
doAccessibilityWork()
}
```
### Polling for Permission Grant
```swift
import Permiso
import ApplicationServices
import Combine
class PermissionMonitor: ObservableObject {
@Published var isAccessibilityGranted = false
private var timer: AnyCancellable?
@MainActor
func startMonitoring() {
if AXIsProcessTrusted() {
isAccessibilityGranted = true
return
}
PermisoAssistant.shared.present(panel: .accessibility)
timer = Timer.publish(every: 1.0, on: .main, in: .common)
.autoconnect()
.sink { [weak self] _ in
if AXIsProcessTrusted() {
self?.isAccessibilityGranted = true
self?.timer?.cancel()
}
}
}
}
```
### SwiftUI View Integration
```swift
import SwiftUI
import Permiso
struct SettingsView: View {
@State private var accessibilityGranted = AXIsProcessTrusted()
var body: some View {
VStack(spacing: 16) {
HStack {
Image(systemName: accessibilityGranted ? "checkmark.circle.fill" : "xmark.circle.fill")
.foregroundColor(accessibilityGranted ? .green : .red)
Text("Accessibility Access")
}
if !accessibilityGranted {
Button("Enable Accessibility Access") {
requestAccess()
}
.buttonStyle(.borderedProminent)
}
}
.padding()
.onReceive(Timer.publish(every: 2, on: .main, in: .common).autoconnect()) { _ in
accessibilityGranted = AXIsProcessTrusted()
}
}
@MainActor
func requestAccess() {
PermisoAssistant.shared.present(panel: .accessibility)
}
}
```
## Requirements
- **macOS**: The library targets macOS (version as specified by the package; check for macOS 13+ for best compatibility)
- **Swift**: Swift 5.9+
- **Main Actor**: `PermisoAssistant.shared.present(panel:)` must be called from the main thread / `@MainActor` context
## Entitlements / Info.plist
For accessibility usage, ensure your app's `Info.plist` includes a usage description (though macOS doesn't require this like iOS, it's good practice), and that your app is **not sandboxed** or has the correct entitlements if it needs to use accessibility APIs:
```xml
<!-- In your .entitlements file if needed -->
<key>com.apple.security.temporary-exception.apple-events</key>
<true/>
```
For apps that actually use accessibility features after permission is granted:
```swift
// Request trust prompt (system dialog) alongside Permiso's guided UI
let options = [kAXTrustedCheckOptionPrompt.takeRetainedValue(): true] as CFDictionary
AXIsProcessTrustedWithOptions(options)
```
## Troubleshooting
**Panel doesn't appear**
- Ensure you're calling from `@MainActor` / main thread
- Check that your app has a visible window; the panel attaches to the app's UI context
**`AXIsProcessTrusted()` returns false even after granting**
- macOS caches trust state; the app may need to be relaunched or the check polled with a timer (see polling pattern above)
- Some sandboxed apps require a full app restart after granting accessibility
**Build errors: `cannot find 'PermisoAssistant' in scope`**
- Confirm `import Permiso` is at the top of the file
- Confirm the package is added to the correct target in Xcode, not just the project
**Panel appears but dismisses immediately**
- Make sure you're not overriding the window or calling dismiss logic right after present
- Avoid calling present inside a `Task { }` that gets cancelled immediately
## Key Types Reference
| Type | Description |
|------|-------------|
| `PermisoAssistant` | Singleton entry point — use `.shared` |
| `PermisoAssistant.shared.present(panel:)` | Shows the guided permission dialog |
| `.accessibility` | Panel type for Accessibility settings |Related Skills
```markdown
---
zeroboot-vm-sandbox
Sub-millisecond VM sandboxes for AI agents using copy-on-write KVM forking via Zeroboot
yourvpndead-vpn-detection
Android app that detects VPN/proxy servers (VLESS/xray/sing-box) via local SOCKS5 vulnerability, exposing exit IPs and server configs without root
xata-postgres-platform
Expert skill for Xata open-source cloud-native Postgres platform with copy-on-write branching, scale-to-zero, and Kubernetes deployment
x-mentor-skill-nuwa
AI-powered X (Twitter) content strategy skill that distills methodologies from 6 top creators + open-source algorithm data into actionable writing, growth, and monetization guidance.
wx-favorites-report
End-to-end pipeline to extract, decrypt, and visualize WeChat Mac favorites from encrypted SQLite DB into an interactive HTML report.
wterm-web-terminal
Web terminal emulator with Zig/WASM core, DOM rendering, and React/vanilla JS bindings
worldmonitor-intelligence-dashboard
Real-time global intelligence dashboard with AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking
witr-process-inspector
CLI and TUI tool that explains why processes, services, and ports are running by tracing causality chains across supervisors, containers, and shells.
wildworld-dataset
WildWorld large-scale action-conditioned world modeling dataset with 108M+ frames from a photorealistic ARPG game, featuring per-frame annotations, 450+ actions, and explicit state information for generative world modeling research.
whatcable-macos-usb-inspector
macOS menu bar app that identifies USB-C cable capabilities and charging diagnostics using IOKit
wewrite-wechat-ai-publishing
Full-pipeline AI skill for WeChat Official Account articles — hotspot fetching, topic selection, writing, SEO, image generation, formatting, and draft box publishing.