From Kernel Events to

Knowledge Graphs

Filesystem Replication and AI Indexing Without the Cloud

Joel Wirāmu Pauling · Independent Open Source Project
NZRS 2026 · Aotearoa New Zealand Research Software Conference
7–8 September 2026

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Ko wai au

Joel Wirāmu Pauling
Senior Solution Architect, Red Hat · Ngaio, Pōneke

bootc, Hummingbird, Agentic OS, post-quantum crypto, AI governance
Previously OvS, OpenStack, CephFS at carrier-scale telco, eBPF
MSc Psychology (Te Herenga Waka, 2009) · Exploring PhD
Microcontrollers, mech keyboards, retro-gaming SBC handhelds
Has a dog and a cat

Fediverse: @jwp@cloudisland.nz
Code: codeberg.org/aenertia

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Dog and Cat Tax

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

The Paradox: Findable vs Sovereign

Research teams must make data findable AND keep it sovereign.
Cloud AI solves the first by breaking the second.

The findability problem:

  • Semantic search needs embeddings
  • FAIR principles need metadata
  • Files carry no context at rest

The sovereignty constraint:

  • Te Mana Raraunga demands local control
  • No overseas data transfer
  • Sensitive data stays institutional

Real formats, real gaps:
NIWA — NetCDF climate models (30-page naming convention)
Otago — DICOM scans ("phoned Siemens to read their own DICOM tags")
Genomics Aotearoa — FASTQ sequences, VRL acoustic telemetry

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

RAID1(10) Without the Constraints

The source never waits for the target.

RAID1(10) mirrors give you redundancy — but they chain you to matched media and the speed of the slowest member. Higher RAID levels are worse: RAID5/6 add erasure coding overhead to every read and write, and hardware controllers are opaque black boxes with their own failure domains. All of them still slow you to the slowest member.

RAID:

  • Matched disks required
  • Write speed = slowest member
  • RAID5/6: erasure coding on every I/O
  • HW controllers: opaque failure domains
  • Fail = rebuild entire array

foxing:

  • Mix NVMe + HDD + NFS + S3
  • Source writes at full NVMe speed
  • Multiple targets, each at own pace
  • Target disappears → journal → auto-recover
  • No erasure coding, no black-box controllers
Source (NVMe) ──BPF──→ Worker 0 ──→ Target 1: NVMe backup    (2ms)
                       Worker 1 ──→ Target 2: NFS archive    (50ms)
                       Worker 2 ──→ Target 3: S3 bucket      (200ms)

Each target has its own worker pool, retry queue, and adaptive profile.
A slow NFS target never blocks a fast NVMe backup.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

How It Works

fxcp — Smart copy CLI, drop-in for cp/rsync. foxingd — eBPF daemon, 2ms write-to-copy.

Kernel BPF probes ──→ Ring Buffer (33MB) ──→ ReorderBuffer ──→ TransientFilter
                                                                      │
                                              TinnedDispatcher (CAKE) ◄┘
                                              ├── Control  (unbounded, W0)
                                              ├── Structural (unbounded)
                                              ├── Metadata  (1024 cap)
                                              └── Bulk      (4096 cap) ──→ W1..N
                                                                              │
                      SmartCopier ◄─────────────────────────────────────────────┘
                      ├── Tier 0.5: NFS compound RPC  (3× faster than cp)
                      ├── Tier 1:   FICLONE reflink   (instant CoW)
                      ├── Tier 2:   sendfile           (kernel zero-copy)
                      └── Tier 3:   io_uring           (async pipelined)

Auto-detects storage stack. Picks the fastest path per target. No configuration.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Storage Is Just a Network with Quirks

Key insight: apply network queueing theory to filesystem I/O.

CAKE qdisc → TinnedDispatcher
Linux CAKE classifies network packets into tins by priority. foxing classifies filesystem events the same way:

Tin Events Droppable?
Control Create, Rename, Mkdir Never
Structural Unlink, Rmdir Backpressure
Metadata Chmod, Chown, Xattr At 1024 cap
Bulk Write ranges At 4096 cap

A dropped write is caught by the next fsync or hydration scan. A dropped rename leaves a ghost file. These are not equivalent risks.

BBR congestion control → Adaptive Tuner
TCP BBR probes bandwidth and RTT to find optimal throughput. foxing's tuner does the same for storage:

  • Probe BW phase: increase queue depth, measure throughput
  • Drain phase: reduce QD when latency spikes
  • Steady state: maintain optimal QD per target
  • AIMD for NFS: additive-increase on batch size, multiplicative-decrease on timeout

Per-target tuning: NVMe QD=64, HDD QD=4, NFS adapts to RTT.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

fxcp vs the field

Workload fxcp cp rsync
Small resync (1K×4KB) 133ms 890ms 126ms
Mixed resync (505) 51ms 455ms 94ms
NFS cold (1K×4KB) 548ms 1,650ms 2,568ms
NFS krb5p resync 66ms 844ms
Daemon MTTC 2ms

koero bare-metal, NVMe XFS, v0.10.1

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Mean Time to Consistency — Positioning

Tool Detection LAN MTTC WAN MTTC Model
foxingd NVMe eBPF VFS hooks 2ms Immediate
foxingd NFS eBPF + compound RPC 23ms 30ms Immediate
DRBD Protocol C Block device 20ms 2,000ms Immediate
GPFS (AFM) Filesystem hooks 50–100ms 200ms–2s Immediate
GlusterFS sync FUSE/libgfapi 60–80ms 6–8s Immediate
CephFS sync MDS + OSD 40–60ms 4–6s Immediate
lsyncd + rsync inotify 1–10s 5–30s Delayed
Syncthing Periodic scan 60s+ 60s+ Delayed
rsync (cron) Scheduled minutes minutes Delayed

foxing operates at the file level — no matched disks (DRBD), no cluster (Ceph/GPFS), no watch limits (lsyncd). The target needs only an NFS export.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Demo: fxcp — 21 GB in 3.5 seconds

