Skip to content

Sacobrt/GoalBoard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

26 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

GoalBoard Logo

GoalBoard

The connected workspace for teams & individuals.
Manage goals, tasks, and projects with beautiful Kanban boards β€” right in your browser.

React 19 Vite 8 Tailwind CSS 4 MIT License


πŸ“Έ Screenshots

Landing Page

The public-facing landing page β€” the first thing visitors see. Features hero section, feature highlights, social proof, and call-to-action buttons.

Landing Page

Registration

Create a new account with username, email, and password. The first registered user automatically becomes Admin. Includes real-time Zod validation.

Register Page

Login

Sign in with your email and password. Authenticated users are redirected to the Dashboard.

Login Page

Request Demo

Public form for visitors to request a guided demo. Admins can review, approve, and seed a fully populated demo project.

Request Demo Page

Dashboard

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).

Dashboard

Board

Drag-and-drop task management with customizable columns, priority labels, assignees, due dates, budget tracking, and a rich task detail dialog.

Board

Add New Task

Create tasks with titles, rich Markdown descriptions (Tiptap editor), multiple priority levels, assignees, due dates, and cost tracking.

Add New Task

Workload Tracker

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.

Workload Tracker

Settings

Update your profile, upload and crop an avatar, edit your bio, and manage account information.

Settings Page

Admin Panel

Manage users, roles, and demo requests. Admin-only access with full RBAC permission gating.

Admin Panel


✨ Features

Core

  • 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 & Views

  • 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

Collaboration

  • 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

Navigation & UX

  • 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

Security & Admin

  • 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

Settings

  • 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

πŸ›  Tech Stack

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

πŸš€ Getting Started

Prerequisites

  • Node.js 18+
  • npm (comes with Node.js)

Installation

# Clone the repository
git clone https://github.com/Sacobrt/GoalBoard.git
cd GoalBoard

# Install dependencies
npm install

# Start the development server
npm run dev

The app runs at http://localhost:5173 by default.

Available Scripts

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

πŸ‘€ First Run & Default Accounts

On first launch, GoalBoard seeds two default accounts:

Role Email 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.


πŸ— Project Structure

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

πŸ” Authentication & Authorization

Authentication Flow

GoalBoard uses client-side authentication with bcryptjs password hashing:

  1. Register β€” user data is validated against Zod schemas, password is hashed with bcrypt, and stored in localStorage under goalboard_users
  2. Login β€” email lookup + bcrypt.compare against stored hash
  3. Session β€” the authenticated user object (without password hash) is persisted via Zustand's persist middleware under goalboard_session
  4. Logout β€” clears the session from the Zustand store

Role-Based Access Control (RBAC)

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.

Board-Level Roles

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)

πŸ’Ύ Data Storage

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.


πŸ—Ί Route Map

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

πŸ”” Notification System

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.


🧩 Key Design Decisions

  • 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

🀝 Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes (git commit -m 'Add amazing feature')
  4. Push to the branch (git push origin feature/amazing-feature)
  5. Open a Pull Request

πŸ“„ License

This project is licensed under the MIT License. See the LICENSE file for details.


Built with ❀️ using React, Vite, Tailwind CSS, and shadcn/ui

About

Goal Board is the connected workspace where better, faster work happens. Manage goals, tasks, and projects.

Topics

Resources

License

Stars

Watchers

Forks

Contributors

Languages