A Review Of The Two Trees SK1

My journey into 3D printing started with a Prusa clone I built from a kit, and has moved forward in fits and starts. Last year into it, and now things have escalated yet again–for I have spent the past month testing the Two Trees SK1, a solid CoreXY machine that has the build quality and the open software stack I have been looking for:

This is just a tiny piece of it.

In short, the Two Trees SK1 is a CoreXY 3D printer with a 256×256×256mm print volume, direct drive extrusion (atop an all-metal hot end rated for 300oC), a 32-bit MCU and the ability (thanks to Klipper firmware and solid hardware) to print at ludicrous speeds.

I will unpack the above paragraph throughout the rest of the post for folk not into the lingo, but for those who are, the bottom line is that it is a workhorse printer that is certain to appeal to people setting up print farms, and, for various reasons I will also get into, it is especially attractive anyone using (or considering) Bambu Lab printers like the P1P.

Disclaimer: Two Trees supplied me with a review unit free of charge, and, as usual, this piece follows my .

What I look for in a 3D Printer

To understand why I like this machine, it important to take a little detour and list the five critical aspects I take into account when evaluating a 3D printer:

  • Ease of Use: How easy it is to not just perform day to day tasks but also solve minor issues with the machine (jammed filament, misalignment, etc.)
  • Build Quality: What kind of materials and parts the manufacturer used in its design–not just fit and finish, but also things like kinematics, overall design, etc.
  • Print Quality: How good and consistent are the results across different materials and types of prints.
  • Reliability: How much trust you can have on the printer to delivery consistent print results over time without constantly pampering it.
  • Maintainability: What tasks are involved in servicing, upgrading, and, if necessary, replacing or upgrading core components (stopping short of tweaking for its own sake, which is a common thing with this hobby).

This is because even though I quite enjoy the process of building and tweaking printers, I use them as tools.

My main use of 3D printers is to create functional parts and electronics casings of various sorts, and as such I have a strong preference for printers that are easy to use, reliable and maintainable, with very few frills–with the caveat that I am willing to put in a little time to tweak and maintain them, just as I would with any other tool.

Hardware Quality

3D printers tend to be sturdy machines, but there has been a tendency towards using custom parts and non-standard components in the past few years, which makes them harder to maintain and upgrade. Since my first printer , I have a strong preference for printers that buck that trend.

(Mostly) Open Firmware

As it happens, a great deal of the sophistication (and performance) of modern 3D printers is tied to their on-board firmware. In an age where most electronics is either locked down or has a short lifespan, I have a strong preference for open source firmware and software that can really control what the printer is doing as well as allowing for feature upgrades over time, and I have been using Klipper because of that.

If you’ve never paid attention to this space, Klipper firmware is a sophisticated combination of and that has, over the course of the past couple of years, added a surplus of raw speed, printing quality, ease of use and ease of updates to the equation, and pretty much upended the entire industry of FDM printing in the process.

Instead of low-end 8-bit MCUs sedately nudging 12V stepper motors along in a traditional bed slinger as they parse G-code, we now have entire Linux environments running -based software to process, optimize, and schedule motion paths that are then carried out by more modern MCUs and high torque steppers in various configurations, in a way that is both faster and more accurate than anything that came before.

And the Two Trees SK1 is pretty much a product of its time–it is a very fast and precise CoreXY machine with a comfortable print volume, direct drive extrusion (i.e., the extruder sits on the print head atop an all-metal hot end that should be able to handle materials well beyond the usual PLA and PETG), and an on-board install of Klipper right out of the box.

Unpacking and Setting Up

I’m going to save you the trouble of looking through photos of a large, quite well protected metal frame inside inch-thick packing foam and reinforced cardboard, because the only real issue I had with unpacking it was finding a roomy enough place to do so.

Given the size of the frame, all the extras (a small PLA spool, cables, spare parts, booklets and the usual tools etc.) fit with room to spare in a box shipped snugly inside the printer, and the entire thing came encased in very thick foam (pro tip: save it because it is great for doing maintenance or dampening vibrations).

Mind that this is not a beginner’s printer, and that I am not reviewing it as such. The docs are sparse and there are no glossy booklets or tutorials. You get a USB drive in the box with a few slicer profiles and a few STL files for testing, but like many Chinese-brand printers, there is an unwritten assumption here that if you get this, you know what you are doing.

