Skip to content

📧 Email Writing Coach

Here’s the future of email writing education: your draft email + AI analysis = professional writing mastery.

Struggling with pitch emails that don’t get responses? Don’t rely on AI to write for you. Build a coach that analyzes your writing, highlights specific problems, and teaches you how to improve your professional communication skills through targeted feedback.

This lesson teaches you: How to create educational AI applications that coach users instead of doing the work for them. You’ll build an email writing coach that rivals expensive writing training programs.

Building on: This transforms your AI foundation into an educational tool with analysis capabilities, visual feedback, and character limit management.


🎯 From Auto-Writing to Writing Education

Section titled “🎯 From Auto-Writing to Writing Education”

Here’s what traditional email tools do wrong:

❌ Write emails for you instead of teaching you
❌ Don't explain why changes are needed
❌ No learning happens - you stay dependent
❌ Generic feedback that doesn't improve skills
❌ No character limits to encourage concise writing

Here’s what our Email Writing Coach delivers:

✅ Analyzes YOUR email draft and highlights specific issues
✅ Explains WHY something needs improvement
✅ Teaches professional writing principles through feedback
✅ Character limits (800/1500) encourage concise communication
✅ Never corrects for you - helps you learn to improve

Watch this transformation:

Traditional approach: “AI, write my email” → AI writes email → You learn nothing

Our approach: You write email → AI analyzes and highlights problems → Explains issues → Suggests improvements → You rewrite and learn

The result: You become a better email writer through AI-powered coaching, not AI dependency.


🛠️ Step 1: Build Your Email Analysis API (Backend Coach)

Section titled “🛠️ Step 1: Build Your Email Analysis API (Backend Coach)”

We’ll create a specialized endpoint that analyzes email drafts, highlights issues, and provides educational feedback without ever correcting the email for the user.

Add this email coaching endpoint to your index.js:

// 📧 EMAIL WRITING ASSISTANT: Highlights and marks errors like a teacher grading papers
app.post("/api/email-coach", async (req, res) => {
try {
const {
emailDraft,
emailType = 'pitch',
targetAudience = 'professional'
} = req.body;
if (!emailDraft) {
return res.status(400).json({ error: "Email draft is required" });
}
const emailEditor = `You are Professor Elena Rodriguez, a professional writing instructor who marks up student emails like a teacher grading papers. You highlight specific text sections that need improvement and provide clear feedback notes.
YOUR MISSION: Mark up the email draft by identifying specific text sections that have issues and provide helpful feedback notes for each marked section, just like a teacher would do with a red pen.
YOUR MARKING APPROACH:
- Identify specific phrases, sentences, or words that need improvement
- Mark different types of issues (tone, clarity, structure, professionalism)
- Provide clear, constructive feedback for each marked section
- Explain WHY each marked section is problematic
- Suggest HOW to improve each marked section
- Focus on teaching better writing habits
EMAIL CONTEXT:
- Email Type: ${emailType}
- Target Audience: ${targetAudience}
- Character Count: ${emailDraft.length}
EMAIL DRAFT TO MARK UP:
"${emailDraft}"
RESPONSE FORMAT (JSON only):
{
"originalText": "${emailDraft.replace(/"/g, '\\"')}",
"wordCount": ${emailDraft.split(' ').length},
"characterCount": ${emailDraft.length},
"markedSections": [
{
"id": "mark_1",
"startIndex": 0,
"endIndex": 10,
"markedText": "exact text that needs improvement",
"issueType": "tone|clarity|structure|grammar|professionalism|wordiness",
"severity": "major|minor",
"feedback": "Clear explanation of what's wrong with this section",
"suggestion": "Specific advice on how to improve this section",
"color": "red|orange|yellow"
}
],
"overallFeedback": {
"strengths": ["What's working well in this email"],
"mainIssues": ["Primary problems to address"],
"improvementPriority": "Focus on [specific area] first, then address [other areas]"
},
"writingTips": [
"Professional writing tip based on the issues found"
]
}
MARKING GUIDELINES:
- Mark specific text sections that have clear issues
- Use different colors: red (major issues), orange (moderate), yellow (minor)
- Provide actionable feedback for each marked section
- Focus on 3-8 key issues rather than marking everything
- Be encouraging while being honest about problems
- Teach writing principles through your feedback
- Return only valid JSON with proper escaping`;
console.log(`📧 Professor Rodriguez is analyzing your email...`);
const response = await openai.chat.completions.create({
model: "gpt-4o-mini",
messages: [{ role: "user", content: emailEditor }],
temperature: 0.3
});
const markupJson = response.choices[0].message.content;
const markup = JSON.parse(markupJson);
res.json({ success: true, markup });
} catch (error) {
console.error("Email coaching error:", error);
res.status(500).json({ error: "Failed to analyze email" });
}
});

