Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
a428121
feat: remove avatars from work experience section (#28)
remcostoeten Dec 9, 2025
f67bcf7
feat: Introduce new blog posts, implement a comprehensive metadata sy…
remcostoeten Dec 10, 2025
9b9059d
feat: Add GitHub activity and contributions display, remove Shiki cod…
remcostoeten Dec 12, 2025
5473729
feat: Implement collapsible work experience sections and update exper…
remcostoeten Dec 13, 2025
3d8c60a
refactor: relocate categories and topics pages to /blog routes and im…
remcostoeten Dec 14, 2025
1fe3eca
feat: Refactor component structure, add new blog posts, and introduce…
remcostoeten Dec 14, 2025
f16194d
feat: Add new blog posts, update Spotify and GitHub integrations, and…
remcostoeten Dec 14, 2025
1c5b4b7
Make env.example not crypic, yw
remcostoeten Dec 14, 2025
9097436
Migrate low IQ arrow constants to real man functions
remcostoeten Dec 14, 2025
791db30
feat: introduce rotating activity feed component displaying GitHub an…
remcostoeten Dec 18, 2025
137f340
refactor(ui): redesign CodeBlock with line highlighting support
remcostoeten Dec 19, 2025
6f1b17a
feat(blog): update MDX components and add productivity post skeleton
remcostoeten Dec 19, 2025
7383f1f
style(activity): refine Spotify track display in activity feed
remcostoeten Dec 19, 2025
4419c2a
feat(hooks): add isPrivate field to GitHub event detail
remcostoeten Dec 19, 2025
d0b2269
chore: update bun.lock
remcostoeten Dec 19, 2025
fe38036
env + paths + deps + drizzle config + db connection + helpers + schema
remcostoeten Dec 19, 2025
6589aca
feat: (server) setup drizzle, neon and env.ts (#30)
remcostoeten Dec 19, 2025
af8ceb1
feat: add reusable hover cards to activity feed
remcostoeten Dec 19, 2025
b74ae61
feat: Implement real-time Spotify playback with `useSpotifyPlayback` …
remcostoeten Dec 19, 2025
caeeae0
feat: vim-style auth commands (:signin/:signout)
remcostoeten Dec 19, 2025
3126f62
fix: GitHub calendar isVisible state dependency
remcostoeten Dec 19, 2025
278c49e
fix: activity feed alignment and section spacing
remcostoeten Dec 20, 2025
1a2da61
chore: resolve conflicts with master by accepting origin/master changes
remcostoeten Dec 20, 2025
c2a63f2
fix: activity feed alignment and section spacing (#32)
remcostoeten Dec 20, 2025
8653a21
feat: draft blog system, vim auth, calendar fixes & activity improvem…
remcostoeten Dec 20, 2025
f5ef0b6
feat: Activity sync system for GitHub & Spotify (#34)
remcostoeten Dec 20, 2025
9f4c747
fix: add missing better-auth dependency and fix build errors
remcostoeten Dec 20, 2025
b6ddb10
feat: add CRON_SECRET to environment schema
remcostoeten Dec 20, 2025
cc2ebc8
feat: Introduce comprehensive UI skeleton components and implement in…
remcostoeten Dec 20, 2025
99410e3
feat: Redesign blog post display, enhance auth commands, and remove s…
remcostoeten Dec 20, 2025
f48329c
feat: introduce interactive blog features, new UI components, and a V…
remcostoeten Dec 20, 2025
7bb5b50
feat: refactor admin authentication, add sitemap generation, update V…
remcostoeten Dec 20, 2025
81ea86c
feat: Implement dark mode with theme switching and update various com…
remcostoeten Dec 20, 2025
ceac733
feat: Refactor activity and tech stack components to landing page, ad…
remcostoeten Dec 21, 2025
2ac160e
feat: Implement admin panel, contact form with rate limiting, and blo…
remcostoeten Dec 21, 2025
c93989d
feat: implement blog post view tracking with unique visitor detection…
remcostoeten Dec 21, 2025
005062a
feat: add blog view count and admin area
remcostoeten Dec 21, 2025
0b7a0b6
feat: Add privacy and terms pages, new blog posts, and refactor page …
remcostoeten Dec 21, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 62 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# ============================================================
# Database
# ============================================================
DATABASE_URL="" # Postgres Neon connection string

# ============================================================
# Better Auth
# ============================================================
BETTER_AUTH_URL="" # Your app's base URL
BETTER_AUTH_SECRET="" # Secret key for auth (min 32 chars recommended)

# ============================================================
# GitHub OAuth (optional)
# ============================================================
GITHUB_CLIENT_ID="" # Create OAuth app at https://github.com/settings/developers
GITHUB_CLIENT_SECRET="" # Retrieved from GitHub OAuth app settings

# ============================================================
# Google OAuth (optional)
# ============================================================
GOOGLE_CLIENT_ID="" # Create OAuth app at https://console.cloud.google.com/apis/credentials
GOOGLE_CLIENT_SECRET="" # Retrieved from Google Cloud Console

# ============================================================
# Admin
# ============================================================
ADMIN_EMAIL="" # Admin email for notifications

# ============================================================
# Resend (Email, optional)
# ============================================================
RESEND_API_KEY="" # API key from https://resend.com
RESEND_EMAIL_FROM="" # Verified sender email

# ============================================================
# PostHog Analytics (optional)
# ============================================================
NEXT_PUBLIC_POSTHOG_KEY="" # Project API key from PostHog
NEXT_PUBLIC_POSTHOG_HOST="" # PostHog host URL (e.g., https://app.posthog.com)

# ============================================================
# GitHub (for public profile data)
# ============================================================
NEXT_PUBLIC_GITHUB_TOKEN="" # Personal access token for GitHub API

# ============================================================
# Spotify OAuth (optional)
# ============================================================
SPOTIFY_CLIENT_ID="" # Create OAuth app at https://developer.spotify.com/dashboard
SPOTIFY_CLIENT_SECRET="" # Retrieved from Spotify app settings
SPOTIFY_REFRESH_TOKEN="" # Needed for server-side syncing without user login
SPOTIFY_REDIRECT_URI="http://127.0.0.1:3000/api/auth/spotify/callback"

# ============================================================
# IP info service
# ============================================================
IP_INFO_TOKEN="" # Token from https://ipinfo.io

# ============================================================
# Vercel Cron
# ============================================================
CRON_SECRET="" # Secret key for cron jobs
5 changes: 5 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,8 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts
.env*.local
setup-posthog.md
src/app/blog/posts/productivity/mac-to-linux.mdx
src/app/blog/posts/productivity/mac-to-linux.mdx
.env.production
1 change: 1 addition & 0 deletions .nvmrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
24
67 changes: 67 additions & 0 deletions .posthog-events.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
[
{
"eventName": "sign_in_initiated",
"eventDescription": "User initiated sign in with OAuth provider (GitHub or Google)",
"filePath": "src/components/auth/oauth-modal.tsx"
},
{
"eventName": "sign_in_completed",
"eventDescription": "User successfully completed sign in via OAuth",
"filePath": "src/components/blog/sign-in-button.tsx"
},
{
"eventName": "blog_post_reaction",
"eventDescription": "User reacted to a blog post with an emoji (fire, heart, clap, thinking, rocket)",
"filePath": "src/components/blog/reaction-bar.tsx"
},
{
"eventName": "blog_comment_submitted",
"eventDescription": "User submitted a comment on a blog post",
"filePath": "src/components/blog/comment-section.tsx"
},
{
"eventName": "blog_comment_deleted",
"eventDescription": "User deleted their own comment",
"filePath": "src/components/blog/comment-section.tsx"
},
{
"eventName": "blog_search_performed",
"eventDescription": "User performed a search query in the blog search bar",
"filePath": "src/components/search/search-bar.tsx"
},
{
"eventName": "blog_search_result_clicked",
"eventDescription": "User clicked on a search result to navigate to a blog post",
"filePath": "src/components/search/search-bar.tsx"
},
{
"eventName": "contact_form_opened",
"eventDescription": "User opened the contact form popover",
"filePath": "src/components/contact/contact-popover.tsx"
},
{
"eventName": "contact_form_submitted",
"eventDescription": "User submitted the contact form (conversion event)",
"filePath": "src/components/contact/contact-popover.tsx"
},
{
"eventName": "email_copied",
"eventDescription": "User copied the email address from the footer",
"filePath": "src/components/layout/footer.tsx"
},
{
"eventName": "social_link_clicked",
"eventDescription": "User clicked a social media link (GitHub, LinkedIn, X)",
"filePath": "src/components/layout/footer.tsx"
},
{
"eventName": "project_link_clicked",
"eventDescription": "User clicked on a project link (GitHub or live site)",
"filePath": "src/components/home/projects.tsx"
},
{
"eventName": "theme_toggled",
"eventDescription": "User toggled between light and dark theme",
"filePath": "src/components/ui/theme-switch.tsx"
}
]
Loading