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:
- Sam discovers internships weeks before LinkedIn, aggregating from six maintained GitHub lists. Sam ranks roles by your preferences—location, company stage, visa sponsorship, term length.
- Rosie applies to your shortlisted roles automatically. One click starts the process. Rosie fills forms, handles CAPTCHA pauses, tracks applications, and maintains your contact pipeline.
You stay in control. Every shortlist decision is yours. Every application is visible before submission. Sam and Rosie move fast; you move strategically.
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:
- SimplifyJobs (largest, most active)
- SpeedyApply (fast-growing community fork)
- Community-maintained regional lists
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:
- Your onboarding preferences (location hubs, company stage, visa willingness, term)
- Recency decay (newer postings weighted higher)
- Role category match (SWE vs ML vs PM)
- Company tier (FAANG, Series A-C, startup)
- Application ease (structured forms vs custom systems)
Result: roles appear in your priority order, not LinkedIn's algorithm.
Rosie: Automated Application
Rosie applies to your shortlisted roles with a simple flow:
- Setup: Upload resume and documents. Answer a one-time Q&A bank: visa sponsorship, background check availability, start date, pronouns, personal website.
- Shortlist: Mark roles for Rosie. Review draft resume and cover letter tailored to each company before approving.
- Apply: Click "Apply with Rosie" in your browser. Chrome extension opens the real application form.
- Fill: Rosie fills the form: name, email, resume (file upload), answers to custom questions. Handles structured ATS systems (Ashby, Lever, Greenhouse).
- Pause: SSO or CAPTCHA appears? Rosie pauses, tells you to complete it, waits for your signal.
- Submit: Rosie submits. Application tracked immediately in your local pipeline.
- 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:
- By status: Submitted, Viewed, Interview Stage, Offer, Rejected
- By date: Applications this week, this month
- By company: All submissions to each employer
- Contact pipeline: Recruiter emails, networking connections, follow-up dates
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:
- SimplifyJobs (primary source, daily updates)
- SpeedyApply (community fork, rolling updates)
- vanshb03 Summer 2027 (regional focus)
- sndsh404 Summer 2027 (smaller, curated list)
- Related community lists (varies by season)
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:
- Academic year (freshman through graduate)
- Focus area (SWE, AI/ML, data science, hardware, cybersecurity, research, DevOps, product)
- Work authorization (US citizen/PR, sponsorship needed, OPT/CPT)
- Location preference (remote-only, specific cities, open)
- Company stage preference (big tech, Series A-C, seed/startup, research)
- Term flexibility (summer only, fall co-op, both)
- Experience level (first internship, prior experience)
Scoring Algorithm (Rule-Based). Sam Pro combines multiple weighted factors:
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-4ofor 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 + contextPATCH /api/rosie/sessions/[id]→ Update session status, emit eventsPOST /api/rosie/sessions/[id]/llm→ Request LLM answer for a questionPOST /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:
- Inspect: Query DOM for visible form fields. Extract label text, input type (text, email, select, file, checkbox, radio), placeholder, required status.
- Classify: Match field to known categories: name, email, resume file, phone, company size preference, visa questions, start date, background check, availability, pronouns, etc.
- 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.
- Fill: Set input value via DOM API. Handle special cases: file uploads, multi-select, radio groups,
<select>tags. - Repeat: Move to next unfilled field. Stop when form is complete or blocker encountered.
- Detect Blockers: CAPTCHA iframe, SSO redirect, manual review prompt, unknown field type → pause and ask user.
- 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:
- Public pages: Landing, login, signup. No auth required.
- Sam (free): Job board at
/jobsvisible to logged-in users. Filters only (no scoring). Shortlist builder for Rosie available. - Sam Pro: Tracker (
/tracker), contacts (/contacts), personalized scores visible only to Pro or higher. Requires Stripe subscription or Rosie plan. - Rosie (apply): Rosie profile (
/rosie/profile), shortlist (/rosie/shortlist), and apply sessions require Rosie plan (Starter+). Credits consumed on apply initiation. - Admin:
/admin/usersrequires 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)
- Workday support: Structured path for Workday ATS (already has infrastructure).
- Cross-device sync: Bring tracker and shortlist to phone, tablet, or any device.
- Voice-first resume: AI writes your resume and cover letters in your actual voice, not templates.
Coming (Next 3 Months)
- Durable sessions: Rosie remembers exactly where she left off. Close your laptop; come back tomorrow and resume applying.
- Broader ATS coverage: Computer-use mode for systems we don't have structured parsers for yet.
- Smart priority queue: Rosie applies to best-fit roles first, not just in order.
- Public hosting: Currently in beta testing. Official launch coming soon.
Planned (Longer Term)
- Email integration: Recruiter messages flow into your tracker automatically.
- Interview prep: Mock interviews with feedback. Sam surfaces common interview questions per company.
- Offer negotiation: Rosie walks you through competing offers and equity analysis.
- Salary transparency: Real compensation data from past applicants at each company.
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