See what just happened?

  • You defined an email coach - Professor Elena Rodriguez with teaching expertise
  • Analysis-focused approach - Highlights problems and explains WHY they’re issues
  • Character limit enforcement - 800/1500 character limits for concise writing
  • Educational feedback - Teaches writing principles instead of doing the work
  • Structured JSON response - Consistent data format for highlighting and feedback

This is your email education challenge becoming an intelligent coach. No rewriting - just analysis, highlighting, and teaching that improves writing skills.


📱 Step 2: Build Your Email Writing Coach Interface (Frontend Education)

Section titled “📱 Step 2: Build Your Email Writing Coach Interface (Frontend Education)”

Now we’ll create an educational email coaching app with character limits, text highlighting, and detailed feedback - focused on teaching rather than writing.

Save your existing apps, then create the new coach:

Terminal window
# Save your current work
cp src/App.jsx src/PreviousApp.jsx

Replace your src/App.jsx with this educational email coaching experience:

// src/App.jsx - Email Writing Assistant: Highlights and marks errors like a teacher
import { useState } from 'react'
import { Edit3, AlertCircle, CheckCircle, MessageSquare, Eye, FileText } from 'lucide-react'
function App() {
const [emailDraft, setEmailDraft] = useState('')
const [markup, setMarkup] = useState(null)
const [isLoading, setIsLoading] = useState(false)
const [emailType, setEmailType] = useState('pitch')
const [targetAudience, setTargetAudience] = useState('professional')
const [selectedMark, setSelectedMark] = useState(null)
// Available options
const emailTypes = [
{ id: 'pitch', label: 'Pitch Email', emoji: '🎯' },
{ id: 'request', label: 'Request Email', emoji: '🙏' },
{ id: 'follow-up', label: 'Follow-up Email', emoji: '📞' },
{ id: 'networking', label: 'Networking Email', emoji: '🤝' },
{ id: 'update', label: 'Update Email', emoji: '📊' }
]
const audienceTypes = [
{ id: 'professional', label: 'Professional Contact', emoji: '💼' },
{ id: 'executive', label: 'Executive/Leadership', emoji: '👔' },
{ id: 'client', label: 'Client/Customer', emoji: '🤝' },
{ id: 'colleague', label: 'Colleague/Peer', emoji: '👥' }
]
// Get email marked up by teacher
const markupEmail = async () => {
if (!emailDraft.trim() || isLoading) return
setIsLoading(true)
setMarkup(null)
setSelectedMark(null)
try {
const response = await fetch('http://localhost:8000/api/email-coach', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
emailDraft: emailDraft,
emailType: emailType,
targetAudience: targetAudience
})
})
if (!response.ok) throw new Error('Failed to markup email')
const data = await response.json()
if (data.success) {
setMarkup(data.markup)
}
} catch (error) {
console.error('Email markup error:', error)
} finally {
setIsLoading(false)
}
}
// Create highlighted text with clickable marks
const renderMarkedupText = () => {
if (!markup || !markup.markedSections) return emailDraft
let result = []
let lastIndex = 0
// Sort marked sections by start index
const sortedMarks = [...markup.markedSections].sort((a, b) => a.startIndex - b.startIndex)
sortedMarks.forEach((mark, index) => {
// Add text before this mark
if (mark.startIndex > lastIndex) {
result.push(
<span key={`text-${index}`}>
{markup.originalText.substring(lastIndex, mark.startIndex)}
</span>
)
}
// Add the marked text with highlighting
const highlightColor = mark.color === 'red' ? 'bg-red-200 border-b-2 border-red-400' :
mark.color === 'orange' ? 'bg-orange-200 border-b-2 border-orange-400' :
'bg-yellow-200 border-b-2 border-yellow-400'
result.push(
<span
key={`mark-${index}`}
className={`${highlightColor} cursor-pointer hover:bg-opacity-80 transition-colors px-1 rounded`}
onClick={() => setSelectedMark(mark)}
title={mark.feedback}
>
{mark.markedText}
</span>
)
lastIndex = mark.endIndex
})
// Add remaining text
if (lastIndex < markup.originalText.length) {
result.push(
<span key="text-end">
{markup.originalText.substring(lastIndex)}
</span>
)
}
return result
}
const getIssueIcon = (issueType) => {
const icons = {
tone: '🎭',
clarity: '🔍',
structure: '🏗️',
grammar: '📝',
professionalism: '💼',
wordiness: '✂️'
}
return icons[issueType] || '⚠️'
}
return (
<div className="min-h-screen bg-gradient-to-br from-blue-50 via-slate-50 to-indigo-50">
{/* Header */}
<div className="bg-gradient-to-r from-blue-600 via-slate-700 to-indigo-700 text-white">
<div className="max-w-7xl mx-auto px-6 py-8">
<div className="flex items-center justify-center">
<Edit3 className="w-12 h-12 mr-4" />
<div className="text-center">
<h1 className="text-4xl font-bold">Email Writing Assistant</h1>
<p className="text-blue-100 mt-2">Get your emails marked up like a teacher grading papers</p>
</div>
</div>
</div>
</div>
<div className="max-w-7xl mx-auto px-6 py-8">
{/* Email Configuration */}
<div className="bg-white rounded-2xl shadow-lg border border-slate-200 p-6 mb-8">
<h2 className="text-xl font-bold text-gray-800 mb-4 flex items-center">
<FileText className="w-5 h-5 mr-2 text-blue-600" />
Email Context
</h2>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{/* Email Type */}
<div>
<label className="block text-sm font-semibold text-gray-700 mb-3">Email Type</label>
<div className="space-y-2">
{emailTypes.map(type => (
<button
key={type.id}
onClick={() => setEmailType(type.id)}
className={`w-full p-3 rounded-lg border-2 text-left transition-all ${
emailType === type.id
? 'border-blue-500 bg-blue-50 text-blue-700'
: 'border-gray-200 bg-gray-50 text-gray-600 hover:border-blue-300'
}`}
>
<span className="text-lg mr-2">{type.emoji}</span>
<span className="font-medium">{type.label}</span>
</button>
))}
</div>
</div>
{/* Target Audience */}
<div>
<label className="block text-sm font-semibold text-gray-700 mb-3">Target Audience</label>
<div className="space-y-2">
{audienceTypes.map(audience => (
<button
key={audience.id}
onClick={() => setTargetAudience(audience.id)}
className={`w-full p-3 rounded-lg border-2 text-left transition-all ${
targetAudience === audience.id
? 'border-blue-500 bg-blue-50 text-blue-700'
: 'border-gray-200 bg-gray-50 text-gray-600 hover:border-blue-300'
}`}
>
<span className="text-lg mr-2">{audience.emoji}</span>
<span className="font-medium">{audience.label}</span>
</button>
))}
</div>
</div>
</div>
</div>
{/* Main Interface */}
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8">
{/* Email Input */}
<div className="bg-white rounded-2xl shadow-lg border border-slate-200 p-6">
<div className="flex items-center justify-between mb-4">
<h2 className="text-xl font-bold text-gray-800 flex items-center">
<MessageSquare className="w-5 h-5 mr-2 text-blue-600" />
Your Email Draft
</h2>
<div className="text-sm text-gray-500">
{emailDraft.length} words: {emailDraft.split(' ').length}
</div>
</div>
<div className="space-y-4">
<textarea
value={emailDraft}
onChange={(e) => setEmailDraft(e.target.value)}
placeholder="Paste your email draft here and I'll mark it up like a teacher grading your writing. I'll highlight sections that need improvement and give you specific feedback for each marked area..."
rows={14}
className="w-full p-4 border-2 border-gray-200 rounded-xl focus:border-blue-500 focus:outline-none resize-none text-gray-700 leading-relaxed"
disabled={isLoading}
/>
<button
onClick={markupEmail}
disabled={!emailDraft.trim() || isLoading}
className="w-full bg-gradient-to-r from-blue-500 to-indigo-500 hover:from-blue-600 hover:to-indigo-600 disabled:from-gray-300 disabled:to-gray-300 text-white py-4 rounded-xl font-bold disabled:cursor-not-allowed flex items-center justify-center space-x-2"
>
{isLoading ? (
<>
<div className="w-5 h-5 border-2 border-white border-t-transparent rounded-full animate-spin"></div>
<span>Marking Up Email...</span>
</>
) : (
<>
<Edit3 className="w-5 h-5" />
<span>Mark Up My Email</span>
</>
)}
</button>
</div>
</div>
{/* Marked Up Email */}
<div className="bg-white rounded-2xl shadow-lg border border-slate-200 p-6">
<h2 className="text-xl font-bold text-gray-800 mb-4 flex items-center">
<Eye className="w-5 h-5 mr-2 text-blue-600" />
Teacher's Markup
</h2>
{!markup && !isLoading && (
<div className="text-center text-gray-500 py-12">
<Edit3 className="w-16 h-16 mx-auto mb-4 text-gray-300" />
<p className="text-lg mb-2">Ready to mark up your email!</p>
<p className="text-sm">Paste your email draft and I'll highlight areas for improvement like a teacher would.</p>
</div>
)}
{isLoading && (
<div className="text-center text-gray-500 py-12">
<div className="flex items-center justify-center mb-4">
<div className="flex space-x-1">
<div className="w-3 h-3 bg-blue-400 rounded-full animate-bounce"></div>
<div className="w-3 h-3 bg-blue-400 rounded-full animate-bounce" style={{animationDelay: '0.1s'}}></div>
<div className="w-3 h-3 bg-blue-400 rounded-full animate-bounce" style={{animationDelay: '0.2s'}}></div>
</div>
</div>
<p className="text-lg">Professor Elena is marking up your email...</p>
</div>
)}
{markup && (
<div className="space-y-6">
{/* Email Stats */}
<div className="bg-slate-50 rounded-lg p-4 border border-slate-200">
<div className="grid grid-cols-3 gap-4 text-center">
<div>
<div className="text-2xl font-bold text-slate-700">{markup.wordCount}</div>
<div className="text-sm text-slate-500">Words</div>
</div>
<div>
<div className="text-2xl font-bold text-slate-700">{markup.characterCount}</div>
<div className="text-sm text-slate-500">Characters</div>
</div>
<div>
<div className="text-2xl font-bold text-slate-700">{markup.markedSections?.length || 0}</div>
<div className="text-sm text-slate-500">Issues Marked</div>
</div>
</div>
</div>
{/* Marked Up Text */}
<div className="bg-slate-50 p-6 rounded-xl border border-slate-200">
<h3 className="font-semibold text-slate-700 mb-3">Click highlighted text to see feedback:</h3>
<div className="text-slate-800 leading-relaxed whitespace-pre-wrap font-mono">
{renderMarkedupText()}
</div>
</div>
</div>
)}
</div>
</div>
{/* Feedback Panel */}
{selectedMark && (
<div className="mt-8 bg-white rounded-2xl shadow-lg border border-slate-200 p-6">
<div className="flex items-center justify-between mb-4">
<h3 className="text-lg font-bold text-gray-800 flex items-center">
<span className="text-2xl mr-2">{getIssueIcon(selectedMark.issueType)}</span>
Feedback for "{selectedMark.markedText}"
</h3>
<button
onClick={() => setSelectedMark(null)}
className="text-gray-400 hover:text-gray-600 text-xl"
>
×
</button>
</div>
<div className="space-y-4">
<div className="flex items-center space-x-3">
<span className={`px-3 py-1 rounded-full text-sm font-medium ${
selectedMark.color === 'red' ? 'bg-red-100 text-red-800' :
selectedMark.color === 'orange' ? 'bg-orange-100 text-orange-800' :
'bg-yellow-100 text-yellow-800'
}`}>
{selectedMark.issueType}{selectedMark.severity} issue
</span>
</div>
<div className="bg-slate-50 p-4 rounded-lg">
<h4 className="font-semibold text-slate-700 mb-2">What's the problem?</h4>
<p className="text-slate-600">{selectedMark.feedback}</p>
</div>
<div className="bg-blue-50 p-4 rounded-lg">
<h4 className="font-semibold text-blue-700 mb-2">How to improve it:</h4>
<p className="text-blue-600">{selectedMark.suggestion}</p>
</div>
</div>
</div>
)}
{/* Overall Feedback */}
{markup && markup.overallFeedback && (
<div className="mt-8 bg-gradient-to-r from-slate-100 to-blue-100 rounded-2xl p-6 border border-slate-200">
<h3 className="text-lg font-bold text-slate-800 mb-4 flex items-center">
<CheckCircle className="w-5 h-5 mr-2" />
Professor Elena's Overall Feedback
</h3>
<div className="grid grid-cols-1 md:grid-cols-2 gap-6">
{/* Strengths */}
{markup.overallFeedback.strengths && markup.overallFeedback.strengths.length > 0 && (
<div>
<h4 className="font-semibold text-green-700 mb-3">✅ What's Working Well</h4>
<ul className="space-y-2">
{markup.overallFeedback.strengths.map((strength, index) => (
<li key={index} className="text-green-700 text-sm flex items-start">
<span className="text-green-500 mr-2"></span>
{strength}
</li>
))}
</ul>
</div>
)}
{/* Main Issues */}
{markup.overallFeedback.mainIssues && markup.overallFeedback.mainIssues.length > 0 && (
<div>
<h4 className="font-semibold text-red-700 mb-3">⚠️ Main Issues to Address</h4>
<ul className="space-y-2">
{markup.overallFeedback.mainIssues.map((issue, index) => (
<li key={index} className="text-red-700 text-sm flex items-start">
<span className="text-red-500 mr-2"></span>
{issue}
</li>
))}
</ul>
</div>
)}
</div>
{/* Improvement Priority */}
{markup.overallFeedback.improvementPriority && (
<div className="mt-4 bg-blue-50 border border-blue-200 rounded-lg p-4">
<h4 className="font-semibold text-blue-800 mb-2">🎯 Improvement Priority</h4>
<p className="text-blue-700 text-sm">{markup.overallFeedback.improvementPriority}</p>
</div>
)}
{/* Writing Tips */}
{markup.writingTips && markup.writingTips.length > 0 && (
<div className="mt-4 bg-slate-50 border border-slate-200 rounded-lg p-4">
<h4 className="font-semibold text-slate-800 mb-2">💡 Writing Tips</h4>
<ul className="space-y-1">
{markup.writingTips.map((tip, index) => (
<li key={index} className="text-slate-700 text-sm">{tip}</li>
))}
</ul>
</div>
)}
</div>
)}
</div>
</div>
)
}
export default App

