A developer-first web application that acts as your personal AI assistant for messages, emails, calendar events, and memory management.
- π¬ Text Assistant: π€ Voice dictation or type rough messages - AI formats them professionally with proper grammar and spelling
- βοΈ Email Assistant: π€ Voice dictation or describe what you need - AI generates complete emails with proper salutations (Dear X) and professional closings
- π Calendar Assistant: π€ Voice dictation or type event details - AI parses natural language into structured calendar events
- π§ Memory Assistant: Store and manage personal facts and preferences
All input fields support voice dictation! Simply:
- Click the microphone button (π€)
- Speak naturally
- Click the stop button (βΉ) when done
- AI will process your spoken words
Browser Support: Works in Chrome, Edge, and Safari (uses Web Speech API)
This app uses OpenAI GPT-4o-mini to:
- Fix grammar, spelling, and punctuation in text messages
- Generate professionally formatted emails with proper structure
- Parse natural language into calendar events
- Provide casual but professional communication assistance
assistant/
βββ server/ # Node.js + Express backend
β βββ src/
β β βββ index.js
β β βββ routes/
β β β βββ ai.js
β β β βββ memory.js
β β βββ config/
β β βββ env.js
β βββ package.json
β βββ .env.example
βββ client/ # React + TypeScript frontend
β βββ src/
β β βββ App.tsx
β β βββ main.tsx
β β βββ components/
β β β βββ TextAssistant.tsx
β β β βββ EmailAssistant.tsx
β β β βββ CalendarAssistant.tsx
β β β βββ MemoryAssistant.tsx
β β βββ types/
β β βββ index.ts
β βββ package.json
β βββ vite.config.ts
βββ README.md
- Node.js (v18 or higher)
- npm or yarn
cd server
npm installcd server
cp .env.example .envEdit the .env file and add your OpenAI API key:
OPENAI_API_KEY=sk-your-actual-api-key-here
PORT=3001
IMPORTANT: You MUST add your OpenAI API key for the app to work! Get one at https://platform.openai.com/api-keys
cd ../client
npm installYou'll need two terminal windows - one for the server and one for the client.
cd server
npm run devYou should see:
β
Server running on http://localhost:3001
π‘ API endpoints:
- POST http://localhost:3001/api/ai/text
- POST http://localhost:3001/api/ai/email
- POST http://localhost:3001/api/ai/calendar
- POST http://localhost:3001/api/memory/add
- GET http://localhost:3001/api/memory/list
cd client
npm run devYou should see:
VITE v5.0.8 ready in XXX ms
β Local: http://localhost:3000/
β Network: use --host to expose
Navigate to: http://localhost:3000
- Click on the π¬ Text tab
- Type a message:
hey can u meet me tomorrow at 3? - Select a tone: Professional
- Click Rewrite Message
- You should see a dummy response like:
hey can u meet me tomorrow at 3? (Professional) - Click Copy to Clipboard to copy the result
- Click on the βοΈ Email tab
- Describe an email:
Write to my boss explaining I need to leave early tomorrow for a doctor's appointment - Click Generate Email
- View the generated subject and body
- Use Copy Subject / Copy Body buttons
- Click Open in Gmail to compose in Gmail
- Click on the π Calendar tab
- Describe an event:
Schedule lunch with John next Wednesday at 1 pm at Applebee's, remind me 30 minutes before - Click Create Event
- View the parsed event details
- Click on the π§ Memory tab
- Add facts:
My name is Brandon - Add more:
PO email is officer@example.com - All stored memories will appear below
- These memories can later be used as context for AI responses
β Completed:
- Full project structure
- Express backend with all API endpoints
- React frontend with all 4 modes
- Dummy responses for testing
- Complete UI with copy/paste functionality
π§ Next Steps:
- Replace dummy responses with real OpenAI API calls
- Implement proper AI prompting with tone awareness
- Add memory context injection into AI prompts
- Implement .ics file download for calendar events
- Add persistent storage for memories (JSON file or database)
Backend:
- Node.js
- Express
- CORS
- dotenv
Frontend:
- React 18
- TypeScript
- Vite
- CSS3
Rewrite a message in a specific tone.
Request:
{
"message": "string",
"tone": "Professional" | "Supportive" | "Short & Clear"
}Response:
{
"success": true,
"original": "string",
"tone": "string",
"rewritten": "string"
}Generate an email from a description.
Request:
{
"prompt": "string"
}Response:
{
"type": "email",
"to": "string",
"subject": "string",
"body": "string"
}Parse natural language into a calendar event.
Request:
{
"prompt": "string"
}Response:
{
"type": "calendar",
"title": "string",
"notes": "string | null",
"start": "ISO-8601 datetime",
"end": "ISO-8601 datetime",
"reminderMinutesBefore": "number | null"
}Store a new memory/fact.
Request:
{
"fact": "string"
}Response:
{
"success": true,
"fact": "string",
"totalMemories": number
}Retrieve all stored memories.
Response:
{
"type": "memory_dump",
"memories": ["string", "string", ...]
}| Variable | Description | Required |
|---|---|---|
OPENAI_API_KEY |
Your OpenAI API key | Yes (for AI features) |
PORT |
Server port (default: 3001) | No |
express: Web frameworkcors: Enable CORSdotenv: Environment variable management
react: UI frameworkreact-dom: React DOM renderertypescript: Type safetyvite: Build tool and dev server@vitejs/plugin-react: Vite React plugin
This is a personal development project. Feel free to fork and customize for your own use!
ISC
Built with β€οΈ for personal productivity