All I had to do to get it running was to assemble the screen (two screws for the clip, then cable and slot it in) and remove a few plastic brackets that held the gantry in place for shipping. After that I noticed the belts were a little loose (which is a reasonable thing to do for shipping), tensioned them and powered on the machine.

I then realized I had to re-organize my office a bit, since it is a fair bit bigger than the other printers I have–thank goodness for wide angle lenses, because 3D printers can take up a lot of volume:

This is what you'd see behind me in a typical video call.

A nice thing about the SK1 is that it is exactly the size to fit atop an IKEA KALLAX, which is what I use as low-cost, low-profile storage in my office. A few centimeters more and it would hang off the front or back.

First Boot

All modern printers come with a screen and a set of basic controls, and the SK1 is no exception. The screen is a 4.3” capacitive touch panel that feels a bit laggy, but suffices for basic tasks like loading filament, calibration and stopping prints.

It works OK, but I have a few issues with it.

After a few seconds of animated logo, it guided me through the initial calibration stages.

Since the printer has three independent Z axis steppers (like the RatRig V-Core 3.1 and the Voron Trident Kit I have been thinking of building for a while now), it will level the bed using a three-point measurement and then do a full a 6x6 mesh.

With that done, it will take a few minutes to exercise the steppers at various frequencies so it can perform resonance compensation measurements for improving print quality–all of which are hallmark features of Klipper machines.

Note: besides an accelerometer, The print head has a dedicated PCB that includes an inductive probe, so be sure to keep your PEI coated steel sheet in there at all times, lest it crash into the bed)

From then on you’ve only to pick a Wi-Fi network (2.4GHz only, alas) or plug it in via Ethernet (which I didn’t yet–I’m waiting for a dedicated switch for this side of the office–but which I think ought to be a standard feature in all printers).

Bed And Print Volume

I have a feeling Two Trees was just a couple of centimeters short of being able to make this a 300×300mm machine–it would have been a bit tight with the triple Z axis and the relatively large print head (plus the gantry), but there is quite a bit of clearance around the print bed, which is good news since it means there is certainly room for an auxiliary part cooling fan.

The supplied PEI-coated steel sheet has a couple of alignment notches that line up with mounting screws to keep it straight on the magnetic bed, which is a nice touch. But en even nicer touch is that the printer includes an LED strip that lights up the print bed–which is a feature I have had to improvise on my other printers and is a very welcome addition.

No camera is included, and there are no obvious mounting points for one inside the frame, but it seems possible to add one (I certainly have small cameras that would fit in the upper corners of the frame next to the LED strip).

Build Quality

The SK1 is, in two words, unapologetically metal. Yes, I know I overuse that reference, but it’s warranted here.

Every component your eye rests upon looks and feels solid. Everything but the print head cover is metal, and a lot of it is familiar parts: There are custom brackets and spacers in a few places, but the linear guides, pulleys, Z-screws and pretty much every kinematics component is something you can theoretically replace, and it feels very well put together.

The Bambu Elephant In The Room

And yes, comparisons with the Bambu Lab P1P are unavoidable, given that they share the same bare metal open framework look, general kinematics and build volume.

However, there are several differences between the SK1 and the P1P that are worth noting at this point:

  • You can easily access the entirety of the electronics by removing the bottom panel (more pics below).
  • Pretty much all the mechanical parts I can see (other than some custom brackets for the gantry and bed) look like parts I could replace directly (or find equivalents for)
  • Instead of graphite rods, the SK1 uses linear rails for the gantry and all of the CoreXY kinematics, as well as standard Z-axis screws.

Having upgraded my with linear rails and bought the exact same Z screws and some brass lead nuts to upgrade my Prusa clone, I really appreciate that the SK1’s rails, lead screw nuts and print bed assembly seem to be standard parts.


As far as physical maintainability, the only two drawbacks I could see were the wide variety of screws used (from Philips M1 to hex head M3 and M4s, something that anyone who’s built kits will invariably find too diverse), and the print head assembly, which is a custom injection moulded part that includes the hot end, extruder and the inductive probe, with the cover held in place by a few Philips screws and the extruder tensioner.

However, the overall assemblies are easy to access, so doing things like replacing a belt should be straightforward:

Close up shots of the print head, gantry fastenings, idlers, belt tensioners and bed assembly.

There are no visible end stops, limit switches, etc. It all seems to be handled by the steppers and the inductive probe.

