Skip to content

PrusaSlicer 2.4.0 alpha1 full change log

Vojtěch Bubník edited this page Sep 1, 2021 · 1 revision

PrusaSlicer PrusaSlicer 2.4.0-alpha1

Summary

This is the first alpha release of PrusaSlicer 2.4.0, introducing Multi-material painting tool, improved FDM supports and raft, Windows dark mode, Fuzzy Skin, per object Brim configuration, Negative volumes, automatic Color Print for signs, Shape Gallery, "Tip of the day" notifications, Model simplification, support for Marlin 2 acceleration control, support of 3DLabPrint airplane models, new 3rd party printer profiles and many more new features, improvements and bugfixes.

To let you enjoy the alpha without worries, the alpha builds save their profiles into PrusaSlicer-alpha directory, so you may use the alpha side by side with the current release without ruining your production configuration.

The software is based on work of Alessandro Ranelucci (@alranel) and the RepRap community. The first public commit is from 2011-09-01, meaning that exactly today, PrusaSlicer based on Slic3r celebrates its tenth birthday🎂🍾 Thanks to all who contributed during the decade and helped to continuously improve the software.

Complete description of improvements and changes with respect to the current PrusaSlicer 2.3.3 release follows.

Multi material painting #3535

In PrusaSlicer 2.3.0 we have introduced paint-on supports and seams. Seeing the painting tools in PrusaSlicer, many customers asked for similar tools to help with multi material printing. Indeed, preparing models for multi material FDM prints used to be a laborious and time consuming process. With this release of PrusaSlicer, that is a thing of the past and coloring an object for multi material printing requires just a handful of bucket fill and brush stroke operations.

mm_painting_jpg

The editing tool opens with N hot key and it offers the following tools:

  1. Brush: similar to the old support or seam painting tool.
  2. Smart fill: fills a region below the mouse cursor up to a sharp edge (the sharp edge threshold is adjustable at the panel).
  3. Bucket fill: replace a patch of one color with another.

mmu_painting

Combo boxes in the panel allow mapping different extruders to left and right mouse button. The number and color of the selected extruder is shown for clarity. The color that is used for visualization can be overridden by clicking the colored square next to the selected extruder. This visualization color is not saved anywhere and will be lost when the application closes.

Once the object is painted, the object surface is segmented into patches of same material and the patches are extended inwards. The regions painted at the top resp. bottom surfaces are extended by the number of top_solid_layers resp. bottom_solid_layers (configurable in Print Settings->Layers and Perimeters). The regions painted at the side walls are expanded inwards up to maximum mmu_segmented_region_max_width (which is a new configuration parameter accessible in Print Settings->Multiple Extruders->Advanced).

The painting only affects the slicing result, the model itself is not altered and the colored "parts" cannot be exported separately.

Notes

Please note that thin features are not printable with FDM technolgy, thus for example painting a thin wall with two distinct colors will not make the thin wall printable. Such thin non-printable regions created during segmentation are thus detected and merged with the neighboring region, changing its color. PrusaSlicer will print thinner features with "detect thin walls" enabled, thus one is advised to try to enable "detect thin walls" if painting over thin features.

There are two extra limitations arising from technical reasons:

  • The multi material painting is limited to 16 extruders. If your printer uses more extruders, only the first 16 will be available in the painting tool.
  • Multi material painting cannot be combined with XY size compensation. The XY size compensation will be ignored during slicing if the object is also multi material painted.

The user is informed by a notification in both cases.

Bottom layers bridges

PrusaSlicer is based on the pioneering work of Alessandro Ranelucci and the RepRap community on the Slic3r project. As already mentioned above, the project was started ten years ago and a lot has changed since then indeed. The 3D printers are no more a rarity, ABS is not the only filament, motion systems are accurate and extruders are no more leaky. Thus adjustments to the slicing algorithms are called for.

Slic3r's strategies of FDM supports and object over support differ from the other FDM slicers. Namely, Slic3r was designed to make use of FDM bridging capabilities to circumvent the necessity of supports. And printing bridges with ABS was not that easy: The bridges were reliable only if extruding thick strands. Combining the thick bridges with supports required the 1st layer objects being printed thicker than the other layers, leading to ugly object undersides.

All the other FDM slicers evolved differently: The first layer over supports is printed with the same flow as the other layers, thus the first layer over supports looks nicer as long as the strands bridged reliably or supported by a support interface. For support materials that do not bridge reliably, dense support is required for high quality of objects over supports.

Starting with this release, PrusaSlicer newly offers printing bridges and 1st object layers over supports with the default layer thickness. The bridging behavior is configurable with a new "thick_bridges" boolean option. If enabled, the old Slic3r bridging strategy is applied, while if disabled, bridging is performed in a similar fashion to the other FDM slicers, leading to better bottom quality over supports. With "thick_bridges" disabled, the behavior of "bridge_flow_ratio" changes: Instead of modifying cross section of a rounded extrusion while keeping the gap between the extrusion threads constant, extrusion spacing is maintained while modifying the extrusion width and / or height to reach the prescribed extrusion ratio.

thick_bridges

FDM supports improvements

