# Directory Structure

*PorterWP keeps all theme‑specific code and assets in a single **`/porter`** directory.*

```
my-theme
├── porter
│   ├── blocks/            # ACF blocks (one folder per block)
│   ├── inc/               # Plain‑PHP helpers loaded automatically
│   ├── config/            # JSON config files (see below)
│   ├── assets/            # Theme‑level JS/SCSS processed by gulp
│   └── blocks/make.sh     # Scaffold script for new blocks
└── functions.php
```

### Key Config Files

| File              | Purpose                                                                                                                       |
| ----------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `porter.json`     | Global options, asset enqueues & premium feature flags                                                                        |
| `posttypes.json`  | Registers Custom Post Types                                                                                                   |
| `taxonomies.json` | Registers Custom Taxonomies & their relationships                                                                             |
| `blocks.json`     | **Single hub** for block registration: links ACF block folders, adds extra block **styles**, and registers block **patterns** |
| `acf.json`        | ACF Option pages (Key Pages, theme colours, etc.)                                                                             |

> **Details:** See the [Configuration Files Index](https://whoisandywhite.gitbook.io/porterwp/documentation/configuration-files)

***

### The `inc/` autoloader

Any PHP file placed in **`porter/inc`** (or nested sub‑folders) is required automatically on `after_setup_theme`:

* Folders `first/` and `traits/` are loaded *before* everything else.
* Exclude a folder/file with `add_filter( 'porter_wp_inc_filepath_exclusions', … )`.

Returned paths are cached in the `porter_inc_files*` options when the site is in a `production` environment. Cache invalidates when you bump the `version` key inside **`porter/config/porter.json`**.
