Changelog
All notable changes to Awesome Spectral Indices are summarized here.
1.0.0 (Upcoming)
Awesome Spectral Indices has started its migration to v1. The migration is being developed alongside v0: the existing API and v0 output files remain available and can continue to be used, and spectral indices can still be submitted through the usual contribution process.
Added
- Added an independent v1 source tree under
src/v1/as the foundation for evolving the catalogue without changing the v0 implementation. - Added v1 catalogue outputs under
output/v1/, including:spectral-indices-dict.jsonspectral-indices-table.csvbands.jsonconstants.jsonexternal_variables.json
- Added a v1 generator that parses formula variables and writes the new outputs independently of v0.
- Added a dedicated v1 test suite under
test/v1/. - Added characterization tests for the existing catalogue, including:
- catalogue structure and required properties;
- supported application domains;
- formula parsing and rejection of unsupported syntax;
- validation of index definitions; and
- consistency of generated JSON and CSV outputs.
- Added root-level Markdown contribution guidelines with instructions for creating a Conda or
venvdevelopment environment, running the tests, and submitting an index. - Added links to the contribution guidelines and the AI and Scientific Validation Policy from the new-index issue template.
- Added a new VitePress website as the foundation for the v1 documentation.
- Added VitePress support for mathematical notation through MathJax.
- Added
min(),max(), and unarytanh()calls to the v1 formula expression language. Function-call syntax is new in the v1 schema. - Added WCI3 (Wheat Canopy Index, Growth Stage 3) as the first catalogue index using nested allowed functions. Its v1 formula combines multi-argument
max()with unarytanh()and an index-specificepsilonconstant. - Added the contextual reduction functions
spatial_max(),spatial_min(), andspatial_mean()to the v1 formula language. Their shared spatial scope is configured through the conditionally requiredreductionsproperty, which currently acceptsaoiandscene. - Added CWI (Coastal Water Index) to v1 as the first index using contextual spatial reductions. Its two
spatial_max()operations are evaluated over the area of interest without introducing generated reduction operands. - Added the strict two-input
kernel()function to the v1 formula language so kernel evaluations can be expressed as operations over their underlying inputs rather than as additional operands. - Added the structured v1
classificationproperty. Contributors provide the requiredapplication_domainand optionalfamily, while generation adds one or more sensing modalities from the formula standards. - Added
geologyas an application domain andkernel,tasseled_cap, andradaras the initial supported index families. - Added the six Thematic Mapper Tasseled Cap features—brightness, wetness, greenness, fourth, fifth, and sixth—to v1 as vegetation indices in the
tasseled_capfamily. - Added the v1
Polarizationsregistry and generatedpolarizationsproperty for theHH,HV,VH, andVVradar inputs. - Added a catalogue search page with:
- immediate filtering by catalogue key, acronym, name, and application domain;
- an advanced search panel for individual metadata fields;
- filtering by source link, link status, link type, and source type;
- filtering independently by classification, required bands, radar polarizations, constants, and external variables;
- results arranged by sensing-modality profile and then application domain;
- results grouped by application domain; and
- a live filtered-versus-total result count.
- Added one generated documentation page for every spectral index. Each page includes its formula, required bands, constants, external variables, source, contributor, and date of addition.
- Added the generated v1
source.source_companionsproperty, which lists the other catalogue keys sharing an index's exact source link. Generated index pages link those keys to their companion pages. - Added the v1 Explained page documenting the current v0/v1 schema difference, property meanings, validation rules, generated files, and migration status.
- Added a catalogue status dashboard with interactive summaries of source-link availability, DOI coverage, and source-type completeness, plus expandable affected-index lists.
- Added a VitePress content generator that:
- copies
CONTRIBUTING.mdinto the website; - reads the generated v1 catalogue and metadata;
- creates the spectral-index pages; and
- handles routes whose names differ only by letter case.
- copies
Changed
- Renamed the required v1 spectral-index properties
short_nametoacronymandlong_nametoname. Neither property is required to be unique. - Replaced the v1
referencestring with a structuredsourceobject. The contributor provides its requiredsource_linkand optional constrainedsource_type, while generation addssource_link_statusandsource_link_type. - Classified EVI as an article and NDVI and TVI as conference-paper sources in the v1 catalogue.
- Split formula constants from bands in v1. Constant-using indices now submit a description and optional numeric default for every formula constant, while
bandscontains spectral and radar inputs. The generatedconstants.jsongroups these definitions first by standard constant and then by index. Constant definitions can also include condition-specificsuggested_valuesand a general two-numbersuggested_range. - Replaced the synthetic kernel operands in the v1 kEVI, kNDVI, kRVI, kVARI, and kIPVI formulas with explicit
kernel(X, Y)calls. Removed all fourteenkXYvalues from the v1Bandsregistry; generated kernel-index band lists now contain only their underlying observed inputs. kEVI additionally defines theLconstant exposed bykernel(N, L). - Moved the required v1
application_domainintoclassification. The five kernel indices now use vegetation with the kernel family. The thirteen radar indices use the radar family and vegetation application, except NDPolI, which uses the new geology application. - Split radar polarizations from spectral and thermal bands in v1. Generated
bandsno longer containsHH,HV,VH, orVV; those inputs are now written topolarizations, whileclassification.sensing_modalitiesdistinguishes multispectral, thermal, and radar requirements. - Separated formula inputs supplied outside spectral data into a new v1
Externalregistry.PARis now an external variable rather than a constant, and NIRvP supplies its required, description-only definition throughexternal_variables. Generated catalogue and CSV records include this property, whileexternal_variables.jsongroups definitions by external-variable standard and index. - Changed the OCVI exponent constant from
cexptocin v1 to preserve the notation used by its original source, with OCVI-specific metadata stored independently from other indices that also use thecstandard. - Changed the GDVI exponent constant from
nexptonin v1 to preserve the notation used by its original source, with GDVI-specific metadata stored independently from RWI's use of the samenstandard. - Changed the ATSAVI formula in v1 to replace its hard-coded
0.08adjustment with the source-definedXconstant. Added the ATSAVI-specificX,sla, andslbdescriptions and defaults, includingX = 0.08. - Changed the v1 constant standard used by NDWIns from
alphatoaand the standard used by NDSInw frombetatob. Added their index-specific descriptions and retained the submitted defaults ofa = 2.0andb = 0.05. - Completed the first v1 metadata pass for all 45 indices that use registered constants. Their 75 per-index definitions now include the submitted descriptions, defaults where universal values are appropriate, and source-specific suggested values and ranges.
- Changed the GARI formula in v0 and v1 to apply an explicit atmospheric-correction parameter,
lmb, to(B - R). Added its index-specific v1 description and a default oflmb = 1.0. - Migrated catalogue validation from Pydantic 1 to Pydantic 2.
- Replaced legacy Pydantic validators and configuration with
field_validator,ConfigDict, and Pydantic 2 serialization. - Removed the custom
orjsonserialization configuration in favor of the standard Pydantic 2 and JSON serialization paths. - Added explicit string element types to the generated
bandsandplatformslists in the v0 model. - Consolidated catalogue-generation dependencies in
requirements.txtand test dependencies inrequirements-test.txt. - Moved the preserved v0 catalogue generator from
main.pytosrc/main_v0.py. - Moved the README generator from
readme.pytoreadme/readme.py. - Updated the scheduled generation workflow to run the v0 generator, v1 generator, VitePress content generator, and README generator.
- Modernized the test workflow to run on Python 3.10, 3.11, and 3.12 with pip dependency caching and read-only repository permissions.
- Updated the generation workflow to use Python 3.10, dependency caching, and explicit write permissions.
- Updated README links and badges to use the
awesome-spectral-indices/awesome-spectral-indicesorganization repository. - Updated the README and website to use theme-aware light and dark logo assets, and retained the previous artwork as
docs/public/legacy-logo.png. - Added a README migration notice explaining that the old website is no longer available, the existing API remains usable, and index submissions remain open.
- Updated contribution and download links to point to their current repository locations.
- Expanded the new-index issue template to list all currently supported application domains.
Removed
- Removed the generated
platformsproperty from v1 spectral-index records. The v0 catalogue continues to generate it. - Removed the retired Read the Docs configuration and links.
- Removed the former Sphinx documentation project, including its configuration, build files, dependency file, reStructuredText pages, and generated application-domain tables.
- Removed direct dependency installation commands from GitHub Actions in favor of the repository requirements files.
Fixed
- Corrected the SARVI formula in v0 and v1 so the atmospheric-resistance coefficient
gammais applied to the(R - B)term. - Corrected the Aerosols band name in the band metadata.
- Corrected the Landsat 9 coastal aerosol platform label, which previously identified the platform as Landsat 8.