FDM supports were substantially redesigned in this release, answering frequent (and rightful) complaints from the users:

  1. New "snug" shape of the support columns. By default, PrusaSlicer projects support columns into a regular grid for stability. Supports projected into a regular grid have a well defined minimum area, however they tend to leak out of regions they support along the object walls down to the print bed. We newly implement "snug" supports, which maintain the shape of the supported overhangs, thus avoiding the leaks with the trade-off of possibly lower support stability #555 #740 #902 #1346 #1993 #2708 #3083 #4783 #6240. The support shape is configured with a new "support_material_style" config field, which accepts two values: "grid" (the old behavior) vs. "snug" (the new shape). The "snug" supports accept a new parameter "support_material_closing_radius", which controls merging close support islands and simplification of the support column shape. We borrowed a function smooth_outward() from Cura written by @BagelOrb to robustly simplify support island contours during merging of multiple support overhang islands. snug_vs_grid
  2. If "support on build plate only" is enabled, the support columns are newly trimmed to not land on top of an object. However this may make the column too small to be stable #915 #1340 #3980 #4199.
  3. Support enforcers newly take precedence over "supports on build plate only" and over "don't support bridges". This applies to both the enforcer and blocker modifier meshes and paint-on supports. Also the fact that the enforcers take precedence over blockers is indicated by sorting the enforcer meshes below the blocker modifiers at the side panel (the volume lower in the list always takes precedence over a volume upper in the list) #1870 #1997 #2801 #3741 #3831 #5105 #5748.
  4. A new configuration value "support_material_bottom_contact_distance" has been added to complement "support_material_contact_distance". If "support_material_bottom_contact_distance" is positive, it defines separation gap between the object top surfaces and bottom of support towers, while "support_material_contact_distance" defines gap between the support and object bottom surfaces. If "support_material_bottom_contact_distance" is set to zero, the old "support_material_contact_distance" applies to both top and bottom distances.
  5. Similarly, a new configuration value "support_material_bottom_interface_layers" has been added to complement "support_material_interface_layers". If "support_material_bottom_interface_layers" is non negative, it defines number of dense support interface layers between the object top surfaces and bottom of support towers, while "support_material_interface_layers" defines number of dense support interface layers between the support and object bottom surfaces. If "support_material_bottom_interface_layers" is set to "same as top" (value -1), the old "support_material_interface_layers" is used to define both. If "support_material_interface_layers" is set to zero, neither top nor bottom support interface layers are being created #4288.
  6. The support 1st layer density and expansion is newly configurable with "raft_first_layer_density" and "raft_first_layer_expansion", allowing to disable support 1st layer expansion completely. While the two configuration values start with "raft_", they are applied to the 1st support layer if the raft is disabled #1165 #2568 #3772.
  7. The support interface pattern is newly configurable with "support_material_interface_pattern" to "default", "rectilinear" and "concentric". Default is concentric for soluble interfaces and rectilinear for non-soluble support interfaces. We expect this settings to be useful for printing with soluble interfaces: While the concentric pattern may produce smoother surfaces at sides of an object, rectilinear support interface may produce nicer horizontal surfaces #1197.
  8. Improved soluble support interfaces over non-soluble support base columns (#5823). Printing a soluble interface directly over non-soluble sparse support is not a good idea. Soluble support material often does not stick properly to non-soluble material and the soluble material may not bridge the gaps between sparse support lines. Based on #5903 by @spiky2021, PrusaSlicer newly extrudes half of the support interface layers with the support base material, so that the dense soluble support interface material is extruded over a dense base interface material layer. While the soluble interface pattern is now configurable with "support_material_interface_pattern", the non-soluble dense interface is always extruded with rectilinear pattern, which bridges better over the sparse support.
  9. The FDM sparse zig-zag infill algorithm was redesigned to support dense support interface layers reliably #2969 #4295 #4951.
  10. Brim is newly calculated around the object, not around the 1st layer of the support and supports are printed over the brim on other layers #713 #1156 #3395 #3396.
  11. A single perimeter line is newly extruded around the support 1st layer to improve print bed adhesion #756 #2101.
  12. Support first layer used to be printed with concentric pattern for soluble materials, it is newly printed with rectilinear infill all the time #684 #1445.
  13. UI related, paint-on supports: Extra dialog for auto setting by angle gizmo was removed, the slider is now embedded in the main paint-on supports gizmo dialog.

FDM support generator bugfixes

  • Fixed spilling of FDM supports using the old "grid" support style due to some numerical inaccuracy issues #5209 #6067.
  • Reduced leakage of FDM supports using the old "grid" support style through object holes. The leakage was significant with thin walled objects. Newly the supports are only allowed to fill a grid cell, never to expand into a neighboring support grid cells, and the risk of leakage through thin walls was reduced by over-sampling the support grid #5054.

supports_leakage

  • Fixed excessive cooling slow down over supports. Cooling was incorrectly calculated from the time to print a support layer when the support layer was printed at its own Z height. PrusaSlicer may print a support layer at its own Z height not synchronized with any other object print Z height to guarantee the support contact Z distance. As the cooling slow down was incorrectly applied to each layer independently, a support only layer and the successive object layer were slowed down unnecessarily. Newly PrusaSlicer applies a cooling slow down logic to all support layers together with the object layer being supported #984.
  • Fixed paint-on supports on horizontal surfaces, where the painted regions were assigned incorrectly to one layer below or one layer above the painted regions due to numerical issues #5948.
  • Fixed excessive 1st layer support raft expansion. PrusaSlicer used to fill holes in the 1st layer support raft on purpose to improve adhesion, however this behavior was found too aggressive. Filling holes in the support 1st layer is disabled now while the user may newly apply a higher raft_expansion if one wants a stronger 1st layer adhesion #430.
  • Fixed leakage of 1st layer support raft through thin object walls during the 1st layer support raft expansion. The 1st layer support raft is newly expanded carefully with multiple steps to avoid the leakage #2245.
  • Fixed unnecessary support interafaces created by aggressively merging concentric support interfaces #4570.
  • Re-enabled "Enforce support for first N layers" even if "Generate supports" is disabled #470.

FDM Raft enhancements #1277 #2823 #3425 #6053

  • The raft newly supports separate configuration of "raft_contact_z_distance". Indeed, we want the "raft_contact_z_distance" to be smaller than "contact_z_distance", as we value the quality of the 1st object layer over raft interface and it is easy to remove raft with a blade.
  • "raft_expansion" is newly configurable.
  • First object layer above the raft interface is no more printed with a bridging flow, but a normal flow. This produces much nicer bottom object surface.
  • Because the first object layer above the raft interface is no more printed with a bridging flow, the bottom infill pattern is newly respected #3507.
  • Speed and acceleration of first object layer above the raft interface is newly configurable with "first_layer_speed_over_raft" and "first_layer_acceleration_over_raft" #6166 #6623.

The raft rework is based on #6003 thanks @nemart69 for the contribution.

First layer height

The following properties of the FDM support generator changed:

  • The "first_layer_height" parameter was made global to the print, it is no more object specific. We consider the 1st layer height to be a property of the print. Also the skirt and brim are calculated and printed for multiple objects in a single step, therefore allowing different 1st layer height for different objects was questionable from the start.
  • Because now first_layer_height is print specific, the "first_layer_height" no more supports relative values with respect to object layer height. Thus "first_layer_height" defined relative to the object layer height is newly converted to an absolute value when importing a config file or a project file.

Brim and skirt enhancements

Inner brims, brim per object

Previous PrusaSlicer versions only generated outer brim, leaving any possible holes in the first layer without brim and forcing users to use workarounds using extra thin object parts etc. Starting with this release, it is possible to generate outer brims, inner brims or both.

Also, brim settings are now object specific and brim is not generated for all objects at once, but for each of them separately. This allows to turn brim on just for some of the objects, use different brim width for individual objects etc. #286 #651 #1033 #2182 #2290 #2455

Brim and elephant foot compensation, configurable brim offset

Purpose of the brim is to increase adhesion of the object to the print bed, meaning that it must be fused to the object. On the other hand, it must be possible to remove the brim without damaging the object itself. This means that the gap between the object and the brim must be chosen carefully. This issue is further alleviated by elephant foot effect, always present on the first layer of a print.

In previous versions, elephant foot compensation (EFC) was applied on the first layer of the object, while the brim was left as if no EFC was applied. This leads to a small gap between the object and the innermost loop of the brim, which should be filled due to the elephant foot effect. However, this made the actual sticking of the brim quite sensitive to z-height adjustment of the nozzle and sometimes led to inadequate attachment of the brim to the object.

Starting with this release, the brim is generated after EFC of the object. The offset of the brim can be further adjusted by a new configuration parameter "brim_separation" (which is independent on EFC), allowing the user to fine tune the brim offset to his or her liking. #4850 #3779

As long as brim offset is set to zero, the EFC should never detach the brim from the object. #3870 #6795 #4736 #3949 #3915 #4736 #6602

When loading a project file (3MF) stored by earlier PrusaSlicer version, the "brim_separation" value is set equal to the elephant foot compensation value to produce the same brim as was created with the PrusaSlicer that saved that project file.

Draft shield

Skirt printed around the printed objects is present in PrusaSlicer for years (and it was in original Slic3r before). There are several uses the skirt can serve and that people use it for. Priming of the nozzle at the beginning of the print, priming after a toolchange, or using a very high skirt as a draft shield are the most usual. Skirt is a multi-purpose tool and this release brings several changes in its configuration and behavior to make its use more intuitive (especially regarding its usage combined with a brim).

The old boolean configuration option "draft_shield" is now an enum and allows following selection:

  • Disabled: the skirt is not used as a draft shield, it is printed around all objects' brims to the specified height
  • Limited: the skirt is as close to the objects as specified by "skirt_distance" (possibly intersecting brims), it is built to the specified height ("skirt_height")
  • Enabled: same as 'Limited', except "skirt_height" is ignored and the skirt is as tall as the tallest object

draft_shield

This allows the brim to improve draft shield print bed adhesion and to push the draft shield as close to the object as possible, while not creating any skirt/brim intersections when the user does not intend to use skirt in place of a draft shield. #4802 #5056 #4736 #3692 #6544

When draft shield is used, skirt loops are printed uninterrupted and brim loops are cut. While it may make more sense to do it the other way round, shortening skirt is unacceptable because of "min_skirt_length" parameter and possible usage for nozzle purging.

Negative volumes, modifier & extruder override rules

PrusaSlicer newly supports "negative volumes" to subtract pieces of geometry from a model #4920. While there was a way to achieve a similar effect by setting zero number of top / bottom layers, zero perimeters and no infill in earlier versions of PrusaSlicer, the new "negative volumes" are much easier to use and they are processed faster and the old workaround produced artifacts as in #5095. Read more in the Documentation.

negative_volume_image

PrusaSlicer newly clips the volumes and applies the modifiers in the order they are presented at the side panel, latter volume clipping the former one, latter modifier overriding the former modifier or volume. The configuration values applied to objects, volumes and modifiers are newly collected in the following order:

  1. Global parameters
  2. Object parameters
  3. Volume parameters
  4. Layer range parameters
  5. Modifier parameters
  6. Extruder ID by Multi-material painting

This is a breaking change, where in earlier PrusaSlicer versions modifier parameters were applied over object parameters, ignoring parameters of volumes, layer range modifiers and other modifier meshes with which they overlap #5986. This was particularly painful for multi-material prints, where an application of a modifier mesh to set an infill rate resetted the extruder ID to the object default one #2657 #3012 #6091. Also newly a "Default" extruder assigned to a modifier mesh or a layer range modifier does not change the extruder of the underlying geometry.

Mutual clipping of multi-material volumes newly respects the order at the object list while in the earlier PrusaSlicer versions the volumes were first grouped by an extruder ID and then clipped #3272 #3318 #4114 #5831. Please note that the clipping order was changed as well: The latter volume newly clips the former volume. This is a breaking change, however we believe it is worth it as the new order is natural especially for the chaining of modifier attributes.

Following bugs were fixed during the refactoring:

  • Modifiers applied over an object with contour simplification (parameter 'resolution') produced gaps inside an object along the modifier boundary #6451 thanks @supermerill for pointing out the issue.

Fuzzy skin #2010

We have ported the popular Fuzzy Skin feature of Cura into PrusaSlicer, thanks Cura team for keeping Cura open source. The Fuzzy Skin feature in PrusaSlicer works the same as in Cura: Fuzzification is applied to external perimeters only, hole perimeters may or may not be fuzzified. The perimeter is being resampled with a random step size and each new sample point is being shifted inside or outside of the perimeter by a random length. This simple algorithm produces surprisingly nice results suitable for tool handles or just to give the print surface a new interesting look or to hide print imprecisions. Read more in the Documentation.

fuzzy_skin_image

Multi-material wipe tower

  • Soluble filament is known to not bind to other materials well. Thus for the wipe tower stability, PrusaSlicer newly does not use soluble filament for wipe tower perimeters or wipe tower sparse infill #1948.
  • Soluble filament is known to not bridge well. Thus PrusaSlicer newly never wipes a soluble filament over a sparse wipe tower, but it prints a dense layer of non-soluble filament at the layer below for the soluble filament to stick to #2818.
  • Wipe tower first layer is newly printed with non-soluble material if possible by reordering the 1st layer extrusions to start with the soluble material, thus the soluble material will not be purged at the 1st layer #3953.
  • Fixed an issue where the travel speed was not used when moving from a custom tool change position to the wipe tower #5483.
  • Wipe tower 1st layer is newly extruded with first_layer_speed.
  • Improved placement of extruder priming regions on circular beds #6459.
  • Before moving to the wipe tower, filament is newly retracted using a normal retraction length, while it was retracted using the tool change retraction length before.
  • Wipe tower brim width is newly adjustable.

Support for 3DLabPrint airplane models

PrusaSlicer newly supports slicing of 3DLabPrint airplane models. These 3DLabPrint models were designed to be sliced with Simplify3D with a single perimeter and no infill to produce a single perimeter wing surface reinforced by single perimeter ribs. From the solid geometry point of view, these models contain overlapping bodies, thus they are not valid solid models. After the model is sliced, polygons in each layer are merged and further processed with a Clipper library by most of the FDM slicers, including PrusaSlicer, Cura and most likely by the closed source Simplify3D as well, however the slicers differ in what fill rule they apply by default. Simplify3D always uses the Even-Odd fill rule, while Cura and PrusaSlicer use the Positive fill rule by default. To allow slicing the 3DLabPrint models, PrusaSlicer implements a new "Slicing Mode" option, allowing one to switch between the "Positive" (default) and "Even / Odd" rule. Yet another new "Slicing Mode" option "Close Holes" makes PrusaSlicer to fill in all internal structures #3062 #3708.

Sequential print

  • When sequential print is active, there is always a risk that the print head will hit some of the objects. It is possible to set extruder clearance distance and height so that PrusaSlicer would check for possible collision. The clearance areas are now also visualized in the scene when moving objects around and in case of a collision #4195.

seq_print_limits

  • Because we do not support Color Print with sequential print, we newly indicate the fact by showing the "Color Print" icon at the vertical slider of the G-code viewer grayed out and we also newly show a tooltip explaining why the action is not available #5437.
  • Aligned seam did not work correctly when printing sequentially bd2cbea

G-code generator, firmware flavors

Support of modern Marlin firmware

Prusa's MK2 and MK3 printer firmware is running on an 8-bit Atmel microcontroller and it is based on a heavily modified legacy Marlin, while the Prusa3D Mini printer and our upcoming 3D printer models are equipped with 32 bit boards running Marlin 2 as a motion controller. Until now, PrusaSlicer produced G-code for the legacy Marlin firmware only. We newly split the Marlin firmware flavor to 'Marlin (legacy)' and 'Marlin 2' to be able to support new Marlin 2 features, above all the more fine grained acceleration control, separating the acceleration while traveling from acceleration while extruding #1089 #1994 #6457.

With the 'Marlin (legacy)' firmware flavor active, M204 Pa Rb Ta is emitted at the G-code preamble, where a, b are the values from machine limits, while M204 S... is emitted for feature type dependent acceleration settings. With the 'Marlin 2' firmware flavor active, M204 Pa Rb Tc is emitted at the G-code preamble, where a, b, c are the values from machine limits, while M204 P... is emitted for feature type dependent acceleration settings, not overriding the travel acceleration.

Other new features

  • Added new parameter to enable / disable gap fill. Until now one was able to disable gap fill by setting gap fill speed to zero, which was counter intuitive #2956 #5999 thanks @xorza.
  • One may newly set the travel speed for the Z axis independently from travel speed in other axes. The new "travel_speed_z" configuration value defaults to zero, meaning that the "travel_speed" is used instead, thus being backward compatible with the old profiles and project files #2945 #3995 #6365 #6369 thanks @martinbudden.
  • RepRapFirmware specific: Use "M204 P" instead of "M204 S" to control acceleration #5740 thanks @rsobik.
  • PrusaSlicer newly generates M73 code with the remaining times to the next color change or pause print event. The remaining time G-code M73 has been extended with two new remaining times: Cxx and Dxx for normal vs. stealth (silent) printer mode.
  • Added macro processing of color_change_gcode, pause_print_gcode and template_custom_gcode custom G-codes when emitting them into the output G-code. #5782
  • Added new placeholder for custom tool change gcode (toolchange_z), which provides Z coordinate of the tool change at the top of a wipe tower, while layer_z provides the Z coordinate of the last object layer printed. The two Z coordinates differ in case the wipe tower was generated without sparse layers #3834.
  • G-code post-processor is newly executed before the G-code is copied to the target location. Indeed, running a post-processing script on SD card is not a good idea. Please note that the G-code viewer still visualizes G-code before post-processing #6000 thanks @xorza.
  • G-code post-processor framework has been extended: #6042
    1. New environment variable SLIC3R_PP_HOST contains one of "File", "PrusaLink", "Repetier", "SL1Host", "OctoPrint", "FlashAir", "Duet", "AstroBox" ...
    2. New environment variable SLIC3R_PP_OUTPUT_NAME contains the name of the G-code file including path (for SLIC3R_PP_HOST == "File") or a name that will be given to the file after it is upload to the host (PrusaLink, Octoprint ...)
    3. The post-processing script may suggest a new output file name (likely based on SLIC3R_PP_OUTPUT_NAME) by saving it as a single line into a new "output name" temp file. The "output name" file name is created by suffixing the input G-code file name with ".output_name".
  • Configuration stored into G-code is newly delimited with "; prusaslicer_config = begin" and "; prusaslicer_config = end". These delimiters look like any other key / value configuration pairs on purpose to be compatible with older PrusaSlicer versions trying to parse configuration from G-code. The G-code viewer reads the "; generated by PrusaSlicer ...." header and if the G-code was generated by PrusaSlicer 2.4.0-alpha0 and newer, it expects that the configuration block is enclosed by the new delimiters. This makes the G-code parser more robust going forward and G-codes can now be loaded by the G-code viewer even if an OctoPrint plugin adds its own comments at the end of the G-code after PrusaSlicer's configuration #6730.

The following G-code generator bugs were fixed:

  • PrusaSlicer emits various annotations for its own use, namely to augment the G-code for viewing. For example, layer height could not be guessed from the G-code reliably for bridges or for layers over supports, thus PrusaSlicer emits ";HEIGHT:xxx" when the current layer height changes. There is a risk however, that the user may enter the same annotation into some of the custom G-code block thus confusing the G-code viewer. The PrusaSlicer newly checks for the reserved comments in custom G-codes and isses a warning both when such a G-code comment is entered into custom G-code parameter and when a G-code is produced using such a questionable custom G-code block #5538.
  • Fixed an issue in "avoid crossing perimeters" with the extruder wipe enabled, where there were unnecessary travels produced in the opposite direction of the wipe travel 8f293f0. 613f961
  • Fixed a bug in fan speed ramp up formula #5893.
  • Fixed initialization of the random number generator for the custom G-code macro processor #5219(comment).
  • Fixed first layer slow down in case the "autospeed" feature was enabled. Fix merged from upstream slic3r, thanks @alranel #5829.
  • Fixed hang-up with very low infill rates due to rounding to zero followed by a division by zero #5910.
  • Reworked the skirt generator to generate skirt just at non-empty layers (layers that actually extrude object or support) and to respect minimum layer height. Skirt generator stops at the first layer where those two conditions cannot be met simultaneously. #5652.
  • Fixed unnecessary splitting of solid fill surfaces. This was a regression issue introduced in PrusaSlicer 2.3.0 during the implementation of infill anchoring #4437 #5988.
  • Fixed application of painted seams in case the painted triangles were strictly vertical.
  • Fixed "Iron all surfaces" feature #5703.
  • Fixed G-code export for "No extrusion" firmware flavor by not emitting the E axis. The fix is partial as no extrusions are shown by the final G-code preview #6023.
  • Fixed unreliable application of filament overrides to custom G-code sections. Sometimes the main config value was used instead of a filament override and vice versa #3649.

G-code viewer improvements

The following new features were implemented for the G-code viewer:

  • The G-code newly supports visualization of seams #6755.
  • The G-code viewer also newly supports visualization of the G-code snippet centered around the active G-code line. The G-code snippet is shown once the extruder position is moved using the horizontal slider.
  • A current G-code line number is now shown now at the horizontal slider instead of an index of a move #5611.
  • Extrusions produced by the custom start G-code were not visualized as extrusions, but as travel lines. They are newly displayed correctly as custom extrusions and they are visualized as if extruded at the 1st layer independent of their Z position and extrusion height.
  • The G-code may be newly colored by the temperature of the active extruder #4402 #6106 thanks @combolek.
  • The printing time of the first layer is newly available at the G-code legend #5763.
  • Filament used (length and weight) per extruder and per Color Change interval is newly shown at the G-code legend #2825 #5980.
  • The G-code legend may not fit small screens, thus it has newly been made scrollable.

The following bugs were fixed:

  • The used filament weight and cost are newly correctly shown for PrusaSlicer generated G-codes by the stand-alone G-code viewer by parsing the filament density and cost from the G-code config section.
  • Prusa's own G-codes Tc, Tx and T? specific to Multi Material Upgrade (MMU) no more produce warnings to the console #6006.
  • PrusaSlicer generated G-codes are now imported correctly even if the G-code is prefixed with an additional header, for example generated by ArcWelder #6117.
  • Extended the G-code processor to read G28 (move to origin) #5843.
  • Improved compatibility with newer Simplify3D G-codes by extracting the print bed size from their G-code.
  • Similar to the Marlin 2 firmware, RepRapFirmware expects M204 P instead of M204 S to set the acceleration while extruding #5599 #5740 thanks @rsobik.
  • Fixed configuration pop-up menu of the horizontal slider - enabling / disabling "Show estimated time" and "Show object height" did not work correctly #6650.
  • Multi-material specific: Horizontal slider did not work correctly with "No sparse layers" enabled for the wipe tower, where the wipe tower layers are not necessarily extruded at the same height as object layers. This is now solved by starting a new "layer" at the vertical scroll bar every time the print Z changes (Z is lowered down to a sparse wipe tower or Z goes up back to top of an object) #6232.
  • Improved parsing of Simplify3D G-code: Filament densities and diameters are newly extracted, allowing us to calculate used filament length and weight for S3D G-codes a2788f3.

Arrangement, SLA auto-orientation

  • Arrangement will now search for suitable rotation when arranging items larger than the bed 49c6ce7
  • Arrangement ignores objects which can't fit into a single bed, the user is notified when it happens c30ac4b
  • In PrusaSlicer 2.3.0 we have changed the SLA auto-orientation algorithm. Some users were not happy about the change, thus we newly provide a configuration dialog at the Rotate gizmo allowing one to select the auto-orientation algorithm. #5714

optimize_orientation

SLA improvements and bugfixes

  • Cancellation of slicing was very slow when attempted during rasterization step. This should now be fixed. #6253
  • Exporting STL function no longer produces inverted normals when mirroring is applied #6406 978b359
  • SLA preview now does not show full object when slider is at 1st layer c54ce89
  • Trimming after hollowing in SLA mode e57eca0 82954ba
  • SLA Drill holes are now drilled one by one and a warning is displayed when the operation fails. This will hopefully increase robustness when dealing with complicated or broken meshes. 4b9de03 .. 3e5e020
  • A notification to save changes first is shown when attempting to slice or save the project during SLA support points editing. 3fd36f0 7057348
  • Fixed a possible crash when deleting an object during SLA support points editing (bug introduced between 2.2.0 and 2.3.0) #5736
  • macOS specific: Backspace in SLA gizmo now deletes selected points (like a delete would) and not the whole object, which was quite unexpected. b30a6d5

Project state #5671 #6212 #5998 #6473

Due to technical limits of internal architecture inherited from original Slic3r, PrusaSlicer did not have any concept of opened project. That is, it did not track whether current plater contents was modified since it was loaded etc. This led to desperate moments when a user closed the application and instead of being asked about unsaved changes, they would all be discarded without a warning.

This release introduces this concept of edited project. When a 3MF is loaded and the objects are modified, an asterisk is shown in the title bar as an indication of unchanged changes in the project. This disappears after the changes are saved. Attempting to close the application, to open another project etc will open a dialog about whether the changes should be saved first.

The currently edited project is reset to an empty project when a new project is created (File->New Project). A confirmation dialog is shown when there are unsaved changes in current project. While the plater content is still recoverable by Undo after opening a new project, the link to the previously opened project will not be recovered and the objects will be considered as parts of the new (unsaved) project. The same applies to 'Undo/redo', i.e., it undoes the action but does not change the correspondence to a project, so when you for example open project1, move object, open project2, undo and save, the content of project1 will be saved into project2. Also, creating New Project does not affect modified profiles.

Modifying configuration parameters in selected profiles is also considered as a change in the currently active project. When attempting to close the application with such an unsaved change, the user would again be asked whether to save the project. In case they select 'Yes', the modified profile will be saved into the 3MF and the application will close. However, answering 'No' will close the unsaved project and the "Unsaved changes dialog" (introduced in PrusaSlicer 2.3.0) will pop-up asking whether the modification of the profile should be saved (not into the 3MF, but into the profile).

Moving the object below the print bed #1513

We are newly allowing an object to be moved below the print bed to print just the part of the object above the print bed. Arguably this was already doable with the "Cut" tool, but the new way is much simpler to use and very handy for example if one just needs to flatten the bottom of an uneven object to be printable without a raft. We do not allow the object to be lifted above the print bed: Elevated objects are not printable without a raft and supports. If an object is not flat, raft shall be enabled for the object by the user.

An object is either on the print bed or below the print bed. If an object is on the print bed, the software behaves as before: After rotating and scaling, the object Z position is adjusted to touch the print bed. On the other hand, if an object is partially below the print bed, scaling and rotation does not change object's Z position as long as the object is not elevated above the print bed. If an object is elevated above the print bed, it is again lowered to touch the print bed. There is also a new button "Drop to bed" at the object manipulation panel to move the object back to the print bed, however the same action may be done just by elevating the object above the print bed with the move gizmo and letting it drop back to the print bed.

If the object is partially below the print bed, a white contour is drawn along the object - print bed intersection to indicate where the object will be trimmed. When manipulating the object with a move / rotate / scale gizmos or when hovering over the object with a mouse cursor, the white intersection contour is drawn not clipped by the object to make it easier to flatten an uneven bottom of an object.

When in painting gizmo, the part below the print bed is being clipped and painting on the print bed clipping plane is not allowed.

Moving objects below print bed is not allowed in SLA mode for now as it would make the placement of SLA supports confusing. Thus when switching from an FDM printer to a SLA printer, all objects below the print bed are being lifted to touch the print bed.

Automatic Color Print for signs

After slicing a sign object, a notification is newly shown in the G-Code preview informing that the object looks like a sign and that one may want to use the Color Print feature to manually switch the filament. If one agrees with the suggestion by clicking on the notification hyperlink, the color change events are inserted into the vertical scroll bar.

auto_color_change

This feature was proposed by @richrap, thanks for the suggestion.

Shape Gallery #6703

We have implemented a Shape Gallery offering both system shapes distributed with PrusaSlicer installation and user shapes installed into user's configuration directory. The Shape Gallery could be used to insert a shape on the plater, as an additional part of an object or as a modifier similarly to how a built in shape (cube, cylinder, sphere) has been inserted by earlier PrusaSlicers. The Shape Gallery could be used for example to emboss a recycling code to the bottom of an object #4349, for loading Mickeymouse brims to augment brims etc. STL and OBJ files may be loaded by the "Add" button or by drag & dropping into the Gallery window. A thumbnail is generated for a user shape automatically, which is saved as an PNG image file, however the user may want to replace the generated thumbnail image with her/his own.

The Shape Galery is not available in Simple mode.

Windows Dark Mode #4493

Based on the popular request, we have implemented Dark Mode for Windows and we have also fixed the High Contrast mode #3038.

While PrusaSlicer supports dark mode on OSX and Linux for some time already, Dark Mode on Windows was the one from the hard basket. PrusaSlicer's user interface is implemented using a wxWidgets multi-platform library, which wraps around the native controls the platform provides. On Windows, wxWidgets wrap around the aging Win32 controls, for which there is no official Dark Mode support provided by Microsoft since the introduction of the Dark Mode into Windows 10 in fall 2018. Unfortunately Microsoft just implemented an undocumented API for the controls used by Windows Explorer to switch to Dark Mode. If a Win32 control is not used by Windows Explorer main window, it is not Dark Moded and it never will be, and the API for those controls that are supported is not official, thus it may be changed without notice.

We have done our best using the undocumented Dark Mode API and skinning of Win32 controls. We even implemented our own replacements for some Win32 controls, which were not skinnable, for example the tabbed notebook that we use to switch between the Plater / Print / Filament / Printer profiles (this one fixes speed of switching the tabs on 4k displays #6309). Still some of the controls are not skinned properly, for example the scroll bars, status bar or the spin control buttons, thus PrusaSlicer may not look quite polished in Dark Mode. Therefore for now we decided to not switch PrusaSlicer into Dark Mode following the Windows system settings, but we are letting the user to select dark mode from Preferences using the "Use Dark color mode (experimental)" checkbox.

We were inspired by the Notepad++ effort, which released its Dark Moded version just recently. We are using source code borrowed from Notepad++ interfacing with the unpublished Dark Mode API, which is based on this project. As far as we are aware of, Notepad++ is the only Win32 open source application which implements Dark Mode to a reasonable extent.

As an alternative to the "tabbed notebook" control to switch between the Plater / Print / Filament / Printer profiles, we newly allow these tabs to be placed into the application menu, which may be welcome on small laptop screens.

windows_dark_mode_image

"Did you know" aka "Tip of the day" notifications

PrusaSlicer grows more powerful every day offering many unique features not found in other slicers. To streamline everyday slicing, many features are accessible through hot keys and keyboard modifiers (Ctrl / Alt + mouse key). We newly present "Did you know" hints inside a notification, often providing a hyper link to highlight a user interface element (toolbar button, configuration parameter) or to open a help page in web browser. The tips may be disabled in preferences, however we believe you will find them useful.

did_you_know_image

Upload progress

Many of our users run a small or not so small print farm, thus they may use a single PrusaSlicer session to slice and upload G-codes to multiple 3D printers in succession. To better support this workflow, we implemented the following improvements:

  • The existing "Print Host Upload Queue" dialog newly supports sorting by columns and a file size column has been added.
  • Size and position of the "Print Host Uplad Queue" dialog is newly persistent.
  • A notification is popped up in the 3D view for each upload task initiated showing an upload progress. Thus in most cases one will not need to open the old "Print Host Upload Queue" dialog at all.

upload_progress_image

Mesh simplification

Sometimes the model imported into PrusaSlicer is excessively detailed, slowing down speed of user interaction, slicing and producing project files (3MF/AMF) of excessive sizes. We newly provide a model simplification tool based on Quadric Edge Collapse algorithm, thus our implementation produces similar results to Microsoft 3D Builder model simplification or to MeshLab Quadric Edge Collapse simplification tool. The simplification rate is controlled either by required level of detail (which internally uses estimates of maximum geometric error with respect to the original model) or by the fraction of triangles to be removed.

A very high simplification rate may be used to achieve a "Low Poly" effect.

upload_progress_image

Other UI improvements

  • Confirmation dialog on "Delete All" was removed, it now works the same way as if the objects were removed one by one. The confirmation dialog had its purpose until Undo / Redo was implemented #3886.
  • In addition to reloading an existing object or volume geometry from disk, PrusaSlicer newly allows to replace the geometry with a different file #3856.
  • PrusaSlicer newly displays the decimal separators according to user's locales, while a dot was displayed before.
  • "Split to objects" feature newly supports splitting a multi-volume object into multiple objects, while this feature used to split just a single volume into multiple objects before. If the object has multiple volumes, its volumes are assigned each to its own object. First after the object has a single volume only, "Split to objects" will split a volume into multiple disconnected objects if possible.
  • Added border to filament color in right panel combo box to improve visibility of light filaments. #5914, thanks @scottmudge.
  • Added possibility to compare configuration profiles (Window->Compare presets) 4cdcfe6
  • Added hot keys "1-9" for assigning an extruder number to an object or a volume with the keyboard focus at the object list, "0" assigns the "default" extruder. Similarly, a new hotkey "p" toggles the "printable" flag of the selected objects or volumes. #6216.
  • The "Printable" menu item is newly available for multiple object selection as well 3a53606.
  • macOS specific: Enabled the platform standard "Cmd+M" hot key to minimize the application. The "3DConnexion legacy set sensitivity dialog" hot key was changed to "Cmd+Shift+M" on macOS.
  • The background of the XYZ fields in the "Object manipulation panel" may newly be colored with the color of the gizmo axes (red, green, blue). Configurable in Preferences by "Use colors for axes values in Manipulation panel", disabled by default #4931.
  • Once the user paints support enforcers and supports are not enabled, a notification is newly shown suggesting to enable supports by clicking on a hyperlink #5307.
  • Fixed minor text alignment issue in G-code viewer vertical scroll bar #6182.
  • Multi-material specific: The "Color Change" dialog newly allows to generate random extruder swap sequences, producing a rainbow effect #1866.
  • Settings of colors indicating the difficulty of configuration options (Simple / Advanced / Expert) was moved to Preferences to be easy to discover #5489.
  • With the paint-on supports gizmo inactive, it is not clear whether an object has any supports painted. The similar applies to the painted seams, multi-material painted segmentation or variable layer height features. If any of these tools were used on an object, the fact is newly indicated at the object list by an extra line (clicking this line opens editing of the respected property, Del key can be used to remove it). Similarly it is indicated at the object list if an object is partially below the print bed (this is a new feature in PrusaSlicer 2.4.0-alpha1). In addition, we open a notification after loading a project indicating which of these features were applied to at least a single object.
  • Updated MK2 & MK3 textures 57a73c5
  • Linux specific: PrusaSlicer defines icons for many menu items, however many Linux desktops are configured so that no menu icons are shown by GTK2/GTK3 based applications, most likely because these icons are often huge. PrusaSlicer newly forces GTK2/3 to always display its tiny icons in its menus ignoring desktop defaults.

Other new features and improvements

  • Zipping 3MFs now uses ZIP64 format, thus our 3MFs are no more limited to 4 GB of uncompressed file and total archive size. Because Microsoft 3MF implementation does not support ZIP64, we only use the ZIP64 extension if necessary #6193.
  • Windows specific, upload to print host: If the upload is secured using a self-signed SSL certificate, the Windows system often refuses the self-signed certificate because it cannot check its revocation. PrusaSlicer newly allows one to suppress the revocation check #1781.
  • Linux specific, also applies to Linux on Chrome OS: Desktop integration support (conditionally compiled) allows one to install desktop integration files (PrusaSlicer.desktop, PrusaSlicer-gcodeviewer.desktop and the icons) into user's desktop. The desktop integration is offered by the installation wizard and desktop integration may also be installed / deinstalled manually from the Configuration menu. Manual desktop integration is quite useful if one experiments with multiple AppImages of different PrusaSlicer versions, the last one for which the desktop installation is performed wins #1431.

Bugs fixed

UI bugs fixed

  • OSX specific: Fixed handling of spin controls at the Purging Volumes dialog, the spin control values were sometimes not accepted #6056.
  • Multi-material specific: Fixed crashing after decreasing number of printer extruders and accessing object popup menu #6094.
  • Fixed inconsistency when copying an object, which is marked as not to be printed #5619.
  • Linux / GTK specific: Fixed asserts emitted by the Platter preset combo boxes #5510.
  • Linux / GTK specific: Fixed assert in installation wizard, on filament selection page #5152.
  • Multi-material specific: After deleting all but the last volume from an object, the object's default extruder is newly initialized with the extruder of the last volume remaining. This has not been done before leading to the object being sliced with the extruder of the volume, while just the color of the object's extruder was shown in the object list. 03dee86
  • Linux / GTK specific: Fixed the "view" combo box at the bottom of the screen, which centered the active item around the mouse cursor, thus often pushing most of the combo box items out of the screen. This is an unfortunate behavior of GTK Choice control, which we have now replaced with a Combo Box control #6110.
  • Fixed installation wizard issue newly introduced in wxWidgets 3.1.4, where the spin controls to define nozzle and filament diameters did not accept commas. Worked around by replacing these spin controls with text inputs.
  • Linux / GTK specific: Fixed surprising opening of an edit field when one pressed a letter key with the object list focused b87c03f.
  • Fixed a rare crash when deleting last object from plater 0c7095d.
  • Windows specific: Fixed focus issue after closing a "parameter validation error" message box and returning the focus to the parameter page 3c37aed.
  • Linux / GTK3 specific: Fixed insufficient height of combo boxes on the plater side panel #5163 #5505.
  • Fixed copy / paste of multiple objects with different attributes assigned (for example with different infill rate) leading to "Unsupported Selection" error #5517.
  • Fixed extrusion width validation logic in case the extrusion width was specified wrt. layer height #4631.
  • Fixed updates of combo boxes: Enter key did not make the combo box to accept a new value, thus the slicing back-end was not being updated #6692.
  • Fixed crash when trying to open a pop-up menu of one modifier while parameters of another modifier were editable at the side panel. This was a regression since PrusaSlicer 2.3.0 #6782.
  • With the settings configured as floating in its own non-modal window and with the non-modal window minimized, selecting a settings page with the Ctrl-2/3/4 hot keys or from the PrusaSlicer menu did not restore the minimized window. This is now fixed #6548.
  • Installing / uninstalling filaments or SLA materials using the Configuration Wizard did not work reliably #6436.
  • Fixed a glitch, where editing the top solid infill type and speed was disabled in vase mode #4241.

Presets

  • Fixed a loophole in PrusaSlicer, where the user was allowed to save his own profile name under the name of a system profile alias (aka symbolic name). For example, user was able to save the "0.2mm QUALITY @MK3" profile as "0.2mm QUALITY" user profile, which is the symbolic name of the system profile #5638.
  • Fixed a crash when importing a config bundle as a config file. This was broken for multi-material configs with different filament profiles selected. #5825
  • Fixed reload from disk after a project is loaded from a 3MF. Reload from disk worked for a fresh project, but for a project loaded from 3MF the "reload from disk" feature did not reload a geometry at the same position and scale #5541.
  • Reload from disk was not available for geometries imported from a 3MF or AMF format (for example if the 3MF or AMF was exported from SolidWorks) #5071.
  • Fixed storing of "pause print" custom G-code message into a project file. The "pause print" message was correctly emitted into G-code for a fresh project, but not after the project was loaded from 3MF #5888.
  • Fixed activation of printer specific "default" print / filament / sla print / sla material profiles after the first printer ever is installed by the Configuration Wizard.
  • Fixed storing / loading of the list of Printer profiles associated with a Physical Printer profile. Printer profile names containing semicolons or leading / trailing spaces were not handled correctly. The list of printer profiles is saved using an old "preset_name" config key the old unreliable way for compatibility with PrusaSlicer 2.3.3. In addition the list of profiles is stored in a robust way using a new "preset_names" key #5503.
  • Implemented automatic conversion from meters to millimeters on loading of extremely small objects, which most likely were exported in meters. Also new menu items were added to convert from / to meters manually #4521.
  • Fixed loading of project files referencing system profiles, which are not installed at the target machine. In that case the old PrusaSlicer activated some random profiles, while the new PrusaSlicer temporarily installs the missing profiles until PrusaSlicer is closed and the user is being informed with a notification.

Other bug fixes

  • Windows specific: Fixed "Fix by Netfabb" for scaled volumes, which were scaled twice after they were fixed.
  • Windows specific: ASUS and MSI install applications, which use libraries from Nahimic. These Nahimic libraries are then injected into our PrusaSlicer on start-up and they lead to a crash of PrusaSlicer on start-up on some dual screen setups. We were not able to fix the issue as we were not able to get our hands on such a system, thus we implemented detection of black listed DLLs being injected into PrusaSlicer, we report them and advise to disable those services. Also the black listed DLLs injected into PrusaSlicer are being shown by the System Info dialog #2142 #2522 #3689 #4793 #5091 #5573.
  • Linux specific: Fixed invocation of PrusaSlicer by referencing prusa-slicer binary with a $PATH variable or symlink #5542 #5751.
  • Fixed command line slicing with no printer technology (FDM or SLA) specified. Slicer should slice in FDM mode when no printer_technology is provided. This was broken between 2.2.0 and 2.3.0 (1bffc2b), where 2.3.0 sliced in SLA mode by default, but saved the output as .gcode #5029.
  • Fixed crash in arrangement when the polygons to be arranged contained duplicate points #5749.
  • Fixed parsing of --scale-to-fit command line parameter, reworked the scaling algorithm and placing objects to bed, which have been broken since PrusaSlicer 2.0. Also added a new command line parameter '--ensure-on-bed', which is 'true' by default: When an object is placed on the print bed, it is being aligned in Z to sit on the print bed, which corresponds to what the PrusaSlicer would do when an object is imported into the UI #5772, #6788.
  • Fixed crash when splitting models from command line using the '--split' command line parameter and empty meshes are created during the splitting #5979 #5991 thanks @combolek.
  • Initialization of PrintConfig derived classes was not thread safe #6475, thanks @supermerill for pointing out that issue.
  • Fixed deadlock when canceling the slicing while gcode is creating thumbnails #6476, thanks @supermerill for pointing out the issue.

New 3rd party printer profiles

  • Added gCreate gMax printer profiles, thanks @gordo3di

Localization

  • Dictionaries for CZ, DE, ES, FR, IT and PL were updated by Prusa Research. Contributors are welcome, please check the localization guide
  • Korean localization update #6314 thanks @ulsanether.

Architecture, infrastructure

  • We removed libglut dependency, which is one little step forward to deprecate legacy OpenGL.
  • We updated ImGUI to version 1.83 to support localized decimal separator (dot versus comma).
  • Windows specific: Enabling /utf-8 on MSVC should fix compilation errors on Chinese Windows #5583.
  • Windows specific: Visual Studio newly supports Address Sanitizer. PrusaSlicer newly supports ASAN builds on Windows using the -DSLIC3R_ASAN=on CMake switch the same way as on POSIX platforms.
  • We have fixed huge number of compiler warnings. We are striving to keep our builds warning free on all major platforms.
  • OSX specific: We increased the minimum required OSX version from 10.9 to 10.10 due to an update of wxWidgets, that does not compile on OSX 10.9.
  • CMakeLists was updated to require MINIMUM_BOOST_VERSION 1.66.0 due to Base64 dependency #3375 #5508 thanks @pmjdebruijn.
  • When compiling wxWidgets as a static dependency, wxMediaCtrl support is no more compiled in as we don't need it and wxMediaCtrl requires unexpected compile dependencies on Linux #5815 #6160.
  • Linux / GTK specific: Fixed compilation against wxWidgets 3.0 #5752 thanks @sebastianha.
  • Updated boost version from 1.70.0 to 1.75.0 due to an issue with newest Xcode / clang incorrectly reporting that it supports __cpp_lib_uncaught_exceptions while it does not if targeting older platforms. This issue has been worked around first in boost 1.74.0.
  • When building static dependencies, the dependency script used to always download sources from internet. Because the Linux / Snap build system prohibits internet connection, we extended the build system to build dependencies with no internet connection by specifying a DEP_DOWNLOAD_DIR pointing to required source code packages already downloaded.
  • Updated the Catch2 framework from v2.13.3 to v2.13.6, fixes compilation on Fedora Rawhide #6518 thanks @ausil.
  • Fixed boost dependency URL as the original host's lifetime has ended #6349 thanks @krisrok.
  • Some components of Thread Building Blocks (atomics, mutexes) were recently deprecated with standard library equivalents #6590 thanks @zavorka
  • Add a simple Windows command-line build script (#6674) thanks @jshuh
  • Linux specific: Fixed FHS install dirs #5930 thanks @dimitry-ishenko.

Documentation

Clone this wiki locally