21 GB, 17K files, NVMe XFS. Reflink CoW + sendfile auto-selected.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Demo: The AI Reveal — Dublin Core xattrs

No separate indexing command. No batch job. Side effect of the copy.
Granite Embedding R2 (768-dim) + Granite 4.1 8B — local GPU, no cloud. Taxonomy: 16,927 file types.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Demo: Batch Enrichment — Three ROMs, Three Descriptions

Each file gets a unique, accurate LLM-generated description + desktop search tags.
cp -a carries all of this. No foxing needed on the destination.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Dublin Core + Six Effort Tiers

The metadata travels with the file. cp -a preserves Dublin Core xattrs.

Tier LLM? Time What it adds
none 0ms Replication only
minimal No 17ms Magika classification
quick No 100ms Archive peek, sidecar detection
balanced Yes ~1.1s Entities, domain keywords
thorough Yes ~2.5s Extended analysis + re-embedding (+11–15%)
deep Yes ~4s Full abstracts, cultural context tags

All tiers write Dublin Core xattrs (ISO 15836) — portable across any POSIX filesystem.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

No LLM? Still Useful.

Tiers 1–2 are fully deterministic, offline, and LLM-free.

What runs without any LLM:

  • Magika ONNX — 283-type ML classification (~17ms)
  • Taxonomy — 16,927 types, domain routing, DC mapping
  • Archive peek — ZIP/7z contents without extraction
  • Sidecar discovery — finds the 1 XML in 3,000 ZIPs
  • Format parsers — ROM headers, GGUF/safetensors, EXIF, PDF

What the LLM adds (tiers 3–5):

  • Natural language descriptions
  • Semantic keyword extraction
  • Re-embedding with enriched context (+11–15% search quality)

What about vision models?
The pipeline could dispatch to a VLM for image/video analysis. But the trend in frontier models is collapsing vision projectors into the base model anyway — separate VLM dispatch may be unnecessary. The architecture supports it; the need hasn't materialised.

All deterministic. All writes Dublin Core xattrs. No LLM, no cloud, no GPU.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Sovereignty: Everything Stays Local

Inside the boundary:

  • All file I/O — institutional storage
  • All AI inference — ONNX Runtime (CPU/GPU)
  • All LLM enrichment — Granite 4.1 via llama.cpp
  • All metadata — POSIX xattrs, travels with cp -a

Not used:

  • OpenAI / Azure Cognitive / AWS Kendra
  • Overseas data transfer
  • API keys or data processing agreements

The entire model stack ships under Apache-2.0.
Granite Embedding R2 + Granite 4.1 + ONNX Runtime · foxing itself is GPL-2.0-or-later.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Demo Corpus: ROMs as Research Data Analogy

A ROM ZIP on a FAT filesystem = a DICOM scan on institutional NAS.

The problem:

  • 115,000+ ROM files across 16 collections (267 GB) — opaque filenames, no metadata
  • gamelist.xml — 1 sidecar in 3,000 files (structural minority)
  • The format doesn't self-describe at the filesystem level

The pipeline:
classify → peek archives → detect sidecars → embed → enrich → pgvector

The shared vectordb:

  • pgvector stores embeddings + Dublin Core + CIDs
  • Any host can query enrichment without file access
  • Agent RAG retrieval: LLM asks pgvector, gets description + keywords + similarity — never touches the filesystem
  • Cross-host metadata: enrich on koero, query from awa
  • foxing_files, foxing_chunks, foxing_enrichments
foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

FXAR v2 — Portable CAS Archive

Content-addressable, seekable, streamable, updatable. Works on ANY filesystem.

What FXAR v2 is:

  • Gear-hash variable chunking (2KB–2MB), BLAKE3 content-addressable
  • Binary index — seekable random-access restore of individual files
  • Streaming mode — pipe over SSH/stdout, footer fallback (no seek needed)
  • Snapshots built-in — JSON manifest tracks multiple point-in-time versions; restore_latest() extracts newest; time-travel to any snapshot by name
  • Compression: none / zstd / lz4 / gzip / xz. Full metadata + xattrs preserved.
tar Borg squashfs erofs composefs OCI FXAR v2
Dedup None Rolling None Block fs-verity Layer Gear-hash CAS
Seekable No Index Mount Mount Mount Layer Yes (binary index)
Streamable Yes No No No No Pull Yes (footer)
Writable Append No RO RO RO RO Yes (updatable)
Snapshots No Yes No No No Tags Yes (built-in)
FS-agnostic Yes Repo Kernel Kernel Kernel Runtime Yes (any FS)
Encryption None Built-in None None None TLS LUKS/FS layer

Borg's trap: built-in encryption complicates key management, prevents cross-repo dedup, ties recovery to Borg tooling. FXAR delegates to LUKS. Layer cake.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

CAS Store + Object Storage

The same chunk abstraction — local filesystem, USB stick, or S3 bucket.

CAS store — any filesystem:

  • Crash-safe atomic writes (tmp→fsync→rename→dir fsync)
  • CID base32lower shard paths (chars 7–9)
  • Works on exFAT, vFAT, NTFS — no xattr needed
  • Chunks are self-verifying: the path IS the hash
  • --to-cas imports FXAR→CAS chunks
  • --from-cas exports CAS→FXAR archive
  • Batch fsync amortisation for NFS targets

S3 / object store backend:

  • S3-compatible target (MinIO, AWS)
  • GearChunker CDC — only changed chunks uploaded
  • Epoch manifests for point-in-time consistency
  • ObjectSink trait — same pipeline, different target
  • NATS JetStream for event-driven reverse sync
  • S3 webhook → foxingd pulls changed objects back

One pipeline: BPF capture → CAKE dispatch → SmartCopier → CAS dedup → S3 sync. Same chunk abstraction throughout. FXAR is the interchange format between all of these.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

