Open Plant Cost Index (OPCI)
A free, open source plant cost index, checked against the Chemical Engineering Plant Cost Index (CEPCI), using only public domain data.
Maintained by ORIMIZ Consulting.
Status: version 1.0.0. Pin a data release (see below) so your estimates do not change when the data refresh.
What it does
At the very start of a project, before any engineering is done, an owner needs a first cost estimate to decide whether the idea is worth pursuing. AACE International (Association for the Advancement of Cost Engineering) calls this a Class 5 estimate, made in the pre-feasibility phase, also known as FEL 1 (Front-End Loading 1). It is usually built from analogue projects: plants already built, whose known costs are adjusted (normalized) to match the new project. Two of the key adjustments are time, because costs change from year to year, and place, because costs differ from country to country. OPCI provides both.
OPCI answers two questions about process plant construction costs:
- Time. How much have plant costs changed between year A and year B? This is escalation.
- Place. How do plant costs in one country compare with the US Gulf Coast? This is the location factor.
OPCI reports the two numbers apart, then the combined factor. It never blends them silently.
It is built for students, small consultancies, researchers and independent estimators who cannot buy paid cost index data.
Where the numbers come from
- Escalation uses 12 price and wage series from the US Bureau of Labor Statistics (BLS), pulled through FRED (Federal Reserve Economic Data, St. Louis Fed). All are public domain. See DATA_NOTICE.md.
- Weights follow the published 2002 CEPCI component weights, mapped to the 12 series.
- Scale. The level of the index estimated by OPCI is checked against public CEPCI values. The scale has no effect on any escalation factor.
- Location factors come from published group factors (Oxford Institute for Energy Studies) and a stated step rule. Each factor has a range, a confidence level and a source.
The full method is in METHOD.md. The check against public CEPCI values is in VALIDATION.md.
Quick start
pip install opci
The package carries its own copy of the data, so it works outside a clone. opci refresh saves newer data in ~/.opci (or the folder named by OPCI_HOME). To work on OPCI itself, clone the repository and run pip install -e ".[dev]".
Command line:
opci factor --base 2011 --target 2026 --location ID-KAL
opci factor --base 2015 --location ID-KAL --from AU-NW
opci series --start 2008 --freq quarterly --out opci_general.csv
opci series --start 2008 --chart opci_general.html
opci refresh
opci validate
Sample output:
Open Plant Cost Index (OPCI) v1.0.0 | Maintained by ORIMIZ Consulting
Data to 2026-09 | investment type: general | productivity 2% | index source: open
Escalation 2011 to 2026: x1.53
Location US Gulf Coast to East Kalimantan, Indonesia: x1.20 (range 1.08 to 1.38, confidence: medium)
Combined factor: x1.84
Sources: BLS via FRED (12 series, cached snapshot 2026-10-24); location: ID-KAL: step rule (see location table, version 0.1.0)
Note: 2026 is a part year (January to September average).
If you leave out --target, OPCI uses the latest full quarter and says so under the escalation line:
Escalation 2011 to 2026Q3: x1.56
Target: 2026Q3 (latest quarter). Use --target 2026 for the year average.
Python:
from opci import escalation, location, combined, series, format_factor
escalation(base="2011", target="2026Q3")
location(to="ID-KAL", frm="AU-NW")
print(format_factor(combined(base="2011", target="2026", to="ID-KAL")))
series(start=2008, freq="annual")
Dates are a year (2011) or a year and quarter (2011Q2). The target date defaults to the latest full quarter. Location codes are in location/factors.csv.
Pinning a data release
Each monthly refresh that passes its checks makes a data release, for example data-2026-09. Releases are never changed after they are made. A tool that uses OPCI must name a release, never "latest", so its estimates do not change overnight:
- Files:
data/releases/data-2026-09/opci_general_annual.csv(also quarterly, and JSON). Each release has aRELEASE_NOTE.mdand a git tag of the same name. - Python:
from opci import read_release; read_release("data-2026-09")
Using your own CEPCI or paid data
If you hold a CEPCI subscription or paid index data, you can use it in place of the open index. Put the values in a local file:
private_cepci.csvfor your CEPCI values, orprivate_paid_<name>.csvfor paid data, for exampleprivate_paid_ucci.csv.
The format is period,value, with periods as years (2011) or years and quarters (2011Q2), one kind per file. The tool looks in the current folder, or in the folder named by the OPCI_PRIVATE_DIR environment variable.
opci factor --base 2011 --target 2025 --location ID-KAL --index-source private_cepci
opci factor --base 2011 --target 2025 --index-source paid --paid-name ucci
The tool says what the file covers, warns about gaps and jumps above 25% between periods, and never fills gaps. The output names the file used.
These files are ignored by git, blocked by a pre-commit check and checked again by the tests. Never commit or publish them. They are your licensed data.
Limits
- OPCI is checked against public CEPCI values. It is not CEPCI. Expect differences of up to about 5% in normal years, and more in 2021 and 2022, when supply shocks after the pandemic made index values less certain.
- The data are US prices. Other countries are handled through location factors. These are judgment based and carry wider uncertainty, often plus or minus 15 to 20%.
- The tool assumes plant costs abroad rise at the US rate in dollar terms. This holds well for imported equipment and less well for local labour and materials. Version 2 will address this.
- OPCI is suited to screening and early estimates (AACE International Class 5 and Class 4). For funding decisions, use project-specific data.
Citing OPCI
Please cite OPCI with the version and data release you used:
Haider, S. Z. (2026). Open Plant Cost Index (OPCI) (Version 1.0.0, data release data-2026-09) [Computer software]. Maintained by ORIMIZ Consulting. https://github.com/ORIMIZ-Consulting/open-plant-cost-index
GitHub shows a "Cite this repository" button built from CITATION.cff. A Zenodo DOI (Digital Object Identifier) will be added at the 1.0.0 release.
Licence
Code is under the MIT licence. Copyright (c) 2026 Syed Zia Haider. See LICENSE.
CEPCI is a trademark of Chemical Engineering magazine. OPCI is not affiliated with or endorsed by Chemical Engineering.
Metadata
Release files for opci 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| opci-1.0.0.tar.gz | 95.5 kB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| opci-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 182.4 kB
Release files / opci-1.0.0.tar.gz
| Download URL | opci-1.0.0.tar.gz |
|---|---|
| Size | 95.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
214a06721f7bc75aa9d4cf46c61e36898ecc411deb2451d583621ca36d67d206
|
|
BLAKE2b-256 checksum How to use checksums |
948e52c4441c78b40e73cb6dd32dbc5e5c28bc32aea87e81e00e7e4a7dcc489d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / opci-1.0.0-py3-none-any.whl
| Download URL | opci-1.0.0-py3-none-any.whl |
|---|---|
| Size | 86.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
d04d45404e945172c79d7fc5b37fbc61eead349211e11b6d4397674dd40810f6
|
|
BLAKE2b-256 checksum How to use checksums |
638b4b05c2c9e00c800542fae8348f3de8f39d8d685f0327d06ab50a56030813
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.16
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for opci 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for opci-1.0.0.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.