Hackathon Project
Cloud-Native
Event CRM
AWS

CampOps — Event Management CRM (Case Study)

Cloud-native platform that streamlines event planning, volunteer coordination, sponsor management, and attendee engagement. Built with Next.js, Node.js, TypeScript, PostgreSQL, and deep AWS integrations for scalability, security, and performance.

Features

15+

Tech Stack

10+ Tools

AWS Services

8+ Services

Build Time

48 Hours

CampOps dashboard showing project analytics and task distribution
CampOps Apollo project board with kanban view

Technology Stack

Frontend

Next.js 16
React 19
Tailwind CSS 4
RTK + RTK Query
MUI • Lucide
Recharts • Gantt

Backend & Infra

Node 18 • Express 5
Prisma 6
AWS Cognito
AWS EC2 + ALB
RDS Postgres 15
S3 • CloudFront • Route53

Executive Summary

CampOps centralizes events, volunteers, sponsors, RSVPs and tasks in one place, with AI-powered risk analysis and automated communications. Built during a hackathon with AWS cloud-native architecture, showcasing full-stack development, authentication, and scalable infrastructure design.

AWS CloudFront CDN
        │
   AWS Amplify (Next.js)   ─────  AWS Cognito (Auth)
        │
   Application Load Balancer
        │
    EC2 Auto Scaling Group (Express API)
        │
      Amazon RDS (PostgreSQL)

   S3 (Attachments • Static Assets)
   Secrets Manager • CloudWatch • SNS • SES • Route 53

Key Features

Event Ops

  • Multiple views: Board, List, Table, Timeline, Details
  • Status tracking, capacity, waitlists, check-ins
  • Global search + advanced filtering

Teams & Roles

  • Multi-org support, RBAC (admin/organizer/volunteer)
  • Real-time collaboration and profiles

AI & Automation

  • Risk detection: low RSVPs, overdue/unassigned critical tasks
  • Actionable suggestions, severity levels
  • Automated emails: reminders, assignments, thank-yous

Sponsors & Comms

  • Pipeline stages, pledges and payments
  • Template-driven personalized emails

Selected Implementation

1) S3 Upload Service

import { S3Client, PutObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

const s3Client = new S3Client({ region: 'us-east-1' });

export async function uploadAttachment(file: Buffer, fileName: string) {
  const command = new PutObjectCommand({
    Bucket: process.env.S3_ATTACHMENTS_BUCKET,
    Key: `attachments/${Date.now()}-${fileName}`,
    Body: file,
    ContentType: getContentType(fileName),
  });

  await s3Client.send(command);
  return getSignedUrl(s3Client, command, { expiresIn: 900 });
}

2) Cognito Auth (USER_PASSWORD_AUTH)

import { CognitoIdentityProviderClient, InitiateAuthCommand } from '@aws-sdk/client-cognito-identity-provider';

const cognitoClient = new CognitoIdentityProviderClient({ region: 'us-east-1' });

export async function authenticateUser(email: string, password: string) {
  const command = new InitiateAuthCommand({
    ClientId: process.env.COGNITO_CLIENT_ID!,
    AuthFlow: 'USER_PASSWORD_AUTH',
    AuthParameters: { USERNAME: email, PASSWORD: password },
  });

  const res = await cognitoClient.send(command);
  return {
    accessToken: res.AuthenticationResult?.AccessToken,
    idToken: res.AuthenticationResult?.IdToken,
    refreshToken: res.AuthenticationResult?.RefreshToken,
  };
}

3) RTK Query Base API

import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';

export const api = createApi({
  baseQuery: fetchBaseQuery({
    baseUrl: process.env.NEXT_PUBLIC_API_BASE_URL,
    prepareHeaders: (headers, { getState }) => {
      const token = (getState() as any).auth.token;
      if (token) headers.set('authorization', `Bearer ${token}");
      return headers;
    },
  }),
  endpoints: (builder) => ({
    getProjects: builder.query<any[], void>({ query: () => '/projects' }),
    // ...
  }),
});

4) Prisma Schema Highlights

model Event {
  id           Int       @id @default(autoincrement())
  orgId        Int
  title        String
  startsAt     DateTime
  endsAt       DateTime
  location     String?
  status       String
  capacity     Int?
  rsvps        RSVP[]
  volunteerTasks VolunteerTask[]
}

model VolunteerTask {
  id               Int      @id @default(autoincrement())
  title            String
  status           String
  priority         String?
  dueAt            DateTime?
  assigneeMemberId Int?
  event            Event
  assignee         Member?
  notes            Note[]
  attachments      Attachment[]
}

5) Amplify CI/CD (Next.js)

version: 1
frontend:
  phases:
    preBuild:
      commands:
        - cd client
        - npm ci
    build:
      commands:
        - npm run build
  artifacts:
    baseDirectory: client/.next
    files:
      - '**/*'
  cache:
    paths:
      - client/node_modules/**/*
      - client/.next/cache/**/*

Security & Compliance

  • Authentication via AWS Cognito with MFA options, strict password policy
  • RBAC, JWT, API rate limiting; VPC isolation, SGs and IAM for least-privilege
  • Encryption at rest (RDS/S3) and in transit (HTTPS); Secrets Manager rotation
  • Compliance posture: SOC 2, HIPAA, GDPR ready practices

Performance & Scalability

Frontend

  • FCP < 1.5s, LCP < 2.5s, CLS < 0.1, FID < 100ms
  • Code-splitting, image optimization, lazy loading, PWA

Backend

  • p95 API < 200ms, PgBouncer pooling, read replicas
  • EC2 ASG + ALB, CloudFront edge caching

Project Highlights

  • Full-stack application with frontend, backend, and database integration
  • AWS cloud infrastructure with Cognito auth, S3 storage, and RDS PostgreSQL
  • Real-time features, advanced filtering, and multi-view event management
  • Production-ready architecture designed for scalability and security

Future Enhancements

  • Predictive analytics, smart task assignment, anomaly detection
  • Mobile apps (iOS/Android) with offline & push
  • Calendar/Payments/Social integrations; GraphQL API; serverless