eBPF as a Filesystem Primitive

One pipeline, many applications.

Application What foxing provides
Replication Event stream + SmartCopier
Semantic search Magika + ORT embeddings + Dublin Core
Compliance audit CloudEvents + BLAKE3 integrity chain
Ransomware detection Entropy classification + write patterns
Data catalogue APP provenance envelopes + xattrs
Backup verification Merkle tree + CAS dedup

2–3ms p50 MTTC. The same kernel events drive replication, indexing, auditing, and detection.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Ecosystem: Where Foxing Fits

Tool foxing's role
Globus Enriches on arrival (2ms after landing)
WEKA Should run on WekaFS as POSIX source (untested)
Spectrum Scale Should run on GPFS (untested); one binary vs three products
rsync Resync 6.7× faster; event-driven
lsyncd No watch limits; content-aware
BorgBackup Metadata survives extract
Ceph No cluster needed (CephFS untested)

Globus delivers across the WAN. WEKA provides parallel NVMe. Spectrum Scale runs exabyte GPFS. foxing should enrich, replicate, and make it searchable — validated on NFS/XFS/ext4/btrfs, theoretical on parallel FS. The copy is the starting gun.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

Ngā Mihi

Foxing — filesystem replication + AI indexing, no cloud required.

Repository: https://codeberg.org/aenertia/foxing
Docs: https://aenertia.codeberg.page/foxing/
Install: sudo dnf copr enable jwp/foxing && sudo dnf install fxcp
Taxonomy: https://codeberg.org/aenertia/filetypes — 16,927 file types, open data
License: GPL-2.0-or-later (tool) · Apache-2.0 (AI models)

Questions I'd love to discuss:

  • Has anyone tried Dublin Core xattrs for research metadata?
  • What would you want from a local-first AI indexing layer?
  • How does your institution handle findability vs sovereignty?

Joel Wirāmu Pauling · aenertia@aenertia.net
1117 unit tests · 19 adversarial tests · contributors and community needed

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix I: NFS Transport Security

Workload fxcp cp Speedup
1000×4KB AUTH_SYS 548ms 1,650ms 3.0×
1000×4KB krb5p 2,034ms 2,695ms 1.3×
100×2KB TLS 77ms Faster than cleartext
1000×4KB resync krb5p 85ms 17,065ms 200×

200×: local BLAKE3 hash check vs full re-copy through AES encryption.

kTLS: Kernel AES-GCM hardware offload — 1.3× bandwidth ceiling.
TLS eliminates the 3,952-byte krb5p block boundary → compound bypass for all files ≤16MB.
fxcp under TLS is faster than cleartext AUTH_SYS.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix II: vcop.zip — Opaque to Searchable

vcop.zip — ~2 MB. On FAT: 8 characters and a file size. No searchability.

Tier What foxing adds Time
FAT baseline Nothing. vcop.zip, ~2MB
minimal Magika: zip/application | conf: 1.0 17ms
quick Archive peek → ROM files detected, gaming domain 100ms
balanced REAL: subject="Virtua Cop; first-person shooter; polygonal graphics; light gun..." type=InteractiveResource 1.1s
deep Full description + re-embedded (+11–15% search quality) 4.2s

At every tier, Dublin Core xattrs are written. cp -a carries metadata.

Taxonomy routing: gaming domain → dc:type=InteractiveResource. Zero hardcoded rules — the filetypes registry drives the classification.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix III: Foxing vs the Ecosystem

CERN IPFS Globus WEKA Spectrum Scale Foxing
Scale 2+ EB, 170 sites Decentralized PB across WAN EB parallel NVMe EB (GPFS) Validated: 100K+ files, standard FS + S3. Parallel FS untested
Content addr. CVMFS SHA-1 (RO) CID SHA-256 MD5/SHA verify None None BLAKE3 Merkle
Replication Batch (min–hrs) Swarm GridFTP parallel Internal stripe AFM async BPF 2ms
AI metadata R&D (DaFab) None None None IBM Fusion CAS Magika+ORT+LLM
Meta portability Rucio DB Immutable CID Transfer manifest POSIX xattrs Fusion DB DC xattrs (cp -a)
Event-driven No No No (pull) No Watch (polling) CloudEvents SSE
License Mixed MIT Proprietary SaaS Proprietary Proprietary GPL-2.0

foxing is complementary, not competing. Globus delivers across the WAN. WEKA provides parallel NVMe. Spectrum Scale runs exabyte GPFS. foxing enriches on arrival and makes it searchable. The copy is the starting gun.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix IV: Storage Stack — What Foxing Detects

probe_capabilities() walks the stack at startup.

Filesystem: XFS (reflink, O_ATOMIC), btrfs, NFS 4.2, FUSE
Block: dm-crypt, VDO, LVM thin, Stratis, dm-integrity
9-variant StorageClassification tunes QD + batch per target.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix V: Why XFS

The most mature, most scalable, least buggy, and in many cases most performant filesystem on Linux.

What XFS gets right:

  • Reflink/CoW — instant zero-copy clones (FICLONE)
  • O_ATOMIC — hardware atomic writes (kernel 6.13+)
  • Scalability — proven at multi-PB, billions of inodes
  • Recoveryxfs_repair works. No exotic tooling.
  • License — GPL. No dual-license complications.
  • Enterprise proven — RHEL default since RHEL 7 (2014)

What XFS doesn't do (by design):

  • Volume management — that's LVM's job
  • RAID — that's md/dm's job
  • Checksumming data blocks — that's dm-integrity's job
  • Deduplication — that's VDO's job
  • Encryption — that's LUKS's job

Each layer does one thing well.

XFS respects the layer cake — it doesn't try to be a volume manager or re-implement components that architecturally belong in the block layer. btrfs and ZFS collapse these layers, which complicates recovery and creates single points of failure.

