packer { required_plugins { tart = { version = ">= 1.16.0" source = "github.com/cirruslabs/tart" } ansible = { version = "~> 1" source = "github.com/hashicorp/ansible" } } } source "tart-cli" "tart" { from_ipsw = "https://updates.cdn-apple.com/2026SummerSeed/fullrestores/140-55718/5809AFC6-1923-4590-AAFC-904A0283E659/UniversalMac_27.0_26A5388g_Restore.ipsw" vm_name = "golden-gate-vanilla" cpu_count = 4 memory_gb = 8 disk_size_gb = 50 ssh_password = "admin" ssh_username = "admin" ssh_timeout = "180s" boot_command = [ # hello, hola, bonjour, etc. "", # Language: most of the times we have a list of "English"[1], "English (UK)", etc. with # "English" language already selected. If we type "english", it'll cause us to switch # to the "English (UK)", which is not what we want. To solve this, we switch to some other # language first, e.g. "Italiano" and then switch back to "English". We'll then jump to the # first entry in a list of "english"-prefixed items, which will be "English". # # [1]: should be named "English (US)", but oh well 🤷 "italianoenglish", # Select Your Country or Region "united states", # Transfer Your Data to This Mac "", # Written and Spoken Languages "", # Accessibility "", # Data & Privacy "", # Create a Mac Account "Managed via Tartadminadminadmin", # Enable Voice Over "", # Sign In to Your Apple Account # # We choose "Other Sign-In Options" → "Sign in Later in Settings" here. "", # Are you sure you want to skip signing in with an Apple Account? "", # Terms and Conditions "", # I have read and agree to the macOS Software License Agreement "", # Age Range -> Adult "", # Choose Your Look "", # Enable Location Services "", # Are you sure you don't want to use Location Services? "", # Select Your Time Zone "UTC", # Analytics "", # Screen Time "", # Siri "", # You Mac is Ready for FileVault "", # Mac Data Will Not Be Securely Encrypted "", # Update Mac Automatically "", # Liquid Glass "", # Welcome to Mac "", # Disable Voice Over "", # Enable Keyboard navigation # This is so that we can navigate the System Settings app using the keyboard "Terminal", "defaults write NSGlobalDomain AppleKeyboardUIMode -int 3", # Now that the installation is done, open "System Settings" # On Tahoe opening System Settings through Spotlight is not very reliable, sometimes opens System information "open '/System/Applications/System Settings.app'", "", # Navigate to "Sharing" "", # Navigate to "Screen Sharing" and enable it "", # Type in the password to allow enabling Screen Sharing "admin", # Navigate to "Remote Login" and enable it "", # Quit System Settings "q", # Disable Gatekeeper (1/2) "sudo spctl --global-disable", "admin", # Disable Gatekeeper (2/2) # On Tahoe opening System Settings through Spotlight is not very reliable, sometimes opens System information "open '/System/Applications/System Settings.app'", "Privacy & Security", "", "", "admin", "", # Quit System Settings "q", ] // A (hopefully) temporary workaround for Virtualization.Framework's // installation process not fully finishing in a timely manner create_grace_time = "30s" // Keep the recovery partition, otherwise it's not possible to "softwareupdate" recovery_partition = "keep" } build { sources = ["source.tart-cli.tart"] provisioner "shell" { inline = [ // Enable passwordless sudo "echo admin | sudo -S sh -c \"mkdir -p /etc/sudoers.d/; echo 'admin ALL=(ALL) NOPASSWD: ALL' | EDITOR=tee visudo /etc/sudoers.d/admin-nopasswd\"", // Enable auto-login // // See https://github.com/xfreebird/kcpassword for details. "echo '00000000: 1ced 3f4a bcbc ba2c caca 4e82' | sudo xxd -r - /etc/kcpassword", "sudo defaults write /Library/Preferences/com.apple.loginwindow autoLoginUser admin", // Disable screensaver at login screen "sudo defaults write /Library/Preferences/com.apple.screensaver loginWindowIdleTime 0", // Disable screensaver for admin user "defaults -currentHost write com.apple.screensaver idleTime 0", // Prevent the VM from sleeping "sudo systemsetup -setsleep Off 2>/dev/null", // Launch Safari to populate the defaults "/Applications/Safari.app/Contents/MacOS/Safari &", "SAFARI_PID=$!", "disown", "sleep 30", "kill -9 $SAFARI_PID", // Enable Safari's remote automation "sudo safaridriver --enable", // Disable screen lock // // Note that this only works if the user is logged-in, // i.e. not on login screen. "sysadminctl -screenLock off -password admin", ] } provisioner "shell" { inline = [ # Ensure that Gatekeeper is disabled "spctl --status | grep -q 'assessments disabled'" ] } }