How it's built
graph LR
A[" 📱 Teams Channel "]:::teams -->|"⚡ WebSocket"| B["🔀 Bridge\n\nOrchestrator · Sessions · Claude SDK"]:::bridge
B -->|"query( )"| C["🤖 Claude Code"]:::claude
C -.->|"streaming response"| B
B -.->|"HTTP API edit message"| A
C -->|"create_task( )"| D["⏰ Task Scheduler\n\ncron · one-time"]:::scheduler
D -->|"sends message"| A
classDef teams fill:#464775,stroke:#7b83eb,stroke-width:2px,color:#fff,font-size:20px
classDef bridge fill:#1a3a5c,stroke:#2899f5,stroke-width:2px,color:#fff,font-size:20px
classDef claude fill:#1a3c2a,stroke:#6ccb5f,stroke-width:2px,color:#6ccb5f,font-size:20px
classDef scheduler fill:#4a3520,stroke:#f7630c,stroke-width:2px,color:#f7630c,font-size:20px
Runs on my desktop 24/7
No tunnel, no ngrok — pure outbound connections
No polling — WebSocket push
Direct Teams API via az CLI tokens