tinymakerwifi.com Contents
User Manual · v0.15.0

TinyMakerWifi

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

by Viktoras Sidlauskas · @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. Send a model from PrusaSlicer (“Send to printer”), or 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:

  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.

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 Update tab — 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 UI screens

The System menu is where the new features live: WiFi Info, Advanced (device toggles), Update (firmware) and About (version and lifetime print hours).

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

  1. Import the TinyMaker printer profile (TinyMaker.ini, in the repo) via File → Import → Import Config.
  2. 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.
  3. Click Test — it should report success (the printer must be on and on WiFi).
  4. 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.
💡 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.

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.

8Starting & deleting models

In the Print menu:

9Resin estimate & level tracking

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.

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. Refills you don’t confirm won’t be counted.

10The 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 TinyMakerWifi web dashboard: live status, controls and SD manager

On a larger screen it spreads into two columns:

The dashboard on a desktop screen: status card with UV LED time and the Manual link, SD manager with models

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.)

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).

Every model row in the SD manager has three buttons: Preview | Start | Delete. Press Preview and the browser rebuilds the shape from the sliced layers and renders it into the Model preview card, with a live percentage and progress bar while it loads, then a compact info line — layers · height · print time · resin — and a Share model button (when TinyMaker Connect is registered).

The card itself is always on the dashboard, like the SD manager: before anything is previewed it shows a Pick a model and press Preview 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).

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 dashboard while printing: status with remaining time and finish-time estimate, print controls and the live 3D progress render

The Settings tab

Settings is split into five sections, switched by underline tabs — Print / Network / Notifications / Boot animation / Backup — 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.

11Advanced menu & switches

System → Advanced on the printer holds the device toggles — OK changes a value, Back returns:

ItemWhat it does
Screen timeoutBlank the status screen after 30 s…10 min of inactivity (Off = never).
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 below.
VAT refilledPress after refilling — restarts the level estimate from a full VAT.
Low resin pauseOn = the print pauses for a refill when the estimate runs low.
Low resin warnThe warning/pause threshold, 1–3 ml (OK cycles).
Ask refillOn = every print starts with a “VAT refilled?” question.
WiFiOn/Off — the whole network (web, PrusaSlicer upload, MQTT, self-update).
Boot updateOn = the printer checks for new firmware right after WiFi connects at boot and offers Install / Later on the screen.
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.
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).
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).

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

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 → 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, Boot animation tab: installed animations with Show and Delete, the staged selection and Save config

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.

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

12Updating the firmware

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

Three ways to update:

  • 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 — the Update tab: installed vs latest with an Install latest button, a version picker (install any released version; downgrades ask to confirm) and a file upload for a firmware.bin.
  • For developers: PlatformIO OTA via the tinymaker-ota environment (open System → Update on the printer first — that path keeps the strict gate).
The dashboard Update tab: installed vs latest, install latest, version picker and file upload

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 → 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.

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.

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).
  • 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

13Home 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

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 and follow the prompts. BotFather replies with a bot token.
  2. Find your chat id: message @userinfobot — it replies with your numeric id. Then open your new bot and press Start once, so it is allowed to message you. (For a group, add @RawDataBot to it and use the negative id it prints.)
  3. Enter both in the dashboard: Settings → Notifications → pick Telegram, paste the token and the chat id, and Save config.
  4. Press “Send test message” — it should arrive in Telegram 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.

14Troubleshooting & 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.

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 / wrong

Slice with the 0.05 mm profile. At a 0.10 mm setting the printer uses every other image by design.

“Resin left” looks wrong

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

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 Update tab.

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.

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 Sidlauskas (@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).
  • 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!