A practice platform for contest math, in the spirit of Euclid, CSIMC, AMC, AIME, USAMO, COMC, CMO, and HMMT. Problems are original, written for CoordBash, not copied from any contest. Grading covers full proofs, not just final answers, and scores are shown against the distribution of other submissions.
Next.js (App Router) + Tailwind. lucide-react for icons, katex /
react-katex wired in as a dependency for rendering math notation once
statements move from plain text to LaTeX source.
src/
app/
layout.jsx shared shell: navbar + page container
page.jsx redirects to /problems
problems/page.jsx problem list, filters by difficulty, format, topic
problems/[slug]/page.jsx single problem: statement, tabs, submission editor
submissions/page.jsx a user's submission history (reached via account menu)
profile/[username]/page.jsx public profile: streak, rank, solved counts
components/
Navbar.jsx gradient logo, search, notifications, streak, account avatar
AccountMenu.jsx dropdown from the avatar circle
NotificationsMenu.jsx dropdown from the bell icon
SideRail.jsx left icon rail: Problems, Explore, Study Paths, My Lists
HeroCarousel.jsx promo banner row above the problem list
TopicChips.jsx topic filter row with per-topic counts
FormatTabs.jsx All / Proof / Numerical toggle
DifficultyBadge.jsx Easy / Medium / Hard / Advanced pill
FilterSidebar.jsx difficulty, format, and topic checkboxes (list view filters)
ProblemsTable.jsx problem list rows
ProblemStatement.jsx renders statement text and any figures
SubmissionEditor.jsx proof/answer entry, image attachment, grading result
PercentileAxis.jsx score plotted on an axis with a percentile marker
SimilarContestPicker.jsx "have you seen a similar problem on a contest" prompt
StreakCalendar.jsx right-rail streak widget
TrendingContests.jsx right-rail panel of most-tagged contests
Tabs.jsx small reusable tab bar
data/
problems.json mock problem set, replace with the real bank
contests.json contests used only as reference tags, not a source
topics.json topic taxonomy for filtering
users.json mock signed-in user
lib/
percentile.js percentile-rank scoring helpers
Problem carries difficulty (Easy/Medium/Hard/Advanced), format
(Proof/Numerical), topics (array, multi-select filter),
points (max score, meaningful mainly for Proof format), images (figures
for geometry-style problems, read by the grading model's vision step when
present in a submission too), and stats.
Submission (not yet a JSON file, wire up once a backend exists) should
carry the submitted text, any attached images, a score out of the
problem's points, and a percentile computed from lib/percentile.js
against that problem's score distribution. Proof-format problems are graded
on quality, not just correctness, so score is a partial-credit integer,
never a boolean.
Contest tags are community-submitted links between a CoordBash problem
and a real contest problem it resembles, gathered through
SimilarContestPicker. They are display-only signal, never treated as the
problem's source, since every problem here is original.
- Replace the JSON files in
src/datawith API calls (REST or a database client), keeping the same shapes so the components need no changes. - Point
SubmissionEditor'shandleSubmitat a real grading endpoint that accepts text and image attachments and returns a score plus written feedback. - Add auth and swap the hardcoded
users[0]inlayout.jsxfor the signed-in session.