The native desktop app for TaskForge, built with Vite + React 19 and React Router, packaged with Tauri 2 for Windows, macOS, and Linux. It includes the full project dashboard with Kanban board, progress header, timeline, velocity and distribution analytics, and a live activity feed.
Note: The UI is a static Vite bundle served inside a Tauri webview. It connects to the TaskForge backend API over HTTP/WebSocket (see .env.example).
- Authentication System: Secure login/registration with JWT token management
- Organization Management: Create, manage, and invite team members to organizations
- Dashboard: Central hub for viewing and managing tasks and team information
- Project Mission Control: per-project dashboard with a progress header, Gantt-style timeline, weekly velocity chart, priority distribution donut and a live activity feed
- Kanban Board: real-time drag-and-drop board with multi-assignee avatar clusters, colored labels, due dates and per-card progress pills
- Project Import/Export: portable JSON project templates with a preview-before-import flow
- Real-time UI Updates: Powered by React Query for efficient server state management
- Custom Design System: Glassmorphism dark theme with pure CSS and CSS Modules
- Form Validation: Robust form handling with React Hook Form and Zod
- Responsive Design: Mobile-friendly interface that works across all devices
- API Integration: Seamless connection to Django backend API
- Framework: Vite 8 + React Router (HashRouter)
- Desktop: Tauri 2 - Native desktop app framework
- Backend: Rust (Tauri backend)
- Runtime: Bun
- Language: JavaScript (ES2024) + Rust
- Charts:
recharts- Dashboard analytics (velocity & distribution) - Styling: CSS Modules + Custom Design System
- State Management:
zustand- Client/auth state@tanstack/react-query- Server state & API caching
- Forms & Validation:
react-hook-form- Form state management@hookform/resolvers- Form validation integrationzod- Schema validation
- Theme:
next-themes- Light/dark theme support - Dev Tools: ESLint 9
- Bun v1.0+ (or Node.js 20+)
- A running instance of the TaskForge Django backend
-
Clone the repository:
git clone <repository-url> cd taskforge-frontend
-
Install dependencies:
bun install
-
Configure environment variables:
Update
.envin the project root with your configuration:VITE_API_URL=http://localhost:8000 VITE_WS_URL=ws://localhost:8000
Production values live in
.env.productionand are used bybun run build. -
Start the development server:
bun run dev
-
Open your browser: Navigate to http://localhost:5173
This branch includes a Tauri desktop application setup for running TaskForge as a native desktop app on Windows, macOS, and Linux.
- Rust (Required for Tauri)
- Bun v1.0+ (or Node.js 20+)
- Platform-specific requirements:
- Windows: Visual Studio Build Tools 2019+ or Visual Studio Community with C++ workload
- macOS: Xcode and Xcode Command Line Tools (
xcode-select --install) - Linux:
libwebkit2gtk-4.1-dev,build-essential,curl,wget,openssl,libssl-dev,libgtk-3-dev,libayatana-appindicator3-dev,librsvg2-dev
-
Install dependencies:
bun install
-
Run in development mode:
bun run tauri dev
This will:
- Start the Vite development server on
http://localhost:5173 - Launch the Tauri desktop window pointing to the dev server
- Hot-reload enabled for both frontend and backend changes
- Start the Vite development server on
-
DevTools:
- In the Tauri window, press
Ctrl+Shift+I(Windows/Linux) orCmd+Opt+I(macOS) to open developer tools
- In the Tauri window, press
Build the desktop app for your platform:
# Build for current platform
bun run tauri build
Output locations:
- Windows:
src-tauri/target/release/bundle/msi/or.exe - macOS:
src-tauri/target/release/bundle/dmg/or.app - Linux:
src-tauri/target/release/bundle/deb/,.rpm, or AppImage
# Development mode (Rust + Vite hot reload + Desktop window)
bun run tauri dev
# Production build
bun run tauri build
# Build only the frontend (used internally by Tauri)
bun run build
# Run the Vite dev server only
bun run devsrc-tauri/
├── src/
│ ├── main.rs # Tauri app entry point
│ └── lib.rs # Rust library code
├── Cargo.toml # Rust dependencies
├── tauri.conf.json # Tauri configuration
├── build.rs # Build script
├── capabilities/ # Security capabilities
│ └── default.json # Default capability set
└── icons/ # App icons for all platforms
src-tauri/tauri.conf.json contains Tauri settings:
-
build: Build & dev commandsbeforeDevCommand: Runsbun run devbefore starting Tauri devbeforeBuildCommand: Runsbun run buildbefore production buildfrontendDist: Points to../dist(Vite build output)devUrl: Points tohttp://localhost:5173(Vite dev server)
-
app: Window configuration- Window size: 1200x900
- Resizable and non-fullscreen by default
- CSP set to null for local development
-
bundle: Distribution settings- Identifier:
com.taskforge.app - Bundled for all platforms by default
- App icons included for all platforms
- Identifier:
You can invoke Rust commands from the frontend using the Tauri API:
Rust side (src-tauri/src/main.rs):
#[tauri::command]
fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}Frontend side (React component):
import { invoke } from '@tauri-apps/api/core';
async function greet() {
const response = await invoke('greet', { name: 'TaskForge' });
console.log(response);
}- File I/O: Access local file system for saving/loading project files
- Native Notifications: Send desktop notifications for task updates
- System Integration: Register app with OS for opening file types
- Tray Integration: Add app to system tray for quick access
- Console logs in Tauri window: Press
Ctrl+Shift+Ito open DevTools - Rust logs: Check terminal output where you ran
bun run dev - Common issues:
- Port 5173 in use: Kill the process or change
devUrlintauri.conf.jsonand the port invite.config.js - Build fails: Ensure Rust is installed with
rustc --version - Icon issues: Regenerate icons in
src-tauri/icons/if needed
- Port 5173 in use: Kill the process or change
To update Tauri to the latest version:
bun update @tauri-apps/cli @tauri-apps/apiThen update Rust:
rustup updateEnsure Visual Studio Build Tools are installed:
# Install via winget
winget install -e --id Microsoft.VisualStudio.CommunityFor App Store or outside distribution, you'll need to sign the app. Configure in src-tauri/tauri.conf.json or use Xcode.
On Linux, you may need to make the binary executable:
chmod +x src-tauri/target/release/taskforge-frontendsrc/
├── app/ # Next.js App Router
│ ├── layout.jsx # Root layout
│ ├── page.jsx # Home page
│ ├── globals.css # Global styles & CSS variables
│ ├── (auth)/ # Auth route group
│ │ ├── login/
│ │ └── register/
│ └── (dashboard)/ # Dashboard route group
│ ├── page.jsx # Dashboard home
│ └── orgs/[slug]/ # Organization detail page
│
├── components/ # Reusable React components
│ ├── auth/ # Authentication forms
│ │ ├── LoginForm.jsx
│ │ └── RegisterForm.jsx
│ ├── layout/ # Layout components
│ │ ├── Sidebar.jsx
│ │ ├── Topbar.jsx
│ │ └── QueryProvider.jsx
│ ├── orgs/ # Organization components
│ │ ├── OrgCard.jsx
│ │ ├── MemberTable.jsx
│ │ └── InviteModal.jsx
│ └── ui/ # Reusable UI components
│ ├── Button.jsx
│ ├── Input.jsx
│ ├── Modal.jsx
│ ├── Card.jsx
│ ├── Badge.jsx
│ └── Avatar.jsx
│
├── lib/ # Utilities and helpers
│ ├── api/ # API client functions
│ │ ├── client.js # Axios instance with auth
│ │ ├── auth.js # Auth API endpoints
│ │ └── orgs.js # Organization API endpoints
│ ├── hooks/ # Custom React hooks
│ │ ├── useAuth.js # Auth hook
│ │ └── useOrgs.js # Organizations hook
│ ├── store/ # Zustand stores
│ │ └── authStore.js # Authentication state
│ └── types/ # Type definitions
│
└── public/ # Static assets
We maintain a strict separation between auth state and server state:
-
Zustand (
authStore.js): Manages client-side authentication state- User profile information
- JWT tokens
- Authentication status
- Persisted to
localStoragevia middleware
-
TanStack Query: Manages all server state
- Organization data
- Task information
- Automatic caching & invalidation
- Real-time synchronization
- User logs in via the login form
- Backend returns JWT token
- Token is stored in Zustand store with persistence
- Token automatically included in all API requests via
client.js - Route protection handled by middleware checking
taskforge_authenticatedcookie
Local Storage (not httpOnly cookies) is used for:
- Pros: Simpler local development, easier debugging, portfolio-friendly
- Cons: Vulnerable to XSS attacks in production
In production, consider migrating to httpOnly cookies with CSRF protection.
We use pure CSS with CSS Modules instead of Tailwind CSS for:
- Total aesthetic control over the glassmorphism dark theme
- CSS Custom Properties (
globals.css) for centralized design tokens - Scoped styling via
*.module.cssfiles preventing class conflicts - Smaller bundle size compared to utility-first frameworks
For Web Development (Browser Only):
# Start Vite development server with hot reload
bun run dev
# Build the frontend for production
bun run build
# Preview the production build locally
bun run previewFor Desktop App Development (Tauri + Browser):
# Start Tauri development mode (includes Vite dev server and desktop window)
bun run tauri dev
# Build desktop app for current platform
bun run tauri buildOther:
# Run ESLint
bun run lint- Create a new branch for your feature
- Make changes to components/pages
- Test locally at
http://localhost:5173 - Ensure linting passes:
bun run lint - Commit and push changes
- Create a new folder in
src/app/(dashboard)orsrc/app/(auth) - Add a
page.jsxfile:export default function PageName() { return ( <div> {/* Your content */} </div> ); }
- Create a component in
src/components/[category]/ComponentName.jsx - Create a corresponding style file
ComponentName.module.css - Export from the component directory if needed
All API calls should use the client from src/lib/api/client.js:
import client from '@/lib/api/client';
export async function getOrganizations() {
const { data } = await client.get('/api/orgs/');
return data;
}The client automatically:
- Attaches JWT authentication headers
- Handles base URL configuration
- Includes request/response interceptors
bun run buildThis creates an optimized production build in the dist directory.
Update .env.production with production values:
VITE_API_URL=https://api.example.com
VITE_WS_URL=wss://api.example.comThe frontend communicates with a Django REST API. Key endpoints:
POST /api/auth/login/- User loginPOST /api/auth/register/- User registrationPOST /api/auth/logout/- User logout
GET /api/orgs/- List user's organizationsPOST /api/orgs/- Create new organizationGET /api/orgs/{slug}/- Get organization detailsPUT /api/orgs/{slug}/- Update organizationDELETE /api/orgs/{slug}/- Delete organizationPOST /api/orgs/{slug}/invite/- Invite member to organization
GET /api/tasks/- List tasksPOST /api/tasks/- Create taskPUT /api/tasks/{id}/- Update taskDELETE /api/tasks/{id}/- Delete task
For complete API documentation, see the TaskForge Backend repository.
# Kill process on port 5173
lsof -ti:5173 | xargs kill -9
# Or specify a different port
bun run dev -- --port 5174- Ensure Django backend is running on
http://localhost:8000 - Check
VITE_API_URLin.env - Verify CORS settings in Django backend
- Check browser console for network errors
# Clear the build output
rm -rf dist
# Clear Zustand store (browser dev tools)
# Open DevTools → Application → Local Storage → Remove taskforge entries- Code Splitting: Next.js automatically code-splits routes
- Image Optimization: Use
next/imagefor images - CSS-in-JS: CSS Modules prevent unused styles from being shipped
- Query Caching: React Query caches API responses automatically
- Chrome/Edge 90+
- Firefox 88+
- Safari 14+
- Mobile browsers (iOS Safari 14+, Chrome Android)
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the GNU General Public License v3.0. See the LICENSE file for details.
For issues, questions, or suggestions:
- Check existing GitHub Issues
- Create a new issue with detailed information
- Include screenshots or error logs when applicable
- TaskForge Backend - Django REST API