{"id":31761296,"url":"https://github.com/stevepentland/spinup","last_synced_at":"2026-03-11T00:32:42.407Z","repository":{"id":37178361,"uuid":"220822410","full_name":"stevepentland/spinup","owner":"stevepentland","description":"A tool to help you spin up a newly installed machine","archived":false,"fork":false,"pushed_at":"2023-03-24T23:36:28.000Z","size":392,"stargazers_count":4,"open_issues_count":27,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-10-09T21:51:08.293Z","etag":null,"topics":["distro-packages","installing","linux","operating-system","snap-packages"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stevepentland.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-11-10T17:11:09.000Z","updated_at":"2022-01-05T18:15:45.000Z","dependencies_parsed_at":"2023-02-12T06:00:53.568Z","dependency_job_id":null,"html_url":"https://github.com/stevepentland/spinup","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/stevepentland/spinup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevepentland%2Fspinup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevepentland%2Fspinup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevepentland%2Fspinup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevepentland%2Fspinup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stevepentland","download_url":"https://codeload.github.com/stevepentland/spinup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stevepentland%2Fspinup/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30363921,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-10T21:41:54.280Z","status":"ssl_error","status_checked_at":"2026-03-10T21:40:59.357Z","response_time":106,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["distro-packages","installing","linux","operating-system","snap-packages"],"created_at":"2025-10-09T21:48:33.912Z","updated_at":"2026-03-11T00:32:42.390Z","avatar_url":"https://github.com/stevepentland.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![Actions Status](https://github.com/stevepentland/spinup/workflows/Rust/badge.svg)](https://github.com/stevepentland/spinup/actions) [![Dependabot Status](https://api.dependabot.com/badges/status?host=github\u0026repo=stevepentland/spinup\u0026identifier=220822410)](https://dependabot.com) [![codecov](https://codecov.io/gh/stevepentland/spinup/branch/master/graph/badge.svg)](https://codecov.io/gh/stevepentland/spinup)\n\n# Spinup\n\n## Special Note\n\nSpinup is currently beta software\n\n## Background\n\nSpinup is a program designed to make setting up newly installed Linux machines easy and repeatable. There is no complicated software to install, just a single application and a configuration file that can be in json, toml, or yaml format. It comes from my regular distro\nhopping and always wanting to get back to a working system. I had originally been using a shell script in a gist, but wanted something a bit more robust.\n\nIt will perform system upgrades, install packages via your package manager, download files from the web, run custom commands, and install snap packages. All actions are defined in a configuration file and passed to the application at runtime.\n\n## Getting Started\n\nCurrently, an initial build is provided, but it can also be quickly built by cloning this repo and running `cargo build --release` .\n\nSpinup will build on current stable rust, with a version of 1.39 or greater.\n\nOnce you have the `spinup` binary, you can put it onto a newly installed machine and run it. In the future, builds will be populated in the [Releases](https://github.com/stevepentland/spinup/releases) page.\n\n## Running Spinup\n\nWhen you have a spinup binary, you simply have to run it while passing in a path to a configuration file:\n\n``` \n./spinup my-config.yml\n```\n\nTo see all available options, run spinup with the `-h` or `--help` argument.\n\n## Configuration Files\n\nSpinup plays a set of instructions that are provided via a configuration file. Examples of configuration files can be found in the [examples](https://github.com/stevepentland/spinup/tree/master/examples) directory in the project.\n\n### Main Configuration Items\n\nThe following items can be defined at the top level of the configuration file:\n\n* [package_list](#specifying-packages) \n  + This is the main set of packages you want to install from your distro's package manager\n* [file_downloads](#downloading-files) \n  + These are files that you want to have downloaded to your system. These could be config files, fonts, etc\n* [snaps](#installing-snap-packages) \n  + Snap packages to install, currently requires that you install `snapd` in the package list or are on a system with it already present \n* `update_system` \n  + Whether to run your system's update/upgrade commands before starting the install process\n  + **Note:** Implementation of this feature is currently in progress\n* [custom_commands](#custom-commands)\n  + Freeform commands you want to run on their own\n* [command_sets](#command-sets)\n  + Sets of [custom_command](#custom-commands) items you want to run in a particular order\n\nAll items are optional, and if not defined, will just be skipped.\n\n### Specifying Packages\n\nPackages are defined within the `package_list` configuration element. There are two different fields for the packages section:\n\n* `base_packages` \n  + This is just an optional list of strings for package names to install\n  + These names will be used as-is, so they should be names that are universal across distros\n* [distro_packages](#distro-packages)\n  + Packages that have names specific for a given distro\n  + This is a list of objects detailing the names of the packages and their platform\n\nAll packages listed will be passed to the default package manager for the platform. Auto-confirmation will be specified, meaning no confirmation will be requested at run time. If the install process requires root (which it generally will), the user will be prompted to authorize a `sudo` session.\n\n#### Distro Packages\n\nTo accommodate packages which have different names based on the target distro, the `distro_package` objects allow you to specify those packages. Each object in the collection has two fields:\n\n* `target_os` \n  + This is the name of the distro, as defined in the `/etc/os-release` file `ID` or `ID_LIKE` field.\n* `packages` \n  + A list of the packages to install\n\n### Downloading Files\n\nThe `file_downloads` collection will allow you to obtain arbitrary files and run a custom command after the downloads complete. Each object in the collection has the following fields:\n\n* `base_dir` \n  + This is the directory to download this set of files _into_\n* `after_complete` \n  + A [Custom Command](#custom-commands) to run after the files are downloaded\n* [files](#specifying-files)\n  + The files to download\n\n#### Specifying Files\n\nEach file download contains a collection of files to download. These elements are objects consisting of two fields.\n\n* `source` \n  + The URL to download this file from\n  + Currently, these are used as-is, so they should be http encoded in the configuration\n  + Public URL values only, no authentication is currently offered\n* `target` \n  + The filename to give to the downloaded file.\n  + This will be combined with `base_dir` \n\n### Installing Snap Packages\n\n**Note:** Currently, `spinup` does not check for the existence of `snapd` on your system and/or install it. This will be coming in the future, but until then please ensure it is in your package lists.\n\nThe `snaps` section of the configuration allows you to specify snap packages to install. There are two different subsections which are similar to how packages work.\n\n* `standard_snaps` \n  + This is just a flat list of snap names\n  + These snaps will all be installed from the `stable` channel\n  + Snaps requiring `classic` confinement cannot be installed via this list\n* [alternate_snaps](#snaps-with-special-requirements)\n  + These are snaps that require different channels and/or confinement\n  + This is an optional list of objects allowing you to specify individual settings\n\n#### Snaps with Special Requirements\n\nThe objects in the `alternate_snaps` section have the following values:\n\n* `name` \n  + This is the name of the snap to install\n* `classic` \n  + true/false for whether to install this snap with classic confinement\n* `channel` \n  + An enum value for the channel this snap should come from, allowed values are:\n    1. `stable` \n    2. `beta` \n    3. `candidate` \n    4. `edge` \n  + This tool will not attempt to resolve any issues with channels, if the snap does not exist in the specified channel, the operation will fail.\n\n### Custom Commands\n\nFor actions that are not yet built-in to the program, custom commands can be leveraged to run arbitrary shell commands.\n\nCustom commands have the following properties:\n\n* `command` \n  + This is the name of the command to run\n* `args` \n  + An optional collection of strings that should be passed to `command` \n* `needs_root` \n  + Indicates whether `spinup` should run this command via `sudo` \n\nCustom commands specified in the config file are not guaranteed to be run in any particular order. If you\nhave a set of related commands that you want to run in this fashion, take a look at [command_sets](#command-sets)\n\n### Command Sets\n\nFor times that you need to run a given set of operations in a particular order, command sets will likely do\nwhat you're looking for. Basically, they are a named collection of [Custom Commands](#custom-commands) that\nhave a set ordering. During runtime, this ordering is used to execute the commands as specified.\n\nCommand Sets have the following properties:\n\n* `name` \n  + This is the name of the set of commands\n* `commands` \n  + A listing of the commands to run\n\n#### The Commands in the Set\n\nThe ordered commands are similar to [Custom Commands](#custom-commands) but have an additional field that\nspecified the order in which to run them.\n\nThe available fields are as follows:\n\n* `id` \n  + A positive integer specifying where this command belongs in the set\n  + This is only a `u8` , so assign maximum values accordingly\n* `command` \n  + This is the name of the command to run\n* `args` \n  + An optional collection of strings that should be passed to `command` \n* `needs_root` \n  + Indicates whether `spinup` should run this command via `sudo` \n\n## Future Additions\n\nAs `spinup` is still not finished, there are a lot of extra features that I'd like to add. This includes:\n\n* Flatpak support\n* Direct integration with package manager libs instead of using shell processes\n* Better handling of missing packages, and other errors\n* More testing, including integration testing\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevepentland%2Fspinup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstevepentland%2Fspinup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstevepentland%2Fspinup/lists"}