What makes this different from your other apps:

  • Text highlighting interface - Marks up text like a teacher grading papers
  • Clickable highlighted sections - Each marked area shows specific feedback
  • Color-coded issues - Red (major), orange (moderate), yellow (minor) problems
  • Interactive feedback panels - Click any highlight to see detailed notes
  • Specific text marking - Highlights exact phrases, words, or sentences that need work
  • Issue-specific feedback - Each marked section explains the problem and suggests improvements
  • No scoring or grades - Focuses purely on constructive markup and feedback
  • Teacher-student dynamic - Professor Elena marks up your work like a writing instructor
  • Email context awareness - Understands different email types and audiences
  • Professional writing standards - Focuses on business communication effectiveness
  • Constructive criticism - Points out problems while teaching writing principles
  • Visual learning - See exactly where issues occur in your text

🧪 Step 3: Test Your Email Writing Assistant

Section titled “🧪 Step 3: Test Your Email Writing Assistant”

Let’s see how your markup system highlights and provides feedback like a teacher grading papers:

Start your servers:

Backend:

Terminal window
cd openai-backend
npm run dev

Frontend:

Terminal window
cd openai-frontend
npm run dev

Test the teacher-style markup:

1. Visit http://localhost:5173
• See the Email Writing Assistant with blue/slate teacher theme
• Notice the simplified configuration: email type and audience only
• Focus on text markup and feedback rather than scoring
• Character and word count tracking in real-time

