{"id":19787963,"url":"https://github.com/nixrajput/portfolio-nextjs","last_synced_at":"2026-07-14T20:01:12.256Z","repository":{"id":118344901,"uuid":"462304037","full_name":"nixrajput/portfolio-nextjs","owner":"nixrajput","description":"This repository contains the source code for a portfolio website built using Next.js, TypeScript, Sass, Tailwind, and Aceternity UI. ","archived":false,"fork":false,"pushed_at":"2026-07-10T10:45:58.000Z","size":11418,"stargazers_count":136,"open_issues_count":0,"forks_count":47,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-07-10T12:13:15.269Z","etag":null,"topics":["acernity-ui","bun","drizzle-orm","framer-motion","modern-ui","nextjs","nextjs-portfolio","nixrajput","nixrajput-github","portfolio","portfolio-nextjs","portfolio-project","portfolio-template","portfolio-webiste","portfolio-website","postgresql","tailwind","taiwindcss","vercel-deployment","vercel-hosting"],"latest_commit_sha":null,"homepage":"https://nixrajput.com","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nixrajput.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null},"funding":{"github":"nixrajput","ko_fi":"nixrajput","open_collective":"nixrajput","thanks_dev":"u/gh/nixrajput","custom":["https://www.buymeacoffee.com/nixrajput"]}},"created_at":"2022-02-22T13:12:48.000Z","updated_at":"2026-07-10T10:46:05.000Z","dependencies_parsed_at":"2023-10-11T04:49:10.735Z","dependency_job_id":"3cace7c6-c10a-4ccb-9c1c-13f5340e9df4","html_url":"https://github.com/nixrajput/portfolio-nextjs","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/nixrajput/portfolio-nextjs","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixrajput%2Fportfolio-nextjs","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixrajput%2Fportfolio-nextjs/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixrajput%2Fportfolio-nextjs/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixrajput%2Fportfolio-nextjs/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nixrajput","download_url":"https://codeload.github.com/nixrajput/portfolio-nextjs/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nixrajput%2Fportfolio-nextjs/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35476732,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-14T02:00:06.603Z","response_time":114,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["acernity-ui","bun","drizzle-orm","framer-motion","modern-ui","nextjs","nextjs-portfolio","nixrajput","nixrajput-github","portfolio","portfolio-nextjs","portfolio-project","portfolio-template","portfolio-webiste","portfolio-website","postgresql","tailwind","taiwindcss","vercel-deployment","vercel-hosting"],"created_at":"2024-11-12T06:25:23.453Z","updated_at":"2026-07-14T20:01:12.248Z","avatar_url":"https://github.com/nixrajput.png","language":"TypeScript","funding_links":["https://github.com/sponsors/nixrajput","https://ko-fi.com/nixrajput","https://opencollective.com/nixrajput","https://thanks.dev/u/gh/nixrajput","https://www.buymeacoffee.com/nixrajput"],"categories":[],"sub_categories":[],"readme":"# Nikhil Rajput — Portfolio (v2)\n\nPersonal portfolio website for [Nikhil Rajput](https://nixrajput.com), rebuilt from scratch on the modern Next.js 16 stack with a database-driven content layer, GitHub OAuth admin panel, and full CI/test suite.\n\n[![Stars](https://img.shields.io/github/stars/nixrajput/portfolio-nextjs?label=Stars\u0026style=flat)][repo]\n[![Forks](https://img.shields.io/github/forks/nixrajput/portfolio-nextjs?label=Forks\u0026style=flat)][repo]\n[![Watchers](https://img.shields.io/github/watchers/nixrajput/portfolio-nextjs?label=Watchers\u0026style=flat)][repo]\n[![Contributors](https://img.shields.io/github/contributors/nixrajput/portfolio-nextjs?label=Contributors\u0026style=flat)][repo]\n\n[![GitHub last commit](https://img.shields.io/github/last-commit/nixrajput/portfolio-nextjs?label=Last+Commit\u0026style=flat)][repo]\n[![GitHub issues](https://img.shields.io/github/issues/nixrajput/portfolio-nextjs?label=Issues\u0026style=flat)][issues]\n[![GitHub pull requests](https://img.shields.io/github/issues-pr/nixrajput/portfolio-nextjs?label=Pull+Requests\u0026style=flat)][pulls]\n[![GitHub License](https://img.shields.io/github/license/nixrajput/portfolio-nextjs?label=License\u0026style=flat)][license]\n\n---\n\n## Screenshots\n\nAn immersive, cursor-reactive hero over a page-wide gradient background, with a first-class light and dark theme.\n\n| Dark theme                                                  | Light theme                                                   |\n| ----------------------------------------------------------- | ------------------------------------------------------------- |\n| ![Home page, dark theme](public/screenshots/hero-dark.webp) | ![Home page, light theme](public/screenshots/hero-light.webp) |\n\n---\n\n## Table of Contents\n\n- [Nikhil Rajput — Portfolio (v2)](#nikhil-rajput--portfolio-v2)\n  - [Screenshots](#screenshots)\n  - [Table of Contents](#table-of-contents)\n  - [Stack](#stack)\n  - [Architecture overview](#architecture-overview)\n  - [Prerequisites](#prerequisites)\n  - [Local setup](#local-setup)\n    - [1. Clone and install](#1-clone-and-install)\n    - [2. Environment variables](#2-environment-variables)\n    - [3. Database setup](#3-database-setup)\n    - [4. Git hooks](#4-git-hooks)\n    - [5. Run the dev server](#5-run-the-dev-server)\n  - [Commands](#commands)\n  - [Admin panel](#admin-panel)\n  - [Deployment](#deployment)\n  - [Contributing](#contributing)\n  - [License](#license)\n  - [Sponsor me](#sponsor-me)\n  - [Connect with me](#connect-with-me)\n\n---\n\n## Stack\n\n| Layer           | Technology                                                          |\n| --------------- | ------------------------------------------------------------------- |\n| Framework       | [Next.js 16](https://nextjs.org/) (App Router, Turbopack)           |\n| UI library      | [React 19](https://react.dev/)                                      |\n| Language        | TypeScript                                                          |\n| Styling         | [Tailwind CSS v4](https://tailwindcss.com/), Geist font             |\n| Animation       | [Framer Motion](https://www.framer-motion.com/)                     |\n| Icons           | [Lucide React](https://lucide.dev/)                                 |\n| Database        | PostgreSQL via [postgres-js](https://github.com/porsager/postgres)  |\n| ORM             | [Drizzle ORM](https://orm.drizzle.team/)                            |\n| Auth            | [Auth.js v5](https://authjs.dev/) — GitHub OAuth                    |\n| File storage    | [Vercel Blob](https://vercel.com/docs/storage/vercel-blob)          |\n| Email           | [Resend](https://resend.com/)                                       |\n| Analytics       | [Vercel Analytics](https://vercel.com/analytics) + Google Analytics |\n| Package manager | [Bun](https://bun.sh/)                                              |\n| Unit tests      | [Vitest](https://vitest.dev/) + Testing Library                     |\n| E2E tests       | [Playwright](https://playwright.dev/)                               |\n| Deployment      | [Vercel](https://vercel.com/)                                       |\n\n---\n\n## Architecture overview\n\n- **DB-driven content** — profile, projects, experiences, skills, services, social links, taglines, and FAQs are stored in PostgreSQL and seeded via `bun run db:seed`. The admin panel allows live CRUD editing. The profile drives the hero (name, editable role marquee, \"Currently\" tagline, avatar) and the About section.\n- **Image uploads** — the profile avatar and skill icons are uploaded from the admin panel to Vercel Blob (SVG stored raw for crisp vector icons, raster formats optimized to WebP) and served from the CDN. Each field also accepts a plain URL, and existing static asset paths keep working.\n- **GitHub cache** — project metadata (stars, forks, descriptions) is fetched from the GitHub API at build time and revalidated server-side via `GITHUB_TOKEN`. Only repos listed in the database are enriched.\n- **Testimonials** — visitors submit testimonials through a validated form (inline per-field errors) with an optional cropped avatar uploaded to Vercel Blob. Submissions land in a moderation queue; the admin approves or rejects them before they appear publicly. Resend emails the admin on new submissions.\n- **Admin panel** — protected by GitHub OAuth (`AUTH_GITHUB_ID` / `AUTH_GITHUB_SECRET`). Access is restricted to the GitHub login set in `ADMIN_GITHUB_LOGIN` (default: `nixrajput`). The panel exposes CRUD tabs for all content types plus the testimonial moderation queue.\n- **SEO / GEO** — structured metadata, Open Graph, Twitter cards, Google verification, and `robots.txt` are generated from the database profile row and site config.\n\n---\n\n## Prerequisites\n\n- **[Bun](https://bun.sh/) ≥ 1.1** — the only supported package manager and runtime.\n- **PostgreSQL ≥ 14** — running locally or via a managed service (Neon, Supabase, etc.).\n- A **GitHub OAuth App** for admin login (Settings → Developer settings → OAuth Apps).\n\n---\n\n## Local setup\n\n### 1. Clone and install\n\n```bash\ngit clone https://github.com/nixrajput/portfolio-nextjs.git\ncd portfolio-nextjs\nbun install\n```\n\n### 2. Environment variables\n\nCopy `.env.example` to `.env.local` and fill in the values:\n\n```bash\ncp .env.example .env.local\n```\n\n| Variable                                | Required    | Description                                                                         |\n| --------------------------------------- | ----------- | ----------------------------------------------------------------------------------- |\n| `DATABASE_URL`                          | Yes         | PostgreSQL connection string, e.g. `postgres://user:pass@localhost:5432/portfolio`  |\n| `AUTH_SECRET`                           | Yes         | Random secret for Auth.js session encryption (`openssl rand -base64 32`)            |\n| `AUTH_GITHUB_ID`                        | Yes         | GitHub OAuth App client ID                                                          |\n| `AUTH_GITHUB_SECRET`                    | Yes         | GitHub OAuth App client secret                                                      |\n| `ADMIN_GITHUB_LOGIN`                    | Yes         | GitHub username allowed to access the admin panel (e.g. `nixrajput`)                |\n| `GITHUB_TOKEN`                          | Recommended | GitHub personal access token for project metadata fetching (higher rate limits)     |\n| `BLOB_READ_WRITE_TOKEN`                 | Yes (prod)  | Vercel Blob token for image uploads (avatar, skill icons, testimonial avatars)      |\n| `RESEND_API_KEY`                        | Yes (prod)  | Resend API key for admin notification emails                                        |\n| `RESEND_FROM_EMAIL`                     | Yes (prod)  | From address for emails, e.g. `Portfolio \u003cnoreply@nixrajput.com\u003e` (verified domain) |\n| `CONTACT_EMAIL`                         | Yes (prod)  | Email address to receive testimonial submission notifications                       |\n| `REVALIDATE_SECRET`                     | Yes (prod)  | Secret for the `/api/revalidate` on-demand revalidation endpoint                    |\n| `NEXT_PUBLIC_SITE_URL`                  | Yes         | Canonical site URL, e.g. `https://nixrajput.com`                                    |\n| `NEXT_PUBLIC_GTAG_ID`                   | Optional    | Google Analytics measurement ID (e.g. `G-XXXXXXXXXX`)                               |\n| `NEXT_PUBLIC_GOOGLE_VERIFICATION_TOKEN` | Optional    | Google Search Console site verification token                                       |\n\n\u003e The resume link is stored in the database (`profile.resumeUrl`) and managed from the admin panel — not via an environment variable.\n\n### 3. Database setup\n\nRun migrations to create the schema, then seed initial data:\n\n```bash\nbunx drizzle-kit migrate\nbun run db:seed\n```\n\n### 4. Git hooks\n\nEnable the pre-push lint + format gate once per clone:\n\n```bash\ngit config core.hooksPath .githooks\n```\n\nThis runs `bun run lint` and `bun run format:check` before every push. Bypass in an emergency with `git push --no-verify`.\n\n### 5. Run the dev server\n\n```bash\nbun run dev\n```\n\nThe site is available at [http://localhost:4000](http://localhost:4000).\n\n---\n\n## Commands\n\n| Command                | Description                             |\n| ---------------------- | --------------------------------------- |\n| `bun run dev`          | Start dev server (Turbopack, port 4000) |\n| `bun run build`        | Production build (Turbopack)            |\n| `bun run start`        | Start production server                 |\n| `bun run lint`         | Run ESLint                              |\n| `bun run lint:fix`     | Run ESLint with auto-fix                |\n| `bun run format`       | Format source files with Prettier       |\n| `bun run format:check` | Check formatting without writing        |\n| `bun run typecheck`    | Run `tsc --noEmit`                      |\n| `bun run test`         | Run Vitest unit tests                   |\n| `bun run test:watch`   | Run Vitest in watch mode                |\n| `bun run test:e2e`     | Run Playwright end-to-end tests         |\n| `bun run db:generate`  | Generate a new Drizzle migration        |\n| `bun run db:migrate`   | Apply pending migrations                |\n| `bun run db:push`      | Push schema changes directly (dev only) |\n| `bun run db:studio`    | Open Drizzle Studio                     |\n| `bun run db:seed`      | Seed the database with initial data     |\n\n---\n\n## Admin panel\n\nThe admin panel is at `/admin` and requires authentication via GitHub OAuth.\n\n- Only the GitHub account set in `ADMIN_GITHUB_LOGIN` (e.g. `nixrajput`) can sign in.\n- After signing in you have access to CRUD tabs for profile, projects, experiences, skills, services, social links, taglines, FAQs, and funding links.\n- The profile editor manages your name, bio, hero role marquee, \"Currently\" tagline, resume link, and avatar (upload or URL). Skill icons are uploaded or URL-pasted per skill.\n- Testimonial submissions appear in a moderation queue. Approve a testimonial to make it visible on the site; reject to discard it.\n\nImage uploads (avatar, skill icons) require `BLOB_READ_WRITE_TOKEN` to be set.\n\n---\n\n## Deployment\n\nThe site is deployed on [Vercel](https://vercel.com/). The main branch deploys automatically.\n\n1. Import the repository in Vercel.\n2. Add all required environment variables in the Vercel project settings.\n3. Provision a PostgreSQL database (Vercel Postgres / Neon) and set `DATABASE_URL` to its **pooled** connection string.\n4. Seed the production database **once** by hand against the production `DATABASE_URL`: `DATABASE_URL=\u003cprod\u003e bun run db:seed`. The seed is guarded (seed-if-empty), so it inserts the initial content only when the database is empty and never overwrites later edits.\n5. Push to `master` — Vercel runs the `vercel-build` script, which applies pending migrations and then builds. It does **not** seed; data seeding is the one-time manual step above, and further content changes are made in the admin panel.\n\nThe local `DATABASE_URL` stays pointed at your local Postgres for development; only the Vercel environment uses the production database.\n\n---\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for the full guide.\n\n---\n\n## License\n\nMIT — see [LICENSE](LICENSE).\n\n---\n\n## Sponsor me\n\n[![Sponsor](https://img.shields.io/static/v1?label=Sponsor\u0026message=%E2%9D%A4\u0026logo=GitHub\u0026color=%23fe8e86)](https://github.com/sponsors/nixrajput)\n[![ko-fi](https://ko-fi.com/img/githubbutton_sm.svg)](https://ko-fi.com/nixrajput)\n[![\"Buy Me A Coffee\"](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/nixrajput)\n\n---\n\n## Connect with me\n\n[![GitHub: nixrajput](https://img.shields.io/badge/nixrajput-EFF7F6?logo=GitHub\u0026logoColor=333\u0026link=https://www.github.com/nixrajput)][github]\n[![LinkedIn: nixrajput](https://img.shields.io/badge/nixrajput-EFF7F6?logo=LinkedIn\u0026logoColor=blue\u0026link=https://www.linkedin.com/in/nixrajput)][linkedin]\n[![Instagram: nixrajput](https://img.shields.io/badge/nixrajput-EFF7F6?logo=Instagram\u0026link=https://www.instagram.com/nixrajput)][instagram]\n[![X: nixrajput](https://img.shields.io/badge/nixrajput-EFF7F6?logo=X\u0026logoColor=333\u0026link=https://x.com/nixrajput)][twitter]\n\n[github]: https://github.com/nixrajput\n[twitter]: https://x.com/nixrajput\n[instagram]: https://instagram.com/nixrajput\n[linkedin]: https://linkedin.com/in/nixrajput\n[repo]: https://github.com/nixrajput/portfolio-nextjs\n[issues]: https://github.com/nixrajput/portfolio-nextjs/issues\n[pulls]: https://github.com/nixrajput/portfolio-nextjs/pulls\n[license]: https://github.com/nixrajput/portfolio-nextjs/blob/master/LICENSE\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixrajput%2Fportfolio-nextjs","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnixrajput%2Fportfolio-nextjs","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnixrajput%2Fportfolio-nextjs/lists"}