Release Notes¶
v1.0.0 — 2026-03-17¶
EarthForge reaches 1.0.0 with full feature completeness, Rust acceleration scaffolding, comprehensive documentation, CI/CD hardening, and 429 passing tests across Python 3.11/3.12/3.13.
Added — M5 (Feature Completeness)¶
Accessibility (WCAG 2.1 AA):
FORCE_COLORenv var support alongsideNO_COLORStatusMarkerenum — text markers ([PASS]/[FAIL]/[WARN]) alongside color for all status output--high-contrastglobal CLI flag for 4.5:1 contrast ratio stylingearthforge.core.palettes— colorblind-safe palette constants (viridis, cividis, BrBG, Set2, Paired)- TUI accessibility:
nameattributes on all containers, focus-to-items-table after collection selection, 3:1 focus indicator contrast
Validation commands:
earthforge stac validate— STAC item/collection validation against spec via pystacearthforge vector validate— GeoParquet schema compliance (geo metadata, CRS, encoding)earthforge cube validate— Zarr/NetCDF structure compliance (chunks, CF-convention, CRS)
Raster extensions:
earthforge raster stats— global/zonal statistics (min, max, mean, std, median, histogram)earthforge raster calc— band math with safe expression evaluatorearthforge raster tile— XYZ/TMS static tile generation with inline tile math
Vector extensions:
earthforge vector clip— spatial clipping by bbox or WKT geometryearthforge vector tile— GeoParquet to PMTiles (tippecanoe or built-in fallback)
Cube extensions:
earthforge cube convert— NetCDF to/from Zarr with rechunkingearthforge cube stats— aggregate statistics along dimensions (mean, min, max, std, sum)
STAC extensions:
earthforge stac publish— push items to writable STAC APIs via Transaction Extension
Core infrastructure:
earthforge.core.expression— safe AST-walking expression evaluator with comparisons and safe functions (clip, where, abs, sqrt, log)- Pipeline
steps.pyrefactored to import fromcore.expression - Error types added:
StacValidationError,StacPublishError,VectorValidationError
Added — M6 (Rust Acceleration)¶
packages/rs/— PyO3/maturin Rust extension packagedetect_format_batch— Rayon-parallel magic byte sniffing across many filesparallel_range_read— Tokio concurrent HTTP range readsread_geoparquet_fast— Arrow FFI stub for zero-copy GeoParquet reading- Fallback tests ensure pure-Python path works when Rust extension is not installed
Added — M7 (Docs & Developer Experience)¶
SECURITY— security policy with vulnerability reporting, design principles, contributor checklistexamples/outputs/README.md— output gallery standards (WCAG, cartographic elements, data citation)examples/outputs/— 14 real-world output images with.txtsidecar files- 30+ example scripts across 4 continents (US, Europe, South America, Asia-Pacific)
- ArcGIS Pro Python Toolbox expanded from 5 to 14 tools
- GitHub Pages site updated: Examples tab replaces Tutorials, CLI reference expanded, API reference expanded
Added — M8 (CI/CD & Beta)¶
- Python 3.13 added to CI test matrix
--cov-fail-under=80coverage threshold- PyPI trusted publishing via OIDC (no stored API tokens)
.pre-commit-config.yaml— ruff lint + format, trailing whitespace, no-commit-to-branchcliff.toml— git-cliff changelog generation from conventional commits- Cube and pipeline packages added to CI test/typecheck/build paths
Changed — M9 (Hardening)¶
- All packages bumped to 1.0.0
- Classifier changed to
Development Status :: 5 - Production/Stable pyproject.tomltestpaths includes all 7 packagesvegetation_change_gif.pyupdated to use colorblind-safe BrBG palette
v0.1.1 — 2026-03-12¶
Fixed¶
- PyPI package URLs corrected in all sub-package
pyproject.tomlfiles - ArcGIS Pro toolbox
SearchResultItemproperties attribute fix
v0.1.0 — 2026-03-10¶
Added — M4 (Polish)¶
earthforge explore— interactive full-screen STAC browser (Textual TUI)earthforge completions bash|zsh|fish— shell completion script generationearthforge bench vector-query— GeoParquet predicate pushdown vs full scan benchmarkearthforge bench raster-info— COG header range-request timing benchmark
Added — M3 (Pipeline + Cube)¶
earthforge pipeline validate/run/list/init— declarative YAML pipeline executor- Pipeline step registry:
stac.fetch,raster.calc,raster.convert,vector.convert - Safe band math AST evaluator (no
eval/exec) earthforge cube info— lazy Zarr/NetCDF metadata (dimensions, variables, spatial bbox, time range)earthforge cube slice— spatiotemporal subset extraction without full downloadearthforge stac fetch— parallel asset download with resume support
Added — M2 (Vector + Conversion)¶
earthforge vector info— GeoParquet schema, CRS, feature count, bbox, geometry typesearthforge vector convert— Shapefile/GeoJSON/GPKG to GeoParquet 1.1.0 with bbox covering columnearthforge vector query— spatial bbox query with pyarrow predicate pushdownearthforge raster convert— GeoTIFF to COG via GDAL COG driver with auto overviews
Added — M1 (STAC + Raster)¶
earthforge stac search— search any STAC API with bbox, datetime, and collection filtersearthforge stac info— inspect STAC items and collections from a URLearthforge raster info— COG metadata via HTTP range requests (no full download)earthforge raster preview— PNG quicklook from overview levelearthforge raster validate— COG compliance check (tiling, overviews, IFD order)earthforge config init/set/get— profile management
Added — M0 (Foundation)¶
- Format detection chain: magic bytes, extension, content inspection
- Async HTTP client with retry, timeout, and range-request support
- Profile-based config system (
~/.earthforge/config.toml) - Structured output contract: all commands return Pydantic models, rendered via
--output json|table|csv|quiet - Cloud storage abstraction via obstore (S3, GCS, Azure Blob, local filesystem)
- CI: ruff lint, mypy strict, pytest (conda matrix), hatch build
Fixed¶
- GeoParquet detection reads Parquet footer for
geokey (not just.geoparquetextension) - COG validation uses
profile.get("tiled", False)instead of deprecatedis_tiled - COG conversion uses
PREDICTOR=2for DEFLATE/LZW/LZMA (30-40% better compression) - COG overview resampling default changed from
nearesttoaverage
Version Policy¶
EarthForge follows Semantic Versioning:
- 1.x.y — stable public API; minor versions add features, patch versions fix bugs
- Backwards-incompatible changes require a major version bump with deprecation warnings in the prior minor release
- Rust extension (
earthforge-rs) is always optional; pure-Python fallbacks are maintained