Grid:Host, how to install

I’m using Duet Wifi with DWC 3.2.
I am wondering about Grid:Host.

As it’s possible to export directly to the Duet Web Controller? If so, I am wondering how to set up Kiri:Moto to send files directly to the printer via DWC?
I’m doing this with PrusaSlicer and it is working like a dream, giving all info about File progress, time left, layers etc. Now I would really like to get it to work with Kiri:Moto but have no idea how to do this.

It looks like DWC has the ability to accept files over http(s). As long as it’s setting the proper CORS http headers and it has an active https endpoint, Kiri should be able to send directly to it. Do you have a pointer to documentation that might enlighten me?

Getting this going should be pretty easy. It would be easier if I had access to a Duet Wifi :confused:

Found it @ … looks like there is a call

PUT /machine/file/{filename}
Upload a file. The file path is translated to a physical file path. The body payload is the file content.

Returns one of these HTTP status codes:

201: File created
500: Generic error
502: Incompatible DCS version
503: DCS is unavailable

I think it’s time for me to upgrade one of my printers to use a Duet2 Wifi. I need some experience with this thing.

I don’t have any documentation but as I frequently reading the Duet Forum I’ll take some time to search and hope I’ll find something for you.

Do so, you won’t regret it. In my case when I upgraded from Marlin I’ve never looked back.

It’s a huge upgrade concerning the DWC interface, the easy way to edit config-files and the interaction with slicers. You can find Duet Wifi clone and a PanelDue on Ali or Bangood for cheap to try out.

I am going to use a Duet Wifi in my upcoming CNC-router build, dedicated to guitar carving and I am looking forward to check out the CNC-section of Kiri:Moto.

I ordered one. Kiri will support sending to it as soon as it arrives.

Nice. If you need any help, hint or tips, please let me know. :slightly_smiling_face:

1 Like

I’m adding Duet support to GridHost now. DWC doesn’t have an easy way to enable https, and even if you could the self-signed certs would have to match DNS, etc, etc. Huge pain.

With GridHost, it’ll be a 5-line json config file and then your printer will just magically show up in Kiri:Moto as a target.