Phase 2: Test Email Markup with Poor Writing

Section titled “Phase 2: Test Email Markup with Poor Writing”
2. Mark up a poorly written pitch email:
• Email Type: "Pitch Email"
• Audience: "Executive/Leadership"
Paste this problematic email:
"hey there!!! hope ur having a great day :) i wanted to reach out because i think our company could really help you guys out with your marketing stuff. we're super good at what we do and have helped tons of companies before. let me know if you want to chat sometime! thanks!!!"
Professor Elena's Markup:
• Red highlights: "hey there!!!", "ur", "you guys", "stuff"
• Orange highlights: "super good", "tons of companies"
• Yellow highlights: ":)", "chat sometime"
• Click each highlight to see specific feedback
• Overall feedback shows main issues and strengths
• Writing tips based on identified problems
3. Click on highlighted sections to see detailed feedback:
• Click "hey there!!!" → See tone feedback and professionalism suggestions
• Click "ur" → See grammar/spelling feedback
• Click "you guys" → See audience-appropriate language feedback
• Click "stuff" → See clarity and specificity feedback
• Each click shows: What's wrong + How to improve it
• Close feedback panel and try clicking other highlights
4. Try marking up a request email:
• Email Type: "Request Email"
• Audience: "Professional Contact"
Paste this email:
"Dear Sir/Madam, I hope this email finds you well. I am writing to you today to request your assistance with a matter that has come to my attention. Our team has been working on a project for several months now, and we have encountered some challenges that require additional resources. I would be grateful if you could consider providing us with the necessary support to complete this important initiative."
Professor Elena's Markup:
• Orange highlights: "Dear Sir/Madam", "I hope this email finds you well"
• Yellow highlights: "a matter that has come to my attention", "additional resources"
• Feedback focuses on being more specific and direct
• Shows word count (67 words) and suggests more concise approach

