Skip to main content
Tasks are interactive execution environments built into the platform. Each task gives you a persistent Python or TypeScript sandbox with your catalogs, lake tables, and external connections already wired in - no credentials to configure, no installs to run.
The Python sandbox runs Python 3.13 and comes with the following libraries pre-installed:
LibraryPurpose
polarsDataFrame processing
pandasDataFrame processing
duckdbIn-process SQL
pyicebergIceberg catalog client
numpyNumerical computing
matplotlibPlotting
pyarrowArrow/Parquet I/O

The oleander module

Every cell has access to a generated oleander module that wires your catalog and DuckDB connection automatically:
# Pre-wired DuckDB connection with all your Iceberg catalogs attached
conn = oleander.conn

# Default Lakekeeper catalog as a pyiceberg catalog object
catalog = oleander.default_catalog

# Get any registered catalog by name
my_catalog = oleander.get_catalog("my_catalog_name")
Query your lake directly:
result = conn.execute("SELECT * FROM oleander.default.flowers LIMIT 10").df()
result
Use pyiceberg for low-level catalog operations:
table = catalog.load_table("default.flowers")
df = table.scan().to_pandas()
df.head()

BigQuery

If you have BigQuery connections configured, the DuckDB bigquery extension is installed automatically. BigQuery tables are accessible as connection_name.dataset.table:
result = conn.execute("""
  SELECT date, SUM(revenue) AS total
  FROM my_bq.analytics.orders
  WHERE date >= '2024-01-01'
  GROUP BY 1
  ORDER BY 1
""").df()

State persistence

Variables persist across cell executions within a session. If you define a DataFrame in one cell, it is available in the next. State is stored in /tmp/_oleander_state.pkl and survives cell reruns.

Output

DataFrames are displayed as structured tables. Matplotlib figures are rendered as inline SVG. Other values are printed as text.

Code generation

Each cell has an assist button that generates code based on your prompt, aware of your available libraries and catalog structure. Generated code appears as a new cell ready to run.

Spark cells

Submit inline PySpark code as a managed Spark job directly from a task cell. The job runs in the oleander.tasks namespace and returns a run ID you can track in the platform. Lineage from Spark cell runs is captured automatically.