New features: - Task comments with date-stamped entries and last-comment summary - Recurring tasks expanded on calendar (daily/weekly/monthly/yearly) - System tray mode replacing CMD window (Windows/macOS/Linux) - Ironpad logo as exe icon, tray icon, favicon, and header logo Technical changes: - Backend restructured for dual-mode: dev (API-only) / prod (tray + server) - tray-item crate for cross-platform tray, winresource for icon embedding - Calendar view refactored with CalendarEntry interface for recurring merging - Added CHANGELOG.md, build-local.ps1, version bumped to 0.2.0 Co-authored-by: Cursor <cursoragent@cursor.com>
Ironpad Frontend
Vue 3 single-page application for Ironpad.
Quick Start
npm install
npm run dev
Open http://localhost:5173 (requires backend running on port 3000).
Tech Stack
- Vue 3 with Composition API and
<script setup> - TypeScript for type safety
- Vite for fast development and builds
- Pinia for state management
- Vue Router for navigation
- Milkdown for WYSIWYG Markdown editing
Project Structure
src/
├── api/ # API client for backend communication
│ └── client.ts
├── components/ # Reusable Vue components
│ ├── MilkdownEditor.vue # Editor wrapper
│ ├── MilkdownEditorCore.vue # Core editor logic
│ ├── Sidebar.vue # Navigation sidebar
│ ├── GitPanel.vue # Git operations panel
│ └── ...
├── composables/ # Vue composables
│ └── useWebSocket.ts
├── router/ # Vue Router configuration
│ └── index.ts
├── stores/ # Pinia stores
│ ├── notes.ts # Notes state
│ ├── projects.ts # Projects state
│ ├── tasks.ts # Tasks state
│ ├── git.ts # Git state
│ ├── theme.ts # Theme state
│ ├── ui.ts # UI state
│ ├── websocket.ts # WebSocket state
│ └── workspace.ts # Workspace state
├── types/ # TypeScript type definitions
│ └── index.ts
├── views/ # Route views
│ ├── DashboardView.vue # Home page with project cards + task summaries
│ ├── ProjectView.vue # Project overview with editor
│ ├── ProjectNotesView.vue # Project notes split view
│ ├── ProjectsView.vue # Projects management list
│ ├── TasksView.vue # Task split view (list + detail)
│ ├── CalendarView.vue # Month grid calendar
│ └── DailyView.vue # Daily notes
├── App.vue # Root component
├── main.ts # Entry point
└── style.css # Global styles
Key Components
Milkdown Editor
The editor consists of two components:
- MilkdownEditor.vue — Wrapper component that accepts a
:keyprop for recreation - MilkdownEditorCore.vue — Core editor using the
@milkdown/vueintegration
Critical Pattern: When switching between notes/tasks, content MUST be set BEFORE updating the editor key:
// CORRECT order:
editorContent.value = newContent // Set content first
editorKey.value = noteId // Then trigger editor recreation
// WRONG order (causes stale content):
editorKey.value = noteId // Editor recreates with wrong content
editorContent.value = newContent // Too late!
Task System Features
The task view (TasksView.vue) includes:
- Tag system — tags stored in YAML frontmatter, filterable via tag bar, autocomplete from project tags
- Subtasks — tasks with
parent_idgrouped under parents, inline creation, count badges - Recurring tasks — daily/weekly/monthly/yearly, auto-creates next on completion
- Due date picker — inline date input, clearable, color-coded urgency display
- Active/Backlog toggle — move tasks between states
Dashboard (DashboardView.vue)
Cross-project home page showing all projects as cards with:
- Active task count, backlog count, overdue count
- Top 5 active tasks per project with tags and due dates
- Click-through to project or individual task
Calendar (CalendarView.vue)
Month grid calendar showing:
- Tasks plotted by
due_date(only tasks with dates appear) - Daily notes shown as blue dots
- Color-coded urgency (overdue=red, today=red, soon=yellow)
- Navigation: prev/next month, Today button
State Management
Each domain has its own Pinia store:
notesStore— Standalone notes CRUDprojectsStore— Projects list and detailstasksStore— Project tasks with active/backlog sections, tag filtering, subtask helpersgitStore— Git status, commits, push/pullthemeStore— Dark/light modeuiStore— Search panel, modalswebsocketStore— Real-time connection stateworkspaceStore— Active project tracking
Auto-save Behavior
Views implement smart auto-save that:
- Tracks the "last saved content" when a note/task loads
- Only saves when content differs from last saved
- Uses 1-second debounce to batch rapid edits
- Prevents unnecessary saves when just opening items
Commands
npm run dev # Start dev server (hot reload)
npm run build # Production build to dist/
npm run preview # Preview production build
npm run lint # Run ESLint
Environment
The frontend expects the backend API at http://localhost:3000. This is configured in src/api/client.ts.
For production, build the frontend and serve from any static host, configuring the API URL as needed.