First published release. 0.1.0 and 0.1.1 were tagged during development, on 2026-07-31 and 2026-08-02, and neither was submitted anywhere; 0.1.2 supersedes both and is the version to install. Everything in the notes below is present here.
URL: and BugReports: name the GitLab repository. They previously named a
GitHub account that no longer exists, so both fields resolved to 404.since column reads
0.1.2 because that is the first release a consumer can obtain.Tagged during development on 2026-08-02 and never submitted anywhere. Everything in the 0.1.0 notes below is present here. The difference from 0.1.0 is two dependency floors that the 0.1.0 tag predates, one of which fixes a silent correctness bug.
addr_reading(p, "curl")
returned NA and left p corrupted, so a later addr_reading(p, "aton")
returned NA too for a literal it had read as an address before the first
call. The answer is the version floor rather than a defensive copy, because
vctrs 0.7.0 fixed the bug upstream and a workaround would outlive it. The
property is pinned by a non-mutation test rather than by the floor alone.Imports: entry claims to work with any version
while nothing checks it. Both floors are checked: data-raw/check-dep-floor.sh
runs the full check against exactly these versions on R 4.0.0.Tagged during development and never published. addr_parse() takes no mode
argument: it reports what an IP address literal means under every supported
dialect at once, with the reason codes that explain each reading, and never
collapses disagreeing sources into a single answer.
addr_parse() returns a raddr_parse record carrying the input, the reading
each dialect arrived at, the per-dialect outcome, and the reason codes.addr_strict() (RFC dotted-quad and
RFC 4291 IPv6 text) and addr_whatwg() (WHATWG URL host parser). In reality:
addr_pton() and addr_aton(). Two precedence orderings over the reality
primitives: addr_getaddrinfo() and addr_curl().inet_pton() and inet_aton()
specifically, not POSIX and BSD in the abstract. The same oracles were run
under glibc 2.36 and musl 1.2.5 (data-raw/oracle-libc-linux.sh), and there
is no reality-side reading all three libcs agree on: glibc and musl reject
the leading zeros Apple reads as decimal, and reject the overflow Apple wraps
modulo 2^32. addr_getaddrinfo() and addr_curl() are Apple readings across
the whole of fe80::/10, where the scope lift they apply is Apple's alone.
Four Linux fixtures are committed beside the Apple ones and asserted by
tests/testthat/test-libc.R, so a libc upgrade changes a tracked file rather
than passing quietly.addr_input(),
addr_outcome(), addr_reading(), addr_codes(), addr_status(), and
addr_is_divergent() for the literals the dialects disagree about.addr_codes_registry() documents every reason code, each stating what it
does and does not prove, and grades the classify codes by the force of the
rule they report.raddr_address() is a vctrs record vector holding IPv4 and IPv6 values, with
format(), as.character(), comparison, equality, and combination methods.addr_family(), addr_zone(), addr_expand(), and addr_format() — the
latter emitting RFC 5952 canonical text.addr_classify() returns a raddr_class record; addr_category(),
addr_address_space(), and addr_registry() read its fields. Registry rows
that say nothing are reported as such rather than guessed at, and two
different N/As stay distinguishable.addr_global_reachability() is the two-layer positive fact behind the RFC
6052 §3.1, RFC 3056 §9 and RFC 4380 §4 rules: IANA's globally_reachable
column where the special-purpose layer answered, category = "global" where
only the address-space layer did, and NA where neither settled it. A
fact, not a verdict — the NA is a third answer rather than a missing
one, and a policy layer must branch on all three. It takes a raddr_address,
a raddr_class or a raddr_embedding, so the same question can be put to an
outer address and to what it embeds.2025-10-09), the address-space pair (2025-10-10), the category map and
the transition-mechanism table (2026-07-27). The two registry stamps are
read from the page-level Last Updated field on IANA's own registry pages
rather than from the Last-Modified header the CSV exports are served with,
which is a site deploy timestamp: seven exports across four unrelated
registries carry the identical second.addr_registry_version(), addr_address_space_version(),
addr_category_version(), addr_transition_version(), and
addr_registry_outdated() for checking snapshot age.addr_registry_snapshot() returns one content-addressed id for the whole
vendored payload — a sha256: digest over a canonical manifest of the four
source keys and their per-file checksums, in a fixed order. It is the value
to quote in a bug report, since it pins the data independently of the package
version. It deliberately says nothing about currency: a hash has no order.addr_within() and addr_within_any() test CIDR containment, including the
longest-prefix-match carve-outs inside non-globally-reachable parents.addr_to_bytes(), addr_to_hex(),
addr_to_binary(), addr_to_integer() and their inverses.addr_reverse_pointer() builds in-addr.arpa and ip6.arpa names.addr_embeddings() and addr_embedded_kind() decode NAT64, Teredo, and
6to4 embeddings. Both Teredo addresses are reported — the server in the clear
and the bitwise-complemented client — because reducing the pair to one is the
consumer's decision, not raddr's.addr_nat64_embeddings() reads the IPv4 address embedded under a
caller-supplied RFC 6052 Network-Specific Prefix. addr_classify() names
NAT64 only from the two written-down prefixes and still does: an operator's
own prefix is invisible to a prefix table, and nothing about this call
changes what classification concludes. Because supplying a prefix is an
assertion rather than a discovery, every row comes back as nat64_nsp, a
kind classification can never emit. The reserved u-byte at bits 64-71
splits the embedded octets at /40, /48 and /56, so a contiguous 32-bit
read from the prefix boundary returns a plausible wrong address — under a
/48, 192.0.2.33 reads as 192.0.0.2. Checked against RFC 6052 §2.4's own
worked example at all six permitted lengths.skip_on_cran().introduction, reason-codes, and edge-cases, the last
with every table computed at build time rather than transcribed.docs/architecture.md, and the reason-code table in it
is checked against the registry in both directions on every run: no
undocumented code, and no orphan entry left behind by a rename.The API is not yet stable. Pure R, no network access at any point.