Skip to content

jacob-cob-null/Taskboard

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

124 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

Taskboard Logo

Taskboard

Where teams get sh*t done.
A team management platform built to solve the chaos of organizing events across classes and organizations in college.

Live App Β· Terms Β· Privacy


The Problem

In college, students juggle memberships across multiple organizations, classes, and committees. Event schedules are scattered across group chats, emails, and word of mouth. Leaders waste time manually coordinating announcements, and members miss important events because there's no single source of truth.

Taskboard fixes this by giving every team a shared workspace with a calendar, member roster, and announcement system β€” all synced directly to Google Calendar.


Features

πŸ—“οΈ Team Calendar

  • Create, edit, and delete events per team
  • Two-way sync with Google Calendar β€” events appear on members' personal calendars automatically
  • Month/week/day views powered by react-big-calendar

πŸ‘₯ Member Management

  • Add members individually or bulk import via CSV
  • Inline validation and duplicate detection
  • Searchable, sortable data tables powered by TanStack Table

πŸ“’ Announcements

  • Compose rich-text announcements with a Tiptap editor (bold, italic, lists)
  • Batch email delivery to all team members via Resend API
  • Real-time delivery tracking with webhook status updates (Sent, Delivered, Failed)
  • Supports batches of 100+ recipients with automatic splitting

πŸ” Authentication

  • Google OAuth via Supabase Auth
  • Automatic profile creation on first login
  • Secure session management with @supabase/ssr middleware

Tech Stack

Layer Technology
Framework Next.js 16 (App Router, Turbopack)
Language TypeScript
Styling Tailwind CSS 4
UI Components Radix UI, Lucide Icons, Class Variance Authority
Database PostgreSQL via Supabase
ORM Prisma with @prisma/adapter-pg
Auth Supabase Auth + Google OAuth 2.0
Email Resend + React Email + Svix webhooks
Calendar Google Calendar API via googleapis
Rich Text Tiptap
Tables TanStack React Table
Forms React Hook Form + Zod validation
Error Tracking Sentry
Hosting Vercel
Domain taskboard.page

Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                     Vercel (Next.js 16)                   β”‚
β”‚                                                          β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”  β”‚
β”‚  β”‚  Login   β”‚  β”‚Dashboard β”‚  β”‚Team Workspaceβ”‚ β”‚Legal   β”‚  β”‚
β”‚  β”‚  Page    β”‚  β”‚  (Teams) β”‚  β”‚Cal/Members/  β”‚ β”‚Pages   β”‚  β”‚
β”‚  β”‚         β”‚  β”‚          β”‚  β”‚Announcements β”‚ β”‚        β”‚  β”‚
β”‚  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”˜  β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”˜  β”‚
β”‚       β”‚            β”‚               β”‚                      β”‚
β”‚  β”Œβ”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚           Supabase Auth Middleware (proxy.ts)       β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚                       β”‚                                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚              Server Actions (actions/)              β”‚   β”‚
β”‚  β”‚     teams.ts Β· members.ts Β· announcements.ts        β”‚   β”‚
β”‚  β””β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚     β”‚          β”‚              β”‚                            β”‚
β”‚     β–Ό          β–Ό              β–Ό                            β”‚
β”‚  Prisma    Google API      Resend                         β”‚
β”‚     β”‚          β”‚              β”‚                            β”‚
β””β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
      β”‚          β”‚              β”‚
      β–Ό          β–Ό              β–Ό
  Supabase    Google       Resend API
  PostgreSQL  Calendar     + Webhooks

Database Schema (Public)

erDiagram
    profiles {
        uuid id PK
        string email
        string full_name
        string avatar_url
        string google_refresh_token
    }
    teams {
        uuid id PK
        uuid leader_id FK
        string name
        string google_calendar_id
    }
    members {
        uuid id PK
        string email UK
        string full_name
    }
    team_members {
        uuid id PK
        uuid team_id FK
        uuid member_id FK
    }
    events {
        uuid id PK
        uuid team_id FK
        string title
        string google_event_id UK
        timestamp event_start
        timestamp event_end
    }
    announcements {
        bigint id PK
        uuid team_id FK
        string title
        string content
        string resend_batch_id
        enum email_status
        int recipient_count
        int delivered_count
    }

    profiles ||--o{ teams : "leads"
    teams ||--o{ team_members : "has"
    members ||--o{ team_members : "belongs to"
    teams ||--o{ events : "has"
    teams ||--o{ announcements : "has"
Loading

Getting Started

Prerequisites

1. Clone & Install

git clone https://github.com/your-username/taskboard.git
cd taskboard
npm install

2. Environment Variables

Create a .env file in the project root:

# App
NEXT_PUBLIC_APP_URL=http://localhost:3000

# Supabase
NEXT_PUBLIC_SUPABASE_URL=your_supabase_url
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_KEY=your_supabase_anon_key
DATABASE_URL=your_pooled_connection_string
DIRECT_URL=your_direct_connection_string

# Google OAuth
NEXT_PUBLIC_GOOGLE_CLIENT_ID=your_google_client_id
SUPABASE_AUTH_EXTERNAL_GOOGLE_CLIENT_SECRET=your_google_client_secret

# Resend
RESEND_API_KEY=your_resend_api_key
RESEND_WEBHOOK_SECRET=your_resend_webhook_secret

3. Database Setup

npx prisma generate
npx prisma migrate dev

4. Run

npm run dev

Visit http://localhost:3000


Scripts

Command Description
npm run dev Start development server (Turbopack)
npm run build Production build
npm run start Start production server
npm run lint Run ESLint
npm run test Run Jest tests
npm run test:watch Run tests in watch mode
npm run test:coverage Generate test coverage report

Project Structure

Taskboard/
β”œβ”€β”€ app/
β”‚   β”œβ”€β”€ (auth)/login/         # Login page + Google OAuth
β”‚   β”œβ”€β”€ dashboard/            # Team selection dashboard
β”‚   β”‚   β”œβ”€β”€ components/       # Dashboard UI components
β”‚   β”‚   └── teams/[teamsId]/  # Team workspace
β”‚   β”‚       β”œβ”€β”€ (calendar)/   # Calendar tab
β”‚   β”‚       β”œβ”€β”€ (members)/    # Members tab
β”‚   β”‚       └── (announcements)/ # Announcements tab
β”‚   β”œβ”€β”€ privacy/              # Privacy Policy
β”‚   β”œβ”€β”€ terms/                # Terms of Service
β”‚   └── auth/callback/        # OAuth callback handler
β”œβ”€β”€ actions/                  # Server actions
β”‚   β”œβ”€β”€ teams.ts
β”‚   β”œβ”€β”€ members.ts
β”‚   └── (announcements)/
β”œβ”€β”€ components/               # Shared UI components
β”œβ”€β”€ lib/                      # Utilities (Resend, Google Calendar)
β”œβ”€β”€ prisma/                   # Schema & migrations
β”œβ”€β”€ utils/                    # Supabase clients, Prisma client
└── supabase/functions/       # Edge Functions

Deployment

Taskboard is deployed on Vercel with automatic deploys from the main branch.

  1. Connect your GitHub repo to Vercel
  2. Set all environment variables in the Vercel dashboard
  3. Set NEXT_PUBLIC_APP_URL to your production domain
  4. Push to main β€” Vercel handles the rest

License

This project is open-source under the MIT License.


Built with β˜• for college students who are tired of missing org events.

About

A team management platform built to solve the chaos of organizing events across classes and organizations in college.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors