{"id":20135608,"url":"https://github.com/karurochori/klipper-deployer","last_synced_at":"2026-06-20T20:31:28.402Z","repository":{"id":231566110,"uuid":"782078617","full_name":"KaruroChori/klipper-deployer","owner":"KaruroChori","description":"Tools \u0026 scripts to deploy multiple klipper (and ecosystem) instances on the same node","archived":false,"fork":false,"pushed_at":"2024-11-24T10:23:01.000Z","size":101,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-06-08T16:04:21.254Z","etag":null,"topics":["3d-printing","automation","bun","klipper"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/KaruroChori.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":"2024-04-04T15:41:34.000Z","updated_at":"2024-11-24T10:23:04.000Z","dependencies_parsed_at":"2025-06-08T16:04:23.629Z","dependency_job_id":"8d92de54-eac6-4ba1-a09f-db2eb754f06f","html_url":"https://github.com/KaruroChori/klipper-deployer","commit_stats":null,"previous_names":["karurochori/klipper-deployer"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/KaruroChori/klipper-deployer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KaruroChori%2Fklipper-deployer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KaruroChori%2Fklipper-deployer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KaruroChori%2Fklipper-deployer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KaruroChori%2Fklipper-deployer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/KaruroChori","download_url":"https://codeload.github.com/KaruroChori/klipper-deployer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/KaruroChori%2Fklipper-deployer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34585195,"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-06-20T02:00:06.407Z","response_time":98,"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":["3d-printing","automation","bun","klipper"],"created_at":"2024-11-13T21:15:47.213Z","updated_at":"2026-06-20T20:31:28.370Z","avatar_url":"https://github.com/KaruroChori.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003e [!CAUTION]\n\u003e This software is now in beta, but it is still a work in progress.  \n\u003e Most of the documented features are now working, yet you should expect the cli interface and the configuration schema to be broken with new releases.\n\n# What is this?\n\nA command line tool which allows configuring multi-printer klipper hosts within the same system. You provide a configuration file (or use one of those distributed along this tool) and _klipper deployer_ does the rest.  \nIt is not just [klipper](https://www.klipper3d.org/) alone! You can also deploy [moonraker](https://moonraker.readthedocs.io/en/latest/), [fluidd](https://docs.fluidd.xyz/) and [mainsail](https://docs.mainsail.xyz/). It is also possible to apply patches to klipper and moonraker as part of the build process.\n\nThis tool is written in typescript, and should be fully portable between different architectures.\n\n## But why?\n\nI recently got a [wyse 3040](https://www.dell.com/support/manuals/de-de/wyse-3040-thin-client/3040_ug/system) to serve as a node on my network, and to handle multiple printers/cnc stuff.  \nIt is an atom-based thin-client, roughly the size of a raspberry pi; so, no surprise, it only comes with 2GB of RAM and 8GB of flash storage.  \nUsing one for each printer would just be very wasteful, but due to its limited specs, a docker-based solution like [portable-klipper](https://github.com/KaruroChori/portable-klipper) is not really feasible.\n\n## Don't we have KIAUH already?\n\nOn paper [kiauh](https://github.com/dw-0/kiauh) offers a more lightweight approach compared to a dockerized solution, but it would not work for several reasons:\n\n- There is no easy way to add multiple instances after the initial setup.\n- The base repositories for klipper and moonraker are fully cloned, leading to a significant waste of time and storage during the initial setup. Storage I just don't have on a Wyse 3040.\n- By default, it installs the same dependencies as they are specified on the original installation scripts. Still, there is no point in having all those toolchains if we only need to compile firmware for some architectures, or if that is offloaded to a different and more powerful machine.\n\nFor these reasons, I have been working on my own scripts to simplify the deployment process of klipper \u0026 friends on hardware with low-end specs.  \nA nice extra over a solution like _kiauh_ is how much more easily it can be integrated in automated processes, since it is all based on configuration files and few commands at best.\n\n# How to use it\n\nThis package provides a single executable `klipper-deployer` once installed on your system.  \nCalling it from your shell will display all the options available, but please read through this documentation before.\n\n## System Requirements\n\nBefore using it, you have to make sure your system fulfills some requirements:\n\n- [ ] Your system should be Debian 12. Other derived systems might work as well as long as packet names are the same.\n- [ ] The user you are running it from must be in your [sudoers file](https://askubuntu.com/questions/7477/how-can-i-add-a-user-as-a-new-sudoer-using-the-command-line).\n- [ ] Install [bun](https://github.com/oven-sh/bun) on the target machine (on linux `curl -fsSL https://bun.sh/install | bash` if you are not worried of piping bash). This script is written in typescript to keep my sanity.\n\nIn general, support for more systems will be added over time.\n\n## Initial installation\n\nThere are few ways to install this tool on your system. The easiest is to do it via bun.\n\n```\nbun install --global git://github.com/KaruroChori/klipper-deployer.git#beta-1.2\n```\n\nAfter that, you should be able to use `klipper-deployer` where you want.  \nGo to the directory you want to use to host klipper \u0026 everything related.\n\nYou now have two options: either you use one of the quick presets, or you perform the process manually.\n\n### Quick preset\n\nTyping `klipper-deployer presets` will give you a list of presets available.  \nSelect the one you want, and type `klipper-deployer preset name` to copy it as your config file.  \nCheck the [documentation]() too see which presets are shipped with your version of _klipper-deployer_.  \nPlease, notice that you might still have to add some of the missing information in configuration files automatically generated.\n\nYou can now type `klipper-deployer all` and have everything automatically installed and running (hopefully).  \nThis command is also available for fully custom configuration files, like shown in the next section.  \nYou should still check the supported commands in order to further apply changes to your current configuration.\n\nHere is the example of a typical configuration file:\n```json\n{\n  \"$schema\": \"https://raw.githubusercontent.com/KaruroChori/klipper-deployer/master/schemas/json/1.json\",\n  \"version\": 0,\n  \"install\": {\n    \"systemd\": \"/etc/systemd/system\",\n    \"user\": \"youruser\",\n    \"base\": \"/home/youruser/printers\"\n  },\n  \"services\": {\n    \"klipper\": {\n      \"enabled\": true,\n      \"arch\": [\"runtime\"],\n      \"repo\": \"https://github.com/DangerKlippers/danger-klipper\",\n      \"branch\": \"master\",\n      \"patches\": []\n    },\n    \"moonraker\": {\n      \"enabled\": true,\n      \"repo\": \"https://github.com/Arksine/moonraker\",\n      \"branch\": \"master\",\n      \"speedsup\": true\n    },\n    \"fluidd\": {\n      \"enabled\": true,\n      \"repo\": \"https://github.com/fluidd-core/fluidd\",\n      \"port\": 8000,\n      \"updatable\": true,\n      \"tag\": \"v1.30.6\"\n    }\n  },\n  \"instances\": {\n    \"0\": {\n      \"moonraker\": {\n        \"port\": 7125\n      }\n    }\n  }\n}\n```\n\n### Custom config\n\nFirst, start with\n\n```\nklipper-deployer init\n```\n\n\u003e [!TIP]\n\u003e In most cases you don't want separate independent configurations, but many instances within the same configuration.  \n\u003e Still, you can run this script on multiple folders to have independent configurations not sharing the same global services and venvs.  \n\u003e However, take care you are not introducing collisions in instance names by setting different prefixes in the config file.  \n\u003e Also, make sure that you specify different ports.\n\nAn initial config file will be generated if not already present, or the one you wrote will be expanded to express defaults for most of the additional field you did not write.  \nYou can manually inspect it in `/config/main.json`. The subcommand `edit-config` is a handy shortcut.  \nThere are few helpers like `add-instance` and `clean-instance \u003cid\u003e` to further edit it.\n\nOnce you are happy with your file, you can run these commands in sequence\n\n```\nklipper-deployer commit     #To save the current config file as current.\nklipper-deployer clone      #To clone all repos.\nklipper-deployer install    #To install all deps for your repos \u0026 generate venvs.\nklipper-deployer apply      #To add instances based on your configuration.\nklipper-deployer start      #To start all global and instance-based services.\n```\n\n## Customize the configuration\n\nTBW\n\n### Patches\n\nThere is a [collection](./docs/patches.md) of curated patches for both klipper and moonraker.  \nYou can specify which one you want as an array in the property `patches` while configuring the two services.\n\n### NFS share\n\nTBW\n\n### Custom toolchains\n\nTBW\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarurochori%2Fklipper-deployer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkarurochori%2Fklipper-deployer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkarurochori%2Fklipper-deployer/lists"}