DevArena is a polished Next.js application that aggregates programming contests and hackathons from multiple platforms and displays them with real-time timers, filters, and a responsive UI. It was built as a lightweight dashboard for competitive programmers to discover ongoing and upcoming events across CodeChef, CodeForces, Devfolio and Unstop.
- Aggregates contests from CodeChef and CodeForces via server API routes.
- Aggregates hackathons from Devfolio and Unstop via server API routes.
- Real-time countdown timers for each contest/hackathon (updates every second).
- Filter controls for
All,Ongoing, andUpcomingevents. - Responsive UI with a reusable
Navbar, theme toggle (light/dark), and mobile hamburger menu. - Aesthetic loading spinner component used across pages.
app/contests/page.tsx— Contests listing page (CodeChef + CodeForces).app/hackathons/page.tsx— Hackathons listing page (Devfolio + Unstop).app/components/Navbar.tsx— Site navigation, theme toggle and mobile menu.app/components/LoadingSpinner.tsx— Reusable loader component.app/api/codechef/route.ts— Server route that fetches CodeChef contests.app/api/codeforces/route.ts— Server route that fetches Codeforces contests.app/api/devfolio/route.ts— Server route that fetches Devfolio hackathons.app/api/unstop/route.ts— Server route that fetches Unstop hackathons.app/globals.css— Global styles, theme variables and loader CSS.
Note: The repository uses the Next.js app router and TypeScript.
- Next.js (App Router)
- React + TypeScript
- Tailwind CSS
- Framer Motion (animations)
- Axios (HTTP client)
- next-themes (theme switching)
Prerequisites
- Node.js (v18+ recommended)
- npm or pnpm
Install dependencies
npm installRun development server
npm run devBuild for production
npm run build
npm run startLint / format (if scripts exist in package.json)
npm run lint
npm run format- The app exposes server API routes under
app/api/*which proxy or fetch data from external contest/hackathon providers. These store-agnostic routes return normalized contest/hackathon objects consumed by the pages. - If any external APIs require keys, place them in a
.env.localfile at the project root and reference them innext.config.jsor the server route files.
- Timers use client-side
setIntervalto update countdowns every second. When modifying timer logic, preferuseEffectcleanup to avoid leaks. - UI uses
framer-motion'sAnimatePresencefor smooth entry/exit animations of the mobile menu and cards. - Keep imports consistent with Next.js path aliases (e.g.
@/app/components/...).
GET /api/codechef— Returnscodechef_contestsarray.GET /api/codeforces— Returnscodeforces_contestsarray.GET /api/devfolio— Returnsdevfolio_hackathonsarray.GET /api/unstop— Returnsunstop_hackathonsarray.
These server routes are intended to normalize response shape so frontend components can use a single ContestCard UI for multiple providers.
- Feel free to open issues for feature requests or bugs.
- Make feature branches from
mainand open pull requests with a clear description of changes. - Run and verify
npm run devlocally before opening PRs.
- This repository uses a
mainbranch. When pushing new changes, create a feature branch and open a pull request. - If you need to revert work locally, check commit history with
git log --onelineand usegit resetorgit revertas appropriate.
This project is available under the MIT License — see the LICENSE file for details.
If you want, I can also:
- add example screenshots or GIFs to the
README.md. - add a short
CONTRIBUTING.mdwith PR checklist. - add an automated
GitHub Actionsworkflow to run lint/build on PRs.
Which of these would you like next?