Grid:Host has been updated with a Duet driver. To enable it, just put this in your Grid:Host config.json. When you start it up, you will now see a “duet” target under Grid.Local in Kiri:Moto.

    "http-port": 8181,
    "targets": {
        "duet": {
            "comment": "duet 2 wifi",
            "driver": "duet",
            "host": "[ip-of-your-duet]",
            "port": 80


I’ll let you know how it goes.

Hmmm where do I find Grid:Host Json and can it be implemented on a mac in macOS?

when you git clone the repo, there is a etc/config.json.sample file you can use as a template. just create a file named etc/config.json with the text above. also, before starting it up run:

npm i



and it’s running

I used to program Assembler, Pascal, C, C++, VB and some java 20+ years ago. Now I’m on a Mac since a long time and haven’t touched programming for over 10 years. I gave it a try and copied the files from the folders in “” and get this:

throw err;

Error: Cannot find module ‘moment’
Require stack:

  • /usr/bin/grid-host
    at Function.Module._resolveFilename (node:internal/modules/cjs/loader:923:15)
    at Function.Module._load (node:internal/modules/cjs/loader:768:27)
    at Module.require (node:internal/modules/cjs/loader:995:19)
    at require (node:internal/modules/cjs/helpers:92:18)
    at Object. (/usr/bin/grid-host:8:16)
    at Module._compile (node:internal/modules/cjs/loader:1091:14)
    at Object.Module._extensions…js (node:internal/modules/cjs/loader:1120:10)
    at Module.load (node:internal/modules/cjs/loader:971:32)
    at Function.Module._load (node:internal/modules/cjs/loader:812:14)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12) {
    code: ‘MODULE_NOT_FOUND’,
    requireStack: [ ‘/usr/bin/grid-host’ ]

So I’ll stick to “the traditional way” downloading the .stl as I don’t feel comfortable in what I’m trying to accomplish with this. I’m rusty and don’t have the time to start all over again with programming.

I see. You grabbed the .zip instead of using git clone. If you are inside the unzipped directory and run

npm i

it will install moment into a sub-directory

npm is node’s distributed package management system.

but I feel ya on the new stuff. I also did Java for 20+ years. but made the transition to mostly JS about 6 years ago.

Now I’ve installed Homebrew, CLI and the node package.
I am on a Mac and have no clue about “bin/grid-host” that you mention above. When typing it in Terminal it gives “No such file or directory”

My grid-host clone landed in the documents folder. Should I manually move the repo to bin? And if so, which bin as there are two in MacOS, usr/bin and usr/local/bin?

Sometimes it gets more complicated than what it is. I started all over and and managed to get it (what I think is) in the right direction.

MacPro:grid-host lars$ bin/grid-host
210223.165057 ‘---------------------------------------------------------------’
210223.165057 { http: 8181, https: 8112, starting: ‘grid:host’ }
210223.165057 { org: ‘default’, register: ‘’ }
210223.165057 { activated: ‘duet’, type: ‘duet’ }
(node:3806) [DEP0109] DeprecationWarning: The provided URL http://[]:80/rr_model is not a valid URL, and is supported in the http module solely for compatibility.
(Use node --trace-deprecation ... to show where the warning was created)
throw er; // Unhandled ‘error’ event

Error: connect EHOSTDOWN - Local (
at internalConnect (node:net:909:16)
at defaultTriggerAsyncIdScope (node:internal/async_hooks:431:12)
at node:net:1000:9
at processTicksAndRejections (node:internal/process/task_queues:76:11)
Emitted ‘error’ event on ClientRequest instance at:
at Socket.socketErrorListener (node:_http_client:462:9)
at Socket.emit (node:events:378:20)
at emitErrorNT (node:internal/streams/destroy:188:8)
at emitErrorCloseNT (node:internal/streams/destroy:153:3)
at processTicksAndRejections (node:internal/process/task_queues:81:21) {
errno: -64,
code: ‘EHOSTDOWN’,
syscall: ‘connect’,
address: ‘’,
port: 80

So I found out that the 3D printer was not online as I’,m in a different place in the house so after turning it on I got this:

MacPro:grid-host lars$ bin/grid-host

210223.165502 ‘---------------------------------------------------------------’

210223.165502 { http: 8181, https: 8112, starting: ‘grid:host’ }

210223.165502 { org: ‘default’, register: ‘’ }

210223.165502 { activated: ‘duet’, type: ‘duet’ }

(node:3823) [DEP0109] DeprecationWarning: The provided URL http://[]:80/rr_model is not a valid URL, and is supported in the http module solely for compatibility.

(Use node --trace-deprecation ... to show where the warning was created)

And in Kiri:Moto

So I will now press the send button and see what happens through the http-interface then if I have to press the emergency button I have to run down two floors :smiley:

@Stout Aha… Sorry, but the [] are not meant to be included in the IP address.

I thought of that but as you had them there inside the exclamation marks I tried it out but later removed them. Now it says:

MacPro:grid-host lars$ bin/grid-host

210223.171031 ‘---------------------------------------------------------------’

210223.171031 { http: 8181, https: 8112, starting: ‘grid:host’ }

210223.171031 { org: ‘default’, register: ‘’ }

210223.171031 { activated: ‘duet’, type: ‘duet’ }

I haven’t tried it out yet but I found out that I have the local settings (of course) on my iMac in the cellar and it also has the duet local now so I will try it out in full in a moment.

I read somewhere that it is possible to have the same settings in Kiri:Moto on several computers. I have a bunch of computers all over the place but have to manually change settings on the computer I’m on at the moment. But I can’t find where I read it how to get one setting whatever computer I use.

Don’t bother.I found it in the “shared profiles” section in the documentation.