Connects your computer to your agents. Folder changes and quick-button presses become triggers for the agent, and actions on the computer become its tools.
The connector lives in the system tray. It passes events from your computer to the agent and runs the agent's tool calls.
A file shows up in a watched folder or you press a quick button. A trigger plugin notices it.
The event goes to the platform over HTTPS: the trigger name, the time and the data, such as a file path.
The platform passes it to the agents that have access to this computer.
The call arrives over WebSocket: show a notification, take a screenshot, read text aloud. The connector runs it and sends the result back to the agent.
Built-in triggers and tools. Each one is switched on separately in the settings.
A file appeared, changed, was deleted or moved. Out of the box the connector watches for new files in Downloads.
A window of buttons, each sending the agent an event. Handy for requests you make every day.
An ordinary system notification, or a window you have to close yourself so it cannot be missed.
The computer reads text aloud with the built-in speech engine. The agent can also stop it.
Every trigger and tool is a plugin: a folder with plugin.py and config.json. You write your own in Python.
Watches something on the computer and sends the agent an event.
Runs the agent's call on the computer and returns the result.
from core.plugin_base import TriggerPlugin
class MyTrigger(TriggerPlugin):
@property
def name(self) -> str:
return "My trigger"
async def initialize(self) -> None:
pass
async def shutdown(self) -> None:
pass
async def start(self) -> None:
# Start watching; an event is sent like this:
self.emit_event("my_event", {"value": 42})
async def stop(self) -> None:
# Stop watching
passfrom core.models import ToolResult
from core.plugin_base import ToolPlugin
class MyTool(ToolPlugin):
@property
def name(self) -> str:
return "My tool"
async def initialize(self) -> None:
pass
async def shutdown(self) -> None:
pass
def get_supported_tools(self) -> list[str]:
return ["my_tool"]
async def execute(self, tool_type: str,
parameters: dict) -> ToolResult:
# Run the call
return ToolResult(success=True, data={"ok": True})Scenarios built from the built-in triggers and tools
A PDF lands in Downloads. The agent sees the file name, creates a task on the board and shows a notification.
The "Note" button asks for text and sends it to the agent. The agent saves it to a service it has access to.
The agent decides an event is urgent, say an email from a client. It reads it aloud and shows a window that will not go away by itself.
You write to the agent in chat: "look at this error". It captures the active window and answers from the picture.
The agent checks disks and memory on a schedule and warns you when space runs low.
"Put together today's report", "What do I have tomorrow?" — one button instead of typing to the agent every time.
Technical details
| Platforms | Windows, macOS, Linux |
| Built with | Python 3.11+, Qt 6 (PySide6) |
| Platform link | HTTPS + WebSocket (Centrifugo) |
| Reconnecting | With growing pauses, up to 10 attempts |
| MCP | Built-in local MCP server with the same tools |
| Plugins | A folder with plugin.py and config.json, the config is checked on load |
A tray icon and a settings window
Shows whether the connector is connected.
The link to the platform.
Triggers and tools.
Three steps from download to the first event
In the dashboard, under Apps, create an app and copy its key. In the connector's settings, paste it into Device Key along with the server address and link the device.
Tick the triggers and tools you need. The connector runs in the background, you can close the window.
Free and open source. Windows, macOS and Linux.