Work Planner is a local-first desktop tool for academic work planning, execution tracking, and research workflow management.
It is designed to help researchers and students organize long-term projects, daily tasks, deadlines, and execution records in a lightweight local environment.
Academic research often involves multiple parallel projects, uncertain deadlines, fragmented tasks, and long feedback cycles. This tool was built to support a more structured research workflow, with an emphasis on planning, execution, and reflection rather than simple task listing.
- Local-first desktop application.
- Task and project management for academic work.
- Execution tracking for daily research routines.
- SQLite-based local data storage.
- Built with Electron, React, TypeScript, and SQLite.
This project is not a research paper artifact. Instead, it is a side engineering project for improving academic productivity and long-term research execution.
It reflects my interest in building practical tools that support research planning, project management, and sustained execution across multiple academic tasks.
- Node.js 18+ (recommend 20+)
- npm or yarn
- For AI features: OpenAI API key or Ollama running locally
cd Work_Planning_Agent
npm install
npm run devThis starts Vite dev server and Electron in development mode.
Note: If running from within an Electron-based IDE (e.g., Cursor, VS Code), the ELECTRON_RUN_AS_NODE environment variable may be set. The dev script handles this automatically. If you encounter issues, unset it manually: unset ELECTRON_RUN_AS_NODE && npm run dev.
# Build for macOS
npm run package:mac
# Build for current platform
npm run packageBuilt app will be in the release/ directory. On macOS, you'll find a .dmg file.
npm test- Open Settings in the app
- Select "OpenAI" as provider
- The app auto-detects
OPENAI_API_KEYfrom your system environment - Or manually enter your API key in the settings
- Configure base URL and model name as needed
Key precedence: Manual entry in Settings > Environment variable
- Install and run Ollama
- Pull a model:
ollama pull llama3.2 - Open Settings, select "Ollama"
- Default endpoint:
http://localhost:11434
The app works fully without AI. Task parsing uses basic line splitting, and planning uses the deterministic scheduling engine.
- Electron - Desktop shell
- React 18 - UI framework
- TypeScript - Type safety
- Vite - Build tool with HMR
- SQLite (better-sqlite3) - Local database
- Tailwind CSS - Styling
- Zustand - State management
- date-fns - Date utilities
- Lucide React - Icons
- electron-builder - Packaging
src/
├── main/ # Electron main process
│ ├── main.ts # App entry, window creation
│ ├── preload.ts # IPC bridge (contextIsolation)
│ ├── database.ts # SQLite schema & initialization
│ ├── ipc-handlers.ts # All IPC handler registration
│ └── services/
│ ├── ai-service.ts # AI abstraction (OpenAI + Ollama)
│ ├── scheduling-service.ts # Deterministic planning engine
│ ├── recurrence-service.ts # Recurring task logic
│ ├── report-service.ts # Weekly report generation
│ └── seed-data.ts # Demo data
├── renderer/ # React frontend
│ ├── App.tsx
│ ├── main.tsx
│ ├── index.css # Tailwind + custom styles
│ ├── components/ # Reusable UI components
│ ├── pages/ # Page-level components
│ ├── store/ # Zustand state management
│ ├── lib/ # Utilities
│ └── types/ # TypeScript declarations
├── shared/
│ └── types.ts # Shared type definitions
└── tests/ # Test files
The app is designed to be keyboard-friendly. Navigation is via the sidebar.
Data is stored in the Electron user data directory:
- macOS:
~/Library/Application Support/work-planner/work-planner.db - Windows:
%APPDATA%/work-planner/work-planner.db - Linux:
~/.config/work-planner/work-planner.db
MIT