As to the kinematics themselves, the X/Y steppers are Usongshine US-17HS6001S-26B motors, which are pretty beefy–they’re 480g in weight each, and rated for 1.7A current and a torque of 70Ncm, which is perhaps 50% above what you’d see in steppers for large(ish) printer beds. Comparatively, the 3 steppers that handle the separate Z-axis are, I think, rated for around 40Ncm (I have since lost track of the data sheet for those).

Electrical Components and Main Board

One of the first things I did after unpacking and testing the printer was to take a look at the internals. The bottom panel is held in place by a few screws and the electronics are all easy to access:

The cabling is organized and seems quite well done.

Note the placement of the cooling fans, especially the pair blowing across the drivers. These are a tad noisy (more on that later), but quite effective at keeping the board cool, and aligned with cutouts in the bottom panel to let the air flow through.

Looking more closely at the board, there are a lot of familiar components:

The chip under the green heatsink is a 64-bit ARMv8 with 4xA53 cores-apparently an RK3328.

The board is a combined MCU and Linux board, with the main CPU having 1GB RAM and a direct connection to the STM32F402 MCU. The Wi-Fi chip is an AP6212 variant that appears to only have 2.4GHz support (at least based on what I’ve seen it do so far), and the Ethernet interface is 100Mbps–either of which are more than enough for a 3D printer (and the Ethernet port is a welcome sight).

Besides the two USB ports there is also an RJ11 port that seems to be for “screen expansion”, so I assume it’s another serial port.

I especially liked to see the extra fan connectors on the top left of the board, which means there is room for expansion and having an enclosure fan (Two Trees confirmed an enclosure kit is planned, but I have no details).

Even though that single GB of RAM worries me a bit (it may not be enough for handling extremely complex models down the line, which is something I’ve come up against in the past on 512MB Raspberry Pis) we have a lot of processing power here compared to older generations of 3D printers, and a set of well-known, recent components that are likely to be supported for a long time to come.

I don’t print any exotic materials (my open frame bed slingers can’t handle them, although I’ve been wanting to print ASA and carbon fiber materials for a few small, tough parts), so I can’t say much about the 300oC rating for the hotend just yet.

But I did take a good look at the print head assembly–I have stopped short of disassembling it entirely to avoid any issues during tuning and testing, but I did take the covers off (all you need is a Philips screwdriver, which is great if you need to do it in a pinch to unclog the extruder1) and looked at the controller board and hotend assembly:

Close up shots of the extruder, hotend, RP2040 control board and part cooling fan.

As you can see the entire assembly contains three fans, and it is those three that make the most noise (by far) while printing.

But much to my surprise, the hotend is identical to a 3rd party Bambu Lab replacement part–it has the same cooling fins, the same kind of fan, heat break, clip assembly, heater layout and silicone sock.

Comparing the SK1 to a P1P comes to mind again, and I think there’s a notable improvement here in terms of maintainability–instead of an integrated nozzle, you have removable ones. And this is amazingly great, because that means there are already dozens of replacement parts out there right now, and a sure supply in the future.

Also, the control board has free connectors, one of which is marked LED – so I hope this will make it possible to have Voron-style LEDs illuminating the nozzle.

You get two 0.4mm hardened steel nozzles with the SK1 (one in the hotend and a spare), but neither is high flow, so I’ve since ordered (but not installed) replacement CHT clones. As far as I can tell they are all V6-threaded, which, again, is another nod to standardized parts.

The SK1 spare nozzle between a V8 and an MK6

A sticking point here is that while the hotend fans appear to be easy to source, the part cooling fan seems to be a rather rare part:

MODEL: LD245015B
DC 24V 0.20A

Update, April 2024: Murphy’s Law intervened, and one of the blades of this part cooling fan broke off (I suspect it was due to a filament break that caused the filament to curl up and have the loose end hit the fan). The fan now vibrates noticeably, and is a bit of a nuisance. But, most importantly, Two Trees has been completely unable to both understand what happened (even despite my supplying several photos of the fan) and supply me with a replacement (paid or otherwise). I am still trying to find the exact same fan, but no luck so far. Since the fan is effectively a custom part, other 24V 40mm fans won’t fit in the space provided, and I am not really interested in replacing the entire hotend assembly just to get a new fan.

I’ve looked everywhere and I can’t find a direct replacement for it, so I hope it lasts a long time.

