Chocolatey Fest - Chocolatey's inaugural conference on Windows Automation (WinOps) is coming - Learn more!

Balsamiq Mockups for Desktop


Package test results are passing.

This package was approved as a trusted package on 6/17/2018.

Balsamiq is a wireframing and mock up tool with a high focus on usability. Quickly come up with mock ups and easily share them with your clients.

Because Balsamiq is commercial software, this package will install Balsamiq as a fully-functional trial. If you have a license key you can activate the software after install.

This package is specific to version 3 of Balsamiq Mockups for Desktop. If you need version 2, check out the version 2 package.

This package supports registration during install. Just pass the following parameters:

  • License code: /licenseCode:"<your license code>"
  • Name of the license holder: /licenseName:"<your name>"


-params '"/licenseCode:""abcd1234=="" /licenseName:""John Doe"""'

For questions about this package, please leave a comment on the package page at or create an issue on Github at

To install Balsamiq Mockups for Desktop, run the following command from the command line or from PowerShell:

C:\> choco install balsamiqmockups3

To upgrade Balsamiq Mockups for Desktop, run the following command from the command line or from PowerShell:

C:\> choco upgrade balsamiqmockups3


  • application\ Show
    md5: 75AB1E06B9ADD49C9B6A585EE5353EED | sha1: C5024EA13B29E7BD1E57A969A10B60BB7E280D6C | sha256: 3B7FCD515989AD462524379AD869DC4C6C1EB4CDD1FE2F35EB6ED81BC58FB6EE | sha512: 10D82F5682AAA64ED7F76089C3C3E9ED67C48541E57A0A711F761DFCDAE49D0CB8025172FD36B660AF0701A289FBC328271C77EC2A2AC66E10FF34FADD78F1DF
  • legal\redistribute-license.pdf
  • tools\chocolateyInstall.ps1 Show
    $toolsPath = (Split-Path -parent $MyInvocation.MyCommand.Definition)
    . "$toolsPath\extensions.ps1"
    $applicationPath = (Join-Path (Split-Path -parent $toolsPath) "application")
    $file = (Get-ChildItem -Path $applicationPath -Filter *.zip | Select-Object -First 1).FullName
    $packageName = 'balsamiqmockups3'
    # Create variable for program files directory
    # ===========================================
    # Borrowed from BoxStarter.Azure
    if(${env:ProgramFiles(x86)} -ne $null) {
        $programFiles86 = ${env:ProgramFiles(x86)}
    } else {
        $programFiles86 = $env:ProgramFiles
    $arguments = (ParseParameters $env:chocolateyPackageParameters)
    # Instructions for silent installation:
    $installPath = Join-Path $programFiles86 "Balsamiq Mockups 3"
    # Extract embedded ZIP file
    Get-ChocolateyUnzip -fileFullPath $file -destination "$programFiles86"
    Write-Host "Moving application files..."
    Rename-Item (Join-Path $programFiles86 'Balsamiq_Mockups_3') $installPath
    $balsamiqExe = Join-Path $installPath "Balsamiq Mockups 3.exe"
    if($arguments.ContainsKey("licenseCode") -and $arguments.ContainsKey("licenseName")) {
        $licenseCode = $arguments["licenseCode"]
        $licenseName = $arguments["licenseName"]
        Start-Process $balsamiqExe -ArgumentList "register ""$licenseName"" ""$licenseCode"""
    # Add file type registration
    Write-Host "Adding file type registration..."
    $elevatedSetFileAssociation = "`
    if( -not (Test-Path -path HKCR:) ) {New-PSDrive -Name HKCR -PSProvider registry -Root Hkey_Classes_Root};`
    if(!(test-path -LiteralPath 'HKCR:\.bmml')) { new-item -Path 'HKCR:\.bmml' };`
    Set-ItemProperty -LiteralPath 'HKCR:\.bmml' -Name '(Default)'  -Value 'com.balsamiq.mockupfile';`
    Set-ItemProperty -LiteralPath 'HKCR:\.bmml' -Name 'Content Type'  -Value 'application/xml';`
    if(!(test-path -LiteralPath 'HKCR:\.bmml\OpenWithProgIds')) { new-item -Path 'HKCR:\.bmml\OpenWithProgIds' };`
    Set-ItemProperty -LiteralPath 'HKCR:\.bmml\OpenWithProgIds' -Name 'com.balsamiq.mockupfile' -Value '';`
    if(!(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile')) { new-item -Path 'HKCR:\com.balsamiq.mockupfile' };`
    Set-ItemProperty -LiteralPath 'HKCR:\com.balsamiq.mockupfile' -Name '(Default)' -Value 'Balsamiq Mockups Markup Language';`
    if(!(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile\DefaultIcon')) { new-item -Path 'HKCR:\com.balsamiq.mockupfile\DefaultIcon' };`
    Set-ItemProperty -LiteralPath 'HKCR:\com.balsamiq.mockupfile\DefaultIcon' -Name '(Default)' -Value '\""$balsamiqExe\"",-105';`
    if(!(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile\shell')) { new-item -Path 'HKCR:\com.balsamiq.mockupfile\shell' };`
    if(!(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile\shell\open')) { new-item -Path 'HKCR:\com.balsamiq.mockupfile\shell\open' };`
    if(!(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile\shell\open\command')) { new-item -Path 'HKCR:\com.balsamiq.mockupfile\shell\open\command' };`
    Set-ItemProperty -LiteralPath 'HKCR:\com.balsamiq.mockupfile\shell\open\command' -Name '(Default)' -Value '\""$balsamiqExe\"" \""%1\""';`
    return 0;"
    Start-ChocolateyProcessAsAdmin $elevatedSetFileAssociation
    $shortcutPath = [environment]::GetFolderPath([environment+specialfolder]::Programs)
    $shortcutFilePath = Join-Path $shortcutPath "Balsamiq Mockups 3.lnk"
    # Create shortcut in Startmenu
    Install-ChocolateyShortcut -shortcutFilePath $shortcutFilePath -targetPath $balsamiqExe
  • tools\chocolateyUninstall.ps1 Show
    $packageName = 'balsamiqmockups3'
    # Instructions for silent installation:
    $installPath = Join-Path ${env:ProgramFiles(x86)} "Balsamiq Mockups 3"
    # Delete desktop shortcut
    $currentUser = (Get-WMIObject -class Win32_ComputerSystem | select username).username
    if ($currentUser -match "\\") {
        $currentUser = $currentUser.Substring($currentUser.IndexOf("\") + 1)
    $usersDir = Split-Path $env:USERPROFILE -Parent
    $currentUserDir = Join-Path $usersDir $currentUser
    $currentUserDesktopDir = Join-Path $currentUserDir "Desktop"
    $desktopLinkPath = Join-Path $currentUserDesktopDir "Balsamiq Mockups 3.exe.lnk"
    if (Test-Path $desktopLinkPath) {
        Write-Host "Deleting Desktop shortcut..."
        $elevatedRemoveShortcut = "`
        Remove-Item '$desktopLinkPath' -Force;`
        return 0;"
        Start-ChocolateyProcessAsAdmin $elevatedRemoveShortcut
    # Remove file type registration
    Write-Host "Removing file type registration..."
    $elevatedRemoveFileAssociation = "`
    if( -not (Test-Path -path HKCR:) ) {New-PSDrive -Name HKCR -PSProvider registry -Root Hkey_Classes_Root};`
    if(test-path -LiteralPath 'HKCR:\.bmml') { remove-item -Path 'HKCR:\.bmml' -Recurse };`
    if(test-path -LiteralPath 'HKCR:\com.balsamiq.mockupfile') { remove-item -Path 'HKCR:\com.balsamiq.mockupfile' -Recurse };`
    return 0;"
    Start-ChocolateyProcessAsAdmin $elevatedRemoveFileAssociation
    # Delete application files
    if (Test-Path $installPath) {
        Write-Host "Deleting application files..."
        $elevatedRemoveFiles = "`
        Remove-Item '$installPath' -Force -Recurse;`
        return 0;"
        Start-ChocolateyProcessAsAdmin $elevatedRemoveFiles
  • tools\extensions.ps1 Show
    function global:ParseParameters ([string]$parameters) {
        $arguments = @{};
        if ($parameters) {
            $match_pattern = "/(((?<name>[a-zA-Z0-9-_]+)[:=]((""(?<value>(?:[^""\\]|\\.)+)"")|(?<value>[^ ]+)))|((?<name>(?>[a-zA-Z0-9-_]+))(?!:)))"
            $optionName = 'name'
            $valueName = 'value'
            if ($parameters -match $match_pattern ){
                $results = $parameters | Select-String $match_pattern -AllMatches
                $results.matches | % {
              throw "Package Parameters were found but were invalid (REGEX Failure)"
        return $arguments;
    # Query Installed Applications information
    # Returns information about one or all installed packages that match
    # naming pattern. Do it by analyzing registry, so it's not only showing
    # Windows Instaler MSI packages.
    # Usage:
    #   Show-AppUninstallInfo -match "micro" -first $false
    # Author:
    #   Colovic Vladan, [email protected]
    function global:Show-AppUninstallInfo {
        [string] $matchPattern = '',
        [string] $ignorePattern = '',
        [bool] $firstOnly = $false
        Write-Debug "Querying registry keys for uninstall pattern: $matchPattern"
        if ($env:PROCESSOR_ARCHITEW6432 -eq "AMD64") {
            # In reality, it's possible, but not worth it...
            # How to query 64 bit Registry with 32 bit PowerShell...
            Write-Host ""
            Write-Host "CAUTION:" -foregroundcolor red
            Write-Host "  You are running 32-bit process on a 64-bit operating system," -foregroundcolor red
            Write-Host "  and in this environment it's not possible to reliably detect" -foregroundcolor red
            Write-Host "  all installed applications." -foregroundcolor red
            Write-Host ""
        # Any error at this point should be terminating
        $ErrorActionPreference = "Stop"
        # Array of hashes/ Using hash similar to an object to hold our
        # application information
        $appArray = @()
        # This is the real magic of the script. We use Get-ChildItem to
        # get all of the sub-keys that contain application info.
        # Here, we MUST silently ignore errors
        $ErrorActionPreference = "SilentlyContinue"
        $keys  = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" -Recurse
        $keys += Get-ChildItem "HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall" -Recurse
        $keys += Get-ChildItem "HKLM:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" -Recurse
        $keys += Get-ChildItem "HKCU:\SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall" -Recurse
        # On 64-bit systems, we get very important extra list from the
        # Wow6432Node nodes. But now I'm skipping OS detection that we
        # used before, as it turned out that it's really not very reliable.
        # Build out hash for every matched application
        foreach ($key in $keys)
            # Adding a try-catch around the statement will hide the error and
            # prevent it being caught in the main try / catch. And we are
            # already silnetly continuing on errors
            try { $pkgName = $key.GetValue("DisplayName") } catch {}
            # Only query data for apps with a name
            if ($pkgName)
                $pkgName = $pkgName.Trim()
                if (($pkgName.Length -eq 0) -or `
                    ($matchPattern -and ($pkgName -notmatch $matchPattern)) -or `
                    ($ignorePattern -and ($pkgName -match $ignorePattern)))
                    # Move on if not match regular expression.
                    # It's case-insensitive comparison.
                Write-Debug "* $pkgName"
                # Ignore every error
                try {
                    # Convert estimated size to megabytes
                    $tmpSize = '{0:N2}' -f ($key.GetValue("EstimatedSize") / 1MB)
                    # Populate our object
                    # We must initialize object here, not outside loop
                    $app = @{}
                    $app["DisplayName"]            = $pkgName                                  # Name / InnoSetup: yes, MSI: yes
                    $app["DisplayVersion"]         = $key.GetValue("DisplayVersion")
                    $app["Publisher"]              = $key.GetValue("Publisher")                # Company / InnoSetup: yes, MSI: yes
                    $app["InstallLocation"]        = $key.GetValue("InstallLocation")          # / InnoSetup: yes, MSI: sometimes empty
                    $app["InstallDate"]            = $key.GetValue("InstallDate")              # yyyymmdd / InnoSetup: yes, MSI: yes
                    $app["UninstallString"]        = $key.GetValue("UninstallString")          # / InnoSetup: yes, MSI: yes
                    $app["QuietUninstallString"]   = $key.GetValue("QuietUninstallString")     # / InnoSetup: yes, MSI: no
                    $app["EstimatedSizeMB"]        = $tmpSize                                  # / InnoSetup: yes, MSI: yes
                } catch {}
                $app["RegistryPath"]           = $
                $app["RegistryKeyName"]        = $key.pschildname
                # If it has keys that start with `Inno Setup:`, like `Inno
                # Setup: App Path` or `Inno Setup: Selected Tasks`, then we have
                # a lot of extra information and know the installer
                # Inno Setup almost always has `QuietUninstallString` set, which
                # is usually normal one appended with ` /SILENT`. And
                # you can discover silent installation arguments by analyzing
                # keys with `Tasks` and `Components`
                # Uninstall Registry Key for MSI installer:
                $appArray += $app
                if ($matchPattern -and $firstOnly)
                    # If pattern was defined and we want only the first
                    # result, it means we found our first app. I think we
                    # can exit now - I don't need multiple list for that.
        # Reset error action preference
        $ErrorActionPreference = "Continue"
        return $appArray
    function global:Get-AppInstallLocation() {
        param ([string]$appNameRegex)
        $apps = @(Show-AppUninstallInfo -match $appNameRegex)
        if ($apps.Length -eq 0)
            throw "Could not detect a valid installation for $appNameRegex"
        $app = $apps[0]
        $installLocation = $app["InstallLocation"]
        if ($installLocation -eq $null) {
            throw "Application found, but no install location has been recorded for it."
        if(-not (Test-Path "$installLocation")) {
            throw "Local installation is detected at '$apps', but directories are not accessible or have been removed"
        return $installLocation
    function global:Get-FullAppPath ([string]$uninstallName, [string]$relativePath, [string]$executable, [string]$installFolderName) {
        function GetInstalledApp ([string]$uninstallName, [string]$relativePath, [string]$executable) {
            $apps = @(Show-AppUninstallInfo -match $uninstallName)
            $exe = $null
            if ($apps.Length -ne 0)
                $app = $apps[0]
                $dir = $app["InstallLocation"]
                if ((![string]::IsNullOrEmpty($dir)) -and (Test-Path "$dir")) {
                    $exe = (Join-Path "$dir" (Join-Path $relativePath $executable))
            return $exe;
        function FindInAppPaths([string]$executable) {
            $path = Get-ChildItem "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths" | Where-Object PSChildName -eq $executable | Select-Object -First 1
            if($path -ne $null) {
                $fullPath = $path.GetValue("")
                if($fullPath -ne $null) {
                    return (Get-Item ([System.Environment]::ExpandEnvironmentVariables($fullPath))).FullName
                $directory = $path.GetValue("Path")
                if($directory -ne $null) {
                    return (Join-Path ([System.Environment]::ExpandEnvironmentVariables($directory)) $executable)
        function FindInProgramsFolder([string]$programsFolder, [string]$installFolderName, [string]$relativePath, [string]$executable) {
            $installDir = Join-Path $programsFolder $installFolderName
            if(Test-Path $installDir) {
                $fullPath = Join-Path $installDir (Join-Path $relativePath $executable)
                if(Test-Path $fullPath) {
                    return $fullPath
        function FindInProgramFiles([string]$installFolderName, [string]$relativePath, [string]$executable) {
            $fullPath = FindInProgramsFolder $env:ProgramFiles $installFolderName $relativePath $executable
            if(($fullPath -ne $null) -and (Test-Path $fullPath)) {
                return $fullPath
            $fullPath = FindInProgramsFolder ${env:ProgramFiles(x86)} $installFolderName $relativePath $executable
            if(($fullPath -ne $null) -and (Test-Path $fullPath)) {
                return $fullPath
        $exe = $null
        if($exe -eq $null) {
            if($PSBoundParameters.ContainsKey('uninstallName') -and $PSBoundParameters.ContainsKey('relativePath') -and $PSBoundParameters.ContainsKey('executable')) {
                $exe = GetInstalledApp $uninstallName $relativePath $executable
        if($exe -eq $null) {
            if($PSBoundParameters.ContainsKey('installFolderName') -and $PSBoundParameters.ContainsKey('relativePath') -and $PSBoundParameters.ContainsKey('executable')) {
                $exe = FindInProgramFiles $installFolderName $relativePath $executable
        if($exe -eq $null) {
            try {
                $exe = (Get-Command $executable -ErrorAction SilentlyContinue).Definition;
            catch {
        if($exe -eq $null) {
            $exe = FindInAppPaths $executable
        if($exe -eq $null) {
            throw "Unable to find $executable"
        return $exe

Virus Scan Results

In cases where actual malware is found, the packages are subject to removal. Software sometimes has false positives. Moderators do not necessarily validate the safety of the underlying software, only that a package retrieves software from the official distribution point and/or validate embedded software against official distribution point (where distribution rights allow redistribution).

Chocolatey Pro provides runtime protection from possible malware.


This package has no dependencies.

Package Maintainer(s)

Software Author(s)

  • Balsamiq Studios


2015 Balsamiq Studios, LLC


Version History

Version Downloads Last updated Status
Balsamiq Mockups for Desktop 3.4.1 254 Tuesday, May 31, 2016 approved
Balsamiq Mockups for Desktop 3.3.14 270 Saturday, April 16, 2016 approved
Balsamiq Mockups for Desktop 3.3.12 206 Wednesday, March 16, 2016 approved
Balsamiq Mockups for Desktop 3.3.11 161 Thursday, March 10, 2016 approved
Balsamiq Mockups for Desktop 3.3.9 213 Tuesday, February 9, 2016 approved
Balsamiq Mockups for Desktop 3.3.3 255 Monday, December 21, 2015 approved
Balsamiq Mockups for Desktop 3.1.9 204 Wednesday, September 23, 2015 approved

Discussion for the Balsamiq Mockups for Desktop Package

Ground rules:

  • This discussion is only about Balsamiq Mockups for Desktop and the Balsamiq Mockups for Desktop package. If you have feedback for Chocolatey, please contact the google group.
  • This discussion will carry over multiple versions. If you have a comment about a particular version, please note that in your comments.
  • The maintainers of this Chocolatey Package will be notified about new comments that are posted to this Disqus thread, however, it is NOT a guarantee that you will get a response. If you do not hear back from the maintainers after posting a message below, please follow up by using the link on the left side of this page or follow this link to contact maintainers. If you still hear nothing back, please follow the package triage process.
  • Tell us what you love about the package or Balsamiq Mockups for Desktop, or tell us what needs improvement.
  • Share your experiences with the package, or extra configuration or gotchas that you've found.
  • If you use a url, the comment will be flagged for moderation until you've been whitelisted. Disqus moderated comments are approved on a weekly schedule if not sooner. It could take between 1-5 days for your comment to show up.

comments powered by Disqus uses cookies to enhance the user experience of the site.