Inspiration
USC's rules live on dozens of pages and change without anyone being told. In 2026, Student Government's funding page rewrote one sentence: travel funding went from eight academic weeks before the event to nine weeks before the first payment. A club planning a March 20 trip by the old sentence would have applied a week late. Nobody got a message. We wanted that message to exist.
What it does
Kyros is one text thread for everything USC.
- Rules with receipts. Every answer carries the official sentence it came from, with the document and date.
- It texts first. When a watched page changes, Kyros re-checks every saved plan and texts the people it touches: old sentence, new sentence, new date.
- It looks things up. It reads the page and answers from it, with the address. Official usc.edu pages come first.
- It acts only with your yes. It can sign in with a saved login it never sees, and asks before any click that changes something.
The site opens on a real change, replayed from the Internet Archive's March and October 2026 copies of the funding page.
How we built it
TypeScript on Node. A rule engine with no model in it, a page watcher, a message loop with tools, saved logins in the macOS Keychain, iMessage and a web page as the two faces. 641 automated tests. The model talks and looks things up; code computes every date and decides whether a rule really changed.
Challenges we ran into
Making a model's reading of a rule safe to act on. A page that says "submit now" cannot make anything happen: page text is treated as data, and every action is judged by code. On the real October sentence both model readers declined, so the demo reads rule changes with a built-in reader that has no model in it. Sign-in is tested against a stand-in page, not yet USC's own.
What we learned
A model that says "I can't tell" is doing its job. What people must trust (dates, permissions, what counts as a change) belongs in tested code, not in a prompt.
What's next
USC single sign-on, then classes and grades, room booking, meals after class, and registration with a go-ahead each time.
Built With
- css
- html
- imessage
- internet-archive
- macos-keychain
- node.js
- sqlite
- typescript
- vitest
- zod