Feature · @linda/vfs
The virtual filesystem.
Linda gives the LLM a workspace, not a prompt blob. The model navigates, reads, and writes — and writes to the right paths become real actions on your page.
linda.vfs.tree("/") / ├── /page # live DOM snapshot │ ├── dom.html │ ├── url.txt │ └── form/ │ └── fields/ │ ├── email.json │ └── company.json ├── /conversation # full message log │ ├── messages.jsonl │ └── state.json ├── /user # files the user drops in │ └── files/ │ └── f_a1b2c3/ │ ├── info.md │ └── parsed/ │ └── text.md ├── /skills # composable capability bundles │ └── installed/ │ ├── resume-intake/ │ │ ├── SKILL.md │ │ └── schema.json │ └── kyc-id-check/ │ └── SKILL.md ├── /host # your data, mounted by you │ └── crm/ │ └── accounts.json ├── /config ├── /scratchpad └── /tools
The mounts
/page— the live DOM snapshot, the form fields, the URL, the viewport./conversation— every message, every tool call, every persisted state./user— files the user dropped, with parsed artifacts./skills— capability bundles the LLM can opt into./host— anything you mount: CRM, KB, remote MCP servers./config— the agent's persona, target, data points, rules./scratchpad— temporary working memory the model owns./tools— descriptions of the tools the model can call.
Why a filesystem?
Modern LLMs are trained on filesystem-shaped workflows — Claude Code,
agentic repo edits, MCP servers. They're remarkable at ls,
cat, grep. Giving them a virtual workspace
taps into that training shape directly.
Code
// The LLM sees the workspace as files.
// It reads /page/dom.html to understand the form.
// It writes to /page/form/fields/email.json to fill an input.
// It reads /skills/installed/resume-intake/SKILL.md to learn how to extract resume data.
await linda.vfs.tree("/");
// /page
// /dom.html
// /form
// /fields
// /email.json
// /company.json
// /conversation
// /messages.jsonl
// /skills
// /installed
// /resume-intake
// /SKILL.md
// /schema.json
// /host
// /crm
// /accounts.json How writes become DOM updates
When the model writes to /page/form/fields/email.json, Linda's
PageMount intercepts the write. The handler looks up the
matching <input name="email">, dispatches a real
input event with the value, and the browser's normal
validation, React state, jQuery handlers — all of it just works.
This is the trick. The model thinks it's editing files. The browser thinks the user typed. Both are right.
Mounting your own data
Implement VfsMountHandler and you can mount anything as a path.
Linda ships InMemoryMount, McpClientMount, and
adapters for common cases. Want the model to see your CRM? Mount it under
/host/crm and write your tree handler.
🚀 See the VFS live — the page-companion demo
shows the agent reading /page/dom.html and writing to a mounted
/host/kb.
Ship an agent-driven flow this afternoon.
Install Linda, paste a config, and your form turns into an agent that fills its own inputs.