/macgo

macos bundle and permissions integration for go programs

Primary LanguageGoMIT LicenseMIT

macgo

A Go library for building macOS applications with proper permissions, entitlements, and bundle structure.

GoDoc License

Overview

macgo simplifies the process of creating macOS applications in Go by automatically handling:

  • App bundle creation and management
  • Permission requests (camera, microphone, files, etc.)
  • Code signing (ad-hoc and Developer ID)
  • Entitlements and sandboxing
  • TCC (Transparency, Consent, and Control) integration

Installation

go get github.com/tmc/macgo

Quick Start

package main

import (
    "log"
    "github.com/tmc/macgo"
)

func main() {
    // Request camera permission with automatic app bundle creation
    err := macgo.Request(macgo.Camera)
    if err != nil {
        log.Fatal(err)
    }

    // Your application code here
}

Core Features

Simple Permission Requests

Request macOS permissions with a single function call:

// Request single permission
macgo.Request(macgo.Camera)

// Request multiple permissions
macgo.Request(macgo.Camera, macgo.Microphone, macgo.Files)

Automatic Bundle Creation

macgo automatically creates a proper .app bundle structure with:

  • Info.plist with required metadata
  • Entitlements for requested permissions
  • Proper executable location
  • App icons (if provided)

Code Signing Support

Built-in support for code signing:

// Ad-hoc signing (development)
cfg := macgo.NewConfig().
    WithAppName("MyApp").
    WithAdHocSign()

// Developer ID signing (distribution)
cfg := macgo.NewConfig().
    WithAppName("MyApp").
    WithAutoSign() // Auto-detects Developer ID

Environment Configuration

Configure via environment variables:

MACGO_APP_NAME=MyApp          # Application name
MACGO_BUNDLE_ID=com.example   # Bundle identifier
MACGO_AD_HOC_SIGN=1          # Enable ad-hoc signing
MACGO_AUTO_SIGN=1             # Auto-detect signing identity
MACGO_DEBUG=1                 # Debug output

Available Permissions

  • Camera (macgo.Camera) - Camera access
  • Microphone (macgo.Microphone) - Microphone access
  • Location (macgo.Location) - Location services
  • Files (macgo.Files) - File system access
  • Network (macgo.Network) - Network connections
  • Sandbox (macgo.Sandbox) - App sandboxing

Advanced Usage

Custom Configuration

cfg := macgo.NewConfig().
    WithAppName("MyApp").
    WithBundleID("com.example.myapp").
    WithPermissions(macgo.Camera, macgo.Microphone).
    WithAppGroups("group.com.example.shared").
    WithDebug()

err := macgo.Start(cfg)

Auto Packages

Import auto packages for automatic configuration:

import (
    _ "github.com/tmc/macgo/auto/media"   // Camera + Microphone
    _ "github.com/tmc/macgo/auto/adhoc"   // Ad-hoc signing
    "github.com/tmc/macgo"
)

func main() {
    // Permissions and signing are pre-configured
    macgo.Request()
}

Package Structure

  • macgo - Core library and main API
  • bundle/ - App bundle creation and management
  • codesign/ - Code signing utilities
  • permissions/ - Permission definitions and validation
  • teamid/ - Team ID detection for signing
  • auto/ - Auto-configuration packages
  • examples/ - Example applications
  • internal/ - Internal implementation packages

Examples

See the examples/ directory for complete examples:

Requirements

  • Go 1.21 or later
  • macOS 11.0 or later
  • Xcode Command Line Tools (for code signing)

License

MIT License - see LICENSE file for details.

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

Acknowledgments

This library leverages macOS native frameworks and tools to provide seamless integration with the operating system's security model.