{"id":29125860,"url":"https://github.com/krwclassic/ironshell","last_synced_at":"2025-12-30T22:20:59.596Z","repository":{"id":301789480,"uuid":"1010309122","full_name":"KRWCLASSIC/IronShell","owner":"KRWCLASSIC","description":"IronShell is a self-hosted PowerShell app installer server for Windows, providing on-demand, versioned install and uninstall scripts for your own or community-maintained apps, with automatic GitHub tag discovery and easy command-line usage.","archived":false,"fork":false,"pushed_at":"2025-06-28T20:14:35.000Z","size":18,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-28T21:22:30.990Z","etag":null,"topics":["api","cli","command-line","flask","github","github-tags","installer","powershell","python","rest","script","scripts","self-host","self-hosted","server","tags","waitress","web","windows"],"latest_commit_sha":null,"homepage":"https://utils.krwclassic.com","language":"Python","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/KRWCLASSIC.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-28T19:48:14.000Z","updated_at":"2025-06-28T20:14:39.000Z","dependencies_parsed_at":"2025-06-28T21:22:32.508Z","dependency_job_id":"cc2ea77f-11c0-4950-8ce3-e7e5761382c9","html_url":"https://github.com/KRWCLASSIC/IronShell","commit_stats":null,"previous_names":["krwclassic/ironshell"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/KRWCLASSIC/IronShell","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KRWCLASSIC%2FIronShell","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KRWCLASSIC%2FIronShell/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KRWCLASSIC%2FIronShell/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KRWCLASSIC%2FIronShell/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KRWCLASSIC","download_url":"https://codeload.github.com/KRWCLASSIC/IronShell/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KRWCLASSIC%2FIronShell/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262674943,"owners_count":23346741,"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":["api","cli","command-line","flask","github","github-tags","installer","powershell","python","rest","script","scripts","self-host","self-hosted","server","tags","waitress","web","windows"],"created_at":"2025-06-29T22:04:23.745Z","updated_at":"2025-12-30T22:20:59.568Z","avatar_url":"https://github.com/KRWCLASSIC.png","language":"Python","readme":"# IronShell\n\n**IronShell** is a self-hosted flask-waitress server for distributing Windows applications via PowerShell one-liners. It dynamically generates PowerShell installer scripts for your apps, supporting version selection, custom install folders, and user-friendly display names.\n\n## krwutils CLI app\n\nStill in development, but it simplifies install proccess of my apps.\n\n\u003e yeah thats a lie, i didnt even start it.\n\n## TODO\n\n- App descriptions and hyperlinks\n- Force remove installation folder on uninstall or config value to configure what should be deleted aswell (with * meaninng force entire folder removal)\n- Create shortcuts on install\n- Non-binary apps support (.py script with wrappers etc., additional subscripts for checking machine env. like installed python etc.) | 25% done (via autorun prefix, left to do: env checking, dependencies, run helpers, winget integration? etc.)\n- Env dependencies (set dependencies like powershell and python and use error syntax in powershell to detect if binary responded)\n\n- Env presets? (e.g. in config you set preset: \"python_env\" and with the install it includes minimalistic python install or smth)\n\n## Future\n\n- Custom Pufferpanel template\n- Autoupdate server (install/uninstall scripts) on boot. (pufferpannel only? preboot script)\n- Linux Support/Port with .sh scripts or krwutils only port.\n\n## Features\n\n- Serve PowerShell install scripts for any app hosted on GitHub\n- Supports custom binary names, install folders, and display names\n- Flexible version selection (latest, oldest, specific, wildcards, etc.)\n- Easy to extend: just edit `config.json`\n- `/list` endpoint for discoverability\n\n## Requirements\n\n- Python 3.7+     // Tho i recommend 3.11\n- flask           // For Server framework\n- waitress        // For WSGI part of the server\n- requests        // For Retriving GitHub page to scrape\n- beautifulsoup4  // For scraping version tags\n\n## Quick Start\n\n1. Clone this repo and `cd` into it.\n2. Edit `config.json` to add your apps.\n3. Run the server:\n\n   ```sh\n   python server.py\n   ```\n\n4. From a Windows machine, install an app with:\n\n   ```powershell\n   iwr http://yourserver/install/appname | iex\n   ```\n\n   Or list available apps:\n\n   ```powershell\n   iwr http://yourserver/list | iex\n   ```\n\n\u003e **Want to use a custom domain instead of an IP address? Or just general help with setting this project up?**  \n\u003e See the [generalSetup.md](generalSetup.md) guide for setup instructions.\n\n## Example Usage\n\n- To install the latest version of `SASM` from Nuitka builds:\n\n  ```powershell\n  iwr https://utils.krwclassic.com/install/sasm-nuitka | iex\n  ```\n\n- To see all available apps:\n\n  ```powershell\n  iwr https://utils.krwclassic.com/list | iex\n  ```\n\n## Configuration\n\nThe server uses a `config.json` file to define which apps are available for installation and how their installers are generated.\n\n### Structure\n\n```json\n{\n    \"apps\": {\n        \"endpoint-name\": {\n            \"owner\": \"GitHubOwner\",         // (required) GitHub username or organization\n            \"repo\": \"RepositoryName\",       // (required) GitHub repository name\n            \"binary\": \"binary.exe\",         // (required) Name of the binary to download from the release/tag\n            \"version\": \"latest\",            // (optional) Version/tag selection rule (see below)\n            \"name\": \"Display Name\",         // (optional) User-friendly name for display in the installer (defaults to repo)\n            \"folder\": \"installfolder\",      // (optional) Folder name for installation (defaults to repo)\n            \"autorun\": false,               // (optional) Autorun app after install (default: false)\n            \"autorunPrefix\": \"\",            // (optional) Prefix for autorun command (e.g. \"cmd /k\", \"python -m\")\n            \"autorunArguments\": \"\",         // (optional) Arguments for autorun command\n            \"postInstallMessage\": \"\",       // (optional) Message shown after install, before 'press any key'\n            \"postUninstallMessage\": \"\"      // (optional) Message shown after uninstall, before 'press any key'\n        },\n        // ... more apps ...\n    }\n}\n```\n\n### Field Descriptions\n\n- **endpoint-name**: The name used in the URL, e.g. `/install/weget`.\n- **owner**: The GitHub username or organization that owns the repository.\n- **repo**: The repository name on GitHub.\n- **binary**: The name of the binary file to download from the release/tag assets.\n- **version**: (Optional) Controls which tag to use for the download. Supports:\n  - `\"latest\"` — The newest tag (default)\n  - `\"latest-N\"` — The Nth latest tag (e.g., `latest-1` is the previous tag)\n  - `\"first\"` — The oldest tag\n  - `\"first+\"` — The Nth oldest tag (e.g., `first+1` is the second oldest tag)\n  - `\"\u003ctag\u003e\"` — A specific tag name\n  - Wildcards: `\"*-Nuitka\"`, `\"?.?.?-Nuitka\"` — Uses the first tag matching the pattern (shell-style wildcards)\n- **name**: (Optional) User-friendly display name for the app, shown in the PowerShell output. Defaults to the repo name if not set.\n- **folder**: (Optional) The folder name under `%APPDATA%\\\u003cowner\u003e\\\u003cfolder\u003e` where the app will be installed. Defaults to the repo name if not set.\n- **autorun**: (Optional, default: false) If true, the app will be run automatically after installation completes.\n- **autorunPrefix**: (Optional) If set, this prefix will be prepended to the autorun command (e.g. `python -m`, `cmd /k`). If set, the autorun command will be launched in a new PowerShell window. *see [Notes](#notes) and [Autorun Behavior](#autorun-behavior) for more info\n- **autorunArguments**: (Optional) Arguments to pass to the autorun command (e.g. `--help`).\n- **postInstallMessage**: (Optional) If set, this message will be shown after installation completes.\n- **postUninstallMessage**: (Optional) If set, this message will be shown after uninstallation completes.\n\n### Example\n\n```json\n{\n    \"apps\": {\n        \"sasm-nuitka\": {\n            \"owner\": \"KRWCLASSIC\",\n            \"repo\": \"Steam-Account-Switcher-Manager\",\n            \"binary\": \"sasm.exe\",\n            \"version\": \"*-Nuitka\",\n            \"name\": \"SASM\",\n            \"folder\": \"steamaccountswitchermanager\",\n            \"autorun\": false,\n            \"autorunPrefix\": \"\",\n            \"autorunArguments\": \"\",\n            \"postInstallMessage\": \"SASM installed! Enjoy switching your Steam accounts.\",\n            \"postUninstallMessage\": \"SASM has been removed. Come back soon!\"\n        },\n        \"my-python-app\": {\n            \"owner\": \"me\",\n            \"repo\": \"my-python-repo\",\n            \"binary\": \"myscript.py\",\n            \"version\": \"latest\",\n            \"name\": \"MyPythonApp\",\n            \"folder\": \"mypythonapp\",\n            \"autorun\": true,\n            \"autorunPrefix\": \"python -m\",\n            \"autorunArguments\": \"--help\",\n            \"autorunArguments\": \"\",\n            \"postInstallMessage\": \"\",\n            \"postUninstallMessage\": \"\"\n        }\n    }\n}\n```\n\n## Autorun Behavior\n\nIf `autorun` is set to true, the installer will automatically run the app after installation:\n\n- If `autorunPrefix` is set (e.g. `python`, `cmd /k`), the command will be launched in a **new PowerShell window** so apps dont collide with execution of the installer. *see [Notes](#notes) for more info\n- If `autorunPrefix` is not set, the binary will be run directly in the current session.\n- `autorunArguments` are appended to the command.\n\n**Examples:**\n\n- Run a CLI app and keep the window open:\n\n  ```json\n  \"autorun\": true,\n  \"autorunPrefix\": \"cmd /k\",\n  \"autorunArguments\": \"\"\n  ```\n\n- Run a Python script:\n\n  ```json\n  \"autorun\": true,\n  \"autorunPrefix\": \"python -m\",\n  \"autorunArguments\": \"--help\"\n  ```\n\n## Notes\n\n- You can set `autorunPrefix` to `\" \"` to run the app in new window without any actual prefix.\n- The `owner`, `repo`, and `binary` fields are required for each app. Other fields have default values if not specified.\n- The `version` field in config supports wildcards (`*`, `?`) for flexible tag selection.\n- The `name` field is used for all user-facing output in the PowerShell installer.\n- The `folder` field controls the install directory name; use it to match the folder your app creates or expects.\n- The endpoint name (e.g., `weget`) is what users will use in the install URL: `iwr http://yourserver/install/weget | iex`\n\n## 📜 License\n\nThis project is licensed under **[KRW LICENSE v1](https://github.com/KRWCLASSIC/IronShell?tab=License-1-ov-file)**  \nFree for non-commercial use and public forks.\n\n💬 Contact me even for personal uses — I might feature your project!  \n📬 \u003cclassic.krw@gmail.com\u003e • Discord: @krwclassic\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrwclassic%2Fironshell","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkrwclassic%2Fironshell","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkrwclassic%2Fironshell/lists"}