{"id":31523642,"url":"https://github.com/jaz303/spinup","last_synced_at":"2025-10-03T16:56:36.115Z","repository":{"id":20027358,"uuid":"23295324","full_name":"jaz303/spinup","owner":"jaz303","description":"Development process runner: simple, flexible, fast. Unix-friendly!","archived":false,"fork":false,"pushed_at":"2018-06-02T10:23:04.000Z","size":431,"stargazers_count":13,"open_issues_count":0,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2023-11-04T01:22:36.879Z","etag":null,"topics":["developer-tools","javascript","process-manager","runner","task-runner","tool"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","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/jaz303.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-08-24T22:56:36.000Z","updated_at":"2020-11-25T12:49:15.000Z","dependencies_parsed_at":"2022-08-27T02:40:20.695Z","dependency_job_id":null,"html_url":"https://github.com/jaz303/spinup","commit_stats":null,"previous_names":[],"tags_count":37,"template":null,"template_full_name":null,"purl":"pkg:github/jaz303/spinup","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaz303%2Fspinup","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaz303%2Fspinup/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaz303%2Fspinup/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaz303%2Fspinup/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jaz303","download_url":"https://codeload.github.com/jaz303/spinup/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jaz303%2Fspinup/sbom","scorecard":{"id":509516,"data":{"date":"2025-08-11","repo":{"name":"github.com/jaz303/spinup","commit":"3b3139e7a5763299bc7097263f1eea83d8d391c0"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":2.5,"checks":[{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Code-Review","score":0,"reason":"Found 1/29 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Dangerous-Workflow","score":-1,"reason":"no workflows found","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Pinned-Dependencies","score":-1,"reason":"no dependencies found","details":null,"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Token-Permissions","score":-1,"reason":"No tokens found","details":null,"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":0,"reason":"license file not detected","details":["Warn: project does not have a license file"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":9,"reason":"1 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-g4rg-993r-mgx7"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 2 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-20T00:10:35.888Z","repository_id":20027358,"created_at":"2025-08-20T00:10:35.889Z","updated_at":"2025-08-20T00:10:35.889Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278196452,"owners_count":25946326,"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","status":"online","status_checked_at":"2025-10-03T02:00:06.070Z","response_time":53,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":["developer-tools","javascript","process-manager","runner","task-runner","tool"],"created_at":"2025-10-03T16:56:31.112Z","updated_at":"2025-10-03T16:56:36.106Z","avatar_url":"https://github.com/jaz303.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# spinup\n\nSpinup is a simple process runner for use during development, designed for bringing up all necessary servers and file-watchers with a single command.\n\nUsing Spinup is as simple as creating a `spin.up` file containing one shell command per line in your project's root directory and then running the `spinup` executable.\n\nSupports process groups, per-process kill signals, daemonisation, environment variables (inc. dotenv), and configurable output formatting.\n\n![spinup demo](demo.gif)\n\nSpinup is pretty customisable. Let's take a look at an example config file:\n\n```\n# (lines beginning with # are comments...)\n\n# Directives are denoted by \"!\" and come before any commands\n# Directives are used to configure global settings.\n# (!prefix sets the prefix for each line of output)\n!prefix [%p]\n\n# Run the webserver\npython -m SimpleHTTPServer 9000\n\n# Compile some JavaScript\nwatchify -o bundle.js main.js\n\n# Per-command options are prefixed with @ and will be applied to the next command\n# (@cd sets the working directory for the next command)\n@cd www\nphp -S 127.0.0.1:8000\n\n# Shell arguments are parsed correctly...\necho \"let's test\" \"the argument\" parser\n\n# ...and environment variables can be used too:\necho \"your home directory is:\" $HOME\n```\n\n`spinup` will run until all child processes have exited. Hit `Ctrl-C` to send `SIGTERM` to any that are still running (this kill signal can be customised on a per-command basis, see the `@kill` option below).\n\n`dotenv` is also supported; any environment variables defined within `.env` will made available to the commands listed in `spin.up`.\n\n## Installation\n\nSpinup can be installed globally, or run locally via `npx`. To install globally:\n\n```shell\n$ npm install -g spinup\n```\n\nFor local usage:\n\n```shell\n$ npm install spinup\n$ touch spin.up\n$ npx spinup\n```\n\n## Usage\n\n```\n$ spinup [-g | --group $group_list] [config]\n```\n\n  - `-g | --group`: optional comma separated list of groups to run; can be specified multiple times\n  - `config`: optional path to configuration file, defaults to `./spin.up`.\n\n## Directives\n\nLeading lines of the `spin.up` file can include _directives_. Directives begin with a `!`, followed by the name of the directive and then its arguments.\n\n### `!default`\n\nSets an environment variable if it does not already exist.\n\n```\n!default PORT 3000\necho $PORT\n```\n\n```shell\n$ spinup\n3000\n$ PORT=5000 spinup\n5000\n```\n\nSee also: `!set`, to unconditionally set an environment variable.\n\n### `!noprefix`\n\nDo not add a prefix onto each line of output.\n\nSee also: `!prefix`.\n\n### `!ports`\n\nThe `!ports` directive can be used to automatically create any number of environment variables with sequential integer values, starting from a given base. This is useful for generating port numbers for your processes to listen on, connect to etc. Because the values are written to environment variables its possible to refer to the same value multiple times, i.e. in instances where one process needs to communicate with another. Let's take a look at how it works.\n\nThis first example generates three port numbers, `$A`, `$B` and `$C`, starting from 5000. So `$A` is 5000, `$B` is 5001 etc:\n\n```\n!ports 5000 $A $B $C\n```\n\nIt's also possible to specify an optional override variable. If this environment variable is present its value will be used instead of the base port number:\n\n```\n!ports $BASE:9000 $WEB_SERVER $TILE_SERVER\n```\n\nIn the above example, `$WEB_SERVER` and `$TILE_SERVER` will default to 9000 \u0026amp; 9001, but this can be overridden by defining the environment variable `$BASE` to some other port number before invoking `spinup`.\n\nPort numbers generated by the `!ports` directive are used in the same way as any other environment variable. Here's an example that spawns two mutually communicating processes:\n\n```\n!ports $BASE:8000 $P1 $P2\n\nprocess1 --listen $P1 --connect $P2\nprocess2 --listen $P2 --connect $P1\n```\n\n### `!prefix`\n\nSets the prefix to prepend to each line of output.\n\nSupported substitutions:\n\n  * `%t`: task number (i.e. the `t`th task listed in `spin.up`, starting from zero)\n  * `%p`: process ID\n  * `%c`: command; can optionally be suffixed with a number to restrict/pad output length\n  * `%n`: command name, as specified by per-command option @name; if unspecified, defaults to command\n  * `%Y`: year (4 digits)\n  * `%y`: year (2 digits)\n  * `%m`: month\n  * `%d`: day\n  * `%H`: hour\n  * `%M`: minutes\n  * `%S`: seconds\n\nThe default prefix is `[%t:%c6]`.\n\n### `!set`\n\nSets an environment variable; will be available to all child processes.\n\n```\n!set PORT 3000\n!set HOST 192.168.1.123:$PORT\n```\n\nSee also: `!default`\n\n## Per-command Options\n\nLines beginning with `@` define per-command options and will be applied to the next command read from the configuration file.\n\n### `@cd DIRECTORY`\n\nSet the working directory for the command.\n\n### `@group GROUP_LIST`, `@groups GROUP_LIST`\n\nSpace-separated list of groups that the next command belongs to. The command line option `-g` / `--group` can be used to restrict which groups' commands are launched.\n\nAny command for which `group` is not specified will belong to the `default` group.\n\n### `@kill SIGNAL`\n\nSet the name of the signal that should be used to kill the process.\n\n### `@name NAME`\n\nSet the name that should be displayed by the `%n` prefix option.\n\n### `@noerror`\n\nDo not treat the process' `stderr` as error output (usually highlighted in red), but instead use the process' specific color.\n\n## Copyright \u0026amp; License\n\n\u0026copy; 2014-2018 Jason Frame [ [@jaz303](http://twitter.com/jaz303) / [jason@onehackoranother.com](mailto:jason@onehackoranother.com) ]\n\nReleased under the ISC license.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaz303%2Fspinup","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjaz303%2Fspinup","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjaz303%2Fspinup/lists"}