top of page

KiCAD 9.0: Installing Symbol, Footprint, and 3D Model Libraries the Right Way

When setting up KiCad 9.0 for serious design work, one of the most critical steps is getting the symbol, footprint, and 3D model libraries installed and configured correctly. Missteps here lead to broken links, missing components, or inconsistent schematic and PCB data. Here’s how to do it the right way—whether you’re using official libraries, custom sources, or managing them with version control.


1. Understanding KiCad's Library Architecture

To work confidently in KiCad 9.0, you need to understand how it structures and uses its libraries. These libraries are not just folders full of random component files—they’re the backbone of how KiCad represents, connects, and renders every part of your schematic and PCB. Without a clean understanding of their roles and relationships, you’re going to run into broken references, missing 3D models, mismatched footprints, or worse—unreliable production data. KiCad operates with three distinct types of libraries, each playing a different role in the design process: symbol libraries, footprint libraries, and 3D model libraries.


Symbol libraries are what you interact with in the schematic editor. These files contain the abstract graphical representation of electronic components—boxes, pins, names, and electrical types. Older projects may still use the legacy .lib format (which often came with a matching .dcm file for metadata), but the modern standard is the .kicad_sym file. These are text-based and far more transparent and version-control-friendly. A symbol defines what a part is in logical terms—it has no notion of physical size or pad layout. It knows about pins and labels, it might reference a footprint, and that’s about it. It’s the design intent without the physical reality.


Footprint libraries, on the other hand, exist entirely in the physical domain. You use these in the PCB editor, and they describe exactly how the component lands on your board. Pad positions, drill holes, silkscreen outlines, mechanical clearances, copper zones—all of it lives here. The organizational structure is unique: a single footprint library is actually a folder with a .pretty extension, and each footprint is a separate file inside that folder, ending in .kicad_mod. This format allows for modular version control and easy reuse. A typical footprint might be something like R_0603.kicad_mod, stored in a folder named Resistors_SMD.pretty. Each of these footprint files can also include metadata that links to a 3D model.


That brings us to the 3D model libraries. These are optional but extremely useful for visual inspection, clearance checks, enclosure fitting, and even marketing renderings. They don’t exist in the schematic or the netlist—they're only relevant when you've already placed footprints on the PCB. KiCad supports models in .wrl (VRML) for lightweight visualization and .step/.stp for accurate mechanical integration. The 3D model is typically defined in the footprint file itself using a relative path that points to a central 3D model directory—often referenced with an environment variable like ${KISYS3DMOD}. If your footprints are properly linked, you can spin the 3D viewer and see your design fully populated with realistic component geometry.


Now, all three of these library types—symbols, footprints, and 3D models—can exist at two different scopes: global and project-specific. Global libraries are available across every project you open in KiCad. They're defined in the user's configuration files, which are typically stored under

%APPDATA%\kicad\9.0\ 

on Windows. These are great for shared company libraries or common vendor parts, but they come with risk: if a global library changes or is moved, every project depending on it could break. That’s where project-specific libraries come in. These are defined locally, inside the project folder, and are referenced in tables that travel with your project files. This approach ensures that what you see is exactly what your teammate or your manufacturer will see—no surprises.


This architecture—symbols for logical design, footprints for physical layout, and 3D models for visualization—forms a clean separation of concerns. And when you control where those libraries live and how they’re referenced (especially with environment variables and relative paths), you gain full control over portability, reproducibility, and long-term stability.


2. Installing Official KiCad Libraries

KiCad separates its core application from its official libraries. This design gives you flexibility and modularity, but it also means that simply installing the program doesn't always give you immediate access to all the symbols, footprints, and 3D models you might expect. Depending on how you installed KiCad—whether through a system package manager, a standalone installer, or from source—you might find yourself with incomplete or missing libraries. Thankfully, the maintainers host everything openly and version-controlled, and setting them up manually is straightforward if you follow the right process.


The official libraries are all stored on GitLab at https://gitlab.com/kicad/libraries, and they’re split into three distinct repositories: one for symbols, one for footprints, and one for 3D models. These repos are actively maintained and tightly coordinated with the KiCad versioning system, so it’s a good idea to always pull the version that matches your current KiCad installation.


