yolkSPEAKERS

A Yolk hardware experiment

Yolk Bookshelf Speakers: print them, build them, stream to them

Designed and simulated, not yet built or measured

A pair of 3D-printed, active, two-way bookshelf speakers. Each one has its own Wi-Fi streaming amplifier with a built-in DSP crossover. You print the cabinet, screw the parts together without soldering, and stream to them from your phone or computer. This page is the build guide and the honest state of the design.

Render of the left Yolk bookshelf speaker from the front: a charcoal cabinet with a large woofer, a tweeter ringed in neon green, a port and a green seam
CAD render of the left speaker. Charcoal body, neon-green inlays. Not a photo: nothing has been printed or assembled yet.

01 / What you’re building

A two-way speaker with its own amp and Wi-Fi.

Each speaker is a vented 5-inch-woofer-plus-dome-tweeter box. Inside the rear bay sits a small streaming amplifier board: it joins your Wi-Fi, receives the music, splits it into bass and treble with a DSP crossover, and drives the two drivers directly. There is no separate amplifier and no cable between the speakers, only a power brick for each. A subwoofer can join later over the same network.

2 × 1

One board per speaker

Louder-ESP32-Plus: an ESP32-S3 for Wi-Fi plus a TAS5825M amplifier with a DSP. Left and right are set in software.

9

Printed parts each

Two body halves, two baffles, port tube, two rear plates and two neon inlays, printed without supports.

0

Soldering

Screw terminals, crimped spade terminals and lever connectors. A soldering iron is used only to press in threaded inserts.

Specification summary
ItemValue
Type2-way vented bookshelf, one amp board per speaker
DriversSB13PFCR25-4 5" woofer + SB26STCN-C000-4 26 mm tweeter, 4 Ω
Net volume7.9 L, vent tuned to 57.5 Hz (Ø40 mm port, 114 mm)simulated
CrossoverLinkwitz-Riley 4th order at 2.0 kHz, in the amp’s DSP
Low end, one speaker−3 dB at 67 Hz, −6 dB at 55 Hz (anechoic); about 49 / 45 Hz near a wallsimulated
Sensitivity86.8 dB at 2.83 V, 1 m, after a 4 dB baffle-step cutsimulated
Max levelabout 96 dB at 80 Hz, 98 dB at 100 Hz, 104 dB at 1 kHz (limited by the drivers and port, not the amp)simulated
On-axis smoothness±2.4 dB from 150 Hz to 16 kHz against the target curvesimulated
Power24 V Mean Well brick per speaker; board dissipation about 1.5 W idle, about 3 W loudsimulated
Size of each printlargest part 210 × 216 × 193 mm; fits the 256 mm bed of a Bambu Lab P2S
Sub-readyan 80 Hz high-pass on the woofer channel and a sub on the same network (later)

Figures marked simulated come from a computer model fed with manufacturer datasheet data. Nothing has been measured.

02 / What you need

The parts list for a pair.

Total for the pair: about EUR 360 for the quantities used, or about EUR 415 if you buy the whole packs and spools listed. Prices are snapshots from 16 October 2026 and will move. Items marked ships with your JLC order can go in the same LCSC / JLC order as the Relay boards. Stock changes, so check LCSC before ordering.

Drivers

EU driver shop: SoundImports (or another EU SB Acoustics dealer)

ItemQtyPart / codeUnit priceSource
Woofer 5" 4 Ω2SB Acoustics SB13PFCR25-4EUR 28.45SoundImports ↗
Tweeter 26 mm 4 Ω2SB Acoustics SB26STCN-C000-4EUR 30.12 (36.45 list)SoundImports ↗
about EUR 117 for the four drivers

Amp board

Sonocotta’s shops (Tindie, Lectronz or Elecrow)

ItemQtyPart / codeUnit priceSource
Streamer + DSP amp2Sonocotta Louder-ESP32-Plus, ESP32-S3 variant (one per speaker)USD 29Lectronz ↗
about EUR 55 plus about EUR 15 shipping and VAT. Tindie has shown it sold out since 8 Sep 2026, so check Lectronz and Elecrow too