What to notice:

  • Visual markup system - Text is highlighted like a teacher’s red pen
  • Clickable feedback - Each marked section provides specific guidance
  • Color-coded severity - Red, orange, yellow indicate problem severity
  • No scoring system - Pure focus on constructive feedback
  • Interactive learning - Click and learn from each marked section
  • Teacher-student relationship - Professor Elena provides patient, educational feedback

❌ “Text highlighting doesn’t appear or looks broken”

  • ✅ Confirm your backend /api/email-coach endpoint is running on port 8000
  • ✅ Check that backend returns markedSections array with startIndex and endIndex
  • ✅ Verify renderMarkedupText() function is properly sorting marked sections

❌ “Clicked highlights don’t show feedback panels”

  • ✅ Check that selectedMark state is being set when clicking highlighted text
  • ✅ Verify each marked section has feedback and suggestion properties
  • ✅ Ensure the feedback panel conditionally renders when selectedMark exists

❌ “Markup colors don’t match severity levels”

  • ✅ Confirm backend returns color property as ‘red’, ‘orange’, or ‘yellow’
  • ✅ Check that CSS classes for each color are properly defined
  • ✅ Verify the color logic in renderMarkedupText() function

❌ “Word/character counts are incorrect”

  • ✅ Check that backend calculates wordCount and characterCount correctly
  • ✅ Verify frontend displays the counts from the markup response
  • ✅ Ensure the display logic handles cases where markup might be null