To begin, choose a location on your system where you want the libraries to live. Don’t bury them inside system directories like C:\Program Files\. That will only create headaches later when permissions get in your way. Instead, create a dedicated folder—something clean and predictable like C:\KiCad_Libraries\—where you’ll keep everything together. Once you’ve created that folder, open a terminal or Git client and run the following three commands to clone the latest official repositories:

git clone https://gitlab.com/kicad/libraries/kicad-symbols.git
git clone https://gitlab.com/kicad/libraries/kicad-footprints.git
git clone https://gitlab.com/kicad/libraries/kicad-packages3D.git

This gives you a local copy of all the libraries. Each of these repositories will contain hundreds or thousands of well-maintained, properly categorized parts. You can update them any time later using git pull, or you can check out a specific version tag to lock them to your current KiCad release. That way, you don’t get hit with changes that may not be compatible with your design files.


Now that you have the files, the next critical step is telling KiCad where to find them. This is done by defining environment variables inside KiCad itself. Open the application and navigate to Preferences > Configure Paths. Here, you'll see a list of key-value pairs. These are variables that KiCad resolves when looking for libraries. You can add new entries (or update existing ones) to point to the folders you just cloned. For example:

  • Set KICAD_SYMBOL_DIR to the full path where you cloned kicad-symbols.

  • Set KICAD footprint_DIR (yes, that space is real—KiCad uses it as a variable name) to the path for kicad-footprints.

  • Set KISYS3DMOD to the path where kicad-packages3D resides.

These environment variables act as placeholders throughout KiCad’s configuration system. They allow the library tables to use relative paths like ${KICAD_SYMBOL_DIR}/Device.kicad_sym rather than hardcoding absolute paths, which makes your setup portable, editable, and far more maintainable. You can even version-control these paths if you’re setting up a standardized configuration for your whole team.


Once those variables are defined, KiCad will automatically resolve them when loading libraries. No need to manually add every .kicad_sym or .pretty directory—just make sure your library tables reference those variables properly (which we’ll address in detail in the next section). At this point, you’ve established a clean, stable, and updateable foundation for working with the official libraries, and you’ve completely bypassed the fragility and inconsistency of relying on whatever the default installer happened to include.


3. Managing Library Tables

At the core of KiCad’s library management system are two key files: the symbol library table and the footprint library table. These tables don’t just list which libraries are available—they define exactly how KiCad finds, loads, and interprets the libraries you’ve set up. They also determine whether your project remains portable or becomes brittle and dependent on your machine's specific file layout. If you’ve ever opened a project on another computer and been met with a wall of missing symbols or broken footprints, the problem almost always traces back to how these library tables were configured.


KiCad stores two versions of each table: a global one and a project-specific one. The global versions are found in your user configuration directory—on Linux, that’s typically ~/.config/kicad/9.0/, and on Windows it lives under %APPDATA%\kicad\9.0\. These global tables apply to every project you open. They’re great for libraries you use frequently across designs—things like manufacturer parts, internal company libraries, or community-curated footprints.


The project-specific versions, by contrast, live right inside your project folder. When you create a new project, KiCad automatically copies the global tables into it as a starting point, but from that moment on, they’re independent. Any changes you make to the project’s library tables only affect that project. This isolation is crucial when you're working in a team, archiving a design, or committing files to a version control system. A project with its own local sym-lib-table and fp-lib-table can be cloned onto a fresh system and still work perfectly—as long as you’ve avoided hardcoding absolute paths.


This is where environment variables and relative paths come in. When adding a new library entry to either table, KiCad allows you to use variables like ${KICAD_SYMBOL_DIR} or ${KICAD footprint_DIR} in the URI field. These variables are resolved at runtime based on your environment settings (defined earlier in the Configure Paths dialog). Using them makes your project agnostic to specific machine setups. Here’s a real-world example of a well-formed entry in the symbol library table:

(lib (name Device)(type KiCad)(uri ${KICAD_SYMBOL_DIR}/Device.kicad_sym)(options "")(descr ""))

This tells KiCad to look inside whatever path is currently defined for KICAD_SYMBOL_DIR, and to load the Device.kicad_sym file from there. If you move the library folder, you just update the environment variable—no need to rewrite every table entry. This same logic applies to footprint tables as well, where the URI would point to a .pretty folder instead of a symbol file.


