{"id":51035373,"url":"https://github.com/codabytez/portfolio-main","last_synced_at":"2026-06-22T05:02:26.276Z","repository":{"id":365376493,"uuid":"1269772717","full_name":"codabytez/portfolio-main","owner":"codabytez","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-17T03:44:40.000Z","size":908,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-17T05:23:15.400Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/codabytez.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-15T04:49:34.000Z","updated_at":"2026-06-17T03:44:45.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/codabytez/portfolio-main","commit_stats":null,"previous_names":["codabytez/portfolio-main"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/codabytez/portfolio-main","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codabytez%2Fportfolio-main","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codabytez%2Fportfolio-main/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codabytez%2Fportfolio-main/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codabytez%2Fportfolio-main/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codabytez","download_url":"https://codeload.github.com/codabytez/portfolio-main/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codabytez%2Fportfolio-main/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34635038,"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-06-22T02:00:06.391Z","response_time":106,"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":[],"created_at":"2026-06-22T05:02:25.543Z","updated_at":"2026-06-22T05:02:26.264Z","avatar_url":"https://github.com/codabytez.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Portfolio\n\nA personal developer portfolio built with Next.js 15, Convex, and Tailwind CSS. Includes a CMS-style admin panel for managing all content without touching code.\n\n## Tech Stack\n\n- **Framework** — Next.js 15 (App Router)\n- **Database \u0026 backend** — Convex\n- **Styling** — Tailwind CSS v4\n- **Animations** — Motion (Framer Motion v12)\n- **Package manager** — pnpm\n\n## Features\n\n- Home, About, Projects, and Contact pages\n- Project detail modals with tech stack, features, and links\n- Snake game easter egg on the home page\n- Spotify now playing widget + weekly top tracks on the about page\n- Admin panel (`/admin`) to manage all portfolio content\n- Skeleton loading states and empty states\n- SEO metadata and OG image on every page\n- Fully responsive\n\n## Getting Started\n\n### 1. Install dependencies\n\n```bash\npnpm install\n```\n\n### 2. Set up environment variables\n\n```bash\ncp .env.example .env.local\n```\n\nFill in your values — see `.env.example` for descriptions.\n\n### 3. Set up Convex\n\n```bash\nnpx convex dev\n```\n\nThis starts the Convex dev server, generates the client, and keeps your schema in sync. Leave it running alongside the Next.js dev server.\n\n### 4. Set up Spotify (optional)\n\nThe about page shows your weekly top tracks and a now playing widget powered by the Spotify API.\n\n1. Go to [developer.spotify.com/dashboard](https://developer.spotify.com/dashboard) and create an app\n2. Add `https://oauth.pstmn.io/v1/callback` as a redirect URI in the app settings\n3. Visit the authorization URL below (replace `YOUR_CLIENT_ID`):\n\n```txt\nhttps://accounts.spotify.com/authorize?client_id=YOUR_CLIENT_ID\u0026response_type=code\u0026redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback\u0026scope=user-top-read%20user-read-currently-playing%20user-read-playback-state\n```\n\n4. After authorizing, copy the `code` from the redirect URL and exchange it for a refresh token:\n\n```bash\ncurl -X POST \"https://accounts.spotify.com/api/token\" \\\n  -H \"Authorization: Basic $(echo -n 'CLIENT_ID:CLIENT_SECRET' | base64)\" \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"grant_type=authorization_code\u0026code=YOUR_CODE\u0026redirect_uri=https%3A%2F%2Foauth.pstmn.io%2Fv1%2Fcallback\"\n```\n\n5. Copy the `refresh_token` from the response and add it to `.env.local` along with your client ID and secret\n\n6. Set the same three values as Convex environment variables:\n\n```bash\nnpx convex env set SPOTIFY_CLIENT_ID your_client_id\nnpx convex env set SPOTIFY_CLIENT_SECRET your_client_secret\nnpx convex env set SPOTIFY_REFRESH_TOKEN your_refresh_token\n```\n\n7. Trigger the first snapshot manually:\n\n```bash\nnpx convex run spotify:refresh\n```\n\n### 5. Run the dev server\n\n```bash\npnpm dev\n```\n\nOpen [http://localhost:3000](http://localhost:3000) to see the portfolio and [http://localhost:3000/admin](http://localhost:3000/admin) for the admin panel.\n\n## Admin Panel\n\nVisit `/admin` to manage your portfolio content — profile, about sections, projects, and contact info. Protected by a password set in `ADMIN_PASSWORD`.\n\n## Deployment\n\nDeploy to Vercel and set up a production Convex deployment:\n\n1. Push to GitHub and import the repo on [Vercel](https://vercel.com)\n1. Add all environment variables from `.env.example` in the Vercel dashboard\n1. Run `npx convex deploy` to deploy your Convex functions to production\n1. Push Spotify env vars to the production Convex deployment:\n\n```bash\nnpx convex env set SPOTIFY_CLIENT_ID your_client_id --prod\nnpx convex env set SPOTIFY_CLIENT_SECRET your_client_secret --prod\nnpx convex env set SPOTIFY_REFRESH_TOKEN your_refresh_token --prod\nnpx convex run spotify:refresh --prod\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodabytez%2Fportfolio-main","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodabytez%2Fportfolio-main","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodabytez%2Fportfolio-main/lists"}