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.

Read the full VFS docs →

Ship an agent-driven flow this afternoon.

Install Linda, paste a config, and your form turns into an agent that fills its own inputs.