{"id":18363444,"url":"https://github.com/stuttgart-things/machineshop","last_synced_at":"2026-04-29T14:03:22.508Z","repository":{"id":167997092,"uuid":"643471139","full_name":"stuttgart-things/machineshop","owner":"stuttgart-things","description":"git based CLI interface for managing configuration as code","archived":false,"fork":false,"pushed_at":"2026-04-20T14:54:47.000Z","size":123854,"stargazers_count":1,"open_issues_count":25,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-20T16:44:13.357Z","etag":null,"topics":["binaries","cli","cobra-cli","golang","stuttgart-things","templating","vault"],"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/stuttgart-things.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-05-21T09:13:57.000Z","updated_at":"2025-03-31T08:17:06.000Z","dependencies_parsed_at":"2026-03-25T00:03:59.666Z","dependency_job_id":null,"html_url":"https://github.com/stuttgart-things/machineshop","commit_stats":null,"previous_names":["stuttgart-things/machineshop"],"tags_count":96,"template":false,"template_full_name":null,"purl":"pkg:github/stuttgart-things/machineshop","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stuttgart-things%2Fmachineshop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stuttgart-things%2Fmachineshop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stuttgart-things%2Fmachineshop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stuttgart-things%2Fmachineshop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stuttgart-things","download_url":"https://codeload.github.com/stuttgart-things/machineshop/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stuttgart-things%2Fmachineshop/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32428622,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T13:34:34.882Z","status":"ssl_error","status_checked_at":"2026-04-29T13:34:29.830Z","response_time":110,"last_error":"SSL_read: 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":["binaries","cli","cobra-cli","golang","stuttgart-things","templating","vault"],"created_at":"2024-11-05T23:06:33.852Z","updated_at":"2026-04-29T14:03:22.483Z","avatar_url":"https://github.com/stuttgart-things.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# stuttgart-things/machineshop\n\n\u003cdiv align=\"center\"\u003e\n  \u003cp\u003e\n    \u003cimg src=\"https://github.com/stuttgart-things/docs/blob/main/hugo/sthings-train.png\" alt=\"sthings\" width=\"350\" /\u003e\n  \u003c/p\u003e\n  \u003cp\u003e\n    \u003cstrong\u003e[məˈʃiːnʃɒp]\u003c/strong\u003e- git based CLI interface for managing configuration as code\n\n  \u003c/p\u003e\n\u003c/div\u003e\n\n## FEATURES\n* RENDER TEMPLATES w/ DEFAULTS AND PARAMETERS (RENDER)\n* INSTALL MULTIPLE BINARIES FROM WEB SOURCES AT ONCE/IN PARALLEL (INSTALL)\n* RENDER + EXECUTE MULTIPLE SCRIPTS (INSTALL)\n* RETRIEVE SECRETS FROM VAULT (GET)\n\n## DEPLOYMENT\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eFROM RELEASE-ARCHIVE\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# LINUX x86_64\nVERSION=v2.6.10\nwget https://github.com/stuttgart-things/machineshop/releases/download/${VERSION}/machineshop_Linux_x86_64.tar.gz\ntar xvfz machineshop_Linux_x86_64.tar.gz\nsudo mv machineshop /usr/bin/machineshop\nrm -rf LICENSE README.md\nsudo chmod +x /usr/bin/machineshop\nmachineshop version\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eCONTAINER IMAGE\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# RUN COMMAND\nsudo nerdctl run ghcr.io/stuttgart-things/machineshop/machineshop-9c3178088556daa12a17db5edcc6b5b7:1.9.10 version\n```\n\n```bash\n# JUMP INTO SHELL\nnerdctl run -it --entrypoint bash \\\nghcr.io/stuttgart-things/machineshop/machineshop-9c3178088556daa12a17db5edcc6b5b7:1.9.10\n```\n\n\u003c/details\u003e\n\n## DEV\n\n\u003cdetails\u003e\u003csummary\u003eALL TASKS\u003c/summary\u003e\n\n```bash\ntask: Available tasks for this project:\n* branch:              Create branch from main\n* build:               Build code\n* build-image:         Build container image\n* build-ko:            Build image w/ KO\n* check:               Run pre-commit hooks\n* commit:              Commit + push code into branch\n* dagger-ko:           Build image w/ ko\n* delete-branch:       Delete branch from origin\n* goreleaser:          Release bins w/ goreleaser\n* install:             Install\n* lint:                Lint\n* pr:                  Create pull request into main\n* release:             Release\n* release-image:       Release image\n* run:                 Run\n* switch-local:        Switch to local branch\n* switch-remote:       Switch to remote branch\n* tag:                 Commit, push \u0026 tag the module\n* tasks:               Select a task to run\n* test:                Test\n* test-install:        Test crossplame modules\n* test-run:            Build Bin \u0026 Test Run Command\n* test-version:        Test version cmd\n* tests:               Built cli tests\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003eSELECT TASK\u003c/summary\u003e\n\n```bash\ntask=$(yq e '.tasks | keys' Taskfile.yaml | sed 's/^- //' | gum choose) \u0026\u0026 task ${task}\n```\n\n\u003c/details\u003e\n\n## USAGE\n\n### CREATE\n\ncreates things on github\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eREPOSITORY\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop create \\\n--kind repo \\\n--group stuttgart-things \\\n--repository machineshop2 \\\n--message \"test repository - machineshop\" \\\n--private true\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eBRANCH\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop create \\\n--kind branch \\\n--branch hello \\\n--repository machineshop \\\n--group stuttgart-things \\\n--files \"Dockerfile:Dockerfile\" \\\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003ePULL-REQUEST\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop create \\\n--kind pr \\\n--title test2 \\\n--branch hello \\\n--repository machineshop \\\n--group stuttgart-things \\\n--labels \"release,deploy\" # optional\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eLABELS (ON PULL-REQUEST)\u003c/b\u003e\u003c/summary\u003e\n\nall existing labels will be overwritten by the specified / to be upodated.\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop create \\\n--kind labels \\\n--group stuttgart-things \\\n--repository kaeffken \\\n--id 58 \\\n--labels app1,deploy\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eMERGE\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop create \\\n--kind merge \\\n--group stuttgart-things \\\n--repository stuttgart-things \\\n--message \"test\" \\\n--merge rebase \\\n--id 243\n```\n\n\u003c/details\u003e\n\n### RUN\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRUN\u003c/b\u003e\u003c/summary\u003e\n\n```bash\n# PROFILE FROM LOCAL\nsudo machineshop run \\\n--scripts golang \\\n--source local \\\n--profile run.yaml\n```\n\n```bash\n# DEFAULT PROFILE BY URL\nsudo machineshop run \\\n--scripts buildx,onefetch\n```\n\n\u003c/details\u003e\n\n### INSTALL\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eINSTALL\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nsudo machineshop install \\\n--profile machineShop/binaries.yaml \\\n--binaries \"sops,flux\"\n```\n\n\u003c/details\u003e\n\n### PUSH\n\npush things to targets\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eSET IPS TO CLUSTER (w/ CLUSTERBOOK)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop push \\\n--target=ips \\\n--destination=clusterbook.rke2.sthings-vsphere.labul.sva.de:443 \\\n--artifacts=\"10.31.103.9;10.31.103.10\" \\\n--assignee=app1\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eMINIO (BUCKET)\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport MINIO_ACCESS_KEY=sthings\nexport MINIO_SECRET_KEY=\u003cPASSWORD\u003e\nexport MINIO_ADDR=artifacts.automation.sthings-vsphere.labul.sva.de\nexport MINIO_SECURE=true\n\nmachineshop push \\\n--target minio \\\n--source pod.yaml \\\n--destination manifests:pod-example.yaml # \u003cBUCKET\u003e:\u003cOBECTNAME\u003e\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eMS TEAMS\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nWEBHOOK_URL=https://365sva.webhook...\n\nmachineshop push \\\n--target teams \\\n--source \"hello from machineshop cli\" \\\n--destination ${WEBHOOK_URL} \\\n--color blue\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eHOMERUN-DEMO\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nHOMERUN_URL=https://homerun.homerun-dev.sthings-vsphere.labul.sva.de/generic\n\nmachineshop push \\\n--destination ${HOMERUN_URL} \\\n--target homerun-demo \\\n--source profiles/homerun.yaml\n```\n\n\u003c/details\u003e\n\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eHOMERUN\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nHOMERUN_URL=https://homerun.homerun-dev.sthings-vsphere.labul.sva.de/generic\n\nmachineshop push \\\n--destination ${HOMERUN_URL} \\\n--target homerun \\\n--title \"hello\" \\\n--system shell \\\n--message \"test sdfsdfslkljh\" \\\n--tags \"shell;linux\" \\\n--author \"machineshop\" \\\n--severity \"INFO\"\n\nmachineshop push \\\n--destination ${HOMERUN_URL} \\\n--target homerun \\\n--title \"hello\" \\\n--system shell \\\n--message \"test sdfsdfslkljh\" \\\n--tags \"shell;linux\" \\\n--author \"machineshop\" \\\n--severity \"INFO\" \\\n--assignee \"patrick.hermann\" \\\n--assigneeUrl \"patrick.hermann@sva.de\"  \\\n--artifacts \"INFO\" \\\n--url \"https://github.com/stuttgart-things/stuttgart-things/actions/runs/10639438939\"\n```\n\n\u003c/details\u003e\n\n\n### RENDER\n\nrender things from templates from various input sources\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eEXAMPLE TEMPLATE\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\n---\nruns:\n  packagePublishHelmChart:\n    # FLAT VALUE\n    name: package-publish-{{ .chartName }}\n\n# LOOP OVER LIST\n{{ range .food }}\n- {{ . }}{{ end }}\n\n# RANDOM ELEMENT FROM EXISTING LIST\nfavoriteFood: {{ .RANDOMfood }}\ncpu: {{ .vmConfig_l_cpu }}\nram: {{ .vmConfig_m_ram }}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eEXAMPLE MULTIKEY-TEMPLATE\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\n---\ntemplate:\n  nfsCsi: |\n    apiVersion: kustomize.toolkit.fluxcd.io/v1\n    kind: Kustomization\n    metadata:\n      name: nfs-csi\n      namespace: {{ .namespace }}\n    spec:\n      interval: {{ .interval }}\n# ...\nlonghorn: |\n    apiVersion: kustomize.toolkit.fluxcd.io/v1\n    kind: Kustomization\n    metadata:\n      name: longhorn\n      namespace: {{ .namespace}}\n#...\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eEXAMPLE SOPS DECRYPTED (VALUES) FILE\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\nvm_ssh_user: ENC[AES256_GCM,data:2nlFCn5/qA==,iv:+AvMEg1RHFlBqRRNloXNTxTEaUvq1x1tNM4S2liE9is=,tag:2+DvYvHtNSSojg9N7yTKbQ==,type:str]\nvm_ssh_password: ENC[AES256_GCM,data:XGQ+GjNqnhA=,iv:UIO5+4vOiGWOlonBKF4wb0n2Pj9VBngieMfcBDmQdXM=,tag:O44ZDEE7nBtECPRxcQsSuw==,type:str]\nsops:\n    kms: []\n    gcp_kms: []\n    azure_kv: []\n    hc_vault: []\n    age:\n        - recipient: age1g438n4lx6h7x7u42q652e9ygzrkkwlul49e8zsmsrfmxm9k3tvcsykhff4\n          enc: |\n            -----BEGIN AGE ENCRYPTED FILE-----\n            YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAraTYrTExhMGV5Y1lYb0g5\n            OWswNUprbDdobTk0N0UyQUZiZmxRWS9wdkRjCmRZMWw3dE1VNjZ5M0xRaGp3NmQ1\n            UVFRQ0hhY3pRV0dmY2YyQ0lFRjFqSk0KLS0tIGdrY1FXYnJNYy8wVW5XcHZENkhV\n            VUxGV09pVllCYXU0dXhlZFdDWXBMRmsKs55x9DeiqsRjLSm+U+BVdsJ6dLeNqeSE\n            xJ/3GQpy/MmyARUzayTSOuzu8URemMaAh7FQbxTf8V7AnMM6Lv+sHQ==\n            -----END AGE ENCRYPTED FILE-----\n    lastmodified: \"2025-01-01T09:47:30Z\"\n    mac: ENC[AES256_GCM,data:Nlqp8wiKQbGTzP3UuPlNMp7rmyEcyiGQVsFushGtKpWOAiSudcvZEKPkdFGQz3KJQXVg7KCBK1RqYTo0ZIw6Fwr0cbIEwHFekVSnpEu5p2H0JVDtlpO+clkEZqNi/HVGnIF16cYpNGrnI74tD4DaaS4HAF04OcvAHHBAtmTQhuk=,iv:4q4KQWomb3PxQa8bTHrdNx+02aLeQ/P+RIpf8rifRrc=,tag:UgWmC56SbWe2KiG4IsaJ6A==,type:str]\n    pgp: []\n    unencrypted_suffix: _unencrypted\n    version: 3.8.1\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eEXAMPLE DEFAULTS FILE\u003c/b\u003e\u003c/summary\u003e\n\n```yaml\n---\nchartName: helloHelm\nfood:\n  - schnitzel\n  - apple\n  - hamburger\n\nvmConfig:\n  m:\n    cpu: 6\n    ram: 8192\n  l:\n    cpu: 8\n    ram: 10240\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eLOCAL\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop render \\\n--source local \\\n--template ../golang/machineshop/tests/template-square.yaml \\\n--brackets square \\\n--output stdout \\\n--defaults /home/sthings/projects/stuttgart-things/packer/environments/labul-pve.yaml\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eGIT\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop render --source git \\\n--git https://github.com/stuttgart-things/stuttgart-things.git \\\n--defaults packer/environments/labul-vsphere.yaml \\\n--template packer/os/ubuntu23-vsphere.pkr.tpl.hcl \\\n--output stdout\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRENDER FROM MULTIKEY YAML TEMPLATE\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop render \\\n--source local \\\n--template tests/infra.yaml \\\n--output stdout \\\n--kind multikey \\\n--key longhorn \\\n--defaults tests/default.yaml\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eRENDER w/ SECRETS FROM SOPS\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport SOPS_AGE_KEY=AGE-SECRET-KEY-1T22K05UTR...\n\nmachineshop render \\\n--source local \\\n--template tests/infra.yaml \\\n--output stdout \\\n--secrets secrets1.yaml\n```\n\n\u003c/details\u003e\n\n\n### DELETE\n\ndelete things on git(hub)\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eBRANCH\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop delete \\\n--kind branch \\\n--branch hello \\\n--repository stuttgart-things \\\n--group stuttgart-things\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eFILES\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport GITHUB_TOKEN=\u003cGITHUB_TOKEN\u003e\n\nmachineshop delete \\\n--kind files \\\n--branch main \\\n--repository stuttgart-things \\\n--group stuttgart-things \\\n--files \".github/workflows/lint-k8s-manifests.yaml\" \\\n--user patrick-hermann-sva\n```\n\n\u003c/details\u003e\n\n### GET\n\nget things from systems\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eGET IPS FROM CLUSTERBOOK\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop get \\\n--system=ips \\\n--destination=clusterbook.rke2.sthings-vsphere.labul.sva.de:443 \\\n--path=10.31.103 \\\n--output=2\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eVAULT-REQUIREMENT: VAULT APPROLE EXPORTS\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport VAULT_NAMESPACE=root\nexport VAULT_ROLE_ID=1d42d7e7-8c14-e5f9-801d-b3ecef416616\nexport VAULT_SECRET_ID=\u003cSECRET\u003e\nexport VAULT_ADDR=https://≤VAULT_ADDR\u003e[:8200]\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eSOPS-REQUIREMENT: AGE_KEY EXPORTS\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport SOPS_AGE_KEY=AGE-...\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eGET SOPS SECRET VALUE BY PATH\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nexport SOPS_AGE_KEY=AGE-SECRET-KEY-1T22K0..\nmachineshop get --system=sops --path=/home/sthings/projects/golang/sops/bla.yaml:password | tail -n +1\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eGET VAULT SECRET VALUE BY PATH\u003c/b\u003e\u003c/summary\u003e\n\n```bash\nmachineshop get --path apps/data/scr:password | tail -n +8\n\nmachineshop get --path apps/data/scr:password --output file --destination /tmp/password.txt\n\nmachineshop get --path kubeconfigs/data/dev21:kubeconfig --output file --destination /tmp/dev211 --b64 true\n```\n\n\u003c/details\u003e\n\n\n\n## LICENSE\n\n\u003cdetails\u003e\u003csummary\u003e\u003cb\u003eAPACHE 2.0\u003c/b\u003e\u003c/summary\u003e\n\nCopyright 2023 patrick hermann.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n\n\u003c/details\u003e\n\nAuthor Information\n------------------\nPatrick Hermann, stuttgart-things 05/2023\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuttgart-things%2Fmachineshop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstuttgart-things%2Fmachineshop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstuttgart-things%2Fmachineshop/lists"}