"My personal space on the cloud where I document my programming journey, sharing lessons, insights, and resources for fellow developers."
Features β’ Tech Stack β’ Additions & Changes β’ Contributing
Welcome to danadavis.dev, my personal blog and portfolio built with modern web technologies. This is where I share my experiences, tutorials, project showcases, and insights from my journey as a software engineer.
Sharing is learning!
I started this blog to document and share things I've learned and found useful. Writing helps solidify my understanding and hopefully provides value to the developer community.
- π Blog Posts: Rich MDX-powered articles with code syntax highlighting
- π Books & Movies: Personal recommendations and reviews
- πΌ Projects Portfolio: Showcase of my development projects
- π§ Code Snippets: Reusable code snippets and utilities
- π·οΈ Tags System: Organized content by topics
- π Search Functionality: Powered by KBar for quick navigation
- π Dark Mode: GitHub dark dimmed theme support
- π Analytics: Umami integration for privacy-focused tracking
- ποΈ Database: PostgreSQL with Prisma ORM for type-safe operations
- π Admin Panel: Manage posts, comments, and more
- π΅ Integrations: Spotify now-playing, GitHub activities, and more
- π± Responsive Design: Optimized for all devices
| Category | Technologies |
|---|---|
| Frontend | Next.js 15 (App Router), React 19, TypeScript |
| Styling | Tailwind CSS, PostCSS |
| Content | Contentlayer, MDX |
| Database | PostgreSQL (Supabase), Prisma ORM |
| Analytics | Umami |
| Linting | Biome |
| Deployment | Vercel |
This blog is forked and heavily customized from leohuynh.dev, a Next.js starter blog. Here are the key additions and modifications:
- Hero Parallax Landing: Custom animated hero section with infinite scrolling projects/blog posts, kinetic typography, and interactive parallax effects built with Framer Motion
- Custom Color Scheme: Implemented Black, Orange, and Green theme (replacing default blues)
- Interactive Header Section: Dynamic mouse-tracking effects, animated title reveals, and glitch-style typography
- Responsive Animations: Separate mobile and desktop animation strategies for optimal performance
- Enhanced Components: Custom UI components with advanced motion effects and styling
- Books & Movies Sections: Personal book and movie tracking with ratings and filtering system
- Code Snippets: Dedicated section for sharing reusable code snippets with tagging
- Comprehensive Tags System: Organized content discovery across all sections
- Rich Media Support: Better handling of images, videos, and media in posts
-
Themed CMS Admin Panel: Full-featured dashboard for managing blog posts, media, and comments
- Add/Edit/Delete posts with Novel.sh rich text editor
- Post management with filtering and organization
- Built-in authentication with Kinde Auth for secure access
- Comprehensive metadata management (tags, categories, images, canonical URLs)
- Draft and featured post toggles for content workflow
-
Captain's Log: Voice-to-text note-taking system with AI-powered analysis
- Record audio notes that are automatically transcribed using OpenAI Whisper
- AI summarization and content type classification (thought, idea, blog-draft, project-idea, note)
- Automatic tagging and potential identification for blog posts and projects
- Full editing capabilities with privacy controls and metadata tracking
-
Comments: User authentication via Kinde Auth for secure commenting
- Threaded conversations with nested replies
- Like/reaction system for comment engagement
- Markdown support for rich text formatting
-
Novel.sh Editor: Advanced AI-powered WYSIWYG editor with support for formatting, links, images, code blocks, and slash commands
-
Type-Safe Database: PostgreSQL with Prisma ORM for dynamic content management and querying
-
Admin Dashboard: Secure access to manage all content through an authenticated interface
- GitHub Integration: GitHub GraphQL API for displaying user activities and contributions
- Spotify Integration: Now-playing track display with album artwork and playback info
- RSS Feed Generation: Automated RSS feed creation from blog posts
- Newsletter Support: Email subscription API endpoint
- Post Metadata: Dynamic post views tracking and engagement metrics
Before deploying to production, you'll need to gather API credentials from various services. Here's a straightforward guide to get all the keys you need:
- A Vercel account (for hosting)
- A GitHub account (for repository connection)
- Browser access to set up services
1. Database Setup π¦
- Go to supabase.com and sign in
- Click "New Project" and select your organization
- Enter a project name and set a strong database password
- Choose a region close to your users
- Wait for the project to be created (~2 minutes)
- Navigate to Settings > Database
- Copy the Connection String (choose "URI" format) and set it as
DATABASE_URL
Environment Variable: DATABASE_URL
2. Authentication Setup π
- Visit kinde.com and create a free account
- Go to Settings > Applications in your dashboard
- Click "Create Application" and name it (e.g., "My Blog")
- Copy these credentials:
- Client ID β
KINDE_CLIENT_ID - Client Secret β
KINDE_CLIENT_SECRET(click "View Secret")
- Client ID β
- Go to Settings > Applications > Details
- Under "Allowed callback URLs," add:
https://yourdomain.com/api/auth/kinde/callback - Under "Allowed logout redirect URLs," add:
https://yourdomain.com
Environment Variables:
KINDE_CLIENT_IDKINDE_CLIENT_SECRETKINDE_ISSUER_URL(format:https://yourdomain.kinde.com)KINDE_SITE_URL(your production URL)KINDE_POST_LOGOUT_REDIRECT_URLKINDE_POST_LOGIN_REDIRECT_URLSITE_URL(your production URL, e.g.,https://danadavis.dev)
3. GitHub Integration π
- Go to github.com/settings/tokens
- Click "Generate new token" β "Generate new token (classic)"
- Name it "Blog API" and set expiration (90 days recommended)
- Check these scopes:
repo(full control of private repositories)read:user(read user profile data)
- Click "Generate token" and copy it immediately (it won't show again)
Environment Variable: GITHUB_API_TOKEN
4. Music Integration π΅
- Go to developer.spotify.com/dashboard
- Log in with or create a Spotify account
- Click "Create App" and accept the Developer Terms
- Fill in the form:
- App Name: "My Blog"
- App Description: "Displays currently playing track"
- Copy the credentials:
- Client ID β
SPOTIFY_CLIENT_ID - Client Secret β
SPOTIFY_CLIENT_SECRET(click "Show Client Secret")
- Client ID β
- Click "Edit Settings" and add Redirect URI:
https://yourdomain.com/api/spotify/callback
To Get Refresh Token:
After deploying, visit your deployed app's authorization URL:
https://accounts.spotify.com/authorize?client_id=YOUR_CLIENT_ID&response_type=code&redirect_uri=https://yourdomain.com/api/spotify/callback&scope=user-read-currently-playing
This will redirect to your callback page with an authorization code. Use this to generate a refresh token (detailed instructions in the callback page).
Environment Variables:
SPOTIFY_CLIENT_IDSPOTIFY_CLIENT_SECRETSPOTIFY_REFRESH_TOKEN(obtain via authorization flow)
5. Analytics Setup π
- Go to umami.is and create an account
- Create a new website and enter your domain
- Copy the Tracking ID
Environment Variable: NEXT_UMAMI_ID
6. OpenAI API π€
- Go to platform.openai.com and sign in or create an account
- Navigate to API Keys in your account settings
- Click "Create new secret key"
- Name it "My Blog's - Captain's Log" and copy the key immediately (it won't show again)
- Note: You'll need to add credit to your OpenAI account to use the Whisper API for transcription
Environment Variable: OPENAI_API_KEY
7. Stripe (Optional - For Store Feature) π³
- Go to stripe.com and create an account
- Go to Developers > API Keys
- Copy your Secret Key (Test Mode) β
STRIPE_SECRET_KEY
Environment Variables:
STRIPE_SECRET_KEY
8. Deployment on Vercel βοΈ
- Go to vercel.com and sign in with GitHub
- Click "Add New" > "Project"
- Select your blog repository from GitHub
- Click "Import"
- Go to Settings > Environment Variables
- Add all the environment variables from above
- Click "Deploy"
That's it! Your blog is now live. π
# Database
DATABASE_URL=
# Admin Configuration
ADMIN_EMAIL=
# Kinde Authentication
KINDE_CLIENT_ID=
KINDE_CLIENT_SECRET=
KINDE_ISSUER_URL=
KINDE_SITE_URL=
KINDE_POST_LOGOUT_REDIRECT_URL=
KINDE_POST_LOGIN_REDIRECT_URL=
# Site Configuration
SITE_URL=
# GitHub
GITHUB_API_TOKEN=
# Spotify
SPOTIFY_CLIENT_ID=
SPOTIFY_CLIENT_SECRET=
SPOTIFY_REFRESH_TOKEN=
# Analytics
NEXT_UMAMI_ID=
# OpenAI
OPENAI_API_KEY=
# Stripe (Optional)
STRIPE_SECRET_KEY=Contributions, issues, and feature requests are super welcome! π»
Feel free to:
- Open an issue for bugs or suggestions
- Submit a pull request with improvements
- Share your thoughts in the discussions
Copyright Β© 2019-present | Dana's dev blog β stories, insights, and ideas.
Made with β€οΈ by Dana Davis

