NEWS.md
zip_code_db, zcta_crosswalk, and zip_to_cd objects are identical to 0.3.5: 41,877 ZIP rows, 148,897 ZCTA-to-tract rows, and 45,914 ZIP-to-district rows.zip_distance() and search_radius() retain the legacy raster::pointDistance() WGS84 calculation. search_radius() now invokes that same calculation in a vectorized call; the differential gate requires exact object identity with 0.3.5 before accepting the speedup.Depends: R (>= 3.5.0) and the legacy runtime dependencies are retained. download_zip_data() keeps its prior observable behavior. Documentation, rather than a runtime warning or no-op, discourages its use._ng API is the recommended interface for new analyses. Its suffix makes the opt-in visible in code: callers choose newer, versioned data and corrected semantics while existing unsuffixed calls stay historical._ng functions: search_state_ng(), search_county_ng(), search_city_ng(), search_tz_ng(), search_fips_ng(), search_cd_ng(), search_radius_ng(), reverse_zipcode_ng(), geocode_zip_ng(), get_tracts_ng(), get_cd_ng(), is_zcta_ng(), normalize_zip_ng(), and zip_distance_ng()._ng function requires an explicit validated data bundle as its first argument. No lookup resolves a latest alias, consults a global option, mutates the session, falls back to another vintage, or performs an implicit network request._ng never means an unpinned “latest” dataset. A project selects and records one immutable bundle version and checksum.download_zip_data_bundle(version), read_zip_data_bundle(path), zip_data_version(x), and zip_data_provenance() support checksum-pinned, offline, and auditable research workflows._ng lookups preserve input order and duplicates, represent missing rows explicitly, validate inputs consistently, use modern geodesic behavior, keep GEOIDs as character identifiers, and expose authoritative/unmapped district status.reverse_zipcode_ng() adds the two-digit state FIPS code and full five-digit county FIPS code for the record’s predominant county.raster and tidycensus remain installed legacy dependencies, but are no longer imported when zipcodeR starts. They load only when a legacy function actually calls them, avoiding the historical raster/terra and GDAL/Arrow startup failures without changing legacy results.data-2026.09 bundle, manifest, and standalone reproducibility archive are public and are the recommended pinned inputs for new _ng analyses. They use the same reviewed source vintages as data-2026.08, but add the frozen legacy inputs, exact pipeline commit, and Linux amd64 platform to the verified build contract. The comprehensive SQLite asset remains explicitly pinned to data-2026.08; no implicit substitution occurs.tools/compatibility-check.R installs 0.3.5 and the candidate in isolated libraries, then compares the public datasets, legacy calls, conditions, and function signatures with identical()._ng order/duplicate/missing behavior, antimeridian and threshold searches, unavailable coordinates, and authoritative/unmapped district behavior.R CMD check --as-cran on Windows, macOS, Ubuntu release/devel/oldrel and runs the differential gate. The Windows SHA fallback ignores non-portable shasum.bat wrappers._ng calls, and recording both data version and bundle SHA in research outputs.inst/CITATION uses bibentry() rather than deprecated citEntry().zip_distance() results (contributed by Nicholas X Lee).zip_distance() across two vectors or columns of ZIP codes.units argument to return miles or meters.zip_code_db.download_zip_data() to download directly from upstream.lonlat distance-calculation argument.search_radius(), zip_distance(), geocode_zip(), and normalize_zip().reverse_zipcode() to return a blank row for unmatched ZIP codes.search_ family quieter.