foxing was born on XFS — the original proof-of-concept eBPF filesystem watcher was an XFS mirror, written while experimenting with eBPF in a networking context (Open vSwitch / telco background with OpenStack).

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix VI: Get Foxing

Fedora / RHEL

sudo dnf copr enable jwp/foxing
sudo dnf install foxingd   # daemon + fxcp

Containers (quay.io/jpauling/foxing)

fxcp-rhhi-0.10.0 (77 MB) · foxingd-rhhi-0.10.0 (72 MB) — Hummingbird distroless
fxcp-ubi-0.10.0 (83 MB) · foxingd-ubi-0.10.0 (261 MB) — UBI 10, CVE-tracked

From Source

cargo build --release -p fxcp    # no BPF deps
cargo build --release -p foxingd # needs clang, libbpf

Debian/Ubuntu: from source recommended. .deb packages provided but not primary target.

Repo: codeberg.org/aenertia/foxing · License: GPL-2.0-or-later · AI: Apache-2.0

Contributors welcome. Red Hat's personal open source project policy made the enterprise-grade testing infrastructure possible. Thank you.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix VII: What's Next

FUSE transparent enrichment layer

  • Mount foxing as a FUSE filesystem in front of any storage
  • Reads pass through at native speed (kernel 6.9+ FUSE passthrough)
  • Writes trigger enrichment as a side effect — no re-tooling
  • BPF-driven metadata cache invalidation (~3ms)
  • NFS compound GETATTR batching (7 files/RPC)
  • Applications see a normal directory. Metadata appears automatically.
  • Experimental in v0.10.1 (fuse feature)

Native RPC/RDMA (RFC 8166)

  • RoCE v2 transport for NFS compound RPCs
  • Wave 1–2 implemented: RDMA CM connection, inline Send/Recv
  • SoftRoCE validated on fox-test VM
  • Wave 3+: DDP Read chunks for large writes, ConnectX-6 Dx hardware
  • Combined with kTLS: 1.3× bandwidth ceiling from AES-GCM offload

Open ADRs — proposed, not yet implemented:

  • MCP server — Model Context Protocol for LLM-native filesystem access
  • Ansible collection — fleet deployment, target management, snapshot ops
  • Cockpit plugin — web UI for replication status and event stream
  • NATS event publishing — durable distributed CloudEvents delivery
  • Webhook delivery — push CloudEvents to HTTP endpoints, HMAC-SHA256
  • Semantic data recovery — cloud-hosted FXAR recovery journal, BLAKE3 Merkle-guided surgical chunk repair, bitrot detection
  • Fleet AutoRAG — DaemonSet foxingd on Kubernetes, filesystem-native semantic search across nodes

Community:

  • Built by one person — now needs a community
  • Contributors welcome — codeberg.org/aenertia/foxing
  • 31 ADRs document the design decisions and rationale
foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix VIII: FAQ — Hardest Challenges

The architecture was never the problem. Stabilising the data pipeline for edge cases was.

The CQRS event model + CAKE dispatcher + BBR tuner has been solid throughout. The hard bugs were all in the copy path and event processing edges:

# Challenge Root cause Lesson
1 45× NFS slowdown io_uring 4KB buffers → 2,560 RPCs per 10MB file Instrument your actual syscall patterns, not your model of them
2 375 corrupted files undetected Post-copy signature stored source hash, not target Self-confirming verification is invisible corruption
3 BPF swallows single-write files Aggregator never flushed on close() Add __fput probe — the actual kernel release path
4 Ghost files from rename chains CREATE fires before write completes → 0-byte copy Inline heal on size mismatch + WAL storm suppression
5 io_uring inflight counter → u64::MAX Unknown CQE op type didn't decrement counter 60s stall timeout. Always decrement in the default arm
6 Recovery scan panic Handle::current() in std::thread::spawn Store the tokio handle, don't assume runtime context
7 Storm registry broke basic replication Looked correct, empirically wrong. Reverted. Integration test before merge, always
8 Sparse fallocate destroys holes fallocate(mode=0) allocates all blocks Skip fallocate on sparse; re-punch holes in io_uring
9 NFS xattr BPF amplification Enrichment xattr writes fire BPF events → copy loop Disable SetXattr handler; PID filtering pending
10 Embedding dims 384 vs 768 Hardcoded fallback wrong for production model Match the constant to the deployed model, not the dev one
foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix IX: Visual Identity — Work in Progress

The name: "Foxing" is the archival term for degradation spots on old mirrors — the rusting of desilvered glass. A mirror written in Rust.

The duality: Raw data → Refined metadata. The yin-yang concept art captures this — one fox is line art (the opaque file), the other is enriched with colour and context (Dublin Core, embeddings, knowledge).

Current exploration:

  • Commissioned concept art from NZ/international artists
  • Exploring tukutuku and kōwhaiwhai design elements with appropriate cultural consultation
  • Toi Iho (Māori arts mark) pathway under consideration
  • The retro pixel art in this talk is placeholder — the real identity is being developed with care

Design principles:

  • Black, grey, purple, teal palette (established)
  • Dark theme matching the benchmark graphs
  • The fox as mirror — duality of raw and refined
  • NZ design identity, not generic tech branding
  • Respect for mātauranga Māori in any cultural elements
  • Open to collaboration with NZ designers

Why this matters for the project:
A visual identity that connects to place and purpose is more than branding. For a project built in Aotearoa, grounded in kaitiakitanga principles, the visual language should reflect that whakapapa — not just look like another Silicon Valley open source logo.

foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

🔬 Appendix X: References

eBPF & Kernel I/O

  • Nakryiko, A. "BPF ring buffer." 2020. nakryiko.com/posts/bpf-ringbuf/
  • Gregg, B. BPF Performance Tools. Addison-Wesley, 2019.
  • Höiland-Jørgensen, T. et al. "The eXpress Data Path." CoNEXT, 2018.