Printing Experience

My first round of prints was actually just a “cold test” to see how the printer would handle a few different types of prints. I am a bit weary of the 3D Benchy that is all over YouTube videos (I printed my fair share of those, and they just take up space), so my first print was a Voron test cube, which provides you a good overview of cooling, small overhangs, etc.:

Warning: loud fans.

So yes, this is a pretty fast printer. And it would actually get faster as I started dialing it in.

Slicer Profile and Web Interface

Two Trees provides and on a USB drive, but I prefer to use either or these days, so I created my own profile by reading through printer.cfg and taking the values from the extruder and kinematics sections in their Klipper configuration:

I've not validated the extruder acceleration yet, but everything else seems to be OK.

I also went and got this nice STL file for the print bed, and I was good to go.

And, of course, this being 2024 (and my having used things like for years), I didn’t use the USB or TF slots at all–I just connected the printer into my network and printed directly from the slicer, which is a huge improvement over the “I don’t trust any networks” workflow. And, again, unlike the P1P, this is done solely via the LAN. There are no cloud features here (which is a good thing, as far as I’m concerned).

also has the advantage that I get an embedded view of all my printer web UIs, which makes for a tidier workspace:

The only thing that isn't enabled by default here is the G-code viewer.

As you can see above, the SK1 comes with Fluidd as a web interface, which is nearly indistinguishable from Mainsail from a functional perspective–everything you’re used to is there, just in a different place, so anyone used to Klipper will feel right at home.

I have no real favorites here–I have used Mainsail on all my custom installs because it makes it easier to manage software updates by default, but I have no qualms about using Fluidd either, and managing firmware releases here will require some extra care anyway.

Start G-codes and Klipper Configuration

I have standardized my start G-code across all my printers by having each run their own calibration routines when I issue START_PRINT, so I took the start G-code from the configuration files and edited printer.cfg:

[gcode_macro START_PRINT]
    G28   ;home
    M107 ; Turn off the fan
    {% set BED_TEMP = params.BED_TEMP|default(60)|float %}; Start bed heating
    M140 S{BED_TEMP}
    {% set EXTRUDER_TEMP = params.EXTRUDER_TEMP|default(190)|float %}
    G21  ; set units to millimeters
    G90  ; use absolute coordinates
    M83  ; use relative distances for extrusion
    G0 X0 Y0 F12000 ; Move the head to someplace it can drip
    M109 S{EXTRUDER_TEMP} ; wait for extruder temp
    M190 S{BED_TEMP}      ; wait for bed temp
    G1 E-1 F2100 ; retract

    ;G32  ;Load bed mesh
    ADAPTIVE_BED_MESH_CALIBRATE ; this is something I added later

    G0 Z2.0 F600;
    G0 X50 Y10 F12000;

    G92 E0.0 ; reset extruder distance position;
    G0 Z0.4 F600;
    G1 X100.0 E10 F3000.0 ; intro line
    G92 E0.0 ; reset extruder distance position;
    G1 X200.0 E15 F3000.0 ; intro line
    G92 E0.0 ; reset extruder distance position;
    G0 Z0.8 F600;
    G1 X100.0 E15 F3000.0 ; intro line

    G1 Z0.4 F600      ;Wipe
    G0 Y12 F6000      ;Wipe
    G1 X100 F6000     ;Wipe
    G0 Y8 F12000      ;Wipe
    G1 X200 F6000     ;Wipe
    G1 X190 Y12 F6000 ;Wipe
    G1 X180 Y8 F6000  ;Wipe
    G1 X170 Y12 F6000 ;Wipe
    G1 X160 Y8 F6000  ;Wipe
    G1 X150 Y12 F6000 ;Wipe

    ;G0 Z2.0 F600;
    G92 E0.0 ; reset extruder distance position;
    SET_PIN PIN=caselight VALUE=1 ; this is how you turn on the light strip
    RESPOND MSG="Starting print"

I did, however, have to “fix” (read: change) a few things in the stock macros for it to work the way I wanted to, since Two Trees tried to simplify things for new users and the order in which some macros were called was different from what I expected (after my initial changes the printer would home twice on every print, etc).

If you are not the tweaking kind, this won’t affect you at all–I’m just pointing this out because people who are accustomed to building their Klipper configurations from scratch tend to be opinionated, and will do well to read through printer.cfg a couple of times and understand how it is set up.

