//go:build darwin package startup import ( "fmt" "os" "os/exec" "path/filepath" "text/template" ) const plistTemplate = ` Label com.voicesnap.app ProgramArguments {{.ExePath}} RunAtLoad ` func plistPath() string { home, _ := os.UserHomeDir() return filepath.Join(home, "Library", "LaunchAgents", "com.voicesnap.app.plist") } func isEnabled() bool { _, err := os.Stat(plistPath()) return err == nil } func setEnabled(enable bool) error { path := plistPath() if !enable { exec.Command("launchctl", "unload", path).Run() return os.Remove(path) } exe, err := os.Executable() if err != nil { return err } dir := filepath.Dir(path) os.MkdirAll(dir, 0755) f, err := os.Create(path) if err != nil { return fmt.Errorf("failed to create plist: %w", err) } defer f.Close() tmpl := template.Must(template.New("plist").Parse(plistTemplate)) if err := tmpl.Execute(f, struct{ ExePath string }{exe}); err != nil { return err } return exec.Command("launchctl", "load", path).Run() }