diff --git a/core/src/main/java/module-info.java b/core/src/main/java/module-info.java
new file mode 100644
index 00000000..84db6289
--- /dev/null
+++ b/core/src/main/java/module-info.java
@@ -0,0 +1,27 @@
+/// Vortex core module: shared type model, error contract, low-level I/O, compute kernels, and the
+/// generated FlatBuffers/Protobuf wire codecs.
+///
+/// The model, error, and I/O packages form the public surface shared with downstream tooling. The
+/// compute kernels and the generated `fbs`/`proto` codecs are internal plumbing, exported only to
+/// the reader and writer modules.
+// "module" lint suppressed for two unavoidable warnings under the zero-warning policy:
+// the group-derived name component `dfa1` has a terminal digit, and the qualified-export targets
+// (reader/writer) are not visible when this module is compiled standalone in the reactor.
+@SuppressWarnings("module")
+module io.github.dfa1.vortex.core {
+ // Compile-only: generated proto records carry @javax.annotation.processing.Generated
+ // (SOURCE retention, so not needed at runtime).
+ requires static java.compiler;
+
+ // Public API.
+ exports io.github.dfa1.vortex.core.model;
+ exports io.github.dfa1.vortex.core.error;
+ exports io.github.dfa1.vortex.core.io;
+
+ // Internal compute kernels and generated wire codecs: consumed only by reader/writer (modular
+ // path). Downstream non-modular tooling like the inspector reads them via the classpath, where
+ // these directives are ignored.
+ exports io.github.dfa1.vortex.core.compute to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer;
+ exports io.github.dfa1.vortex.core.fbs to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer;
+ exports io.github.dfa1.vortex.core.proto to io.github.dfa1.vortex.reader, io.github.dfa1.vortex.writer;
+}
diff --git a/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java b/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java
index f553c802..559d49f5 100644
--- a/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java
+++ b/reader/src/main/java/io/github/dfa1/vortex/reader/ArrayStats.java
@@ -37,6 +37,10 @@ public static ArrayStats empty() {
///
/// @param fbs the FlatBuffers stats table, or `null`
/// @return parsed stats, or an empty instance if no usable data is present
+ // Low-level entry point for the parse path and the inspector tool; intentionally exposes the
+ // generated FlatBuffers type, which core only qualified-exports. Suppress the resulting
+ // exports-leak lint rather than widen the core export or hide this factory.
+ @SuppressWarnings("exports")
public static ArrayStats fromFbs(io.github.dfa1.vortex.core.fbs.FbsArrayStats fbs) {
if (fbs == null) {
return EMPTY;
diff --git a/reader/src/main/java/module-info.java b/reader/src/main/java/module-info.java
new file mode 100644
index 00000000..b5d0bc1b
--- /dev/null
+++ b/reader/src/main/java/module-info.java
@@ -0,0 +1,58 @@
+/// Vortex reader module: memory-mapped file parsing, the layout/scan engine, decoded `Array`
+/// types, and the encoding/extension decoders dispatched via [java.util.ServiceLoader].
+///
+/// `vortex.core` is re-exported (`requires transitive`) because decoded types surface core model
+/// types (`DType`, `PType`, …) in the public API. The native zstd codec is optional
+/// (`requires static`): the `vortex.zstd` decoder loads only when the `zstd` module is present.
+// Lint suppressed: `module` for the group-derived terminal-digit name component `dfa1`;
+// `requires-automatic` because the optional `zstd` codec ships as an automatic module (no
+// module descriptor yet) and is pulled in via `requires static`.
+@SuppressWarnings({"module", "requires-automatic"})
+module io.github.dfa1.vortex.reader {
+ requires transitive io.github.dfa1.vortex.core;
+ requires static zstd;
+ // transitive: VortexHttpReader.open exposes java.net.http.HttpClient in its public signature.
+ requires transitive java.net.http;
+
+ exports io.github.dfa1.vortex.reader;
+ exports io.github.dfa1.vortex.reader.array;
+ exports io.github.dfa1.vortex.reader.decode;
+ exports io.github.dfa1.vortex.reader.extension;
+
+ uses io.github.dfa1.vortex.reader.decode.EncodingDecoder;
+
+ provides io.github.dfa1.vortex.reader.decode.EncodingDecoder with
+ io.github.dfa1.vortex.reader.decode.AlpEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.AlpRdEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.BitpackedEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.BoolEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ByteBoolEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ChunkedEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ConstantEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.DateTimePartsEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.DecimalBytePartsEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.DecimalEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.DeltaEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.DictEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ExtEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.FixedSizeListEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.FrameOfReferenceEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.FsstEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ListEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ListViewEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.MaskedEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.NullEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.PatchedEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.PcoEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.PrimitiveEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.RleEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.RunEndEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.SequenceEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.SparseEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.StructEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.VarBinEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.VariantEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.VarBinViewEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ZigZagEncodingDecoder,
+ io.github.dfa1.vortex.reader.decode.ZstdEncodingDecoder;
+}
diff --git a/writer/pom.xml b/writer/pom.xml
index 76a8973e..e4790a11 100644
--- a/writer/pom.xml
+++ b/writer/pom.xml
@@ -61,6 +61,38 @@
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ default-testCompile
+
+
+ -Xlint:all
+ --add-reads
+ io.github.dfa1.vortex.writer=ALL-MODULE-PATH
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+
+ false
+
+
+
+
+