Network Queueing → Storage

  • Täht, D. et al. "The CAKE Qdisc." IETF draft, 2018. bufferbloat.net
  • Cardwell, N. et al. "BBR: Congestion-Based Congestion Control." ACM Queue 14(5), 2016.
  • Chiu, D-M. & Jain, R. "Analysis of the Increase and Decrease Algorithms for Congestion Avoidance." J. Computer Networks & ISDN Systems 17, 1989.

Content-Addressed Storage

  • Bonwick, J. "ZFS Deduplication." USENIX FAST poster, 2009.
  • Quinlan, S. & Dorward, S. "Venti: A New Approach to Archival Storage." USENIX FAST, 2002.
  • IPLD CID Specification. github.com/multiformats/cid

Hashing & Integrity

  • O'Connor, J. et al. "BLAKE3." 2020. github.com/BLAKE3-team/BLAKE3-specs
  • Merkle, R. "A Digital Signature Based on a Conventional Encryption Function." CRYPTO, 1987.

AI Content Classification

  • Sivakorn, S. et al. "Magika: AI-Powered Content-Type Detection." Google, 2024. github.com/google/magika
  • Brady, W. et al. "Algorithm-mediated social learning in online social networks." Trends in Cognitive Sciences 27(10), 2023.
  • Sperber, D. et al. "Epistemic vigilance." Mind & Language 25(4), 2010.

Data Sovereignty

  • Te Mana Raraunga. "Māori Data Sovereignty Principles." 2018. temanararaunga.maori.nz
  • Kukutai, T. & Taylor, J. Indigenous Data Sovereignty. ANU Press, 2016.
  • CARE Principles for Indigenous Data Governance. Global Indigenous Data Alliance, 2019.

Filesystem & Replication

  • Rodeh, O. et al. "BTRFS: The Linux B-Tree Filesystem." ACM TOS 9(3), 2013.
  • Rehn, A. "XFS: The Big Storage File System." SGI, 2003.
  • Schmuck, F. & Haskin, R. "GPFS: A Shared-Disk File System for Large Computing Clusters." USENIX FAST, 2002.

Dublin Core & Metadata Standards

  • ISO 15836:2017. Dublin Core Metadata Element Set.
  • AI Provenance Protocol (APP). foxing v0.10.0, ADR-Dublin-Core-and-APP.
  • freedesktop.org. "Extended file attributes." xattr(7).
foxing v0.10.1 · NZRS 2026 · codeberg.org/aenertia/foxing

notes:

notes: [TIMING: 60s | PRIME: Ingroup+Prestige+Emotional] Ko Taranaki te maunga. Ko Patea te awa. Ko Joel Wirāmu Pauling tōku ingoa. Nō Pōneke ahau. He tangata hangarau ahau. Kia ora koutou katoa. So — I'm Joel, I'm a geek based in Wellington. Solution architect at Red Hat by day — networking, containers, Linux. And this is foxing — a filesystem replication tool written in Rust that accidentally grew an AI indexing layer. Built on evenings and weekends. I came to this from telco — Open vSwitch, OpenStack, eBPF for packet inspection. foxing started when I pointed those same eBPF probes at filesystem events instead of network packets. My other life is psychology — Masters at Te Herenga Waka. My thesis was on how people construct common-sense frameworks around intellectual and creative work in a networked world, at a time when the copyright and patent grounding was already straining. Generative AI has shattered the tenuous thread that barely survived the last two decades. I'm exploring a PhD on that question now. I want to show you what foxing does and why the approach matters for research data in Aotearoa.

notes: [TIMING: 15s | PRIME: Emotional] Mandatory dog and cat tax. This is the real infrastructure — the dog sits under the desk, the cat sits on the keyboard.

notes: [TIMING: 60s | PRIME: Moral+Ingroup] Here's the tension. DICOM scans at Otago, NetCDF climate models at NIWA, FASTQ sequences at Genomics Aotearoa, acoustic telemetry VRL files tracking tuna and piharau — none of these carry meaningful metadata at the filesystem level. The metadata lives in spreadsheets, lab notebooks, or filename conventions. You could solve this with a cloud AI service — Azure Cognitive Search, AWS Kendra — beautiful semantic search. But now your research data is in someone else's data centre. For institutions operating under Te Mana Raraunga, that's not an option. Koto Qalo's talk earlier grounded this in Pacific digital sovereignty. In te ao Māori, this tension has a name — kaitiakitanga. The guardian doesn't own the taonga; they hold it for those who come after. That's the design principle foxing is built on.

notes: [TIMING: 55s | PRIME: Prestige+Emotional] This is the core design decision. RAID1 gives you mirroring but chains you to matched disks and the speed of the slowest member. RAID5/6 add erasure coding overhead to every I/O. Hardware controllers are opaque black boxes with their own failure domains. foxing decouples the source from all targets. Source writes at full NVMe speed. eBPF captures the event. Each target has its own worker pool — NVMe in 2ms, NFS in 50ms, S3 in 200ms. If NFS goes down, NVMe keeps replicating. The NFS workers pause, events drain to a journal, and when the mount comes back, a targeted recovery scan replays exactly the missed files. Your fast storage is never held hostage by your slow storage. That's the name — the Quick Fox jumps over the Lazy Dog.

notes: [TIMING: 45s | PRIME: Prestige] Two components. fxcp is the standalone tool — drop-in for cp or rsync, no root needed, runs on any Linux box. foxingd is the daemon — eBPF probes capture every filesystem write at the kernel level. No inotify watch limits, no polling, no scanning. The copy engine auto-selects the right method per target — reflink for same-device XFS, compound NFS RPCs for network targets, io_uring for cross-device large files. You don't configure this. It probes capabilities at startup. For NFS targets, fxcp is 3× faster than cp because it packs OPEN+WRITE+CLOSE into a single compound RPC instead of four separate round-trips.