If you’re not comfortable editing these files by hand, or you just prefer a safer interface, KiCad provides a built-in Library Manager tool for both symbols and footprints. You can access it via the Preferences menu in either the schematic or PCB editor. This manager lets you add, remove, reorder, or rename library entries without worrying about syntax. It also lets you toggle whether an entry belongs to the global table or the project table—something that’s easy to forget when editing manually.


4. Adding Custom or Third-Party Libraries

While KiCad’s official libraries are extensive, almost every serious workflow eventually reaches beyond them. Whether you’re importing vendor-provided parts from SnapEDA or UltraLibrarian, managing in-house component sets, or building specialized symbols for a custom product line, you need a repeatable way to integrate third-party content into your KiCad ecosystem. The process is straightforward—once you understand the structure and tools involved—but it demands care if you want your setup to remain clean, portable, and maintainable over time.


Let’s start with symbol libraries. These are usually delivered as .kicad_sym files, though some older sources still provide the deprecated .lib format. If you're importing symbols from a third-party generator, place those .kicad_sym files into a clearly named folder dedicated to your custom libraries—something like ~/kicad_custom/symbols/ or C:\KiCad_Custom\Symbols\. Avoid scattering them across your file system or burying them inside project directories. This centralized structure will pay dividends later when updating libraries or syncing with teammates.


Once the symbol files are in place, open KiCad’s schematic editor and go to

Preferences > Manage Symbol Libraries

From there, you’ll see both global and project-specific tables, just as described in the previous section. Add your new library by clicking the appropriate “Add existing library” button, then browse to the .kicad_sym file you want to include. Ideally, use a path variable like ${CUSTOM_SYM_LIBS} in place of a hardcoded file path. Define that variable ahead of time in Preferences > Configure Paths, pointing it to your symbol folder. This keeps everything flexible and avoids absolute paths that could break on another machine.


Next, footprints. Most external sources will provide these in KiCad's .pretty folder format. A .pretty library is simply a directory that contains multiple .kicad_mod files—one per footprint. If you're downloading footprints from a site like SnapEDA or UltraLibrarian, you’ll often get these as zipped .pretty folders or as individual .kicad_mod files that need to be grouped into a library manually. Place each .pretty folder into its own parent directory—say, ~/kicad_custom/footprints/—and follow the same logic as with symbols: centralized, organized, and not project-local.


To add these custom footprints, open KiCad’s PCB editor and go to

Preferences > Manage Footprint Libraries

From there, you can attach the .pretty folder to either the global or project footprint table. Again, use a variable like ${CUSTOM_FOOTPRINT_LIBS} in the URI field. This makes sure your footprint links will resolve correctly no matter where the project is opened, as long as the environment variable is defined. Be careful not to point to individual .kicad_mod files—KiCad works at the .pretty folder level when managing footprints.


Finally, 3D models. These are optional but highly recommended for full visualization, especially if you care about enclosure fit or mechanical constraints. Third-party sources might give you .step, .stp, or .wrl files—use whichever your workflow prefers. For consistency, create a 3D model directory structured by component type or vendor, like

C:\KiCad_Custom\3D\Connectors\

There’s no enforced structure here—KiCad doesn’t care how you organize the models—as long as you know where things live and keep your naming consistent.


Linking 3D models to footprints is done inside the Footprint Editor. Open the footprint, then go to the “3D Settings” tab. There, you can add one or more 3D model paths. When prompted for a path, don’t browse using the full system path. Instead, define a variable like ${CUSTOM3D} pointing to your model root folder, then use relative paths from there. For example:

${CUSTOM3D}/Resistors/R0603.step

This keeps your 3D model links clean, shareable, and unaffected by OS-specific directory structures.


When done carefully, the result is a modular, scalable library ecosystem. Symbols, footprints, and 3D models each live in well-defined directories, bound together through footprint metadata and path variables. Whether you're bringing in parts from a vendor or building your own internal library, this structure ensures that your designs won’t fall apart when you move machines, change team members, or open an old project years down the line.


5. Using Git for Version Control

