Klass Personal OS

Every account type, one settings window

Accounts

The sources your agent reads and writes against directly.

Email Accounts

IMAP inboxes, read and write. Add as many as you want, each with its own sync interval and folders it leaves alone.

PIM Accounts

Calendar, contacts, and reminders over CalDAV and CardDAV, or the Mac's own apps. Each kind gets its own free slot, not one shared between them.

Storage Accounts

S3, Cloudflare R2, Backblaze B2, FTP, SFTP, and WebDAV behind one settings screen and one set of tools.

Filesystem Roots

Folders your agent can see, named and added one at a time. Any root can be marked read-only.

Feeds

RSS, Atom, and JSON feeds, each polled on its own interval and kept searchable once it's synced.

Messages

Reads iMessage and SMS history through Full Disk Access, with an allowlist so only the threads you name are ever visible.

Services

What your agent sends through and calls out to, separate from the accounts it reads.

Outbound Mail

SMTP accounts for sending as your agent, kept separate from the inboxes it reads.

Image Generation

Point it at your own OpenAI-compatible image endpoint. Your key, your model, your cost.

Notifications

Native macOS notifications or Pushover, so a scheduled job can tell you when it's done, or when it fails.

AI Providers

Anthropic, anything OpenAI-compatible, or a local Ollama model - each with its own default, for scheduled jobs that call an AI prompt directly.

HTTP Connections

A scoped API gateway: allowed hosts, allowed methods, and a timeout, per connection - never just an open socket handed to an agent.

Adding one

Every add screen validates as you go - a missing field is caught before you save, not after something fails silently at 2am.

Add Storage Account

Cloudflare R2, Backblaze B2, AWS S3, or a custom S3-compatible endpoint, plus FTP, SFTP, and WebDAV in the same dropdown.

Add AI Provider

Anthropic's Messages API, anything OpenAI-compatible, or Ollama running locally on your own machine.

Add HTTP Connection

Hosts are denied by default. You allow the ones you actually want an agent to reach, and which methods it can use on them.

See the rest of it

The scheduler that runs these accounts on a timer, and the keys and containment model behind all of it.