{"id":32527865,"url":"https://github.com/thorstenhans/demos-cli","last_synced_at":"2026-07-01T23:32:23.178Z","repository":{"id":320189978,"uuid":"1081144669","full_name":"ThorstenHans/demos-cli","owner":"ThorstenHans","description":"Run tech demos of SSH","archived":false,"fork":false,"pushed_at":"2025-10-25T12:21:38.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-25T07:41:54.572Z","etag":null,"topics":["conferences","demo-or-die","demos","ssh"],"latest_commit_sha":null,"homepage":"","language":"Go","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/ThorstenHans.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,"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},"funding":{"github":"ThorstenHans"}},"created_at":"2025-10-22T11:24:42.000Z","updated_at":"2025-10-25T12:21:41.000Z","dependencies_parsed_at":"2025-10-25T13:23:27.798Z","dependency_job_id":null,"html_url":"https://github.com/ThorstenHans/demos-cli","commit_stats":null,"previous_names":["thorstenhans/demos-over-ssh","thorstenhans/demos-cli"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/ThorstenHans/demos-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThorstenHans%2Fdemos-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThorstenHans%2Fdemos-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThorstenHans%2Fdemos-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThorstenHans%2Fdemos-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ThorstenHans","download_url":"https://codeload.github.com/ThorstenHans/demos-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ThorstenHans%2Fdemos-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35027341,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-01T02:00:05.325Z","response_time":130,"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":["conferences","demo-or-die","demos","ssh"],"created_at":"2025-10-28T10:52:12.457Z","updated_at":"2026-07-01T23:32:23.162Z","avatar_url":"https://github.com/ThorstenHans.png","language":"Go","funding_links":["https://github.com/sponsors/ThorstenHans"],"categories":[],"sub_categories":[],"readme":"# The `demos` CLI \n\n\u003e TL;DR: Don't let bad conference network nuke your demos. Instead offload network intense demos to a dedicated machine and execute them over SSH. Resulting in less data being transferred over the conference network.\n\n## Installation\n\nDownload the `demos` binary from the recent [release page](https://github.com/ThorstenHans/demos-over-ssh/releases) and ensure it is executable (`chmod +x demos`). You can either execute the binary from the folder you've downloaded it to, or move it into your `PATH`.\n\n## Available Sub Commands\n\nThe `demos` CLI provides the following sub commands:\n\n- `set-config`: To set necessary configuration\n- `get-config`: To get necessary configuration\n- `initialize`: To generate a demos file (`%HOME/.demos/demos.json`)\n- `validate`: To validate your demos\n- `run`: To run particular demos (your demos will be added as sub command to `demos run` e.g., `demos run hello-world`)\n\n## Configuration\n\nThe `demos` application requires two different sets of configuration data: \n\n- Configuration for establishing an SSH connection to the \"jump box\"\n- Your actual demos\n\n### SSH Configuration\n\nAfter you've downloaded the `demos` executable run the `demos set-config` command. It'will prompt for your SSH configuration data. You must provide:\n\n- IPv4 address of the jump box\n- Desired SSH Port (default `22`)\n- SSH user name\n- Password for the SSH user\n\nConfiguration data is encrypted at REST and stored in your user profile (`$HOME/.demos/demos.config`).\n\n\n### Configuring Demos\n\nThe `demos` app comes with a sample demo backed in... However, you want to provide your own demos (obviously). To give you a head start, you can use the `demos initialize` command, which will create the `$HOME/.demos/demos.json` file for you. You can add as many demos to the JSON array as you want. Here some additional information for specifying your demos:\n\n- A demo can consist of an unlimited number of steps. \n- A demo step must have a `kind` specified. \n  - `kind` must be one of ( \n    - code (`1`)\n    - sleep (`2`)\n    - text (`0`)\n  - Steps of kind `text` are printed locally directly to `stdout`\n  - Steps of kind `sleep` are executed locally \n  - Commands of kind `sleep` must be valid `int` values (validate by the CLI) at runtime, provided value is interpreted as seconds\n- Every code step is executed over SSH in a dedicated session and it's output is forwarded to the local `stdout`\n- A demo must have a `name`, a `cliCommand`, an `alias` and a `description`\n  - `cliCommand` and `alias` have unique constraints which are enforced when loading the demos into the binary at runtime\n\n```jsonc\n[\n  {\n    \"name\": \"Sample Load Test\",\n    \"cliCommand\": \"load-test\",\n    \"alias\": \"lt\",\n    \"description\": \"Run the sample load test\",\n    \"steps\": [\n      {\n        \"command\": \"We'll sent 100 requests to Google now\",\n        // text\n        \"kind\": 0\n      },\n      {\n        \"command\": \"which hey\",\n        // code\n        \"kind\": 1\n      },\n      {\n        \"command\": \"6\",\n        // sleep\n        \"kind\": 2\n      },\n      {\n        \"command\": \"hey -c 10 -n 100 https://www.google.com\",\n        // code\n        \"kind\": 1\n      },\n      {\n        \"command\": \"100 requests sent!\",\n        // text\n        \"kind\": 0\n      }\n    ]\n  }\n]\n\n``` \n\n## Dynamic CLI Commands\n\nFor each demo provided, a new sub-command is added under `demos run` using the specified `cliCommand` as command name and setting the provided `alias` as command alias.\n\nTaking the previously shown `demos.json` into context, you will end up with the following commands available as part of the `demos` CLI:\n\n```bash\n# default command name\ndemos run load-test\n\n# command alias\ndemos run lt\n```\n\n## Printing your Demos\n\nAs demos are automatically hooked up into the CLI, you can simply execute `demos run` to get a list of all commands (demos) that could be executed. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthorstenhans%2Fdemos-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthorstenhans%2Fdemos-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthorstenhans%2Fdemos-cli/lists"}