Spaces:
Sleeping
Here is Claude's plan: βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ PC Pal - Implementation Plan
Context
PC Pal is an AI-powered IT tutor for elderly and beginner PC users, delivered via a web chat interface. The project addresses the gap
where 57M+ Americans aged 65+ struggle with basic computer tasks but existing solutions (YouTube, IT help desks, generic AI) fail to
teach lasting skills. PC Pal provides patient, step-by-step guidance with annotated visual screenshots, vocabulary simplification, and
persistent skill tracking.
Delivery: Web UI (React) first. SMS (Twilio) and CollaborAITE integration planned for later.
Timeline: v1 by Apr 14 | v2 by Apr 21 | v3 by Apr 28
Tech Stack
ββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββββββββββββββββββ β Component β Choice β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Frontend β React (Vite) β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Backend β Node.js + Express β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β AI β Anthropic SDK (@anthropic-ai/sdk) with tool-use β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Database β SQLite (v1/v2 via better-sqlite3), PostgreSQL for v3 β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Real-time β WebSocket (via ws or Socket.IO) for streaming chat β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Image Processing β Sharp (Node.js) for annotated screenshots (v2) β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Scheduling β node-cron (v2+ for proactive messages) β ββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββββββββββββββββββ€ β Testing β Jest (backend), React Testing Library (frontend) β ββββββββββββββββββββ΄βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Architecture - Message Flow
React Chat UI (browser) | WebSocket or POST /api/chat v Express Server (server/index.js) | v ConversationRouter (server/core/conversationRouter.js) | lookup user, load/create session v SafetyMonitor (runs FIRST on every message) | emergency/scam detection v TaskClassifier (Claude call) | learn_skill | troubleshoot | follow_up | accessibility v AgentOrchestrator (Claude tool-use loop) | system prompt with user profile, history, vocab level | tools: get_next_step, complete_step, log_skill, flag_emergency v VocabularyFilter | replace jargon, enforce sentence length v WebSocket/Response β React Chat UI
Project Structure
client/ # React frontend (Vite) src/ App.jsx # Main app with routing components/ Chat/ ChatWindow.jsx # Main chat container MessageBubble.jsx # Individual message display MessageInput.jsx # Text input + send button StepIndicator.jsx # "Step 2 of 5" progress bar VisualGuide.jsx # Annotated screenshot display (v2) Onboarding/ OnboardingFlow.jsx # Name, OS, comfort level collection Layout/ Header.jsx # App header with user info Sidebar.jsx # Skill history panel (v3) hooks/ useChat.js # WebSocket connection + message state useUser.js # User profile state styles/ globals.css # Large fonts, high contrast, elderly-friendly main.jsx index.html vite.config.js
server/ # Node.js + Express backend index.js # Express app, WebSocket setup, DB init config.js # Environment variable loading db/ database.js # SQLite connection + schema init schema.sql # Table definitions models/ User.js # User CRUD operations Conversation.js # Conversation CRUD Message.js # Message CRUD SkillEvent.js # Skill event CRUD SafetyEvent.js # Safety event CRUD StepSequence.js # Step sequence CRUD core/ agentOrchestrator.js # Claude tool-use agent loop taskClassifier.js # Message classification via Claude userProfileManager.js # User profile logic + onboarding conversationState.js # Session lifecycle + memory stepSequencer.js # Numbered step management vocabularyFilter.js # Jargon replacement + readability skillTracker.js # Skill logging + reinforcement safetyMonitor.js # Emergency + scam detection proactiveEngine.js # Scheduled messages (v2) visualGuideGenerator.js # Annotated screenshots via Sharp (v2) assets/ vocabulary/ basicSubstitutions.json # Word replacement map screenshots/ # Pre-captured OS screenshots (v2) routes/ chat.js # POST /api/chat (REST fallback) users.js # GET/POST /api/users skills.js # GET /api/users/:id/skills (v3) tests/ vocabularyFilter.test.js taskClassifier.test.js stepSequencer.test.js safetyMonitor.test.js conversationFlow.test.js
package.json .env.example README.md
Database Schema (SQLite)
users
CREATE TABLE users ( id TEXT PRIMARY KEY, -- UUID name TEXT, os_type TEXT, -- 'Windows 10', 'Windows 11', 'macOS', 'iPhone', 'Android' vocabulary_level TEXT DEFAULT 'basic', -- basic | intermediate | standard accessibility_needs TEXT DEFAULT '[]', -- JSON array comfort_level INTEGER DEFAULT 1, -- 1-5 onboarded INTEGER DEFAULT 0, -- boolean created_at TEXT DEFAULT (datetime('now')), updated_at TEXT DEFAULT (datetime('now')) );
conversations
CREATE TABLE conversations ( id TEXT PRIMARY KEY, user_id TEXT REFERENCES users(id), task_type TEXT, status TEXT DEFAULT 'active', -- active | completed | abandoned context_summary TEXT, -- compressed older context started_at TEXT DEFAULT (datetime('now')), ended_at TEXT );
messages
CREATE TABLE messages ( id TEXT PRIMARY KEY, conversation_id TEXT REFERENCES conversations(id), role TEXT NOT NULL, -- 'user' | 'assistant' body TEXT NOT NULL, created_at TEXT DEFAULT (datetime('now')) );
step_sequences
CREATE TABLE step_sequences ( id TEXT PRIMARY KEY, conversation_id TEXT REFERENCES conversations(id), steps TEXT NOT NULL, -- JSON array of step objects current_index INTEGER DEFAULT 0, completed INTEGER DEFAULT 0 );
skill_events
CREATE TABLE skill_events ( id TEXT PRIMARY KEY, user_id TEXT REFERENCES users(id), skill_name TEXT NOT NULL, status TEXT DEFAULT 'started', -- started | completed | abandoned practiced_at TEXT DEFAULT (datetime('now')) );
safety_events
CREATE TABLE safety_events ( id TEXT PRIMARY KEY, user_id TEXT REFERENCES users(id), event_type TEXT NOT NULL, -- emergency | scam_detected | distress trigger_text TEXT, created_at TEXT DEFAULT (datetime('now')) );
Implementation Phases
Phase 1 β v1 by April 14 (Core Chat Loop)
Goal: User opens the web app, onboards (name + OS), and gets context-aware IT help from Claude with simplified vocabulary through a chat
interface.
Steps:
- Project setup
- Initialize Node.js project with package.json
- Initialize React project with Vite in client/
- Create .env.example with ANTHROPIC_API_KEY
- Create server/config.js for env loading
- Create server/db/database.js + schema.sql with all tables
- Files: package.json, .env.example, server/config.js, server/db/*
- Express server + WebSocket
- Express app in server/index.js with CORS, JSON parsing
- WebSocket server (ws library) on same port for real-time chat
- On WS connection: assign/lookup user session
- On WS message: route through processing pipeline, send response back
- REST fallback: POST /api/chat for non-WebSocket clients
- File: server/index.js, server/routes/chat.js
- React chat UI
- ChatWindow.jsx β scrollable message list + input
- MessageBubble.jsx β styled differently for user vs assistant messages
- MessageInput.jsx β large text input, prominent send button
- useChat.js hook β manages WebSocket connection, message state, send/receive
- Elderly-friendly CSS: minimum 18px font, high contrast, large click targets, simple layout
- Files: client/src/components/Chat/*, client/src/hooks/useChat.js, client/src/styles/globals.css
- Onboarding flow
- OnboardingFlow.jsx β large-button wizard: "What's your name?", "What computer do you use?" (Windows/Mac/iPhone/Android with icons),
"How comfortable are you with computers?" (1-5 scale) - Saves to users table via POST /api/users
- Shown on first visit, skipped after (user ID stored in localStorage)
- Files: client/src/components/Onboarding/OnboardingFlow.jsx, server/routes/users.js
- User profile manager
- getOrCreateUser(id), updateProfile(id, fields)
- Returns full user profile for system prompt injection
- File: server/core/userProfileManager.js, server/models/User.js
- Task classifier
- Single Claude call with classification prompt
- Returns: learn_skill | troubleshoot | follow_up | accessibility | unknown
- Also extracts: topic, urgency
- File: server/core/taskClassifier.js
- Agent orchestrator
- Build system prompt from user profile (name, OS, vocab level, skill history)
- Claude messages API with tool-use: log_skill_started, flag_emergency
- Load last 20 messages from DB as conversation history
- Patient, elderly-appropriate tone in system prompt
- Stream responses via WebSocket for real-time feel
- File: server/core/agentOrchestrator.js
- Vocabulary filter
- JSON config with word substitutions (browserβinternet, attachmentβfile in the email, etc.)
- filterResponse(text, vocabLevel) β applies substitutions
- Sentence length enforcement: split sentences > 20 words
- File: server/core/vocabularyFilter.js, server/assets/vocabulary/basicSubstitutions.json
- Conversation state
- getOrCreateSession(userId) β find active session or start new
- closeSession(sessionId) β mark completed
- Timeout: abandon sessions inactive > 30 min
- File: server/core/conversationState.js, server/models/Conversation.js
- Safety monitor (basic)
- Emergency keyword regex: "fallen", "can't breathe", "chest pain", "help me", "911", "emergency"
- On match: immediate response + log to safety_events
- Display alert banner in chat UI
- File: server/core/safetyMonitor.js
- Basic tests
- Test vocabulary filter substitutions
- Test safety monitor keyword detection
- Test task classifier with mocked Claude responses
- Files: server/tests/vocabularyFilter.test.js, server/tests/safetyMonitor.test.js
Phase 2 β v2 by April 21 (Step Sequencer + Visual Guides + Skill Tracking)
Goal: Multi-turn step-by-step walkthroughs with annotated screenshots displayed in chat.
Steps:
- Step sequencer
- createSequence(task, userId) β Claude generates numbered steps, stored in step_sequences
- getCurrentStep(sessionId) β returns step text + "Step X of Y"
- advanceStep(sessionId) β on user confirmation ("ok", "done", "got it", "next", "yes")
- isConfirmation(text) β fuzzy match for elderly-friendly confirmations
- File: server/core/stepSequencer.js
- Step UI component
- StepIndicator.jsx β progress bar showing "Step 2 of 5"
- Quick-reply buttons: "OK, done!", "I need help", "Go back"
- File: client/src/components/Chat/StepIndicator.jsx
- Agent orchestrator v2 β add tool-use for steps
- New tools: create_step_sequence, get_current_step, advance_step, send_visual_guide
- Agent decides when to break a task into steps vs. quick answer
- Update: server/core/agentOrchestrator.js
- Visual guide generator
- Pre-captured base screenshots for top 10 tasks (Windows 10/11, macOS)
- Sharp overlay: red circles, arrows, numbered callouts at JSON-defined coordinates
- Serve annotated images via Express static route /assets/guides/
- Display in VisualGuide.jsx component in chat
- Files: server/core/visualGuideGenerator.js, server/assets/screenshots/, client/src/components/Chat/VisualGuide.jsx
- Skill tracker
- logSkill(userId, skillName, status) β write to skill_events
- getUserSkills(userId) β list all learned skills
- getSkillsForReinforcement(userId) β skills not practiced in 7+ days
- File: server/core/skillTracker.js
- Scam detection
- Keyword patterns: gift cards, wire transfer, IRS, lottery, send money, Bitcoin
- Warn user with prominent alert in chat
- Update: server/core/safetyMonitor.js
- Context compression
- After 20 messages in a session, call Claude to summarize older messages
- Store summary in conversations.context_summary
- Inject summary into system prompt for continuity
- Update: server/core/conversationState.js
- Tests for v2 features
- Test step sequencer (advancement, confirmation detection, boundary conditions)
- Test full conversation flow (multi-turn mock)
- Files: server/tests/stepSequencer.test.js, server/tests/conversationFlow.test.js
Phase 3 β v3 by April 28 (Polish + Scaffolding Fade + Evaluation)
Goal: Fade scaffolding, accessibility improvements, skill dashboard, deployment.
Steps:
- Scaffolding fade logic
- If user completed a skill 3+ times, agent offers: "Want to try this on your own first?"
- On success: positive reinforcement. On failure: resume guided mode
- Update: server/core/agentOrchestrator.js, server/core/skillTracker.js
- Accessibility improvements
- Theme toggle: high contrast / large text / default
- Keyboard navigation throughout
- Larger step counts (more granular) for users with accessibility needs
- Update: client/src/styles/globals.css, client/src/components/
- Skill history sidebar
- Sidebar.jsx β shows all learned skills with dates and practice count
- GET /api/users/:id/skills endpoint
- Files: client/src/components/Layout/Sidebar.jsx, server/routes/skills.js
- Proactive messages (in-app)
- node-cron job checks for skill reinforcement opportunities
- Sends in-app notification: "Want to practice [skill] today?"
- File: server/core/proactiveEngine.js
- Deployment
- Build React β static files served by Express
- Deploy to Railway or Render
- Environment variables for secrets
- Update: server/index.js (serve static), README.md
- Evaluation prep
- Pre/post confidence survey component in React
- Conversation log export endpoint: GET /api/conversations/:id/export
- Skill completion rate metrics
Key Design Decisions
WebSocket for real-time chat: Streaming Claude responses token-by-token gives a natural chat feel. Fallback REST endpoint for reliability.
SQLite for v1/v2: Zero setup, single file DB. Same query patterns transfer to PostgreSQL for production. better-sqlite3 is synchronous
but fast enough for a class project. If async needed, switch to sqlite3 with promises.
Elderly-friendly UI defaults: 18px+ base font, high-contrast colors, large buttons, minimal navigation. No complex UI patterns β just a
chat window and onboarding wizard.
Context compression at 20 messages: Bounds token cost while maintaining conversation continuity. Claude summarizes older messages into a
compact context string.
Tool-use agent loop: Claude decides when to use tools (create steps, log skills, flag emergencies) rather than hardcoded routing. More
flexible and natural conversation flow.
Verification Plan
Local dev
- npm install in root and client/
- Set .env with ANTHROPIC_API_KEY
- npm run dev β starts Express (port 3001) + Vite dev server (port 5173) with proxy
- Open http://localhost:5173 in browser
Automated tests
- npm test β Jest tests for backend modules
- Mock Claude API responses with Jest mocks
- React Testing Library for component tests
Manual QA checklist per version
- Onboarding wizard collects name + OS + comfort level
- Chat message sends and receives response
- Vocabulary simplification in responses
- Emergency keyword triggers safety alert
- (v2) Step-by-step flow with progress bar and confirmation
- (v2) Annotated screenshot displays in chat
- (v2) Scam detection warning displays
- (v3) Skill fade ("try on your own") after 3 completions
- (v3) Skill history sidebar shows learned skills
- (v3) Deployed and accessible via public URL