Board shops: Tindie ↗, Lectronz ↗, Elecrow ↗

LCSC / JLC items ships with your JLC order

Can ship in the same LCSC / JLC order as the Relay boards

ItemQtyPart / codeUnit priceSource
24 V 2.5 A power brick2Mean Well GST60A24-P1J · C194308USD 13.63LCSC ↗ JLC
Heat-set insert M4 × 8 × 632 (+8 spare)ZHONGYI m4*8*6 (JLC parts library) · C20618342USD 0.05JLCPCB ↗ JLC
Heat-set insert M3 × 5 × 436 (+6)ZHONGYI m3*5*4 (JLC parts library; JLC stock was 0 on 16 Oct, check) · C20618319USD 0.02JLCPCB ↗ JLC
Heat-set insert M2.5 × 5 × 3.58 (+4)ZHONGYI m2.5*5*3.5 (JLC parts library; JLC stock was 0 on 16 Oct, check) · C20618310USD 0.02JLCPCB ↗ JLC
Screw M3 × 8 countersunk28KM3X8 · C357347USD 0.002LCSC ↗ JLC
Screw M4 × 20 socket head8DIN912 A4 (JLC parts library; JLC stock was 0 on 16 Oct, check) · C5210517USD 0.02JLCPCB ↗ JLC
WAGO lever connector8221-412 (JLC parts library) · C108739USD 0.54JLCPCB ↗ JLC
Female faston 4.75 mm, insulated, for the driver tabs8FDFD1.25-187(5). Measure the tabs first. Out of stock at LCSC on 16 Oct; JLC stock 3 · C191388USD 0.09LCSC ↗ JLC
Female faston 6.35 mm, insulated, for the driver tabs (alternative)8FDFNY1.25-250. Use this one if the tabs are 6.35 mm wide · C160823USD 0.11LCSC ↗ JLC
Fork spade for the board’s screw terminals8SV1.25-3.5S · C125334USD 0.05LCSC ↗ JLC
about USD 45 for the pair of speakers

Hardware and extras

EU shops: Amazon.es, SoundImports, UHU and Soudal from Amazon.es. Prices are pack prices, you need far fewer than you get

ItemQtyPart / codeUnit priceSource
Mains cord C13, EU plug2Mcbazel C13 cord, 1.5 m, angled Schuko plugEUR 7.40Amazon.es ↗
Screw M4 × 16 countersunk, black16Drenky ISO 10642 / DIN 7991, black A2 stainless, 50 pcs (stainless, not 10.9 steel)EUR 10.99 per 50Amazon.es ↗
Screw M4 × 12 button head, black (woofer)8Caianwin ISO 7380, black carbon steel, 50 pcsEUR 7.48 per 50Amazon.es ↗
Screw M3 × 10 button head, black (tweeter)8Black A2 stainless, round head, hex socket, 20 pcs (ISO 7380 style)EUR 5.49 per 20Amazon.es ↗
Screw M2.5 × 6 (board)8PATIKIL round head Phillips, 304 stainless, 60 pcs (only 5 in stock on 16 Oct)EUR 9.29 per 60Amazon.es ↗
Speaker hook-up wire 2 × 0.75 mm²2 mSoundImports OFC loudspeaker wire, orange/blue, per metreEUR 1.29/mSoundImports ↗
Rubber grommet, Ø10 hole (divider pass-through)2QUARKZMAN conical grommet, Ø10 mm, 6 mm bore, 20 pcsEUR 8.99 per 20Amazon.es ↗
Damping: polyester or acoustic wool, 15–20 mmabout 0.4 m²Visaton 5070 polyester, two mats 60 × 33 cm (0.4 m²), 25 mm thick, so thin it downEUR 5.74 (6.95 list)SoundImports ↗
Sealant: acrylic, for the joints1Soudal acrylic sealant, 300 ml, whiteEUR 2.50Amazon.es ↗
2-part epoxy for the scarf joint and port1UHU Plus Endfest 300, 33 gEUR 14.99Amazon.es ↗
CA glue for small fixes (optional)1Loctite Super Glue-3, 3 × 1 gEUR 4.99Amazon.es ↗
Self-adhesive rubber feet8Metafranc round black feet, Ø15 mm (not Ø12), 25 pcsEUR 5.66 per 25Amazon.es ↗
about EUR 60 for damping, wire, sealant, glue, grommets and feet; about EUR 33 for the four small-screw packs (whole packs); about EUR 15 for the two cords

