a simple website i built to show off my certifications. basically a visual grid of cards where you can search, filter by category, and view or download the actual PDFs. nothing fancy, just a clean way to keep track of everything in one place.
the plan is to keep adding certs here as i earn more over time.
live at certs.itsharsha.me
- responsive card grid that looks good on both desktop and mobile
- hover over a card (or tap on mobile) to see the details and action buttons
- search across certificate titles and issuers
- filter by category with pill buttons
- view certs in a new tab or download the PDF directly
- dark theme with smooth animations
- keyboard accessible (you can press
/to jump to search, navigate cards with tab, enter/space to open, escape to close)
| what | with |
|---|---|
| framework | Next.js 16 (App Router) |
| language | TypeScript (strict mode) |
| ui | React 19 |
| styling | Tailwind CSS v4 |
| fonts | Geist Sans + Geist Mono |
| testing | Vitest + Testing Library |
| deployed on | Vercel |
you need Node.js 20+ and npm.
git clone https://github.com/harsha260/certs.git
cd certs
npm install
npm run devopen localhost:3000 and you should see it running.
other commands:
npm run build # production build (also checks for type errors)
npm run lint # run eslint
npm run test # run all testssrc/
app/
page.tsx main page (server component)
layout.tsx root layout, metadata, fonts
loading.tsx skeleton loading state
error.tsx error boundary
not-found.tsx 404 page
globals.css tailwind + theme config
components/
CertificateExplorer client boundary, owns search/filter state
CertificateCard card with hover/tap overlay
CertificateGrid responsive grid + empty state
SearchBar search input with "/" shortcut
CategoryFilter category pill buttons
Header page title and subtitle
data/
certificates.json all the cert data lives here
types/
certificate.ts TypeScript interface
utils/
filterCertificates.ts search, filter, and sort logic
public/
certs/ certificate PDFs and preview images
-
drop your certificate PDF and a preview image (png/jpg) into
public/certs/ -
add an entry to
src/data/certificates.json:
{
"id": 2,
"title": "Certificate Title",
"issuer": "Issuing Organization",
"date": "YYYY-MM-DD",
"category": "Category Name",
"fileUrl": "/certs/My-Certificate.pdf",
"imageUrl": "/certs/My-Certificate.png"
}that's it. the new cert shows up in the grid automatically, and it's searchable and filterable right away. categories are derived from the data so if you use a new category name it just works.
feel free to fork this and make it your own. the rough steps:
- fork and clone the repo
- clear out
public/certs/and setsrc/data/certificates.jsonto[] - add your own certs (see above)
- update the title in
src/components/Header.tsxand metadata insrc/app/layout.tsx - deploy to Vercel or wherever you like
deployed on Vercel. pushing to main triggers an automatic deploy.
open source -- fork it, modify it, do whatever you want with it.