Product Brief

Sam & Rosie

AI-Powered Internship Discovery and Auto-Application for Students

Overview

Finding internships is a full-time job. Applying to them is another. Sam & Rosie splits the work between two AI agents:

You stay in control. Every shortlist decision is yours. Every application is visible before submission. Sam and Rosie move fast; you move strategically.

Core Value Proposition: Discover jobs ~48 hours before LinkedIn shows them. Shortlist in 10 minutes. Apply to 20 roles in one afternoon. Track everything in one place.

The Timing Edge

Community-maintained GitHub internship lists update hourly. They scrape company career pages, Twitter announcements, and Discord channels before postings reach LinkedIn's algorithmic feed. Sam watches these sources and tells you about roles the moment they appear.

How It Works

Sam: Discovery & Ranking

Sam aggregates internship roles from six GitHub sources updated throughout the day:

Each role is a Markdown table entry with company, role title, link, and status tags. Sam parses them, estimates posting recency, resolves broken links, and deduplicates across sources. You see the full list instantly.

Filtering is free. Scoring is pro. Sam Pro ranks roles by:

Result: roles appear in your priority order, not LinkedIn's algorithm.

Rosie: Automated Application

Rosie applies to your shortlisted roles with a simple flow:

  1. Setup: Upload resume and documents. Answer a one-time Q&A bank: visa sponsorship, background check availability, start date, pronouns, personal website.
  2. Shortlist: Mark roles for Rosie. Review draft resume and cover letter tailored to each company before approving.
  3. Apply: Click "Apply with Rosie" in your browser. Chrome extension opens the real application form.
  4. Fill: Rosie fills the form: name, email, resume (file upload), answers to custom questions. Handles structured ATS systems (Ashby, Lever, Greenhouse).
  5. Pause: SSO or CAPTCHA appears? Rosie pauses, tells you to complete it, waits for your signal.
  6. Submit: Rosie submits. Application tracked immediately in your local pipeline.
  7. Track: Dashboard shows status: submitted, viewed, interview scheduled, offer, rejected.

Why a Chrome Extension?

CAPTCHA, SSO, and file pickers live in your browser, not on a server. Rosie needs to see your real login session, click real buttons, and handle real 2FA flows. The extension runs in your active browser window—no headless simulation, no cheating. Just fast fingers that never get tired.

The Application Tracker

Every application Rosie submits lands in your personal tracker. Status updates flow in automatically. You also log manual applications, keeping everything in one place. Common views:

Data stays on your device. We sync subscription state with the server, but your hunt state never leaves your browser.

Methodology & Architecture

1. Job Discovery Pipeline

Data Sources. Sam aggregates from six actively maintained GitHub repositories:

Parsing & Normalization. Each repository is a Markdown file with role data in table rows. Parser extracts: company name, role title, application URL, posting location, visa sponsorship status, internship term (summer/fall/spring), and any explicit status tags. Strips emoji, normalizes spacing, and resolves relative URLs.

Deduplication. Roles are deduplicated across sources by (1) exact URL match, (2) company + role title + location triple, or (3) fuzzy string similarity if ambiguous. Maintains 30-day rolling window to catch re-postings and replicants.

Age Estimation. Posting recency inferred from GitHub commit timestamps and list position. Newer entries prioritized. Decay function: roles over 14 days old reduced in ranking; over 30 days archived.

Caching & Refresh. Sam caches results in-memory (~1 hour TTL). Reduces GitHub API calls, improves responsiveness for users browsing simultaneously. Polling triggered on user request or scheduled 6x daily.

2. Matching & Scoring

User Profile Input. During onboarding, students define:

Scoring Algorithm (Rule-Based). Sam Pro combines multiple weighted factors:

score = (recency × 0.25) + (role_fit × 0.20) + (company_tier × 0.20) + (location_match × 0.15) + (visa_alignment × 0.15) + (term_match × 0.05) Each factor independently normalized to [0, 1]. Live filters can zero or penalize any mismatch.

Tiers. Results bucketed into strength tiers: strong (≥75), good (≥50), weak (≥25), poor (<25). Free users see all tiers but unranked. Pro users see ranked within tier, plus tier filter toggles.

Live Filters. Free users access: keyword search, location keyword, work mode (remote/hybrid/on-site). Pro users add: posted this week, specific company, sponsorship required, specific company stage, research internships, fall co-op only. Filters combine with AND logic; mismatches zero out scores.

3. Rosie Apply: Brain + Hands + Apply-Core

Rosie's architecture separates concerns into three layers:

Layer 1: Brain (Server-Side Planning)

Purpose: Decision-making, LLM coordination, document handling. Located in lib/rosie-apply/ and app/api/rosie/sessions/.

Responsibilities:

  • Session creation: packages user profile, resume, Q&A answers, plan metadata, OpenAI context
  • Form analysis: server receives field extraction data from extension; suggests fill strategies
  • LLM coordination: calls OpenAI gpt-4o for question answers, cover letter tailoring, computer-use fallback
  • Document management: parses resume to plain text, extracts structured data (GPA, graduation date, skills)
  • Status tracking: maintains session state, logs errors, detects blockers

Endpoints:

  • POST /api/rosie/sessions → Create session with profile + context
  • PATCH /api/rosie/sessions/[id] → Update session status, emit events
  • POST /api/rosie/sessions/[id]/llm → Request LLM answer for a question
  • POST /api/rosie/sessions/[id]/plan → Get fill strategy for detected fields

Layer 2: Hands (Chrome Extension Driver)

Purpose: Live browser interaction, real DOM manipulation, user-initiated actions. Located in extension/src/.

