Changelog
v0.7.0 (2026-05-07)
Feat
- style: add Mapbox GL style and thumbnail generation for vector/raster assets (closes #13) (#414)
- partition: add STAC partition extension support (#413)
- version: add git-like version management UX (closes #389) (#406)
- convert: add configurable vector spatial optimization via geoparquet-io (#404)
- readme: add --verbose flag for detailed output (#403)
- add: add --force flag for re-tracking files (closes #386) (#400)
- partition: add spatial partitioning for large GeoParquet files (#399)
- stac: normalize asset keys and titles for well-known roles (#375)
- convert: auto-generate JPEG thumbnail for COG items (#373)
- extract: add CSW/ISO 19139 metadata seeding for WFS (#366)
- extract: add WFS extraction support (#363)
- extract: flatten single-layer ArcGIS services (Issue #358) (#362)
- pmtiles: add PMTiles generation from GeoParquet (#115) (#346)
- skills: Add Source Cooperative upload skill (#331)
- Metadata extractor abstraction design (#312, #316) (#328)
- stac-geoparquet: Generate items.parquet for large collections (#319) (#327)
- progress: Unified progress output model (ADR-0040) (#320)
- async: Complete async migration for push/pull operations (#321)
- Integrate Iceberg backend plugin routing and remote mode (#302)
- imageserver: add ArcGIS ImageServer raster extraction support (#308)
- metadata: add data defaults support in metadata.yaml (#310)
- metadata: add --recursive flag to metadata init (#299)
- convert: add multi-layer format support for GeoPackage and FileGDB (#287)
- push: add live progress bar with upload speed (#284)
- extract: add portolan extract arcgis command (#288)
- convert: make COG conversion settings configurable via config.yaml (#283)
- metadata.yaml enrichment, README generation, batch versioning, S3 fixes (#278)
- stac: implement Wave 2 extended STAC metadata & statistics (#277)
- stac: implement STAC extension foundation (Wave 1) (#273)
- deps: upgrade menard to 0.3.0 with brevity support (#266)
- ci: add menard for documentation drift detection (#264)
- deps: add deptry for dependency management (#263)
- add GitHub PR and issue templates from geoparquet-io (#260)
- push: upload STAC metadata files for full catalog sync (#254)
Fix
- crs: skip mismatch validation for geographic CRSes (#415)
- hooks: restore SKILL.md accidentally deleted in PR #399 (#411)
- init: add trailing slash to pystac normalize_hrefs (fixes #401) (#405)
- partition: correct path mismatch in versions.json and glob patterns (#402)
- Collection-level assets for single-file vectors (#350, #383) (#398)
- check: unify metadata scan via STAC manifest (closes #345, #384) (#396)
- add: detect file changes within mtime tolerance (#394)
- pmtiles: clean up partial output files on generation failure (#393)
- deps: update geoparquet-io to v1.1.1 for bbox coordinate fix (#392)
- ci: update nightly workflow for mutmut 3.x API (#391)
- config: resolve dotted keys from nested YAML (#382)
- extract: clean collection names and filter boilerplate (#381)
- extract: propagate rich metadata to STAC from WFS/ArcGIS (#371)
- add: support PMTiles and FlatGeobuf without conversion (#370)
- stac: collection-level vector assets skip item.json (#365)
- extract: add via link provenance and fix asset path doubling (#361)
- push: upload root README.md and versions.json when pushing all collections (Issue #357) (#360)
- config: move credentials to env vars (Issue #356) (#359)
- push: conservative concurrency defaults (Issue #344) (#348)
- versions: implement catalog-level versioning with stress tests (fixes #339) (#347)
- imageserver: improve UX for bbox, tile size, and error handling (#338)
- stac: declare raster extension and aggregate collection extensions (#337)
- Clean up dead code, duplicates, and doc/code mismatches (#333)
- sync/push/pull improvements (#323, #324, #325, #329) (#330)
- stac: use STAC_VERSION constant and wire up Table extension (#307)
- info: handle catalog root and subcatalogs when using dot path (#298)
- deps: add pygments CVE-2026-4539 security constraint (#297)
- deps: resolve security audit failures (#286)
- add: format-aware collection inference per ADR-0031 (#269)
- add: treat FileGDB directories as data assets for collection ID inference (#262)
- scan: detect GeoJSON content in .json files (#261)
- push: recursive collection discovery for nested catalogs (#255)
- dataset: correct asset paths for collection-level assets (#253)
Refactor
- hooks: migrate from pre-commit to prek (#408)
- remove global AI tool config from project (#334)
- catalog: remove state.json sentinel - config.yaml alone is sufficient (#301)
Perf
- tests: enable parallel test execution with pytest-xdist (closes #410) (#412)
- scan: Fix O(n²) performance in _check_mixed_structure (#314) (#326)
v0.6.0 (2026-03-19)
BREAKING CHANGE
- Collection IDs now use nested paths (e.g., "climate/hittekaart")
Feat
- push: add parallel push with --workers flag (#244)
- cli: git-style command scoping for list, push, pull (#243)
- scan: nested catalog support with structure recommendations (#242)
- nested catalog support (#237) (#240)
- push: add catalog-wide push without --collection flag (#228)
- cli: agent-native improvements with JSON output and input hardening (#223)
Fix
- cli: default AWS profile to 'default' for S3 commands (#227)
- output: improve detail text readability across terminal themes (#219)
Refactor
- catalog: remove dead write/read_catalog_json helpers (#217)
v0.5.0 (2026-03-08)
Feat
- cli: unify list and status commands (#215)
- cli: remove deprecated dataset command group (#214)
- cli: add file-level progress output for add and check --fix (#213)
- check: add --remove-legacy flag to delete source files after conversion (#212)
Fix
- scan: normalize filenames to lowercase with dashes (#211)
v0.4.4 (2026-03-07)
Feat
- scan: batch and summarize repeated warnings (#194)
- add: accept multiple paths like git add (#189)
- add: support tabular parquet as auxiliary assets (#190)
Fix
- list: show all assets grouped by item (#196) (#204)
- add: batch repetitive failures by error message (#199) (#205)
- add: accept PMTiles as cloud-native primary asset (#201)
- status: treat FileGDB directories as single assets (#187)
- status: detect and skip symlink cycles (#188)
- add: continue on errors and report all failures at end (#191)
- scan: list specific unrecognized files instead of just count (#185)
- scan: make PATH argument optional, default to current directory (#184)
- scan: remove non-existent --bundle flag reference from suggestion (#183)
v0.4.3 (2026-03-07)
BREAKING CHANGE
- Removes --fix-metadata flag; use --metadata --fix instead.
Feat
- cli: add portolan clean command to remove metadata (#172)
- cli: add --item-id flag to portolan add command (#171)
- check: redesign --fix to work orthogonally with --metadata/--geo-assets (#164)
Fix
- dataset: make add_dataset atomic and track files in-place (#170)
- catalog: unify catalog root detection (#162) (#169)
- status: detect untracked files in uninitialized collections (#167)
- dry-run: prevent network calls in dry-run mode (#168)
- add: support recursive add at catalog root (#166)
- list: add guidance when no items found (#165)
v0.4.2 (2026-03-06)
Feat
- full FileGDB support for scan and add workflows (#157)
- clone: add git-style ergonomics to clone command (#156)
- assets: track ALL files in item directories, not just geo files (#135)
- validation: add collection ID validation and auto-fix (#132)
- ci: add duplicate code detection with pylint R0801 (#130)
- config: add conversion config for format handling overrides (#128)
Fix
- detect FileGDB directories during scan (#153)
- warn and skip non-geospatial CSV files during add (#152)
- cli: remove contradictory dry-run output messages (#150)
- normalize trailing slashes in S3 URLs (#151)
- versions: merge assets with previous version for snapshot model (#149)
- versions: use catalog-root-relative hrefs in versions.json (#126)
Refactor
- catalog: unify config.json and config.yaml as sentinel (ADR-0027) (#131)
v0.4.1 (2026-02-27)
BREAKING CHANGE
- Catalog structure changed. Collections now live at root
level, not inside
.portolan/collections/.
Feat
- Wave 1 documentation alignment (Phases 1-3) (#122)
- cli: promote add/rm to top-level commands (#106)
- check: add --metadata and --geo-assets flags (#105)
- config: add config command and hierarchical configuration system (#104)
- sync: add sync and clone commands for catalog synchronization (#93)
- sync: implement push and pull commands (#92)
- backends: wire JsonFileBackend versioning methods (#90)
- download: add download primitive for cloud object storage (#91)
- upload: port upload primitive from geoparquet-io (#46)
- metadata: implement check metadata handling (#87)
- convert: implement check --fix conversion workflow (#85)
- init: implement portolan init with state detection (#83)
- tooling: add grepai MCP integration for semantic code search (#79)
- models: implement STAC metadata models for catalog, collection, item, schema (#78)
- scan: implement --fix flag for safe auto-fixes (#76)
- scan: add --manual flag for tree-structured manual-resolution output (#72)
- add global --format=json output option (#70)
- backends: implement VersioningBackend protocol and plugin discovery (#71)
- scan: implement portolan scan command (Phase 1 MVP) (#63)
- tests: add directory scan fixtures for portolan scan command (#61)
- tests: consolidate fixtures, migrate to real-world data (#58)
- tests: add real-world test fixtures for orchestration testing (#55)
Fix
- scan: add .parquet to GEO_ASSET_EXTENSIONS (#124)
- catalog: write versions.json to root per ADR-0023 (#123)
- structure: STAC at root level per ADR-0023 (#102)
- emit warnings for permission errors and broken symlinks in scan (#65)
- ci: add pythonpath to pytest config for scripts imports (#56)
- ci: enable workflow_dispatch for release recovery (#52)
v0.4.0 (2026-02-09)
Feat
- validation: PMTiles recommended, not required (#49)
- warn on non-cloud-native formats (#48)
- workflow: add speckit for specification-driven development (#47)
- hooks: add auto-fetch for core dependency docs via gitingest (#44)
Fix
- ci: extract only project version from pyproject.toml (#45)
v0.3.0 (2026-02-07)
Feat
- dataset: implement dataset CRUD operations (#39)
- v0.4 - Metadata extraction and validation framework (#37)
- v0.3 format conversion foundation (#36)
- output: add dry-run and verbose modes to output functions (#32)
- test: add geospatial test fixtures for vector and raster formats (#31)
Fix
- ci: add retry for Python install and suppress hypothesis flaky test warning (#40)
- ci: update codecov configuration with token and slug (#28)
- ci: update nightly workflow for mutmut 3.x API (#25)
- ci: use mutmut junitxml instead of non-existent --json flag (#23)
- ci: repair failing workflows with tag-based releases and placeholder tests (#22)
- docs: update GitHub organization from portolan to portolan-sdi (#21)
v0.2.0 (2026-02-05)
Feat
- cli: add
portolan init command (#20)
v0.1.3 (2026-02-05)
Fix
- docs: use absolute GitHub URL for ADR link in roadmap
v0.1.2 (2026-02-04)
Fix
- ci: handle commitizen exit code 16 (NO_PATTERN_MAP)
- ci: use commit SHA for GitHub release target
v0.1.1 (2026-02-04)
Fix
- ci: add --yes flag to commitizen dry-run for first tag
- ci: handle commitizen NO_COMMITS_TO_BUMP exit code gracefully