I plan on making my printer profile and config files available in a few months, when I’m positive I’ve dialed things in.

Over the past month the bed tramming and default 6x6 point mesh bed leveling worked really well, and I have not had to do any manual tinkering at all.

The PEI sheet is the usual two-side textured/smooth kind (I’ve mostly stuck to the textured print surface, since I prefer that finish), and there is enough clearance even in the home position to remove the print surface.

Thanks to the alignment notches, flexing it in place to remove prints has become my preferred approach, and I’ve since seen there are third-party PEI/PEY flex plates out there already (or at least advertised for sale) with the same alignment notches. I intend to order one ASAP since PEI beds, despite their hardiness, are long-term consumables and I like to have spares.

As to the heater, it is rated for 100oC, which is a tad too low for ASA but more than enough for PLA and PETG–this feels a little low given that the hotend is rated for 300oC, though.

It is, in a word, impressive. Even without any real tuning and only the most bare bones slicer profile, I got some of the nicest Gridfinity boxes I ever printed.

Even with eight-year-old filament that by all accounts shouldn’t even be around anymore, it printed workable functional parts, and besides some extrusion irregularities (on that filament alone, due to some bubbling) the only thing that was noticeable were some rounded corners and seams, which is typical for PLA without correct pressure advance settings (especially when printed at high speeds).

But for functional parts where I’m more concerned with overall dimensional accuracy2 rather than fine cosmetics, I would say print quality out of the box was great:

These are untuned prints, some with filament breaks or swaps while printing. The light isn't flattering because I was trying to highlight layer lines and seams.

Over the next few weeks, as I started using the SK1 more as an actual printer rather than a test subject, results were uniformly good with either PLA or PETG (I used to have TPU but ran out recently, so that will be something to test in the future).

Of course with the printer being open (and my only having open-frame printers in my office) I have not (yet) tested ABS or ASA, but I am looking forward to trying as soon as I can enclose the printer.

Filament Management, Runout and Reloading

The SK1 comes with a filament holder that you can mount to the side of the machine (thankfully not in the back), and a length of PTFE tube to guide the filament into the extruder routed through the cable chain. Given my particular layout I couldn’t use neither the holder (it is still too close to the back of the printer, and I have a wall there) nor the cable chain, and it was easy to unscrew the PTFE guide and fasten it on the other side (where I could also use my somewhat temperamental Sovol filament dryer).

The filament runout sensor is mounted at the PTFE insert in the print head, and is a plain, non-flow-aware switch. That meant it cannot detect pinched/stuck filament, so I had one print that failed due to that–there was filament in the extruder inlet, but it was tangled in the spool. So it was ground away and the print failed due to under-extrusion, but only stopped because I was watching it.

But while testing with brittle PLA that broke several times, the printer did detect the breaks and prompted me to reload the filament, doing a good job of reloading it. The only issue I had was that the bed cooled down enough to loosen the print during one of the reloads (this seems to have been a one-off, since it didn’t happen in later PETG prints where it would have been more noticeable).

I have not yet tested power loss recovery, but I have found a state file in the Klipper install, so I assume it is working.

Test Materials

Since I have been printing case prototypes for various projects, it wasn’t hard to find excuses to see how the printer would handle different materials and speeds:

  • I took out a roll of eight-year-old PLA and printed a few functional parts (an ESP32 case, a few brackets, the entire initial assembly for a 6DOF 3D mouse, etc.) This was to see how the printer would handle a material that is known to be brittle and prone to breaking during prints, and as written above it handled those fairly well.
  • I also took out a roll of pretty bad PETG I have been avoiding using (it’s Sunlu Cherry Red, a color that for some reason is about as hygroscopic as a sponge), and that also went fairly well, although I did have to tweak the retraction settings to get rid of excessive stringing and blobs. I used this specific filament instead of TPU (which I ran out of a few months back) to see if I would need to open the extruder to clean the gears (which has been a typical outcome of my using that filament on other printers).
  • I then printed a few more Gridfinity boxes at different speeds and materials (normal PLA and Amazon Basics PETG) to see how the printer would handle the sudden changes in direction and speed, and to assess wall finish and seams. The initial results were good considering I did zero tuning, but it was obvious I would need to tweak the pressure advance settings to get rid of overly rounded corners and bad seams.

I then actually started to tune the printer to each filament using the built-in calibration prints, and the results were uniformly good when printing at speed (and excellent at more sedate paces).