Architecture:

  • Service Worker (background.ts): Receives OPEN_SESSION signal from web app. Opens new tab pointing to company career page + session token.
  • Content Script (content.ts): Injected into real application form. Runs apply-core agent loop. Communicates with ExtensionDriver and RemotePlanner.
  • ExtensionDriver (extension-driver.ts): Direct DOM access. Queries field labels, detects input types, fills text boxes, selects dropdowns, uploads resume file, clicks submit.
  • RemotePlanner (remote-planner.ts): Asks server for fill strategies and LLM answers. Receives form field descriptions; returns personalized fill data.
  • Overlay (overlay.ts): In-page UI showing apply progress, pause prompts for CAPTCHA/SSO, status messages.

Key Challenge: CAPTCHA, SSO, and file pickers require real browser interaction. Cannot be automated. Extension pauses, shows human-readable prompt ("Please complete the CAPTCHA"), waits for user to signal completion via overlay button.

Layer 3: Apply-Core (Universal Agent Loop)

Purpose: Stateless form-filling engine, reusable across extension and Playwright. Located in lib/apply-core/.

Agent Loop:

  1. Inspect: Query DOM for visible form fields. Extract label text, input type (text, email, select, file, checkbox, radio), placeholder, required status.
  2. Classify: Match field to known categories: name, email, resume file, phone, company size preference, visa questions, start date, background check, availability, pronouns, etc.
  3. Plan: Given current profile + field category, decide fill value. For open text, use Q&A bank. For dropdowns, map user preference to available options. For files, use resume or transcript.
  4. Fill: Set input value via DOM API. Handle special cases: file uploads, multi-select, radio groups, <select> tags.
  5. Repeat: Move to next unfilled field. Stop when form is complete or blocker encountered.
  6. Detect Blockers: CAPTCHA iframe, SSO redirect, manual review prompt, unknown field type → pause and ask user.
  7. Submit: Once all fields filled and user approves, click submit button. Confirm navigation to success page.

ATS Modes:

  • Structured (Ashby, Lever, Greenhouse): Known field schemas. Parser recognizes exact field IDs and types. Highly reliable fill rate.
  • Workday-specific: Custom helpers for Workday's nested fieldsets and iframe structure. (In progress.)
  • Computer-use (fallback): Vision-based form understanding via Claude's computer-use API. Slower, but handles arbitrary forms. (Coming soon.)

4. Data Persistence & Privacy Philosophy

Data Category Storage Location Sync Behavior
Users, sessions, auth tokens Server (Prisma SQLite) Persistent, device-agnostic
Stripe subscriptions, credits, plan Server + localStorage mirror Synced via webhooks
Job listings Browser memory (React state) Fetched fresh hourly, cached 1h
Shortlist, tracker, resume, docs, Q&A bank Browser (localStorage) Not synced. Single-device hunt state.
Onboarding profile (preferences) Browser (localStorage) Not synced. Lives on device.
Rosie apply sessions Server memory (in-process) Ephemeral. ~30 min TTL. Expires on session end.

Philosophy: Hunt state (jobs, tracker, resume, Q&A) is intentionally private. We sync account and billing only. Future cross-device sync is planned but requires user opt-in. Resume files are never uploaded to servers; parsed locally into plain text for form fills.

5. Access Flow & Entitlements

Access control is layered:

  1. Public pages: Landing, login, signup. No auth required.
  2. Sam (free): Job board at /jobs visible to logged-in users. Filters only (no scoring). Shortlist builder for Rosie available.
  3. Sam Pro: Tracker (/tracker), contacts (/contacts), personalized scores visible only to Pro or higher. Requires Stripe subscription or Rosie plan.
  4. Rosie (apply): Rosie profile (/rosie/profile), shortlist (/rosie/shortlist), and apply sessions require Rosie plan (Starter+). Credits consumed on apply initiation.
  5. Admin: /admin/users requires ADMIN_EMAIL role. User list, suspension, plan override.

Entitlements. On login, we merge user's Stripe subscription (via webhooks) with a localStorage billing mirror. Apply session creation checks plan type and available monthly credits. Monthly rollover happens on cycle anniversary (Stripe billing date).

6. Technology Stack

Layer Technology
App framework Next.js 15 (App Router), React 19, TypeScript 5.7
UI & styling Tailwind CSS 3, PostCSS
Database Prisma ORM + SQLite (local)
Auth bcryptjs, custom hashed session cookies
Payments Stripe (checkout, portal, webhooks)
LLM OpenAI API (raw HTTP, default gpt-4o)
Browser automation Playwright (dev/CI testing)
Extension Chrome MV3, esbuild, @types/chrome
Fonts next/font: Inter, Fraunces

Pricing & Plans

Sam is free forever. Rosie runs on monthly subscriptions with flexible cancellation.

Plan Price Auto-Applies/Month Key Features
Sam (Free) $0 0 Job discovery, filters, live ranking, shortlist builder
Sam Pro $4.99 0 Everything in Sam + personalized ranking, tracker, contact pipeline
Rosie Starter $9.99 20 Sam Pro + auto-apply, Ashby/Lever/Greenhouse support, tailored materials
Rosie Pro $29.99 75 Everything in Starter + priority processing, parallel hunts
Rosie Unlimited $49.99 Unlimited Everything in Pro + unlimited applications, all hands on deck

Money-Back Guarantee

Cancel anytime. No contracts. No questions asked. Pause your subscription if you want a break, resume whenever you're ready.

Roadmap

Immediate (Next 30 Days)

Coming (Next 3 Months)

Planned (Longer Term)

Get Started

Sam & Rosie is live and hunting. Sam is free—start discovering roles today. Try Rosie risk-free with a monthly subscription, no contract.

Launch the App Learn More