Contents
User Manual · v0.17.8

TinyMakerWifi

WiFi, wireless upload & over-the-air updates for the TinyMaker resin printer

by Viktoras Šidlauskas · @slibbinas · tinymakerwifi.com

The palm-sized TinyMaker MSLA resin 3D printer

1What this firmware adds

TinyMakerWifi is a modified firmware for the open-source TinyMaker MSLA (resin) 3D printer. It keeps everything the original firmware does and adds a wireless layer on top - so you can send models straight from your slicer and update the printer without ever touching the SD card or a USB cable.

Everything wireless can be switched off right on the printer (System → Advanced), so you can always fall back to plain, offline SD-card printing.

💡 Already have a printer running this firmware? Jump to Connecting to WiFi. If you are installing it for the first time, start at Installing the firmware.

2Quick start

  1. Power on. On first boot the printer opens a TinyMaker-Setup WiFi hotspot.
  2. Join it from your phone and pick your home WiFi in the little page that pops up. The printer reboots and connects (~5 s).
  3. Find the printer’s address under System → WiFi Info (or use tinymaker.local).
  4. Get a model onto the printer - three ways, pick one:
    • From PrusaSlicer - slice, then “Send to printer”.
    • From the dashboard - drop an STL into the browser slicer, let it slice, and it lands on the card ready to print.
    • By hand - copy an .sl1/.zip onto the SD card.
  5. Print. Pick the model in the Print menu and press OK - or start it from the web dashboard.

3Installing the firmware (first time)

This one-time step is done over USB. After it, every future update is wireless (see Updating the firmware). If your printer already runs TinyMakerWifi, skip this section.

Method 1 - the web flasher (recommended)

connect.tinymakerwifi.com/flash.php flashes the latest release straight from your browser - nothing to download or install:

🌐 Use Chrome or Edge. Web (USB) flashing needs the Web Serial API - Firefox and Safari don’t support it.
  1. Connect the printer to your computer via USB.
  2. Open the web flasher in Chrome or Edge (they support Web Serial; Firefox and Safari don’t).
  3. Click Connect and pick the printer’s serial port. Unsure which one it is? Unplug and replug the USB cable and watch which entry appears.
  4. Flash - the tool fetches the latest release by itself. Power-cycle the printer when it finishes.
🔌 Windows doesn’t see the printer? Install the CH340 USB driver (CH341SER.EXE, in the repo’s Driver folder), then try again.

Flashing fails with “ERROR: Timeout”

If the flasher connects, downloads the firmware and then dies partway through Writing firmware-full.bin, the transfer speed is almost always the culprit - not the browser. Work down this list:

  1. Lower the baud rate. The Baud rate dropdown on the flasher page defaults to 921600. Set it to 115200 and flash again. It takes a few minutes instead of about half a minute, but it copes far better with marginal cables and USB-serial chips.
  2. Swap the USB cable. Charge-only cables, and cables with thin data lines, are the second most common cause. Use a short, known-good data cable.
  3. Plug straight into the computer - not through a hub, dock, monitor or keyboard port.
  4. Update the CH340 driver (see the note above) - an old Windows-bundled driver produces exactly this symptom.
  5. Several ports in the picker? Unplug the printer, reopen the port picker, plug it back in, and choose the entry that appears.
💬 Still stuck after all five? Open an issue with the flasher log and the baud rate you used.

Method 2 - already running TinyMakerWifi?

Then you don’t need USB at all: update over WiFi from System → Update on the printer, or from the dashboard’s Settings → Update - see Updating the firmware.

Method 3 - manual flashing (fallback)

Download the latest firmware-full.bin from the project’s Releases page. Releases contain two files - they are not interchangeable:

FileUsed forHow
firmware-full.binFirst-time USB flashingflash at address 0x0
firmware.binWireless updates only, laterbrowser, http://tinymaker.local/update
⚠️ For the USB flash you need firmware-full.bin. Flashing firmware.bin over USB leaves the printer unable to boot - it has no bootloader or partition table.
  1. Open esptool.spacehuhn.com (a generic ESP flasher) in Chrome or Edge, plug in the printer via USB and click Connect.
  2. Remove any pre-filled rows, click ADD, choose firmware-full.bin, and set its address to 0.
  3. Click Program, wait for it to finish, then power-cycle the printer.
💡 The official Espressif Flash Download Tool is an alternative, and developers can flash a local build with esptool/PlatformIO - see the project README for the exact settings (SPI 40 MHz / DIO / 4 MB, file at 0x0).

The first boot after flashing takes a few extra seconds and starts the TinyMaker-Setup hotspot. Printer settings (exposure, layer height…) return to factory defaults - unless a settings backup is on the SD card: the printer then offers to restore everything on first boot (see Backup & restore).

