File I/O in Rust Golem Agents
SkillFiles & storageReading 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.
No other account needed.
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-fileswithread-onlypermission 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