All notable changes to this project will be documented in this file. See Conventional Commits for commit guidelines.
v0.3.0 (2026-07-07)
Breaking Changes:
- migrate JSON encoding to native Elixir JSON; drop jason/poison (#125) by Matt Beanland
Chores:
correct copyright year 2024 -> 2025 by Matt Beanland
fix inaccurate @specs and type-completeness nits (#111) by Matt Beanland
remove unreachable Bolt <5.0 legacy datetime code (#104) by Matt Beanland
swap tzdata for tz to drop the hackney dev/test tail (#99) by Matt Beanland
drop obsolete build_embedded and no-op test alias (#78) by Matt Beanland
API ergonomics cleanup + dead-dep removal (#79) by Matt Beanland
add shared pre-push hook for fast lint checks by Matt Beanland
group dependabot updates to reduce PR noise by Matt Beanland
bump erlang/elixir to 29.0.2 and 1.20.2 by Matt Beanland
bump dependencies by Matt Beanland
CI/CD:
run mix credo in the static-analysis job (#78) by Matt Beanland
bump Neo4j 5.26 LTS to 5.26.28 in the test matrix by Matt Beanland
run the TLS verification suite by Matt Beanland
Documentation:
note Erlang :ssl rejects self-signed server certs under +s by Matt Beanland
point to Neo4j SSL framework docs for server cert setup by Matt Beanland
add TLS connection examples to README and usage-rules by Matt Beanland
note Duration microsecond precision limitation (#129) by Matt Beanland
document result streaming (#59) by Matt Beanland
correct inverted verify values in usage-rules TLS scheme table by Matt Beanland
add cluster/SSR guide and update usage-rules (#113) by Matt Beanland
document :routing, :mode and :bookmarks (#113) by Matt Beanland
README note for the tz-database requirement; preserve the error code (#100) by Matt Beanland
expand the Bolty landing moduledoc + doc query_many!/4 (#78) by Matt Beanland
declare the public/internal API boundary (#77) by Matt Beanland
package and doc-config quick wins by Matt Beanland
refresh AGENTS.md Local Neo4j section for 5.26.28 + TLS by Matt Beanland
Features:
emit [:bolty, :stream, :start|:fetch|:stop] telemetry (#59) by Matt Beanland
lazy result streaming via DBConnection cursor callbacks (#59) by Matt Beanland
send HELLO routing field to enable server-side routing (#113) by Matt Beanland
validate start_link/1 options against an allowlist (#121) by Matt Beanland
@spec the public API surface (#77) by Matt Beanland
spec the internal version surface for dialyzer (#77) by Matt Beanland
syntax-aware statement splitter for query_many by Matt Beanland
represent Bolt versions as strings/tuples, not floats by Matt Beanland
add per-query recv timeouts for post-connect reads by Matt Beanland
emit :telemetry events for query and connect lifecycle by Matt Beanland
Bug Fixes:
render Duration JSON to match Neo4j toString; fix negative/zero (#129) by Matt Beanland
suppress hex debug log for messages carrying credentials (#123) by Matt Beanland
redact auth credentials from debug log (#109) by Matt Beanland
remove dead :ssl option and warn on its use (#107) by Matt Beanland
close remaining error-surface raise-through gaps (#110) by Matt Beanland
re-coalesce surviving range minors instead of flattening them by Matt Beanland
classify range :versions entries minor-by-minor, not as one unit by Matt Beanland
reject :versions bolty doesn't implement at config time by Matt Beanland
wrap handshake failures as %Bolty.Error{} instead of crashing (#106) by Matt Beanland
clear error (not a crash) when a named-zone datetime has no tz database (#100) by Matt Beanland
type Query/Queries
extraas the map it actually is (#77) by Matt Beanlandconvert remaining float version comparisons to tuples by Matt Beanland
reject unknown PackStream markers instead of silently misdecoding by Matt Beanland
deterministic PackStream map key ordering by Matt Beanland
raise Elixir floor to ~> 1.17 and CI-test it by Matt Beanland
uniform config precedence and remove env-var config by Matt Beanland
unify the error surface to always return %Bolty.Error{} by Matt Beanland
correct inverted TLS verification and stop overriding user ssl_opts by Matt Beanland
Refactoring:
flatten log_client_message_hex nesting to satisfy credo by Matt Beanland
deduplicate Bolt message boilerplate (#78) by Matt Beanland
clear credo refactoring findings (#78) by Matt Beanland
Style:
- satisfy mix format in client_test.exs by Matt Beanland
Testing:
allow targeting a non-local server via NEO4J_HOST/SCHEME/PASSWORD by Matt Beanland
cover result streaming end-to-end (#59) by Matt Beanland
un-hide TLS/config unit tests from bare mix test (#108) by Matt Beanland
make bolty_test serial to stop async DB-truncate flake by Matt Beanland
split unit/integration suites and add PackStream property tests by Matt Beanland
add TLS integration rig on neo4j 5.26.28 by Matt Beanland
v0.2.1 (2026-06-26)
Chores:
- remove dead Bolty.Client.checkin/1 (#54) by Matt Beanland
CI/CD:
- cover Bolt 6.0 (2026.05) and Bolt 5.x fallback (#65) by Matt Beanland
Documentation:
- scope dynamic_labels to pattern position only (#53) by Matt Beanland
Bug Fixes:
return bound Relationship structs from Path.graph/1 (#55) by Matt Beanland
disconnect with the original error if a recovery RESET raises (#58) by Matt Beanland
reassemble multi-chunk Bolt messages on the receive path (#57) by Matt Beanland
classify common Neo4j status codes in Bolty.Error (#54) by Matt Beanland
reset connection after any FAILURE to recover FAILED state (#54) by Matt Beanland
Testing:
stop the #54 constraint recovery test leaking its constraint by Matt Beanland
stabilize the #54 happy-path commit test against async truncate by Matt Beanland
v0.2.0 (2026-06-15)
Chores:
align test DB compose with ash_neo4j and retire bats test-runner by Matt Beanland
reference Neo4j 5.26.27 in compose, docs and fixtures by Matt Beanland
replace git-cliff with git_ops for releases by Matt Beanland
CI/CD:
- run on dev/main and add dialyzer + warnings-as-errors gate by Matt Beanland
Features:
- policy: add cypher_5, cypher_25 and dynamic_labels flags by Matt Beanland
Bug Fixes:
ci: correct Neo4j test auth password and bump matrix image to 5.26.27 by Matt Beanland
bolty: type transaction/4 extra_parameters as map by Matt Beanland
error: preserve atom error codes in Error.wrap/2 by Matt Beanland
Style:
- apply mix format to files with format drift by Matt Beanland
v0.1.0 — 2026-06-06
Bug Fixes
- Pin str_length in decode_string bitstring pattern (
7a4fdff)
Chores
- BREAKING Drop support for Neo4j 3.x and 4.x (Bolt 1.0–4.4) (
1e2639b) - Remove dead legacy DateTime packer clauses (
5245082) - Remove stale :bolt_2_x/:bolt_3_x/:bolt_4_x test tags (
48b69d9) - Remove dead Bolt ≤3/≤2 message clauses; document negotiated capabilities (
12c540b) - Add neo4j 2026.05 service; align passwords to 'password' (
735570a) - Drop Memgraph support (issue #15) (
b546480)
Documentation
- Update README for Bolt 6.0 and Neo4j 2026.05 support (
18821ef)
Features
- Add mix test.matrix and mix changelog tasks; bump to 0.1.0 (
aaa4df3) - Add support for Bolt 5.6, 5.7, and 5.8 (Neo4j 5.26.26 LTS) (
d31d13a) - Document :versions as first-class config; deprecate BOLT_VERSIONS (
cad2b00) - Expose negotiated connection capabilities via Bolty.connection_info/1 (
04daf05) - Add Bolt 6.0 support (Neo4j 2026.05) (
3429612) - Route Bolt 6.x to separate port in test.matrix (
526d842) - Add Vector type pack/unpack for Bolt 6.0 (issue #13) (
3f04e9c) - Add Bolt version guard and docs for Vector type (
3f28f94)
Refactoring
- Make Policy the source of truth for all Bolt version-driven behaviour (
f5b1d08)
Testing
- Update message encoder tests from Bolt 3.x/2.x to 5.x (
7afc3e8) - Remove hardcoded server version assertions in connection_test (
c5f27ac)
v0.0.13
%Bolty.Types.Point{}parameters are now sent as native PackStream Points instead of being silently converted to Maps. This allows Points (and arrays of Points) to be stored directly as Neo4j node properties. Breaking: callers that pass a%Bolty.Types.Point{}to Cypher'spoint()constructor must now pass a Map instead (or useBolty.Types.Point.format_param/1to convert). See https://github.com/diffo-dev/bolty/pull/35
Full Changelog: https://github.com/diffo-dev/bolty/compare/0.0.12...0.0.13
v0.0.12
- Execute/4 sends send_reset for :syntax_error/:semantic_error when inside a transaction (#26)
- Additional bolty issues with transactions (#28)
- Unknown Error (CaseClauseError) no case clause matching:
{:ignored, [0, 0]}(#29)
Full Changelog: https://github.com/diffo-dev/bolty/compare/0.0.11...0.0.12
v0.0.11
- Fix UndefinedFunctionError when formatting a Neo4j EntityNotFound error (#21)
Full Changelog: https://github.com/diffo-dev/bolty/compare/0.0.10...0.0.11
v0.0.10
- DateTime param illegal — policy-driven PackStream encoding (#14)
Full Changelog: https://github.com/diffo-dev/bolty/compare/0.0.9...0.0.10
v0.0.9
- Fix duration stored as string
v0.0.8
- Fix duration microseconds
v0.0.7
- Initial fork from boltx v0.0.6
- Duration support
- Maintenance
- Negotiate range