PRINTURTLE

Python

WRITE → RUN → INSPECT → CHANGE → PRINT. Write some Python, press Run, look at the 3D model, change the code, then download the STL to print it.

3D design

Your model will appear here

Write some Python, then press Run. Drag to turn the plate, scroll to zoom.

Class print plates

Collect programs, then Build all. Auto-arrange fits models onto as many plates as needed.

No programs yet. Import .py files that students handed in with More → Save Python file, add the code in the editor, or collect designs as you make them in Quick make.

Selected model
Student’s Python

Each program is a separate model. Placement changes the STL; the original Python stays intact. Save a class pack to keep code and positions together.

Top view: X →, Y ↑. Select a name or drag its model. Spacing uses bounding boxes and a matching edge margin; irregular shapes may fit more closely in a slicer.

    Open day guide: keyrings, start to finish

    Plain keyring templates are printed before the event. On the day, each visitor designs what goes on top, and you print just the designs over the templates still on the bed. Everything below uses the default printer, a Creality CR-6 Max, with PLA.

    1 Before the day

    1. Printer settings. In More → Settings, check the printer is Creality CR-6 Max (400 × 400 × 400) and the profile is CR-6 Max – PLA (recommended). The keyring batch profile is there too.
    2. Level the bed. On the printer, heat the nozzle and bed, clean the nozzle tip, and run a full bed levelling (mesh). Printurtle's files load that saved mesh with M420 S1; they never probe the bed when parts are on it.
    3. Pause command. The two-colour keyrings pause with M600. If your printer ignores it, choose M0 in Settings → 3D printer and G-code → Pause command.
    4. Test print. Print one keyring with a raised name (Quick make → Make it and set up printing) and watch the priming line, the first layer and the pause. If no plastic comes out at the priming line, see Problems and fixes below.
    5. Every laptop: open printurtle.vercel.app and press Settings → Make available offline, so the stand keeps working if the Wi-Fi drops.

    2 Print the templates

    1. Press Open day at the top. Choose the template: the keyring tag, medium, with a printed hole is the classic. Words for everyone on the back, such as OPEN DAY 2026, are optional.
    2. Leave Where does your printer touch the bed… on The middle of the bed for a CR-6. That spot is kept clear, so the designs can be printed later even if the printer has been switched off.
    3. Choose how many. Up to 94 keyring tags fit; each takes about 20 minutes including ironing its top, so 30 take roughly 10 hours. The G-code dialog shows the time for your plate.
    4. Press Make template G-code…, then Make G-code, watch it in the player and download it. Copy it to the SD card and print it.
    5. Leave the templates on the bed and don't move the bed. Press Save plan to keep a copy of the plan on a USB stick.

    Use Printurtle's G-code for the templates: the designs are sliced on exactly the same layers, so their first layer lands on the templates' top.

    3 Visitors design their keyring

    1. In Open day, press Design the next keyring (or tick Open day mode). From then on Quick make is a full-screen page that designs onto the templates. Open printurtle.vercel.app/?openday for the stand page, or ?kiosk for Quick make with bigger buttons. Use Back to full editor when you need the ordinary workspace. Untick the box after the event.
    2. The visitor picks what goes on top (a name, an icon, pixel art, binary…), chooses its colour and types their name. The 3D view shows it on the template.
    3. Add to the open day plate puts the design on the next template and tells them its number. Press Next person.

    Designs are collected in the browser that took them. Collect on one laptop, or press Save plan there and Load plan on the laptop connected to the printer.

    4 Print the designs over the templates

    1. Open Open day. Under Print the designs over the templates, choose Designs not printed yet and press Make G-code for the designs….
    2. Press Make G-code. The player shows the designs being drawn on the templates. Download the file and copy it to the SD card.
    3. Load the filament for the designs (white shows up well on a coloured template) and start the file. It heats up, homes at the clear spot in the middle, loads the bed mesh and prints only the designs.
    4. Press Mark these as printed. As more visitors design, repeat this for the next batch.

    5 Hand them out

    1. Let the bed cool a little, then lift the finished keyrings off. Each template's number is on the plate view in Open day, so you know whose is whose.
    2. Thread a 25 mm split ring through the hole.
    3. Any file can be made again later: in the G-code dialog, Copy a download link keeps a link with the design and every setting inside it. It works on any computer, whatever happens to a server.

    Problems and fixes

    The nozzle moves but no plastic comes out (not even the priming line)
    Every file starts by pushing filament slowly just above the priming line, with Priming – plastic should come out now on the screen. If nothing appears there, stop the print: the filament is chewed or the hot end is blocked, and no file will print until that is cleared. Heat the nozzle to 210 °C, press the extruder arm and pull the filament out, cut it off above any chewed or flattened part, check the white tube is pushed fully into the hot end and its clip is in, then feed the filament back until plastic flows from the nozzle. If it will not flow by hand, do a cold pull or change the nozzle. Cancelled prints leave the filament in an unknown state, which is why the priming is slow.
    “Print 2 starts lower than the top of an earlier print” or “can't be made as a separate file”
    Something went wrong with an older file that had a raised screw-eyelet pad. Current Printurtle eyelets are flush with the tag, including Open day. If a separate-file print still fails, use one file with a pause, or the printed hole. For no-tools nights, prefer the printed hole over screw eyelets.
    The designs don't stick to the templates
    Keep the bed warm (60–62 °C), don't touch the templates' tops, and check the first layer of the designs goes down. A little more first-layer squish helps: lower the first layer speed in Settings.
    The designs are in the wrong place
    The templates or the bed moved, or the templates were printed with another slicer or different layer heights. Print the templates with Printurtle and don't move them.
    The printer was switched off between the two prints
    Fine, as long as The middle of the bed was chosen when laying out the plate: the designs file homes at the clear spot. If you chose Nowhere, keep the printer on.
    The printer didn't pause for the second colour
    Your firmware may not support M600. Choose M0 (or PAUSE on Klipper) as the pause command in Settings.

    Learn with Printurtle

    Quick make

    Three steps: set up the base, choose the layer that goes on top of it, then decide how to print it. You get ordinary Python in the editor, so you can change anything afterwards.

    Step 1 · The base

    What are you making?

    How does it attach?

    Engrave the base

    Size

    Step 2 · The layer on top

    What goes on top?

    Shape of the name
    Base colour
    Top colour

    Step 3 · How it prints

    Pick a base and a topper, then press Make it.

    Examples

    Opening an example replaces the code in the editor. Save your work in Projects first if you want to keep it.

    Challenges

    Pick a challenge. Printurtle checks your model against the success criteria every time you press Run.

    Projects

    Your projects are saved in this browser on this computer only. They are not sent anywhere.

    Version history

    Printurtle saves a version every time your program runs successfully. Restore one to go back to a design that worked.

    Help

    Commands

    Python basics

    Shortcuts

    Print time & material

    Rough planning estimates for the current geometry. Printer dimensions alone do not determine speed. Compare these scenarios, then use your slicer for a more reliable time.

    How the estimate works & what it excludes

    Walls and skins are approximated from surface area × wall count × line width × 0.65, capped at solid volume. Remaining volume uses the chosen infill. Line width is 1.1 × nozzle size. Support allowance adds a percentage of this material; it does not detect where supports are needed.

    Extrusion time uses volume ÷ the lower of speed × line width × layer height or the flow limit. Travel and slowdowns add 35%, plus 2 seconds per layer and 0.5 seconds per extra model per layer. A whole plate shares its warm-up and uses the tallest model’s layer count.

    The range uses 60–160% of calculated printing time, plus warm-up. It is a heuristic range, not a measured confidence interval. Small details, acceleration, cooling, bridges and actual travel paths can take longer. Brims, rafts, purge waste, multicolour changes and electricity are excluded. Filament cost only; settings here do not change the model or STL.

    Settings

    Printer build volume (mm)

    Used to warn you when a model is too big for the printer.

    Working offline

    Store Printurtle and Python in this browser so it keeps working if the network drops. Do this once, on each machine, before a lesson or an open evening.

    Checking…

    Printing and running
    3D printer and G-code

    Everything the built-in slicer uses when it makes G-code: temperatures, layers, speeds, flow, retraction, brim, and how a base and the print over it are printed. The G-code dialog shows the same settings.

    Make G-code

    1 Settings for this print

    Change settings – printer profile, material, layers, speeds, retraction, brim, pauses…

    The same settings as Settings → 3D printer and G-code. Changes are kept for next time.

    ✓ Make it

    G-code goes straight to the printer on an SD card. Prefer PrusaSlicer, Creality Print or Orca? The 3MF keeps every print in place, and PrusaSlicer also picks up the colour change where print 2 starts.

    A link to this program

    Anyone who opens this link gets a copy of the program in Printurtle, built and ready to change. The program is inside the link itself: nothing is uploaded or stored anywhere.

    Use with VS Code for Education

    Pupils can write their Printurtle programs in a VS Code for Education Python project, run them there, and click a link to see the model here. The same program runs unchanged in both places.

    1. Add Printurtle's commands to the project. In the project, create a new file called printurtle.py and paste this in. It is set up to send pupils' programs to .
    2. Start each program with the import, and end it with show().
      from printurtle import *
      
      name = "SAM"
      box(50, 22, 4)
      goto(7, 11, 0)
      hole_cylinder(2.6, 4)
      goto(30, 6, 4)
      text(name, size=9, height=1.2, align="centre")
      
      show()
    3. Run it. Mistakes are reported in VS Code for Education exactly as they are here. A working program prints a link: open it to see the model in 3D, check it will print and download the STL.

    Creating the file and pasting into it avoids VS Code for Education's upload size limits. Nothing is sent to a server at any point: the link carries the program to this browser directly.

    About Printurtle

    Printurtle turns real Python into 3D models you can print. It runs entirely in this browser: your code is never sent to a server.

    How it works

    Units

    One unit is one millimetre. STL files do not record units, so every slicer will read the file as millimetres, which is what Printurtle intends.

    This version

    Version
    Checking…

    Are you sure?