The connected workspace for teams & individuals.
Manage goals, tasks, and projects with beautiful Kanban boards β right in your browser.
The public-facing landing page β the first thing visitors see. Features hero section, feature highlights, social proof, and call-to-action buttons.
Create a new account with username, email, and password. The first registered user automatically becomes Admin. Includes real-time Zod validation.
Sign in with your email and password. Authenticated users are redirected to the Dashboard.
Public form for visitors to request a guided demo. Admins can review, approve, and seed a fully populated demo project.
Central hub after login β view all your boards with progress stats, overdue task alerts, and switch between multiple view modes (Grid, List, Table, Recent, Timeline).
Drag-and-drop task management with customizable columns, priority labels, assignees, due dates, budget tracking, and a rich task detail dialog.
Create tasks with titles, rich Markdown descriptions (Tiptap editor), multiple priority levels, assignees, due dates, and cost tracking.
Visualize task distribution across board members with detailed workload analytics. Shows per-member task counts by column, completion rates, and cost breakdowns β available to board owners and granted contributors.
Update your profile, upload and crop an avatar, edit your bio, and manage account information.
Manage users, roles, and demo requests. Admin-only access with full RBAC permission gating.
- Boards β drag-and-drop tasks across fully customizable columns using dnd-kit
- Multiple Boards β create, rename, delete, and pin boards per project
- Rich Task Details β Markdown descriptions (Tiptap), due dates, multiple priorities, cost tracking, multi-assignee support
- Task Lifecycle β create β assign β move β complete β archive β restore β permanently delete
- Budget Tracking β set per-board budgets and track spending across tasks in real-time
- Dashboard Overview β aggregated stats, progress charts (Recharts), and overdue task alerts
- 5 Board Views β Grid, List, Table (sortable), Recent, and Timeline
- View Persistence β selected view is saved to localStorage
- Board Invitations β invite members via email, accept/decline from the notification bell
- Member Roles β owner, contributor, and viewer with per-board role management
- Workload Tracker β visualize task distribution and member workload per board
- Real-time Notifications β task assignments, invitation responses, role changes, member events
- Command Palette β quick navigation and board creation with
Ctrl+K/βK - Collapsible Sidebar β with board search, auto-collapse on mobile
- Responsive Design β fully functional on desktop, tablet, and mobile
- Smooth Animations β Framer Motion page transitions and micro-interactions
- Role-Based Access Control (RBAC) β admin and user roles with a centralized permission map
- Admin Panel β manage all users, change roles, review and grant demo requests
- Password Hashing β bcryptjs
- Permission-Gated Routes β
<ProtectedRoute>component with fallback redirects
- Profile Management β username, full name, bio, website, location, organization, job title, education
- Avatar Upload β with interactive crop dialog (react-easy-crop)
- Form Validation β Zod schemas + React Hook Form with real-time error feedback
| Layer | Technology | Purpose |
|---|---|---|
| UI Framework | React 19 + Vite 8 | Component-based SPA with fast HMR |
| Routing | React Router 7 | Client-side routing with guards |
| State Management | Zustand 5 | Lightweight stores with localStorage persistence |
| Styling | Tailwind CSS 4 + shadcn/ui | Utility-first CSS with a polished component library |
| Drag & Drop | dnd-kit | Accessible, performant kanban drag-and-drop |
| Rich Text | Tiptap 3 | Markdown-powered task description editor |
| Charts | Recharts 3 | Dashboard progress and workload visualizations |
| Animations | Framer Motion 12 | Page transitions and micro-interactions |
| Forms | React Hook Form + Zod 4 | Declarative forms with schema-based validation |
| Auth | bcryptjs | Client-side password hashing |
| Icons | Lucide React | Consistent, clean icon set |
| Date Handling | date-fns | Lightweight date formatting and manipulation |
| Typography | Geist Variable | Modern variable font via Fontsource |
- Node.js 18+
- npm (comes with Node.js)
# Clone the repository
git clone https://github.com/Sacobrt/GoalBoard.git
cd GoalBoard
# Install dependencies
npm install
# Start the development server
npm run devThe app runs at http://localhost:5173 by default.
| Command | Description |
|---|---|
npm run dev |
Start Vite dev server with HMR |
npm run build |
Build optimized production bundle to dist/ |
npm run preview |
Preview the production build locally |
npm run lint |
Run ESLint across the project |
On first launch, GoalBoard seeds two default accounts:
| Role | Password | |
|---|---|---|
| Admin | admin@example.com |
admin |
| User | demo@example.com |
demo |
Note: If you clear localStorage and register a fresh account, the first registered user automatically becomes Admin. All subsequent users get the standard User role.
GoalBoard/
βββ public/ # Static assets (favicon, logo, OG image)
βββ docs/ # Screenshot images for documentation
βββ src/
β βββ app/
β β βββ App.jsx # Root router β all route definitions
β β
β βββ components/
β β βββ layout/
β β β βββ AppShell.jsx # Authenticated layout (Sidebar + Header + Outlet)
β β β βββ Header.jsx # Top bar (search, notifications, user menu)
β β β βββ Sidebar.jsx # Collapsible sidebar with board list
β β βββ patterns/
β β β βββ CommandPalette.jsx # βK command palette
β β β βββ EmptyState.jsx # Reusable empty-state placeholder
β β β βββ PageHeader.jsx # Consistent page title component
β β βββ ui/ # shadcn/ui primitives (button, dialog, card, etc.)
β β
β βββ features/
β β βββ admin/
β β β βββ pages/
β β β β βββ AdminDashboard.jsx # User management + demo request handling
β β β βββ store/
β β β βββ demoRequestStore.js # Demo request state (Zustand)
β β β
β β βββ auth/
β β β βββ pages/
β β β β βββ LoginPage.jsx # Email + password login
β β β β βββ GetStartedPage.jsx # Registration with full validation
β β β βββ schemas/
β β β β βββ authSchemas.js # Zod schemas for login & register
β β β βββ store/
β β β βββ authStore.js # Auth state, login, register, profile update
β β β
β β βββ board/
β β β βββ components/
β β β β βββ BoardSettings.jsx # Column, priority, member, budget management
β β β β βββ WorkloadTracker.jsx # Per-member task distribution charts
β β β βββ pages/
β β β β βββ BoardSettingsPage.jsx
β β β β βββ WorkloadPage.jsx
β β β βββ store/
β β β βββ boardStore.js # Board CRUD, invitations, members (Zustand)
β β β βββ demoData.js # Demo project seeder
β β β
β β βββ home/
β β β βββ components/
β β β β βββ OverdueTasks.jsx # Overdue task alert panel
β β β βββ pages/
β β β βββ DashboardPage.jsx # Main dashboard with stats + board views
β β β
β β βββ kanban/
β β β βββ components/
β β β β βββ Board.jsx # Kanban board with columns + drag-and-drop
β β β β βββ Column.jsx # Single kanban column
β β β β βββ TaskCard.jsx # Draggable task card
β β β β βββ TaskDetailDialog.jsx # Full task detail/edit dialog
β β β β βββ AddTaskDialog.jsx # New task creation form
β β β β βββ ArchivedTasks.jsx # Archived tasks panel
β β β β βββ MarkdownEditor.jsx # Tiptap-based Markdown editor
β β β β βββ DateTimePicker.jsx # Date picker for due dates
β β β βββ domain/
β β β β βββ logic/
β β β β β βββ taskLogic.js # Pure functions: move, archive, restore, overdue
β β β β βββ schemas/
β β β β βββ taskSchema.js # Zod validation for task creation
β β β βββ hooks/
β β β β βββ useKanban.js # Board-scoped task operations + notifications
β β β βββ pages/
β β β β βββ KanbanPage.jsx # Board page with title editing + budget bar
β β β βββ store/
β β β βββ kanbanStore.js # Task CRUD, move, archive, reorder (Zustand)
β β β
β β βββ landing/
β β β βββ components/
β β β β βββ StaticPageLayout.jsx # Shared layout for static pages
β β β βββ pages/
β β β β βββ LandingPage.jsx # Public marketing landing page
β β β β βββ RequestDemoPage.jsx # Demo request form
β β β β βββ HelpCenterPage.jsx # FAQ / help documentation
β β β β βββ TermsPage.jsx # Terms of service
β β β βββ schemas/
β β β βββ requestDemoSchema.js # Zod validation for demo requests
β β β
β β βββ notifications/
β β β βββ store/
β β β βββ notificationStore.js # Notification state (Zustand)
β β β
β β βββ settings/
β β βββ pages/
β β β βββ SettingsPage.jsx # Profile editor + avatar upload
β β βββ schemas/
β β βββ profileSchema.js # Zod validation for profile fields
β β
β βββ shared/
β β βββ auth/
β β β βββ permissions.js # Permission map (role β permissions)
β β β βββ roles.js # Role definitions (ADMIN, USER)
β β β βββ usePermission.js # Hook: check current user's permission
β β β βββ ProtectedRoute.jsx # Route guard (permission-based)
β β β βββ PublicRoute.jsx # Redirect authenticated users away
β β βββ components/
β β β βββ AvatarUploader.jsx # Avatar upload + crop dialog
β β β βββ UserAvatar.jsx # Avatar display component
β β β βββ ViewSwitcher.jsx # Board view selector (segmented + dropdown)
β β β βββ board-views/
β β β βββ viewConfig.js # View registry (Grid, List, Table, etc.)
β β β βββ GridView.jsx
β β β βββ ListView.jsx
β β β βββ TableView.jsx
β β β βββ FavoritesView.jsx
β β β βββ RecentView.jsx
β β β βββ TimelineView.jsx
β β β βββ BoardCard.jsx # Shared board card component
β β βββ hooks/
β β β βββ useBoardView.js # Board view state with localStorage
β β β βββ useCommandStore.js # Command palette open/close state
β β β βββ useMediaQuery.js # Responsive breakpoint hook
β β β βββ useSidebarStore.js # Sidebar collapsed/expanded state
β β βββ utils/
β β βββ cropImage.js # Canvas-based image cropping utility
β β βββ timeAgo.js # Relative time formatting
β β
β βββ lib/
β β βββ utils.js # Tailwind class merge helper (cn)
β β
β βββ index.css # Global styles, design tokens, animations
β βββ main.jsx # App entry point + default user seeding
β
βββ index.html # HTML shell with SEO meta tags
βββ vite.config.js # Vite + React + Tailwind plugin config
βββ components.json # shadcn/ui configuration
βββ package.json
βββ eslint.config.js
GoalBoard uses client-side authentication with bcryptjs password hashing:
- Register β user data is validated against Zod schemas, password is hashed with bcrypt, and stored in
localStorageundergoalboard_users - Login β email lookup + bcrypt.compare against stored hash
- Session β the authenticated user object (without password hash) is persisted via Zustand's
persistmiddleware undergoalboard_session - Logout β clears the session from the Zustand store
| Role | Permissions |
|---|---|
| Admin | canAccessAdminPanel, canManageUsers, canManageRoles, canEditBoard, canDeleteBoard, canDeleteTask, canViewAllBoards |
| User | canEditBoard, canDeleteTask |
Permissions are enforced via the can(user, permission) helper and the <ProtectedRoute> component.
Each board has its own member roles:
| Board Role | Capabilities |
|---|---|
| Owner | Full control β rename, delete, manage members, set budget |
| Contributor | Create/edit/move tasks, view board |
| Viewer | Read-only access (admin fallback) |
All data is stored in the browser's localStorage under these keys:
| Key | Store | Contents |
|---|---|---|
goalboard_session |
authStore |
Current authenticated user |
goalboard_users |
(raw localStorage) | All registered user records |
goalboard_boards |
boardStore |
Boards, columns, priorities, members, invitations |
goalboard_tasks |
kanbanStore |
All tasks across all boards |
goalboard_notifications |
notificationStore |
User notifications |
goalboard_demo_requests |
demoRequestStore |
Demo request submissions |
goalboard_board_view |
useBoardView |
Selected dashboard view preference |
β οΈ Warning: Clearing site data or localStorage resets everything. There is no backend β this is a client-side-only application not suitable for production use.
| Path | Component | Access | Description |
|---|---|---|---|
/ |
LandingPage |
Public | Marketing landing page |
/login |
LoginPage |
Public (redirects if logged in) | Sign in |
/register |
GetStartedPage |
Public (redirects if logged in) | Create account |
/request-demo |
RequestDemoPage |
Public | Submit a demo request |
/help |
HelpCenterPage |
Public | FAQ & help center |
/terms |
TermsPage |
Public | Terms of service |
/dashboard |
DashboardPage |
Authenticated | Board overview + stats |
/board/:boardId |
KanbanPage |
Authenticated + Member | Kanban board |
/board/:boardId/settings |
BoardSettingsPage |
Authenticated + Member | Board configuration |
/board/:boardId/workload |
WorkloadPage |
Authenticated + Owner/Granted | Workload analytics |
/settings |
SettingsPage |
Authenticated | Profile settings |
/admin |
AdminDashboard |
Admin only | User & demo management |
GoalBoard includes a real-time notification system that tracks:
| Event | Recipient | Trigger |
|---|---|---|
task_assigned |
Assignee | Task created or assignee added |
task_unassigned |
Former assignee | Assignee removed from task |
invitation_accepted |
Board owner | Member accepts invitation |
invitation_declined |
Board owner | Member declines invitation |
member_left |
Board owner | Contributor leaves board |
member_kicked |
Removed user | Owner removes a member |
role_change |
Affected user | Board role updated |
demo_request |
Admin | New demo request submitted |
demo_granted |
Requesting user | Admin grants demo access |
Notifications appear in the header bell icon with unread badges and support mark-as-read, mark-all-read, and clear-all actions.
- Feature-based architecture β each feature (auth, board, kanban, etc.) is self-contained with its own pages, components, stores, hooks, and schemas
- Domain logic separation β pure functions in
kanban/domain/logic/keep business rules testable and separate from UI - Zustand + persist β lightweight state management with automatic localStorage sync, no Redux boilerplate
- Zod schemas β shared validation between forms and business logic ensures data integrity
- shadcn/ui primitives β unstyled, composable components customized with Tailwind for full design control
- No backend dependency β the entire app runs client-side, making it ideal for demos, prototyping, and learning
- 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 MIT License. See the LICENSE file for details.
Built with β€οΈ using React, Vite, Tailwind CSS, and shadcn/ui










