This is my personal portfolio website built with Next.js. It includes a real-time Signature guestbook, a detailed Uses page with tools and setup, a small blog, OAuth login (Google/GitHub) and light/dark themes.
The project is still evolving, so if you spot any bugs, typos or have ideas for improvements, feel free to open an issue or pull request.
-
Real-time Signature Guestbook
Visitors can leave signatures on the Signature page, which are stored in Firebase and appear instantly for everyone without a page reload. -
Live Uses Reactions
The Uses page lists your tools, stack, and workstation setup, and users can react to specific items. These reactions are tracked in Realtime Database so popularity and counts update live. -
Real-time Presence on About
The About page includes real-time cursor presence: each visitor’s cursor position and metadata are synced through Firebase so multiple users can see each other “live” on the page, creating a collaborative feel. -
OAuth Authentication (Google & GitHub)
Sign-in is handled via NextAuth with Google and GitHub providers, allowing authenticated features (like personalized signatures or future gated content) while keeping setup simple through environment variables. -
Content & Navigation
The site uses file-based routing and Markdown-backed blog posts to keep content easy to extend, plus a cmdk-powered command palette for quick keyboard navigation across pages and actions. -
Theming & UX
Light/dark themes, subtle animations, and a minimal layout make the portfolio feel modern and fast, while still being straightforward to run locally with a singlenpm run devafter configuring.env.localand Firebase rules.
-
Fork or Clone
Fork or clone this project from Github to get your own copy of it.
-
Installation
Once this is installed you can run
npm installin your project directory to install dependencies.npm i --legacy-peer-deps
-
Start developing.
Navigate into your new site’s directory and start it up.
npm run dev
To run the project locally, you need to configure environment variables and Firebase.
Obtain your API keys and configuration values:
NEXT_PUBLIC_FIREBASE_API_KEY=your-firebase-api-key
NEXT_PUBLIC_FIREBASE_AUTH_DOMAIN=your-auth-domain
NEXT_PUBLIC_FIREBASE_DATABASE_URL=your-url-firebase
NEXT_PUBLIC_FIREBASE_PROJECT_ID=your-project-id
NEXT_PUBLIC_FIREBASE_STORAGE_BUCKET=your-storage-bucket
NEXT_PUBLIC_FIREBASE_MESSAGING_SENDER_ID=your-messaging-sender-id
NEXT_PUBLIC_FIREBASE_APP_ID=your-app-id
NEXT_PUBLIC_FIREBASE_MEASUREMENT_ID=your-measurement-id
Profile → Settings → Developer settings → Personal access tokens
GITHUB_TOKEN=your-github-token
Firebase Console → Project Settings → Service accounts → Firebase Admin SDK → Generate new private key
FIREBASE_PROJECT_ID=your-project-id
FIREBASE_CLIENT_EMAIL=your-service-account-email
FIREBASE_PRIVATE_KEY="-----BEGIN PRIVATE KEY-----\n...\n-----END PRIVATE KEY-----\n"
GOOGLE_SECRET=your-google-secret
GOOGLE_ID=your-google-client-id
GITHUB_SECRET=your-github-secret
GITHUB_ID=your-github-client-idImportant:
FIREBASE_PRIVATE_KEYmust be a single line with\ninstead of actual line breaks, otherwise Firebase Admin will not initialize.
Show Firebase rules
See full Firebase Realtime Database rules in
FIREBASE-RULES.md
Create OAuth applications in Google and GitHub:
-
Google OAuth:
GOOGLE_SECRETGOOGLE_ID
-
GitHub OAuth:
GITHUB_SECRETGITHUB_ID
Setup Steps:
- Go to Google Cloud Console and Github Apps create an OAuth client.
- Set authorized redirect URIs (e.g.,
http://localhost:3000/api/auth/callback/...for local development). - Copy your
Client IDandClient Secret. - Add these to your
.env.localfile:
GOOGLE_SECRET=your-google-secret
GOOGLE_ID=your-google-client-id
GITHUB_SECRET=your-github-secret
GITHUB_ID=your-github-client-idLocal:
- http://localhost:3000/api/auth/callback/google
- http://localhost:3000/api/auth/callback/github
Production:
- https://www.devollox.fun/api/auth/callback/google
- https://www.devollox.fun/api/auth/callback/githubContributions are welcome!
See CONTRIBUTING.md for details on setup, workflow and what kind of changes fit this project.