Nathan Zhou
← all projects

Sisyphus

A Teams assistant that answers messages while I am away.

Sisyphus watches Microsoft Teams chats on a dedicated Mac, drafts replies with an AI model, and can send them once allowed. It drives the Teams desktop app through macOS accessibility rather than any Microsoft API, so there is nothing to register and nothing for a tenant admin to approve. By default it only writes drafts for review.

The control panel's Sent tab with replies signed by the bot
What it sent, each reply signed as the bot — including turning down a request to move money.
The list of conversations it answers, with others' names blurred
Which conversations it answers. Each can carry its own instructions.
Per-conversation instructions and a drafted relay message ready to send
Standing facts per conversation, and relaying: you say what to get across, it writes it, you send.

How it works

  1. 01

    It types into Teams the way accessibility tools do. Testing showed this triggers the app's full input pipeline and works while Teams is in the background, where setting the text field directly changed the screen but left the app unaware.

  2. 02

    Every Teams message id ends in a millisecond timestamp, so “what is new” is a number comparison rather than a diff.

  3. 03

    Replies go out under the user's own account, so its messages come back looking like a person's. Three independent guards stop it answering itself, with their own test suite.

  4. 04

    A small local model first decides whether a message needs a reply at all. Overnight, a sleep mode answers only when it is certain and otherwise sends a fixed standby message.

  5. 05

    Sending has three modes — draft, allowlist and auto — with a per-conversation hourly cap, and every reply is signed as coming from the assistant.

Built with

  • TypeScript
  • Node.js
  • Swift
  • macOS Accessibility
  • launchd
  • DeepSeek
  • Ollama

Status

Reading and draft replies work; fully automatic sending is being finished.

Worth knowing