The only really challenging part of this (which will be familiar to anyone who takes it seriously) is the time required to tweak pressure advance settings for the various kinds of PLA and PETG I have.

This was the debris from my attempts at tuning a certain cherry red PETG...

Finally, after I had a good feel for the printer with my usual materials, I switched to Two Trees‘ High Speed PLA and began cranking up the speed to see how the printer would handle it, and yes, it certainly can reach the advertised 700mm/s speeds, but most of the time you’re going to be looking at this kind of speed, and it’s only really going to go beyond that for infills:

Speed is going to be very highly dependent on the model and print settings.

In general, across all the prints I’ve made so far, I would say printing infill at 300mm/s and outer walls at 2/3 of that would be a good lower third of what I’ve seen–and that is pretty amazing, because I was able to print parts, test their fit and finish, and then redesign and print them again (maybe even with a different material or settings) in a fraction of the time it would have taken me on my other printers.

Quick changes can take less than 5 minutes if (like me) you export and print just the redesigned sections off your CAD software (segmenting joinery, for example) and then do test fits.

Sometimes (when I use STEP files) I can even and print them directly from the slicer, and that is a huge improvement over the usual 20-30 minutes it takes to print a small fitting.

For quick iteration, this machine is awesome, and that was the main thing I was looking for.

Power Consumption

This is something that has been on my mind a lot of late, so the printer has been running plugged in to a monitoring socket and I have been keeping an eye on its power consumption.

In short, it peaks at 290W heating up the bed, and will run at 196W while printing and keeping the bed warm (at least for PLA and PETG temperatures). There are a few small variations, but they are not significant.


However, this is not a quiet machine. Even at idle, the electronics fans (being high-RPM 40mm ones) tend to generate more noise than I would like in an office, but when printing the three high-powered tiny fans in the print head assembly can be quite loud to the point of drowning out everything else. Across various print runs, I measured 69dB to 75dB by holding my Apple Watch around 1m away from it inside my rather small office (which has some sound dampening hexagons in a couple of walls):

This is a typical variation inside of a minute as printing patterns change.

Compared to the 57dB of my (which I already find too loud) and the 40dB of my Prusa clone, this is quite a lot. It is understandable because cooling is a perquisite for printing at these speeds, but it is something to be aware of if you’re planning to put this in a shared space. An enclosure might help (although, to be fair, it is quite likely to come with more fans).

In my office that kind of noise is a serious issue when I’m on a call (which also explains why it took me so long to test longer prints) and I have to close the door to the office to keep the noise from being too distracting when I’m in my living room.

So if you’re as averse to fan noise as I am, do consider placing the printer in a closet or garage if at all possible (I’m investigating the former, and looking at ambient noise reduction hacks in the meantime).

Amidst all this, the stepper motors are actually fairly quiet (except when printing at full speed). During bed leveling and first layers they are audible, but perfectly tolerable.

Using The Screen

The capacitive touch screen is a key weak spot as far as I’m concerned. It works, but sometimes it lags or becomes unresponsive, displays incorrect information and has crashed on me at least twice. And it is not KlipperScreen, which is a bit of a letdown.

Build-wise it seems solid enough, but it is a bit of a letdown in terms of responsiveness and reliability. I only use screens on printers for loading/unloading filament and the most basic of things, so the most used function on the SK1 screen for me was turning the light strip on and off until I automated it.

But I can see this being an issue for regular users, since some quality of life features like preview thumbnails are not currently supported.

Under The Hood

During more sedate moments, I investigated the software internals of the printer with some relish, since given my hardware background I always like to see how these products are built.

System Overview

Internally, the SK1 comes with what appears to be a pretty vanilla Klipper install with a set of custom macros and, of course, all the right settings and tweaks for the steppers used. Two Trees chose Fluidd for its web interface, and that runs alongside the Moonraker API server and the core Klipper daemon.

Those all live on the ARM CPU, and that, in turn, talks to three devices:

  • The STM32F402 MCU that handles the kinematics.
  • An RP2040 sitting on the print head that handles the extruder, filament runout sensor and the inductive probe.
  • And the screen, which is a Nextion-like device that has its own MCU as well.

Firmware Upgrades

Which means this is a great moment to look at maintaining and upgrading this printer from a firmware perspective. If you paid attention to the shots of the internals, you probably noticed there was a 4GB EMMC chip labeled SK1 1221. That’s where the Armbian Linux part of the firmware lives.

