A desktop runtime that installs, schedules, and sandboxes AI agents on your machine.
Purfle runs persistently on Windows and macOS. You install agents — each defined by a signed manifest — and the AIVM (AI Virtual Machine) runs them on a schedule, unattended. Every agent is sandboxed: the runtime enforces what it can access, which LLM engine it uses, and where it writes output. You see one card per agent in the desktop UI. Agents run in the background. The AIVM guards the hen house.
┌─────────────────────────────────────────────┐
│ .NET MAUI DESKTOP APP │
│ (MSIX on Windows / .pkg on macOS) │
│ ┌──────────────────────────────────────┐ │
│ │ AIVM (C#) │ │
│ │ Scheduler │ │
│ │ ├── AgentRunner: email-monitor │ │
│ │ ├── AgentRunner: pr-watcher │ │
│ │ └── AgentRunner: report-builder │ │
│ └──────────────────────────────────────┘ │
│ UI: one card per agent │
└──────────────┬──────────────────────────────┘
│ talks to
┌──────────────▼──────────────────────────────┐
│ AZURE (live services) │
│ Key Registry — Functions (consumption) │
│ Marketplace — App Service (F1 free) │
│ IdentityHub.Web — App Service (F1 free) │
└─────────────────────────────────────────────┘
│
┌──────────────▼──────────────────────────────┐
│ purfle demo — starts these locally │
│ mcp-file-server :8100 │
│ mcp-gmail :8102 │
│ mcp-github :8111 │
└─────────────────────────────────────────────┘
| Feature | Description |
|---|---|
| Multi-engine LLM | Gemini, Anthropic, OpenAI, Ollama — engine declared per agent |
| Signed manifests | JWS with ES256 — every agent is cryptographically signed |
| 5 trigger types | interval, cron, startup, window, event (SSE) |
| MCP tool protocol | Agents call tools through MCP servers wired by the AIVM |
| Sandboxed execution | Network, filesystem, env vars — enforced per manifest |
| Windows + macOS | .NET MAUI — one codebase, two platforms |
| Marketplace | Publish, search, and install agents from a central registry |
| Engine-agnostic | No hardcoded engine — the manifest decides |
| Dashboard | Live summary of all agents with digest, status, and output preview |
- .NET 10 SDK
- Node.js (LTS)
- An LLM API key (set
GEMINI_API_KEY,ANTHROPIC_API_KEY, orOPENAI_API_KEY)
-
Clone the repository
git clone https://github.com/clarksonr/purfle.git cd purfle -
Build the runtime and SDK
dotnet build runtime/src/Purfle.Runtime/Purfle.Runtime.csproj cd sdk && npm install && npm run build && cd ..
-
Start the demo environment
npx purfle demo
This starts local MCP servers (file, Gmail, GitHub) and prints a summary table.
-
Open the desktop app
dotnet run --project app/src/Purfle.App/Purfle.App.csproj
The Dashboard shows installed agents, their status, and today's digest.
An agent is a signed package containing a manifest, optional .NET assemblies, and prompt files:
my-agent.purfle/
├── agent.manifest.json ← signed, declares everything
├── lib/
│ └── MyAgent.dll ← .NET assembly (optional)
├── prompts/
│ └── system.md ← instruction file
└── assets/ ← optional embedded resources
{
"purfle": "0.1",
"id": "11111111-1111-4111-a111-111111111111",
"name": "Hello World",
"version": "0.1.0",
"description": "Minimal agent for local demonstration.",
"identity": {
"author": "clarksonr",
"email": "roman@example.com",
"key_id": "hello-key-001",
"algorithm": "ES256",
"issued_at": "2026-03-27T00:00:00Z",
"expires_at": "2027-03-27T00:00:00Z"
},
"capabilities": ["llm.chat"],
"runtime": {
"requires": "purfle/0.1",
"engine": "gemini",
"model": "gemini-2.0-flash"
}
}The AIVM reads this manifest, verifies the signature, checks capabilities, selects the LLM adapter, and runs the agent on its declared schedule. The agent never touches the system directly — the AIVM executes on its behalf.
| Layer | Technology |
|---|---|
| Desktop | .NET MAUI (C#) — Windows + macOS |
| AIVM | C# class inside MAUI |
| Manifest spec | JSON Schema Draft 2020-12 |
| Agent identity | JWS / ES256 |
| Inference | Engine-agnostic: Gemini, OpenAI, Ollama, Anthropic |
| Scheduler | PeriodicTimer + NCrontab + WindowTrigger + EventTrigger (SSE) |
| SDK / CLI | TypeScript / Node.js |
| Tests | xUnit + Jest |
| Azure | Functions consumption + App Service F1 |
| IaC | Bicep |