Skip to content
Draft
Show file tree
Hide file tree
Changes from 130 commits
Commits
Show all changes
560 commits
Select commit Hold shift + click to select a range
0758748
fix: keep postal polys in admin_polygons.bin (cell index ID stability)
zackpollard Apr 13, 2026
475c43e
fix: add centroid postcode validation filter
zackpollard Apr 13, 2026
a4f6213
feat: build-time postcode validation for centroid index
zackpollard Apr 13, 2026
7346eb1
feat: accumulate TIGER postcodes into centroid index
zackpollard Apr 13, 2026
238cb3e
feat: add addr_postcodes.bin as optional per-addr postcode file
zackpollard Apr 13, 2026
1798199
chore: run s3 speed test on pokedex-general
zackpollard Apr 13, 2026
2ce760b
feat: per-way postcode fallback to nearest centroid (get_nearest_post…
zackpollard Apr 13, 2026
da3ae01
feat: per-country postcode validation matching nominatim's clean_post…
zackpollard Apr 13, 2026
1bb5c12
fix: per-country postcode centroid accumulation
zackpollard Apr 13, 2026
3d4f226
fix: remove centroid fallback from way sweep (uses non-per-country data)
zackpollard Apr 13, 2026
708115b
feat: ingest GeoNames external postcode centroids (4.3M postcodes)
zackpollard Apr 13, 2026
8c2aedf
fix: use --external-postcodes flag name in workflow
zackpollard Apr 13, 2026
b85e62e
fix: include TIGER + GeoNames entries in per-country centroid output
zackpollard Apr 14, 2026
1f08d52
fix: disable housenumber refinement — wrong numbers worse than missing
zackpollard Apr 14, 2026
783244a
analysis: housenumber refinement correct but net neutral
zackpollard Apr 14, 2026
e8a0661
feat: re-enable named footways + resolve addr:street to way name:en
zackpollard Apr 14, 2026
b99c106
feat: building radius boost for addr_point primary selection
zackpollard Apr 14, 2026
28e8235
fix: only fill street_id when addr:street missing, don't replace
zackpollard Apr 14, 2026
baebf49
feat: token-matched addr:street → way name:en resolution
zackpollard Apr 14, 2026
ca22204
feat: polygon overlay in test portal + map click auto-select
zackpollard Apr 14, 2026
1caf32b
feat: per-continent full builds + zstd transport compression
zackpollard Apr 14, 2026
5082bb5
feat: zstd --ultra -22 --long=27 with full parallel compression
zackpollard Apr 14, 2026
77c82af
feat: zstd -T0 per file with 4 parallel workers for 80-thread runners
zackpollard Apr 14, 2026
ae13980
feat: gate city/town/village place fallback on municipality containment
zackpollard Apr 15, 2026
4ab566d
feat: inherit postcodes from boundary=census polygons at build time
zackpollard Apr 15, 2026
e8bf654
fix: bump zstd worker count to NPROC/2 for full core utilization
zackpollard Apr 15, 2026
82729f9
fix: zstd -22 -T1 with NPROC parallel workers, drop --long
zackpollard Apr 15, 2026
47bb553
fix: build display_name from all populated fields in rank_address order
zackpollard Apr 15, 2026
1e350b6
fix: handle stale .bin files when decompressing yesterday's build
zackpollard Apr 15, 2026
2e807eb
fix: defer old-output decompression to patch step to avoid disk exhau…
zackpollard Apr 15, 2026
796c2d8
fix: skip apply-replication-diffs when force_fresh=true
zackpollard Apr 15, 2026
ab8bc00
revert: un-skip apply-diffs; reduce zstd workers to 5×T0
zackpollard Apr 15, 2026
10a56a1
fix: exclude stale .bin files from old-output cache download
zackpollard Apr 15, 2026
24a4462
fix: drop stale-.bin pre-removal in patch step (set -e unsafe)
zackpollard Apr 15, 2026
2f2c03d
perf: switch zstd from --ultra -22 to -19
zackpollard Apr 15, 2026
251f401
ci: log per-file patch mismatches + upload on failure for debugging
zackpollard Apr 15, 2026
cf0b152
fix: deterministic cell_to_admin + postcode centroid ordering
zackpollard Apr 15, 2026
5fd8646
feat: patch secondary files via full-replacement sections
zackpollard Apr 15, 2026
c0a83ed
fix: emit empty-file raw sections so patch creates 0-byte verify outputs
zackpollard Apr 15, 2026
224d59f
fix: addr_points parent_way_id corruption + child_merge 32-bit overflow
zackpollard Apr 15, 2026
9a8ab5f
feat: switch is_included_highway to Nominatim allow-list
zackpollard Apr 16, 2026
9a53157
fix: place nodes take priority over admin boundaries for sub-city fields
zackpollard Apr 16, 2026
bd2efd8
feat: implement find_linked_place step 4 (name-match fallback)
zackpollard Apr 16, 2026
139a315
fix: country-gate nearest postcode centroid lookup
zackpollard Apr 16, 2026
352d6fd
feat: enable housenumber refinement when street wins primary
zackpollard Apr 16, 2026
596406d
fix: tighten find_linked_place step 4 to exact name match
zackpollard Apr 16, 2026
d8de512
revert: housenumber refinement when street wins primary
zackpollard Apr 16, 2026
aaf050b
feat: polygon geometry for building addr_points
zackpollard Apr 17, 2026
f5765f8
perf: flat float storage for thread-local building addr polygons
zackpollard Apr 17, 2026
8a80743
fix: primary-feature parity for polygon addr_points
zackpollard Apr 17, 2026
3e863e4
fix: remove query-time postal-boundary PIP from postcode chain
zackpollard Apr 17, 2026
8035dd7
feat: POI postcode inheritance from postal boundaries
zackpollard Apr 17, 2026
ffa4049
feat: office=government POI ingestion with relation addr emission
zackpollard Apr 17, 2026
ec5f846
feat: housenumber refinement when street wins primary
zackpollard Apr 17, 2026
cb9466b
feat: nominatim fuzzy-area gate for place nodes
zackpollard Apr 17, 2026
4bbceb3
feat: prefer admin over place node for sub-city address fields
zackpollard Apr 17, 2026
85f6256
feat: index unnamed rank-30 POIs for nominatim primary parity
zackpollard Apr 17, 2026
533fff1
feat: per-way postcode inheritance via vertex-majority vote
zackpollard Apr 17, 2026
85e2ab6
feat: hybrid chain-walk admin resolution for coarse ranks
zackpollard Apr 17, 2026
e870c03
docs: name-suffix normalization is a no-op (Option 6)
zackpollard Apr 17, 2026
c7d0125
feat: city-state country-as-city fallback
zackpollard Apr 17, 2026
21a81b3
fix: skip string pool remap for unnamed POIs with NO_DATA name_id
zackpollard Apr 18, 2026
4581735
fix: guard get_string calls against NO_DATA name_id on unnamed POIs
zackpollard Apr 18, 2026
0b49ffe
feat: distinguish highway-class polygon POIs from rank-30 POIs
zackpollard Apr 20, 2026
a6fe1a7
ci: bump EXPECTED_BUILD_VERSION to 10 for patch chain
zackpollard Apr 22, 2026
b4fb806
fix: emit addr_vertices.bin in patch (was missing since build_version=9)
zackpollard Apr 22, 2026
b5c5b8e
ci: upload checksums.sha256 to cache too
zackpollard Apr 22, 2026
eabaf33
feat: UX-focused POI primary-selection improvements
zackpollard Apr 23, 2026
6c2691a
feat: POI parent_poly_id for chain-containment filter
zackpollard Apr 23, 2026
e625fa5
feat: POI ranking tuning for landmark-first places[] surface
zackpollard Apr 23, 2026
775d5af
feat: area-ascending tie-break for contained POI ordering
zackpollard Apr 23, 2026
e260ab1
feat: surface contained landmarks in address via OSM-class fields
zackpollard Apr 23, 2026
0d0c6d3
feat: expand PoiCategory to cover every common OSM tag value
zackpollard Apr 23, 2026
a98c57a
feat(test-portal): opt-in Nominatim comparison + dynamic field breakdown
zackpollard Apr 23, 2026
aa1ffd0
feat: woods/landuse categories + single landmark field
zackpollard Apr 23, 2026
105f57d
feat: dedup point-POIs by category; drop zone-landuse from landmarks
zackpollard Apr 23, 2026
29fb9a8
fix: relax places[] dedup + expand landmark class mapper
zackpollard Apr 23, 2026
5121515
feat(test-portal): add copy-coordinates button on each result card
zackpollard Apr 23, 2026
4e0bc57
feat: split strings.bin into 5 per-consumer tier files
zackpollard Apr 24, 2026
29094db
fix: partition strings into tiers for continent subsets too
zackpollard Apr 24, 2026
2f387dc
feat(geocoder): add TS + WASM ports for in-process reverse-geocoding
zackpollard Apr 25, 2026
983834b
feat(geocoder): full feature parity for both ports
zackpollard Apr 25, 2026
f443858
refactor(geocoder): split server into lib + bin so wasm-port can shar…
zackpollard Apr 26, 2026
ca450ba
feat(geocoder): FileBytes enum + JsChunked source infrastructure
zackpollard Apr 26, 2026
f08bcc3
feat(geocoder): wire chunked-on-demand through query_geo + find_addr_…
zackpollard Apr 26, 2026
a184bac
feat(geocoder): chunked-on-demand for ts-port — lifts JS 4 GiB Buffer…
zackpollard Apr 26, 2026
7451c91
feat(geocoder): chunk-aware admin_vertices + poi_vertices, throughput…
zackpollard Apr 26, 2026
b39b134
feat(geocoder): make every file consumer chunk-aware (0 MB inline floor)
zackpollard Apr 26, 2026
7a28bc2
chore(geocoder): tune chunked LRU page cap to 32 pages (2 MiB/file)
zackpollard Apr 26, 2026
007da45
feat(geocoder): per-polygon vertex quantization (u16/u32 deltas)
zackpollard Apr 26, 2026
95319ec
feat(geocoder): inline polygon header + addr_vertices quantization
zackpollard Apr 26, 2026
0a46ca8
chore(geocoder): bump build_version to 15 (vertex quantization format)
zackpollard Apr 26, 2026
cb91b62
fix(geocoder-diff): emit admin/poi vertices as raw blocks
zackpollard Apr 26, 2026
096ac9c
fix(geocoder-diff): emit tiered string marker before explicit-remap
zackpollard Apr 26, 2026
44d36c1
ci(geocoder-build): set pipefail on build-index so silent crashes pro…
zackpollard Apr 27, 2026
ece2bae
fix(builder): drop oversized vertex-bytes pre-reserve
zackpollard Apr 27, 2026
179bd0c
fix(builder): propagate addr_vertices through continent filter
zackpollard Apr 27, 2026
0545749
test-portal: q2.5 default + add second test server (uncapped) for com…
zackpollard Apr 27, 2026
d38a7de
feat(geocoder): admin-minimal tier, configurations.json migration, mu…
zackpollard Apr 27, 2026
d1f0232
fix(geocoder): patch chain bootstrap + 3-state polygons toggle
zackpollard Apr 28, 2026
7c76d83
fix(geocoder-diff): emit cross-tier string remaps in explicit section
zackpollard Apr 28, 2026
3a4b1ff
fix(geocoder-diff): byte-block delta for admin_vertices.bin
zackpollard Apr 28, 2026
53a7102
fix(geocoder): fall back to <region>/full/ for strings_*.bin
zackpollard Apr 28, 2026
c81ef6b
feat(geocoder-diff): byte-block delta for poi_vertices.bin
zackpollard Apr 28, 2026
aa54b91
fix(ci): timeout the geonames + wikidata downloads
zackpollard Apr 28, 2026
de05f9f
fix(geocoder-diff): cheap fallback path for poi-only invocations
zackpollard Apr 29, 2026
8944969
fix(geocoder-diff): postcode_id remap + skip POI_PARENT_REMAP for non…
zackpollard Apr 29, 2026
1ffb29d
fix(geocoder-diff): generalize parent-id remap to addr_points + place…
zackpollard Apr 29, 2026
1a58f17
feat(geocoder-build): IdAllocator scaffolding for persistent dense IDs
zackpollard Apr 29, 2026
501283b
feat(geocoder-build): emit street_ways.osm_ids.bin sidecar
zackpollard Apr 29, 2026
1df2a9f
feat(geocoder-build): strategy-2 stable IDs for street_ways
zackpollard Apr 29, 2026
71059c3
feat(geocoder-build): strategy-2 stable IDs for admin_polygons
zackpollard Apr 29, 2026
e70306b
feat(ci): wire strategy-2 sidecar lifecycle through CI
zackpollard Apr 29, 2026
b57e57b
feat(geocoder-build): scaffold sidecar fields for remaining record types
zackpollard Apr 29, 2026
99b6e1c
feat(geocoder-build): plumb osm_id through addr/place/poi/interp crea…
zackpollard Apr 29, 2026
a018285
feat(geocoder-build): apply_strategy2_* for addr/place/poi/interp
zackpollard Apr 29, 2026
7b77ef9
feat(geocoder-build): emit strategy-2 sidecars for all 6 record types
zackpollard Apr 29, 2026
61196c0
chore(geocoder-build): bump build_version 16 → 17 for strategy-2
zackpollard Apr 29, 2026
a146065
feat(geocoder-build): preserve osm_ids through continent_filter
zackpollard Apr 29, 2026
e7abccb
feat(geocoder-server): tombstone-aware record accessors
zackpollard Apr 29, 2026
f1d3267
feat(geocoder-build): strategy-2 stable IDs for postcode_centroids
zackpollard Apr 29, 2026
a9eaea9
fix(geocoder-build): emit canonical full-set POI sidecar for strategy-2
zackpollard Apr 29, 2026
328e5a0
revert: build_version stays at 16, strategy-2 sidecars are additive
zackpollard Apr 30, 2026
f702006
perf(geocoder-build): identity-remap fast path skips shadow alloc
zackpollard Apr 30, 2026
738c427
perf(geocoder-build): drop IdAllocator.claimed_ and free prev_to_idx_…
zackpollard May 13, 2026
fb47623
chore(ci): log MemAvailable + build-index RSS every 30s during step 9
zackpollard May 13, 2026
9658619
fix(geocoder-build): log strategy2-pois stats before take_slots()
zackpollard May 13, 2026
d322ee9
perf(geocoder-build): cap continent parallelism at 2, stream memwatch…
zackpollard May 13, 2026
3fd9d61
chore(ci): push memwatch samples to S3 every 30s
zackpollard May 13, 2026
e28f84b
chore(ci): move memwatch upload to public Tigris bucket
zackpollard May 13, 2026
1fbaf54
perf(geocoder-build): release dense node index after way parsing
zackpollard May 13, 2026
e2e0632
fix(geocoder-diff,patch): order POI_PARENT_REMAP first + admin_polygo…
zackpollard May 20, 2026
56220b2
fix(geocoder-build): rebuild street_nodes/interp_nodes in way order a…
zackpollard May 20, 2026
55ca34f
perf(geocoder-diff,patch): sparse position-delta for FULL_REPLACE files
zackpollard May 20, 2026
aa54f52
fix(geocoder-diff): keep str_remap alive until after emit_sparse_delta
zackpollard May 20, 2026
8c1e39d
chore(geocoder-diff): log sparse-delta run-length stats
zackpollard May 21, 2026
5453880
fix(geocoder-diff): use osm_id sidecar as secondary-match key
zackpollard May 21, 2026
bc83158
Revert "fix(geocoder-diff): use osm_id sidecar as secondary-match key"
zackpollard May 21, 2026
948cdfb
perf(geocoder-patch): delta-encode ENTRY_CORRECTION
zackpollard May 21, 2026
8b15bfe
fix(geocoder-diff): use osm_id sidecar as secondary-match key
zackpollard May 21, 2026
7dc21d3
Revert "fix(geocoder-diff): use osm_id sidecar as secondary-match key"
zackpollard May 21, 2026
e2f3c0e
Revert "perf(geocoder-patch): delta-encode ENTRY_CORRECTION"
zackpollard May 21, 2026
8b485f9
docs: handoff for geocoder patch-size reduction session
zackpollard May 22, 2026
c1f7101
perf(geocoder): byte-block merge for addr_vertices via content-hash
zackpollard Jun 9, 2026
e02ca59
fix(geocoder): emit addr_points vertex_offset fixups for byte-block m…
zackpollard Jun 9, 2026
8daca37
chore(ci): capture per-variant diff logs as artifact
zackpollard Jun 9, 2026
60f1532
perf(geocoder-diff): remove emit_sparse_delta FULL_REPLACE fallback
zackpollard Jun 9, 2026
587613c
fix(geocoder-build): correct admin_polygons sidecar prev_dir path
zackpollard Jun 9, 2026
63ebed3
docs: update handoff with oceania results + admin path fix findings
zackpollard Jun 9, 2026
c8c3b3c
fix(geocoder-build): sort addr_osm_ids before strategy-2 for determin…
zackpollard Jun 9, 2026
4c12577
fix(geocoder-build): reorder _osm_ids in lockstep with deterministic …
zackpollard Jun 9, 2026
0c4ab0c
docs: update handoff with build-determinism breakthrough
zackpollard Jun 9, 2026
ec44b40
fix(geocoder-build): reorder interp_osm_ids in lockstep with sort
zackpollard Jun 9, 2026
7976e2c
fix(geocoder-build): reorder place_osm_ids + poi_osm_ids in lockstep …
zackpollard Jun 9, 2026
f189bdb
docs: planet validation results — 477 MiB compressed (8x reduction)
zackpollard Jun 9, 2026
6a20b9d
fix(geocoder-build): osm_id tiebreakers in sort cmps for full determi…
zackpollard Jun 9, 2026
627ae7e
fix(geocoder-build): iterate sort order in osm_ids dedup for ways/pois
zackpollard Jun 9, 2026
7fd6af3
docs: 92 MiB planet patch — 41x reduction achieved
zackpollard Jun 9, 2026
1cf9f0b
docs: validate real day-over-day chain — 3 days oceania, 26/26 each
zackpollard Jun 9, 2026
6718dd6
docs: multi-day chain test + per-preset patch sizes
zackpollard Jun 9, 2026
9f50684
docs: clarify that .osm_ids sidecars are never in published bundle
zackpollard Jun 9, 2026
a527e24
docs: explicit structural reality of fresh vs chained builds
zackpollard Jun 9, 2026
6b19bc6
chore(geocoder-build): add per-structure memory profiling at peak
zackpollard Jun 9, 2026
c6de2e1
perf(geocoder-build): shrink_to_fit big parsed containers post-release
zackpollard Jun 9, 2026
6d563f3
perf(geocoder-build): release dense node index BEFORE admin assembly
zackpollard Jun 9, 2026
a670268
ci(geocoder): daily schedule + Tigris/cache retention + crash-retry w…
zackpollard Jun 10, 2026
cc1b091
ci(geocoder): upload osm_ids sidecars to public bucket too
zackpollard Jun 10, 2026
8b71059
fix(geocoder): correct strategy-2 remap of POI/cell reference fields
zackpollard Jun 11, 2026
104a22e
ci(geocoder): harden watchdog ref + cleanup guards (review fixes)
zackpollard Jun 11, 2026
981ca7f
Merge fix/strategy2-remap-bugs: correct strategy-2 POI/cell remaps
zackpollard Jun 11, 2026
d413c3d
test(geocoder): add grid_query differential harness for read-path val…
zackpollard Jun 11, 2026
95a30e7
fix(geocoder-build): keep quality admin_polygons.bin index-aligned wi…
zackpollard Jun 12, 2026
bab4684
perf(geocoder-diff): coalesce runs in child/vertex byte-stream merges
zackpollard Jun 16, 2026
f723164
Merge perf/coalesce-merge-runs: coalesce byte-stream merge runs
zackpollard Jun 16, 2026
09dd518
fix(geocoder-build): give closed-way admin polygons a stable osm_id (…
zackpollard Jun 16, 2026
c67c60b
fix(geocoder-build): reorder admin_osm_ids in lockstep with vertex-co…
zackpollard Jun 16, 2026
b0d8c4d
fix(geocoder-build): deterministic tie-break for addr parent_way_id (…
zackpollard Jun 16, 2026
7aaa614
fix(geocoder-diff): skip full-replace of byte-identical raw files
zackpollard Jun 17, 2026
9865c13
fix(geocoder-build): unique stable id for relation-emitted addr point…
zackpollard Jun 17, 2026
64fc8c6
fix(geocoder-build): deterministic admin tie-break for parent selecti…
zackpollard Jun 17, 2026
97b37e0
fix(geocoder-diff): skip sparse-delta of byte-identical files too
zackpollard Jun 17, 2026
def0d66
fix(geocoder-build): deterministic place-type map merge for admin lin…
zackpollard Jun 17, 2026
1c055ef
fix(geocoder-diff): skip merge-encoding of byte-identical files
zackpollard Jun 17, 2026
81b9c21
fix(geocoder-build): deterministic place-node link tie-break for admi…
zackpollard Jun 17, 2026
cbb3ba4
fix(geocoder-diff): skip vertex/way offset fixup for byte-identical f…
zackpollard Jun 17, 2026
731c4ef
merge fix/admin-closedway-stable-id: #105/#117 determinism + diff-siz…
zackpollard Jun 17, 2026
dc9ec64
fix(geocoder-build): close planet determinism gaps found in branch re…
zackpollard Jun 17, 2026
81b6941
refactor(geocoder-diff): centralize copy-old marker + harden patch apply
zackpollard Jun 17, 2026
cb56533
test(geocoder-build): add dependency-free unit test suite + code revi…
zackpollard Jun 17, 2026
2efa34e
test(geocoder-server): add unit tests for pure helpers (6 -> 48 tests)
zackpollard Jun 17, 2026
16eec17
refactor(geocoder-build): hoist duplicated CellItemPair comparator
zackpollard Jun 17, 2026
8190e6f
fix(geocoder-server): remove alignment UB in decode_polygon_verts F32…
zackpollard Jun 17, 2026
48a47d3
refactor(geocoder-build): lift classify_poi to a file-scope free func…
zackpollard Jun 17, 2026
baa5ab6
docs(geocoder): record applied refactors + human-supervised remainder…
zackpollard Jun 18, 2026
0b654c3
refactor(geocoder-build): name magic constants + guard external-tool …
zackpollard Jun 18, 2026
b2efa90
docs(geocoder): mark byte-safe MEDIUM polish items as done in review
zackpollard Jun 18, 2026
05b22b9
refactor(geocoder-build): hoist float_bits + drop re-inlined cell_ite…
zackpollard Jun 18, 2026
683fda6
docs(geocoder): correct verified review findings + record float_bits …
zackpollard Jun 18, 2026
0fb5020
refactor(geocoder-server): byte-safe cleanups in the query/http/auth …
zackpollard Jun 19, 2026
8d10ad7
refactor(geocoder-build): byte-safe cleanups in builder core
zackpollard Jun 19, 2026
7cd9c24
refactor(geocoder-build): byte-safe cleanups in the diff/patch tools
zackpollard Jun 19, 2026
bb91527
docs(geocoder): record batch-A byte-safe cleanups + the caught mmap r…
zackpollard Jun 19, 2026
fa72bf8
fix(geocoder-server): correct three Nominatim divergences in the read…
zackpollard Jun 19, 2026
cd4db9c
docs(geocoder): record nominatim-bug verdicts (3 fixed, 1 not-a-bug, …
zackpollard Jun 19, 2026
dfd3014
docs(geocoder): postcode investigation — rural gap root-caused, build…
zackpollard Jun 21, 2026
93611b3
fix(geocoder-server): canonicalize US ZIP+4 to 5-digit base on output
zackpollard Jun 21, 2026
002c5e4
docs(geocoder): record US ZIP+4 shipped server-side; builder approach…
zackpollard Jun 21, 2026
49ad4d3
refactor(geocoder-build): use FNV1A_* named constants in cell_index p…
zackpollard Jun 21, 2026
c82c706
refactor(geocoder-build): extract 4 self-contained main() phases to f…
zackpollard Jun 22, 2026
687565b
refactor(geocoder-build): hoist parallel_sort_and_build to file scope
zackpollard Jun 22, 2026
d54969c
refactor(geocoder-build): extract place-node containment + find_linke…
zackpollard Jun 22, 2026
c9fc761
refactor(geocoder-build): extract 3 POI parent-precompute phases
zackpollard Jun 22, 2026
5c1393c
docs(geocoder): record main() decomposition progress (9 phases, -25%)
zackpollard Jun 22, 2026
338dbc5
refactor(geocoder-build): extract the S2/POI cell-computation section…
zackpollard Jun 22, 2026
b48e82e
refactor(geocoder-build): sub-extract S2-ways-interp + POI-s2-cells p…
zackpollard Jun 22, 2026
3e2325a
docs(geocoder): record completed S2-section restructure (main() -29%)
zackpollard Jun 22, 2026
daf75c9
refactor(geocoder-build): extract write/rebuild/det-ordering from main()
zackpollard Jun 24, 2026
08ce490
refactor(geocoder-server): extract resolve_admin + collect_landmark f…
zackpollard Jun 24, 2026
7f07857
refactor(geocoder-build): dedup apply_strategy2 finalize into a helper
zackpollard Jun 24, 2026
4b996a7
refactor(geocoder-server): remove dead non-fb lookup twins + unused i…
zackpollard Jun 24, 2026
c78e479
refactor(geocoder-build): remove dead code + add cell-overflow detection
zackpollard Jun 24, 2026
5b1e016
fix(geocoder-server): guard query_geo street files instead of unwrap
zackpollard Jun 25, 2026
f0ee997
refactor(geocoder-build): dedup ring canonicalization into a helper
zackpollard Jun 25, 2026
cdda56d
refactor(geocoder-build): dedup PBF string-table extraction
zackpollard Jun 25, 2026
c2c90e2
chore(geocoder-ui): stop tracking generated configurations.json
zackpollard Jul 6, 2026
f19fe46
fix(geocoder-build): fail the build on cell entry-count overflow
zackpollard Jul 6, 2026
6d0d061
refactor(geocoder-build): dedup poi_parent sweeps into shared helpers
zackpollard Jul 6, 2026
a6fb415
fix(geocoder-server): reject half-present index file groups at load
zackpollard Jul 6, 2026
535d254
fix(geocoder-server): route postcode through the actual primary winner
zackpollard Jul 6, 2026
bf62004
feat(geocoder): tiger per-segment zip postcodes (rural-us fix)
zackpollard Jul 6, 2026
f8ec4e4
docs(geocoder): record shipped b-1/b-2/b-4/tiger fixes; mark determin…
zackpollard Jul 6, 2026
dc072db
fix(geocoder-build): review batch — races, hardening, dead code
zackpollard Jul 6, 2026
acf2677
fix(geocoder-build): wikidata sitelink parse, ring backtrack leak, co…
zackpollard Jul 6, 2026
bca3df4
fix(ci): geocoder pipeline guards from the PR-branch review
zackpollard Jul 6, 2026
48da3a8
fix(geocoder-server): review batch — downloads, panics, bounds, limits
zackpollard Jul 6, 2026
50820ca
test(geocoder-build): REQUIRE macro, parity lock-ins, doc corrections
zackpollard Jul 6, 2026
60ee343
docs(geocoder): record the full pr-branch review round
zackpollard Jul 6, 2026
967dd9b
fix(geocoder-server): honor interior cell flags only for the query's …
zackpollard Jul 8, 2026
d56ff4a
fix(geocoder-build): deterministic geonames country codes for postcod…
zackpollard Jul 8, 2026
e518d80
fix(geocoder-build): match nominatim place linking and hide linked nodes
zackpollard Jul 8, 2026
556fcc4
fix(geocoder-server): nominatim parity for maritime, region and place…
zackpollard Jul 8, 2026
96bd524
chore(geocoder-server): add pc_debug postcode debugging example
zackpollard Jul 8, 2026
d109013
fix(geocoder-diff): guard merge re-anchoring against duplicate-conten…
zackpollard Jul 10, 2026
1076497
feat(geocoder-server): constrained-memory readiness for immich embedding
zackpollard Jul 10, 2026
6cf78cf
docs(geocoder): memory footprint guidance + container healthcheck
zackpollard Jul 10, 2026
2b3931f
feat(geocoder-server): GEOCODER_ALLOW_ANONYMOUS for private-network s…
zackpollard Jul 10, 2026
729a6a8
docs(geocoder): immich integration plan
zackpollard Jul 10, 2026
5321add
docs(geocoder): rework immich plan around in-process embedding
zackpollard Jul 10, 2026
f7fc6d2
docs(geocoder): fix stale sidecar wording in plan intro
zackpollard Jul 10, 2026
0331125
feat(geocoder-node): napi-rs binding prototype for in-process immich …
zackpollard Jul 10, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
574 changes: 574 additions & 0 deletions .github/workflows/geocoder-build.yml

Large diffs are not rendered by default.

194 changes: 194 additions & 0 deletions .github/workflows/geocoder-profile.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,194 @@
name: Profile Patch Pipeline

concurrency:
group: geocoder-profile
cancel-in-progress: true

on:
push:
paths:
- '.github/workflows/geocoder-profile.yml'
workflow_dispatch:

env:
S3_BUCKET: geoshenanigans-reverse-geocoding
S3_ENDPOINT: https://t3.storage.dev

permissions:
contents: read

jobs:
profile:
runs-on: pokedex-giant
timeout-minutes: 120
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

Check warning

Code scanning / zizmor

action's hash pin has mismatched or missing version comment: points to commit df4cb1c069e1 Warning

action's hash pin has mismatched or missing version comment: points to commit df4cb1c069e1
with:
persist-credentials: false

- name: Install tools
run: |
sudo apt-get update -qq
sudo apt-get install -y -qq cmake g++ libz-dev libzstd-dev \
libbz2-dev libexpat1-dev libosmium2-dev jq time
curl -sL "https://github.com/peak/s5cmd/releases/download/v2.3.0/s5cmd_2.3.0_Linux-64bit.tar.gz" \
-o /tmp/s5cmd.tar.gz
sudo tar xzf /tmp/s5cmd.tar.gz -C /usr/local/bin s5cmd

- name: Configure credentials
run: |
echo "::add-mask::$AWS_ACCESS_KEY_ID"
echo "::add-mask::$AWS_SECRET_ACCESS_KEY"
echo "CACHE_AWS_KEY=$AWS_ACCESS_KEY_ID" >> "$GITHUB_ENV"
echo "CACHE_AWS_SECRET=$AWS_SECRET_ACCESS_KEY" >> "$GITHUB_ENV"
echo "AWS_ACCESS_KEY_ID=$KEY" >> "$GITHUB_ENV"
echo "AWS_SECRET_ACCESS_KEY=$SECRET" >> "$GITHUB_ENV"
env:
KEY: ${{ secrets.TIGRIS_WRITE_KEY_ID }}
Comment thread Fixed
SECRET: ${{ secrets.TIGRIS_WRITE_ACCESS_KEY }}
Comment thread Fixed

- name: Build tools
run: |
cd geocoder/builder && mkdir -p build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc) geocoder-diff geocoder-patch
echo "$PWD" >> "$GITHUB_PATH"

- name: Download two builds from Tigris
run: |
S5="s5cmd --endpoint-url $S3_ENDPOINT"
echo "Downloading 2026-04-04 build..."
START=$(date +%s)
$S5 cp "s3://$S3_BUCKET/geocoder/builds/2026-04-04/*" /tmp/build-old/
echo "Old: $(find /tmp/build-old -type f | wc -l) files in $(($(date +%s)-START))s"

echo "Downloading 2026-04-05 build..."
START=$(date +%s)
$S5 cp "s3://$S3_BUCKET/geocoder/builds/2026-04-05/*" /tmp/build-new/
echo "New: $(find /tmp/build-new -type f | wc -l) files in $(($(date +%s)-START))s"

- name: Profile each variant
run: |
OLD="/tmp/build-old"
NEW="/tmp/build-new"
WORKDIR="/tmp/profile"
mkdir -p "$WORKDIR"

echo "CPUs: $(nproc)"
echo "Memory: $(free -h | awk '/Mem:/{print $2}')"
echo "Cgroup mem: $(cat /sys/fs/cgroup/memory.max 2>/dev/null | numfmt --to=iec 2>/dev/null || echo unknown)"
echo ""

VARIANTS=$(cd "$NEW" && find . -name "*.bin" -exec dirname {} \; | sort -u | sed 's|^\./||')

# Header
echo "## Patch Profile Results" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"
echo "| Variant | Files | Diff (s) | Diff Mem (MB) | Patch Size (KB) | Patch (s) | Patch Mem (MB) | Verify (s) | Total (s) |" >> "$GITHUB_STEP_SUMMARY"
echo "|---------|-------|----------|---------------|-----------------|-----------|----------------|------------|-----------|" >> "$GITHUB_STEP_SUMMARY"

for variant in $VARIANTS; do
N_NEW=$(ls "$NEW/$variant/"*.bin 2>/dev/null | wc -l)
N_OLD=$(ls "$OLD/$variant/"*.bin 2>/dev/null | wc -l)
[ "$N_NEW" -lt 2 ] && continue
[ "$N_OLD" -ne "$N_NEW" ] && continue

SAFE=$(echo "$variant" | tr '/' '_')
PATCH="$WORKDIR/${SAFE}.gcpatch"
VERIFY="$WORKDIR/verify-${SAFE}"
mkdir -p "$VERIFY"

TOTAL_START=$(date +%s%N)

# Diff
DIFF_START=$(date +%s%N)
/usr/bin/time -v geocoder-diff "$OLD/$variant/" "$NEW/$variant/" -o "$PATCH" 2>"$WORKDIR/t-diff" >/dev/null
DIFF_END=$(date +%s%N)
DIFF_S=$(echo "scale=1; ($DIFF_END - $DIFF_START) / 1000000000" | bc)
DIFF_MEM=$(grep "Maximum resident" "$WORKDIR/t-diff" | awk '{print int($NF/1024)}')
PATCH_KB=$(( $(stat -c%s "$PATCH" 2>/dev/null || echo 0) / 1024 ))

# Patch
PATCH_START=$(date +%s%N)
/usr/bin/time -v geocoder-patch "$OLD/$variant/" "$PATCH" -o "$VERIFY/" 2>"$WORKDIR/t-patch" >/dev/null
PATCH_END=$(date +%s%N)
PATCH_S=$(echo "scale=1; ($PATCH_END - $PATCH_START) / 1000000000" | bc)
PATCH_MEM=$(grep "Maximum resident" "$WORKDIR/t-patch" | awk '{print int($NF/1024)}')

# Verify
VERIFY_START=$(date +%s%N)
MATCH=0
for f in "$NEW/$variant/"*.bin; do
b=$(basename "$f")
cmp -s "$VERIFY/$b" "$NEW/$variant/$b" && MATCH=$((MATCH + 1))
done
VERIFY_END=$(date +%s%N)
VERIFY_S=$(echo "scale=1; ($VERIFY_END - $VERIFY_START) / 1000000000" | bc)

TOTAL_END=$(date +%s%N)
TOTAL_S=$(echo "scale=1; ($TOTAL_END - $TOTAL_START) / 1000000000" | bc)

STATUS="✓"
[ "$MATCH" -ne "$N_NEW" ] && STATUS="✗"

echo "$variant: diff=${DIFF_S}s(${DIFF_MEM}MB) patch=${PATCH_S}s(${PATCH_MEM}MB) verify=${VERIFY_S}s total=${TOTAL_S}s ${STATUS}"
echo "| $variant | $N_NEW | $DIFF_S | $DIFF_MEM | $PATCH_KB | $PATCH_S | $PATCH_MEM | $VERIFY_S | $TOTAL_S |" >> "$GITHUB_STEP_SUMMARY"

rm -f "$PATCH"
rm -rf "$VERIFY"
done

echo "" >> "$GITHUB_STEP_SUMMARY"

- name: Profile parallel runs
run: |
OLD="/tmp/build-old"
NEW="/tmp/build-new"
WORKDIR="/tmp/profile-parallel"

VARIANTS=$(cd "$NEW" && find . -name "*.bin" -exec dirname {} \; | sort -u | sed 's|^\./||')

echo "## Parallel Profile" >> "$GITHUB_STEP_SUMMARY"
echo "" >> "$GITHUB_STEP_SUMMARY"

for PARALLEL in 1 4 8 16 32 64; do
rm -rf "$WORKDIR" && mkdir -p "$WORKDIR"
echo "Testing $PARALLEL parallel jobs..."
START=$(date +%s)
PEAK_MEM=0
JOBS=0

for variant in $VARIANTS; do
N_NEW=$(ls "$NEW/$variant/"*.bin 2>/dev/null | wc -l)
N_OLD=$(ls "$OLD/$variant/"*.bin 2>/dev/null | wc -l)
[ "$N_NEW" -lt 2 ] && continue
[ "$N_OLD" -ne "$N_NEW" ] && continue

(
SAFE=$(echo "$variant" | tr '/' '_')
PATCH="$WORKDIR/${SAFE}.gcpatch"
VERIFY="$WORKDIR/verify-${SAFE}"
mkdir -p "$VERIFY"
geocoder-diff "$OLD/$variant/" "$NEW/$variant/" -o "$PATCH" 2>/dev/null
geocoder-patch "$OLD/$variant/" "$PATCH" -o "$VERIFY/" 2>/dev/null
MATCH=0
for f in "$NEW/$variant/"*.bin; do
b=$(basename "$f")
cmp -s "$VERIFY/$b" "$NEW/$variant/$b" && MATCH=$((MATCH + 1))
done
rm -f "$PATCH"
rm -rf "$VERIFY"
) &

JOBS=$((JOBS + 1))
if [ $JOBS -ge $PARALLEL ]; then
wait -n 2>/dev/null || true
JOBS=$((JOBS - 1))
fi
done
wait
END=$(date +%s)
ELAPSED=$((END - START))
echo " parallel=$PARALLEL: ${ELAPSED}s"
echo "| $PARALLEL parallel | ${ELAPSED}s |" >> "$GITHUB_STEP_SUMMARY"
done
6 changes: 6 additions & 0 deletions geocoder/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
build/
target/
server/target/
test-output/
*.osm.pbf
.git/
4 changes: 4 additions & 0 deletions geocoder/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
build/
target/
test-output/
*.osm.pbf
42 changes: 42 additions & 0 deletions geocoder/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
# Stage 1: Build C++ indexer
FROM debian:bookworm-slim AS builder-cpp

RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential cmake \
libosmium2-dev libprotozero-dev \
libs2-dev \
zlib1g-dev libbz2-dev libexpat1-dev liblz4-dev \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY builder/ builder/
RUN mkdir build && cd build && cmake ../builder && make -j$(nproc)

# Stage 2: Build Rust server
FROM rust:bookworm AS builder-rust

RUN apt-get update && apt-get install -y --no-install-recommends \
cmake \
&& rm -rf /var/lib/apt/lists/*

WORKDIR /src
COPY server/ server/
RUN cargo build --release --manifest-path server/Cargo.toml

# Stage 3: Runtime
FROM debian:bookworm-slim

RUN apt-get update && apt-get install -y --no-install-recommends \
libs2-0 \
zlib1g libbz2-1.0 libexpat1 liblz4-1 \
curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*

COPY --from=builder-cpp /src/build/build-index /usr/local/bin/
COPY --from=builder-rust /src/server/target/release/query-server /usr/local/bin/
COPY entrypoint.sh /usr/local/bin/

RUN chmod +x /usr/local/bin/entrypoint.sh

ENTRYPOINT ["entrypoint.sh"]
CMD ["auto"]
Loading
Loading