When you're working in a team or planning to maintain a hardware project over time, version control isn't optional—it's essential. The complexity of a modern electronics project goes far beyond just schematic and PCB files. The libraries themselves—symbols, footprints, 3D models—are living artifacts that evolve. A footprint might get refined. A symbol might change pin assignments. And if you don't have version control wrapped around those libraries, you're leaving your designs vulnerable to silent breakage, inconsistency, and difficult-to-debug failures.


Git is the standard here, but using it well requires a deliberate structure. The first decision is whether to embed libraries directly inside your main project repo or to reference them externally. For small, self-contained designs, placing everything under one roof is fine. But if you're collaborating with others or using shared libraries across multiple projects, it's far better to keep those libraries in their own Git repositories and connect them using Git submodules.


Submodules allow you to embed an external Git repository inside a specific directory of your main project, while keeping their histories clean and separate. For example, let’s say you’ve got two private repos hosted at https://your.git.repo/your-symbols.git and https://your.git.repo/your-footprints.git. To include them in your project, navigate to your project’s root directory and run:

git submodule add https://your.git.repo/your-symbols.git libs/symbols
git submodule add https://your.git.repo/your-footprints.git libs/footprints

This will clone the repositories into your project under the libs/ folder, and Git will track the specific commit used in each one. Anyone else who clones your main repo can initialize and update the submodules with a single command (git submodule update --init --recursive), ensuring they get the exact versions you’re using.