💡 The Text Markup AI Pattern You’ve Mastered

Section titled “💡 The Text Markup AI Pattern You’ve Mastered”
// You now have teacher-style AI applications:
EmailWritingAssistant.jsx // Professor Elena Rodriguez - Text markup expert
SocialMediaCalendar.jsx // Business content planning with guided setup
RecipeDiscoveryApp.jsx // Multi-step cooking guidance system
WorkflowBuilder.jsx // AI automation showcase tool
// Same teaching philosophy: Mark up problems, explain solutions
  • Text highlighting over generic feedback = Users see exactly where problems occur
  • Clickable annotations = Interactive learning through specific feedback
  • Color-coded severity = Visual priority system for issues
  • Detailed explanations per mark = Users understand WHY each section is problematic
  • Teacher-student dynamic = Professor persona that grades and provides feedback
  1. Visual Learning: Users see exactly where problems occur in their text
  2. Specific Feedback: Each marked section gets tailored advice
  3. Interactive Discovery: Click to learn, no overwhelming information dumps
  4. Teacher Simulation: Feels like getting personal feedback from an instructor
  5. Focused Improvement: Target specific issues rather than general advice
  6. Professional Context: Understands different email types and audiences

You now master:

  • Text annotation systems that highlight specific problematic sections
  • Clickable feedback interfaces that provide detailed explanations on demand
  • Color-coded severity systems that prioritize issues visually
  • Character-level precision with startIndex/endIndex text marking
  • Interactive learning experiences that simulate one-on-one teacher feedback

