Inspiration

As students, we know the struggle of keeping up with deadlines scattered across multiple platforms—school portals, LMS systems (like Canvas or Blackboard), Google Classroom, and emails. We realized that the probability of missing an assignment, let's call it \( P(\text{miss}) \), increases exponentially with the number of platforms you have to check.

We wanted to build something that reaches students where they already are: their text messages. Our inspiration was to create an AI assistant that seamlessly integrates with a student's digital life, working quietly in the background while they sleep, and proactively texting them updates, deadlines, and nudges to keep them on track. We wanted to reduce \( P(\text{miss}) \to 0 \) so students can focus on learning, not scheduling.

What it does

Classistant is an AI school assistant that lives entirely in your SMS text messages. Once a student completes a secure onboarding flow, the assistant connects to their Google Workspace (Calendar, Docs, Gmail) and their school's learning management system.

Overnight, the agent securely logs in, scrapes upcoming assignments, and cross-references them with the student's calendar. It then proactively texts the student with daily digests, deadline reminders, and schedule nudges. Students also have access to a web dashboard where they can see an honest, transparent feed of exactly what actions the AI has taken on their behalf and easily manage its access permissions.

How we built it

  • Frontend: Next.js 15, React 19, Tailwind CSS v4, TypeScript — and it owns the entire OAuth exchange and credential encryption, not just marketing pages.
  • Agent: Google ADK, deployed to Google Agent Platform, with a prompt tuned for SMS and long-term student memory.
  • Connector API: FastAPI service fronting Google Workspace; the agent consumes it via an OpenAPI spec loaded at runtime.
  • SMS pipeline: Twilio webhook → Firebase Function → Cloud Tasks queue → agent's streaming endpoint.
  • Security: Firestore + Cloud KMS envelope encryption, boundaries drawn with IAM.

What we learned

  • An agent is a distributed systems problem. We didn't call the agent directly from the Twilio webhook because an agent turn can take tens of seconds and Twilio drops slow webhooks. The webhook acks fast and enqueues a Cloud Task targeting the agent's streaming endpoint, and retries come for free.
  • Policy belongs in the backend, never in the prompt. Prompting "please draft emails, don't send them" is a suggestion; instead the send endpoint doesn't exist. The agent literally cannot delete a calendar event, and %USER_ID% is injected server-side per request. Prompts are suggestions; code is law.
  • Let tools load themselves from the API contract. The agent fetches the connector's live OpenAPI spec at startup (cached 12h) and builds its toolset from it. When the connector changes, the agent catches up without a redeploy.
  • IAM is architecture, and principals are persons. "We promise not to read the password" means nothing; "this service account has no grant on that key" does.

What's next for Classistant

Moving forward, we want to expand our list of verified schools (currently, every school in our system is hand-verified for compatibility). We also plan to enhance the agent's overnight scraping capabilities to support a wider variety of Learning Management Systems and give students more granular controls over their "quiet hours" and SMS digest frequencies.

Built With

Share this project:

Updates

Submission history