The MCU part, though, goes into its own flash storage, and to update it you need to use the TF card slot near the bottom right–and, finally, there is a third TF card slot inside the screen.

The upgrade process for all these is well documented in a Two Trees video (and PDF), but it does require you to open the printer, take out the EMMC card, plug it into a supplied adapter, and then plug that into a computer to flash the firmware–and then do essentially the same with a TF card to upgrade the MCUs on the stepper side of the board and the screen.

This is a bit of a hassle compared to my custom Klipper installs (where I can do 90% of them over ssh), but it is a once-in-a-while thing that, fortunately, I haven’t needed to do yet (as of the time of writing, the printer is still running the firmware it came with, and that was the latest revision).

Regardless, I should point out that a huge step up from the usual state of affairs in the 3D printing world is that it is conceivably possible to do all of these yourself and entirely offline, rather than be the mercy of the manufacturer to provide updates.

And yes, cloud updates are very, very convenient for consumers. But if you’re running a print farm, you probably want to be able to control when and how you update your printers, and the SK1 is a step in the right direction in that regard even if the process is physically convoluted.

Inside The Firmware

I unpacked the firmware image and had a look at the rootfs and boot partitions, and it is a pretty standard Armbian install with a few custom scripts and custom services. Most of the filesystem is ext4, and the boot partition is a VFAT containing initrd, ARM DTBs and the usual stuff you’d expect to see in Rockchip-based device.

By this time I had already set up the printer on my network and was finding it a little odd that the clock wasn’t set correctly, so I downloaded the latest firmware image, figured out to login, and went to town:

           _              _ 
 _ __ ___ | | _____ _ __ (_)
| '_ ` _ \| |/ / __| '_ \| |
| | | | | |   <\__ \ |_) | |
|_| |_| |_|_|\_\___/ .__/|_|
Welcome to Armbian 22.05.0-trunk  with bleeding edge Linux 5.16.20-rockchip64

No end-user support: built from trunk

System load:   2%               Up time:       13 min   
Memory usage:  17% of 976M      IP:
CPU temp:      40°C             Usage of /:    69% of 6.6G      

I’m not sharing the details because I don’t want people to break their printers on my account (and also because I hope Two Trees will not remove the functionality and even make this official in some way), but it’s all good news future-wise, since having a flavor of Armbian on board is a solid guarantee of some kind of future upgrades for both the base OS and for Klipper.

Once I was in, I did some minimal changes for sanity:

  • I removed the default resolver and set my LAN’s (I did’t want to mess with NetworkManager, so I just edited /etc/resolv.conf).
  • I set the hostname to twotrees-sk1 and installed avahi-daemon and libnss-mdns to be able to find the printer on the LAN (if you’re not familiar with this, it makes it show up on my LAN as twotrees-sk1.local on Mac and Linux).
  • I then used armbian-config to set the timezone, and refrained from touching anything else system-wise.

Although I’m pretty sure I could update standard system packages without breaking anything, given the convoluted firmware upgrade process I want to have a long, hard look at the Klipper install before I risk breaking anything serious.

# Make sure I can see this from a Mac
apt install avahi-daemon libnss-mdns
# I also edited the hostname
cat /etc/resolv.conf 
# Set my local LAN resolver and the systemd resolver so that this can resolve .local addresses as well

I did install a simple Klipper add-on – the simplest and least intrusive Adaptive Bed Mesh plugin I could find, and it has been working flawlessly so far.

But I have decided to treat this printer as an appliance rather than a computer, so I will likely not be doing any more changes to the base system (even if buster is a little old). After a couple more official firmware upgrades, we’ll see how it goes.

Exploring The Screen

I did a little digging and the display seems to be a Nextion/TaoJingChi variant, although I can’t really pinpoint the exact model. I spent a good while in the fascinating world of the Unofficial Nextion User Forum, and, in short, the screen itself is a customizable product that can be programmed using its own toolchain and a set of somewhat predefined components you can build upon.

Close-up of the screen PCB

It has its own MCU that talks to the Klipper main board via serial on /dev/ttyS1 and a daemon process built with the Makerbase SDK (yes, I ran the binary through Ghidra, as anyone working in embedded systems would), and no, it’s not KlipperScreen.

