Open-source project
bennymeg/Fabrication-Toolkit avatar
bennymeg/Fabrication-Toolkit

Fabrication Toolkit turns a KiCad board into JLCPCB ready production files

An JLC PCB Fabrication Plugin for KiCad

694 stars100 forksPythonApache-2.0

At a glance

What is it?
This KiCad plugin writes the gerbers, bill of materials, pick and place file and IPC netlist that JLCPCB expects, including the house specific conventions that KiCad's own output tools do not know about. It is tied to one fabrication house, and the field names your symbols carry determine how much of it works for you.
Who is it for?
Adopt Fabrication Toolkit when you send boards to JLCPCB and want the output files produced in that house's conventions rather than by hand, especially if your symbols already carry LCSC part numbers. Do not adopt it if you fabricate elsewhere, since the Edge-Cut merging, the rotation corrections and the translation fixes are all house specific.
Can I use it commercially?
Yes. Apache-2.0 is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 24 days ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A plugin for one fabrication house

The repository describes itself as a JLC PCB fabrication plugin for KiCad, and the feature list is four lines long. It generates gerber files in the correct format for production, a bill of parts file in the correct format for production, a pick and place file in the correct format for assembly, and an IPC netlist file.

The repetition in that list is the point. Generating gerbers from KiCad is a solved problem that the built-in plot dialog handles. Generating them so that a specific assembler's automated intake accepts them, with the right layers, the right board outline conventions and the right part numbers, is a different problem, and this is the tool that closes it.

That is also the boundary of its usefulness. The JLCPCB conventions are baked in: merging User.1 with Edge-Cut for the V-Cut, offering User.2 as an alternative outline, applying known translation fixes for common components, and carrying a `rotations.cf` definition file that corrects the differences between KiCad footprint rotation and the JLC library orientation. If you fabricate with someone else, most of this is inert.

The project is written in Python, licensed under Apache 2.0, and the repository topics name the domain: eda, fabrication, jlc, jlcpcb, kicad, lcsc, pcb, pcba, plugin and toolkit.

Installing from the KiCad plugin manager

There are two routes, and the official one is short.

Fabrication Toolkit is distributed with the official releases of KiCad 6 and later. You open the "Plugin and Content Manager" from the KiCad main menu and install the "Fabrication Toolkit" plugin from the selection list. If you already run a current KiCad, the plugin is likely already in that list and the whole install is a checkbox.

The manual route exists for people who are not on the official distribution or who want a specific version. You download the latest release ZIP file, open the "Plugin and Content Manager" from the KiCad main window and install the ZIP file via "Install from File".

Both routes install the same artefact into the same place, and the difference is only where the ZIP came from. The repository itself carries the plugin source in a `plugins/` directory, `resources/` for the bundled resources, `assets/` for the images used in the documentation, a `metadata.json` that describes the plugin to the manager, a `CONTRIBUTERS.md` file, and the `.devcontainer/`, `.vscode/` and `.idea/` directories that a Python project of this kind accumulates.

The release list shows recent versions 5.3.1 and v5.3.0, both published on 2026-05-15, and 5.2.0 from 2025-10-30. The repository is not archived, and the last push was on 2026-09-29, so the plugin is still being worked on after the last tag.

Generating from pcbnew, after you sync the board

The usage is one button. You click the Fabrication Toolkit button on the top tool box inside the KiCad pcb editor, pcbnew, choose the required options in the dialog that appears, and click on 'Generate'.

The instruction that comes with it is the one that matters: ensure your board is synchronized before invoking this addon, with F8 as the shortcut. The Attributes section repeats it in stronger terms. All the attributes are entered in the Schematic Editor, so you must update the PCB with the changes made to the schematic before generating a new set of production files, otherwise your changes will not be reflected.

That is a genuine operational hazard rather than pedantry, because the plugin's entire value depends on data that lives on the schematic side. The part numbers are symbol fields, the DNP flags are symbol attributes, and the exclusion flags live in symbol and footprint properties. If the board is stale, the plugin faithfully produces output files for the wrong board, and the output looks correct.

So the workflow is: edit symbols, press F8 to push to the board, then generate. The plugin does not check for you and it does not warn you beyond the documentation.

Options are remembered per project in a JSON file

The plugin's options live in a file called `fabrication-toolkit-options.json` in the project directory, so they are remembered between invocations. That is the right place for them, since almost every option below is a property of how a particular board is built rather than of the house.

The archive name option names the file to be generated and can include text variables, for example `${TITLE}_${REVISION}`. Additional layers takes a comma-separated list of layers to include in the gerber archive, and plot all active layers decides whether you include every layer rather than just the ones JLCPCB requires. Set User.1 as V-Cut merges the User.1 layer with the Edge-Cut layer in production, and use User.2 for an alternative Edge-Cut layer swaps in User.2 as the board outline while you keep the individual outline for prototyping, 3D model exports or similar.

The rest are housekeeping options with real consequences. Apply automatic translations applies known translation fixes for common components, apply automatic fill for all zones refills all zones before the production files are generated, exclude DNP components from BOM drops the parts that had been set as DNP, and generate backups produces a backup zip of the production files.

