icepick
Experimental client for Apache Iceberg in Rust
icepick provides simple access to Apache Iceberg tables in AWS S3 Tables and Cloudflare R2 Data Catalog. Built on the official iceberg-rust library, icepick handles authentication, REST API details, and platform compatibility so you can focus on working with your data.
Why icepick?
Why not use iceberg-rust? This project targets WASM as a compilation target (not yet supported in iceberg-rust) and focuses on "serverless" catalogs that implement a subset of the overall Iceberg specification.
Features
Catalog Support
- AWS S3 Tables — Full support with SigV4 authentication (native platforms only)
- Cloudflare R2 Data Catalog — Full support with bearer token auth (WASM-compatible)
- Direct S3 Parquet Writes — Write Arrow data directly to S3 without Iceberg metadata
Developer Experience
- Clean API — Simple factory methods, no complex builders
- Type-safe errors — Comprehensive error handling with context
- Zero-config auth — Uses AWS credential chain and Cloudflare API tokens
- Production-ready — Used in real applications with real data
Platform Support
| Catalog | Linux/macOS/Windows | WASM (browser/Cloudflare Workers) |
|---|---|---|
| S3 Tables | ✅ | ❌ (requires AWS SDK) |
| R2 Data Catalog | ✅ | ✅ |
| No Catalog (direct parquet to object storage) | ✅ | ✅ |
Note: R2 Data Catalog and direct Parquet writes are fully WASM-compatible, making them suitable for Cloudflare Workers, browser applications, and other WASM environments.
Installation
Add to your Cargo.toml:
[]
= "0.1"
Quick Start
AWS S3 Tables
use S3TablesCatalog;
async
Cloudflare R2 Data Catalog
use R2Catalog;
async
Authentication
AWS S3 Tables
Uses the AWS default credential provider chain in the following order:
- Environment variables (
AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY) - AWS credentials file (
~/.aws/credentials) - IAM instance profile (EC2)
- ECS task role
Important: Ensure your credentials have S3 Tables permissions.
Cloudflare R2 Data Catalog
Uses Cloudflare API tokens. To set up:
- Log into the Cloudflare dashboard
- Navigate to My Profile → API Tokens
- Create a token with R2 read/write permissions
- Pass the token when constructing the catalog
Direct S3 Parquet Writes
Need to write Parquet files directly to S3 for external tools (Spark, DuckDB, etc.) without Iceberg metadata? Use the arrow_to_parquet function:
use ;
use ;
use ;
use RecordBatch;
use Compression;
use Arc;
async
Note: This writes standalone Parquet files without Iceberg metadata. For writing to Iceberg tables, use the Transaction API instead.
Examples
Explore complete working examples in the examples/ directory:
| Example | Description | Command |
|---|---|---|
s3_tables_basic.rs |
Complete S3 Tables workflow | cargo run --example s3_tables_basic |
r2_basic.rs |
Complete R2 Data Catalog workflow | cargo run --example r2_basic |
Development
Running Tests
WASM Build
Verify R2Catalog compiles for WASM:
Code Quality
# Format code
# Run linter
# Check documentation
Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
Acknowledgments
Built on the official iceberg-rust library from the Apache Iceberg project.