But it’s somewhat likely that enterprising souls will be able to do something with it. And the screen was the only thing that I actually e-mailed Two Trees about–even though I will stick to reviewing what came in the box, I reported the issues I had with it and was told that there would be a new software revision “soon”.

I “replaced” it with a “Cheap Yellow Display” running CYD Klipper to see how it would fare, and even though I prefer the web interface, this has been working well enough on my desk:

13 Euro goes a long way these days

I do have a crazy idea, which is to take over the connection to the existing display and set up SLIP and a VNC client on an ESP32 to run normal KlipperScreen. It’s been done before (just not over serial), and there are libraries available, so… Maybe someday.

Adding a Camera

Instead of plugging in a normal USB webcam I mounted a Xiaomi 1080p HomeKit camera on the corner of the frame using its magnetic base and powered it from the printer’s USB port, which worked great:

White PLA isn't the best thing to film in low light, but this works to keep an eye on things.

I prefer this setup because this camera also captures in infrared, the videos all go into iCloud storage directly and I can have a picture-in-picture view of the printer on my Mac or AppleTV, although of course I can’t do time lapses with it.


I am very happy with the SK1. It’s pretty obvious that it is first and foremost a workhorse printer targeted at people that are knowledgeable with the mechanics of 3D printing and are looking at setting up print farms–where its sturdy build, speed and remote management via Klipper are certain to outweigh the noise and lack of creature comforts like an enclosure (or even a polished screen UI). The only real question they should ask is how often they will need to upgrade the firmware, and how much of a hassle that will be.

As to me, I see this as an asset that you invest in and plan to maintain and tinker with over the course of quite a few years, so I suppose occasionally upending it, unscrewing the bottom and plugging in the EMMC adapter in is OK (incidentally, I put mine in the neatly labeled bag it came in and stored it with double-sided tape inside the printer, where it definitely won’t get lost).

For consumers, it depends. Geeky buyers who can’t (or don’t want) to build a Voron kit or get a P1P will have a blast with it, and I think it is a great printer for people who are looking to get into the nitty-gritty of 3D printing and want to have a printer that can grow with them but understand that there is no overly polished software or hand-holding here. It is a bit of a hassle to upgrade the firmware, but there is more than enough of a standard Linux install in there to make it a very attractive proposition for people who like to tinker.

And, of course, from a purely engineering perspective the way the software works (without any cloud connectivity) and standard components throughout is a huge plus for people who are concerned about privacy and security.

For me right now, the biggest game changer has been its speed and print quality, because it’s been a big boost to my prototyping workflow. I have limited time to do some things, and with the SK1 I have been able to print and test parts in a fraction of the time it would have taken me on my other printers.

The results have been uniformly good, and there’s been a profound change on how I use the printer–I have timidly started making more use of the print volume, because I have more trust in the SK1‘s ability to print a trayful of parts in a reasonable amount of time:

This was with the crummy, eight-year-old filament that would break mid-print.

Without going into price comparisons, I see the SK1 as being especially attractive to experienced 3D printer enthusiasts currently looking at the Bambu P1P or the Creality K1 and who understand the internals of Klipper. And there are quite a few nice things here–you’re essentially having to choose between curated ecosystems with proprietary applications, firmware and parts (although Creality does allow you to access the firmware) and something that might (with luck, granted), require less hassle to maintain and replace parts in the long run.

Of course the fact that the SK1 can use Bambu clone hotends fuzzes the lines a bit, but it does seem like a very clever move given the size of the market for Bambu replacement parts–and a good guarantee they will exist for a long time.

But, again, for folk like me who favor relatively standardized parts and the ability to deeply customize their printer settings, the SK1 is remarkably satisfying. It’s not a Voron, but it is a very sturdy framework that almost removes the itch to buy a kit and build one from scratch.

As usual with all the stuff I review, I will be updating this post (or linking to it in the footer), so I guess future us will know.

Update, April 2024: I have to note here that support has so far been rather lacking (see the note above regarding trying to replace my part cooling fan). I will update this once I can resolve that issue (or not).

  1. One thing I did find annoying is that you need to remove the extruder tensioning screw to get the cover off. There is a printables modded fan shroud that has a little notch to avoid this and adds LEDs near the nozzle, which is something I might try out. ↩︎

  2. I’ve since printed a Califlower and dimensional error out of the box was 0.4%, which is pretty good for a printer that hasn’t been tuned yet and prints at speed. ↩︎