[00:00.000 --> 00:12.800] I've been involved with, wait, I'm Stuart Allen, here, can reach me that email address. [00:12.800 --> 00:18.840] I've been involved with open source since the early 90s, dabbled in Linux kernel development, [00:18.840 --> 00:23.560] but mostly my projects have been stand alone applications and libraries, been the technical [00:23.560 --> 00:28.480] founder of several companies over the last 30 years, and I've managed to thread open [00:28.480 --> 00:32.880] source work through those companies and got them to release pretty significant packages [00:32.880 --> 00:38.120] as open source internal works that have data processing libraries and things like that. [00:38.120 --> 00:44.520] And over the last 10 years, I've become increasingly enamored with the idea of not having to install [00:44.520 --> 00:48.320] software anymore, at least not on the desktop. [00:48.320 --> 00:52.120] So I'm going to walk you through a little bit of back story for that. [00:52.120 --> 00:57.200] I don't like slides, so most of this will actually be a live demo of different applications [00:57.200 --> 01:00.040] walking you through the functionality, but I will walk through just a little bit of the [01:00.040 --> 01:02.840] technology in the back story for that first before sort of hopping into this. [01:02.840 --> 01:11.400] So to be a bit of a high wire act, let's see here, bullet points, excellent. [01:11.400 --> 01:13.880] So this is just the rough order of things that I'm going to talk about. [01:13.880 --> 01:20.480] I'm not good at following directions, even when I've written them, maybe especially when [01:20.480 --> 01:21.680] I've written them. [01:21.680 --> 01:26.320] So I might wander a little bit, keep me on topic if I do ramble a little bit, or if I [01:26.320 --> 01:27.320] talk too quickly. [01:27.320 --> 01:28.320] Definitely let me know. [01:28.320 --> 01:33.160] I'm prone to do that, which is why I didn't have any espresso today, at least not told [01:33.160 --> 01:34.720] this is over. [01:34.720 --> 01:40.080] Okay, so on to a little bit of back story. [01:40.080 --> 01:46.440] All right, since we are talking about maker tools, I wanted to just have a slide about [01:46.440 --> 01:49.640] making, but not dwell on it too long. [01:49.640 --> 01:54.000] While I was organizing these slides, it always turns into something other than what you start [01:54.000 --> 01:55.000] out. [01:55.000 --> 01:57.960] I had an idea when I went to this, and then what came out of it was kind of different, [01:57.960 --> 02:03.480] but the exception of the demo parts. [02:03.480 --> 02:08.160] It occurred to me that the proliferation of really powerful and accessible tools has turned [02:08.160 --> 02:10.240] really everybody into makers. [02:10.240 --> 02:14.080] And this is historically anomalous, like we've had tools in the past, but the kind of tools [02:14.080 --> 02:17.120] we have now are really incredibly powerful. [02:17.120 --> 02:23.240] My starting point as a maker was in the 70s, my older brother purchased a TRS-80 model [02:23.240 --> 02:27.160] 3 and abandoned it, so it became mine. [02:27.160 --> 02:30.840] And from that point, I basically learned basic by typing in programs at a bike magazine, [02:30.840 --> 02:34.920] and so I was a touch typist by the time I was 10, because I was like this, trying to [02:34.920 --> 02:38.560] get programs in faster. [02:38.560 --> 02:43.880] And that terminal window was, for me, a portal into an entirely new universe, and I can't [02:43.880 --> 02:50.280] really overstate how profound that was for me at the time as I learned to code, exploring [02:50.280 --> 02:54.840] this whole new world that you could just sort of create on a fly in front of you, and like [02:54.840 --> 02:58.880] you had to use your imagination a little more than you do today, you know, with 3D and all [02:58.880 --> 03:00.840] the great stuff we have, and BR. [03:00.840 --> 03:03.560] So imagination can be a powerful thing. [03:03.560 --> 03:07.760] I've been giving away software since about the time that I learned to code. [03:07.760 --> 03:11.600] Back then we called it shareware, and we used bulletin boards to get our creations out of [03:11.600 --> 03:16.440] their nest at an incredibly slow rate, but they would make it around the world based [03:16.440 --> 03:20.040] on the letters and even checks that I got from around the world at the time. [03:20.040 --> 03:23.760] And unfortunately, I was like 12 when I did this, and I made up a company, and I put it [03:23.760 --> 03:26.640] on the software title screen, and people sent me checks written out to that company. [03:26.640 --> 03:29.080] They didn't exist, and I couldn't cash them. [03:29.080 --> 03:32.880] So lesson learned. [03:32.880 --> 03:35.040] Let's see, back to the point. [03:35.040 --> 03:39.760] The difference in time now in history is that we are all makers to some extent, from I would [03:39.760 --> 03:43.960] say the ridiculous to the profound, as I have here in a bullet point, and I would have said [03:43.960 --> 03:47.440] that before, chat, GPT, mid-journey, and all the other kind of stuff that's out there today, [03:47.440 --> 03:50.760] that just serves to underscore the point, right? [03:50.760 --> 03:56.320] We can all be creators in a way that has really not been possible before. [03:56.320 --> 03:58.920] I guess that's sort of a debate. [03:58.920 --> 03:59.920] Let's see. [03:59.920 --> 04:01.560] Did I miss a slide? [04:01.560 --> 04:03.560] No, I didn't. [04:03.560 --> 04:07.280] This is the first time I'm using this, and the first time I'm presenting in like five [04:07.280 --> 04:11.680] years, so bear with me as I sort of like find my footing. [04:11.680 --> 04:12.680] Okay. [04:12.680 --> 04:14.960] I don't actually read the bullet points. [04:14.960 --> 04:17.520] The things that I say are, these are just inspirational things. [04:17.520 --> 04:20.960] The things that I say are just related to that. [04:20.960 --> 04:22.680] Why are browsers called browsers? [04:22.680 --> 04:27.280] We haven't called PCs word processors since the 80s, and it has to do with where they [04:27.280 --> 04:28.280] came from. [04:28.280 --> 04:31.360] I'm sure that there are a lot of people here who could better tell the story and the history [04:31.360 --> 04:35.840] of browsers, how they came to be, and the motivations of the people behind them, but [04:35.840 --> 04:41.560] I think it's safe to say that the early creators were focused on document hyperlinking, sharing [04:41.560 --> 04:46.120] of knowledge, not progressive web apps, and the browser sandbox, which is where we are [04:46.120 --> 04:50.080] today, many decades later. [04:50.080 --> 04:53.600] The reason it took us so long to get here is because we did start off from a document-centric [04:53.600 --> 05:01.960] view of the web, and that outside of mostly closed self-referential sites like Wikipedia, [05:01.960 --> 05:06.280] I don't think that hyperlinking really is what it was envisioned to be. [05:06.280 --> 05:08.840] Link rot is sort of the order of the day. [05:08.840 --> 05:17.520] What has been far more successful is the evolution of the browser as an application platform. [05:17.520 --> 05:24.080] Okay, so this brings us to sort of the inherent and natural tensions of today. [05:24.080 --> 05:30.040] I've grown skeptical of the way that we distribute software, the software itself, pretty weary [05:30.040 --> 05:33.840] of uninstalling, reinstalling, cleaning up and organizing. [05:33.840 --> 05:36.800] Do you really know what's in the software that you're installing on your machine, what [05:36.800 --> 05:42.840] it contains, and to what extent should you have to worry at all about this, right? [05:42.840 --> 05:46.240] Containerization on the server side has not really delivered us from complexity, which [05:46.240 --> 05:50.440] is totally a topic for another day, but since we are talking about containerization, it's [05:50.440 --> 05:51.440] related. [05:51.440 --> 05:56.480] Decades on, there's still really no cross-platform application development environment that works [05:56.480 --> 05:57.480] really at cross-platforms. [05:57.480 --> 06:03.480] I spent way too much time in the Java world, mostly enterprise, but even their take on [06:03.480 --> 06:07.040] AWT and all the other things that came after that were pretty horrendous. [06:07.040 --> 06:10.040] The toolkits that you can use now and try to get cross-platforms, it really don't work. [06:10.040 --> 06:16.000] So the fact that, you know, mobile tablets, touch, new interfaces, uh, fully complicate [06:16.000 --> 06:22.240] the ability to create applications that run in multiple different formats, and the cloud [06:22.240 --> 06:27.640] has created more tensions around data privacy and questions of individual agency. [06:27.640 --> 06:31.800] So hopefully, let's see if I actually address this in the next slide, this brings us to [06:31.800 --> 06:32.800] progressive web apps. [06:32.800 --> 06:37.520] I don't know if you know, or if you've heard of this term, you know, HTML5 and CSS, progressive [06:37.520 --> 06:43.320] web apps are basically web pages that can be self-standing at the end of the day. [06:43.320 --> 06:46.640] If you add a manifest and some service workers, they'll cache their own data, they can be [06:46.640 --> 06:49.960] installed and run offline. [06:49.960 --> 06:55.880] And so this is why, my background has been in high-performance computing, embedded systems, [06:55.880 --> 06:59.680] but I've ended up on the other end of the spectrum building web-based applications. [06:59.680 --> 07:03.400] And so there are a lot of people who will question the performance of JavaScript, JavaScript [07:03.400 --> 07:04.400] in general, in the browser. [07:04.400 --> 07:06.360] I hope to address all of that. [07:06.360 --> 07:11.920] You know, my coding arc, as I said, started with basic, it went through C, TickleTK, Perl, [07:11.920 --> 07:17.720] other scripting languages, embedded systems, Java for a couple of decades, uh, a D2, D2 [07:17.720 --> 07:24.400] tour through Verilog, um, doing FPGAs and some of these real-time systems for quantum [07:24.400 --> 07:30.600] computers, actually, um, before landing on JavaScript, oddly, while doing a prototype [07:30.600 --> 07:34.720] in sort of like the late, or around 2010. [07:34.720 --> 07:40.320] Um, so over the years, I've spent way too much time struggling with cross-platform and [07:40.320 --> 07:44.720] UI issues, um, and I think that open-source progressive web apps are really a solution [07:44.720 --> 07:46.400] for a lot of these problems. [07:46.400 --> 07:55.640] So, um, let's see, they are deemed trusted because they're running in the browser sandbox, [07:55.640 --> 08:02.640] um, and I lost my place on that because I wrote way too many notes for this slide, and [08:02.640 --> 08:05.520] so give me a second while to find where I was. [08:05.520 --> 08:08.760] I'm going to skip this, and I'm going to spend more time on the demo. [08:08.760 --> 08:11.600] You don't want to hear me talk about this much more. [08:11.600 --> 08:19.440] I will say that Android and Chromium are friendlier platforms than iOS, um, Apple is not really [08:19.440 --> 08:22.640] keen on progressive web apps because they compete with the App Store. [08:22.640 --> 08:25.200] If you think about it, if you have really good progressive web apps that you can install [08:25.200 --> 08:28.880] off a web page and run them offline and have access to all the modern web standards like [08:28.880 --> 08:33.600] Web USB and Web Serial and, um, all these other things, you don't really need the App Store [08:33.600 --> 08:37.680] and App Frameworks as much, and so they've done a pretty good job of trying to hobble, [08:37.680 --> 08:42.760] uh, WebKit and enforce its use on iOS, you used to be able to run Chromium on iOS without [08:42.760 --> 08:46.480] WebKit and you had all these things and they thought, like, no, for security reasons we [08:46.480 --> 08:47.480] can't do that. [08:47.480 --> 08:52.120] Well, um, not really a case, but it does serve the purpose of enforcing the sort of the App [08:52.120 --> 08:53.120] Store hegemony. [08:53.120 --> 08:58.920] Um, all right, so all the apps I'm going to be presenting today are single page progressive [08:58.920 --> 09:03.720] web apps, installable, runable offline, fully open source, MIT license, it's been around [09:03.720 --> 09:08.600] for quite a while in some cases. [09:08.600 --> 09:11.800] I'm not sure if I'm going to spend a ton of time on this, just, this is the pros and [09:11.800 --> 09:13.720] cons sort of as I see it. [09:13.720 --> 09:17.080] For me, faster development time is the thing that I care the most about. [09:17.080 --> 09:23.960] Um, it is basically a page load away from testing new code, which is a sub-second process, [09:23.960 --> 09:26.400] uh, for the most part, as you'll see. [09:26.400 --> 09:31.320] Um, I spent a year one day trying to add a small feature to an open source popular Python [09:31.320 --> 09:37.120] package, and the, uh, the dev test restart process took three minutes, and I was like, [09:37.120 --> 09:38.120] this is, this is insane. [09:38.120 --> 09:41.720] Like, I basically modify code, I hit reload, and I'm testing it immediately. [09:41.720 --> 09:48.440] Um, developer tools, especially Chromium are shockingly good, um, I'm just going to leave [09:48.440 --> 09:50.440] it at that for right now. [09:50.440 --> 09:55.640] All right, so before, this is setting up or teeing up the first application that I'm [09:55.640 --> 09:56.640] going to show you. [09:56.640 --> 10:01.480] Um, so I promise I'm almost to the demo. [10:01.480 --> 10:09.200] Um, a lot of my early making was in CNC, solid modeling, electronics, robotics, and things [10:09.200 --> 10:12.200] like that, autonomous vehicles, sorry. [10:12.200 --> 10:17.880] Um, and then around 2012, I started getting heavily involved in 3D printing, and you'll [10:17.880 --> 10:20.320] see a couple of my early projects here. [10:20.320 --> 10:24.880] Slicers of the day were painfully slow, um, they produced output that was suboptimal for [10:24.880 --> 10:27.040] the things that I was trying to make. [10:27.040 --> 10:31.400] Um, and the strength that I wanted, and I was working on engineer materials, scaled sort [10:31.400 --> 10:38.080] of like Lego-like things like this, and, um, I was like, I've been coding for a long time, [10:38.080 --> 10:40.880] how hard could it be to write a better slicer, right? [10:40.880 --> 10:45.000] I sort of like the genesis of why things like this is annoying me, how hard could it be to [10:45.000 --> 10:46.400] make a better one? [10:46.400 --> 10:49.800] Um, and so, you know, I started to build a prototype, and in a couple of weeks, I had [10:49.800 --> 10:54.120] basically a slicer that did everything that I needed to do, which was good for me, and [10:54.120 --> 10:57.880] that was 10 years ago, so you know you're never done with these things. [10:57.880 --> 11:02.440] But just to give you an example, a single cube or block out of this with the slicers [11:02.440 --> 11:09.440] of the time would take 20 minutes to make one of those cubes, and I was doing scaled [11:09.440 --> 11:11.720] up large, large scale models. [11:11.720 --> 11:15.560] My slicer would produce the same part, the output that would produce the same part in [11:15.560 --> 11:21.400] 11 minutes, and the part used less material and was more mechanically, was stronger, would [11:21.400 --> 11:25.480] bear more load, and did a lot of things that I wanted, so I was like already success sort [11:25.480 --> 11:28.920] of like two weeks in, again, this was 10 years ago. [11:28.920 --> 11:34.760] Slicers have come a long way since then, and I'm not sure how much I want to get into that, [11:34.760 --> 11:45.200] but again, let's see, I'm going to skip the next slide, wait, this, then this, I have this [11:45.200 --> 11:48.880] dual screen setup, it's hard to know what's going on here because this is not totally [11:48.880 --> 11:50.880] in sync with that. [11:50.880 --> 11:55.480] One timeline of some of the tools I've been building since then, Kirimoto, which is a [11:55.480 --> 12:01.240] multimodal application that runs in the browser, does FDM slicing for 3D printing, does CAM, [12:01.240 --> 12:06.440] does laser, does MSLA, which is for resin printing, does drag knives, that's part of [12:06.440 --> 12:10.840] laser, so basically it's an all-in-one maker tool for most of the things that you would [12:10.840 --> 12:15.600] have commonly used in your maker space. [12:15.600 --> 12:18.920] Because I was doing a lot of large scale printing, I ended up designing and building [12:18.920 --> 12:25.040] my own printer for my printer farm, which is also open source, open design, I ended [12:25.040 --> 12:30.560] up writing my own G-code center for that, and a whole bunch of other things. [12:30.560 --> 12:35.560] And then around 2015, when non-shape came along, so my CAD program of preference was [12:35.560 --> 12:42.120] SOLIDWORKS for 15 years, and those guys left and started on-shape, and just a little bit [12:42.120 --> 12:45.920] back story there, SOLIDWORKS promised since the very first day they came out that they [12:45.920 --> 12:50.640] would eventually have a Mac version of their software, and they didn't deliver on that [12:50.640 --> 12:56.520] after 15 years, so the guys left, created on-shape, and now it runs on a Mac, in a browser, and [12:56.520 --> 12:57.440] is better. [12:57.440 --> 13:02.520] So they opened an app store, and I was like, this is perfect, I could integrate Kirimoto [13:02.520 --> 13:09.080] into on-shape accessor APIs and have a connection between CAD and CAM in one thing. [13:09.080 --> 13:15.280] And I did that, got accessor APIs and integrated it in 24 hours, and the next day they called [13:15.280 --> 13:18.400] me and they're like, hey, that was awesome, we've never seen anybody integrate in less [13:18.400 --> 13:23.120] than 30 days, do you think you want to do a CAM package? [13:23.120 --> 13:29.560] And I was like, huh, 3D printing, CAM, additive, subtractive. [13:29.560 --> 13:32.960] It's interesting, I did it for a long time, how hard could that be? [13:32.960 --> 13:38.960] So I ended up adding CAM in 2016, again, had a prototype working in about two weeks, and [13:38.960 --> 13:42.880] here we are six years later, and we're really just getting into the interesting stuff on [13:42.880 --> 13:44.880] that package. [13:44.880 --> 13:49.320] So this is the interface for different modes of Kirimoto. [13:49.320 --> 13:54.600] This is the GitHub repository, and I'm going to jump into a demo of this. [13:54.600 --> 13:56.600] Application is called Kirimoto. [13:56.600 --> 14:00.320] Most people call it Kiri or KM when you're typing it out. [14:00.320 --> 14:03.480] The back story on that is that when I was building this, I was building two applications [14:03.480 --> 14:04.920] at the same time. [14:04.920 --> 14:08.480] One was the slicer, and the other one was actually a modeling program. [14:08.480 --> 14:14.120] I wanted to do CAD modeling in the browser, and again none of the other tools really existed [14:14.120 --> 14:15.120] at that time. [14:15.120 --> 14:19.680] This was 2012-ish, and I started to build a block modeler that was sort of a combination [14:19.680 --> 14:24.840] of Minecraft and blocks that you could skin things and connect them, and you could create [14:24.840 --> 14:26.040] blocks to create blocks. [14:26.040 --> 14:31.680] So I called it Metamoto, but this ended up taking all of my time, and I never got a chance [14:31.680 --> 14:32.680] to really finish that. [14:32.680 --> 14:33.920] I ban in it. [14:33.920 --> 14:37.680] But now I have the tools to actually maybe go back and finish that if I have time, which [14:37.680 --> 14:40.960] is doubtful, it seems like. [14:40.960 --> 14:47.880] Okay, the app flow, this is a really short and quick slide, all with different modes [14:47.880 --> 14:50.240] have the same workflow. [14:50.240 --> 14:57.520] Whether you're an FEM cam laser or MSLA, you basically have your arranging it on a workspace. [14:57.520 --> 15:01.320] You're doing a slicing pass, and the slicing pass is the crude pass that basically just [15:01.320 --> 15:03.400] says, I'm deconstructing geometry. [15:03.400 --> 15:08.480] I'm creating the rough paths that I'm going to be following, but I'm not doing things [15:08.480 --> 15:10.440] like path routing and other complex stuff. [15:10.440 --> 15:16.920] That's the prepare step, which basically takes the raw slices and then does path routing. [15:16.920 --> 15:21.640] And path routing in the 3D world for 3D printing and CNC and laser are all different, which [15:21.640 --> 15:23.400] is why it's abstracted out. [15:23.400 --> 15:26.600] And each of them has their own different views, and you can do different things in different [15:26.600 --> 15:27.600] views based on that. [15:27.600 --> 15:30.560] And then the last pass is basically exporting to your device target. [15:30.560 --> 15:37.080] I'm going to export G code or an SVG or, in the case of MSLA printers, massively large [15:37.080 --> 15:40.600] binaries for no reason. [15:40.600 --> 15:44.320] Yeah, all right. [15:44.320 --> 15:47.160] Let's see if there's something I missed here, didn't miss here. [15:47.160 --> 15:52.360] All right, the code structure, again, this is all running in the browser, 100%, JavaScript [15:52.360 --> 15:56.440] unless I say otherwise, and I will denote when that happens. [15:56.440 --> 16:01.200] There is a little bit of WebAssembly in there, and I plan to add more WebAssembly in the future [16:01.200 --> 16:04.320] as to accelerate things. [16:04.320 --> 16:10.160] The major libraries that I'm using are 3JS for the 3D, Clipper for polygon offsetting, [16:10.160 --> 16:17.280] and very recently I added Manifold for a 3D Boolean engine. [16:17.280 --> 16:22.520] It's used in one small place, but in the future I probably want to use it in other places. [16:22.520 --> 16:25.160] It's actually an incredible library. [16:25.160 --> 16:29.440] Storage on the right, these different blue boxes are different workers, different thread [16:29.440 --> 16:32.080] contexts, so you've got the UI context. [16:32.080 --> 16:35.680] And then all the work is done in workers to keep the UI responsive while all the heavy [16:35.680 --> 16:37.400] lifting is happening. [16:37.400 --> 16:41.400] There's no lateral communication between the workers. [16:41.400 --> 16:43.800] It's all hierarchical, top down. [16:43.800 --> 16:44.800] There's a reason for that. [16:44.800 --> 16:49.160] I don't know if I have enough time to actually really talk about it today, but denoted each [16:49.160 --> 16:55.040] of the boxes or the languages that are being used, languages and or libraries. [16:55.040 --> 16:59.480] All right, and I'll just hope to remember to show you all that stuff in the demo. [16:59.480 --> 17:04.000] So I'm going to hop into the demo now, start with Kirimoto, show you different parts of [17:04.000 --> 17:13.960] that integration with Onshape, and now I have to switch up the UI interface or rather the [17:13.960 --> 17:14.960] this thing here. [17:14.960 --> 17:21.160] I have to go to mirror display so you guys can see what's happening. [17:21.160 --> 17:23.160] Great. [17:23.160 --> 17:37.520] Now I have to go find my browser, let's just do it here. [17:37.520 --> 17:44.240] All right, this is not good. [17:44.240 --> 17:46.680] That's better. [17:46.680 --> 17:50.960] I am running this live on the network here which is found to be spotty sometimes during [17:50.960 --> 17:54.760] the day-to-day, sometimes it's great, sometimes it gets a little bit of trouble. [17:54.760 --> 17:58.600] So right off the good space you can launch these applications directly. [17:58.600 --> 18:01.760] Because it's running in the browser, actually hold on a second, I need to get my, because [18:01.760 --> 18:05.320] I no longer have speaker notes, I'm going to use my phone. [18:05.320 --> 18:11.280] That way hopefully I won't forget major important things to discuss. [18:11.280 --> 18:18.720] All right, you can launch these things directly from here. [18:18.720 --> 18:23.360] This allows you to launch any of the major modes or just hop right into the application [18:23.360 --> 18:25.560] by clicking on it there. [18:25.560 --> 18:26.560] And there you go. [18:26.560 --> 18:28.680] The whole thing is loaded. [18:28.680 --> 18:34.760] The footprint of this is under four megabytes compressed and usually loads in under a second [18:34.760 --> 18:39.960] with a cold cache, maybe about two and a half seconds to load the entire application with [18:39.960 --> 18:42.800] all the different modes and everything else that's in it. [18:42.800 --> 18:47.520] So it's quite small in terms of footprint for the code. [18:47.520 --> 18:51.560] More slicers, if you go to download and install them, are going to be in the two to 500 megabyte [18:51.560 --> 18:59.120] range for the same, for the similar code size, for similar functionality. [18:59.120 --> 19:03.320] And I'm going to bring up on the right-hand side really quickly just to show you what's [19:03.320 --> 19:07.960] going on under the hood. [19:07.960 --> 19:10.560] On the right-hand side, I don't know if you ever brought these up, you can look at the [19:10.560 --> 19:15.200] different threads or thread contexts that are down here and the interface, you can turn [19:15.200 --> 19:19.880] on and off threading, which will start and stop the workers on the right-hand side, which [19:19.880 --> 19:22.360] sort of eludes the previous slide that I showed you. [19:22.360 --> 19:25.960] So these are the distributed workers that will be doing all the heavy lifting sort of [19:25.960 --> 19:27.280] behind the scenes. [19:27.280 --> 19:33.160] And you can turn it on or off because some browsers, like Safari, don't allow you to [19:33.160 --> 19:37.880] do nested workers, they have to only work in a flat space, it's just one of the most [19:37.880 --> 19:41.440] of the web standards they refuse to support properly. [19:41.440 --> 19:47.480] And so it'll still work that way, it's just going to be slower. [19:47.480 --> 19:55.640] All right, typical slicer interfaces, the original interface for QerMoto was very much [19:55.640 --> 20:00.760] like the slicers that you see today, Cura and Prusa and all that kind of stuff with [20:00.760 --> 20:04.280] essentially a tree of a thousand parameters. [20:04.280 --> 20:09.320] This interface is slightly more opinionated and cut down. [20:09.320 --> 20:16.080] And so you'll see that you've got a lot fewer parameters for your model. [20:16.080 --> 20:18.000] But that's not really a problem. [20:18.000 --> 20:23.840] I would say that most parameters and most slicers are designed to help you deal with [20:23.840 --> 20:26.360] crappy 3D printers. [20:26.360 --> 20:31.800] And it makes sense because most 3D printers are crap, to be honest. [20:31.800 --> 20:35.200] And they don't have good software or they don't have good hardware or they don't have [20:35.200 --> 20:36.200] both. [20:36.200 --> 20:40.080] So there's a lot of stuff that you can fix in software with a crappy 3D printer, even [20:40.080 --> 20:42.000] if your firmware is junk. [20:42.000 --> 20:45.000] And a lot of printers actually are capable of running better firmware than they are delivered [20:45.000 --> 20:46.680] to you with. [20:46.680 --> 20:52.960] And it's just beyond most users to change out the firmware for a custom one and tune [20:52.960 --> 20:54.680] it the way it needs to be tuned. [20:54.680 --> 20:57.360] And so a lot of that stuff gets pushed into the slicer. [20:57.360 --> 21:01.160] And so the slicers will give you a thousand parameters, thousand parameters, 900 of those [21:01.160 --> 21:02.640] work against each other. [21:02.640 --> 21:08.280] And so slicer profiles become a religion where it's all about, oh, mine works perfectly, [21:08.280 --> 21:09.680] tweak a few things, something breaks. [21:09.680 --> 21:14.080] And so you're like, you can't correlate why this thing is breaking this other thing. [21:14.080 --> 21:18.360] Because this whole project is just me, I'm forced to be basically really brutal about [21:18.360 --> 21:21.040] what is in and what is out. [21:21.040 --> 21:24.360] And I'm doing heuristics for 99% of the stuff that's out there. [21:24.360 --> 21:27.840] Like, it's going to work for most cases. [21:27.840 --> 21:33.200] And under the hood, in the engine, or all the parameters that would be in other slicers, [21:33.200 --> 21:36.000] I'm just not exposing them to you. [21:36.000 --> 21:38.800] Because I don't really believe that's helpful. [21:38.800 --> 21:42.760] And again, if you run into a corner case where you just can't do the thing you want [21:42.760 --> 21:49.080] to do with your favorite parameter, just go use the other slicer or commit some code. [21:49.080 --> 21:54.000] Because this is open source, it's all on GitHub and has been for a long time. [21:54.000 --> 22:00.120] Let's see, there is, before I actually get into really demoing this, I wanted to show [22:00.120 --> 22:01.120] another thing. [22:01.120 --> 22:05.800] Because this is running in the browser, this is used pretty widely in not just in 3D printing [22:05.800 --> 22:08.720] but CAM and everything else in a lot of classrooms. [22:08.720 --> 22:11.560] Because it is one of the only pieces of software that runs on Chromebooks, it doesn't have [22:11.560 --> 22:12.720] to be installed. [22:12.720 --> 22:15.520] You can basically run it in classroom, Google Classroom, and other places. [22:15.520 --> 22:17.960] You can configure everything on the URL. [22:17.960 --> 22:21.960] So you can create profiles and put a bookmark somewhere and somebody can click on it and [22:21.960 --> 22:22.960] it'll open up the profile. [22:22.960 --> 22:26.920] And it'll be pre-loaded with everything that the student needs for that class. [22:26.920 --> 22:32.520] The device profiles, even loading up objects into your workspace. [22:32.520 --> 22:33.840] So it's pretty easy to do that kind of stuff. [22:33.840 --> 22:37.920] And the fact that you can basically export your workspace, open a private browsing tab, [22:37.920 --> 22:38.920] import it. [22:38.920 --> 22:42.800] You can use this as a way of getting your data around from browser to browser. [22:42.800 --> 22:45.760] Or again, for testing and debugging. [22:45.760 --> 22:50.040] People send me workspaces all the time, I open a private browsing tab, I import it, [22:50.040 --> 22:57.280] I replicate whatever their problem is immediately, and I'm able to fix it right away. [22:57.280 --> 22:59.440] So from this interface, usually it comes up like this. [22:59.440 --> 23:04.160] You can click on the docs grid space, it'll take you to this page here where it shows [23:04.160 --> 23:08.760] you everything about different ways you can do shared profiles, which I just alluded to, [23:08.760 --> 23:15.000] GCO macros, and different ways to embed or otherwise use the API for this. [23:15.000 --> 23:23.320] So to show you a quick, let's just open up something which is sort of like your basic [23:23.320 --> 23:26.080] 3D printing thing here, the Benchy. [23:26.080 --> 23:30.640] If anybody's done any 3D printing here, in the slice mode, you go in here and you're [23:30.640 --> 23:37.280] going to have the ability to look at different slices, ranges of slices like this. [23:37.280 --> 23:40.840] And the reason that there are two different modes, most slicers will basically take you [23:40.840 --> 23:45.920] right to the path-routed version of a sliced object. [23:45.920 --> 23:50.820] The reason I put you in here first is because you might want to modify parameters for ranges. [23:50.820 --> 23:55.800] So in this case, I could just say I'm going to turn off the infill for that bottom part, [23:55.800 --> 23:59.080] and then I have a range here that shows me that I've done that here and I've overridden [23:59.080 --> 24:00.080] the fill amount. [24:00.080 --> 24:03.580] And if I reslice that and go look at this the bottom up, you'll see that there's no [24:03.580 --> 24:07.680] infill down here, and then all of a sudden it switches to the normal view there, and [24:07.680 --> 24:12.680] then you can go and look at the preview, and this will show you the path-routing, path-routing [24:12.680 --> 24:17.680] in view involves also determining the speed at which those layers or portions of layers [24:17.680 --> 24:21.600] are going to be printed, and you can turn things on and off like moves. [24:21.600 --> 24:29.160] So you can look at the moves, I realize that aspect ratio is a little funky maybe here. [24:29.160 --> 24:34.840] Typical stuff that you would see in a slicer, nothing really amazing there. [24:34.840 --> 24:37.800] What is a little bit more interesting about Qimoto, and this isn't really specific to [24:37.800 --> 24:43.880] 3D printing, and I'll get to this more later, is you can go in and change the version on [24:43.880 --> 24:51.560] the fly because I'm hosting the last 10 versions of the software, I'm working on the beta channel, [24:51.560 --> 24:55.920] I'm pushing out software two to five times a week depending on how active development [24:55.920 --> 25:02.080] is going with major releases about every four to six weeks. [25:02.080 --> 25:06.160] And so if there's a bug in the current release, you can go just switch to the previous one, [25:06.160 --> 25:09.320] your workspace will be preserved, and it will bring you back into the same workspace that [25:09.320 --> 25:12.840] you were in before with all of your data and all of your everything. [25:12.840 --> 25:16.520] All of the stuff is persisted live in the browser, so again everything is just like reload [25:16.520 --> 25:24.840] the page, and you're back where you were before, screwed something up, reload the page. [25:24.840 --> 25:30.680] So there are three ways to import and export files really quickly, you can just drag and [25:30.680 --> 25:34.360] drop stuff into the browser. [25:34.360 --> 25:38.160] There are different formats you can support, so like in this case I can just drag in this [25:38.160 --> 25:41.960] file here which is something that some users really love to use as a benchmark because [25:41.960 --> 25:46.440] it's got about a million polygons, and it slices pretty fast. [25:46.440 --> 25:52.760] There are some users of the program who really helped me with performance because they care [25:52.760 --> 25:57.240] a lot about it, and have benchmark carry against Cura and Prusa and a bunch of other kind of [25:57.240 --> 25:58.520] stuff like that. [25:58.520 --> 26:05.600] And million polygons slicing this thing at the end of the day is about as fast as Cura [26:05.600 --> 26:10.560] was, at least last year, that was the last time we looked at this, fairly well-optimized. [26:10.560 --> 26:16.080] And again, this is pure JavaScript, there's no WebAssembly or anything else happening here [26:16.080 --> 26:20.120] under the covers. [26:20.120 --> 26:25.080] What else was I going to show you here, I'm not sure how important that is, but anyway [26:25.080 --> 26:29.600] the version switching is nice, and then there's a pluggable language, if anybody wants to [26:29.600 --> 26:34.520] contribute languages, it's pretty easy to plug in a new language into the interface, and [26:34.520 --> 26:37.480] again you just reload the page, and you've got another language with the same interface [26:37.480 --> 26:39.240] that you had before. [26:39.240 --> 26:44.840] And here we can go through, look through this, look through anything else. [26:44.840 --> 26:49.640] So typical stuff there, interesting thing to note about this is that once you've sliced [26:49.640 --> 26:57.760] this thing, we're now looking at about 25 or 30 million polygons in WebGL, and it's still [26:57.760 --> 27:01.640] fairly responsive, I mean it's not as fast as I'd like it to be. [27:01.640 --> 27:06.160] So future work is actually writing custom shaders, which I think would help with this. [27:06.160 --> 27:11.040] This is not a case where you can basically de-res or hide stuff on the fly, because if [27:11.040 --> 27:14.800] somebody goes in to look at the interior of this object, you can't just hide and then [27:14.800 --> 27:15.800] show that thing. [27:15.800 --> 27:18.800] There's always a possibility that interior features are going to be shown through the [27:18.800 --> 27:20.080] shell, so you can't hide them. [27:20.080 --> 27:25.480] There's no, everything that's in this, every path that's in this thing has to be shown [27:25.480 --> 27:26.480] at all times. [27:26.480 --> 27:32.720] And so this is an area where I would, if there were graphics experts, this is not my field, [27:32.720 --> 27:36.800] would love to have some feedback on this at some point. [27:36.800 --> 27:38.760] And then you can just export the code. [27:38.760 --> 27:46.360] A nice thing about this is that Qmodo also has a gcode, and again I'm not sticking to [27:46.360 --> 27:51.240] my script here, there's the things I want to talk about, but you can export the gcode [27:51.240 --> 27:55.360] and then once you've done that, download the gcode. [27:55.360 --> 27:57.200] You can also send directly to printers. [27:57.200 --> 28:02.320] I have a spooling agent that allows you to print, to send directly from Qmodo in the [28:02.320 --> 28:04.440] browser to Octoprint. [28:04.440 --> 28:08.800] So if you like use Octoprint as a back end, there's a way to send directly from the browser [28:08.800 --> 28:10.960] to your printer. [28:10.960 --> 28:15.560] And that's fairly well documented, and I have other ways of doing that for some of my own [28:15.560 --> 28:16.560] printers. [28:16.560 --> 28:17.560] Download the gcode. [28:17.560 --> 28:22.840] Qmodo also has a gcode renderer built in, so if you get some rando gcode and you want [28:22.840 --> 28:33.160] to bring that in, you can actually bring in the gcode back in, oops, let's find the downloads [28:33.160 --> 28:34.160] and bring that back in. [28:34.160 --> 28:36.320] And it will re-render the gcode. [28:36.320 --> 28:44.480] This works in all modes, so Qmodo will render gcode from CNC, laser, FDM. [28:44.480 --> 28:51.120] And so I'll get into it in the CNC section, I'll show you that as well. [28:51.120 --> 28:53.880] And then there's exporting and sharing of workspaces. [28:53.880 --> 29:03.560] So for example, I go into a private browsing session. [29:03.560 --> 29:08.720] And the internet's great, let's try it again, great, private browsing. [29:08.720 --> 29:16.080] I can import something like a CNC job. [29:16.080 --> 29:19.520] And it will switch modes, bring it in, tell me, give me a screenshot of when a workspace [29:19.520 --> 29:22.240] was created, and then bring everything in with it. [29:22.240 --> 29:26.680] So this is an example of the fourth-axis lathe work that's happening right now in the cam [29:26.680 --> 29:28.600] mode. [29:28.600 --> 29:32.680] This isn't fully baked yet, but it's the next thing that's coming out with the next release, [29:32.680 --> 29:37.080] which is fourth-axis CNC was the thing I added in the last release, and this just sort of [29:37.080 --> 29:42.240] gives you the ability to do some fun stuff like this. [29:42.240 --> 29:51.280] But that's just showing you importing, exporting, and sharing of workspaces. [29:51.280 --> 29:58.320] Cam mode, let's just hop into cam mode real fast, CNC mode. [29:58.320 --> 30:03.360] So you'll notice when you change modes, your device list changes, and the platform changes. [30:03.360 --> 30:07.360] It's adapting on the fly to whatever the new mode is that we're working on. [30:07.360 --> 30:11.120] I got this new CNC mill, make our car vera, and it got rid of all my other mills because [30:11.120 --> 30:13.800] it does everything that I need. [30:13.800 --> 30:16.880] And so that actually leads to another project that I've been working on. [30:16.880 --> 30:20.880] I'm going to bring in a workspace for that. [30:20.880 --> 30:26.740] This workspace that somebody sent me, they're like, hey, I have a problem with some anomalous [30:26.740 --> 30:28.040] cuts happening here. [30:28.040 --> 30:30.840] So in CNC mode, you get a new bar at the bottom. [30:30.840 --> 30:34.720] These are reorderable operations because CNC is a set of operations. [30:34.720 --> 30:38.840] Each operation may or may not use a different end mill, and then you can hover over each [30:38.840 --> 30:46.200] one and change the settings for those, and you can enable and disable them like that. [30:46.200 --> 30:49.440] And I'm just going to go ahead and slice through this and give you an idea of what the slice [30:49.440 --> 30:50.440] view looks like. [30:50.440 --> 30:56.080] I can turn on and off the different operations to look at what they're doing, or I can go [30:56.080 --> 30:57.960] through them like this. [30:57.960 --> 30:59.320] But this doesn't involve the routing. [30:59.320 --> 31:01.800] This is just, again, the pure slices. [31:01.800 --> 31:02.800] We go to preview this. [31:02.800 --> 31:07.200] It's going to show us the path routing that's a little aggressive on the hover. [31:07.200 --> 31:10.360] But once you've done this, we can go to an animation mode. [31:10.360 --> 31:14.960] And now this is the first time we're doing something actually pretty interesting, where [31:14.960 --> 31:21.800] on the back end, there is a shared array buffer, which is a relatively new technology in the [31:21.800 --> 31:22.800] web standards. [31:22.800 --> 31:25.880] This shared array is like a shared memory, but having shared memory and JavaScript is [31:25.880 --> 31:26.880] cool. [31:26.880 --> 31:27.880] This is a new thing. [31:27.880 --> 31:29.720] There's access to one shared pool of memory. [31:29.720 --> 31:31.840] They're all rendering into it simultaneously. [31:31.840 --> 31:36.880] And the front end 3JS engine is rendering the same buffer that's being rendered into [31:36.880 --> 31:39.040] by the workers on the back end. [31:39.040 --> 31:43.680] So I can go through and I can run this animation, and I can speed this animation up. [31:43.680 --> 31:54.880] And so all of this is actually happening in real time by the workers on the back end. [31:54.880 --> 31:59.120] And I got this workspace that says, I have this anomalous cut right here. [31:59.120 --> 32:00.120] What's that all about? [32:00.120 --> 32:07.040] Well, I'm not going to walk you through the great details, but they had one thing incorrectly [32:07.040 --> 32:08.880] set in one of the settings. [32:08.880 --> 32:17.480] I figured that out, sent it back to them with the correct settings, and they're off the, [32:17.480 --> 32:19.960] you know, it wasn't a bug this time. [32:19.960 --> 32:21.320] Oops. [32:21.320 --> 32:26.480] It looks like, you know, that's fortunate. [32:26.480 --> 32:28.280] My hand touched my phone. [32:28.280 --> 32:29.280] All the notes disappeared. [32:29.280 --> 32:32.160] It looked like I deleted them magically, but it didn't. [32:32.160 --> 32:34.840] It just created a new note that was empty. [32:34.840 --> 32:36.000] Okay. [32:36.000 --> 32:40.800] So here, this is a fixed workspace. [32:40.800 --> 32:41.800] Let's see. [32:41.800 --> 32:46.000] Can we also do other sort of import, export? [32:46.000 --> 32:47.720] It can import SPGs and extrude them. [32:47.720 --> 32:50.560] It can import images and turn them into height maps. [32:50.560 --> 32:54.320] So one of the common things people do with CNC is they'll do reliefs. [32:54.320 --> 33:06.360] And so I can bring in a relief, like an image of a flower, and add some parameters to that, [33:06.360 --> 33:13.680] and actually I want my stock to be offset, and then I want to resize this thing because [33:13.680 --> 33:20.480] it's kind of too large. [33:20.480 --> 33:21.960] So this is sort of a common use case. [33:21.960 --> 33:22.960] People want to do reliefs. [33:22.960 --> 33:27.200] Reliefs are a pretty, like I said, a pretty common thing. [33:27.200 --> 33:33.120] This came from this image right here, which I grabbed off the internet this morning, but [33:33.120 --> 33:37.360] just to show you that it will import things like that, and it will also import SPGs. [33:37.360 --> 33:40.600] So if you have an SPG, this is more common with lettering. [33:40.600 --> 33:43.520] If you want to do like lasering or CNC of lettering or things like that, you want to [33:43.520 --> 33:50.160] bring in an SPG, and you've created another 2D program, and I can do that. [33:50.160 --> 33:51.160] It'll bring it in. [33:51.160 --> 33:52.160] That's too large. [33:52.160 --> 34:05.240] I can delete pieces out of it and scale it because that's, again, too large. [34:05.240 --> 34:09.720] So then just delete and add some new operations there. [34:09.720 --> 34:12.840] This is actually a good segue into the laser mode. [34:12.840 --> 34:15.920] This is actually really too large now, again. [34:15.920 --> 34:21.480] Let me scale that guy down. [34:21.480 --> 34:29.160] And in laser mode, you're creating, let's see, I don't want to use this. [34:29.160 --> 34:31.360] I'm going to use a different cube. [34:31.360 --> 34:35.920] I'll just show you this. [34:35.920 --> 34:40.440] So by default, in the laser mode, when you slice, it basically looks at all the different [34:40.440 --> 34:45.200] Z changes, and it will, if you say nothing for zero for the height, it will basically [34:45.200 --> 34:48.560] find all the transition points, and it will create a slice at that point. [34:48.560 --> 34:52.480] The assumption there is you're going to slice a thing into a stackable layer, and you're [34:52.480 --> 34:57.480] going to basically do stacked, registered slices with a laser cutter. [34:57.480 --> 34:59.160] You can do something a little more complex. [34:59.160 --> 35:02.280] You can choose the slice height. [35:02.280 --> 35:05.640] These are, but like lettering, the things I showed you before, we're basically going [35:05.640 --> 35:11.400] to bring in a 2D thing usually, and then slice that and set like an offset. [35:11.400 --> 35:14.840] Offset is a kerf for the laser, and that'll tell you how far the line is going to be set [35:14.840 --> 35:18.880] off in the part, so that when you take into account the width of the laser, you get the [35:18.880 --> 35:20.680] size of the part that you want. [35:20.680 --> 35:24.400] It has some other interesting features, like a drag knife. [35:24.400 --> 35:26.200] You can turn on drag knives. [35:26.200 --> 35:31.520] Drag knives will do the radial cuts, so that you can basically, if you're cutting vinyl, [35:31.520 --> 35:35.400] for example, it's very similar to laser cutting, but you're dragging a rolling surface, and [35:35.400 --> 35:39.880] so 15 minutes, thank you, I'm rambling. [35:39.880 --> 35:43.640] Drag knife support, I'm going to quickly just go through the last mode or two here, and [35:43.640 --> 35:46.920] then show you a couple other things. [35:46.920 --> 35:51.880] Resin printing, also known as usually MSLA, which is masked SLA, as opposed to actually [35:51.880 --> 35:58.640] resin printing using a real laser, which is tracing something, 2Dbox owns that market. [35:58.640 --> 36:02.760] I bought a couple of resin printers, and I used them before I figured this out, that [36:02.760 --> 36:07.760] all of the file formats for resin printers are pretty much proprietary. [36:07.760 --> 36:12.800] They all contain the same information, which is basically a stack of images, but because [36:12.800 --> 36:17.280] 2Dbox sells the hardware, they force everybody to sign NDAs and make everybody have a different [36:17.280 --> 36:18.680] file format. [36:18.680 --> 36:21.120] What's out there today is all reverse engineered. [36:21.120 --> 36:26.960] I haven't put a lot of effort into MSLA since then, but it's really, really brutally simple. [36:26.960 --> 36:34.280] It doesn't even have the problem of path routing, because you're really just doing layers. [36:34.280 --> 36:38.040] You're slicing into layers, you're generating a bunch of bitmaps, you're encoding them into [36:38.040 --> 36:41.120] a file, and you're throwing that at your resin printer. [36:41.120 --> 36:44.160] The one thing that really doesn't make sense about this is that resin printers take so [36:44.160 --> 36:49.800] long to cure each layer that a microcontroller could render and raster each next layer, and [36:49.800 --> 36:52.960] it really should just be a stack of SVGs instead of 100 megabyte. [36:52.960 --> 36:55.600] This would be like a 100 megabyte file going to a resin printer. [36:55.600 --> 36:56.600] Should be 5K. [36:56.600 --> 37:01.120] It makes no sense, and I'm done ranting on that for today. [37:01.120 --> 37:05.440] The next way that you can access Kirimoto is through the engine. [37:05.440 --> 37:09.760] There is an engine API and an engine example. [37:09.760 --> 37:15.760] This is the pure API not associated with any UI or anything like that. [37:15.760 --> 37:18.280] You can run it standalone, you can run it in a browser. [37:18.280 --> 37:23.640] Here I'm actually going to just slice an object and generate out code in the browser. [37:23.640 --> 37:25.800] This is just using the engine directly. [37:25.800 --> 37:30.200] There's one more API which is actually used by, so the engine API and the frame API are [37:30.200 --> 37:35.080] used by a couple of different projects, even a commercial product. [37:35.080 --> 37:37.580] This is an API driving a frame. [37:37.580 --> 37:43.080] You can embed Kirimoto in a frame, in your site, and drive it through an API. [37:43.080 --> 37:45.080] This is automatically the API interaction. [37:45.080 --> 37:49.280] You can skin it, you can remove any UI elements you're not happy with, you can use a 3D part [37:49.280 --> 37:53.800] of it, so you can basically create your own engine for this, your own wrapper for this, [37:53.800 --> 37:56.160] and put it anywhere you want. [37:56.160 --> 38:00.360] That's just another sort of interesting way to access the interface. [38:00.360 --> 38:06.920] I'm going to show you the integration into Onshape if we've never used it before, browser [38:06.920 --> 38:16.160] based CAD, love it, can't send up nice things about it, it's not open source though, obviously. [38:16.160 --> 38:22.160] Go in, open a model, in this case I actually did a YouTube video demoing this, creating [38:22.160 --> 38:30.480] a CNC job to mill a guitar neck, so you go into Onshape, this is the model in Onshape. [38:30.480 --> 38:34.840] Kirimoto is a tab over here, you basically just say add Kirimoto, it shows up here, [38:34.840 --> 38:40.240] it's in the app store, and then inside of Onshape, because you can see I'm iframed right here, [38:40.240 --> 38:46.520] I bring in the guitar neck, and it imports into my workspace, and I can start to go into [38:46.520 --> 38:50.840] CAD mode, and start adding operations to mill this thing, export the gcode, all in the same [38:50.840 --> 38:51.840] interface. [38:51.840 --> 38:55.680] If I update the model over here, I can come over here and refresh the model in place. [38:55.680 --> 38:58.640] So if I have things that are referenced in the model, and I'm doing some milling stuff, [38:58.640 --> 39:02.360] and I've changed the model, I can basically just re-update it in this tab. [39:02.360 --> 39:07.080] So that's really the beauty of having this integration done in the browser through their [39:07.080 --> 39:08.580] APIs. [39:08.580 --> 39:12.880] It's the only case where this isn't a fully standalone application. [39:12.880 --> 39:16.160] I have to have APIs on the server that talk to their APIs using Elwalth and a bunch of [39:16.160 --> 39:17.320] other stuff. [39:17.320 --> 39:21.640] So I'll leave it at that, since we're running out of time, the last two things that I want [39:21.640 --> 39:29.640] to show you are, if I go back to grid space, mesh tool, in the slicer world you get a lot [39:29.640 --> 39:35.440] of crap models from Thingiverse and other places like that, non-manifold objects. [39:35.440 --> 39:41.280] And I kept adding more and more features into Qerimoto to manage those problems and try [39:41.280 --> 39:43.720] to heal those objects and clean them up. [39:43.720 --> 39:47.640] And eventually I'm like, I don't want to crowd the interface in Qerimoto with a bunch [39:47.640 --> 39:50.200] of stuff that really I used to use Blender for. [39:50.200 --> 39:53.000] And so I created my own tool for that. [39:53.000 --> 39:57.600] This was beginning of last year, I think, ending of last year. [39:57.600 --> 40:04.560] You can come in here and you can bring in any, so one of the things people do commonly [40:04.560 --> 40:08.280] with, oh, I didn't even show you the belt printing. [40:08.280 --> 40:14.960] So I will say that one of the things that Qerimoto did before most other slicers was [40:14.960 --> 40:16.760] add belt printing. [40:16.760 --> 40:19.640] So if you're not familiar with belt printers, one of the reasons I'm going to show you that [40:19.640 --> 40:24.680] is that belt printers are, you would think very similar to bottoms up 3D printing. [40:24.680 --> 40:25.680] They're not. [40:25.680 --> 40:26.680] They're completely different. [40:26.680 --> 40:31.280] They're similar in some ways, but basically if you think about it, every layer has a first [40:31.280 --> 40:33.040] layer problem. [40:33.040 --> 40:37.320] At 45 degrees, every layer has a first layer problem. [40:37.320 --> 40:42.080] And you have to deal with the fact that your bed is not rigid. [40:42.080 --> 40:46.480] It doesn't like a lot of materials, and you have a really hard time enclosing that thing. [40:46.480 --> 40:50.520] Having said that, if you can get your print job to work on a belt printer, it's phenomenal [40:50.520 --> 40:51.520] for lots of things. [40:51.520 --> 40:53.160] Why do you like to print swords? [40:53.160 --> 40:56.340] The problem with swords is they don't lay flat on the belt. [40:56.340 --> 41:05.640] So one of the things you can do in this tool is you can go in and split a sword. [41:05.640 --> 41:07.480] And there I have half a sword. [41:07.480 --> 41:10.120] Now the problem with that is that it is not manifold. [41:10.120 --> 41:11.400] It is open. [41:11.400 --> 41:14.440] So in here I can go to a pair, patch. [41:14.440 --> 41:20.880] I now have a sword which I can flip over, put on a belt printer and print it, which is something [41:20.880 --> 41:21.880] that people do pretty commonly. [41:21.880 --> 41:26.640] I'm not going to spend a lot more time in this tool other than it's something that [41:26.640 --> 41:30.720] I would love to improve over time and add a lot more features into over time. [41:30.720 --> 41:33.880] I think it's a tool that we should have running in the browser. [41:33.880 --> 41:37.880] There are some other things that are similar out there, but again, there's no cloud involvement [41:37.880 --> 41:38.880] for any of these programs. [41:38.880 --> 41:43.000] They're all completely standalone running the browser. [41:43.000 --> 41:51.360] And the very last thing, which I will show, because we're totally out of time now, is [41:51.360 --> 41:52.360] card control, which is a sender. [41:52.360 --> 41:57.800] I can't actually show you this because I have not connected via serial to a CNC mill, but [41:57.800 --> 42:03.080] this runs in the browser, uses web serial to talk to your device directly, locally it [42:03.080 --> 42:04.080] can talk. [42:04.080 --> 42:07.160] It's abstracted so that you can talk over USB serial or you can talk over the network [42:07.160 --> 42:09.160] to the device. [42:09.160 --> 42:13.000] But what's really cool about this is that if you get a mill and you go to your first [42:13.000 --> 42:16.480] time set up and you plug it into your laptop, you can click the serial button right here, [42:16.480 --> 42:21.160] it will find your mill, you will connect to it and start controlling it immediately when [42:21.160 --> 42:24.120] the browser without having to install any software. [42:24.120 --> 42:27.800] What led me here was when I got the mill and tried to install their software, it didn't [42:27.800 --> 42:29.880] work on any of my computers. [42:29.880 --> 42:32.840] It didn't work on Windows, it didn't work on Android, it didn't work on Mac. [42:32.840 --> 42:37.840] Now they fixed most of these problems, but again, it was like the software's not complex. [42:37.840 --> 42:39.800] I've written senders before. [42:39.800 --> 42:41.160] How hard could it be? [42:41.160 --> 42:45.760] So the cool thing about this software is actually that it shows you, uses 3JS, will render and [42:45.760 --> 42:53.280] show live in 3D what the mill is doing, so it's tracking in real time the G code against [42:53.280 --> 42:54.880] what's happening on the mill. [42:54.880 --> 43:00.400] All right, go to good space, you'll find links to the forums, docs, discord, all that kind [43:00.400 --> 43:06.240] of crap and now I can take questions. [43:06.240 --> 43:20.840] If anyone has questions, send over the microphone, yes, on that side, yeah. [43:20.840 --> 43:25.280] Hey guys, the room is full of makers. [43:25.280 --> 43:36.840] I, oh yes, yes, I found one. [43:36.840 --> 43:45.640] Hey, thanks for the talk. [43:45.640 --> 43:52.040] What are the techniques you're using for the workpiece simulation that you demoed in the [43:52.040 --> 43:53.840] CNC workspace? [43:53.840 --> 43:59.680] What's, what, the question is what, what, it looked like maybe you're using just a height [43:59.680 --> 44:00.680] map? [44:00.680 --> 44:04.520] Oh, for that, for that, yes, modeling this, correct. [44:04.520 --> 44:12.920] In the three axis CNC mode, it's rendering a height map because you can't do undercuts [44:12.920 --> 44:15.640] or side cuts or anything like that. [44:15.640 --> 44:18.800] In four axis mode, it doesn't use a height map. [44:18.800 --> 44:21.160] That's way harder to deal with. [44:21.160 --> 44:27.080] That's actually the only place I'm using manifold currently, and so it actually does 3D subtraction [44:27.080 --> 44:30.960] in real time of the tool geometry against the geometry. [44:30.960 --> 44:36.520] It's far more computationally intensive, but yeah, and I didn't have time to show that. [44:36.520 --> 44:40.720] Is manifold like robust mesh booleans? [44:40.720 --> 44:49.080] It is, so it's, it's a relatively new project, it's really exciting, written in C++, compiled [44:49.080 --> 44:54.040] into Wasm, and then loaded in as a library to run in each of the workers. [44:54.040 --> 45:01.480] Again, it's web assembly, so it's pretty fast, but it is a proper, it is a proper like manifold [45:01.480 --> 45:08.040] library for doing booleans. [45:08.040 --> 45:13.720] And I did contribute to that project because their initial API was too slow for what I [45:13.720 --> 45:15.960] was doing. [45:15.960 --> 45:19.280] They weren't producing arrays properly. [45:19.280 --> 45:24.720] I rewrote their JavaScript API for import, export of those and made it like 200 times [45:24.720 --> 45:32.080] faster, so that got accepted recently. [45:32.080 --> 45:33.080] Another question? [45:33.080 --> 45:34.080] Hiya. [45:34.080 --> 45:36.240] Thanks for the talk. [45:36.240 --> 45:39.440] I found it really interesting. [45:39.440 --> 45:44.560] I was wondering, I might have missed it, but I don't think you mentioned where you used [45:44.560 --> 45:50.320] WebAssembly in the product, and I was looking at the, WebAssembly, Wasm, and I was curious [45:50.320 --> 45:56.920] because looking at the slicer algorithms for FDM, they must be pretty computationally [45:56.920 --> 46:02.320] intensive, so how do you get that to work fast enough in the browser to be usable? [46:02.320 --> 46:07.400] So none of the slicing that you saw, none of the cam stuff, none of that used WebAssembly. [46:07.400 --> 46:09.680] Nothing that you saw today used WebAssembly. [46:09.680 --> 46:16.080] That's all pure JavaScript, which I know is probably upsetting for people. [46:16.080 --> 46:17.080] Funniness. [46:17.080 --> 46:21.600] Yeah, I'm surprised it's fast enough. [46:21.600 --> 46:22.800] It's impressive. [46:22.800 --> 46:26.640] So part of it is I did spend decades doing high performance computing, and I'm a bit [46:26.640 --> 46:29.040] of a performance nut, you know? [46:29.040 --> 46:30.600] So why would I use JavaScript? [46:30.600 --> 46:35.280] I mean, I did my prototype in JavaScript, and I'm like, this is just too easy, right? [46:35.280 --> 46:39.040] I started, like I said, it was like more than 10 years ago, and I was like, it worked. [46:39.040 --> 46:44.000] And my intention was to rewrite it in a real language, because I spent most of my life [46:44.000 --> 46:48.080] writing in real languages, and now I spend all of my time writing in JavaScript with [46:48.080 --> 46:51.760] a little bit of WebAssembly and some other things like that, and totally hooked on it. [46:51.760 --> 46:58.720] You can totally do some pretty amazing things in JavaScript if you decide you want to. [46:58.720 --> 46:59.720] Cool. [46:59.720 --> 47:00.720] Thank you. [47:00.720 --> 47:16.560] All right. [48:46.560 --> 48:47.560] Hello? [48:47.560 --> 48:48.560] Yes. [48:48.560 --> 48:49.560] We can see. [48:49.560 --> 48:50.560] Hello? [48:50.560 --> 48:51.560] Hello? [48:51.560 --> 48:52.560] Hello? [48:52.560 --> 49:12.560] Hello? [49:12.560 --> 49:13.560] Hello? [49:13.560 --> 49:23.560] Hello? [49:23.560 --> 49:24.560] Hello? [49:24.560 --> 49:25.560] Hello? [49:25.560 --> 49:26.560] Hello? [49:26.560 --> 49:27.560] Hello? [49:27.560 --> 49:53.560] Hello? [49:53.560 --> 49:55.560] Hello? [49:55.560 --> 50:02.560] Do you want me to draw with you? [50:02.560 --> 50:06.680] Can you handle it? [50:06.680 --> 50:08.560] One you can. [50:08.560 --> 50:09.640] please. [50:09.640 --> 50:10.640] come. [50:10.640 --> 50:11.640] I am open. [50:11.640 --> 50:12.640] Please. [50:12.640 --> 50:13.640] Please. [50:13.640 --> 50:14.620] Come in the ce subtle. [50:14.620 --> 50:15.620] What is it? [50:15.620 --> 50:16.620] Welcome. [50:16.620 --> 50:17.620] The last thing you enter out. [50:17.620 --> 50:18.620] You are the first one to do this? [50:18.620 --> 50:19.620] All right. [50:19.620 --> 50:20.620] Welcome. [50:20.620 --> 50:22.620] I had another talk and I also had a talk with you. [50:22.620 --> 50:42.620] So just, yeah, that's right.