| Workbook | FlashKa_Parts_List_v0.6.xlsx (repository root) |
| Generator | tools/parts_list.py (run python3 tools/parts_list.py, see section 7) |
| Price-check date | 2026-10-18 (v0.6 check). Readings that did not change since v0.5 keep the date they were read: 2026-10-14. The JLCCNC, JLC3DP and Alps switch pages were read on 2026-10-16 (v0.6 parts research). |
| Pages not read | The JLCPCB and LCSC pages of the two new parts, C115357 and C25104, could not be read on 2026-10-18. Those two lines are ESTIMATES (sections 3.2, 3.10 and 4). |
| Exchange rate | 1.1188 USD per EUR (ECB euro reference rate of 13 Oct 2026, not refreshed in v0.6; input cell Summary!B6) |
| Delivery to | Lithuania (EU): VAT 21 %, EU customs rules of 2026 |
This file explains (1) how to read the workbook, (2) the result and what changed from v0.5, (3) where every number comes from, with URL and date, (4) which numbers are only estimates and how to replace each with a real quote, (5) what is most uncertain and (6) what you must re-check before you order. It does not repeat every cell of the workbook: each price row in the workbook carries its own source URL and date.
The idea. The light is made from six groups of things, bought from different places. The workbook prices every group, then adds the costs people forget (shipping of every separate parcel, 21 % VAT, the new EU customs duty, bank fees) so that the Summary shows what really leaves your bank account.
| Group | Where you buy it | Sheet |
|---|---|---|
| Circuit board, soldered and tested by the factory | jlcpcb.com (PCB + assembly) | JLCPCB order, Main PCB BOM |
| Aluminium body (tray + lid, laser-marked) and the three stainless caps | jlccnc.com | Housing |
| The seven small see-through resin parts (ordered as one print kit) | jlc3dp.com | Housing |
| Cells, LED board, laser module, glass, screws, ring, wire, tapes, silicone pads, adhesives | AliExpress or an EU web shop | Bought parts |
| Shipping, VAT, customs, bank fees, spares, risk | - | Hidden costs |
| Tools you need once (soldering iron, multimeter, laser glasses …) | any shop | Tools |
Summary is the first sheet and Ordering checklist is the last: it lists, in order, what to order where, which file to upload and what to check before paying.
Every file to upload is named with its place in the ready-to-upload folder of the package: order_files/1_JLCPCB/, order_files/2_JLCCNC/ and order_files/3_JLC3DP/ (section 6, item 2).
Colour code (also written at the top of the sheets):
| Look | Meaning |
|---|---|
| blue number | typed-in number you may change (price, fee, quantity) |
| blue number on amber background | ESTIMATE: no public price exists or it could not be read; replace it with a real quote when you have one |
| black number | formula: do not type over it |
| green number | copied from another sheet |
| dark blue row / light blue row / light green row | table header / section title / total |
“TOO SMALL” (sheet Housing, section 8) |
the part alone is below the printer’s minimum size; red only if such a part is ordered on its own (the RF window insert is ordered inside the print kit, see section 3.6) |
Two scenarios. Scenario A = you build 1 light, scenario B = you build 5 lights (Summary!B7 and Summary!B8: type any other numbers, for example 2).
The JLC minimums are built in: JLCPCB sells at least 5 bare boards per design (in steps of 5) and assembles from 2 boards, so one light still pays for 2 assembled boards.
The Summary shows totals in USD and EUR, per light, and the extra cost of each additional light (the set-up and stencil fees, the anodizing lot fee, the marking set-up and most shipping are paid once).
The Summary also has a group “What changed from v0.5” with the cost delta (section 2).
Putting in real numbers. Every total is a formula, so you only change inputs:
| What | Cell |
|---|---|
| bare PCB price shown by JLCPCB after the Gerber upload (price for 5 boards) | JLCPCB order!B44 |
| JLCCNC instant quote for tray + lid (with finish and marking, no shipping), scenario A / B | Housing!B87 / Housing!C87 |
| JLCCNC instant quote for the three stainless caps (no shipping), scenario A / B | Housing!C99 / Housing!E99 |
| JLC3DP instant quote for the print kits (no shipping), scenario A / B | Housing!E116 / Housing!G116 |
| stainless caps ordered (1) or the resin caps of the print kit used instead (0) | Housing!B92 |
| laser marking ordered at JLCCNC (1) or an adhesive label instead (0) | Housing!B30 |
| surface finish of the aluminium (drop-down) | Housing!B41 |
| “Shipping Estimate” of each cart (economy / express, A and B) | Hidden costs!B20:E22 |
| shipping mode 1 = economy, 2 = express | Hidden costs!B11 |
| price of any bought part | column F of Bought parts |
| exchange rate | Summary!B6 |
| lights built, scenario A / B | Summary!B7 / Summary!B8 |
Leave a quote cell empty to use the workbook’s own estimate; type a number to override it. The Summary column “Where to replace it with a real number” names the cell for each row.
| USD (EUR) | 1 light | 2 lights (B = 2) | 5 lights |
|---|---|---|---|
| 1. PCB + assembly (JLCPCB), before shipping | $174.33 (EUR 155.82) | $174.33 (EUR 155.82) | $194.69 (EUR 174.01) |
| 2. Housing (aluminium + stainless caps + resin print kit) | $122.56 (EUR 109.54) | $187.52 (EUR 167.60) | $382.39 (EUR 341.78) |
| 3. Bought parts (cells, LED board, laser, glass, screws, ring) | $56.75 (EUR 50.72) | $94.65 (EUR 84.60) | $211.30 (EUR 188.86) |
| 4. Consumables (wire, tapes, silicone pads, adhesives) | $27.79 (EUR 24.84) | $27.79 (EUR 24.84) | $27.79 (EUR 24.84) |
| 5. Shipping, VAT, customs duty, carrier and card fees | $238.78 (EUR 213.43) | $290.99 (EUR 260.09) | $378.82 (EUR 338.60) |
| Total for the lights | $620.21 (EUR 554.35) | $775.28 (EUR 692.95) | $1,194.99 (EUR 1,068.10) |
| Per light | $620.21 (EUR 554.35) | $387.64 (EUR 346.48) | $239.00 (EUR 213.62) |
| Tools, one-time (only the tools marked needed) | $135.00 (EUR 120.66) | same | same |
| Risk reserve, not in any total: a second PCB + assembly order | $253.73 (EUR 226.79) | ||
| Risk reserve, not in any total: a second housing order | $180.18 (EUR 161.04) |
The Summary sheet shows the 1-light and the 5-light columns. The 2-light column is the same workbook with Summary!B8 set to 2 (checked: the recalculated workbook equals the Python model in all 515 compared cells).
Item 5 in detail (1 light / 2 lights / 5 lights): shipping $81.00 / $84.00 / $84.00, VAT $97.11 / $121.99 / $194.12, customs duty and carrier fees $53.70 / $76.41 / $88.00, card fee $6.97 / $8.58 / $12.70.
Change from v0.5 (same scenarios, same exchange rate; v0.5 values from its workbook of 2026-10-14):
| USD | v0.5, 1 light | v0.6, 1 light | change | v0.5, 5 lights | v0.6, 5 lights | change |
|---|---|---|---|---|---|---|
| 1. PCB + assembly | $169.31 | $174.33 | +$5.02 | $196.67 | $194.69 | -$1.98 |
| 2. Housing | $65.96 | $122.56 | +$56.60 | $225.40 | $382.39 | +$156.99 |
| 3. Bought parts | $56.75 | $56.75 | +$0.00 | $211.30 | $211.30 | +$0.00 |
| 4. Consumables | $18.29 | $27.79 | +$9.50 | $18.29 | $27.79 | +$9.50 |
| 5. Shipping, VAT, customs, fees | $219.32 | $238.78 | +$19.46 | $329.89 | $378.82 | +$48.93 |
| Total for the lights | $529.63 | $620.21 | +$90.58 | $981.55 | $1,194.99 | +$213.43 |
| Per light | $529.63 | $620.21 | +$90.58 | $196.31 | $239.00 | +$42.69 |
In EUR the 1-light total goes from EUR 473.39 to EUR 554.35, the 5-light total from EUR 877.33 to EUR 1,068.10.
Biggest cost items (1 light).
The resin parts cost little: JLC3DP prints them as one print kit, $1.20 for 1 light (2 kits incl. the spare), $3.60 for 5 lights (6 kits). Every additional light after the first costs about $143.69 more (the Summary shows it).
The EUR 150 cliff. Up to EUR 150 goods value per parcel the EU collects VAT at the checkout (IOSS) and a flat EUR 3 duty per customs line. Above EUR 150 the parcel needs formal customs
clearance and the carrier charges a handling fee of about EUR 15. The JLCPCB order for 1 light has goods of about EUR 155.82 ($174.33 before shipping), i.e. EUR 5.82 above the line, so the workbook routes it through formal clearance,
which costs about $10.07 more than the IOSS route (Hidden costs, section 6). If the real PCB and component prices are $6.51 or more lower in total, the parcel falls below the line and the bill drops by about $10.07 (plus the lower goods).
With 5 lights both the JLCPCB order (EUR 174.01) and the JLCCNC order (EUR 338.57) are above the line. Keep the three JLC orders as three separate parcels.
“READ” = copied from the vendor page on the date given. “ESTIMATE” = no public price or not readable; the cell is blue on amber and explained in its note column. “COMPUTED” = formula from READ inputs. Sections 3.1 to 3.10 follow the order of the sheets.
JLCPCB order, section 5Fee page: https://jlcpcb.com/help/article/pcb-assembly-price, shows “Last updated on Sep 09, 2026”, read 2026-10-14. The board has parts on both sides, so it needs Standard PCBA, double-sided (Economic PCBA is single-sided only and charges $3.07 per Extended part; Standard charges the feeder fee per unique part instead, Basic or Extended alike, and has no separate engineering fee). The page was not read again in v0.6: every rate is unchanged, only the quantities follow the new board (232 joints per board, 34 unique parts, 3 X-ray parts per board).
| Fee | Rate | Used for this order |
|---|---|---|
| Set-up fee (Standard PCBA) | $25.56 per side | 2 sides = $51.12 |
| Stencil (Standard PCBA) | $8.21 per side | 2 sides = $16.42 |
| SMT assembly | $0.0016 per solder joint | 232 joints per board x boards assembled |
| Feeder loading | $1.53 per unique part (Basic and Extended) | 34 unique parts = $52.02 |
| Confirm parts placement (optional, recommended) | $0.45 per order | included |
| X-ray inspection (“required for components such as BGA, QFN, and other leadless packages”) | per part, tiered by the order total: 1-10 $1.64, 11-50 $0.82, 51-200 $0.49, 201-500 $0.33, 501-1000 $0.25, 1001-3000 $0.16, 3001+ $0.082 | 3 parts per board (ESP32 module U4, ring LEDs LED3 and LED4): ESTIMATE of the count (v0.5: 2) |
| Panelisation of small boards (https://jlcpcb.com/help/article/Panelizing-your-PCB-for-Assembly) | minimum $0.46 per board | included (assumed to apply, see section 4) |
| Packing | $0.50 + $0.00003 per cm2 | included |
| Hand-soldering $3.58, pre-reflow $0.016 per joint, single-board surcharge $0.48, fixture $8.21, storage $4.93, large board $57.46 (above 650 cm2) | listed on the page | quantity 0: not needed for this board |
Other JLCPCB pages used: assembly from 2 boards https://jlcpcb.com/pcb-assembly; 5 bare boards minimum and the price calculator https://cart.jlcpcb.com/quote; capabilities (4 layers, 0.8 mm, ENIG) https://jlcpcb.com/capabilities/pcb-capabilities; extra pieces for placement loss are billed inside the component price https://jlcpcb.com/help/article/pcb-assembly-faqs-part-2.
Main PCB BOMEvery price tier and the retail stock of the 32 READ lines were read on 2026-10-14 from https://www.lcsc.com/product-detail/<LCSC number>.html; each row of the sheet links to that page (column E) and prints the URL and date (column AJ).
The library type (Basic / Extended) was read on https://jlcpcb.com/partdetail/<LCSC number>; the Basic parts list is at https://jlcpcb.com/parts/basic_parts.
The unit price is the tier that matches the quantity JLC has to buy (quantity per board x boards + extra pieces for placement loss).
The BOM has 34 lines, 68 placements, 232 solder joints per board; it is derived from COMPONENTS in tools/kicad/flashka_parts.py with the same grouping and ordering as build_all.py
(lines with an empty LCSC number or dnp are skipped) and equals production/BOM_JLCPCB.csv (= order_files/1_JLCPCB/BOM_JLCPCB.csv) line by line.
The joint count of each line is the pad count of its footprint in the routed board kicad/FlashKa_main/FlashKa_main.kicad_pcb.
J2 (cells), J3 (LED) and J5 (laser) are wire pads without an LCSC number: JLCPCB does not assemble them, you solder the wires by hand. 20 lines are Basic, 14 are Extended (counting the two assumed types)
(in Standard PCBA both pay the same feeder fee, so the split does not change the price; the input for an extra Extended-part fee, JLCPCB order!B56, is 0).
Retail stock at LCSC is not JLC’s own warehouse stock; the JLC BOM upload shows the stock that matters.
New in v0.6. SW1-SW3 Alps SKRKAEE020 (C115357) x3 replace S1 (SKRTLAE010, C110293, removed); LED4 is a second NH-B1010RGBT-HF (C2874113, now x2 with LED3); R30 1 k (C11702), R31 2.2 k (C25879), R32 330 ohm (C25104; R23 changes from 1 k to 330 ohm as well), R33 and R34 100 ohm (C25076). Four of these numbers (C2874113, C11702, C25879, C25076) were already in v0.5 and keep their v0.5 readings (2026-10-14). The two lines C25104 (R23, R32) and C115357 (SW1, SW2, SW3) are new numbers whose pages could not be read on 2026-10-18: their tiers, stock and library type are ESTIMATES (section 3.10). The tiers of C115357 are those of its sibling, the Alps SKRPABE010 (C115360), read on LCSC on 2026-10-16 ($0.0759 at 10 pieces, $0.0616 at 100, stock 49,490, Extended on JLCPCB); the tiers of C25104 are those of the 5.1 k resistor C25905 of the same UNI-ROYAL 0402 series. Together they cost $0.56 for 1 light and $1.26 for 5 lights (of $17.32 and $32.72 for all components), so doubling both prices would add only $0.56 (1 light) or $1.26 (5 lights) before VAT.
| LCSC # | Designators | Manufacturer part | JLC type | Qty / board | LCSC stock 2026-10-14 |
|---|---|---|---|---|---|
| C15850 | C1 | CL21A106KAYNNNE | Basic | 1 | 20 low |
| C19702 | C2, C13, C15 | CL10A106KP8NNNC | Basic | 3 | 181,020 |
| C59461 | C5, C8 | CL10A226MQ8NRNC | Basic | 2 | 4,416,440 |
| C1555 | C9 | 0402CG220J500NT | Basic | 1 | 798,400 |
| C15195 | C11 | CL05B103KB5NNNC | Basic | 1 | 0 retail 0 |
| C52923 | C12, C14, C17, C18 | CL05A105KA5NQNC | Basic | 4 | 598,000 |
| C1525 | C7, C10, C16, C19, C20 | CL05B104KO5NNNC | Basic | 5 | 0 retail 0 |
| C82044 | D1 | ESD5Z5.0T1G | Extended | 1 | 370,780 |
| C165948 | J1 | TYPE-C-31-M-12 | Extended | 1 | 375,745 |
| C602028 | L1 | FHD4020S-1R0MT | Extended | 1 | 8,210 |
| C2874113 | LED3, LED4 | NH-B1010RGBT-HF | Extended | 2 | 345,020 |
| C15127 | Q1 | AO3401A | Basic | 1 | 164,910 |
| C5224240 | Q2, Q4, Q5 | 2N7002W-7-F-ES | Extended | 3 | 17,000 |
| C25905 | R1, R2 | 0402WGF5101TCE | Basic | 2 | 2,302,500 |
| C25890 | R3 | 0402WGF3301TCE | Basic | 1 | 867,600 |
| C25764 | R10 | 0402WGF2003TCE | Basic | 1 | 1,520,700 |
| C25792 | R12 | 0402WGF4702TCE | Basic | 1 | 3,114,700 |
| C25744 | R8, R9, R13, R18, R21, R22 | 0402WGF1002TCE | Basic | 6 | 2,846,900 |
| C25879 | R14, R31 | 0402WGF2201TCE | Basic | 2 | 586,000 |
| C4109 | R16 | 0402WGF2001TCE | Basic | 1 | 5,789,500 |
| C11702 | R19, R30 | 0402WGF1001TCE | Basic | 2 | 0 retail 0 |
| C25104 | R23, R32 | 0402WGF3300TCE | Basic (assumed) | 2 | not read |
| C25076 | R24, R25, R33, R34 | 0402WGF1000TCE | Basic | 4 | 4,360,400 |
| C26083 | R27, R28 | 0402WGF1004TCE | Basic | 2 | 541,000 |
| C25741 | R7, R11, R15, R17, R20, R26, R29 | 0402WGF1003TCE | Basic | 7 | 3,791,500 |
| C92740 | RS1 | MS05W2F200MT5E | Extended | 1 | 4,880 |
| C77130 | RT1 | NCP15WF104F03RC | Extended | 1 | 298,120 |
| C431540 | S2 | MSK12C02 | Extended | 1 | 170,330 |
| C115357 | SW1, SW2, SW3 | SKRKAEE020 | Extended (assumed) | 3 | not read |
| C12044 | U1 | TP4057-42-SOT26-R | Extended | 1 | 32,025 |
| C485117 | U2 | TLV62585DRLR | Extended | 1 | 925 low |
| C181502 | U3 | TLV333IDCKR | Extended | 1 | 18,425 |
| C2838502 | U4 | ESP32-C3-MINI-1-N4 | Extended | 1 | 8,387 |
| C841192 | U5 | RT9080-33GJ5 | Extended | 1 | 27,375 |
JLCPCB order, section 4JLCPCB shows the price of the bare board only after the Gerber upload at https://cart.jlcpcb.com/quote, so the workbook uses $25 for 5 boards (4 layers, 0.8 mm, ENIG, 24.0 x 16.5 mm; the range $12 to $40 is shown for information).
Anchors: a 100 x 100 mm 4-layer board x 5 is about $32.90 (https://pcbsync.com/pcb-prototype-services-compared/, vendor not named); “$16 for ENIG on small runs” (a 2020 forum post, https://forums.ghielectronics.com/t/enig-or-hasl-for-pcb-finish/23438);
a 24 x 16.5 mm board is far smaller than 100 x 100 mm. Replace the estimate with the real price in JLCPCB order!B44. The board outline (24.0 x 16.5 mm, 1.3 mm chamfers, 3.94 cm2) comes from cad/housing_interface.json (pcb_outline).
Both prices were set on 2026-10-14 and are unchanged.
Hidden costs, section 2JLC publishes no rate table; the cart shows a “Shipping Estimate” after you enter the address. Anchors for a small JLCPCB parcel: DHL Express $21.50, EuroPacket $6.50, Global Standard Direct Line $1.50
(Chiptron, 10 Jun 2025, https://chiptron.eu/jlcpcb-reduces-shipping-costs-pcb-order-with-shipping-worth-bad-beer/); FedEx about $16 to Spain (EEVblog 2024,
https://eevblog.com/forum/manufacture/jlcpcb-pcb-assembly-optimal-shipping-for-eu). The workbook defaults to express ($21.50 JLCPCB, $22 / $25 JLCCNC for 1 / 5 sets, $21.50 JLC3DP) because DDP (taxes paid at checkout) works most reliably;
economy ($6.50 JLCPCB, $7 / $9 JLCCNC for 1 / 5 sets, $6.50 JLC3DP) is selectable in Hidden costs!B11 and lowers the 1-light total by about $55.27 (5 lights: $57.67). JLCCNC and JLC3DP shipping are guesses from weight
(JLCCNC shows it only on the invoice; the stainless caps add a few grams). AliExpress: $2 per seller parcel and 8 parcels are assumptions. None of this changed in v0.6.
Hidden costs, sections 1 and 3 to 5| Input | Value | Status | URL (read 2026-10-14) |
|---|---|---|---|
| VAT Lithuania | 21 % | READ | https://jlcpcb.com/help/article/EU-VAT-E-commerce-Rules-%26-Adjustments |
| IOSS limit: goods value per parcel (VAT collected at checkout) | EUR 150 | READ | same page |
| Flat customs duty on low-value parcels, 1 Jul 2026 to 1 Jul 2028 | EUR 3 per customs line (item category) per parcel | READ | https://jlcpcb.com/help/article/eu-customs-reform-faq, https://trade.ec.europa.eu/access-to-markets/en/news/eu-applies-eu3-customs-duty-item-low-value-e-commerce-consignments, JLC3DP note https://jlc3dp.com/news/eu-customs-reform2026 |
| Carrier fee in formal clearance (above EUR 150) | max(EUR 15, 2 % of VAT + duty); examples on the page: DHL Germany 2 % min EUR 15, UPS 3 % min EUR 15.70, FedEx 2.5 % min EUR 15 | READ (examples) | https://jlcpcb.com/help/article/eu-customs-reform-faq |
| Tariff rates in formal clearance | JLCPCB 0 %, JLCCNC 6 % (aluminium articles, HS 7616 99 90; the whole parcel including the steel caps), JLC3DP 6.5 % (plastic articles, HS 3926 90), AliExpress 0 % | ESTIMATE (assumed HS codes; the invoice decides) | - |
| Customs lines per parcel | JLCPCB 2, JLCCNC 2 (aluminium parts + stainless caps; 1 if the caps are not ordered, Housing!B92 = 0), JLC3DP 1, each AliExpress parcel 1 |
ESTIMATE | - |
| Exchange rate | 1.1188 USD per EUR | READ (ECB, 13 Oct 2026) | https://www.ecb.europa.eu/stats/policy_and_exchange_rates/euro_reference_exchange_rates/html/eurofxref-graph-usd.en.html |
| Card / currency conversion fee on the JLC payments | 1.5 % | ESTIMATE (0-3 % depending on your bank) | - |
Not included: a unified EU customs handling fee of about EUR 2 per parcel that the EU plans for around Nov 2026 (not final when this was written), your own time, a second PCB or housing round (shown as risk reserve).
HousingThe real price of CNC and resin parts appears only after the STEP / STL upload, and JLCCNC publishes no per-part price at all, so the workbook estimates every housing price with a stated method.
Type the instant quotes into Housing!B87 / Housing!C87 (tray + lid, scenario A / B), Housing!C99 / Housing!E99 (the three stainless caps) and Housing!E116 / Housing!G116 (print kits) when you have them.
The housing costs $122.56 for 1 light and $382.39 for 5 lights: aluminium $93.36 / $302.79, stainless caps $28.00 / $76.00, resin print kits $1.20 / $3.60.
order_files/2_JLCCNC/FlashKa_tray.step + FlashKa_tray.pdf and FlashKa_lid.step + FlashKa_lid.pdf (the drawings cad/FlashKa_tray_drawing.pdf, 2 pages, and cad/FlashKa_lid_drawing.pdf, renamed to the STEP names).| v0.5 | v0.6 | Why | |
|---|---|---|---|
| Tray / lid volume | 8670.7 / 2238.3 mm3 | 8401.2 / 2643.3 mm3 | volumes_mm3 of cad/housing_interface.json: knurl and side grooves gone, floor holes and RF window added |
| Lid size | 90.2 x 19.9 x 1.5 mm | 90.2 x 20.0 x 5.2 mm | the lid carries two hold-down bosses (up to 5.2 mm tall) |
| Stock block tray / lid | 47.2 / 12.4 cm3 | 47.2 / 20.8 cm3 | bounding box + 2 mm on every side |
| Fine-feature time tray / lid | 36.0 / 8.0 min | 38.1 / 7.5 min | table below |
| Machining time tray / lid | 42.4 / 9.7 min | 44.6 / 10.5 min | material to remove / 6 cm3 per min + fine-feature time |
| Complexity factor tray / lid | 1.00 / 1.25 | 1.10 / 1.30 | ESTIMATE: the frames of the skin wrap round the rounded corners and the two sides (indexed or 4th-axis work), where v0.5 had four straight grooves; the 1.5 mm lid plate now also carries bosses and a 0.6 mm lip |
| Set-ups tray / lid | 3 / 2 | 5 / 3 | ESTIMATE: the skin needs the side faces (top, bottom, -Y, +Y, ends) |
| Laser marking | none | 4 faces, $2.00 per face + $5.00 per order | new, see the next bullet |
| One set (scenario A) | $64.76 | $93.36 | +$28.60 |
| Five sets (scenario B) | $221.80 | $302.79 | +$80.99 |
The change for one set, +$28.60, is laser marking +$13.00 (4 x $2.00 per face + $5.00 set-up), more set-ups +$10.50 (tray 3 -> 5, lid 2 -> 3), and machining and material +$5.10 (the taller lid block, the fine-feature minutes and the two complexity factors). For five sets it is +$80.99: marking +$45.00, set-ups +$10.50, machining and material +$25.49.
The fine-feature time is the part of the estimate that needs an explanation. v0.5 priced all fine work (grooves, holes, pockets) as one lump per part: tray 36 min, lid 8 min.
v0.6 keeps the lump, takes out the features that no longer exist and adds the new ones. V-groove work is counted in millimetres at ONE rate (6 min per metre, i.e. $3.60 per metre before the complexity factor)
for the grooves that go and for the grooves that come, so the groove part of the change follows the real geometry: the v0.6 lengths are read from skin_layout of cad/housing_interface.json
(19 entries = 6 frames in 11 pieces and 8 stringers: tray 646.5 mm, lid 220.2 mm, together 867 mm against 1598 mm of grooves in v0.5). The other lines are typed-in minutes (ESTIMATES).
| Feature | Tray | Lid | Unit | Tray (min) | Lid (min) |
|---|---|---|---|---|---|
| v0.5 fine-feature time (one lump per part) | 36 | 8 | min | 36.0 | 8.0 |
| minus the v0.5 diamond knurl | -717 | -717 | mm of V-groove | -4.3 | -4.3 |
| minus the four v0.5 side grooves | -164 | 0 | mm of V-groove | -1.0 | 0.0 |
| plus the v0.6 skin seams (frames and stringers, V 90 deg, 0.25 mm deep) | 646.5 | 220.2 | mm of V-groove | +3.9 | +1.3 |
| plus the floor holes: main bore with counterbore, two slide holes with chamfer | 3 | 0 | min | +3.0 | 0.0 |
| plus the floor RF window 5.1 x 14.0 mm | 1 | 0 | min | +1.0 | 0.0 |
| plus the 0.6 mm lid rabbet and the 0.3 mm gussets in the cavity corners | 1.5 | 1 | min | +1.5 | +1.0 |
| plus the two hold-down bosses under the lid | 0 | 1.5 | min | 0.0 | +1.5 |
| minus the S1 hole, thumb dish and ledge gap | -2 | 0 | min | -2.0 | 0.0 |
| Fine-feature time, v0.6 | 38.1 | 7.5 |
FlashKa_marking_lid_class2.dxf, or FlashKa_marking_lid_class3R.dxf only for a module that measures above 1 mW)
and the tray’s bottom, -Y and +Y faces (FlashKa_marking_bottom.dxf, FlashKa_marking_minus_y.dxf, FlashKa_marking_plus_y.dxf), all in order_files/2_JLCCNC/. JLCCNC lists laser marking as a finish (https://jlccnc.com/finishes, read 2026-10-16)
but publishes no price, so the workbook uses $2.00 per marked face and $5.00 per order for loading the artworks (Housing!B31, Housing!B32): $13.00 for 1 light and $45.00 for 5 lights.
Set Housing!B30 to 0 if JLCCNC does not offer marking for your order and stick a printed label with the same text on the lid instead (a few cents, not in the workbook).
The Class 2 text is only true for a module that really is 1 mW or less.FlashKa_cap_main (1 per light) and FlashKa_cap_slide (2 per light) are turned from SUS304 stainless steel and bead blasted, with 1 spare of each per order:
2 main + 3 slide caps for 1 light, 6 + 11 for 5 lights. READ facts (https://jlccnc.com/cnc-machining, https://jlccnc.com/finishes, https://jlccnc.com/capabilities/cnc-machining-service,
https://jlccnc.com/cnc-machining-service/cnc-turning, read 2026-10-16): SUS304 is the only stainless grade; bead blasting, brushing and laser marking are offered for it, passivation and polishing are not; the minimum order is one piece;
the minimum part size is 5 x 5 x 1 mm and the minimum turned diameter 3 mm; instant quotes work up to 20 pieces (more goes to a manual quote); SUS304 can be built in as little as 5 days.
JLCCNC publishes no per-part price, only the headline “CNC milling/turning from $5.00” (https://jlccnc.com/).
Reasoning for the estimate. The caps are tiny (flange dia 6.6 and 5.0 mm, 7.0 mm long, heads dia 5.8 and 3.4 mm; 0.86 g and 0.32 g of steel), so the material costs a few cents and the price is set by the set-up,
the programming and the bead blasting of each part number. The workbook therefore uses $8.00 for the first piece of each cap type (above the $5.00 headline: stainless, a domed head, a blast pass)
and $4.00 for each further piece of the same cap in the same order (set-up already paid, about half of the first piece; Housing!B93, Housing!B94).
Main cap: 2 pieces = $12.00 (1 light), 6 pieces = $28.00 (5 lights). Slide cap: 3 pieces = $16.00, 11 pieces = $48.00. Together $28.00 / $76.00.
Twice these prices would raise the totals by $34.39 / $98.94 (VAT included), half these prices would lower them by $17.19 / $49.47.
Confirm with the instant quote; if refused, any CNC service (PCBWay, Xometry, a local shop) can make them from the same STEP + PDF, or use the resin caps from the print kit.
The size is the open point: the caps are 7.0 mm long, and the JLCCNC FAQ says rotary-axis metal parts must be longer than 20 mm and thicker than 4 mm, while its capabilities page allows 5 x 5 x 1 mm and its turning page 3 mm diameter.
The resin copies of the same three caps are in the print kit in every case, so the fallback costs nothing extra: set Housing!B92 to 0 and the totals drop by $37.79 (1 light) / $98.94 (5 lights), including VAT and one customs line less.
If another CNC service quotes the caps, type its price into Housing!C99 / Housing!E99 and leave Housing!B92 at 1.order_files/3_JLC3DP/FlashKa_print_kit.stl: the RF window insert, LED spacer ring, antenna spacer with floor plug, light-pipe tube, resin main cap and two resin slide caps
(seven parts) joined by 1 mm sprues (57.2 x 16.8 x 14.2 mm, 1576.2 mm3 = the seven parts’ 1561.8 mm3 + 14.4 mm3 of sprues),
because the RF window insert (8.4 x 15.5 x 1.7 mm) alone is below the minimum build size. One kit per light + one spare kit: 2 kits for 1 light, 6 for 5 lights; you cut the parts apart at home.
The kit is priced from its own STL volume with the same model as single parts: $0.30 per cm3 (headline “SLA from $0.30” on https://jlc3dp.com/) with an assumed minimum of $0.60 per part (https://jlc3dp.com/3d-printing-quote): ESTIMATE.
Even the kit (1.58 cm3, $0.47 by volume) is so small that the minimum decides, so the JLC3DP order is $1.20 for 1 light and $3.60 for 5 lights, the same as in v0.5 although the kit now holds seven parts instead of four.
The seven parts stay in the sheet as information rows with quantity 0 (“included in the print kit”). The three resin caps are the fallback of the stainless caps; the laser sleeve
(order_files/3_JLC3DP/FlashKa_laser_sleeve.stl, 10 x 6 x 6 mm, big enough on its own) is a separate optional print with quantity 0 unless your laser module is 4.5 mm.
READ facts: tolerance +/-0.2 mm or 0.3 %, hole tolerance +/-0.3 mm, wall > 0.8 mm, minimum build size 5 x 5 x 5 mm or 10 x 2 x 2 mm, build time 2 days
(https://jlc3dp.com/help/article/photosensitive-8001-resin, https://jlc3dp.com/help/article/3d-printing-design-guideline, https://jlc3dp.com/help/article/1219-What-is-the-build-time-of-the-3D-printing-parts; read 2026-10-14 and 2026-10-16).
“Transparent” 8001 is sanded and oil-sprayed by default (clearer, extra cost); a kit is ONE part with ONE material, so the workbook prices “Translucent”, as printed. The flanges of the resin caps (0.6 mm) are below the 0.8 mm wall of the resin page,
so the quote may show a thin-wall warning: accept it or ask JLC3DP.cad/housing_interface.json
(final v0.6 housing: tray 8401 mm3, lid 2643 mm3); the STL files in cad/ give the bounding boxes and the volumes of the print kit and the laser sleeve, which the JSON does not list.
The sheet states the files it used (see section 8).Bought partsAliExpress item pages cannot be read automatically, so the prices come from search-result snippets of 2026-10-14 or are typical prices. The listed item is only a price anchor: check size and specification in the listing yourself. The rows that exist in v0.5 did not change and keep their date. The two silicone pad sheets and the silicone adhesive are new in v0.6 and were NOT looked up: they are typical prices. The epoxy is the v0.5 item; v0.6 also uses it for the tube.
| Item | Workbook price | Anchor (search snippet, 2026-10-14) |
|---|---|---|
| LiPo cell LP601646 with protection board (2 per light + 1 spare) | $4.50 each | $4.76 for a 400 mAh 071740 cell with PCM, https://www.aliexpress.com/item/32662761434.html (different size, 7 x 17 x 40 mm: price class only) |
| Luminus SST-20 on a 10 mm DTP board | $5.40 each | $5.42 for an SST-20 6500K on a 16/20 mm DTP board, https://www.aliexpress.com/item/32884236179.html (a 10 mm board may cost more) |
| Green laser module 520 nm, 6 x 12 mm, 1 mW APC | $23.50 each | $23.5 for a 6 mm 520 nm 1 mW APC module, https://www.aliexpress.com/item/32869119160.html |
| Round glass window 10 x 1 mm | $2.95 per 5 | $2.95 for 5 pcs flat glass lens, https://www.aliexpress.com/item/4001014613249.html (exact size not verified) |
| Screw M1.6 x 4 countersunk | $2.00 per 100 | $1.5 for 100 pcs M1.6 x 3 countersunk, https://www.aliexpress.com/item/32917852857.html |
| Thermal transfer tape 0.15 mm | $3.79 per roll | $3.79 for thermal tape, https://www.aliexpress.com/item/33014898122.html |
| M2 x 2 set screw (50), split ring 25 mm (20), PTFE wire 28 AWG 2 x 5 m, Kapton tape, foam tape | $2.00 / $2.00 / $6.00 / $2.50 / $2.50 | typical prices, no anchor found: the searches returned only retailer pages without AliExpress prices |
| Clear two-part epoxy, 5 minute, small syringe (v0.5 item; v0.6 also glues the light-pipe tube) | $3.50 per syringe | typical price, unchanged |
| New: silicone thermal gap pad 1.0 mm, Shore 00 70-80, sheet (cut to 8.8 x 12.4 mm) | $3.50 per sheet | typical price of a 100 x 100 x 1 mm listing; no listing read |
| New: silicone rubber sheet 1.0 mm, Shore A 70, sheet (cut to 3.7 x 3.2 mm) | $3.50 per sheet | typical price; no listing read |
| New: silicone adhesive, neutral-cure, small tube (sticks the pads on the lid bosses) | $2.50 per tube | typical price; no listing read |
What the new parts do: the buttons are on the bottom face and push the PCB up, so the lid holds the board down with two bosses. A piece of the 1.0 mm gap pad (8.8 x 12.4 mm) sits on the can boss over the ESP32 module and a piece of the 1.0 mm rubber sheet (3.7 x 3.2 mm) on the front boss next to the next button; both are compressed to 0.8 mm when the lid is closed. Softness matters, the thermal rating does not. Use neutral-cure silicone (no acetic-acid smell: acetic cure can attack the copper) and a drop per boss only. Epoxy or UV-curing clear adhesive glues the glass window, the RF window insert and the tube; never cyanoacrylate on the clear resin parts (its vapour leaves a white bloom). Nothing had to be removed from the bought parts: the v0.5 side-button cap was a resin part of the print kit, not a bought part. Consumables are $27.79 (v0.5: $18.29, +$9.50).
The search terms and the exact specifications that matter (the 6.0 x 16 x 47 mm cell bay, the 10 mm LED board, the 6 mm laser) are in the sheet. Prices exclude VAT and shipping; the Hidden costs sheet adds both. The sheet also explains why the laser must be Class 2 (visible, 1 mW or less continuous, the blink reflex protects the eye; cheap “1 mW” modules often emit more, so ask for a measured value or measure it) and cites EN 50689:2021 for consumer laser products (https://ul.com/insights/understand-new-laser-product-safety-standards-europe, general background https://en.wikipedia.org/wiki/Laser_safety).
Tools18 tools with typical 2026 web-shop prices (soldering iron $35, multimeter $15, laser safety glasses 520 nm $14, caliper $12 …), no source page; $135.00 for the tools marked “needed” (set “needed” to 0 for what you own), $100.00 more for the optional ones (microscope, bench supply, laser power meter, taps). New in v0.6: hobby knife and cutting mat ($7.00, to cut the two silicone pads; v0.5 total $128.00). The flush cutters also cut the print kit off its sprues. A laser power meter is the only way to verify a “1 mW” claim, so consider it if you plan to give lights away.
JLC buys a few more pieces than the board needs (lost by the placement machine) and bills them inside the component price. The extra counts (10 for 0402 resistors and capacitors, 5 for 0603 / 0805, 2 for small semiconductors, 1 for big parts)
are ESTIMATES (JLC publishes no table; the cart shows the real quantity): $7.05 of the $17.32 component cost for 1 light. The bought parts include spares (a third cell, a second LED board, extra screws, spare glass windows) and left-over pack contents:
of the $84.54 for bought parts and consumables (1 light) about $45.47 is pieces you will not use (information row in Bought parts).
The spare resin parts are one spare print kit in the housing order ($0.60) and the spare stainless caps are one extra piece of each cap type in the cap order.
Four pages could not be read on 2026-10-18:
| Page | Date | What it would have given | Consequence in the workbook |
|---|---|---|---|
| https://jlcpcb.com/partdetail/C115357 | 2026-10-18 | library type of the Alps SKRKAEE020 (SW1-SW3) | type “Extended” is assumed (every Alps tact switch checked on JLCPCB is Extended) |
| https://www.lcsc.com/product-detail/C115357.html | 2026-10-18 | price tiers and stock of SKRKAEE020 | tiers of the sibling Alps SKRPABE010 (C115360, read 2026-10-16): $0.0759 at 10, $0.0616 at 100; stock unknown |
| https://jlcpcb.com/partdetail/C25104 | 2026-10-18 | library type of the 330 ohm resistor (R23, R32) | type “Basic” is assumed (same UNI-ROYAL 0402 series as the other Basic resistors) |
| https://www.lcsc.com/product-detail/C25104.html | 2026-10-18 | price tiers and stock of the 330 ohm resistor | tiers of the 5.1 k resistor C25905 (read 2026-10-14): $0.0024 at 100 … $0.0012 at 50,000; stock unknown |
Both lines are blue on amber in Main PCB BOM (row 37 and row 30) and named in the Summary. The part-number text “0402WGF3300TCE” of C25104 is inferred from the UNI-ROYAL naming of the other resistors, not read.
The research for this version (2026-10-16) could not read ten pages (the LCSC pages of C2874113, C110293, C2838502, C25744, C11702, C25879, C25076, C720477, and two datasheet files): for the parts that stay on the board
the v0.5 readings of 2026-10-14 are kept with their date, so nothing in the workbook depends on those pages. The JLCCNC, JLC3DP and Alps SKRPABE010 pages that WERE readable on 2026-10-16 are cited in sections 3.2 and 3.6.
READ (copied from a page on the date given): the JLCPCB Standard PCBA fee rows and X-ray tiers (2026-10-14); LCSC price tiers, stock and Basic / Extended type for 32 of the 34 BOM lines (2026-10-14); VAT 21 %, the EUR 150 IOSS limit, the EUR 3 flat duty, the carrier-fee examples (2026-10-14); the ECB rate (13 Oct 2026); the JLCCNC and JLC3DP technical limits (2026-10-14 and 2026-10-16); the price tiers of the Alps SKRPABE010 (C115360, 2026-10-16), which are used as the stand-in for the new switch.
ESTIMATE (blue on amber in the workbook):
Hidden costs!B15:B16; not part of any total).Nothing is left unpriced.
How to replace an estimate with a real number.
| Estimate | Where the real number comes from | Where to type it |
|---|---|---|
| bare PCB | price for 5 boards in the JLCPCB cart after the Gerber upload | JLCPCB order!B44 |
| C115357 and C25104 | the two LCSC pages, and the JLC BOM upload (library type, stock) | tiers, type and stock in the rows 37 and 30 of Main PCB BOM; to keep it, change the entries "C115357" and "C25104" of LCSC_DATA in tools/parts_list.py (remove est=True and type_est=True) and rebuild |
| tray + lid (finish and laser marking included) | JLCCNC instant quote for FlashKa_tray and FlashKa_lid |
Housing!B87 (1 light) / Housing!C87 (5 lights) |
| stainless caps | JLCCNC instant quote for FlashKa_cap_main and FlashKa_cap_slide (SUS304, bead blasting), or another CNC service |
Housing!C99 / Housing!E99; the resin caps instead: Housing!B92 = 0 |
| laser marking | included in the JLCCNC quote, or not offered | Housing!B30 = 0 takes the marking out of the estimate (a typed tray + lid quote replaces the estimate anyway) |
| print kit | JLC3DP instant quote for FlashKa_print_kit.stl |
Housing!E116 / Housing!G116 |
| shipping | “Shipping Estimate” of each cart (economy / express) | Hidden costs!B20:E22, mode in Hidden costs!B11 |
| surface finish | your choice at JLCCNC | Housing!B41 |
| bought parts and tools | the listing you actually buy from | column F of Bought parts and Tools |
| exchange rate | your bank | Summary!B6 |
Hidden costs, section 6).SW_Push_SPST_NO_Alps_SKRK, 3.9 x 2.9 x 2.0 mm);
if C25104 is not available, any 330 ohm 1 % 0402 resistor will do (update flashka_parts.py).Main PCB BOM and look for red lines in the JLC BOM upload. Lines flagged on 2026-10-14:
C15850 (20 pcs), C485117 (925 pcs) are low at LCSC retail; C15195, C1525, C11702 show 0 at LCSC retail but are JLC Basic parts with their own stock
(C1525: 23,496,493 pcs on the JLC Basic parts list). Stock NOT read: C25104, C115357 (pages not readable on 2026-10-18). U4, the ESP32-C3-MINI-1-N4 (C2838502), is marked NRND (not recommended for new designs) by Espressif;
the drop-in alternative is the ESP32-C3-MINI-1-H4X (C41349510). If a line is rejected, substitute it and update flashka_parts.py.order_files/ of the package:
1_JLCPCB/ (FlashKa_main_gerbers.zip, BOM_JLCPCB.csv, CPL_JLCPCB.csv: the files tools/kicad/build_all.py writes to production/),
2_JLCCNC/ (FlashKa_tray.step + FlashKa_tray.pdf, FlashKa_lid.step + FlashKa_lid.pdf, FlashKa_cap_main.step + FlashKa_cap_main.pdf, FlashKa_cap_slide.step + FlashKa_cap_slide.pdf,
FlashKa_marking_lid_class2.dxf, FlashKa_marking_lid_class3R.dxf, FlashKa_marking_bottom.dxf, FlashKa_marking_minus_y.dxf, FlashKa_marking_plus_y.dxf) and
3_JLC3DP/ (FlashKa_print_kit.stl, optional FlashKa_laser_sleeve.stl). The BOM sheet agrees line by line with what build_all.py writes: 34 lines, 68 parts
(the workbook script only extracts its bom() function; build_all.py itself re-routes the board and takes long).JLCPCB order!B44), compare the fee lines with section 5 of that sheet (does the cart really list panelisation and X-ray, and for how many parts?),
copy the “Shipping Estimate” into Hidden costs, check the part rotations in the placement preview (U4, U1, U2, U3, U5, Q1, Q2, Q4, Q5, J1, SW1-SW3, LED3, LED4) and choose DDP (taxes paid at checkout).
The rotation and pin 1 of the new SKRKAEE020 (SW1-SW3) and of the NH-B1010RGBT-HF (LED3, LED4) in the JLC library are not verified (chapter 13, section 13.9; the NH-B1010 pad map is not verified either): look at the placement preview and the photo of the placement confirmation.Tools);
the thinnest metal wall is 0.8 mm (LED wire groove to the lid seat; next 0.875 mm at the front screw tap and 0.9 mm around the RF window pocket in the lid, min_walls of cad/housing_interface.json), exactly the 0.8 mm minimum;
anodizing (type II 8-12 um on the drawings; JLCCNC states 8-25 um) grows in the bores, threads and the 0.25 mm V grooves of the skin (laser bore 6.1 mm, window bore 10.2 mm): the drawings say tolerances apply after finishing and threads are tapped before anodizing and gauged after it - ask JLCCNC to confirm,
and test-fit the first set before you order five. The skin may need indexed (4th-axis) work: say so in the quote chat.Housing!B30 to 0 and use a printed label with the same text.FlashKa_cap_main and FlashKa_cap_slide (STEP + PDF) with material SUS304 and bead blasting. Confirm with the instant quote; if refused, any CNC service (PCBWay, Xometry, a local shop) can make them from the same STEP + PDF, or use the resin caps from the print kit.order_files/3_JLC3DP/FlashKa_print_kit.stl and order one kit per light + one spare kit. The RF window insert (8.4 x 15.5 x 1.7 mm) alone is below the 5 x 5 x 5 / 10 x 2 x 2 mm minimum build size of SLA 8001 resin
(the workbook shows TOO SMALL for it, without red, as the reason for the kit); the kit (57.2 x 16.8 x 14.2 mm) is not. The flanges of the resin caps (0.6 mm) stay below the 0.8 mm minimum wall, so the quote may still warn about thin walls:
accept it or ask JLC3DP. Cut the parts off the sprues with flush cutters and file the stubs flat. Glue the tube into the floor with clear two-part epoxy or UV-curing clear adhesive, never with cyanoacrylate (white bloom).order_files/2_JLCCNC/ are cad/FlashKa_tray_drawing.pdf (2 pages), cad/FlashKa_lid_drawing.pdf, cad/FlashKa_cap_main_drawing.pdf and cad/FlashKa_cap_slide_drawing.pdf, renamed to
FlashKa_tray.pdf, FlashKa_lid.pdf, FlashKa_cap_main.pdf and FlashKa_cap_slide.pdf: JLCCNC pairs each drawing with its STEP file by the file name, so upload each under its own name together with its .step file.python3 tools/parts_list.py # writes FlashKa_Parts_List_v0.6.xlsx, recalculates it, runs the checks
python3 tools/parts_list.py --check-only # re-checks the existing workbook without rewriting it
python3 tools/parts_list.py other.xlsx # writes somewhere else
python3 tools/parts_list.py --no-recalc # skips recalculation and checks (no cached values: only for inspection)
It needs openpyxl and LibreOffice (soffice) for the recalculation; set FLASHKA_RECALC to the path of a recalc.py if it is not found automatically.
The script prints “all checks passed” when:
#REF!, #VALUE!, #NAME?, #DIV/0! or #N/A cell and no formula without a calculated value;COMPONENTS is in the BOM sheet with the right quantity and designators (34 lines, 68 placements), and the BOM sheet equals the output of the bom() function of tools/kicad/build_all.py
(only refkey() and bom() are extracted from that file and run into a temporary folder; build_all.py itself is never run), production/BOM_JLCPCB.csv and order_files/1_JLCPCB/BOM_JLCPCB.csv, line by line;
the 68 designators are exactly the rows of production/CPL_JLCPCB.csv; the solder joints per footprint equal the pads of the routed board (232 per board);build_print_kit call in tools/housing/flashka_housing.py,
one kit per light + one spare is ordered and none of its parts is ordered a second time on its own;ORDER_FILES (18 files) is in order_files/, nothing else is in its three folders, every order_files/ path written in the workbook names one of them, and no text points to a file location of an older version;JLCPCB order!B44, Housing!B87, Housing!C87, Housing!C99, Housing!E99, Housing!E116, Housing!G116, Housing!B92, Housing!B30, Housing!B41, Hidden costs!B20:E22 …) at their right addresses, and the quote cells are empty.To change prices, edit the blue cells in the workbook, or the tables near the top of tools/parts_list.py, and regenerate.
The housing data is read from cad/housing_interface.json (version 0.6), written by the final v0.6 housing build (volumes and masses of the tray, lid, RF window insert, light-pipe tube, caps, spacer ring and antenna spacer, the tray bounding box,
the PCB outline, the parameters, the skin layout of the V grooves, the hold-down results and the wall checks), and from the STL files in cad/: the bounding boxes of all parts and the volumes of FlashKa_print_kit.stl and FlashKa_laser_sleeve.stl, which the JSON does not list.
The sheet Housing prints the source (cad/housing_interface.json (version 0.6) + cad/*.stl). If the JSON is not found, is incomplete or is not version 0.6, the script falls back to an embedded snapshot of the same numbers and says so;
a missing STL file is replaced by its snapshot entry and named in the same source line. After every housing rebuild run python3 tools/parts_list.py again: the volumes, the skin lengths and the hold-down numbers in the workbook follow the files.