What we've shipped.
Every feature, fix, and ops-change to Sheet2Classroom. In reverse chronological order.
- Apr 23, 2026Feature
/appv2 promoted to /app — single canonical app tree
Dashboard, browse-all-assignments, snapshots, per-student restore, grade histogram, and the assignment combobox are no longer behind a /appv2 prefix. The old frozen /app tree is gone; /appv2 was renamed to /app in one move, all internal links were rewritten, and the v1/v2 variant split was retired from the shared nav.
- Single /app/* route tree — no more v1/v2 split
- AppNav dropped its variant prop; Dashboard + History links are always shown
- Internal hrefs and imports rewritten in one sed pass
- robots.ts deduped private-route list
- Apr 22, 2026Feature
Dashboard + assignment combobox
A multi-course dashboard aggregating pushes/snapshots/expiring backups across everything you teach. Assignment name input now shows a dropdown of existing coursework so you can update instead of creating.
- New /app/dashboard with hero stats, activity feed, per-course grouping, and expiring-backup warnings
- Type-ahead dropdown on assignment title — pick existing coursework to auto-switch to Update mode
- Dashboard icon in the app nav
- Public changelog (this page)
- Apr 22, 2026Feature
Browse all assignments, snapshots, per-student restore, grade histogram
Four feature drops shipped in one wave.
- Browse every assignment in a course at /app/course/[id]/assignments
- One-click "Save snapshot" — backs up current grades without pushing
- Per-student restore: checkboxes on every row in the restore preview
- Grade distribution histogram on the push preview — bars over max tint red
- Apr 22, 2026Fix
Sign-out crash + button feedback
Sign out was crashing with "This page couldn't load" because of an inline server action binding issue in Next 16 + Turbopack. Moved to a shared actions file + added pending state.
- Dedicated src/app/actions.ts with signInWithGoogle + signOutAndGoHome
- Loading spinner + "Signing out…" text + disabled state via useFormStatus
- Cursor changes to wait during sign-out
- Apr 22, 2026Feature
Restore-with-diff + readability pass
No more "OK/Cancel for show" on restore. Every destructive action now previews the exact change before committing.
- Restore now fetches current grades and shows a Now → Will-revert-to table
- Loud warning when student-visible grades will change
- Assignment mode card redesigned: bigger, clearer, with "SELECTED" pill
- Stat cards use tabular-nums + 3x larger values
- Saved-mapping chip reads as a real chip with a proper Reset button
- Apr 22, 2026Feature
Update-existing-assignment with mandatory backup
Detect when an assignment title already exists. Offer Create New or Update — never silently overwrite.
- Full diff table: current grade → new grade per student
- Red warning for grades already visible to students
- Every backup restorable for 30 days via Upstash Redis
- Push history page with filter + restore per entry
- Apr 22, 2026Feature
Name-match + interactive resolver
Personal-Gmail students whose email is hidden by Google can now be matched by name from the class roster.
- New classroom.rosters.readonly scope fetches the roster directly
- Fuzzy name matching: exact + token-subset (middle names OK)
- Duplicate-name detection → shows in unmatched with candidate picker
- Inline dropdown on every unmatched row to pick the right student manually
- Apr 21, 2026Feature
Full visual overhaul
Linear/Moneyflow-inspired layout. Emerald brand. Plus Jakarta Sans. Animated hero grid. Scroll-triggered section reveals.
- Hero with animated 4-card grid — Drafts first, Smart matching, Last push, Undo any push
- Framer Motion scroll animations with staggered children
- Favicon + OG image regenerated
- Dark mode removed — light theme only per teacher feedback
- Apr 21, 2026Feature
Wizard MVP
Four-screen flow shipped: pick course, paste sheet, map columns, preview and push.
- Google Classroom + Sheets integration
- Grade format parsing: numbers, "85/100", "85%", "85 pts"
- Auto-guess columns from header names
- Draft-first grading by default
- Rollup pre-push check: no assignment created if zero matches
- Apr 21, 2026Feature
Production deploy
Domain sheet2classroom.app live on Vercel with NextAuth v5 + Google OAuth.
- Scaffold: Next.js 16, NextAuth v5, Tailwind v4, googleapis
- Privacy policy + Terms of service pages
- OAuth consent screen submitted to Google as "Gradebook"
Have a feature idea or a bug report?