{"_id":"@bradleyhodges/addresskit","_rev":"5-3c539cef0cfd103dabb2e2f6ed69c563","name":"@bradleyhodges/addresskit","dist-tags":{"latest":"3.0.1"},"versions":{"2.2.3":{"name":"@bradleyhodges/addresskit","version":"2.2.3","keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"license":"GPL-2.0-only","_id":"@bradleyhodges/addresskit@2.2.3","maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"homepage":"https://github.com/bradleyhodges/addresskit#readme","bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"bin":{"addresskit":"dist/cli.js"},"dist":{"shasum":"021faeea6d05c01aa831af1bd64ab8ee726ad1d9","tarball":"https://registry.npmjs.org/@bradleyhodges/addresskit/-/addresskit-2.2.3.tgz","fileCount":8,"integrity":"sha512-1d5bVn4lkM+j0ARPEKxsH+dEbtJaUF30N5lP39DP2iJHe2HHpakF6SU41C5pTdnefZOqreloel9DFd8loiZxWA==","signatures":[{"sig":"MEUCIHYwUnFHu8pMsdLSrhOP8E+Tyl6xTc492bHTL1Xq0p9eAiEA/gD97+SsvEVJzHkgv3cfe+MQQDLAUJThx9KbODz3TEQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2946966},"config":{"SEARCH_IMAGE":"opensearchproject/opensearch:1.3.20"},"engines":{"node":">=24.0.0"},"gitHead":"3e1918329a4c70be77b38f3a018c9a8edbee2866","scripts":{"dev":"turbo run dev --parallel --filter=!@bradleyhodges/addresskit","build":"pnpm format && pnpm run genversion && turbo run build && pnpm run bundle && pnpm run bundle:copy-assets","clean":"git clean -xdf node_modules","smoke":"node tooling/smoke/smoke.mjs","bundle":"esbuild apps/server/cli/index.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js --packages=bundle","format":"biome check . --write --skip-errors","prepack":"npm run build","publish":"npm pack && npm publish --access public","dopublish":"npm publish bradleyhodges-addresskit-${npm_package_version}.tgz --access public","npm-check":"npm-check  --skip-unused","postbuild":"echo \"postbuild skipped\"","typecheck":"turbo run typecheck","genversion":"genversion -p ./ --es6 --double ./packages/core/version.ts","pre-commit":"lint-staged && npm run check-licenses","docker:push":"docker push \"@bradleyhodges/addresskit:${npm_package_version}\"","postinstall":"npm run requirements-check","build:docker":"docker build --build-arg PACKAGE_TGZ=addresskit-${npm_package_version}.tgz --build-arg PACKAGE=${npm_package_name} --build-arg VERSION=${npm_package_version} --build-arg MAINTAINER=${npm_package_author_email} -t @bradleyhodges/addresskit:${npm_package_version}  -t @bradleyhodges/addresskit:latest .","check-licenses":"license-checker --production --onlyAllow 'MIT;Apache-2.0;ISC;Custom: http://github.com/substack/node-bufferlist;Unlicense;BSD-2-Clause;BSD-3-Clause;WTFPL;0BSD;MIT*' --summary","predocker:push":"echo \"$DOCKER_ID_PASS\" | docker login --username \"$DOCKER_ID_USER\" --password-stdin","postdocker:push":"docker push \"@bradleyhodges/addresskit:latest\"","prebuild:docker":"npm pack && cp .dockerignore.tmpl .dockerignore && echo \"!addresskit-${npm_package_version}.tgz\" >> .dockerignore","npm-check-unused":"npm-check","pull:open-search":"docker pull ${npm_package_config_SEARCH_IMAGE}","start:open-search":"docker run -p 9200:9200 -p 9300:9300 -e \"ES_JAVA_OPTS=-Xms1g -Xmx1g\" -e \"discovery.type=single-node\" -e \"plugins.security.disabled=true\" \"${npm_package_config_SEARCH_IMAGE}\"","bundle:copy-assets":"node -e \"const fs=require('fs');fs.mkdirSync('api',{recursive:true});fs.copyFileSync('apps/server/api/swagger.yaml','api/swagger.yaml');fs.copyFileSync('apps/server/api/swagger-2.yaml','api/swagger-2.yaml');\"","requirements-check":"node tooling/scripts/check-version.js","npm-check:interactive":"npm-check --skip-unused -u "},"_npmUser":{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"},"repository":{"url":"git+https://github.com/bradleyhodges/addresskit.git","type":"git"},"_npmVersion":"11.6.2","description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","directories":{},"_nodeVersion":"25.2.1","dependencies":{"debug":"^4.4.3","semver":"^7.7.3","unzip-stream":"^0.3.4","swagger-tools":"^0.10.4","@changesets/cli":"^2.29.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.22.0","devDependencies":{"nyc":"^15.1.0","turbo":"^2.7.2","eslint":"^7.32.0","nodemon":"^2.0.22","prettier":"^2.8.8","npm-check":"^5.9.2","genversion":"^3.2.0","typescript":"^5.9.3","@babel/core":"^7.28.5","@babel/node":"^7.28.0","@types/node":"^25.0.3","lint-staged":"^11.2.6","npm-run-all":"^4.1.5","babel-eslint":"^10.1.0","@biomejs/biome":"1.9.4","license-checker":"^25.0.1","babel-preset-env":"^1.7.0","eslint-plugin-node":"^11.1.0","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","babel-plugin-istanbul":"^6.1.1","eslint-plugin-promise":"^5.2.0","eslint-plugin-unicorn":"^34.0.1","@biomejs/cli-win32-x64":"1.9.4","eslint-config-prettier":"^8.10.2","eslint-plugin-prettier":"^3.4.1","eslint-plugin-security":"^1.7.1","eslint-plugin-chai-friendly":"^0.7.4","eslint-plugin-eslint-comments":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/addresskit_2.2.3_1767356990691_0.5080029651613873","host":"s3://npm-registry-packages-npm-production"}},"2.4.3":{"name":"@bradleyhodges/addresskit","version":"2.4.3","keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"license":"GPL-2.0-only","_id":"@bradleyhodges/addresskit@2.4.3","maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"homepage":"https://github.com/bradleyhodges/addresskit#readme","bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"bin":{"addresskit":"dist/cli.js"},"dist":{"shasum":"9ce636b8e15b6be8401f666b3766eb02232ea0d9","tarball":"https://registry.npmjs.org/@bradleyhodges/addresskit/-/addresskit-2.4.3.tgz","fileCount":8,"integrity":"sha512-lhbMAQf1iHPfde0tu7/eilBfxAXaUG9JwrhzM22ryvAAWWqVHIHk/Bhi6OMoDXlKFNTXINk2zG+xGFS4dmX5bQ==","signatures":[{"sig":"MEUCIQCuxbMiV8/X80mXFIlgMLlygvAOFtdzNEiPda+7/ojo+AIgeIm54hqZHap7ubR0M9s0el9JOqxPddJAOVWDgeRuD6o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2923048},"config":{"SEARCH_IMAGE":"opensearchproject/opensearch:1.3.20"},"engines":{"node":">=24.0.0"},"gitHead":"900c6d87168accc1f8246b576f01b5f0f5d7d518","scripts":{"dev":"turbo run dev --parallel","build":"pnpm format && pnpm run genversion && turbo run build && pnpm run bundle && pnpm run bundle:copy-assets","clean":"git clean -xdf node_modules","smoke":"node tooling/smoke/smoke.mjs","bundle":"esbuild apps/server/cli/index.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js --packages=bundle","format":"biome check . --write --skip-errors","prepack":"npm run build","release":"git tag v%npm_package_version% && git push origin master --tags","dopublish":"npm publish bradleyhodges-addresskit-%npm_package_version%.tgz --access public","npm-check":"npm-check  --skip-unused","postbuild":"echo \"postbuild skipped\"","typecheck":"turbo run typecheck","dev:docker":"docker compose -f infra/docker/compose.dev.yml up -d","genversion":"genversion -p ./ --es6 --double ./packages/core/version.ts","docker:push":"docker push bradleyhodges/addresskit:%npm_package_version% && docker push bradleyhodges/addresskit:latest","publish:all":"pnpm run publish:npm && pnpm run publish:github","publish:npm":"npm publish --access public --registry=https://registry.npmjs.org","release:all":"node tooling/scripts/release.js","build:docker":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t bradleyhodges/addresskit:%npm_package_version% -t bradleyhodges/addresskit:latest .","predocker:push":"echo %DOCKER_ID_PASS% | docker login --username %DOCKER_ID_USER% --password-stdin","publish:github":"npm publish --access public --registry=https://npm.pkg.github.com","dev:docker:down":"docker compose -f infra/docker/compose.dev.yml down --volumes --remove-orphans --rmi all","dev:docker:load":"docker compose -f infra/docker/compose.dev.yml run --rm loader","prebuild:docker":"npm pack","docker:push:ghcr":"docker push ghcr.io/bradleyhodges/addresskit:%npm_package_version% && docker push ghcr.io/bradleyhodges/addresskit:latest","npm-check-unused":"npm-check","pull:open-search":"docker pull ${npm_package_config_SEARCH_IMAGE}","build:docker:ghcr":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:latest .","start:open-search":"docker run -p 9200:9200 -p 9300:9300 -e \"ES_JAVA_OPTS=-Xms1g -Xmx1g\" -e \"discovery.type=single-node\" -e \"plugins.security.disabled=true\" \"${npm_package_config_SEARCH_IMAGE}\"","bundle:copy-assets":"node -e \"const fs=require('fs');fs.mkdirSync('api',{recursive:true});fs.copyFileSync('apps/server/api/swagger.yaml','api/swagger.yaml');fs.copyFileSync('apps/server/api/swagger-2.yaml','api/swagger-2.yaml');\"","requirements-check":"node tooling/scripts/check-version.js","npm-check:interactive":"npm-check --skip-unused -u "},"_npmUser":{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"},"repository":{"url":"git+https://github.com/bradleyhodges/addresskit.git","type":"git"},"_npmVersion":"11.6.2","description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","directories":{},"_nodeVersion":"25.2.1","dependencies":{"debug":"^4.4.3","semver":"^7.7.3","unzip-stream":"^0.3.4","swagger-tools":"^0.10.4","@changesets/cli":"^2.29.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.22.0","devDependencies":{"nyc":"^15.1.0","turbo":"^2.7.2","eslint":"^7.32.0","nodemon":"^2.0.22","prettier":"^2.8.8","npm-check":"^5.9.2","genversion":"^3.2.0","typescript":"^5.9.3","@babel/core":"^7.28.5","@babel/node":"^7.28.0","@types/node":"^25.0.3","lint-staged":"^11.2.6","npm-run-all":"^4.1.5","babel-eslint":"^10.1.0","@biomejs/biome":"1.9.4","license-checker":"^25.0.1","babel-preset-env":"^1.7.0","eslint-plugin-node":"^11.1.0","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","babel-plugin-istanbul":"^6.1.1","eslint-plugin-promise":"^5.2.0","eslint-plugin-unicorn":"^34.0.1","@biomejs/cli-win32-x64":"1.9.4","eslint-config-prettier":"^8.10.2","eslint-plugin-prettier":"^3.4.1","eslint-plugin-security":"^1.7.1","eslint-plugin-chai-friendly":"^0.7.4","eslint-plugin-eslint-comments":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/addresskit_2.4.3_1767591700522_0.18740989769265215","host":"s3://npm-registry-packages-npm-production"}},"2.4.4":{"name":"@bradleyhodges/addresskit","version":"2.4.4","keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"license":"GPL-2.0-only","_id":"@bradleyhodges/addresskit@2.4.4","maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"homepage":"https://github.com/bradleyhodges/addresskit#readme","bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"bin":{"addresskit":"dist/cli.js"},"dist":{"shasum":"98dda82413f5bfd383524d4ac3febdd408891132","tarball":"https://registry.npmjs.org/@bradleyhodges/addresskit/-/addresskit-2.4.4.tgz","fileCount":8,"integrity":"sha512-MpHoeAPJuQAje5iEep+cpBBSqXfQ+MZwJyPIErz9pdStzyqChf9jYS/Db4e2OGXgorKOKLmnEhbFciKGzbwD0Q==","signatures":[{"sig":"MEUCIQCqJ9PB0PNBTlekQD6Sdrg2STXF3p2ahb/MWdvga3e2cAIgHOP1bmi7o9hWdgdMuBRhC0JWVCS24+nVaz3cyjYmbsI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2927062},"_from":"file:bradleyhodges-addresskit-2.4.4.tgz","config":{"SEARCH_IMAGE":"opensearchproject/opensearch:1.3.20"},"engines":{"node":">=24.0.0"},"scripts":{"dev":"turbo run dev --parallel","build":"pnpm format && pnpm run genversion && turbo run build && pnpm run bundle && pnpm run bundle:copy-assets","clean":"git clean -xdf node_modules","smoke":"node tooling/smoke/smoke.mjs","bundle":"esbuild apps/server/cli/index.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js --packages=bundle","format":"biome check . --write --skip-errors","prepack":"npm run build","release":"git tag v%npm_package_version% && git push origin master --tags","dopublish":"npm publish bradleyhodges-addresskit-%npm_package_version%.tgz --access public","npm-check":"npm-check  --skip-unused","postbuild":"echo \"postbuild skipped\"","typecheck":"turbo run typecheck","dev:docker":"docker compose -f infra/docker/compose.dev.yml up -d","genversion":"genversion -p ./ --es6 --double ./packages/core/version.ts","docker:push":"docker push bradleyhodges/addresskit:%npm_package_version% && docker push bradleyhodges/addresskit:latest","publish:all":"pnpm run publish:npm && pnpm run publish:github","publish:npm":"npm publish --access public --registry=https://registry.npmjs.org","release:all":"node tooling/scripts/release.js","build:docker":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t bradleyhodges/addresskit:%npm_package_version% -t bradleyhodges/addresskit:latest .","predocker:push":"echo %DOCKER_ID_PASS% | docker login --username %DOCKER_ID_USER% --password-stdin","publish:github":"npm publish --access public --registry=https://npm.pkg.github.com","dev:docker:down":"docker compose -f infra/docker/compose.dev.yml down --volumes --remove-orphans --rmi all","dev:docker:load":"docker compose -f infra/docker/compose.dev.yml run --rm loader","prebuild:docker":"npm pack","docker:push:ghcr":"docker push ghcr.io/bradleyhodges/addresskit:%npm_package_version% && docker push ghcr.io/bradleyhodges/addresskit:latest","npm-check-unused":"npm-check","pull:open-search":"docker pull ${npm_package_config_SEARCH_IMAGE}","build:docker:ghcr":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:latest .","start:open-search":"docker run -p 9200:9200 -p 9300:9300 -e \"ES_JAVA_OPTS=-Xms1g -Xmx1g\" -e \"discovery.type=single-node\" -e \"plugins.security.disabled=true\" \"${npm_package_config_SEARCH_IMAGE}\"","bundle:copy-assets":"node -e \"const fs=require('fs');fs.mkdirSync('api',{recursive:true});fs.copyFileSync('apps/server/api/swagger.yaml','api/swagger.yaml');fs.copyFileSync('apps/server/api/swagger-2.yaml','api/swagger-2.yaml');\"","requirements-check":"node tooling/scripts/check-version.js","npm-check:interactive":"npm-check --skip-unused -u "},"_npmUser":{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"},"_resolved":"C:\\Users\\bradl\\Projects\\addressr\\bradleyhodges-addresskit-2.4.4.tgz","_integrity":"sha512-MpHoeAPJuQAje5iEep+cpBBSqXfQ+MZwJyPIErz9pdStzyqChf9jYS/Db4e2OGXgorKOKLmnEhbFciKGzbwD0Q==","repository":{"url":"git+https://github.com/bradleyhodges/addresskit.git","type":"git"},"_npmVersion":"11.6.2","description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","directories":{},"_nodeVersion":"25.2.1","dependencies":{"debug":"^4.4.3","semver":"^7.7.3","unzip-stream":"^0.3.4","swagger-tools":"^0.10.4","@changesets/cli":"^2.29.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.22.0","devDependencies":{"nyc":"^15.1.0","turbo":"^2.7.2","eslint":"^7.32.0","nodemon":"^2.0.22","prettier":"^2.8.8","npm-check":"^5.9.2","genversion":"^3.2.0","typescript":"^5.9.3","@babel/core":"^7.28.5","@babel/node":"^7.28.0","@types/node":"^25.0.3","lint-staged":"^11.2.6","npm-run-all":"^4.1.5","babel-eslint":"^10.1.0","@biomejs/biome":"1.9.4","license-checker":"^25.0.1","babel-preset-env":"^1.7.0","eslint-plugin-node":"^11.1.0","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","babel-plugin-istanbul":"^6.1.1","eslint-plugin-promise":"^5.2.0","eslint-plugin-unicorn":"^34.0.1","@biomejs/cli-win32-x64":"1.9.4","eslint-config-prettier":"^8.10.2","eslint-plugin-prettier":"^3.4.1","eslint-plugin-security":"^1.7.1","eslint-plugin-chai-friendly":"^0.7.4","eslint-plugin-eslint-comments":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/addresskit_2.4.4_1767592859859_0.1554161514180581","host":"s3://npm-registry-packages-npm-production"}},"3.0.0":{"name":"@bradleyhodges/addresskit","version":"3.0.0","keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"license":"GPL-2.0-only","_id":"@bradleyhodges/addresskit@3.0.0","maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"homepage":"https://github.com/bradleyhodges/addresskit#readme","bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"bin":{"addresskit":"dist/cli.js"},"dist":{"shasum":"47c95756d36247681dbe57f13717eb7f4ae49e64","tarball":"https://registry.npmjs.org/@bradleyhodges/addresskit/-/addresskit-3.0.0.tgz","fileCount":8,"integrity":"sha512-OCf4l9IIvz99cMIvrAxwSJuQCdb27r3bpUKFanLGfKfGXwPCPpEtxlLuMxOXQUUjUUAZOPn+v6ve+ZJoY4HWNw==","signatures":[{"sig":"MEYCIQCz4AJ3GS2h9q3Hhj91pvOzUMPtpyrqVtEYgleTdOOaOwIhAO1DGXCb50ta2R5qDzG+Tq42dWRU9a0fz6ih8w/dzYh/","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2939443},"_from":"file:bradleyhodges-addresskit-3.0.0.tgz","config":{"SEARCH_IMAGE":"opensearchproject/opensearch:1.3.20"},"engines":{"node":">=24.0.0"},"scripts":{"dev":"turbo run dev --parallel","build":"pnpm format && pnpm run genversion && turbo run build && pnpm run bundle && pnpm run bundle:copy-assets","clean":"git clean -xdf node_modules","smoke":"node tooling/smoke/smoke.mjs","bundle":"esbuild apps/server/cli/index.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js --packages=bundle","format":"biome check . --write --skip-errors","prepack":"npm run build","release":"git tag v%npm_package_version% && git push origin master --tags","dopublish":"npm publish bradleyhodges-addresskit-%npm_package_version%.tgz --access public","npm-check":"npm-check  --skip-unused","postbuild":"echo \"postbuild skipped\"","typecheck":"turbo run typecheck","dev:docker":"pnpm run build:docker && docker compose -f infra/docker/compose.dev.yml up -d","genversion":"genversion -p ./ --es6 --double ./packages/core/version.ts","docker:push":"docker push bradleyhodges/addresskit:%npm_package_version% && docker push bradleyhodges/addresskit:latest","publish:all":"pnpm run publish:npm && pnpm run publish:github","publish:npm":"npm publish --access public --registry=https://registry.npmjs.org","release:all":"node tooling/scripts/release.js","build:docker":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t bradleyhodges/addresskit:%npm_package_version% -t bradleyhodges/addresskit:latest .","predocker:push":"echo %DOCKER_ID_PASS% | docker login --username %DOCKER_ID_USER% --password-stdin","publish:github":"npm publish --access public --registry=https://npm.pkg.github.com","dev:docker:down":"docker compose -f infra/docker/compose.dev.yml down --volumes --remove-orphans --rmi all","dev:docker:load":"docker compose -f infra/docker/compose.dev.yml run --rm loader","prebuild:docker":"npm pack","docker:push:ghcr":"docker push ghcr.io/bradleyhodges/addresskit:%npm_package_version% && docker push ghcr.io/bradleyhodges/addresskit:latest","npm-check-unused":"npm-check","pull:open-search":"docker pull ${npm_package_config_SEARCH_IMAGE}","build:docker:ghcr":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:latest .","start:open-search":"docker run -p 9200:9200 -p 9300:9300 -e \"ES_JAVA_OPTS=-Xms1g -Xmx1g\" -e \"discovery.type=single-node\" -e \"plugins.security.disabled=true\" \"${npm_package_config_SEARCH_IMAGE}\"","bundle:copy-assets":"node -e \"const fs=require('fs');fs.mkdirSync('api',{recursive:true});fs.copyFileSync('apps/server/api/swagger.yaml','api/swagger.yaml');fs.copyFileSync('apps/server/api/swagger-2.yaml','api/swagger-2.yaml');\"","requirements-check":"node tooling/scripts/check-version.js","npm-check:interactive":"npm-check --skip-unused -u "},"_npmUser":{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"},"_resolved":"C:\\Users\\bradl\\Projects\\addressr\\bradleyhodges-addresskit-3.0.0.tgz","_integrity":"sha512-OCf4l9IIvz99cMIvrAxwSJuQCdb27r3bpUKFanLGfKfGXwPCPpEtxlLuMxOXQUUjUUAZOPn+v6ve+ZJoY4HWNw==","repository":{"url":"git+https://github.com/bradleyhodges/addresskit.git","type":"git"},"_npmVersion":"11.6.2","description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","directories":{},"_nodeVersion":"25.2.1","dependencies":{"debug":"^4.4.3","semver":"^7.7.3","unzip-stream":"^0.3.4","swagger-tools":"^0.10.4","@changesets/cli":"^2.29.8"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"packageManager":"pnpm@10.22.0","devDependencies":{"nyc":"^15.1.0","turbo":"^2.7.2","eslint":"^7.32.0","esbuild":"^0.27.2","nodemon":"^2.0.22","prettier":"^2.8.8","npm-check":"^5.9.2","genversion":"^3.2.0","typescript":"^5.9.3","@babel/core":"^7.28.5","@babel/node":"^7.28.0","@types/node":"^25.0.3","lint-staged":"^11.2.6","npm-run-all":"^4.1.5","babel-eslint":"^10.1.0","@biomejs/biome":"1.9.4","license-checker":"^25.0.1","babel-preset-env":"^1.7.0","eslint-plugin-node":"^11.1.0","eslint-plugin-react":"^7.37.5","eslint-plugin-import":"^2.32.0","babel-plugin-istanbul":"^6.1.1","eslint-plugin-promise":"^5.2.0","eslint-plugin-unicorn":"^34.0.1","@biomejs/cli-win32-x64":"1.9.4","eslint-config-prettier":"^8.10.2","eslint-plugin-prettier":"^3.4.1","eslint-plugin-security":"^1.7.1","eslint-plugin-chai-friendly":"^0.7.4","eslint-plugin-eslint-comments":"^3.2.0"},"_npmOperationalInternal":{"tmp":"tmp/addresskit_3.0.0_1767598034289_0.5685333436899482","host":"s3://npm-registry-packages-npm-production"}},"3.0.1":{"name":"@bradleyhodges/addresskit","version":"3.0.1","description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","config":{"SEARCH_IMAGE":"opensearchproject/opensearch:1.3.20"},"bin":{"addresskit":"dist/cli.js"},"scripts":{"typecheck":"turbo run typecheck","build":"pnpm format && pnpm run genversion && turbo run build && pnpm run bundle && pnpm run bundle:copy-assets","build:docker":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t bradleyhodges/addresskit:%npm_package_version% -t bradleyhodges/addresskit:latest .","release:all":"node tooling/scripts/release.js","dev":"turbo run dev --parallel","dev:docker":"pnpm run build:docker && docker compose -f infra/docker/compose.dev.yml up -d","dev:docker:down":"docker compose -f infra/docker/compose.dev.yml down --volumes --remove-orphans --rmi all","dev:docker:load":"docker compose -f infra/docker/compose.dev.yml run --rm loader","bundle":"esbuild apps/server/cli/index.ts --bundle --platform=node --target=node24 --outfile=dist/cli.js --packages=bundle","bundle:copy-assets":"node -e \"const fs=require('fs');fs.mkdirSync('api',{recursive:true});fs.copyFileSync('apps/server/api/swagger.yaml','api/swagger.yaml');fs.copyFileSync('apps/server/api/swagger-2.yaml','api/swagger-2.yaml');\"","release":"git tag v%npm_package_version% && git push origin master --tags","smoke":"node tooling/smoke/smoke.mjs","format":"biome check . --write --skip-errors","clean":"git clean -xdf node_modules","pull:open-search":"docker pull ${npm_package_config_SEARCH_IMAGE}","start:open-search":"docker run -p 9200:9200 -p 9300:9300 -e \"ES_JAVA_OPTS=-Xms1g -Xmx1g\" -e \"discovery.type=single-node\" -e \"plugins.security.disabled=true\" \"${npm_package_config_SEARCH_IMAGE}\"","requirements-check":"node tooling/scripts/check-version.js","npm-check":"npm-check  --skip-unused","npm-check:interactive":"npm-check --skip-unused -u ","npm-check-unused":"npm-check","genversion":"genversion -p ./ --es6 --double ./packages/core/version.ts","publish:npm":"npm publish --access public --registry=https://registry.npmjs.org","publish:github":"npm publish --access public --registry=https://npm.pkg.github.com","publish:all":"pnpm run publish:npm && pnpm run publish:github","prebuild:docker":"npm pack","build:docker:ghcr":"docker build -f infra/docker/Dockerfile --build-arg PACKAGE_TGZ=bradleyhodges-addresskit-%npm_package_version%.tgz --build-arg PACKAGE=%npm_package_name% --build-arg VERSION=%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:%npm_package_version% -t ghcr.io/bradleyhodges/addresskit:latest .","postbuild":"echo \"postbuild skipped\"","prepack":"npm run build","dopublish":"npm publish bradleyhodges-addresskit-%npm_package_version%.tgz --access public","predocker:push":"echo %DOCKER_ID_PASS% | docker login --username %DOCKER_ID_USER% --password-stdin","docker:push":"docker push bradleyhodges/addresskit:%npm_package_version% && docker push bradleyhodges/addresskit:latest","docker:push:ghcr":"docker push ghcr.io/bradleyhodges/addresskit:%npm_package_version% && docker push ghcr.io/bradleyhodges/addresskit:latest"},"keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"packageManager":"pnpm@10.22.0","publishConfig":{"access":"public"},"engines":{"node":">=24.0.0"},"repository":{"type":"git","url":"git+https://github.com/bradleyhodges/addresskit.git"},"bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"license":"GPL-2.0-only","dependencies":{"@changesets/cli":"^2.29.8","debug":"^4.4.3","semver":"^7.7.3","swagger-tools":"^0.10.4","unzip-stream":"^0.3.4"},"devDependencies":{"@babel/core":"^7.28.5","@babel/node":"^7.28.0","@biomejs/biome":"1.9.4","@biomejs/cli-win32-x64":"1.9.4","@types/node":"^25.0.3","babel-eslint":"^10.1.0","babel-plugin-istanbul":"^6.1.1","babel-preset-env":"^1.7.0","esbuild":"^0.27.2","eslint":"^7.32.0","eslint-config-prettier":"^8.10.2","eslint-plugin-chai-friendly":"^0.7.4","eslint-plugin-eslint-comments":"^3.2.0","eslint-plugin-import":"^2.32.0","eslint-plugin-node":"^11.1.0","eslint-plugin-prettier":"^3.4.1","eslint-plugin-promise":"^5.2.0","eslint-plugin-react":"^7.37.5","eslint-plugin-security":"^1.7.1","eslint-plugin-unicorn":"^34.0.1","genversion":"^3.2.0","license-checker":"^25.0.1","lint-staged":"^11.2.6","nodemon":"^2.0.22","npm-check":"^5.9.2","npm-run-all":"^4.1.5","nyc":"^15.1.0","prettier":"^2.8.8","turbo":"^2.7.2","typescript":"^5.9.3"},"_id":"@bradleyhodges/addresskit@3.0.1","homepage":"https://github.com/bradleyhodges/addresskit#readme","_integrity":"sha512-8O8xakvTt88BBj3lPoVgvE2bNQoLqRs8BKHjlVRxIdnHpjisupB12IqHqlku+kVHlOUClLbDsMWD1VYT8UFh8Q==","_resolved":"C:\\Users\\bradl\\Projects\\addressr\\bradleyhodges-addresskit-3.0.1.tgz","_from":"file:bradleyhodges-addresskit-3.0.1.tgz","_nodeVersion":"25.2.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-8O8xakvTt88BBj3lPoVgvE2bNQoLqRs8BKHjlVRxIdnHpjisupB12IqHqlku+kVHlOUClLbDsMWD1VYT8UFh8Q==","shasum":"b8664dd2fb5b2bd3d7204dcff89b88f298d97c90","tarball":"https://registry.npmjs.org/@bradleyhodges/addresskit/-/addresskit-3.0.1.tgz","fileCount":8,"unpackedSize":2943791,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHxFrEJNAcVPuOTFx4S+sndYGjNmQMUXYWJI1hVfo+9NAiEA58fdO6/wa7x6LJX/0H15p7nYzUdhniiy2/UE9b9h1XE="}]},"_npmUser":{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"},"directories":{},"maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/addresskit_3.0.1_1767598844425_0.7870629016199586"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-02T12:29:50.593Z","modified":"2026-01-05T07:40:44.858Z","2.2.3":"2026-01-02T12:29:50.922Z","2.4.3":"2026-01-05T05:41:40.712Z","2.4.4":"2026-01-05T06:01:00.070Z","3.0.0":"2026-01-05T07:27:14.457Z","3.0.1":"2026-01-05T07:40:44.637Z"},"bugs":{"url":"https://github.com/bradleyhodges/addresskit/issues"},"license":"GPL-2.0-only","homepage":"https://github.com/bradleyhodges/addresskit#readme","keywords":["swagger","g-naf","address","australia","validation","autocomplete","autosuggest","street-address","geo","geocoding","Geo::StreetAddress:AU"],"repository":{"type":"git","url":"git+https://github.com/bradleyhodges/addresskit.git"},"description":"Scalable address ingestion, validation, search, and autocomplete engine for Australian addresses","maintainers":[{"name":"bradleyhodges","email":"bradley.hodges@outlook.com"}],"readme":"<img src=\"https://exbluygwdjrpygxgzsdc.supabase.co/storage/v1/object/public/addresskit/AddressKit-Logo.png\" height=\"64\" alt=\"AddressKit\" />\r\n\r\n<br />\r\n\r\n[![GitHub license](https://img.shields.io/github/license/bradleyhodges/addresskit)](https://github.com/bradleyhodges/addresskit/blob/master/LICENSE) [![npm](https://img.shields.io/npm/v/@bradleyhodges/addresskit)](https://www.npmjs.com/package/@bradleyhodges/addresskit) [![npm downloads](https://img.shields.io/npm/dm/@bradleyhodges/addresskit)](https://www.npmjs.com/package/@bradleyhodges/addresskit) [![Docker Image Version (latest by date)](https://img.shields.io/docker/v/bradleyhodges/addresskit?label=image%20version)](https://hub.docker.com/r/bradleyhodges/addresskit) [![Docker Pulls](https://img.shields.io/docker/pulls/bradleyhodges/addresskit)](https://hub.docker.com/r/bradleyhodges/addresskit)\r\n\r\n[![GitHub issues](https://img.shields.io/github/issues/bradleyhodges/addresskit)](https://github.com/bradleyhodges/addresskit/issues) [![GitHub pull requests](https://img.shields.io/github/issues-pr/bradleyhodges/addresskit)](https://github.com/bradleyhodges/addresskit/pulls) [![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/npm/@bradleyhodges/addresskit)](https://libraries.io/npm/@bradleyhodges%2Faddresskit)\r\n\r\n\r\n# About\r\n\r\nAddressKit is an open-source, scalable address ingestion, validation, search, and autocomplete engine that handles complex address structures for address validation of Australian addresses against the [Geocoded National Address File](https://data.gov.au/data/dataset/geocoded-national-address-file-g-naf) (referred to as G-NAF) &mdash; Australia's authoritative address file.\r\n\r\nThis project is a fork of [Addressr](https://github.com/mountain-pass/addressr), with the objective of improving the quality, performance, and maintainability of the codebase. AddressKit is a rewrite of Addressr in TypeScript with numerous improvements, and is a major improvement over the original project, which is sparsely maintained and contains dangerously outdated dependencies. \r\n\r\nIt is available as a self-hosted solution, or can be accessed for free through the AddressKit REST API. \r\n\r\nAddressKit is actively maintained and developed by [Bradley Hodges](https://github.com/bradleyhodges) and is not affiliated with Addressr or its author, Mountain Pass. \r\n\r\n## Licensing\r\n\r\n*Addressr* (the library which AddressKit was forked from) is licensed under the [Apache 2.0](https://github.com/mountain-pass/addressr/blob/f0eb2faa6098e69e5a912e4b6af70c73e5b380a3/LICENSE.md), which expressly permits commercial use, modification, distribution, and sublicensing. You can read more about Apache 2.0 license terms [here](https://www.tldrlegal.com/license/apache-license-2-0-apache-2-0). \r\n\r\n**AddressKit is licensed under the [GNU GPLv2](https://github.com/bradleyhodges/addresskit/blob/master/LICENSE)** license. You can read more about the GNU GPLv2 license [here](https://www.tldrlegal.com/license/gnu-general-public-license-v2).\r\n\r\n## Features\r\nAddressKit is a comprehensive solution for managing and validating Australian addresses. Notable features include:\r\n\r\n- ✅ **Autocomplete:** Blazingly fast search and autocomplete of Australian addresses based on partial input with result paging, sorting, and filtering\r\n- ✅ **Locality Search:** Dedicated suburb/postcode autocomplete for when you only need locality lookups without full address results\r\n- ✅ **Canonical validation**: Validation is built into AddressKit's core data model since every address is resolved from the [G-NAF](https://data.gov.au/data/dataset/geocoded-national-address-file-g-naf) by default, so \"valid\" automatically means \"authoritatively correct\"\r\n- ✅ **Always up-to-date:** AddressKit automatically refreshes its data from the [G-NAF](https://data.gov.au/data/dataset/geocoded-national-address-file-g-naf) every 3 months\r\n- ✅ **Real-time address validation:** Address validation and autocomplete for Australian addresses\r\n- ✅ **JSON:API compliant:** RESTful API conforming to the [JSON:API v1.1 specification](https://jsonapi.org/format/) for standardized, predictable responses\r\n- ✅ **Easy to use API:** Straightforward REST API and CLI service for building your own address validation and autocomplete solutions\r\n- ✅ **Beautiful CLI:** Modern command-line interface with colorful output, progress indicators, and intuitive commands\r\n- ✅ **Run on your own infrastructure or use ours:** Self-host or use our hosted solution\r\n- ✅ **Completely free and open-source:** Completely free or pay for support\r\n- ✅ **Geocoding:** Geocoding of addresses to latitude and longitude coordinates\r\n- ✅ **Cross-platform:** Works on Windows, macOS, and Linux\r\n\r\n---\r\n# Table of Contents\r\n\r\n- [Installation](#installation)\r\n  - [Docker Compose](#docker-compose)\r\n  - [Using npm](#using-npm)\r\n- [Enabling Geocoding](#enabling-geocoding)\r\n- [Updating AddressKit](#updating-addresskit)\r\n- [CLI Reference](#cli-reference)\r\n  - [Commands](#commands)\r\n  - [`load` Command](#load-command)\r\n  - [`start` Command](#start-command)\r\n  - [`version` Command](#version-command)\r\n- [Environment Variables](#environment-variables)\r\n- [API Endpoints](#api-endpoints)\r\n  - [Search / Autocomplete](#search--autocomplete)\r\n  - [Get Address Details](#get-address-details)\r\n  - [Search Localities](#search-localities)\r\n  - [Get Locality Details](#get-locality-details)\r\n  - [Error Responses](#error-responses)\r\n- [System Requirements](#system-requirements)\r\n  - [Supported Platforms](#supported-platforms)\r\n\r\n---\r\n# Installation\r\n\r\nIf you prefer to self-host AddressKit, you have two options for installation: using **[Docker Compose](#docker-compose) (recommended)**, or globally using [npm](#using-npm). \r\n\r\n## Docker Compose\r\n\r\nThe fastest way to get AddressKit running. No installation required - just good ol' Docker.\r\n\r\n#### 1. Create `docker-compose.yml` in your project root, and copy this into it:\r\n\r\n```yaml\r\nservices:\r\n  opensearch:\r\n    image: opensearchproject/opensearch:1.3.20\r\n    environment:\r\n      - discovery.type=single-node\r\n      - plugins.security.disabled=true\r\n      - OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g\r\n    ports:\r\n      - \"9200:9200\"\r\n    volumes:\r\n      - opensearch-data:/usr/share/opensearch/data\r\n    healthcheck:\r\n      test: [\"CMD-SHELL\", \"curl -fsS http://localhost:9200/_cluster/health >/dev/null || exit 1\"]\r\n      interval: 10s\r\n      timeout: 10s\r\n      retries: 30\r\n      start_period: 60s\r\n    restart: unless-stopped\r\n\r\n  api:\r\n    image: bradleyhodges/addresskit:latest\r\n    environment:\r\n      - ELASTIC_HOST=opensearch\r\n      - ELASTIC_PORT=9200\r\n      - PORT=7234\r\n    ports:\r\n      - \"7234:7234\"\r\n    depends_on:\r\n      opensearch:\r\n        condition: service_healthy\r\n    command: [\"addresskit\", \"start\", \"--daemon\"]\r\n    restart: unless-stopped\r\n    healthcheck:\r\n      test: [\"CMD-SHELL\", \"curl -fsS http://localhost:7234/addresses?q=test >/dev/null || exit 1\"]\r\n      interval: 30s\r\n      timeout: 10s\r\n      retries: 3\r\n      start_period: 30s\r\n\r\n  loader:\r\n    image: bradleyhodges/addresskit:latest\r\n    profiles:\r\n      - loader\r\n    environment:\r\n      - ELASTIC_HOST=opensearch\r\n      - ELASTIC_PORT=9200\r\n      - COVERED_STATES=${COVERED_STATES:-}\r\n      # - ADDRESSKIT_ENABLE_GEO=true  # Uncomment to enable geocoding\r\n    volumes:\r\n      - gnaf-data:/home/node/gnaf\r\n    depends_on:\r\n      opensearch:\r\n        condition: service_healthy\r\n    command: [\"addresskit\", \"load\"]\r\n    restart: \"no\"\r\n\r\n  # Optional: OpenSearch Dashboards for monitoring\r\n  dashboards:\r\n    image: opensearchproject/opensearch-dashboards:1.3.20\r\n    profiles:\r\n      - monitoring\r\n    environment:\r\n      - OPENSEARCH_HOSTS=[\"http://opensearch:9200\"]\r\n      - DISABLE_SECURITY_DASHBOARDS_PLUGIN=true\r\n    ports:\r\n      - \"5601:5601\"\r\n    depends_on:\r\n      opensearch:\r\n        condition: service_healthy\r\n    restart: unless-stopped\r\n\r\nvolumes:\r\n  opensearch-data:\r\n  gnaf-data:\r\n```\r\n\r\n#### 2. Start OpenSearch and the AddressKit REST API server:\r\n\r\n```bash\r\ndocker compose up -d\r\n```\r\n\r\n#### 3. Load the G-NAF address data into the search index (first time only):\r\n\r\n```bash\r\ndocker compose --profile loader run --rm loader\r\n```\r\n\r\n> [!TIP] \r\n> By default, only ACT is loaded for quick testing. To load specific states, set the `COVERED_STATES` environment variable:\r\n> ```bash\r\n> COVERED_STATES=NSW,VIC,QLD docker compose --profile loader run --rm loader\r\n> ```\r\n> Or to load all states (takes longer, requires more disk space):\r\n> ```bash\r\n> COVERED_STATES= docker compose --profile loader run --rm loader\r\n> ```\r\n\r\n#### 4. Test the API by searching for addresses:\r\n\r\n```bash\r\n# Search for addresses (autocomplete)\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/addresses?q=LEVEL+25,+TOWER+3\"\r\n\r\n# Get detailed information for a specific address\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/addresses/GAVIC411711441\"\r\n```\r\n\r\nThe API returns JSON:API compliant responses. See [API Endpoints](#api-endpoints) for detailed examples.\r\n\r\n#### 5. Optional: Enable monitoring dashboard\r\n\r\n```bash\r\ndocker compose --profile monitoring up -d\r\n```\r\n\r\nAccess the OpenSearch Dashboards at http://localhost:5601 to monitor your index and search performance.\r\n\r\n### Docker Compose Services\r\n\r\n| Service | Description | Default Port | Profile |\r\n|---------|-------------|--------------|---------|\r\n| `opensearch` | Search backend | 9200 | default |\r\n| `api` | REST API server | 7234 | default |\r\n| `loader` | G-NAF data loader | - | `loader` |\r\n| `dashboards` | OpenSearch Dashboards | 5601 | `monitoring` |\r\n\r\n### Configuration\r\n\r\nFor production deployments or advanced configuration, create a `.env` file alongside your `docker-compose.yml`:\r\n\r\n```env\r\n# States to load (comma-separated: ACT,NSW,VIC,QLD,SA,WA,TAS,NT)\r\nCOVERED_STATES=NSW,VIC\r\n\r\n# Enable geocoding (latitude/longitude)\r\nADDRESSKIT_ENABLE_GEO=true\r\n\r\n# OpenSearch memory (adjust based on available RAM)\r\nOPENSEARCH_HEAP=2g\r\n\r\n# API server port\r\nAPI_PORT=7234\r\n\r\n# CORS origin (set to your domain in production)\r\nCORS_ORIGIN=https://example.com\r\n```\r\n\r\nSee [Environment Variables](#environment-variables) for all available options.\r\n\r\n## Using npm\r\n\r\n#### 1. Ensure you have Node.js >= 24.0.0 installed. You can check your Node.js version by running:\r\n\r\n```bash\r\nnode --version\r\n```\r\n\r\n#### 2. Install the latest version of the AddressKit package globally using npm:\r\n\r\n```bash\r\nnpm install -g @bradleyhodges/addresskit\r\n```\r\n\r\nAfter installation, the `addresskit` command will be available globally in your terminal. Verify the installation by running:\r\n\r\n```bash\r\naddresskit --version\r\n```\r\n\r\n#### 3. AddressKit requires OpenSearch as its search and indexing backend. If you don't already have an OpenSearch instance running, start one with Docker:\r\n\r\n```bash\r\ndocker run -d --name opensearch \\\r\n  -p 9200:9200 -p 9300:9300 \\\r\n  -e \"discovery.type=single-node\" \\\r\n  -e \"plugins.security.disabled=true\" \\\r\n  -e \"OPENSEARCH_JAVA_OPTS=-Xms1g -Xmx1g\" \\\r\n  opensearchproject/opensearch:1.3.20\r\n```\r\n\r\n#### 4. Configure AddressKit by creating a `.env` file in the root of your project and adding the following variables ([see below](#environment-variables) for all supported environment variables):\r\n\r\n```env\r\nELASTIC_HOST=opensearch\r\nELASTIC_PORT=9200\r\nELASTIC_PROTOCOL=http\r\nADDRESSKIT_ENABLE_GEO=0 # disable geocoding support (requires more memory) by default\r\n```\r\n\r\n#### 5. Start the AddressKit API server by running:\r\n\r\n```bash\r\naddresskit start\r\n```\r\n\r\n#### 6. Load the G-NAF address data into the search index by running:\r\n\r\n```bash\r\naddresskit load\r\n```\r\n\r\n> [!NOTE]\r\n> If you are using AddressKit for the first time, you will need to load the G-NAF address data into the search index. This will take a while, depending on the size of the G-NAF dataset. Read more about the load command [here](#load-command).\r\n\r\n---\r\n# Enabling Geocoding\r\n\r\nGeocoding is an optional feature that can be enabled by setting the `ADDRESSKIT_ENABLE_GEO` environment variable to `1`. This will enable geocoding of addresses to latitude and longitude coordinates. Note that geocoding requires more memory, and is disabled by default. To enable geocoding, add the following to your `.env` or `docker-compose.yml` file:\r\n\r\n```env\r\nADDRESSKIT_ENABLE_GEO=1\r\nNODE_OPTIONS=--max_old_space_size=8196 # This is the maximum memory allocation for the Node.js process. Adjust this value based on your system's available memory.\r\n```\r\n\r\n> [!IMPORTANT] Geocoding requires more memory\r\n> With geocoding enabled, indexing takes longer and requires more memory (8GB recommended). If you are experiencing memory issues, you can adjust the `NODE_OPTIONS` value to allocate more memory to the Node.js process. You can read more about the `NODE_OPTIONS` environment variable [here](https://nodejs.org/api/cli.html#node_optionsoptions).\r\n\r\n---\r\n# Updating AddressKit\r\n\r\nAddressKit is updated regularly to fix bugs and add new features. You can update AddressKit by pulling the latest Docker image:\r\n\r\n```bash\r\ndocker pull bradleyhodges/addresskit:latest\r\n```\r\n\r\nOr, if you are using npm, by running:\r\n\r\n```bash\r\nnpm install -g @bradleyhodges/addresskit\r\n```\r\n\r\nIn addition to keeping AddressKit updated, you should regularly update the G-NAF address data to ensure you have the latest addresses. Updates to the G-NAF data are released every 3 months. To automate this chore, you could set up a cron job to keep AddressKit updated. For example, in Linux/macOS, you could add the following to your `crontab`:\r\n\r\n```bash\r\n# Run on the 1st of every month at 3am\r\n0 3 1 * * addresskit load --clear # Note: passing the --clear flag will clear the index before loading the latest data, which may cause some downtime. Use with caution.\r\n```\r\n\r\n---\r\n# CLI Reference\r\n\r\nAddressKit provides a beautiful, intuitive command-line interface for managing your address validation service.\r\n\r\n```\r\n    ___       __    __                    __ __ _ __\r\n   /   | ____/ /___/ /_______  __________/ //_/(_) /_\r\n  / /| |/ __  / __  / ___/ _ \\/ ___/ ___/ ,<  / / __/\r\n / ___ / /_/ / /_/ / /  /  __(__  |__  ) /| |/ / /_\r\n/_/  |_\\__,_/\\__,_/_/   \\___/____/____/_/ |_/_/\\__/\r\n\r\n  ─────────────────────────────────────────────────────\r\n  Australian Address Validation & Autocomplete Engine\r\n  ─────────────────────────────────────────────────────\r\n\r\nUsage: addresskit [options] [command]\r\n\r\nOptions:\r\n  -v, --version    Display version information\r\n  -h, --help       Display help information\r\n\r\nCommands:\r\n  load [options]   Load G-NAF address data into the search index\r\n  start [options]  Start the REST API server\r\n  version          Display detailed version and environment information\r\n  help [command]   Display help for a specific command\r\n```\r\n\r\n## Commands\r\n\r\n| Command | Description |\r\n|---------|-------------|\r\n| `addresskit load` | Download and index G-NAF address data into OpenSearch |\r\n| `addresskit start` | Start the REST API server |\r\n| `addresskit version` | Display version and environment information |\r\n| `addresskit help` | Display help information |\r\n\r\n## `load` Command\r\n\r\nDownloads the latest G-NAF dataset from data.gov.au, extracts it, and indexes all addresses into your OpenSearch instance.\r\n\r\n```bash\r\naddresskit load [options]\r\n```\r\n\r\n**Options:**\r\n\r\n| Option | Description | Default |\r\n|--------|-------------|---------|\r\n| `-d, --daemon` | Run in background mode (suppresses terminal output) | `false` |\r\n| `-s, --states <states>` | Comma-separated list of states to load (e.g., `NSW,VIC,QLD`) | All states |\r\n| `--clear` | Clear existing index before loading | `false` |\r\n| `--geo` | Enable geocoding support | `false` |\r\n| `-h, --help` | Display help for the load command | |\r\n\r\n**Examples:**\r\n\r\n```bash\r\n# Load all states\r\naddresskit load\r\n\r\n# Load only NSW and VIC\r\naddresskit load --states NSW,VIC\r\n\r\n# Load with geocoding enabled\r\naddresskit load --geo\r\n\r\n# Clear index and reload specific states with geocoding\r\naddresskit load --clear --states QLD,SA --geo\r\n\r\n# Run in daemon mode (background, no output)\r\naddresskit load -d\r\n```\r\n\r\n**Valid State Codes:**\r\n\r\n| Code | State |\r\n|------|-------|\r\n| `ACT` | Australian Capital Territory |\r\n| `NSW` | New South Wales |\r\n| `NT` | Northern Territory |\r\n| `OT` | Other Territories |\r\n| `QLD` | Queensland |\r\n| `SA` | South Australia |\r\n| `TAS` | Tasmania |\r\n| `VIC` | Victoria |\r\n| `WA` | Western Australia |\r\n\r\n## `start` Command\r\n\r\nStarts the REST API server for address search and validation.\r\n\r\n```bash\r\naddresskit start [options]\r\n```\r\n\r\n**Options:**\r\n\r\n| Option | Description | Default |\r\n|--------|-------------|---------|\r\n| `-d, --daemon` | Run in background mode (suppresses terminal output) | `false` |\r\n| `-p, --port <port>` | Port to listen on | `7234` or `$PORT` |\r\n| `-h, --help` | Display help for the start command | |\r\n\r\n**Examples:**\r\n\r\n```bash\r\n# Start server on default port (7234)\r\naddresskit start\r\n\r\n# Start server on custom port\r\naddresskit start --port 3000\r\n\r\n# Start in daemon mode\r\naddresskit start -d\r\n\r\n# Start on custom port in daemon mode\r\naddresskit start -d -p 9000\r\n```\r\n\r\n## `version` Command\r\n\r\nDisplays detailed version and environment information.\r\n\r\n```bash\r\naddresskit version\r\n```\r\n\r\n---\r\n# Environment Variables\r\n\r\n### Core Settings\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `ELASTIC_HOST` | OpenSearch host | `localhost` |\r\n| `ELASTIC_PORT` | OpenSearch port | `9200` |\r\n| `ELASTIC_PROTOCOL` | Protocol (`http` or `https`) | `http` |\r\n| `ELASTIC_USERNAME` | OpenSearch username (optional) | |\r\n| `ELASTIC_PASSWORD` | OpenSearch password (optional) | |\r\n| `PORT` | API server port | `7234` |\r\n| `ES_INDEX_NAME` | OpenSearch index name for addresses | `addresskit` |\r\n| `ES_LOCALITY_INDEX_NAME` | OpenSearch index name for localities | `addresskit-localities` |\r\n| `NODE_ENV` | Environment (`production` or `development`) | `production` |\r\n\r\n### Data Loading\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `COVERED_STATES` | Comma-separated list of states to load (ACT,NSW,VIC,QLD,SA,WA,TAS,NT) | All states |\r\n| `ADDRESSKIT_ENABLE_GEO` | Enable geocoding (`true` or `1` to enable) | Disabled |\r\n| `ES_CLEAR_INDEX` | Clear index before loading | `false` |\r\n| `GNAF_DIR` | Directory for G-NAF data cache | `/home/node/gnaf` |\r\n\r\n### Performance & Caching\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `PAGE_SIZE` | Default results per page | `8` |\r\n| `ADDRESSKIT_CACHE_ENABLED` | Enable response caching | `true` |\r\n| `ADDRESSKIT_CACHE_MAX_ENTRIES` | Maximum cached entries | `1000` |\r\n| `ADDRESSKIT_CACHE_TTL_MS` | Cache TTL in milliseconds | `300000` (5 min) |\r\n| `ADDRESSKIT_DYNAMIC_RESOURCES` | Enable dynamic resource management | `true` |\r\n| `ADDRESSKIT_TARGET_MEMORY_UTILIZATION` | Target memory usage ratio | `0.7` |\r\n\r\n### CORS Configuration\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `ADDRESSKIT_ACCESS_CONTROL_ALLOW_ORIGIN` | CORS allowed origin | `*` |\r\n| `ADDRESSKIT_ACCESS_CONTROL_EXPOSE_HEADERS` | CORS exposed headers | |\r\n| `ADDRESSKIT_ACCESS_CONTROL_ALLOW_HEADERS` | CORS allowed headers | |\r\n\r\n### Retry & Timeout Settings\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `ADDRESSKIT_INDEX_TIMEOUT` | Index operation timeout | `300s` |\r\n| `ADDRESSKIT_INDEX_BACKOFF` | Initial backoff delay (ms) | `30000` |\r\n| `ADDRESSKIT_INDEX_BACKOFF_INCREMENT` | Backoff increment (ms) | `30000` |\r\n| `ADDRESSKIT_INDEX_BACKOFF_MAX` | Maximum backoff delay (ms) | `600000` |\r\n| `ADDRESSKIT_INDEX_MAX_RETRIES` | Maximum retry attempts | `10` |\r\n\r\n### Container Startup (Docker only)\r\n\r\n| Environment Variable | Description | Default |\r\n|---------------------|-------------|---------|\r\n| `ADDRESSKIT_STARTUP_MAX_RETRIES` | Max retries waiting for OpenSearch | `60` |\r\n| `ADDRESSKIT_STARTUP_RETRY_INTERVAL` | Seconds between retries | `5` |\r\n| `ADDRESSKIT_SKIP_OPENSEARCH_WAIT` | Skip waiting for OpenSearch | `false` |\r\n| `ADDRESSKIT_QUIET` | Suppress startup banner | `false` |\r\n\r\n> **Note:** When adjusting `PAGE_SIZE`, consider how quickly you want initial results returned. For most use cases, leave it at 8 and use pagination for additional results. Why 8? [Mechanical Sympathy](https://dzone.com/articles/mechanical-sympathy).\r\n\r\n---\r\n# API Endpoints\r\n\r\nThe AddressKit API conforms to the [JSON:API v1.1 specification](https://jsonapi.org/format/). All responses use the `application/vnd.api+json` media type.\r\n\r\n| Endpoint | Method | Description |\r\n|----------|--------|-------------|\r\n| `/addresses?q=<query>` | GET | Search for addresses (autocomplete) |\r\n| `/addresses?q=<query>&page[number]=<n>` | GET | Search with pagination |\r\n| `/addresses/:id` | GET | Get detailed information for a specific address |\r\n| `/localities?q=<query>` | GET | Search for localities/suburbs (autocomplete) |\r\n| `/localities?q=<query>&page[number]=<n>` | GET | Search localities with pagination |\r\n| `/localities/:id` | GET | Get detailed information for a specific locality |\r\n| `/docs` | GET | OpenAPI/Swagger documentation |\r\n\r\n## Search / Autocomplete\r\n\r\nSearch for addresses matching a query string. Returns lightweight autocomplete suggestions optimized for typeahead UX.\r\n\r\n**Request:**\r\n\r\n```bash\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/addresses?q=300+barangaroo\"\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"jsonapi\": {\r\n    \"version\": \"1.1\"\r\n  },\r\n  \"data\": [\r\n    {\r\n      \"type\": \"address-suggestion\",\r\n      \"id\": \"GANSW716635811\",\r\n      \"attributes\": {\r\n        \"sla\": \"LEVEL 25, TOWER 3, 300 BARANGAROO AV, BARANGAROO NSW 2000\",\r\n        \"rank\": 1\r\n      },\r\n      \"links\": {\r\n        \"self\": \"/addresses/GANSW716635811\"\r\n      }\r\n    },\r\n    {\r\n      \"type\": \"address-suggestion\",\r\n      \"id\": \"GANSW716635812\",\r\n      \"attributes\": {\r\n        \"sla\": \"LEVEL 26, TOWER 3, 300 BARANGAROO AV, BARANGAROO NSW 2000\",\r\n        \"rank\": 0.92\r\n      },\r\n      \"links\": {\r\n        \"self\": \"/addresses/GANSW716635812\"\r\n      }\r\n    }\r\n  ],\r\n  \"links\": {\r\n    \"self\": \"/addresses?q=300+barangaroo\",\r\n    \"first\": \"/addresses?q=300+barangaroo\",\r\n    \"prev\": null,\r\n    \"next\": \"/addresses?q=300+barangaroo&page[number]=2\",\r\n    \"last\": \"/addresses?q=300+barangaroo&page[number]=5\"\r\n  },\r\n  \"meta\": {\r\n    \"total\": 42,\r\n    \"page\": 1,\r\n    \"pageSize\": 10,\r\n    \"totalPages\": 5\r\n  }\r\n}\r\n```\r\n\r\n## Get Address Details\r\n\r\nRetrieve comprehensive details for a specific address by its G-NAF Persistent Identifier (PID). Use this endpoint after a user selects an address from the autocomplete results.\r\n\r\n**Request:**\r\n\r\n```bash\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/addresses/GANSW716635811\"\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"jsonapi\": {\r\n    \"version\": \"1.1\"\r\n  },\r\n  \"data\": {\r\n    \"type\": \"address\",\r\n    \"id\": \"GANSW716635811\",\r\n    \"attributes\": {\r\n      \"pid\": \"GANSW716635811\",\r\n      \"sla\": \"LEVEL 25, TOWER 3, 300 BARANGAROO AV, BARANGAROO NSW 2000\",\r\n      \"ssla\": \"25/300 BARANGAROO AV, BARANGAROO NSW 2000\",\r\n      \"mla\": [\r\n        \"LEVEL 25\",\r\n        \"TOWER 3\",\r\n        \"300 BARANGAROO AV\",\r\n        \"BARANGAROO NSW 2000\"\r\n      ],\r\n      \"structured\": {\r\n        \"buildingName\": \"Tower 3\",\r\n        \"level\": {\r\n          \"type\": { \"name\": \"Level\", \"code\": \"L\" },\r\n          \"number\": 25\r\n        },\r\n        \"number\": {\r\n          \"number\": 300\r\n        },\r\n        \"street\": {\r\n          \"name\": \"Barangaroo\",\r\n          \"type\": { \"name\": \"Avenue\", \"code\": \"AV\" }\r\n        },\r\n        \"locality\": {\r\n          \"name\": \"Barangaroo\",\r\n          \"class\": { \"code\": \"G\", \"name\": \"GAZETTED LOCALITY\" }\r\n        },\r\n        \"state\": {\r\n          \"name\": \"New South Wales\",\r\n          \"abbreviation\": \"NSW\"\r\n        },\r\n        \"postcode\": \"2000\",\r\n        \"confidence\": 2\r\n      },\r\n      \"geo\": {\r\n        \"level\": {\r\n          \"code\": 7,\r\n          \"name\": \"LOCALITY, STREET, ADDRESS\"\r\n        },\r\n        \"geocodes\": [\r\n          {\r\n            \"latitude\": -33.8535,\r\n            \"longitude\": 151.2012,\r\n            \"isDefault\": true,\r\n            \"reliability\": {\r\n              \"code\": 2,\r\n              \"name\": \"WITHIN ADDRESS SITE BOUNDARY OR ACCESS POINT\"\r\n            },\r\n            \"type\": {\r\n              \"code\": 2,\r\n              \"name\": \"PROPERTY CENTROID\"\r\n            }\r\n          }\r\n        ]\r\n      }\r\n    },\r\n    \"links\": {\r\n      \"self\": \"/addresses/GANSW716635811\"\r\n    }\r\n  },\r\n  \"links\": {\r\n    \"self\": \"/addresses/GANSW716635811\"\r\n  }\r\n}\r\n```\r\n\r\n## Search Localities\r\n\r\nSearch for localities (suburbs/postcodes) matching a query string. Returns lightweight autocomplete suggestions - useful when you only need suburb/postcode lookups without full address autocomplete.\r\n\r\n**Request:**\r\n\r\n```bash\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/localities?q=sydney\"\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"jsonapi\": {\r\n    \"version\": \"1.1\"\r\n  },\r\n  \"data\": [\r\n    {\r\n      \"type\": \"locality-suggestion\",\r\n      \"id\": \"NSW1234\",\r\n      \"attributes\": {\r\n        \"display\": \"SYDNEY NSW 2000\",\r\n        \"rank\": 1\r\n      },\r\n      \"links\": {\r\n        \"self\": \"/localities/NSW1234\"\r\n      }\r\n    },\r\n    {\r\n      \"type\": \"locality-suggestion\",\r\n      \"id\": \"NSW5678\",\r\n      \"attributes\": {\r\n        \"display\": \"SYDNEY SOUTH NSW 2000\",\r\n        \"rank\": 0.85\r\n      },\r\n      \"links\": {\r\n        \"self\": \"/localities/NSW5678\"\r\n      }\r\n    }\r\n  ],\r\n  \"links\": {\r\n    \"self\": \"/localities?q=sydney\",\r\n    \"first\": \"/localities?q=sydney\",\r\n    \"prev\": null,\r\n    \"next\": \"/localities?q=sydney&page[number]=2\",\r\n    \"last\": \"/localities?q=sydney&page[number]=5\"\r\n  },\r\n  \"meta\": {\r\n    \"total\": 42,\r\n    \"page\": 1,\r\n    \"pageSize\": 10,\r\n    \"totalPages\": 5\r\n  }\r\n}\r\n```\r\n\r\n## Get Locality Details\r\n\r\nRetrieve comprehensive details for a specific locality by its G-NAF Locality Persistent Identifier (PID). Use this endpoint after a user selects a locality from the autocomplete results.\r\n\r\n**Request:**\r\n\r\n```bash\r\ncurl -H \"Accept: application/vnd.api+json\" \\\r\n  \"http://localhost:7234/localities/NSW1234\"\r\n```\r\n\r\n**Response:**\r\n\r\n```json\r\n{\r\n  \"jsonapi\": {\r\n    \"version\": \"1.1\"\r\n  },\r\n  \"data\": {\r\n    \"type\": \"locality\",\r\n    \"id\": \"NSW1234\",\r\n    \"attributes\": {\r\n      \"localityPid\": \"NSW1234\",\r\n      \"name\": \"SYDNEY\",\r\n      \"display\": \"SYDNEY NSW 2000\",\r\n      \"class\": {\r\n        \"code\": \"G\",\r\n        \"name\": \"GAZETTED LOCALITY\"\r\n      },\r\n      \"state\": {\r\n        \"name\": \"New South Wales\",\r\n        \"abbreviation\": \"NSW\"\r\n      },\r\n      \"postcode\": \"2000\",\r\n      \"postcodes\": [\"2000\", \"2001\"]\r\n    },\r\n    \"links\": {\r\n      \"self\": \"/localities/NSW1234\"\r\n    }\r\n  },\r\n  \"links\": {\r\n    \"self\": \"/localities/NSW1234\"\r\n  }\r\n}\r\n```\r\n\r\n## Error Responses\r\n\r\nAll error responses follow the JSON:API error format:\r\n\r\n```json\r\n{\r\n  \"jsonapi\": {\r\n    \"version\": \"1.1\"\r\n  },\r\n  \"errors\": [\r\n    {\r\n      \"status\": \"404\",\r\n      \"code\": \"RESOURCE_NOT_FOUND\",\r\n      \"title\": \"Not Found\",\r\n      \"detail\": \"The address with ID 'INVALID_123' does not exist.\"\r\n    }\r\n  ]\r\n}\r\n```\r\n\r\n| Status | Description |\r\n|--------|-------------|\r\n| `400` | Bad Request - Invalid query parameters |\r\n| `404` | Not Found - Address ID does not exist |\r\n| `500` | Internal Server Error - Unexpected error |\r\n| `503` | Service Unavailable - OpenSearch unavailable |\r\n| `504` | Gateway Timeout - Query timeout |\r\n\r\n---\r\n# System Requirements\r\n\r\nAddressKit is designed to be lightweight and efficient. It is built to run on modest hardware, and is designed to be self-hosted on your own infrastructure.\r\n\r\n## Resource Requirements\r\n\r\n| Deployment Size | States | Memory | Disk | Use Case |\r\n|-----------------|--------|--------|------|----------|\r\n| **Small** | 1-2 states (e.g., ACT) | 2GB | 10GB | Development, testing |\r\n| **Medium** | 3-4 states | 4GB | 30GB | Regional applications |\r\n| **Large** | All states | 8GB+ | 100GB+ | National production |\r\n\r\nThese requirements include both AddressKit and OpenSearch. Memory should be split roughly 50/50 between the API server and OpenSearch (adjust `OPENSEARCH_HEAP` accordingly).\r\n\r\n> [!NOTE]\r\n> If you enable geocoding (`ADDRESSKIT_ENABLE_GEO=true`), increase memory requirements by approximately 50%. For all states with geocoding, we recommend 12GB+ RAM.\r\n\r\n## Production Deployment Tips\r\n\r\nFor production deployments, consider:\r\n\r\n1. **Security:** Set `CORS_ORIGIN` to your specific domain(s), enable OpenSearch security, use HTTPS via a reverse proxy\r\n2. **Performance:** Tune `OPENSEARCH_HEAP` to 50% of available container memory (max 32GB)\r\n3. **Reliability:** Set up volume backups for `opensearch-data` and `gnaf-data`, configure log aggregation\r\n4. **Monitoring:** Enable the `monitoring` profile to access OpenSearch Dashboards\r\n\r\n## Supported Platforms\r\n\r\n- **Windows** 10/11 (x64)\r\n- **macOS** 12+ (Intel and Apple Silicon)\r\n- **Linux** (x64, arm64)\r\n  - Ubuntu 20.04+\r\n  - Debian 11+\r\n  - CentOS 8+\r\n  - Amazon Linux 2+\r\n","readmeFilename":"README.md"}