A battery-powered 13.3″ colour e-paper picture frame built into an off-the-shelf 30 × 40 cm wooden frame. A Seeed XIAO ePaper EE02 board drives an E Ink Spectra 6 panel behind a passepartout, and runs the open-source esp32-photoframe firmware. Everything sits in a 3D-printed case that is taped to the back of the passepartout. The battery comes out without tools, and printed hangers let the frame hang in portrait or landscape.
- No changes to the frame. The case is taped to the passepartout's side margin, and the panel is taped behind the passepartout window.
- No soldering. The display flex, the antenna and the battery all plug in. You need a 3D printer (or a print service) and a knife for the notch in the back board.
- About € 260–285 all in in the EU, or US$ 215–240 plus shipping. Details under Cost.
- The flex sets the position. The display flex folds 180° around the panel's lower edge and plugs straight into the EE02, which sits behind the panel's corner.
- Tool-free battery swap. Slide the battery lid off, unplug, swap, slide it back.
- Keys and power switch reachable from the back through a 45 mm opening.
- One print plate. All nine parts fit one Bambu Lab P1S plate, need no supports and take about 70 g of PETG.
- Parametric. The case is a CadQuery script, so the battery size, tape thickness and fits can be changed.
| As a dashboard | Back, lids on | Back, lids open |
|---|---|---|
![]() |
![]() |
![]() |
Back photos are shown frame face down, with the display's flex edge at the bottom, the same way round as the drawings.
| CAD render | Print plate |
|---|---|
![]() |
![]() |
About € 260–285 in the EU, or US$ 215–240 plus shipping (prices from October 2026). Board and panel are most of it: US$ 164 at Seeed Studio, or € 209 at OpenELAB. Frame, passepartout, battery, tape, screws and filament add about 50–75 in either currency. Prices and stock change, so check the shops.
The EE02 board and the 13.3″ Spectra 6 panel (T133A01, 1200 × 1600) it was made for. That's the tested combination; it isn't sold on Amazon. Buy either the kit or both single items:
| Shop | What to order |
|---|---|
| Seeed Studio, ships worldwide | XIAO ePaper DIY Kit EE02*: one kit with board and panel. Select both on the page. |
| OpenELAB, EU | Two items: the EE02 board and the 13.3″ Spectra 6 panel |
Links for amazon.com, amazon.de and amazon.fr.
| Part | Qty | amazon.com* | amazon.de* | amazon.fr* |
|---|---|---|---|---|
| LiPo 3.7 V 5000 mAh, 706090 (≈ 7 × 60 × 90 mm), JST-PH 2.0, with protection board Max. 61.7 × 92.1 × 8.0 mm; leads at a corner of the short end, ≥ 50 mm from cell to plug end. Check polarity. Alternative: a 606090 (≈ 6 × 60 × 90 mm) fits the same pocket. It usually has 3000–4000 mAh, so the frame runs less long per charge. Not tested: the cell I used (PL706090, 5000 mAh, 60.5 × 91 × 6.5 mm, 62 mm leads) is sold out everywhere. Check size and leads before you buy. |
1 | search 706090 Alternative: Winfox 4000 mAh 606090, JST-PH † |
search 706090 Alternative: LiPo 1S 4000 mAh 606090, JST-PH † |
search 706090 Alternative: LiPo 1S 4000 mAh 606090, JST-PH † |
| Wooden picture frame 30 × 40 cm (12 × 16 in works too), with glass At least 20 mm from the back of the glass to the back edge of the frame; back board held by clips boesner Quadro Eiche (tested) · Tested: boesner Quadro Eiche Glaswechselrahmen, 20 × 30 mm profile. |
1 | 12 × 16 in shadow box, 1¾″ deep † | BD ART oak box frame 30 × 40, 3 cm † | PHOTOLINI box frame 30 × 40, 3 cm † |
| Passepartout / mat, 30 × 40 cm (or 12 × 16 in), 1.4 mm, centred window Window 196–202.8 × 264–270.4 mm, e.g. 200 × 267 mm |
1 | Uncut 12 × 16 mat boards (cut the window yourself) † | AlphaUVplus mat, window made to order † | CEANOTHE mat 30 × 40, 20 × 27 cm window † |
| Double-sided foam tape, 1 mm 1 mm thick, about 19 mm wide |
≈ 40 × 135 mm | search | search | search |
| Countersunk wood screws 3 × 12 mm (#4 × ½″) 2 per hanger, optionally 1 per bumper |
4 (+4) | search | search | search |
| PETG filament 1.75 mm Any PETG; PLA only if the frame never gets direct sun |
≈ 70 g | search | search | search |
| JST-PH 2.0 2-pin extension cable (optional) Only if your battery's leads are shorter than 50 mm |
1 | search | search | search |
Search links open an Amazon search for the part; pick any listing that meets the requirement under the part name.
† Suggested listing, not yet checked against the requirements. Check the size and connector before you buy.
You also need a wall screw for each hanging position, with a head up to 8.4 mm and a shank up to 4.2 mm.
The tested frame is a boesner Quadro Eiche, 30 × 40 cm, with a 20 × 30 mm profile. Another frame works if it meets three conditions:
- Size: 30 × 40 cm, or 12 × 16 in, so that a passepartout with a centred window leaves at least 45.6 mm between the panel and the frame's rebate on the case side.
- Depth: at least 16.2 mm between the back of the passepartout and the back edge of the frame, so the case stays inside the frame.
- Back board: it has to hold the passepartout and the display against the glass. In a normal frame, cut a notch for the case out of the frame's own back board (drawing) and put the board back in.
Deep box frames ("shadow boxes") hold the back board at the rear instead. In one of those, put the passepartout directly behind the glass and let the frame's spacer strips hold it there. Shorten the strip on the case side so it ends clear of the case.
More in the design notes.
Open print/ee02_case_P1S_plate.3mf in Bambu Studio. All parts are already on one plate in print orientation (205 × 194 mm). Single parts are in stl/ and editable solids in step/.
| Part | Qty | On the plate | Settings |
|---|---|---|---|
tray |
1 | floor down | 3 walls, 15 % infill, no brim |
lid_board |
1 | flat side down | 3 walls, 15 % infill |
lid_battery |
1 | flat side down | 3 walls, 15 % infill |
hanger |
2 | wall side down | 6 walls or 100 % infill |
bumper |
4 | as exported | any |
Use a 0.4 mm nozzle, 0.20 mm layers and no supports. The tray's three board clips are thin beams that stand free in slots through the floor, so don't let a brim or an over-squished first layer bridge those slots. The top of the key opening is a 45 mm bridge, and a little sag there doesn't matter.
The short version, with the frame lying face down and the display's flex edge at the bottom. The full steps, battery swap and hanging are in docs/assembly.md.
- Tape the display face down behind the passepartout window.
- Press the EE02 into the tray. It drops onto four pins and three clips snap over its edges.
- Plug in the antenna and drop its lead into the slot in the tray's lower wall.
- Fold the flex 180° around the panel's lower edge and plug it into the EE02's 60-pin connector.
- Tape the tray's right part to the passepartout margin, and slide the board lid in from the left.
- Lay the battery in, leads towards the board and the lead corner towards the frame edge. Plug it in, red to +, and slide the battery lid on.
- Cut a 133 × 217 mm notch out of the lower right corner of the frame's back board, and put the board back in around the case. It holds the passepartout and the display against the glass.
- Hang it. If the back board has its own hangers, as the boesner one does, use those. Otherwise screw on the printed hangers and bumpers.
| Back view | Back board |
|---|---|
The frame runs esp32-photoframe by aitjcize (MIT), which supports the EE02 as seeedstudio_xiao_ee02. Flash it from the web installer in Chrome, Edge or Opera, choosing Seeed Studio XIAO EE02. Then set up Wi-Fi with the ESP Frame app. Image sources, Home Assistant integration and the deep-sleep settings are described in the firmware's README. This repository contains only the hardware. The firmware is a separate project with its own licence.
USB-C is only reachable with the battery out, because the battery sits in front of the XIAO's USB-C socket. The web installer needs USB, so flash before you put the battery in, or take it out to reflash. With the battery out, the frame can also run permanently from USB: the cable leaves through the notch in the battery pocket with the lid closed.
cd cad
pip install -r requirements.txt
python3 build.py # STEP + STL + P1S plate
python3 check_fit.py # interference checks against board, battery and lid movement
python3 diagrams.py # SVG drawings in docs/imagesThe parameters are at the top of cad/ee02_frame_case.py:
BATT_W,BATT_L,BATT_T: battery sizeTAPE: foam tape thicknessFIT: lid sliding clearanceCLIP_C,CLIP_O: how tight the board clips areREBATE_CLR: gap to the frame
More in cad/README.md.
LiPo cells don't like punctures, crushing or heat. The pocket leaves room around the cell and nothing presses on it. Replace a cell that has swollen. Generic JST-PH batteries are often wired the other way round from what the EE02 expects. The red wire must go to the + printed next to the EE02's battery socket.
© 2026 gaduffl
- The design (STL, STEP, 3MF), documentation, drawings and renders are licensed under CC BY-SA 4.0.
- The Python sources in
cad/are licensed under the MIT licence. - The photos in
docs/images/photos/are not covered by either licence. © 2026 gaduffl, all rights reserved.
Board and panel dimensions come from Seeed's published EE02 design files and the T133A01 datasheet. No Seeed files are included.
This is Rev B. The changelog lists what changed after the first test print. Issues, photos of your build and pull requests are welcome. For a different battery or frame, the parameters above are the place to start.
* Affiliate links: the Seeed Studio and Amazon links in the parts list are affiliate links; the price is the same for you. As an Amazon Associate I earn from qualifying purchases. Als Amazon-Partner verdiene ich an qualifizierten Verkäufen. En tant que Partenaire Amazon, je réalise un bénéfice sur les achats remplissant les conditions requises.





