A privacy-first AI coaching tool for Peninsula SD teachers. Record or import a lesson, get AI-powered feedback on specific teaching techniques, and reflect on your practice — all without administrators, evaluators, or anyone else seeing your data.
Home![]() |
AI Feedback![]() |
Framework Explorer![]() |
How It Works![]() |
LessonLens is voluntary and is not an evaluation tool. It is not used for personnel decisions, performance reviews, or administrative oversight of any kind.
- Only you can see your data. No administrator, evaluator, or colleague has access to your recordings, transcripts, analysis, reflections, or chat conversations.
- Audio never leaves your device. Transcription happens entirely on your Mac using an on-device AI model — no audio is uploaded anywhere.
- Video is deleted immediately after analysis. When you submit a video for analysis, it is automatically deleted from Google as soon as the analysis completes.
- The district cannot see what you do. The backend server stores nothing — no transcripts, no results, no session history. The tech team can see aggregate usage counts but not who made the requests or what was in them.
- Google cannot use your data. Processing is governed by the district's Data Processing Agreement with Google. Your data is not used to train AI models.
For full details, see the Terms of Use and Privacy Policy.
- Live Recording - Record teaching sessions directly in the app
- Audio Import - Import voice memos and audio files (M4A, MP3, WAV, CAF)
- Video Import - Import classroom recordings (MP4, MOV, M4V, WebM)
- Local Transcription - On-device transcription using WhisperKit (Apple Silicon)
- Wait Time Detection - Automatic detection of pauses (3+ seconds) for wait time analysis
- AI Analysis - Gemini-powered feedback on teaching techniques
- Video Analysis - Gemini-powered visual+audio analysis for classroom dynamics
- Guided Self-Reflection - Multi-step reflection wizard before viewing AI feedback (what went well, what to change, self-rate techniques, pick focus areas)
- Self vs AI Comparison - Side-by-side view of teacher's self-ratings against AI ratings with delta indicators
- Interactive Coaching Chat - Follow-up questions with AI using full transcript + analysis context, with timestamped evidence citations
- Multiple Frameworks - Seven research-based teaching evaluation frameworks
- Star Ratings - Optional 1-5 star ratings with visual legend
- PDF & Markdown Export - Export analysis reports with customizable content, including self-reflection data
- Domain-Restricted Auth - Google OAuth (ASWebAuthenticationSession) limited to @psd401.net accounts
┌─────────────────────────────────────────────────────────────┐
│ macOS App (SwiftUI) │
├─────────────────────────────────────────────────────────────┤
│ Recording → Transcription (WhisperKit) → Analysis Request │
│ Video Import → Direct Upload to Gemini → Video Analysis │
│ Self-Reflection → Comparison View → Coaching Chat │
│ ↓ │
│ Local Storage (SwiftData + Media Files) │
└─────────────────────────────────────────────────────────────┘
│
↓ HTTPS
┌─────────────────────────────────────────────────────────────┐
│ Cloud Run Backend (Hono.js) │
├─────────────────────────────────────────────────────────────┤
│ /auth/validate │ Google JWT → Domain check │
│ /analyze │ → Gemini API (text analysis) │
│ /analyze/video │ → Gemini API (video analysis) │
│ /chat │ → Gemini API (coaching conversation) │
│ /upload/initiate │ → Gemini File Upload │
│ Rate Limiting │ 20 text/hr, 5 video/hr, 50 chat/hr │
└─────────────────────────────────────────────────────────────┘
- macOS 14.0+ (Sonoma)
- Xcode 15.2+
- Apple Silicon Mac (for WhisperKit)
- Google Cloud Run account
- Google AI API key (Gemini)
lessonlens/
├── LessonLens/ # macOS App
│ ├── LessonLens/
│ │ ├── App/ # Entry point, AppState, ServiceContainer
│ │ ├── Features/
│ │ │ ├── Authentication/ # Google OAuth (ASWebAuthenticationSession)
│ │ │ ├── Recording/ # Audio/video recording & import
│ │ │ ├── Transcription/ # WhisperKit integration
│ │ │ ├── Analysis/ # Gemini API integration
│ │ │ ├── Reflection/ # Guided self-reflection wizard & comparison
│ │ │ ├── Chat/ # Interactive coaching chat
│ │ │ ├── Techniques/ # Teaching frameworks & technique library
│ │ │ ├── Export/ # PDF & Markdown export
│ │ │ ├── Growth/ # Growth tracking dashboard
│ │ │ ├── HowItWorks/ # How It Works explainer page
│ │ │ ├── Legal/ # Terms & Privacy views
│ │ │ └── Settings/ # User preferences
│ │ └── Core/
│ │ ├── Models/ # SwiftData models (Recording, Analysis, Reflection, ChatSession, etc.)
│ │ ├── Views/ # Shared UI components
│ │ ├── Theme/ # PSD branding (colors, typography, modifiers)
│ │ └── Services/ # Utility services
│ └── LessonLens.xcodeproj
├── CloudRunBackend/ # Primary backend (Google Cloud Run)
│ └── src/routes/ # API routes (auth, analyze, chat, upload)
├── shared/ # Shared prompt templates (text, video, chat)
│ └── prompts/
├── scripts/ # Deployment automation scripts
│ ├── setup.sh # Backend setup wizard (GCP + Cloud Run)
│ └── configure-app.sh # App configuration script (bundle ID, URLs)
├── docs/ # Documentation
│ ├── DEPLOYMENT.md # District deployment guide
│ └── DEPLOYMENT_CHECKLIST.md # Printable deployment checklist
└── CloudflareWorker/ # Alternative backend (Cloudflare Workers)
└── src/routes/ # API routes
- Record or Import — Teacher records a lesson or imports audio/video
- Transcribe — Audio transcribed locally via WhisperKit (or video sent to Gemini)
- Analyze — Transcript sent to Gemini for technique evaluation
- Self-Reflect — Teacher completes guided reflection before viewing AI feedback:
- What went well?
- What would you change?
- Self-rate each technique (1-5 stars)
- Pick 1-2 focus techniques
- (Can skip to go directly to feedback)
- Compare — Side-by-side view of self-ratings vs AI ratings with delta indicators
- Review Feedback — Full AI analysis with strengths, growth areas, technique evaluations, and next steps
- Chat — Ask follow-up questions with AI referencing timestamped transcript evidence
- Export — PDF or Markdown report with optional reflection data
The app ships with seven research-based frameworks for evaluating teaching:
Curated subset of Doug Lemov's techniques, filtered to those most reliably identifiable from teacher-student dialogue.
| Category | Techniques |
|---|---|
| Engagement | No Opt Out, Cold Call, Call and Response, Habits of Discussion |
| Questioning | Stretch It, Right is Right |
| Feedback | Format Matters, Precise Praise |
| Management | Positive Framing |
| Instruction | Without Apology |
| Domain | Components |
|---|---|
| Domain 2: Classroom Environment | 2a: Respect & Rapport, 2b: Culture for Learning, 2c: Managing Procedures, 2d: Managing Behavior |
| Domain 3: Instruction | 3a: Communicating with Students, 3b: Questioning & Discussion, 3c: Engaging Students, 3d: Using Assessment, 3e: Flexibility & Responsiveness |
| Principle | Focus |
|---|---|
| Daily Review | Begin lessons with review of previous learning |
| Small Steps | Present new material in small, manageable steps |
| Ask Questions | Frequent questioning to check understanding |
| Provide Models | Demonstrate and model procedures |
| Guide Practice | Supervised practice with feedback |
| Check Understanding | Verify comprehension before moving on |
| High Success Rate | Ensure students achieve mastery |
| Provide Scaffolds | Support complex tasks with frameworks |
| Independent Practice | Allow autonomous practice time |
| Weekly/Monthly Review | Regular review cycles |
Focuses on WICOR strategies: Writing, Inquiry, Collaboration, Organization, and Reading.
Based on the Five Core Propositions for accomplished teaching.
Peninsula School District's locally defined essential teaching practices.
Proactive and responsive strategies teachers can implement immediately to support student behavior and classroom management. Includes routines & expectations, environmental arrangement, greeting & connection, specific behavioral praise, calm redirection, de-escalation language, choice & autonomy, group momentum, restorative check-ins, and next-day reset.
Each technique includes:
- Description
- Look-fors (observable indicators)
- Exemplar phrases
- Records or imports audio
- Transcribes locally via WhisperKit
- Analyzes transcript for teaching techniques (Gemini 3 Pro)
- Detects wait time pauses (3+ seconds)
- Cost: ~$0.01-0.03 per analysis
- Rate limit: 20 analyses/hour
- Imports video recordings (5-50 minutes, max 2GB)
- Uploads directly to Google Gemini
- Analyzes visual + audio content (Gemini 3 Flash)
- Observes teacher positioning, student engagement, non-verbal cues
- Cost: ~$0.15-0.27 per analysis
- Rate limit: 5 analyses/hour
- Follow-up questions after analysis is complete
- Full context: timestamped transcript, analysis summary, technique evaluations, self-reflection
- Transcript formatted with
[MM:SS-MM:SS]timestamps and pause markers for evidence citation - Temperature 0.7 for more conversational responses
- Suggested starter questions generated from analysis data
- Video-only recordings auto-extract transcript before chat
- Rate limit: 50 messages/hour
When star ratings are enabled, each technique receives a 1-5 star rating:
| Rating | Level | Description |
|---|---|---|
| 1 | Developing | Technique not observed or needs significant development |
| 2 | Emerging | Beginning to implement technique with inconsistent results |
| 3 | Proficient | Solid implementation with room for refinement |
| 4 | Accomplished | Effective and consistent use of technique |
| 5 | Exemplary | Strong, consistent implementation that could serve as a model |
- Recording — Teaching session with audio/video file paths, status, and relationships to Transcript, Analysis, Reflection, and ChatSession
- Transcript — Full text with timestamped segments and detected pauses
- Analysis — AI-generated summary, strengths, growth areas, next steps, and technique evaluations
- TechniqueEvaluation — Per-technique rating, feedback, evidence, and suggestions
- Reflection — Teacher's self-reflection: what went well, what to change, self-ratings, focus techniques
- ChatSession — Coaching conversation container with cascade-deleted messages
- ChatMessage — Individual message (role: user/assistant) with timestamp
Deploying for another district? See docs/DEPLOYMENT.md for the full deployment guide with automated setup scripts.
- Go to Google Cloud Console
- Create a new project or select existing
- Enable Google Sign-In API
- Create OAuth 2.0 credentials (iOS application type, bundle ID:
com.peninsula.lessonlens) - Note the Client ID
# Automated (recommended)
bash scripts/setup.sh
# Or manually:
cd CloudRunBackend
bun install
gcloud run deploy lessonlens-api --source .cd LessonLens
open LessonLens.xcodeproj
# Build and run (⌘R) — Google Client ID is configured in ServiceContainer.swiftDEV_BYPASS_AUTH=1 # Optional: bypass OAuth for local testing
DEV_USE_BUNDLED_MODEL=1 # Optional: use bundled WhisperKit model
GEMINI_API_KEY- Google AI API keyGOOGLE_CLIENT_ID- Google OAuth client IDJWT_SECRET- Secret for signing session tokens (min 32 chars)ALLOWED_DOMAIN- Email domain restriction (e.g.,psd401.net)GEMINI_TEXT_MODEL- Text analysis model (default:gemini-3-pro-preview)GEMINI_VIDEO_MODEL- Video analysis model (default:gemini-3-flash-preview)RATE_LIMIT_PER_HOUR- Text analysis rate limit (default: 20)VIDEO_RATE_LIMIT_PER_HOUR- Video analysis rate limit (default: 5)CHAT_RATE_LIMIT_PER_HOUR- Chat message rate limit (default: 50)
| Endpoint | Description |
|---|---|
POST /auth/validate |
Validate Google ID token, return session JWT |
POST /auth/refresh |
Refresh expired session token |
| Endpoint | Description |
|---|---|
POST /analyze |
Analyze transcript for teaching techniques (Gemini) |
POST /analyze/video |
Analyze uploaded video (Gemini) |
GET /analyze/rate-limit |
Get current text analysis rate limit status |
GET /analyze/video/rate-limit |
Get current video analysis rate limit status |
| Endpoint | Description |
|---|---|
POST /chat |
Send coaching chat message with session context |
GET /chat/rate-limit |
Get current chat rate limit status |
| Endpoint | Description |
|---|---|
POST /upload/initiate |
Initiate Gemini video upload, get upload URL |
See Your Data Is Private above and the full Terms of Use and Privacy Policy.
Technical details:
- Domain-restricted — Only @psd401.net accounts can sign in (enforced on both client and server)
- Stateless backend — The Cloud Run proxy stores no transcripts, analysis results, or session data
- On-device transcription — WhisperKit runs locally on Apple Silicon; no audio uploaded
- Video auto-deletion — Videos are deleted from Google's Gemini API immediately after analysis
- Secure storage — Session tokens stored in macOS Keychain (
kSecAttrAccessibleWhenUnlockedThisDeviceOnly) - Rate limiting — Per-user hourly limits (20 text, 5 video, 50 chat)
cd CloudRunBackend
bun run dev# Backend
cd CloudRunBackend
bun test
# macOS App (in Xcode)
⌘UAnalysis reports can be exported in two formats:
- Multi-page layout with page numbers
- Configurable sections (summary, strengths, growth areas, techniques, next steps)
- Optional self-reflection section (what went well, what to change, self-ratings table, focus areas)
- Star rating visualization
- Evidence and suggestions for each technique
- Plain text format for easy sharing
- Same section configurability as PDF, including self-reflection
- Compatible with note-taking apps and documentation systems
For full multi-district deployment instructions, see docs/DEPLOYMENT.md and the printable checklist.
- Archive the app in Xcode (Product → Archive)
- Export with Developer ID signing
- Notarize the app
- Package as
.pkg:pkgbuild --component LessonLens.app --install-location /Applications LessonLens.pkg - Upload to your MDM (Jamf, Mosyle, Kandji, etc.) for distribution
LessonLens analyzes against several published instructional frameworks, with attribution to their originators throughout the app and documentation. Framework, technique, and program names referenced in this project — including but not limited to Teach Like a Champion and TLAC (Doug Lemov / Uncommon Schools), AVID and WICOR (AVID Center), the Danielson Framework for Teaching (The Danielson Group), and NBPTS / National Board for Professional Teaching Standards (National Board for Professional Teaching Standards) — are trademarks of their respective owners. LessonLens is not affiliated with, endorsed by, or sponsored by any of these organizations. References are descriptive and intended for nominative identification only.
This project is licensed under the MIT License.
Copyright (c) 2026 Peninsula School District.
See THIRD-PARTY-LICENSES.md for attribution of open-source dependencies.



