Project Info
Inspiration
Putting pen on paper (or Apple Pencil on iPad) is one of the most natural ways of getting early thoughts out and giving shape to ideas. It's often much easier to describe a complicated software system, or a tricky geometry problem, with a simple diagram. However, agentic AI tools today tend to heavily favor textual input. Sure, you could take a quick snap of a drawing and upload it—but what if you wanted to make a tiny edit? What if agentic tools on your Mac could read your iPad screen? Write some code on your Mac, have Iris draw a diagram on your iPad, edit the diagram, and have Iris edit the code—this is just one of the possibilities with Iris, the agentic AI that allows you to work cross-device.
What it does
Iris is an always-on AI that spans your Apple devices. It watches your screens, listens to your voice, and acts—drawing diagrams on your iPad, overlaying information on your Mac, and coordinating across both simultaneously. Sees: watches your Mac and iPad screens, understands what you're working on Hears: streams speech-to-text input from any device (including iPhones!) for natural voice interaction Draws: renders diagrams, widgets, and visual plans directly onto your iPad canvas with Apple Pencil interaction Thinks across devices: your Mac and iPad are one unified workspace, not two isolated screens
How we built it
We built Iris as a local-first, cross-device system centered on a Mac-hosted backend. Backend (Python + Flask): We implemented a unified API for sessions, transcript ingestion, screenshot upload, device commands, and chat sync. Data is stored on the filesystem (backend/data/...) so the whole system is easy for agents to inspect and act on. iPad app (SwiftUI + PencilKit): The iPad app's infinite canvas was built using a custom coordinate system. It also exposes a local canvas API for agent-driven actions. iPhone app (SwiftUI): We built a lightweight mobile companion for session control, push-to-talk voice capture (with on-device transcription), camera/photo uploads, and live chat/status viewing. Mac app (Electron + React): The Mac acts as the orchestration/control center, with session management and agent interaction UI. Agent routing: We support multiple model/provider paths (including Codex/Claude Code-linked sessions) so the same Iris session can map to external coding-agent conversations. Proactive behavior: Iris periodically analyzes incoming screen context and can propose or place useful UI help (widgets/suggestions) instead of only reacting to direct prompts.
Challenges we ran into
Getting proactive visual understanding to work reliably was our hardest problem. Foundation models are good at raw image understanding, but not so much at visual interactivity. We solved this by building a dual visual pipeline: (1) live screenshot capture from iPad + Mac at inference time so each agent turn sees current state, and (2) screenshot ingestion + structured image parsing for proactive monitoring. We also passed normalized canvas/viewport coordinate snapshots so visual reasoning could map back to actionable placement. In practice, this shifted us from “the model can describe the screen” to “the agent can interact visually.”
Accomplishments we're proud of
Implemented proactive behavior: Iris can analyze incoming visual context and suggest useful next actions instead of waiting for explicit prompts. Built a true cross-device AI workflow: Iris treats Mac, iPad, and iPhone as one shared workspace, not separate apps. Shipped an iPad infinite-canvas app with agent control: The agent can place widgets, draw/trace SVGs, and interact with the canvas using coordinate-aware APIs. Integrated external coding agents cleanly: Codex and Claude Code can be linked as first-class session backends, with synchronized chat history across Mac/iPhone/iPad views, taking advantage of these tools' impressive capabilities without reinventing the wheel—and allowing users to stick with what they already know.
What we learned
Proactive AI needs to be carefully controlled—without gating and confidence thresholds, “helpful” suggestions flood the user. Multimodal agents need structure: screenshots alone weren’t enough—coordinate snapshots and consistent structural schemas made visual reasoning usable.
What's next
Move from periodic sync to low-latency shared state so all devices update more smoothly. Better context management, with long-horizon context and cross-provider continuity. Shared workspaces and role-based workflows with stronger auth/permissions scoping, allowing Iris to be used by teams.
Iris
An AI assistant that sees, hears, and draws across your Apple devices.
Click the image to watch the full demo on YouTube.
The Problem
Siri can't look at your screen. It can't draw you a diagram. It can't watch what you're doing on your Mac and help you on your iPad at the same time. Current AI assistants are stuck in one device, one modality, one conversation.
What Iris Does
Iris is an always-on AI that spans your Apple devices. It watches your screens, listens to your voice, and acts — drawing diagrams on your iPad, overlaying information on your Mac, and coordinating across both simultaneously.
- Sees — watches your Mac and iPad screens, understands what you're working on
- Hears — streams audio from any device for natural voice interaction
- Draws — renders diagrams, widgets, and visual plans directly onto your iPad canvas with Apple Pencil interaction
- Thinks across devices — your Mac and iPad are one unified workspace, not two isolated screens
Use Cases
Planning — ask Iris to turn a plan into a diagram you can interact with on your iPad using Apple Pencil.
Coding — Iris watches your screen, understands your code, and can execute changes while you sketch architecture on the iPad.
Math — write a problem by hand, get hints and solutions overlaid right on your work.
Visual — sketch a rough diagram, get back a polished image or video.
Iris is all-to-all — every device in your Apple ecosystem can see, talk to, and control every other device. The AI doesn't live on one screen. It lives across all of them.
Prerequisites
-
uv (Python package/runtime manager)
-
Node.js + npm (for the Mac Electron app)
-
Claude Code CLI (
claude) for live Claude integration -
D2 — diagram renderer for flowcharts, architecture, and sequence diagrams:
brew install d2 -
TinyTeX — lightweight LaTeX distribution needed by Manim for math rendering:
curl -sL "https://tinytex.yihui.org/install-bin-unix.sh" | sh tlmgr install standalone preview doublestroke relsize fundus-calligra wasysym physics dvisvgm rsfs wasy setspace babel-english -
Backend Python dependencies (Flask, Manim, etc.) — managed with uv:
cd backend && uv sync
Setup
-
Create your local env file:
cp .env.example .env -
Install backend dependencies:
cd backend uv sync cd .. -
Install Mac app dependencies:
cd mac npm install cd .. -
Install Iris helper CLIs globally:
tools/claudei installThis installs:
claudei→ live Claude Code bridgeiris→ iPad tools CLI (draw,push-widget,read-screenshot,read-widget)
Run
-
Start backend + Mac app together:
./run.sh -
Or run individually:
- backend:
bash backend/run.sh - mac app:
bash mac/run.sh
- backend:
Claude Code + iPad Workflow
-
Link this Mac to the iPad:
claudei link -
Start a live Claude session from any project folder:
claudeiOptional:
claudei --cwd /path/to/projectclaudei --resume <session_id>
-
Send prompts from Iris on iPad. On the first message of a linked Claude session, Iris now auto-injects a CLI bootstrap so Claude knows to use:
iris tools listiris tools describe <tool>iris drawiris push-widgetiris read-screenshotiris read-widget
Iris CLI (Global)
After install, iris works from any directory:
iris tools list
iris tools describe draw
iris draw --svg-file /tmp/diagram.svg --scale 1.5
iris push-widget --html-file /tmp/widget.html --width 360 --height 260
iris read-screenshot --image-out /tmp/ipad.jpg
iris read-widget --name calculator
Default iPad base URL is http://dylans-ipad.local:8935 and can be overridden with IRIS_IPAD_URL.
Browser Automation Service
browser/ contains a standalone browser-use integration that can execute browser actions from text + image context using Claude.
Quick start:
cd browser
./run.sh
See browser/README.md for API payload format and Playwright setup.
More Docs
backend/README.md— backend API details and endpointsiPad/README.md— iPad canvas API (/api/v1/*)mac/README.md— Electron app setup and packagingCLAUDE.md— Claude-focused workflow and tooling notes
Analysis
View
Metric
- 29
- 16
- 10
- 6
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- CSSIn code
- FlaskIn code
- HTMLIn code
- JavaScriptIn code
- Next.jsIn code
- OpenAIIn code
- PythonIn code
- ReactIn code
- SwiftIn code
- Tailwind CSSIn code
- TypeScriptIn code
- Google GeminiClaimed
11 of 12 appear in the indexed code. 1 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
1.3 MB
Source files
134
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
ThePickleGawd/iris
190 files · 4.1 MB · @ b817b7e
Structure
Interface
38 files · 20%Screens, components and styles rendered to the user.
+2 moreAPI & routing
3 files · 2%Request entry points: routes, handlers and controllers.
Application logic
80 files · 42%Domain rules, services and shared utilities.
+9 moreBackground jobs
3 files · 2%Work run outside a request: tasks, workers and schedules.
Data & schema
5 files · 3%Schema definitions, migrations and data access.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- Swift34%
- TypeScript22%
- Python18%
- YAML17%
- Markdown4%
- HTML3%
- Other (3)2%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
mac/package.json
npm · 51- @radix-ui/react-dialog
- @radix-ui/react-toast
- axios
- bonjour-service
- class-variance-authority
- clsx
- diff
- form-data
- katex
- lucide-react
- react
- react-code-blocks
- react-dom
- react-icons
- react-markdown
- react-query
- react-syntax-highlighter
- rehype-katex
- +33 more
trajectory/package.json
npm · 13- clsx
- lucide-react
- next
- react
- react-dom
- react-resizable-panels
- tailwind-merge
- +6 more
mac/renderer/package.json
npm · 12- @testing-library/jest-dom
- @testing-library/react
- @testing-library/user-event
- @types/jest
- @types/node
- @types/react
- @types/react-dom
- react
- react-dom
- react-scripts
- typescript
- web-vitals
backend/pyproject.toml
pypi · 4- flask
- httpx
- manim
- openai
widgets/package.json
npm · 1- puppeteer
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.