# Arrow 58 on skade — the absolutely-no-context guide
You opened the skade repo, ran `cargo build`, and it pulled crates from folders
called `iceberg-arrow58` next door. You want to know: **what is this, will it
break, and when does it go away?** Three questions, three answers. No data-lake
knowledge assumed — for that start at [`dummy-guide.md`](dummy-guide.md). The
full, precise writeup is [`releases.md`](releases.md); this page is the "I just
need the gist" version.
## The 30-second version
skade reads and writes data using a library called **Arrow** (the in-memory
columnar format) and **Parquet** (the on-disk file format). There's a new major
version of both — **58**, up from 57. skade now uses 58.
The snag: skade sits on top of **iceberg-rust**, and the newest published
iceberg-rust (0.9.1) is still stuck on Arrow **57**. Arrow majors don't mix — the
whole stack has to agree on one number. So we made two **temporary copies** of
the iceberg crates with the version bumped to 58, and told skade to use those
copies instead of the ones from the internet:
```toml
# skade/skade/Cargo.toml — the magic lines
[patch.crates-io]
iceberg = { path = "../../iceberg-arrow58" }
iceberg-datafusion = { path = "../../iceberg-datafusion-arrow58" }
```
`[patch.crates-io]` means "when something asks for `iceberg`, give it the crate
in *this folder* instead of the one from crates.io." That's all.
![Diagram: skade's Cargo.toml uses [patch.crates-io] to redirect iceberg and iceberg-datafusion to local arrow-58 fork folders; cargo build resolves to the forks and builds clean on arrow 58, while cargo publish strips the patch so published skade still depends on stock iceberg 0.9.1 on arrow 57.](assets/arrow58_patch_fork.svg)
## "How do I build skade on Arrow 58?"
You already did — there's **nothing extra to do**. Just make sure the two sibling
folders exist next to your skade checkout:
```
git/
├── skade/ ← you are here
├── iceberg-arrow58/ ← needed
└── iceberg-datafusion-arrow58/ ← needed (only for the `sql` feature)
```
Then, from the **detached** `skade/skade/` workspace (not the repo root — the
root is the `skade-katalog` workspace):
```console
$ cd skade/skade
$ cargo check # core writer/reader
$ cargo check --features sql # + DataFusion SQL
```
Both finish clean. The only noise is three `warning: use of deprecated …
to_naive_date` lines coming from inside the `iceberg-arrow58` fork — Arrow 58
renamed a function. They're warnings, not errors, and they're upstream iceberg's
code, not skade's. Ignore them.
> Gotcha: `cargo check -p skade` from the **repo root** fails with `package ID
> specification 'skade' did not match any packages`. That's expected — `skade`
> lives in its own detached workspace under `skade/skade/`. `cd` in first.
## "Where's the perf patch? Did we lose it?"
No. skade's SQL has long carried a speed hack: it makes DataFusion read every
data file **in parallel** (one CPU core per file) instead of one-file-at-a-time
on a single core — roughly **8× faster** on a 32-core machine. That hack lives in
two files inside the **datafusion** fork:
```
iceberg-datafusion-arrow58/src/physical_plan/scan.rs ← the patch (look for "LOCAL PATCH")
iceberg-datafusion-arrow58/src/table/mod.rs
```
It used to be vendored at `skade/bench/vendor/iceberg-datafusion` (still on disk
for reference). When we made the Arrow 58 fork, we copied the patch over verbatim.
It's only active behind skade's `sql` feature, so a plain `cargo build` never
touches it.
## "Does this affect the published skade?"
**No.** `[patch.crates-io]` is a *local-only* trick — `cargo publish` deletes it
automatically. So the skade you'd get from crates.io still depends on the normal
iceberg 0.9.1 on Arrow 57. Only *your* local builds, tests, and benchmarks get
Arrow 58 and the perf patch. nornir's release path doesn't see any of it either
(nornir takes skade with `default-features = false`, so no DataFusion at all).
## "When do I delete the forks?"
The moment **upstream iceberg-rust ships a release built on Arrow 58** (probably
0.10). Then:
1. Open `skade/skade/Cargo.toml`.
2. Delete the two `[patch.crates-io]` lines above.
3. Bump the `iceberg` / `iceberg-datafusion` version requirements to the new
release.
4. Delete the `iceberg-arrow58` and `iceberg-datafusion-arrow58` folders.
One caveat for the *second* fork: even after Arrow 58 lands upstream, keep the
perf patch until iceberg-datafusion also ships parallel per-file scanning
natively. Two separate conditions — details in
[`releases.md`](releases.md#the-perf-patch-is-not-lost--it-moved-into-the-arrow-58-fork)
and the fork's own `.nornir/README.md`.
## Where to go next
- The precise, no-hand-waving version of all of this → [`releases.md`](releases.md)
- What skade even *is* → [`dummy-guide.md`](dummy-guide.md) → [`design.md`](design.md)
- The forks themselves → `../../iceberg-arrow58/.nornir/README.md`,
`../../iceberg-datafusion-arrow58/.nornir/README.md`