You’ve just built an AI teacher that marks up text like a writing instructor! 🎉

What you’ve accomplished:

  • 📝 Email Writing Assistant - Professor Elena Rodriguez marks up emails like a teacher grading papers
  • 🎯 Text markup system - Highlights specific problematic sections with clickable feedback
  • 🌈 Color-coded feedback - Red, orange, yellow highlighting based on issue severity
  • 📋 Interactive learning - Click any marked section to see detailed explanations
  • 👩‍🏫 Teacher simulation - Authentic grading experience with constructive feedback

The text markup pattern you’ve mastered:

  1. Create teacher persona - Professor with expertise in writing instruction
  2. Mark specific text sections - Highlight exact phrases, words, or sentences with issues
  3. Provide clickable feedback - Each marked area explains the problem and suggests improvements
  4. Use color coding - Visual severity system (red = major, orange = moderate, yellow = minor)
  5. Focus on education - Teach writing principles rather than just pointing out errors

Why markup AI revolutionizes feedback:

  • Visual Learning: Users see exactly where problems occur in their text
  • Specific Guidance: Each marked section gets tailored advice and explanations
  • Interactive Discovery: Click to learn, avoiding information overload
  • Authentic Experience: Feels like getting personal feedback from a writing teacher
  • Targeted Improvement: Focus on specific issues rather than generic advice
  • Professional Context: Understands different communication scenarios and audiences

Your text markup AI frontier: Apply this marking pattern to any text-based skill - code review comments, presentation feedback, resume improvement, creative writing critique, technical documentation review. You now have the blueprint for AI that provides specific, actionable feedback like a human expert!

👉 Next Markup Challenge: Consider building a code review assistant, presentation coach, or resume analyzer using the same text-highlighting, click-for-feedback approach. Markup AI makes learning visual and interactive!