Two of those deserve a pause. Automatic zone refill fixes a classic production failure, where a stale zone fill leaves copper that does not match the design. Automatic translations fix component references the assembler might not recognise. Neither is a substitute for checking the output, and both are optional switches, so a team that wants to review everything can turn them off.

Part numbers travel in symbol fields, and the field names matter

The part number is how the assembler knows what to put on your board, and the plugin looks for it in the symbol's fields property. The README lists a set of primary field names, and they are queried in the order given: 'LCSC Part #', 'LCSC Part', 'LCSC PN', 'LCSC P/N', 'LCSC Part No.', 'LCSC Part Number', 'JLCPCB Part #', 'JLCPCB Part', 'JLCPCB PN', 'JLCPCB P/N', 'JLCPCB Part No.', 'JLCPCB Part Number'.

There are fallback fields as well, again queried in order: 'LCSC', 'JLC', 'MPN', 'Mpn' and 'mpn'. Empty fields are skipped, so an 'MPN' field with a value is used if all earlier fields are missing or empty.

The practical rule is that the first matching name wins and everything empty is passed over, which is forgiving but not forgiving in every direction. A project with a legacy field called 'MPN' carrying a manufacturer part number will be picked up by the fallback and sent to the assembler as if it were an LCSC code, and the failure will appear at the ordering stage rather than in the plugin.

So the adoption work is partly a data cleanup exercise. You have to look at what your symbols actually call their part number fields, and rename them to one of the recognised names, and make sure the value in them is the LCSC part number rather than a manufacturer part number.

Excluding parts and correcting rotation

Two attributes let you take a component out of the output, and they work at different levels.

For a symbol, selecting 'Exclude from board' or 'Exclude from BOM' in the symbol's attributes property ignores the footprint in the relevant file. For a footprint, the same job is done through the footprint's fabrication attributes property, where the choices are 'Exclude from position files' or 'Exclude from BOM'. So a part can be left off the board, left off the bill of parts, or left out of the placement file, which is what you want for a component you hand solder.

Rotation is the more interesting problem, because it is a mismatch rather than a mistake. The rotation of components in KiCad footprints does not always match the orientation in the JLC library, since KiCad and JLCPCB use different variations of the same standard. Most of the rotations are corrected by the `rotations.cf` definitions. For the exception cases you add an 'FT Rotation Offset' field, with positive values indicating a counter-clockwise orientation offset in degrees.

The README then gives a coordinate table so you can work out the correction from the JLC preview arrows, depending on the footprint rotation shown in the KiCad PCB Editor status bar, and a tip that a single arrow press in JLC is a 0.0635mm shift, which is 1/400 of an inch. The fallback field names here are 'Rotation Offset' and 'RotOffset'.

There is a matching mechanism for position, with an 'FT Position Offset' field holding a comma separated x,y offset, for the same reason: the two tools do not agree on where a footprint sits.

All of this is house specific repair work. It is the clearest illustration of what the plugin does for you, and of why it is not a general KiCad export.

Editorial conclusion

Adopt Fabrication Toolkit when you send boards to JLCPCB and want the output files produced in that house's conventions rather than by hand, especially if your symbols already carry LCSC part numbers. Do not adopt it if you fabricate elsewhere, since the Edge-Cut merging, the rotation corrections and the translation fixes are all house specific. Verify first that the board is synchronised with the schematic, since the README insists on updating the PCB with F8 first, that your symbols use one of the recognised part number field names, that a `.ft` style part number resolves to a real LCSC entry, and that the version you install matches the tag you read, given that 5.3.1 and v5.3.0 were both published on 2026-05-15 and the last push was on 2026-09-29.

Frequently asked questions

How do I install the Fabrication Toolkit plugin for KiCad?

Fabrication Toolkit is distributed with the official releases of KiCad 6 and later, so you open the "Plugin and Content Manager" from the KiCad main menu and install it from the selection list. The manual route is to download the latest release ZIP and install it with "Install from File".

Which files does the Fabrication Toolkit generate for JLCPCB?

It generates gerber files in the format JLCPCB expects for production, a BOM file in the correct format for production, a pick and place file in the correct format for assembly, and an IPC netlist file. The plugin is invoked from the toolbar in the pcbnew editor, and the options are remembered in fabrication-toolkit-options.json in the project directory.

How does the plugin know the LCSC part number for a component?

It reads it from the symbol's fields property, querying a list of primary field names such as 'LCSC Part #', 'LCSC PN' and 'JLCPCB Part Number' in order, and falling back to names like 'LCSC', 'JLC' and 'MPN'. Empty fields are skipped, so the first field with a value is used.

Why do my component rotations look wrong in the JLCPCB preview?

KiCad and JLCPCB use different variations of the same rotation standard, so the plugin corrects most cases using the rotations.cf definitions. For the exceptions you add an 'FT Rotation Offset' field to the symbol with a counter-clockwise offset in degrees, and the README includes a table mapping the KiCad footprint rotation to the JLC preview arrows.

Official sources

  1. bennymeg/Fabrication-Toolkit on GitHub
  2. Issues
  3. License: Apache-2.0
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/bennymeg-fabrication-toolkit.svg)](https://hysenlabs.com/projects/bennymeg-fabrication-toolkit)

Was this useful?