4Connecting to WiFi

  1. Power on the printer. On first boot it starts a TinyMaker-Setup access point.
  2. Connect to it with your phone - a setup page opens automatically (or browse to http://192.168.4.1).
  3. Choose your home WiFi network and enter the password.
  4. The printer connects and briefly shows its IP address. Credentials are stored, so later boots connect on their own in about 5 seconds.
The TinyMaker-Setup captive portal as seen on a phone

On every later boot the printer shows animated signal bars while connecting - they turn green when it’s on the network, and the printer goes straight to the main menu (the IP address is only shown after the first-time portal setup). Need the address later? WiFi status, signal strength and IP are always under System → WiFi Info.

If the saved network can’t be reached, the printer simply boots offline after 15 s - printing from the SD card works as always.

Resetting WiFi

To move the printer to another network, erase the stored credentials:

5The printer screens

The small status display drives the whole on-printer interface - WiFi setup, upload progress, the resin estimate, the device toggles and self-update. Three buttons: Back, Up and OK. A green (connected) or grey (offline) dot on the main menu shows WiFi status.

A montage of the TinyMakerWifi printer screens: boot, WiFi setup, printing, the Advanced groups, unpacking an upload, the Statistics counters, the plate notes at both ends of the travel and the resin-not-set screen

The System menu is where the new features live: WiFi Info, Advanced (device toggles, grouped into Network / Resin / Display), Statistics (lifetime counters and the last boot/crash record), Update (firmware) and About (version and build info). The full item-by-item reference is in System menu reference.

The printer emulates the Prusa SL1 network protocol, so PrusaSlicer’s “Send to printer” works out of the box.

  1. Download the TinyMaker printer profile (TinyMaker.ini), then import it via File → Import → Import Config.
  2. Save all three presets. Click the floppy-disk icon next to Print settings, Material and Printer and accept the names. Imported presets are temporary until saved - skip this and PrusaSlicer forgets the printer every time you close it, and you start over.
  3. Add a physical printer: click the cog next to the printer profile → Add physical printer. Set Hostname to tinymaker.local (or the IP from System → WiFi Info); the API key can be any text.
  4. Click Test - it should report success (the printer must be on and on WiFi).
  5. Slice, then press Send to printer. The printer shows Receiving → Unpacking → Model ready, and the model appears in the Print menu.
PrusaSlicer: adding a physical printer pointing at tinymaker.local PrusaSlicer: the Send to printer button
⚠️ Always slice with the 0.05 mm profile. Maximum model size: 1200 layers = 60 mm.
Unlike an FDM slicer, the layer height here is set on the printer (Settings → Layer height), not in the file - the file is just a stack of 0.05 mm images, and at the 0.10 mm setting the firmware exposes every other one. Slice at anything else and the part comes out the wrong height: at 0.3 mm it would be six times too short.
♻️ Imported the profile a while ago? Import it again. The profile has changed since the early versions - the current one sets the screen the way the printer really uses it (display_orientation = landscape, 320×240 px over 40.8×30.6 mm). An old profile still slices and still uploads, but the layers come out turned, so the print is cropped at the edges and nothing on screen warns you.
💡 Layer height works differently than on an FDM printer. The printed layer height is decided by the printer’s own setting (Layer Height, in the printer’s Settings menu or the dashboard’s Settings tab) - not by the sliced file. The file is just a stack of 0.05 mm images: at the 0.05 mm setting the printer uses every image, at 0.10 mm it takes every other one. That’s why you always slice at 0.05 mm - the printer setting then chooses the real layer height, and a file sliced at 0.10 mm would print half-height.

7The built-in slicer (slice in the browser)

The firmware ships with its own SLA slicer, running right in the dashboard - no PrusaSlicer, no computer-side install, works from a phone too. Since 0.17.6 it is on from the start: the STL slicer card is already on the dashboard - press Open to unfold it. (If you would rather not have it, the switch is under Settings → Network → STL slicer in the dashboard.)

  1. Choose STL and pick a model file.
  2. Stand it the right way up. Two switches under the slicer settings decide how the slicer places the part: Fit by - flat lays it on its widest side, supports searches for the rotation that needs the fewest supports, the way PrusaSlicer does, and tells you how much bigger or smaller the part can print than with a flat fit; and Size - keep leaves your size (scaling down only when the part itself does not fit; if only supports reach past the plate, the size stays and the card warns that the edge supports will be cut), max makes it as large as the plate allows, up to 300 %. Changing either switch re-places the part at once. Lay flat, Flip over, Tilt 90° and Rotate 90° are there when you would rather decide yourself, and the Fit button on the 3D view puts it back the way the two switches say.
  3. Watch it slice - supports and a raft are generated automatically, and the dashboard locks under a spinner while it works, just like during a print.
  4. Check the result in the preview: 3D with or without supports, the flat 2D layers, or the UV view - each layer exactly as the masking LCD will shine it.
  5. Press Send to printer - the sliced model lands on the SD card ready to print, exactly like a PrusaSlicer upload.

Six settings sit under those buttons, and Reset to defaults puts them all back: Supports (no, regular or tree), Strength (light, normal, strong), Placement, Tip, Raft layers and Smoothing. You can slice without touching any of them - they only nudge what the slicer already decided.

Supports: no is for a part that is already flat or comes with its own supports from another program: nothing is added, the part is printed the way it sits in the file (only turned on the plate to fit), and the Strength, Placement and Tip settings lock. The raft is off by default; pick a raft size and it rings the base of the part. If the slicer module on the printer is older than 3.6.2, no stays locked until you update it under Settings > Update > Slicer module and reload the page.

💡 The raft is counted in layers, not millimetres, because layers are what decide whether the pad grips. Your file is always sliced at 0.05 mm and the printer decides how many of those images to expose, so the same setting is a different number of millimetres at a different layer height. The default is 3 layers; the choice is 2, 3 or 6. One layer is not offered any more - the pad does not bond to the part at all. Measured on this printer: a printed pad comes out about 0.15 mm thicker than asked, so 3 layers lands on the ~0.3 mm a PrusaSlicer plate gives, and lifts off with a spatula without force. And a thicker raft costs resin, not time: the pad thickens under the part, so the layer count stays where it was and only the resin grows. The exception is a part lifted off the plate - there the layers grow too.
A model sliced in the browser: the preview shows the part in orange standing on its raft with 180 support pillars in blue, and the slicer card reports the time, the layers, the resin and the supports it added
⚖️ The slicing itself is done by PrusaSlicer’s libslic3r, the same engine the desktop PrusaSlicer uses, compiled to run in your browser. It is used unmodified, under the AGPL-3.0 - see Credits.

The slicer itself is a module the printer keeps on its SD card: fetched once from our GitHub Pages, verified byte-for-byte against checksums the printer fetches over certificate-checked HTTPS, and served locally from then on. It survives firmware updates and works with no internet once cached. Its version is managed separately from the firmware - see the Slicer module card in Settings → Update; a slicer update never reflashes the printer.

💡 PrusaSlicer remains the fully-featured path - manual support placement, hollowing, fine-grained control over every parameter. The browser slicer is the zero-install path: an STL becomes a print in a couple of clicks, right where the printer already is.

No WiFi? Copy an .sl1 or .zip (exported by PrusaSlicer or UVtools) into the root of the SD card. It appears in the Print menu in blue, among the models.

9Starting & deleting models

In the Print menu:

10Resin profiles, estimate & refills

The printer has no resin sensor - instead it keeps count. Every printed layer’s cured volume is subtracted from the VAT level, and the estimate survives reboots and firmware updates.

Resin profiles

A profile is the whole print recipe for one resin: layer height, base and regular exposure, base and transition layers, all four lift settings, and the resin’s density with its weighing calibration. Switching resin is one press instead of ten fields, and a number that took an exposure test to find can no longer be lost to a stray edit.

Layer height is part of the profile, because exposure without it is only half a number: 0.05 mm needs less light than 0.10 mm. Two profiles for one resin is the normal case. What describes the printer rather than the resin - vat size, the low-resin levels, the pause lift - stays outside.

Four profiles are built into the firmware - two resins, each at both layer heights: Fast fine and Fast draft, Slow fine and Slow draft (fine is 0.05 mm, draft is 0.10 mm). So the list is never empty: no SD card, no network, and after a factory reset. The two Fast profiles ship with a weighing calibration measured on this printer (×1.010 + 0.63 ml); the Slow pair starts uncalibrated until you weigh a print. Editing a built-in writes a small overlay file on the card that shadows the flash values; Reset to factory deletes it. Every other profile lives in /resin/*.json on the card.

Picking the resin

With no profile selected the row reads “Not set - printing is blocked” and the printer refuses to start. That is deliberate: printing with nobody’s recipe used to run on whatever numbers happened to be left in memory.

The resin picker: the built-in profiles, installed ones, a profile marked tested by with a Buy link, the selected resin ticked, and a line offering ready-made profiles to install

Installing a profile from the library

The picker also lists profiles you do not have yet, published by this project. Press Install and the profile is written to the card. A “✓ tested by” badge means someone actually printed with that resin on this printer and wrote down what worked - it saves you an exposure test. Some entries carry a Buy link. These are affiliate links: the shop pays this project a small share and the price stays the same for you - the picker says so right under the list.

Your browser fetches the profile and posts the values to the printer, so the printer itself never opens an outside address. Profiles you already have are not shown again - a corrected profile is therefore published under a new name, not silently swapped underneath you.

Editing and saving

⚠️ A profile is a starting point. This printer’s colour screen absorbs UV, so manufacturer tables read far too short here - run the exposure test with your own resin and save the result.
Settings, Print tab: the selected profile with its whole recipe - layer height, exposures, layers and the four lift settings - then Save, Save as and Rename, the resin calibration by weight, and the printer-side values below

Grams instead of guesswork

Under Settings → Print → Resin calibration the printer learns to turn weight into millilitres for the resin above; the calibration travels inside the profile.

Estimate before printing

On a model’s print preview, press Up to estimate the resin it needs. It is shown in ml and in vat fills - e.g. 12.4 ml = 0.8 VAT. Your VAT size is adjustable (10–40 ml, default 15) in Settings. Live ml is shown while printing.

Level tracking & refills

⚠️ It’s an estimate, not a measurement - it can’t account for resin sticking to models or drips. Treat it as a planning aid and glance at the real VAT now and then. For a real number instead of a running total, weigh the vat - see Grams instead of guesswork above. Refills you don’t confirm won’t be counted.

11The web dashboard

Open the printer’s IP address in any browser for the full dashboard: live print status and controls, SD-card management with one-click start/import, device settings and firmware updates - in tabs styled to match the printer. The ◐ crescent next to the Manual link switches between the light and dark theme (your choice sticks per browser), and small ? marks next to the tricky settings open short explanations.

🧪 No printer at hand? Try the dashboard live - the same UI driving a simulated printer: start a print, watch the 3D progress, poke through Settings.
💬 The Feedback link in the header opens a 30-second form - what works, what doesn't, what's missing. Photos are welcome (a failed print says more than a paragraph) and your firmware version comes along automatically. No account, and it genuinely steers what gets built next.
The dashboard in a narrow window: one column, with the status card, the print preview and the SD manager stacked

While a print runs

The state line counts the current step down - Curing · 9s, Lifting · 4s - and after Stop or a finished print it counts the ride to the top the same way, so that wait finally has a number. Next to it a small dot says whether the printer answered just now (green) or is mid-move (amber, syncing).

The dashboard while printing: status with remaining time and finish-time estimate, print controls and the live 3D progress render

That dot is worth understanding, because it explains something that looks like a fault. One ESP32 runs the screen, the motor, the UV LED and this web server, all off a single SD card - so the page is served in the gaps between layer moves. During the peel the printer deliberately answers nothing: a pause there could mark the part. A few seconds of amber is the printer working, not the page hanging. How long the dashboard waits follows the print - the longest exposure plus 10 seconds. If your phone or laptop reaches the printer through a slow link such as a WiFi extender and the dashboard keeps saying the printer answers slowly, give it more time under Settings → Network → Wait while printing (kept in that browser only; 0 = automatic). The SD card is locked for the same reason - uploads and file actions come back when the print ends, and the model list stays readable throughout.

On a larger screen it spreads into two columns:

The TinyMakerWifi web dashboard on a wide screen: status and model preview on the left, STL slicer and SD manager on the right

New to the printer? A dismissible Getting Started checklist on the dashboard walks you through the first steps (WiFi → slicer → first model → first print → exposure calibration → integrations) - the printer ticks steps off by itself where it can.

Put it on your phone's home screen: open the dashboard in the phone browser and pick Add to Home screen (Chrome: the ⋮ menu; iPhone Safari: Share → Add to Home Screen). You get the printer's icon on the home screen, and on iPhone it opens fullscreen like an app. (A browser "install" banner won't appear - the printer serves plain HTTP on your LAN - but the shortcut works the same.)

If the power drops mid-print

The printer writes a tiny checkpoint to the SD card as it goes, so a power cut is recoverable. When it boots back up it shows Power restored with the model name and the layer it reached, and three choices:

Recovery is best-effort, not a perfect guarantee. If the outage happens during the exposure (the longest part of each layer, so the most likely moment), the plate's position is known exactly and the print continues cleanly. If it happens while the plate is mid-move (lifting or dropping between layers), the printer knows the plate's height from its last checkpoint during that move (see Resume mode below), so the resumed layers usually sit within a fraction of a millimetre - at worst a faint seam at that one spot. It never risks the opposite direction (into the FEP), so the worst case is a cosmetic mark or losing that print, never a damaged screen or film.

The same three buttons also appear on the dashboard the moment the printer comes back - so if the outage happened while you were away, you can resume (or lift, or discard) from your phone, as long as no one has touched the printer's buttons since it powered on. Before resuming, make sure the vat and the plate haven't been moved - the plate lowers back into the resin on trust.

Power the printer from its mains adapter, not a USB power bank. A weak or portable supply can sag the moment the plate lifts - the stepper's current draw briefly dips the voltage - and on a marginal supply that dip can even reset the printer part-way through the recovery. If a resume keeps rebooting back to the same prompt, that voltage dip is the usual cause: switch to the supplied adapter and try again.

Two settings decide how this behaves, both under System → Advanced → Resin (and in the dashboard’s Settings → Print). Power resume turns the whole thing on or off - off means the printer never checkpoints and always starts fresh, like the stock firmware. Resume mode chooses how finely it remembers: Balanced writes a checkpoint every 800 ms of plate movement, Precise every 400 ms - a resume closer to where the power went, at the cost of more writes to the card.

Power-loss checkpoint engine contributed by Tanner Steorts.

The SD manager & the Model preview card

Uploads are safe: a model unpacks into a temporary folder and replaces the old one only after unpacking succeeds, and uploading a name that already exists asks Replace / Rename / Cancel (a PrusaSlicer re-upload simply replaces, as you’d expect while iterating).

The model preview card with a rendered model, its raft and its view controls, and below it the SD manager: a selected model with Start and Delete, the other models, the page arrows and the card-space bar

The card leads with the model list - the part you use every day. Upload… sits in its corner: one click opens the file picker and the file starts uploading the moment you choose it. Storage sits at the bottom as a thin bar, out of the way until it matters (it turns amber past 85%). Uploading a model that doesn't fit is refused before anything is sent, so the bar is information, not a thing to watch.

Every model row is the preview button: click it and the browser rebuilds the shape from the sliced layers and renders it into the Model preview card, with a live percentage while it loads, then a compact info line - layers · height · print time · resin - and a Share model button (when TinyMaker Connect is registered). The selected row is highlighted, so a card full of models never leaves you guessing which one is on screen. Start and Delete appear on the row itself - under the mouse on a computer, on a tap on the phone - and Start goes straight to the Start this print? question without waiting for the preview.

The card itself is always on the dashboard, like the SD manager: before anything is previewed it shows a hint, and the last previewed model is remembered - a page reload brings it straight back from the saved preview (no re-render, nothing to redo).

The preview is a real, smoothly-shaded 3D model rendered on the graphics card (three.js - fetched once, then kept on the printer's SD card, so it works with no internet and survives firmware updates). Around it:

Resin on the info line: when the exact amount is known it is shown outright; otherwise a quick ~X ml (quick) estimate appears with the preview, free of charge. Clicking the ~ value runs the exact scan on the printer - it decodes every layer, so expect roughly a minute per 100 layers.

Start a print (from the row’s Start or on the printer) and the same card takes over automatically as a live progress render: the printed part fills in with color, the rest stays a ghost outline. It costs the printer nothing (the browser renders from a few prefetched layers).

The card’s title is a link. It names the model on screen, and clicking it takes the model list to the page that model sits on - useful once you have more models than fit on one page, and during a print, when the title reads Printing 42% · Tooth and you want that model in the list in front of you. Titles that name a state rather than a model - Model preview, Slicer preview - are plain text. The window itself is grown with the button in the card’s corner, and Esc brings it back.

Any device, at any point in the print. You do not have to have opened the preview beforehand, and it does not have to be the same browser or the same phone - open the dashboard an hour into a print, on a device that has never seen the model, and the growing shape is there. The printer keeps a small stack of layer silhouettes in memory as it prints and hands them to whoever asks, so nothing is read from the SD card mid-print. (Opening the preview first still gives the fuller picture: the complete model as a ghost, rather than only what has been printed so far.)

Marking a defect

When the browser slicer is switched on, the preview grows one more control in its top-left corner: a defect marker. It exists for one job - telling us where something went wrong, instead of describing it in words a week later.

Press it and the view stops rotating: a red frame around the picture and a crosshair say you are marking, not looking. Drag a box over the bad spot - a support that grew into the part, a hole that closed, a raft that peeled - and add one line of text. A Defect markers panel appears under the preview card with every mark you made, each keeping the picture of that spot and the camera it was seen from, so the same view can be recreated later.

Four buttons finish the job: Send posts the report to the feedback inbox (the same one the dashboard header links to), while Copy and JSON keep it on your machine and Clear throws the marks away. Nothing leaves the printer until you press Send.

What travels with it, so nobody has to ask. The slicer version and where its module came from, the firmware version and build, the dashboard’s own checksum, the model’s name, layer count and scale, and for every mark the layer number written with its step (~L152 @0.10 mm) - because the preview counts in printer layers and the slicer in the ones it sliced, and the same spot is 152 in one and 302 in the other. Each mark also remembers whether it was made before slicing or on the sliced result, so one report can carry both “here is what I asked for” and “here is what came out”.

The Settings tab

Settings is split into sections, switched by underline tabs - Print / Network / Notifications / Display / Backup / Update / About - shown one at a time, each with its own Save config button (saving from any section preserves the other sections’ values):

The Connect tab (shown once TinyMaker Connect is registered) is loaded from the Connect server and uses the same underline sub-tabs; its registration status is shown at the bottom.

12System menu reference

The System menu is where everything beyond printing lives. OK opens an item or changes a value, Back steps out:

System itemWhat it does
WiFi InfoConnected network, signal strength and the printer’s IP. OK here offers a WiFi reset (reboots into the setup portal).
AdvancedDevice toggles, grouped into Network / Resin / Display - the tables below.
StatisticsLifetime print hours, UV LED on-time, this boot’s reason and the last interrupted print (if any) with its layer.
UpdateInstalled vs latest firmware; installs a new version over WiFi. See Updating the firmware.
AboutFirmware version, build date and the project link.

Advanced → Network

ItemWhat it does
WiFiOn/Off - the whole network (web, PrusaSlicer upload, MQTT, self-update). Confirming reboots to apply; Cancel changes nothing.
Web controlOn/Off - browser actions. Off = the dashboard turns view-only; slicer upload and MQTT keep working.
MQTTOn/Off (shown once MQTT is configured in the dashboard).
Boot updateOn = the printer checks for new firmware right after WiFi connects at boot and offers Install / Later on the screen.

Advanced → Resin

ItemWhat it does
Resin profileSteps through the four built-in profiles and every profile on the card, applying the one shown. Reads “Not set - blocked” when none is chosen (printing is refused until one is), and a * after the name means that built-in has been edited. See Resin profiles.
Set VAT fullPress after a full refill - restarts the level estimate from a full VAT. It does not measure what you poured.
Low resin stopOn = mid-print, when the estimate reaches Stop (ml), the printer finishes the layer, lifts and pauses for a refill. On by default: below the stop level the VAT floor goes dry, and carrying on prints nothing.
Stop (ml)The level that stops the print: 3 → 4 → 5 → 6 → 7 → 8 ml (OK cycles), default 4. Three is the measured floor of this VAT, not a preference - see how much is left.
Warn (ml)The earlier heads-up, before the stop - on the screen and on your phone: 5 → 6 → 7 → 8 ml (OK cycles), default 5. Keep it above the stop level, or it has nothing left to warn about.
Ask refillOn = every print starts with a “VAT filled full?” question - yes resets the level to a full VAT.
Power resumeOn = the printer checkpoints as it prints and offers to resume after a power cut. Off = it never checkpoints and always starts fresh, like the stock firmware.
Resume modeBalanced writes a checkpoint every 800 ms of plate movement, Precise every 400 ms: a resume closer to where the power went, at the cost of more writes to the card.
Pause liftHow high the plate rises when you pause to look at the print: 20–40 mm in 5 mm steps (OK cycles). A dry run uses the same height instead of going to the top.
Exposure testCures an 8-bar calibration strip straight from the printer - each bar gets a different exposure time around your Regular setting. Pick the crispest bar and set its time in Settings. Resin in the vat, no build plate.
Dry runTest prints without UV - motion and display only. Great for checking mechanics or a new model without wasting resin. Note: while Dry run is on, the UV LED stays off everywhere, including the exposure test.

Advanced → Display

ItemWhat it does
Idle timeoutAfter this much inactivity the idle screen dims into a screen saver (“TinyMaker” + IP drifting around). 30 s…10 min, Off = never; fresh installs default to 60 s.
Boot animationWhich animation plays at power-on - OK cycles Default, Shuffle (with two or more installed) and every animation on the SD card (see Boot animations below).

Both switches default to On and stay On after upgrading from an older version - nothing changes until you change it.

Exposure calibration test

Exposure time is the single most important resin parameter - and every resin (even every color) cures differently. The test finds your resin’s time in one go: the printer cures an 8-bar strip straight from its masking LCD, each bar with a different exposure. No slicer, no SD file.

The bar times are proportional to your current Regular exposure (R) - from 40 % to 160 % of it, so the spread is meaningful for fast and slow resins alike. Bar 5 (100 %) is always your current setting:

Bar (dots)12345678
% of R40557085100115135160
R = 14 s68101214161922
⚙️ Regular exposure moves in tenths of a second (0.1 s steps, 1–30 s) - on the printer each press changes it by 0.1 s, and in the dashboard you can type the value straight in. Base exposure stays in whole seconds (5–60 s): it is about the first layers gripping the plate, where a tenth of a second changes nothing. Use the tenths for fine-tuning once the test has put you in the right area - not for finding that area in the first place.

The ladder follows your setting automatically. To test shorter (or longer) times, just change Regular exposure in one place - dashboard → Settings → Regular exposure → Save, or the printer’s Settings menu - and the test range recalculates itself; the Advanced menu row shows the current range (e.g. “2-16s strip”). After the test, set the winning bar’s time as your final value.

💡 Count the dots, not the sides. Each bar carries its number as holes near one end - 1 dot = bar 1 (shortest) … 8 dots = bar 8 (longest). The strip stays identifiable no matter how it is flipped or mirrored (the vat view often is!), and the dots double as a fine-detail check: on a well-exposed bar the holes come out round and open.
  1. Prepare: resin in the vat (stir it first!), build plate removed - the strip cures directly on the vat film. Make sure Dry run is off.
  2. Run: System → Advanced → Resin → Exposure test → Start. A progress bar runs for the longest bar’s time (~half a minute); Back cancels.
  3. Peel & rinse: gloves on, lift the strip off the film with a soft plastic scraper, rinse in IPA, dry.
  4. Judge the bars against the light:
    • Under-exposed (short end): thin, rubbery, fuzzy edges, breaks or partly stuck to the film.
    • Just right: sturdy, sharp clean edges, even thickness.
    • Over-exposed (long end): fatter than its neighbours, bloated edges, a thin parasitic film around it (light bleed).
    • All bars nearly identical? Your resin cures faster than the shortest step - lower Regular exposure (e.g. to 8 s) and run the test again. Note: a fresh, unwashed strip always feels rubbery; judge after an IPA rinse, and flexible resins (ABS-like) stay bendy by design.
  5. Set it: pick the lowest time that still cures sharp and sturdy (best detail; if torn between two, take the longer one) and enter it as Regular exposure in Settings. Identify bars by their dots (1 dot = shortest) and read the time from the table above. Keep Base exposure at roughly 2.5× the new Regular - it’s about first-layer adhesion, not detail.
A real exposure test strip cured in the vat: eight bars with dot markers, holes crisp on the long-exposure side and sealing over toward the short side
A real test strip in the vat - count the dots: bar N carries N holes, so flipping or mirroring never confuses it. On the long-exposure side the holes cured round and open; toward the short side the bars turn translucent and the holes seal over. Pick the lowest bar whose holes are still open and edges sharp.
💡 Cold resin cures slower - run the test at the temperature you actually print at. Check the vat for leftovers afterwards; a Clean Resin Vat cycle picks up anything you missed.

Advanced: your resin’s working curve (Jacobs)

The test strip holds more data than “which bar looks best”. Cure depth grows with the logarithm of exposure time - that’s why doubling the time doesn’t double the thickness, and why you judge bars by edges and holes, not by how thick they feel. If you want numbers:

  1. Measure the thickness of at least 3–4 bars with calipers (skip broken ones).
  2. Plot thickness against ln(seconds) (any spreadsheet; use the bar times from the table above). The points form a straight line - that’s the resin’s working curve.
  3. The slope is Dp (how deep light penetrates); where the line crosses zero thickness is Ec (the minimum exposure that cures anything). Together: depth = Dp · ln(t / Ec).
  4. Read your time: for reliable layer bonding you want the cure depth around 2× your layer height (0.1 mm for 0.05 mm layers) - find where the line reaches that thickness and use that time as Regular exposure.
💡 This is the same method resin manufacturers use to publish Dp/Ec - with a caliper and a strip you can characterize any unknown resin in one test.

Boot animations

The printer can play a short animation on its screen at power-on - and you can swap it. Installed animations live on the SD card and are picked in two places:

Settings, Display tab: boot animations with Show and Delete, the staged selection, and Prepare 3D for all models

Shuffle (offered once two or more animations are installed) plays a random installed animation on every boot.

Getting new animations onto the printer:

💡 Keep animations short - 2–4 seconds is the sweet spot. The firmware hard-caps playback at 250 frames or 10 seconds (whichever comes first), and pressing Back skips the animation immediately.

3D previews

The second card on the same Display tab has nothing to do with animations. A model can only be turned in 3D once its layers have been decoded, and that happens by itself the first time you open it - roughly a minute - after which the result is stored next to the model on the SD card and never has to be done again.

Prepare 3D for all models does the whole card in one go, so no model keeps you waiting later. It is quicker per model - about half a minute - because it prepares the lighter version that the list and the phone use; opening a model still fills in the full-resolution one. It runs only while the printer is idle and stops by itself if a print starts. Old flat thumbnails are replaced as it goes, which is the other reason to run it once after an update: the pictures in the model list are redrawn to match what the dashboard draws today.

Boot animations were contributed by Tanner Steorts (@Tann2019); Shuffle by Brian Karmelk (@Briadark).

13Maintenance menu

The main menu’s Maintenance entry holds the three jobs that touch the hardware rather than a file: levelling the plate, moving it by hand, and curing the leftovers out of the vat. None of them need a computer.

⚠️ Know which way each one moves. Level Build Plate drives the plate down, towards the screen. Move Build Plate goes wherever you tell it. Picking the wrong one with a part still on the plate is the one mistake here that can damage the FEP film or the LCD.

Level Build Plate

Homes the plate downwards until it sits flat on the screen, which is how the plate is squared up and its zero is set. The printer says so before it moves - a red screen reading “Plate must be EMPTY. Homing goes DOWN.”

  • Take the printed part off the plate first, and take the vat out (or make sure levelling is what you actually want) - the plate is going to travel all the way down.
  • Use it when prints stop sticking evenly, after you have removed or refitted the plate, or after transport.
⚠️ Never use Level Build Plate to rescue a print. After a power cut, with a half-finished part still hanging on the plate, the instinct is to reach for the levelling item to get the plate up and out of the way. It goes down instead, and presses the part into the film. To raise the plate use Move Build Plate, or the Lift plate only button on the Power restored screen (see Power-loss recovery). Found the hard way by a user, 2026.

Move Build Plate

Drives the plate up or down by hand, in the step you pick: 0.1 mm, 1 mm or 10 mm. This is the tool for everything that is not levelling:

  • Raising the plate after a power cut so you can look at the part or take it off.
  • Getting the plate clear before pulling the vat out.
  • Closing in on a position gently - 10 mm to travel, 1 mm to approach, 0.1 mm for the last bit.

Both ends of the travel stop themselves, and say so. Going up, the plate stops at the top of its travel and the screen reads Plate is at the top - press Up again and nothing happens, which is the answer, not a fault. That is also where the plate stands right after every print, because the finishing lift parks it there. Going down, the moment the plate reaches the endstop the printer takes that as its zero and shows Plate is home: the height it reports is trustworthy again, exactly as after a homing run.

💡 The ceiling applies only once the printer has homed - by a print, or by driving the plate down onto the endstop as above. Before that it has no idea where the bottom is, so it cannot know where the top is either, and it lets you move freely rather than guess. You can see which state it is in on the dashboard: Plate height reads not homed until there is a reference.

Clean Resin Vat

Lights the whole screen for a set time, so everything left in the vat cures into one thin sheet you can lift out in one piece - instead of chasing hardened crumbs around with a spatula. Run it when you change resin, when a print has failed and left something behind, or before putting the printer away.

  1. Take the build plate out and leave the vat in place with the resin still in it.
  2. Maintenance → Clean Resin Vat. Set the exposure with the arrows - 30 to 60 seconds - and start. Longer means a thicker, sturdier sheet; thin resin needs the longer end.
  3. Wait for it to finish, then lift the sheet by a corner and peel it out slowly. Gently flexing the vat pops it loose if it clings.
  4. Wipe what is left with IPA and a soft paper towel, and check the film against the light: it should be clear, with nothing cured stuck to it.
⚠️ Nothing hard in the vat, ever. No blades, no metal spatulas, no scraping - the clear FEP film on the bottom scratches, and a scratched film prints marks into everything after it. If a sheet will not come loose, run another cleaning cycle rather than forcing it.
💡 Dry run makes this do nothing. While Dry run is on, the UV LED stays off everywhere, this cycle included: the screen lights up, the timer runs, and no resin cures. Turn it off first (System → Advanced → Resin → Dry run) if the sheet never forms. Cleaning exposures do count towards the LED’s recorded hours, exactly like printing.
🧤 Gloves on for all of this. Uncured resin irritates skin, and a cured sheet still has liquid resin under it. Dispose of the sheet with your cured waste, not down a drain.

14Updating the firmware and the slicer

🔒 Firmware flashing is blocked while printing, and the web paths need Web control on. (PrusaSlicer upload is separate and works any time.)

Two things update here, and they are separate. The firmware is the printer itself - installing one reboots it. The browser slicer is a module kept on the SD card: it carries its own version and its own install button, and updating it never reboots the printer or interrupts a print. Both live in the same pane.

Three ways to update the firmware:

  • On the printer (no computer): System → Update shows the installed version and checks GitHub for the latest. If a newer one exists, the Install button lights up - press OK and the printer downloads and flashes it over WiFi.
  • From the dashboard - Settings → Update: installed vs latest with an Install latest button, a version picker (install any released version; downgrades ask to confirm) and Choose & flash… for a firmware.bin file.
  • For developers: PlatformIO OTA via the tinymaker-ota environment (open System → Update on the printer first - that path keeps the strict gate).
The dashboard Settings > Update pane: installed vs the stable channel, version picker, file upload and the Slicer module card

Two comforts while updating: the printer also checks by itself - shortly after WiFi connects at boot it looks for a newer version and shows “Update available - Install / Later” on the screen (choosing Later offers to turn the check off; the switch lives in System → Advanced → Network → Boot update and in dashboard Settings). And when you start an install from the browser, the dashboard locks under an “Updating firmware” overlay and reloads itself when the printer is back - no guessing whether it finished.

The printer checks who it is talking to. Before it installs anything from the internet it verifies GitHub’s certificate, and it only takes files from this project’s own release folder. If that check fails - for example on a network that intercepts secure connections - nothing is installed: the version check fails, and an install from the dashboard says it could not verify GitHub. Choose & flash… and USB flashing still work.

Don’t worry about a failed update. The printer keeps two firmware copies (dual OTA partition), so a failed flash falls back to the previous one. Just don’t power off mid-update.

The same Settings → Update pane also holds the Slicer module card (shown when the browser slicer is switched on): the version on the printer vs the latest published, an Install latest button and a version picker. It updates independently of the firmware - a slicer update never reflashes the printer.

While a print runs the card is locked, and the printer will not read it mid-layer - so the module card does not claim anything about what is installed: it says the card cannot be read now, and copying resumes when the print ends. The same is true of the backup check in the Backup tab.

Backup & restore

Everything you have configured - print settings, device toggles, MQTT, even the lifetime print and UV LED counters - fits in one backup file. In the dashboard’s Settings → Backup tab:

  • Download backup - saves tinymaker-backup.json to your computer.
  • Backup to SD - stores the file on the printer’s SD card. Do this before a full USB reflash: the reflash wipes all settings, but on the first boot the printer finds the backup on the SD card and asks “Restore settings from SD backup?” - one press and everything is back. Settings shows when the SD backup was made, so you can tell at a glance whether it’s fresh.
  • Restore from SD - applies the backup stored on the SD card at any time (the button is enabled only when one is present; while a print runs the card is locked, so the panel says it cannot check rather than claiming there is none).
  • Restore from file - applies an uploaded backup at any time.

Auto backup to TinyMaker Connect (optional, for registered Connect users): a checkbox under Settings → NetworkTinyMaker Connect keeps a backup on the Connect server after settings changes and after prints; the Backup tab then offers Download from Connect and Restore from Connect. Connect backups do not include the stored MQTT, notification or Connect secrets. When you register, save the recovery code (Retrieve / Copy buttons in the Connect section) - it restores your Connect profile if you ever reset the printer without a backup.

💡 WiFi credentials are managed separately (by the WiFi setup portal) and are not in the backup - after a full USB reflash you reconnect to WiFi once, everything else restores. The backup includes your MQTT password, so treat the file accordingly.
The Settings tab with the Backup & restore buttons: Download backup, Backup to SD, Restore from file

15Home Assistant (MQTT) & notifications

Optional ways for the printer to reach you, all configured in the dashboard’s Settings tab (MQTT in the Network section, the messaging channels in Notifications).

Home Assistant (MQTT)

Configure an MQTT broker and the printer publishes itself to Home Assistant with auto-discovery: print state, current layer, resin used, resin left + a low-resin alert, and run/remaining time - all as HA sensors you can put on dashboards or automate notifications on.

Phone notifications - pick a channel

No Home Assistant? The printer can message you directly when a print finishes (with the print time and resin used), pauses for a low-resin refill, or is canceled. In Settings → Notifications there is one choice - Off / Telegram / WhatsApp / Discord - each channel with its own ? setup help and a Send test message button.

Telegram is the one used daily here. WhatsApp and Discord ship untested - they run on your own CallMeBot key or channel webhook, so testing them with our setup would prove nothing about yours. If you try one, tell us how it went - working or not, both are useful.

Did the last message actually arrive? Under the channel picker the dashboard shows the result of the printer’s last automatic message - “Last automatic message: delivered 5 min ago”, or NOT delivered with the reason. It says automatic on purpose: Send test message takes a different path, so “the test works but nothing arrives while printing” is itself a useful clue - usually a token or chat id that is fine for a test but blocked when the printer is busy. The line stays hidden until there has been an automatic message to report on.

Telegram

Setup takes two minutes - the same steps are shown inline in the dashboard (the ? help next to the Telegram choice):

  1. Create a bot: in Telegram, message @BotFather, send /newbot, follow the prompts, and paste the token into Bot token (Settings → NotificationsTelegram).
  2. Open your new bot and press Start (or send it any message) - a bot can’t message you until you do.
  3. Get your Chat ID: open a chat with @userinfobot - a separate bot, search “userinfobot” in Telegram - and press Start; it replies with your numeric Id, which is your Chat ID. (For a group, add @RawDataBot to the group and use the negative id it prints.)
  4. Save config, then press “Send test message” - it should arrive within a few seconds.
🔒 The bot token is a secret - the dashboard never shows it back, only its last four characters (ends in XXXX), and it is included in your settings backup, so treat the backup file accordingly. The printer talks directly to Telegram over HTTPS; nothing goes through third-party servers.

WhatsApp (via CallMeBot)

WhatsApp messages go through the free CallMeBot gateway - a one-time activation from your phone:

  1. Open callmebot.comWhatsApp text messages and add the bot’s current phone number to your contacts.
  2. Send it the message “I allow callmebot to send me messages” from your WhatsApp.
  3. It replies with your personal API key - enter it in Settings → NotificationsWhatsApp, together with your phone number (with country code).
  4. Save config, then Send test message.
💡 Unlike Telegram, WhatsApp messages travel through the CallMeBot gateway (a third-party service) - that is what makes a bot-free WhatsApp setup possible.

Discord (webhook)

Discord needs no bot at all - just a channel webhook:

  1. In your Discord server open Server Settings → Integrations → Webhooks.
  2. New Webhook - pick the channel the printer should post to, then Copy Webhook URL.
  3. Paste the URL in Settings → NotificationsDiscord, Save config, then Send test message.
🔒 The webhook URL is a secret - anyone holding it can post to that channel. The printer talks to Discord directly.

16Troubleshooting & FAQ

The printer won’t connect to WiFi

After 15 s it boots offline - SD printing still works. To retry, reset WiFi (System → WiFi Info → OK, or hold Back while powering on) and set it up again.

Where do I find the printer’s IP address?

System → WiFi Info on the printer - it always shows the connected network, signal strength and IP. (The boot screen only shows the IP after the first-time portal setup; on routine boots the signal bars just turn green.) On most networks tinymaker.local works instead of the IP.

What SD cards work?

Format the card as FAT32 and keep it 32 GB or smaller - exFAT and NTFS aren’t read, and cards larger than 32 GB can’t be FAT32 without reformatting. A class-10 card is plenty. Copy .sl1/.zip archives into the card’s root (not a sub-folder).

PrusaSlicer “Test” fails

Check the printer is on and shows a green dot / an IP under System → WiFi Info. Use that IP if tinymaker.local doesn’t resolve on your network. The API key value doesn’t matter.

The dashboard opens but every button is disabled

Web control is off. Turn it back on on the printer: System → Advanced → Web control. (Slicer upload and MQTT are unaffected by this switch.)

My print looks half-height, flat or squashed

Slice with the 0.05 mm profile. At a 0.10 mm setting the printer uses every other image by design. If parts come out flat or the wrong height, open PrusaSlicer’s Print settings and confirm the layer height actually reads 0.05 mm - a PrusaSlicer update or picking the wrong preset can silently reset it, and the printer can’t tell from the file, so it just prints wrong without a warning.

“Resin left” looks wrong

It’s an estimate that only counts confirmed refills. Press Set VAT full after a full refill, and keep Ask refill on so it stays honest.

What do I do after a print? (washing & curing)

Parts come off the plate wet and only partly cured. Rinse them in isopropyl alcohol (IPA) - two baths help: a dirty one first, a clean one second - then let them dry. Only then UV-cure them (sunlight or a curing station) until hard. A matte, chalky surface is usually over-curing or too much sun - cure in shorter bursts and check often. Always wear gloves; uncured resin is a skin irritant.

How do I clean the resin VAT?

When changing resin or storing the printer, pour the resin back through a paint filter into its bottle, then wipe the VAT with IPA and a soft paper towel - never anything hard: the clear FEP film on the bottom scratches easily. Held to the light the FEP should be clear, with no cured skin or cloudiness stuck to it; gently flexing the VAT pops leftover cured bits loose so you can peel them off by hand, not with a scraper.

The web flasher stops with “ERROR: Timeout”

Almost always the transfer speed, not the browser: set the flasher’s Baud rate to 115200 and flash again. Cable, hub and driver checks are in Installing the firmware.

A firmware update failed

The dual OTA partition keeps the previous firmware, so the printer should still boot. Try again from System → Update, or upload a firmware.bin from the dashboard’s Settings → Update.

How do I keep my settings through a USB reflash?

Before flashing: dashboard → Settings → Backup to SD. After the reflash the printer finds the backup on the SD card and offers to restore it on first boot. Only WiFi needs to be set up again.

What is TinyMaker Connect, and do I need it?

No, you do not need it - everything in this manual works without it. Connect is an optional online service (built by Brian Karmelk) that the printer can register with. What it adds: your settings backed up off the printer, a recovery code to get that profile back after a factory reset, and a way to share a model from the preview. It is switched on in Settings → NetworkTinyMaker Connect; until you register, the Connect tab is not even shown. Leaving it off costs you nothing but those extras.

Can I reach the printer when I am not at home?

The dashboard is LAN-only and has no password - anyone who can reach the address can start and stop prints. So there are two safe ways and one that is not:

  • TinyMaker Connect - the printer connects outwards to the service, so nothing on your router has to be opened.
  • A VPN into your own network (Tailscale, WireGuard, your router’s own VPN) - your phone joins the home network from anywhere and the dashboard works exactly as it does at home. Nothing of ours is involved.
⚠️ Do not port-forward the printer to the internet, and do not point a dynamic-DNS name at it. There is no login to stop anyone who finds it - and what they find is a machine that cures resin with a UV light. If you want access from outside, use one of the two ways above.

How do I go fully offline?

System → Advanced → WiFi → Off. The printer behaves like the original firmware; turn WiFi back on in the same place whenever you like.

What does the “Anonymous usage ping” send?

Once per firmware version - on the first boot after a flash - the printer sends three things: a one-way hash of its factory MAC address (so each printer is counted once, without being identifiable), the firmware version, and the lifetime print hours. Nothing else, ever - no models, no settings, no network details. It feeds the “N printers running TinyMakerWifi” counter. To opt out, untick Settings → NetworkAnonymous usage ping.

Credits

TinyMakerWifi - the WiFi, wireless-upload and over-the-air-update firmware described in this manual - is created and maintained by Viktoras Šidlauskas (@slibbinas): the WiFi stack, wireless upload, OTA self-update, the 3D model preview & live print progress, and the resin estimation & VAT tracking.

  • The initial web dashboard, the Advanced menu (WiFi & Web-control switches), the web flasher, safe model imports and TinyMaker Connect (with auto-backup & recovery) - contributed by Brian Karmelk (@Briadark).
  • Boot animations (the on-device library, playback and one-click install) - contributed by Tanner Steorts (@Tann2019).
  • The browser slicer’s engine is PrusaSlicer’s libslic3r 2.9.6 (© Prusa Research a.s.), compiled to WebAssembly from the unmodified upstream sources - tag version_2.9.6, commit b028299 - and used under the GNU AGPL-3.0. Everything else in TinyMakerWifi stays MIT-licensed; the two are separate programs that ship side by side.
  • Original TinyMaker firmware & printer - by the TinyMaker3D Team.
  • Additional fixes, testing and ideas from the TinyMaker community.

The firmware is MIT-licensed; the TinyMaker hardware is CC BY-NC-SA 4.0. If TinyMakerWifi is useful to you, you can buy me a coffee - thank you!

The dashboard asks once as well: after the third print that ran to the end with the UV on, a small dialog offers a few amounts (plain links to the same PayPal page) or No thanks. It appears once per printer, never again, and the printer never learns what you chose. Failed prints and dry runs do not count.