{"id":13761429,"url":"https://github.com/Impedimenta/Suitcase","last_synced_at":"2025-05-10T12:32:39.603Z","repository":{"id":43508405,"uuid":"258006270","full_name":"Impedimenta/Suitcase","owner":"Impedimenta","description":"A flexible command line tool for instantly deploying user interfaces for simple commands and scripts. ","archived":false,"fork":false,"pushed_at":"2020-06-13T17:29:48.000Z","size":46294,"stargazers_count":1325,"open_issues_count":8,"forks_count":21,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-12T14:58:53.736Z","etag":null,"topics":["command-line-tool","developer-tools","macos","swiftui","xcode"],"latest_commit_sha":null,"homepage":"https://impedimenta.github.io","language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Impedimenta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["rjstelling"]}},"created_at":"2020-04-22T19:57:57.000Z","updated_at":"2025-04-09T11:01:35.000Z","dependencies_parsed_at":"2022-09-16T00:21:49.409Z","dependency_job_id":null,"html_url":"https://github.com/Impedimenta/Suitcase","commit_stats":null,"previous_names":[],"tags_count":5,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Impedimenta%2FSuitcase","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Impedimenta%2FSuitcase/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Impedimenta%2FSuitcase/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Impedimenta%2FSuitcase/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Impedimenta","download_url":"https://codeload.github.com/Impedimenta/Suitcase/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253415827,"owners_count":21904933,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["command-line-tool","developer-tools","macos","swiftui","xcode"],"created_at":"2024-08-03T13:01:54.469Z","updated_at":"2025-05-10T12:32:34.592Z","avatar_url":"https://github.com/Impedimenta.png","language":null,"readme":"# Suitcase\n\n*A flexible command line tool for instantly deploying user interfaces for simple commands and scripts.*\n\n[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/Impedimenta/Suitcase?sort=semver)](https://github.com/Impedimenta/Suitcase/releases) ![Platform: macOS 10.15](https://img.shields.io/badge/platform-macOS%2010.15-blue) ![Twitter Follow](https://img.shields.io/twitter/follow/SuitcaseCLI) ![Twitter Follow](https://img.shields.io/twitter/follow/rjstelling)\n\nSuitcase is a command line tool that can be *\"programmed\"* to display a [SwiftUI](https://developer.apple.com/xcode/swiftui/) interface that can trigger commands and scripts. \n\n[🧳 Suitcase Direct Download](https://github.com/Impedimenta/Suitcase/releases/latest/download/Suitcase.dmg)\n\nIt's similar to [Shortcuts](https://apps.apple.com/us/app/shortcuts/id915249334), but for macOS and driven by the command line.\n\n![Suitcase Demo Reel](./Resources/Hero.gif)\n\n### First Class Mac Citizen \n\nBecause of its [SwiftUI](https://developer.apple.com/xcode/swiftui/) underpinnings Suitcase is a first class Mac citizen. With out of the box support for, [Dark Mode](https://support.apple.com/en-gb/HT208976), [Menubars](https://developer.apple.com/design/human-interface-guidelines/macos/menus/menu-bar-menus/) and [Drag and Drop](https://developer.apple.com/design/human-interface-guidelines/macos/user-interaction/drag-and-drop/). \n\n### Powerful \n\nIts power and flexibility come form the tried and trusted UNIX command line. Anything you can do in Terminal you can do in Suitcase, but with a UI and export the command as a `.command` file, to check in with a project or [share with the world](https://github.com/Impedimenta/Suitcase-Bazaar).\n\n## Information\n\n- [@SuitcaseCLI](https://twitter.com/SuitcaseCLI) — Regular posts about updates and examples\n- [The Bazaar](https://impedimenta.github.io/Suitcase-Bazaar) — Examples and documentation \n- [Impedimenta](https://impedimenta.github.io/) — Blog posts, links and related projects\n- [@ImpedimentaCode](https://twitter.com/ImpedimentaCode) — Infrequent posts about other projects and tools\n- [@rjstelling](https://twitter.com/rjstelling) — Frequent, irrelevant mostly technology and politics, open DMs\n\n## Command-Line Utility\n\n### Usage\n\n\tOVERVIEW: A flexible command line tool for instantly deploying user interfaces\n\tfor simple commands and scripts.\n\n\tUSAGE: Suitcase \u003csubcommand\u003e\n\n\tOPTIONS:\n\t  --version               Show the version.\n\t  -h, --help              Show help information.\n\n\tSUBCOMMANDS:\n\t  basic                   Launch a basic Suitcase process, that has a main menu\n\t\t\t\t  and an icon in the Dock when running.\n\t  utility                 Launch a utility Suitcase process, without a Dock\n\t\t\t\t  icon or main menu.\n\n#### Suitcase `basic`\n\nA `basic` Suitcase process has a [main menu](https://developer.apple.com/documentation/appkit/nsapplication/menus) and an [icon in the Dock](https://developer.apple.com/documentation/appkit/nsdocktile) when running.\n\nSee the [full documentation](./Basic.md).\n\n#### Suitcase utility\n\nA `utility` Suitcase process does not have a Dock icon or main menu. It consists of just a [main window](https://developer.apple.com/documentation/appkit/nswindow).\n\nSee the [full documentation](./Utility.md).\n\n### Examples\n\nThese examples are very basic but should give you a good idea of how you can use Suitcase. More details examples can be found at the [Bazaar](https://impedimenta.github.io/Suitcase-Bazaar/Examples/). If you have any questions please [create an issue](https://github.com/Impedimenta/Suitcase/issues). If you create a command and you'd like to share it, [open a PR at the Bazaar](https://github.com/Impedimenta/Suitcase-Bazaar).\n\n#### Hello World\n\n[![Hello World](./Resources/Hello-World-Example.png)](https://vimeo.com/413136057)\n\nA simple example consisting of one button that when clicked calls the `say` command. [Watch the video of this example in action](https://vimeo.com/413136057), there is a [detailed `say` example](https://impedimenta.github.io/Suitcase-Bazaar/Examples/Say.html) at the [Suitcase Bazaar](https://github.com/Impedimenta/Suitcase-Bazaar/).\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e📝 Code\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n$ Suitcase --name=\"Demo App\" --window-title=\"Hello World\" \\\n  --window-width=\"200\" --window-height=\"200\" \\\n  --control-type=\"label\" --control-title=\"Give a face to every voice…\" \\\n  --control-type=\"button\" \\\n  --control-title=\"🗣 Say hello\" \\\n  --control-action=\"/usr/bin/say Hello World\"\n```\n\u003c/details\u003e\n\t\n#### War Games\n\n![War Games](./Resources/War-Games-Example.png)\n\nA more advanced example using buttons and passing parameters to the `say` command. A [detailed explanation of War Games](https://impedimenta.github.io/Suitcase-Bazaar/Examples/WarGames.html) can be found at the [Suitcase Bazaar](https://github.com/Impedimenta/Suitcase-Bazaar/).\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e📝 Code\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n$ Suitcase --name=\"War Games\" \\\n --control-title=\"Shall we play a game?\" \\\n\t--control-type=\"text-field\" \\\n\t--control-identifier=\"say.textfield\" \\\n  --control-title=\"Daniel\" \\\n\t--control-type=\"button\" \\\n\t--control-group-identifier=\"g.btns\" \\\n\t--control-action=\"/usr/bin/say\" \\\n\t--control-action-parameter=\"-v,Daniel,say.textfield\" \\\n  --control-title=\"Samantha\" \\\n\t--control-type=\"button\" \\\n\t--control-group-identifier=\"g.btns\" \\\n\t--control-action=\"/usr/bin/say\" \\\n\t--control-action-parameter=\"-v,Samantha,say.textfield\" \\\n  --control-title=\"Veena\" \\\n\t--control-type=\"button\" \\\n\t--control-group-identifier=\"g.btns\" \\\n\t--control-action=\"/usr/bin/say\" \\\n\t--control-action-parameter=\"-v,Veena,say.textfield\"\n```\n\u003c/details\u003e\n\n#### Menus\n\n[![Menus](./Resources/Menus-Example.png)](https://vimeo.com/413141354)\n\nThis example shows how to create menus and sub-menus. Actions can be attached to any menu item the same way as `button`s. [Watch the video of this example in action.](https://vimeo.com/413141354)\n\nMenu items can also be assigned a keyboard shortcut. See the [full documentation](./Basic.md) for more details. \n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e📝 Code\u003c/b\u003e\u003c/summary\u003e\n\t\n```bash\n$ Suitcase --name=\"Demo App\" --window-title=\"Menus\" \\\n  --control-title=\"UUID\" \\\n\t--control-type=\"label\" --control-identifier=\"com.label.uuid\" \\\n  --menu-title=\"Action\u003eGenerate\u003eUUID\" \\\n\t--menu-action=\"/usr/bin/uuidgen\" \\\n\t--menu-action-destination=\"com.label.uuid\" \\\n  --menu-title=\"Action\u003eCopy UUID\" \\\n  --menu-shortcut=\"k\" \\\n  --menu-action=\"/usr/bin/printenv com.label.uuid | /usr/bin/pbcopy\"\n```\n\u003c/details\u003e\n\n#### Hidden Files \u0026 Folders\n\n[![Hidden Files \u0026 Folders](./Resources/Hide-Example.png)](https://vimeo.com/413199912)\n\nThis is a more involved example that uses `defaults` to read the macOS user defaults system and use `sed` to set a state `label`. [Watch the video of this example in action.](https://vimeo.com/413199912)\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003e📝 Code\u003c/b\u003e\u003c/summary\u003e\n\t\n```bash\n$ Suitcase --name=\"Hidden Finder Settings\" \\\n  --control-title=\"Hidden Files \u0026 Folders:\" \\\n\t--control-group-identifier=\"com.finder.hidden\" \\\n\t--control-type=\"label\" \\\n  --control-title=\"unknown\" \\\n\t--control-group-identifier=\"com.finder.hidden\" \\\n\t--control-type=\"label\" \\\n\t--control-identifier=\"com.label.hidden.state\" \\\n  --control-title=\"Refresh\" \\\n\t--control-group-identifier=\"com.finder.hidden\" \\\n\t--control-type=\"button\" \\\n\t--control-action=\"/usr/bin/defaults read com.apple.finder AppleShowAllFiles | /usr/bin/sed s/1/Visible/g;s/0/Hidden/g\" \\\n\t--control-action-destination=\"com.label.hidden.state\" \\\n  --control-title=\"Enable\" \\\n\t--control-type=\"button\" \\\n\t--control-group-identifier=\"com.finder.hidden.buttons\" \\\n\t--control-action=\"/usr/bin/defaults write com.apple.finder AppleShowAllFiles -bool TRUE \u0026 /usr/bin/killall Finder\" \\\n  --control-title=\"Disable\" \\\n\t--control-type=\"button\" \\\n\t--control-group-identifier=\"com.finder.hidden.buttons\" \\\n\t--control-action=\"/usr/bin/defaults write com.apple.finder AppleShowAllFiles -bool FALSE \u0026 /usr/bin/killall Finder\"\n```\n\u003c/details\u003e\n\nThis is how the command would be run in Terminal.\n\n```bash\n$ defaults read com.apple.finder AppleShowAllFiles | sed 's/1/Visible/g;s/0/Hidden/g'\n```\n\nThe button uses `\u0026` to run two commands, one to write to the user defaults and the second to relaunch the Finder:\n\n```bash\n$ defaults write com.apple.finder AppleShowAllFiles -bool TRUE\n```\n\nKill the Finder and relaunch:\n\n```bash\n$ killall Finder\n```\n\n## Suitcase\n\n### Export as a `.command`\n\nAny Suitcase command can be exported as a self running `.command` file. You can double click this file to launch the Suitcase or share the file (it's just plain text).\n\n![Export Command](./Resources/export-screenshot.png)\n\n## Bug Reports \u0026 Feature Requests\n\nPlease [create an issue](https://github.com/Impedimenta/Suitcase/issues).\n\n## Contact\n\nReleases and News ([@SuitcaseCLI](https://twitter.com/SuitcaseCLI))\nRichard Stelling ([@rjstelling](https://twitter.com/rjstelling))\n\n## Thanks to\n\n- [Dave Verwer](https://github.com/daveverwer) at [iOS Dev Weekly](https://iosdevweekly.com)\n","funding_links":["https://github.com/sponsors/rjstelling"],"categories":["Others"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FImpedimenta%2FSuitcase","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FImpedimenta%2FSuitcase","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FImpedimenta%2FSuitcase/lists"}