notes: [TIMING: 55s | PRIME: Prestige+Emotional] I first encountered CAKE working with Dave Täht on the Bufferbloat project — building OpenWrt builds for cheap WiFi access points. Dave's insight was that you could classify traffic into tins by priority — voice packets never get dropped, bulk downloads get dropped freely. That idea stuck with me. When I started building foxing from my Open vSwitch and eBPF background, the realisation hit: filesystem events ARE a flow. Renames are control-plane. Writes are bulk data. A dropped write is caught by the next fsync. A dropped rename leaves a ghost file. These are not equivalent risks — exactly the asymmetry CAKE handles in network QoS. The BBR half is the same intuition. TCP BBR probes bandwidth by increasing send rate and measuring RTT. foxing does the same for storage — probes queue depth, measures completion latency, adapts per target. NVMe at QD=64, HDD at QD=4, NFS using AIMD on compound RPC batch size. TCP congestion control, applied to NFS WRITE RPCs.

notes: [TIMING: 35s | PRIME: Prestige] The numbers. Small file resync — 6.7× faster than cp. NFS — 3× faster via compound RPC bypass. Delta efficiency — 9.8× on large file resync because BLAKE3 Merkle skips unchanged chunks. Event latency — foxingd's 2ms MTTC is unique, no other open-source tool does event-driven file replication at that speed. Integrity — BLAKE3 checksums at zero overhead because the hash is already computed for delta detection.

notes: [TIMING: 35s | PRIME: Prestige] This table is why the RAID1 analogy matters. DRBD gives you 20ms but requires identical block devices and replicates ALL I/O — journals, temp files, everything. Ceph needs a 3-node minimum cluster. lsyncd hits inotify watch limits. foxingd achieves 2ms with zero infrastructure beyond an NFS export on the target. The source writes at full speed, the target catches up at its own pace.

notes: [TIMING: 30s | PRIME: Prestige] This is fxcp copying 21 GB — 17,441 files — in 3.5 seconds. 6.2 GB/s. The output shows copy method selection: 17,438 files via reflink, instant CoW, zero I/O. On resync, it checks directory hashes, skips unchanged subtrees — 38ms. Same principle as git, applied to filesystem sync.

notes: [TIMING: 35s | PRIME: Emotional+Prestige] This is the reveal moment. getfattr on vcop.zip — before enrichment: nothing. After: Dublin Core description, subject keywords, format, type, desktop search tags. user.dublincore.description says it's a first-person shooter with light gun mechanics and polygonal graphics. That was written by Granite 4.1 running locally on GPU — no cloud API, no data leaving the machine. This is the sovereignty argument made tangible.

notes: [TIMING: 35s | PRIME: Prestige+Moral] Now scale and accuracy. Three different ROMs, three unique descriptions. Virtua Cop — correctly identified as a first-person shooter with light gun mechanics. Sega Rally — a racing game with four tracks. Sonic Championship — a fighting game by Sega AM2. The LLM doesn't hallucinate. And here's the portability clincher: all of this survives cp -a. No foxing needed on the destination. Dublin Core is ISO 15836, xattrs are POSIX — international standards on a POSIX filesystem primitive. Your metadata isn't locked into any vendor's database.

notes: [TIMING: 45s | PRIME: Prestige+Moral] Six tiers, same file. None skips enrichment. Minimal and Quick are fully LLM-free, offline — Magika classification and filename-derived tags. Balanced brings in the LLM. At thorough and deep tiers, foxing re-embeds the file using the LLM's output — search quality improves 11–15%. The portability story is the strongest sovereignty argument. Dublin Core is ISO 15836. Extended attributes are POSIX. This isn't a proprietary metadata format — it's an international standard written to a POSIX filesystem primitive. The metadata travels with the file. No database to maintain, no vendor to depend on.

notes: [TIMING: 50s | PRIME: Prestige+Moral] This surprised me. I expected the LLM to be the value. It's not — the deterministic pipeline is. It's a semantic router for your filesystem. Before any file hits Magika or the LLM, the collision map — 3,029 ambiguous extensions generated from the taxonomy's 16,927 entries — gates the dispatch. A .vcf in a genomics directory routes to bioinformatics, not vCard. A Cargo.toml in a Rust project routes to TOML, not Lean 4. Magika is Google's open-source content detection model — trained on millions of files, but it still only reliably detects about 283 types. The real world has 16,927. So before anything reaches the embedding model, we need to gate it. The collision map — 3,029 ambiguous extensions — disambiguates first. For 60% of files, taxonomy confidence is high enough to skip Magika entirely. When Magika does run and its confidence is low on a collision-prone extension, the gate fires and falls back to taxonomy routing. By the time a file reaches the embedding model, all the deterministic content is already resolved — collision class, taxonomy domain, Dublin Core type, foxing group, enrichment hints, confidence gate status. The embedding model receives a fully contextualised input with the taxonomy's embed_string prepended, not a raw byte stream. You don't throw files at a vector model and hope — you route them there with everything the deterministic pipeline already knows. And the whole stack — taxonomy lookup, collision disambiguation, Magika classification, metadata extraction, embedding — adds about 100 milliseconds per file. That's the cost of making a file searchable, with no LLM in the loop. No LLM, no GPU, no network. The LLM adds natural language descriptions at tier 3+ and re-embedding improves search 11–15%. But the router alone produces useful, portable, standards-compliant metadata.

notes: [TIMING: 55s | PRIME: Moral+Ingroup] As Koto Qalo said 35 minutes ago — a system can pass its health check and still violate the authority model of the community it serves. foxing's architecture is designed so the authority model is always the institution, never the vendor. Who controls the metadata? You — it's in POSIX xattrs on your filesystem. Where does the data travel? Nowhere — LLM inference runs via llama.cpp on your GPU, models are Apache-2.0. Who can search it? Whoever you give pgvector access to. There's a gold rush right now to add vector-enriched storage as a cloud value-add. Each ecosystem wants your data as a differentiator for its own embedding models. When you upload your research corpus, you're contributing training signal. foxing inverts this. Enrichment runs on your hardware, vectors stay in your pgvector. Your data improves your search quality, not theirs.

