File I/O in Rust Golem Agents

SkillFiles & storage

Reading and writing files from a Rust Golem agent. Use when the user asks to read files, write files, or do filesystem operations from agent code in Rust.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the File I/O in Rust Golem Agents skill

What this skill tells your AI

The instructions your AI receives, as published by golemcloud/golem in golem-skills/skills/rust/golem-file-io-rust/SKILL.md and read by ahel’s review.

Overview

Golem Rust agents compile to wasm32-wasip1 which provides WASI filesystem access. Use the standard std::fs module for all filesystem operations — it works out of the box with WASI.

To provision files into an agent's filesystem, load the golem-add-initial-files skill.

Reading Files

Text Files

use std::fs;

let content = fs::read_to_string("/data/config.json")
    .expect("Failed to read file");

Binary Files

use std::fs;

let bytes = fs::read("/data/image.png")
    .expect("Failed to read file");

Writing Files

Only files provisioned with read-write permission (or files in non-provisioned paths) can be written to.

use std::fs;

fs::write("/tmp/output.txt", "Hello, world!")
    .expect("Failed to write file");

Appending to Files

use std::fs::OpenOptions;
use std::io::Write;

let mut file = OpenOptions::new()
    .append(true)
    .create(true)
    .open("/tmp/agent.log")
    .expect("Failed to open file");

writeln!(file, "Log message").expect("Failed to write");

Checking File Existence

use std::path::Path;

if Path::new("/data/config.json").exists() {
    let content = std::fs::read_to_string("/data/config.json").unwrap();
}

Listing Directories

use std::fs;

let entries = fs::read_dir("/data").expect("Failed to read directory");
for entry in entries {
    let entry = entry.expect("Failed to read entry");
    println!("{}", entry.file_name().to_string_lossy());
}

Complete Agent Example

use golem_rust::{agent_definition, agent_implementation};
use std::fs;
use std::io::Write;

#[agent_definition]
pub trait FileReaderAgent {
    fn new(name: String) -> Self;
    fn read_greeting(&self) -> String;
    fn write_log(&mut self, message: String);
}

struct FileReaderAgentImpl {
    name: String,
}

#[agent_implementation]
impl FileReaderAgent for FileReaderAgentImpl {
    fn new(name: String) -> Self {
        Self { name }
    }

    fn read_greeting(&self) -> String {
        fs::read_to_string("/data/greeting.txt")
            .expect("Failed to read greeting")
            .trim()
            .to_string()
    }

    fn write_log(&mut self, message: String) {
        let mut file = std::fs::OpenOptions::new()
            .append(true)
            .create(true)
            .open("/tmp/agent.log")
            .expect("Failed to open log");
        writeln!(file, "{}", message).expect("Failed to write log");
    }
}

Key Constraints

  • Use standard std::fs — it works with WASI out of the box
  • Files provisioned via golem-add-initial-files with read-only permission cannot be written to
  • The filesystem is per-agent-instance — each agent has its own isolated filesystem
  • File changes within an agent are persistent across invocations (durable state)
  • Third-party crates that use std::fs (e.g., serde_json's file reading) also work

Signals

GitHub stars
2k
Forks
212
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
golem-file-io-rust
Source
github.com/golemcloud/golem