Filament

Bambu Lab EU store (ships from Germany)

ItemQtyPart / codeUnit priceSource
Charcoal PLA (Matte)about 3.4 kgBambu PLA Matte Charcoal (11101), 1 kg spoolEUR 19.99 per spoolBambu Lab ↗
PETG, dark grey or black (for body_upper)about 1.3 kgBambu PETG HF Black (33102), 1 kg spoolEUR 19.99 per spoolBambu Lab ↗
Neon green (#b1fc65-ish) PLA or PETG50 gBambu PETG HF Lime Green (33501), 1 kg spool (closest Bambu colour)EUR 19.99 per spoolBambu Lab ↗
about EUR 90 for roughly 4.5 kg plus the green, by weight; whole spools come to about EUR 140 (4+ spools get a discount)
Optional: a USB measurement microphone (UMIK-1 or similar, about EUR 100) and the free REW software, for checking the sound once the speakers are built. Strongly recommended.
Fallback: if you would rather feed the speakers from the Relay’s RCA output, the design has a variant using one four-channel amplifier (Dayton KABD-4100) in the left speaker. It is described in the repository’s build guide.
Mains safety. The recommended build uses sealed, ready-made 24 V power bricks, so no mains wiring is done inside the speaker. Keep it that way.

03 / Print it

Settings below are a Bambu Studio command-line estimate for a Bambu Lab P2S with a 0.4 mm nozzle: the 0.24mm Standard @BBL P2S process, 5 top and 4 bottom layers, no supports. These are slicer estimates, not measured prints. Charcoal PLA for most parts, PETG for the upper body because it holds the warm board.

Print orientation of all ten STL parts on a 256 mm printer bed, with part names and sizes
Every STL is already in print orientation, centred, and fits the 256 × 256 mm bed with at least 10 mm margin.
PartPer pairMaterialOrientationWalls / infillSupportsTime eachFilament each
body_lower2PLA Matte charcoalupright (as exported)4 / 25 % gyroidnone21.5 h1.05 kg
body_upper2PETG (hosts the board)upside down (as exported)4 / 25 % gyroidnone12.4 h0.61 kg
baffle_lower2PLA Matte charcoalfront face up4 / 25 % gyroidnone5.4 h222 g
baffle_upper_L1PLA Matte charcoalfront face up4 / 25 % gyroidnone4.3 h167 g
baffle_upper_R1PLA Matte charcoalfront face up4 / 25 % gyroidnone4.3 h167 g
rear_plate_lower2PLAouter face down4 / 40 %none3.5 h154 g
rear_plate_upper2PETG or PLAouter face down4 / 40 %none1.1 h44 g
port_tube2PLAstanding, flare down3 / 100 %none0.9 h52 g
accent_strip_green2neon greenflat2 / 100 %none3 min1 g
accent_ring_green2neon greenflat2 / 100 %none4 min2 g
Pair total (18 prints)about 98 habout 4.6 kg

Download the STL files

All ten files, about 2.6 MB in total, all checked watertight and within the bed. Print the quantities in the table above.

Printing notes

  • Test first. Print one port_tube and one baffle_upper to check the driver rebates, insert holes and port socket on your printer before committing about 100 hours.
  • No supports. Screw bosses are 45° corbels, the baffles meet on a 45° scarf and the port flares are concave or 45°. Bambu Studio warns of a “floating cantilever” on body_upper: that is the four board standoffs and the finned joint bosses, which should bridge. If they sag, paint supports on just those.
  • Walls. The 8 mm cabinet walls print as 4 perimeters with a 25 % gyroid core, a stiff light sandwich that is simulated to push panel resonances up about 20 % versus solid. Do not go below 3 walls or 15 % infill.
  • PETG prints best on the textured PEI plate with glue stick.
  • Faster: a 0.6 mm nozzle at 0.30 mm layers should cut the time by roughly 40 %.
  • Optional, untested: sand-filled side walls for more damping. Do one tub first.

Option / Wooden front (olive)

An olive-wood front, the same box behind it.

This variant replaces the two printed baffles with one solid piece of kiln-dried olive wood, 20 mm thick. The printed body behind it, the 7.9 L volume, the port tuning (57.5 Hz) and the DSP settings stay the same. Like the rest of the speaker it is designed, not built, and the wood figures are estimates.

Two CAD renders side by side: the charcoal speaker with a neon seam strip and tweeter ring, and the same speaker with a one-piece olive-wood front and a thin green line along the body edge
CAD renders, not photos: printed baffle (left) and olive baffle (right).

What changes

PrintedOlive
Baffle2 printed plates, 18 mm, 45° scarf1 piece of olive, 20 mm, 210 × 300 mm, R12 roundover
Neon accentStrip on the seam, ring round the tweeterGreen strips in a groove round the printed body, 6 mm behind the wood (sides and top). No groove in the wood
Body frontTongue into the baffle grooveGasket seat: 5 × 2 mm groove for 5 × 3 mm EPDM closed-cell cord
DriversScrews into brass insertsWood screws in pilot holes (M4 wood inserts for repeated removal)
PortFlare printed in the baffleR12 roundover routed into the Ø40 bore; a 104 mm printed tube glued in from the back
Depth236 mm238 mm (the extra 2 mm of wood goes forward)
front only

Acoustic effect

The first bending mode of the front moves from about 600–700 Hz (printed sandwich) to roughly 0.9–1.3 kHz in 20 mm olive, and the twice-as-heavy baffle radiates less. The printed sides, top and divider keep their 370–550 Hz modes, so the cabinet as a whole still needs the lining and bracing. Estimates from a plate model, not measurements.

+EUR 90–210

Cost for the pair

Kiln-dried olive blanks, often glued from staves (about EUR 40–100), CNC or carpentry work with the supplied DXF (about EUR 40–100) and hard-wax oil (about EUR 15), minus about EUR 16 of filament. Unverified estimates: get two or three local quotes.

−19 h

Less printing

About 79 h and 3.8 kg of filament for the pair instead of 98 h and 4.6 kg (slicer estimates), because the baffles come out of the printer. Each speaker gets about 0.4 kg heavier: each baffle is about 0.78 kg of wood.

Buying the wood

  • Kiln-dried olive, 8–10 % moisture. Ask for a meter reading. Fresh or air-dried olive moves and cracks badly.
  • Size per baffle: finished 210 × 300 × 20 mm, so rough stock of at least 230 × 330 × 25–27 mm. Two baffles, plus a spare blank if the board has defects.
  • One quartersawn board is best. Wide clear olive is rare, so 3–4 edge-glued staves are fine. Grain vertical (along the 300 mm), growth rings alternating between staves, joints away from the narrow bridges between the cut-outs.
  • Reject checks (cracks), pith, bark inclusions or loose knots near the woofer, tweeter or port cut-outs, or near the screw positions 14 mm from the edges. Small tight knots in the middle are decoration.
  • Acclimatise the wood for 1–2 weeks in the room where the speakers will live, stickered with air on both faces, then plane both faces equally to 20 mm.
  • Finish: sand to P180–240, wipe with alcohol (olive is oily), two thin coats of hard-wax oil on the front and edges, and seal the back face and every cut-out too so the board stays flat.

A CNC shop works straight from the DXF or STEP. With a hand router, stick the 1:1 template on the front, centre-punch every cross and cut the rebates and cut-outs with a circle jig. Test the rebate depths on scrap so the driver flanges sit flush. Print the body halves, rear plates, port and green strips from the repository’s speakers/stl/olive folder: those body halves have the gasket seat and the accent groove.

Cutting drawings

1:1 template: print at 100 %. Print the PDF on A3 at actual size, with no “fit to page” scaling, and measure a known dimension before you cut. Tell the shop: 20 mm finished, kiln-dried, grain vertical, two pieces plus a spare blank.

04 / Assemble it

Solder-free, one speaker at a time.

Nothing has been built yet, so treat the steps as a plan that the first prototype will correct. Do every step twice, once per speaker. The 3D model below walks through the same eleven steps on the real CAD parts; switch it to the olive front, explode it, or cut it open to see the port, the damping and the board bay.

Render of the assembled left speaker from the front three-quarter view
Assembled, front three-quarter.
Exploded render: two body halves, two baffles, port, two rear plates, drivers and neon inlays
Exploded: body halves, baffles, port, rear plates and the neon inlays.
  1. Press in the heat-set inserts

    Use a soldering iron with an insert tip, about 220 °C for PLA and 240 °C for PETG. No solder is involved.

    Baffle lower: 4 × M4. Baffle upper: 4 × M3. Body lower: 4 × M4 in the front corbels, 4 × M4 in the column tops at the split, 8 × M3 in the rear face. Body upper: 4 × M4 in the front corbels, 6 × M3 in the rear face, 4 × M2.5 in the board standoffs.

    No iron at all? The CAD has a self-tapping option for thread-forming plastic screws, fine for a few reassemblies.

  2. Test-fit before gluing

    Check the woofer and tweeter sit flush in their rebates, the port tube fits its socket snugly, and the tongue of one body half slides into the groove of the other with light pressure.

  3. Join the body halves

    Run a bead of sealant in the groove of the upper body, stack it on the lower body and fit the four M4 × 20 bolts: two at the front inside the chamber, reached through the open front, and two in the rear bay. Wipe off squeeze-out inside.

  4. Glue the port

    Epoxy (or CA glue for PLA) the port tube into the socket on the back of the upper baffle, flare towards the inside. Check it is square.

  5. Fit the baffles

    Dry-fit both baffles. Then add sealant in the baffle grooves, glue the 45° scarf faces together with epoxy, and fix each plate with four countersunk M4 × 16 screws. Let it cure.

  6. Add the neon inlays

    Glue the green strip into the seam groove and the ring around the tweeter, a drop of CA glue every 2 cm. The strip covers the scarf seam.

  7. Damping, before the drivers

    Line the divider (both sides), the top and the bottom of the chamber with 15–20 mm wadding, about 0.18 m² per speaker, using spray adhesive or hot glue. Keep 30 mm clear in front of the port’s inner end, and add a light loose layer behind the woofer.

  8. Wire through the divider

    Pass two pairs of 0.75 mm² wire, one for the woofer and one for the tweeter, about 40 cm each, through the Ø10 hole in the upper divider. Fit the grommet and seal around the wires with silicone. The box must be airtight. Mark the plus wires.

  9. Connect and mount the drivers

    Crimp insulated female fastons on the wire ends. Measure the tab widths first. If a tab will not take a faston, use a WAGO 221 lever connector on a short tail. Push them on with red (+) to the marked wire.

    Mount the woofer with four M4 × 12 screws and the tweeter with four M3 × 10, tightening in a cross pattern only until the flange seats. Over-tightening cracks PLA.

  10. Mount the amp board in its vented bay

    The board lives in the rear bay, outside the sealed chamber. Screw it onto the four standoffs with M2.5 × 6 screws, components facing out through the window. Crimp fork spades on the wires and connect the woofer to output A and the tweeter to output B. Check the silkscreen for which terminal is which. Leave the bay vents uncovered.

  11. Rear plates, feet, power brick

    Fit the lower rear plate (slots at the bottom) and the upper rear plate (the window) with M3 × 8 countersunk screws, and stick four rubber feet underneath. Plug the 24 V brick’s lead into the board’s barrel jack through the window. The brick connects to the wall with a normal C13 mains cord and stays outside the speaker.

Wiring, per speaker

Wiring diagram for one speakerMains goes through a C13 cord to a 24 V brick, then to the amp board's DC jack. Board output A drives the woofer and output B the tweeter, through a sealed grommet in the divider.Wall socket, 230 VC13 mains cordMean Well GST60A2424 V brick, outside the speaker5.5 / 2.1 mm DC plugLouder-ESP32-Plus (in the vented bay)DC jack in · Wi-Fi · TAS5825M + DSPOUTPUT Ascrew terminalsOUTPUT Bscrew terminalsfork spades,0.75 mm² wirefork spades,0.75 mm² wiredivider grommet, sealed with siliconefaston (red = +)faston (red = +)WooferSB13PFCR25-4TweeterSB26STCN-C000-4Sealed chamber below the grommet, vented bay above.

Simplified wiring. Confirm the terminal labelling on your board’s silkscreen.

Sealing check, before any music

With the drivers in and the rear plates off, cover the port mouth with tape. Push the woofer cone in gently with flat fingers: it should spring back slowly. A quick return or a hiss means a leak, so check the body split, the scarf, the baffle edges and the grommet, and fix it with sealant. Remove the tape afterwards.

05 / Set up the sound

Flash, tune, pair.

Firmware caveats. The only firmware path today that gives both Wi-Fi streaming and an editable bi-amp crossover on this board is an open-source AirPlay receiver, and it is licensed for non-commercial use only. That is fine for a personal build, not for selling speakers. Squeezelite (for Lyrion) and Snapclient (for Snapcast) on the ESP32-S3 are experimental or beta and not fully stable. ESPHome, usable with Home Assistant, also runs on the board, but its ready-made crossover profiles for bi-amping are still only planned. Checked 16 Oct 2026.
  1. Flash the board

    Use the browser installer for the airplay-esp32 project in Chrome or Edge, pick the louder-esp32-s3-plus target, connect the board by USB-C and flash. The web interface files are included in the web install.

  2. Join Wi-Fi and name the boards

    Join your network through the board’s setup access point, then name one “Yolk L” and the other “Yolk R” on their web pages.

  3. Before connecting the brick for real

    In the board’s web interface, mute output B (the tweeter) and set the maximum volume to about 50 %. The factory signal chain sends full-range audio to both outputs, and bass would damage the tweeter until the crossover is in.

  4. Load the crossover

    Open the board’s /bq equaliser page at its IP address. Set routing to “one channel to both outputs”: Left on Yolk L and Right on Yolk R, outputs not ganged. Use “Build crossover” with “both bands on one amplifier”, 2000 Hz, Linkwitz-Riley 24 dB/oct, then add the three extra filters from the table below by hand. Apply, then unmute B at low volume, listen, and “Commit to flash” once it sounds right.

  5. Check polarity

    Temporarily tick Inv on B. The sum should get clearly worse, with a deep dip around 2 kHz. If it gets better, a driver is wired backwards: fix the wiring, not the tick box.

  6. Pair left and right

    Group “Yolk L” and “Yolk R” in your AirPlay controller (for example Control Center or a Music Assistant group). Play a mono click track and sit at the listening position: you should hear one sharp, centred click, not two.

DSP values (starting point, simulated)

Levels: A (woofer) 0 dB, B (tweeter) −4.5 dB. Inv: none. These are a simulated starting point and should be refined by measurement.

OutputBQTypef (Hz)QGain (dB)Note
A (woofer)1High pass, Butterworth 2400.707–Subsonic guard. Becomes 80 Hz once you add a sub
A (woofer)2Low pass, Butterworth 220000.707–LR4 with BQ 3
A (woofer)3Low pass, Butterworth 220000.707–
A (woofer)4High shelf2600.6−4.0Baffle-step compensation, done as a cut to keep headroom
B (tweeter)1High pass, Butterworth 220000.707–LR4 with BQ 2
B (tweeter)2High pass, Butterworth 220000.707–
B (tweeter)3Phase shift (all-pass, 2nd order)26000.92–Time alignment: the woofer’s acoustic centre is about 58 µs late and the web UI has no delay block

The board’s equaliser also accepts raw biquad coefficients; the repository’s DSP file lists them at 48 kHz.

First power-on checks

  • Drivers wired plus to plus (red tab), woofer on A and tweeter on B, no stray strands at the screw terminals.
  • Output B muted and max volume about 50 % before the first stream.
  • Power the brick. The board LED comes up, with no smell or noise. After 10 minutes the board should be warm, not too hot to hold.
  • Stream quietly and check the woofer alone. Then enter the crossover, unmute B and check the tweeter alone (mute A). Then both together.
  • The sealing check passed, and there are no buzzes on a slow 20–200 Hz sine sweep at moderate volume.
  • After an hour of loud playback, the board and standoffs stay below about 60 °C. Keep the bay vents uncovered and don’t push the speaker against a wall that closes the window.

06 / How it sounds on paper

Simulation only. Nothing measured.

These are computer simulations. They are built from datasheet data and digitised curves, with no room and no real prototype. Treat them as design aims, not performance claims.
Simulated plot: Crossover and directivity
Crossover and directivity simulated
The woofer and tweeter hand over at 2 kHz and the combined on-axis line stays within about ±2.4 dB. Dips appear 20° above and below the tweeter axis, so sit with your ears near tweeter height.
Simulated plot: Box tuning
Box tuning simulated
The chosen vented box (blue) reaches lower than a sealed box of the same size, at the cost of falling off faster below the vent frequency.
Simulated plot: How loud it can get
How loud it can get simulated
The limit comes from woofer excursion, port air speed and the woofer’s thermal rating, not from the amplifier. Bass is the first to run out.
Simulated plot: Excursion and port speed
Excursion and port speed simulated
Without the 40 Hz subsonic filter, a full-power low note would overdrive the woofer and the port. With it, the cone stays much closer to its limit. Port speed still exceeds the 17 m/s comfort line at full power, hence the volume limit.

07 / Known risks

What could go wrong.

A design that has never been built has open questions. These are the ones to know about before you spend 100 hours of printer time.

Port air speed

At the 40 W rating the simulated air speed in the port peaks near 35 m/s with the subsonic filter (39 m/s without), well above the roughly 17 m/s where chuffing noise tends to start. Expect audible port noise at high volume. The mitigations are the flared port ends, a sensible max volume setting, and later a sub with the 80 Hz high-pass.

PLA panel resonance

The panels of a printed box ring. The simulation puts the first panel modes of the PLA sides, divider and bottom between roughly 370 and 550 Hz (with 25 % gyroid infill). That is in the vocal range. Lining and bracing help. If the knuckle test still rings, try sand-filled walls or a constrained-layer pad on the sides.

Board-bay temperature against PLA

The board is estimated to run about 40 K above room temperature, around 65 °C in a 25 °C room. PLA softens at about 57 °C and PETG at about 69 °C. So the board sits in a vented bay outside the sealed box, the upper body that holds the standoffs is PETG, and you check temperatures after an hour of loud playback. None of this is measured.

Stereo sync between two Wi-Fi boards

Each speaker is its own network receiver. Their multiroom sync is claimed by the firmware authors, but no inter-channel timing figure is published. A skew above roughly 50–100 µs would smear the stereo image. Check it with a mono click track at the listening seat. If it is a problem, a single two-channel board is the fallback.

Estimates to be fitted to measurement

Every acoustic figure comes from datasheet values and curves digitised by eye (about ±1.5 dB), including the drivers’ acoustic centres, the all-pass and the baffle-step amount. Measure with a USB mic and REW, then refit the levels, all-pass and shelf.

Firmware and supply

Only AirPlay firmware gives you both streaming and an editable crossover on this board today. Squeezelite and Snapclient are experimental on the S3, and the AirPlay firmware is licensed for non-commercial use only. The Plus board has been sold out on one shop, so check the others.

08 / Next

What comes after the pair.

A subwoofer

The speakers are sub-ready: change the woofer’s 40 Hz high-pass to 80 Hz and add a third board in bridged mode with an 80 Hz Linkwitz-Riley low-pass, in the same group. Or use any active sub with an 80 Hz low-pass.

The Yolk Speaker

The bigger idea is an all-in-one Yolk Speaker with the streamer, amplifier and power supply inside. This pair is a step towards it: the electronics, the 24 V supply and the DSP tuning carry over, and a custom board could later be assembled by JLC.

Source files

The CAD, simulation scripts and sourcing notes are in the Yolk repository’s esp32-hifi-dac/speakers folder, with the full build guide and design notes.