notes: [TIMING: 40s | PRIME: Ingroup+Prestige] Why ROMs? Because a ROM ZIP on a FAT filesystem is structurally identical to a DICOM scan on institutional NAS — nine characters and a file size, no description, no searchability. The demo corpus is 115,000 files across 16 collections. foxing's structural minority detection spots the one XML in 3,000 ZIPs — that must be metadata. Swap galaga.zip for a NetCDF climate model — same pipeline. The enrichment also syncs to pgvector, so any host on the network can query descriptions and embeddings without touching the filesystem. Enrich on one machine, query from anywhere.

notes: [TIMING: 45s | PRIME: Prestige+Moral] FXAR v2 is foxing's archive format — gear-hash variable chunking with BLAKE3 content-addressed storage. Content-defined boundaries survive insertions, so modifying 100 bytes in a 10 GB database only re-chunks the affected region. The format is both seekable and streamable — binary index on disk, footer fallback for piping over SSH. Look at the Writable row in this table. Every other format is read-only after creation. FXAR is updatable. And on Borg's encryption: Borg re-implements AES-CTR inside the archive format, which means your recovery depends on Borg tooling. FXAR delegates to LUKS. The encryption layer does encryption, the archive layer does archiving. Layer cake.

notes: [TIMING: 35s | PRIME: Prestige] The CAS store makes foxing filesystem-agnostic. It breaks files into content-addressed chunks stored in a directory tree sharded by BLAKE3 CID. Works on exFAT, vFAT, NTFS — no xattr support needed. The chunks are self-verifying — the filename IS the hash. The S3 backend uses the same model over HTTP. GearChunker CDC means modifying 100 bytes in a 10 GB file uploads one chunk, not the whole file. Same abstraction end to end — BPF events, CAKE dispatch, SmartCopier, CAS dedup, S3 sync. FXAR is the interchange format connecting all of it.

notes: [TIMING: 40s | PRIME: Ingroup+Prestige] Today at this conference I've heard multiple talks discussing the same problem — fish identification pipelines, beach survey processing, mitochondrial data extraction. There's always a moment where someone says "it would be nice if this ran automatically when new data arrives." Everyone solves it with cron jobs and polling scripts. What if the act of copying the file became the starting gun? foxingd emits a CloudEvents envelope with the BLAKE3 hash, content classification, Dublin Core metadata. Your downstream pipeline triggers the moment the file lands. One pipeline, many applications — replication, semantic search, compliance auditing, ransomware detection. One primitive, composed.

notes: [TIMING: 35s | PRIME: Ingroup+Prestige] foxing is complementary, not competing. REANNZ just told us their datagrid metadata sits in a spreadsheet that gets manually transformed to JSON. That's the gap. Globus delivers the bytes, WEKA provides the NVMe, Ceph-S3 stores the archive — but nobody automatically enriches what arrives or moves data between storage classes based on content. foxing does. It's been tested with hundreds of thousands of files on standard filesystems and S3-compatible object storage. WEKA and GPFS are theoretical — standard POSIX hooks should work, but untested on parallel FS. One binary, GPL, runs on any Linux box with an NFS export.

notes: [TIMING: 25s | PRIME: Emotional+Ingroup] The repo is on Codeberg, packages in Fedora COPR. 1117 unit tests, 19 adversarial scenarios, 31 ADRs. Built by one person — now needs a community. If you work with research data, if you've dealt with the metadata problem, if you know Rust or eBPF or NFS — I'd genuinely welcome contributors. Ngā mihi nui. Questions?

notes: The TLS number is the sleeper — fxcp under TLS is actually faster than cleartext AUTH_SYS. That's because kernel kTLS offloads the encryption to hardware AES-GCM, and TLS eliminates the 3,952-byte krb5p AES block boundary that limits the compound bypass under Kerberos privacy. The 200× krb5p resync is real — fxcp checks the BLAKE3 hash locally, while cp re-reads and re-writes every file through the encryption layer.

notes: This is the money shot. vcop.zip — eight characters. Minimal tier: Magika classifies it as a ZIP. Quick tier: foxing peeks inside the archive and detects ROM files, routing to the gaming domain. Balanced tier: the LLM writes real Dublin Core — subject="Virtua Cop; first-person shooter; polygonal graphics; light gun; police officer; shooting; powerups", type=InteractiveResource. These are the actual xattrs from the overnight enrichment run on /vol/nfs_final/roms/model2/vcop.zip. Deep tier: full description generated and the file is re-embedded — search quality improves 11–15%. Taxonomy routing: gaming domain maps to dc:type=InteractiveResource. Zero hardcoded rules — all classification flows from the filetypes registry at runtime. Swap vcop.zip for a DICOM scan or NetCDF climate model — the pipeline is the same.

notes: This expanded table includes the tools discussed today at NZRS plus IBM Spectrum Scale, which is the elephant in the room for enterprise research storage. Spectrum Scale is GPFS — the parallel filesystem that runs at most national labs and large HPC centres. It's exabyte-proven, it has AFM for async replication between clusters, and IBM bolted Fusion CAS on top for AI search at 100-billion-vector scale. The problem: it requires three products (Scale, Fusion, Discovery), TiB-based licensing, and a dedicated GPU stack for the AI layer. foxing is one binary. Globus is the WAN transfer layer that Claire Rye and Anthony Shaw presented — GridFTP with parallel streams, checksum verification, third-party transfers between institutional endpoints. foxing doesn't do GridFTP. What foxing does is take custody once data lands at your local endpoint — within 2ms, it replicates, classifies, writes Dublin Core xattrs, and publishes a CloudEvents notification. WEKA is the distributed parallel NVMe filesystem that REANNZ provides for HPC workloads. foxing runs on a WekaFS mount as a standard POSIX source. BPF probes capture VFS writes, no WekaFS-specific code. CERN's CVMFS remains the real prior art for content-addressed distribution — SHA-1 Merkle since 2008. But it's read-only software distribution, not continuous file replication with AI enrichment. The key differentiator: foxing is the only tool that writes machine-readable Dublin Core metadata to the filesystem as a side effect of copying, and the only one that publishes real-time CloudEvents when files are replicated.