Inside KiCad, you then point your symbol and footprint libraries to these submodule directories—but not with absolute paths. Instead, define a project-local environment variable, such as ${PROJECT_LIBS}, that points to the relative libs/ folder. You can define this path variable in your .kicad_pro or .kicad_prl project file (or even hardcoded into the library table if you're strict about paths). From there, use it in your library URIs like this:

(lib (name CustomResistors)(type KiCad)(uri ${PROJECT_LIBS}/symbols/Resistors.kicad_sym)(options "")(descr ""))
(lib (name MyFootprints)(type KiCad)(uri ${PROJECT_LIBS}/footprints/MyParts.pretty)(options "")(descr ""))

This setup gives you complete portability. When someone else clones the repository, the libraries come with it—fully versioned, trackable, and tied to the commit history of their respective repositories. If you update the footprint for a custom connector, you can commit that change in the your-footprints repo, and your main project can selectively pull it in when you’re ready. This creates a workflow where library changes are deliberate and traceable, not accidental side effects.


For even finer control, you can tag library versions that correspond to major releases of your product, or create branches for experimental edits while keeping your mainline designs stable. And because everything is still plain text—.kicad_sym, .kicad_mod, and even .step files in many cases—Git handles diffs and merges with surprising elegance.


Ultimately, treating libraries as versioned assets on par with your design files makes the entire hardware development process more robust, more collaborative, and far more maintainable in the long run. KiCad supports this workflow beautifully, but it’s up to you to design your structure to take full advantage of it.


6. Offline Library Usage & Portability

When you share your KiCad project with collaborators—or when you set up a continuous integration (CI) system to auto-build schematics and generate boards—you cannot assume the recipient will have your custom libraries installed, nor that they'll be using the same file paths, operating system, or KiCad configuration. If your project depends on external libraries without bundling them—or if your library paths are absolute—you’re setting yourself up for broken links, missing symbols, and footprint resolution failures that can derail both human workflows and automated pipelines.


The key to making a KiCad project truly portable is offline self-containment. This means all symbols, footprints, and even 3D models used by your project should either be embedded directly or linked through relative paths and environment variables that make sense in context. Fortunately, KiCad 9.0 offers built-in tools to help you achieve exactly that.


The first step is to embed all used symbols and footprints into the project itself. This can be done using the Archive Project feature, accessible from the main window via Tools > Archive Project. What this does under the hood is create a project-local copy of every symbol and footprint actually used in the design, storing them in project_name.kicad_sym and project_name.pretty/ respectively. These become standalone libraries that your schematic and PCB will reference, ensuring that even if the external library changes or disappears, your project remains stable.


Once you've archived the project, inspect your .kicad_pro, .kicad_sch, and .kicad_pcb files. Make sure they use relative paths or environment variables, not hardcoded absolute paths. If your schematic links to something like /home/username/kicad_libs/Connectors.kicad_sym, you're creating a fragile dependency. Instead, use something like ./libs/Connectors.kicad_sym or ${PROJECT_LIBS}/Connectors.kicad_sym, where ${PROJECT_LIBS} is defined in your project settings to point to the correct relative folder. This ensures the project is relocatable—on a teammate’s system, on a CI build server, or even years later on a different OS.


The same principle applies to footprints. If your board references footprints by their full system path, or if it relies on a global library table that isn’t checked into version control, then moving the project will almost certainly result in missing modules. Embedding them in a *.pretty folder in the project itself avoids this, and the library manager will recognize them as part of the project footprint table.


One important detail: if you use 3D models, make sure their paths are also either relative or use variables like ${KISYS3DMOD} or ${CUSTOM3D}. When linking models in the footprint editor under the 3D Settings tab, avoid browsing to an absolute location like C:\Users\John\Documents\3DModels\USB-C.step. Instead, store the model in a local folder (e.g., ./3d/USB-C.step) and define a path variable that points there. This keeps the model link valid no matter where the project is cloned or opened.


This level of portability isn’t just a best practice—it’s the foundation for serious hardware development. It means your project won’t silently break when opened by a teammate, and that your automated builds can succeed without manual setup. It means you can freeze a known-good version of the design, zip the folder, and open it years later without wondering why your connector footprint looks like a 4-pin header.


KiCad gives you the tools for all of this—but it’s up to you to build the discipline and project structure to use them. Think of library self-containment as a form of design integrity: the tighter you seal the project, the less it leaks when moved.


7. Tips for a Clean, Future-Proof Setup

No matter how advanced your design is, no matter how powerful your tools are—if your library setup is messy, everything downstream suffers. Schematic capture becomes error-prone. Board layout becomes inconsistent. And worst of all, collaboration becomes a minefield. A clean, well-structured library system is what allows projects to scale, evolve, and survive over time.


First and foremost: avoid absolute paths unless you're completely certain the project will never leave your personal machine. It’s tempting—especially when you’re moving fast—to link to

C:\Users\User\Documents\KiCad_Libs\CustomSymbols.kicad_sym

but this breaks the moment someone else tries to open the project. Even across operating systems on dual-boot setups or between a laptop and a desktop, absolute paths become fragile and brittle. Stick with relative paths or environment variables at all times, especially for anything that lives outside of the project root.


Next, always favor modern KiCad formats. The legacy .lib and .dcm files still exist for compatibility, but they’re deprecated for good reason. The .kicad_sym and .kicad_mod formats are fully structured, human-readable, and supported across all modern KiCad features, including hierarchical editing, advanced search, and metadata. If you’re still holding onto .lib files, it’s time to migrate. The benefits in clarity, maintainability, and future compatibility are substantial.


As your libraries evolve—and they will—make a habit of using KiCad’s built-in tools to keep things in sync. Specifically, the Tools > Update Symbols from Library command will resynchronize your schematic symbols with the current definitions in your configured libraries. This is especially important if you’re updating shared libraries or working with teammates who might be modifying them. Sync regularly to avoid inconsistencies and surprises in your design files.


And finally: document everything. If your project uses a custom library, clone of an external repo, or even a manually curated footprint collection, make sure that’s written down. The simplest and most effective way is a README.md at the root of your project. Include a short description of each library, where it came from, and how to install or update it. A few lines of Markdown can save hours of reverse engineering when someone (maybe even you) revisits the project six months later.

Example:

# Custom Library Notes

## Symbols

- CustomSymbols.kicad_sym  
  Created in-house. Located in ./libs/symbols.  
  Add to project via Preferences > Manage Symbol Libraries.

## Footprints

- CustomFootprints.pretty  
  Contains board-specific connectors. Stored under ./libs/footprints.  
  Linked via ${PROJECT_LIBS} variable.

## 3D Models

- Stored in ./3dmodels/.  
  Paths referenced using ${CUSTOM3D}.  

## External Sources

- SnapEDA: USB-C_16Pin.kicad_mod  
  Downloaded from https://www.snapeda.com/parts/  
  Verified 2025-04-10

Good documentation turns a personal project into a professional one. It removes ambiguity, aligns your team, and makes it possible for others to build, understand, and trust your design without constant hand-holding.

Comments


©2026 by Outback Electronics. Site design by Outback Designs

bottom of page