notes: This is the layer cake. When foxing starts, probe_capabilities walks the entire storage stack beneath each target path. It detects the filesystem type, checks for reflink support, probes O_DIRECT alignment, walks the device-mapper stack looking for LUKS encryption layers, VDO dedup, LVM thin provisioning, Stratis pools, and dm-integrity tags. Each layer changes the optimal I/O strategy. LUKS2 uses 4096-byte sectors — DIO alignment gets clamped. VDO dedup means you don't want to pre-allocate sparse files. Stratis gives you D-Bus pool monitoring and zero-cost reflink snapshots. dm-cache means your SSD is fronting a HDD — queue depth should target the SSD, not the HDD. The 9-variant StorageClassification feeds into the adaptive BBR tuner so each target gets optimal queue depth and batch sizing regardless of what's underneath. This is why the RAID1 analogy works — you can have an NVMe target on raw XFS and an HDD target on LUKS+LVM+VDO and foxing adapts to each independently.

notes: This is an opinionated slide and I'll own that. XFS is the default filesystem on RHEL and has been since RHEL 7 in 2014. It's the most tested, most scaled, and most conservatively engineered filesystem on Linux. The key design principle is that XFS is a filesystem and only a filesystem. It doesn't try to be a volume manager like btrfs, or a RAID controller like ZFS. Those are separate concerns with separate failure modes and separate recovery tools. When your btrfs RAID1 array has a metadata corruption, you're debugging a filesystem, a volume manager, and a RAID controller all fused into one codebase with one recovery tool. When your XFS-on-LVM-on-LUKS stack has a problem, you can isolate which layer failed and fix it independently. xfs_repair works. dm-crypt is transparent. LVM metadata is separate. That's the Unix philosophy applied to storage. foxing started on XFS — the original proof of concept was an eBPF watcher that mirrored XFS writes to a second mount. I was working on Open vSwitch and OpenStack at the time, messing around with eBPF for network packet inspection, and realised the same tracing infrastructure could capture filesystem events. The first version was about 200 lines of C that attached to xfs_file_write_iter and copied files to a target directory. Everything since then — the CAKE dispatcher, the Merkle trees, the AI pipeline — grew from that XFS mirror.

notes: Two ways to get foxing. For Fedora and RHEL, COPR packages are the easiest — dnf copr enable, dnf install, done. foxingd is the superset binary — it includes fxcp via symlink dispatch, so installing foxingd gives you both. Container images on quay.io come in two flavours: Fedora Hummingbird is distroless — the binary is literally the only thing in the image, 72 MB for foxingd. UBI 10 Minimal participates in the RHEL ecosystem with signed packages and CVE tracking. For Debian and Ubuntu, building from source is genuinely the best path — the RPM packaging and systemd integration are RHEL-focused and the .deb packages are provided as a courtesy but aren't a primary target. I want to acknowledge Red Hat here. Their policy on personal open source projects is why this exists at the quality level it does. The code is mine, written on my own time, but the testing infrastructure — the IPA domain, the Kerberos realm, the NFS exports, the Stratis pools — that's what turns a hobby project into something with 1117 unit tests and 19 adversarial scenarios. Not every employer lets you use enterprise infrastructure for personal projects. Red Hat does, and it matters.

notes: If someone asks "what was the hardest part" — it wasn't the architecture. The CQRS event model, the CAKE dispatcher, the BBR adaptive tuner — those have been solid since they were designed. The hard part was stabilising the data processing pipeline for edge cases. The 45× NFS slowdown was the most embarrassing — io_uring registered buffers were 4KB, generating 2,560 NFS WRITE RPCs per 10MB file while cp generated 10. One conditional fixed it. The 375 corrupted files were the most dangerous — the post-copy verification was comparing the source hash against itself, so corrupted targets passed verification silently. Self-confirming verification is a pattern that can hide in any replication system. The BPF write aggregator swallowing single-write files was the most subtle — it only manifested with cp and dd, not with Python's write+fsync pattern that the test suite used. Adding the __fput probe to flush on file handle close fixed it. Everything since stabilising those copy-path edge cases has been cream — the AI enrichment pipeline, the taxonomy system, NFS transport security, RDMA. The architecture carries them without strain. That's the validation: if the foundation is right, features compose.

notes: Last slide. The visual identity is a work in progress and I'm being deliberate about it. The name 'foxing' comes from archival science — it's the brownish spots on old mirrors where the silver has degraded. A mirror written in Rust. The concept art you see in the repo explores a yin-yang duality — raw data on one side, enriched metadata on the other. One fox is line art, the other is full colour with nature and technology elements. I've been in conversation with NZ artists about incorporating tukutuku and kōwhaiwhai design elements into the project identity. That requires proper cultural consultation — not downloading a pattern from the internet and slapping it on a logo. The Toi Iho pathway — the Māori arts authenticity mark — is something I'm exploring as a governance mechanism. If foxing uses cultural design elements, there should be an accountable relationship behind them, not just aesthetic borrowing. The retro pixel art sprites in this presentation are placeholder fun. The real visual identity is being developed with the same care as the code — one step at a time, with respect for the people and knowledge systems it draws from. If anyone here has connections to NZ designers working at the intersection of technology and indigenous design, I'd welcome an introduction.

notes: Reference list for anyone who wants to follow the threads. The Brady PRIME framework paper is the one that connects the AI trust question to the sovereignty framing. Sperber's epistemic vigilance is the evolutionary account of why people need to evaluate the source of claims, which is directly relevant to AI-generated metadata.