A modern, responsive portfolio website built with Laravel, Vue.js, and TailwindCSS, showcasing professional software engineering projects and experience.
- π Live Site
- π οΈ Tech Stack
- β¨ Features
- ποΈ Project Structure
- π Getting Started
- π§ͺ Testing
- π¨ Customization
- π§ Development
- π± Responsive Design
- π Deployment
- π License
- π¨βπ» Author
- π Acknowledgments
View Live Site | Screenshot Source
- Laravel 12 - PHP framework
- Inertia.js 2.0 - Modern monolith approach with SPA routing
- SQLite - Database (can be configured for MySQL/PostgreSQL)
- PHP 8.3+ - Runtime (8.4 recommended)
- Laravel Wayfinder - Form handling and route utilities
- Sentry - Error tracking and performance monitoring
- Mailgun - Email delivery service
- Vue.js 3.5.13 - Progressive JavaScript framework with Composition API
- TypeScript 5.2.2 - Type safety throughout
- Tailwind CSS 4.1.1 - Utility-first CSS framework
- Vite 7.0.4 - Next-generation build tool
- Pinia 3.0.3 - State management
- Inertia.js Vue 3 - Server-driven SPA framework
- FontAwesome - Icon library
- vue3-simple-icons - Simple Icons integration
- Inertia SSR - Server-side rendering support for improved SEO and initial load performance
- Configurable via
composer dev:ssrcommand
- ESLint 9.17.0 - Code linting with Vue and TypeScript support
- Prettier 3.4.2 - Code formatting with Tailwind plugin
- PEST 4.1 - Modern PHP testing framework
- Laravel Pint - PHP code style fixer
- Laravel Pail - Real-time log viewer
- GitHub Actions - CI/CD pipelines for testing and linting
- Stylelint - CSS linting
- Single Page Application (SPA) - Built with Inertia.js for seamless navigation without full page reloads
- Server-Side Rendering (SSR) - Optional SSR support for improved SEO and faster initial page loads
- Responsive Design - Mobile-first approach with breakpoints optimized for all devices
- Modern UI/UX - Clean, professional interface with smooth animations and transitions
- Project Showcase - Interactive project gallery with detailed modal views
- Project Modals - Detailed project information with images, descriptions, technologies, and key takeaways
- Image Modal System - Lightbox-style image viewing for project images
- Contact Form - Functional contact form with Mailgun email delivery integration
- Contact Modal - Modal-based contact form accessible from navigation
- Skills API - RESTful API endpoint for fetching skills categorized by type (Software Engineering, DevOps, Quality, Leadership)
- Dynamic Skills Display - Database-backed skills with grouped categorization
- Smooth Scrolling - Section-based navigation with smooth scroll behavior
- URL-based Section Navigation - Direct links to specific sections (about, projects, contact)
- Animated Background - Dynamic starfield background with animated stars and gradients
- Scrolling "Things I Like" - Infinite scrolling showcase of favorite tools and technologies
- Hover Effects - Interactive hover states on projects and cards
- Custom Fonts - Space Mono and Sixtyfour fonts for unique typography
- Custom Color Theme - Terminal-inspired color palette with custom CSS variables
- Type Safety - Full TypeScript support throughout the frontend
- Type Definitions - Comprehensive TypeScript types for all data structures
- Vue 3 Composition API - Modern Vue.js development with Composition API
- Composables - Reusable Vue composables (useModal, useScrollToSection, useEscapeKey)
- State Management - Pinia store for global state management
- Performance Optimized - Fast loading times with code splitting and lazy loading
- Error Tracking - Sentry integration for error monitoring and performance tracking
- SEO Ready - Meta tags and structured data support
- Accessibility - ARIA labels and semantic HTML
βββ app/ # Laravel application
β βββ Http/
β β βββ Controllers/ # Application controllers
β β β βββ Api/ # API controllers (SkillController)
β β β βββ ContactController.php
β β βββ Middleware/ # HTTP middleware
β βββ Mail/ # Mail classes (ContactFormMail)
β βββ Models/ # Eloquent models (Skill, SkillType, User)
β βββ Providers/ # Service providers
βββ config/ # Configuration files
β βββ inertia.php # Inertia.js configuration
β βββ mail.php # Mail configuration
β βββ sentry.php # Sentry error tracking config
βββ database/
β βββ factories/ # Model factories
β βββ migrations/ # Database migrations
β βββ seeders/ # Database seeders (SkillTypeSeeder)
β βββ database.sqlite # SQLite database file
βββ public/ # Publicly accessible files
β βββ build/ # Compiled assets
β βββ images/ # Static images (projects, icons, profile)
β βββ favicons/ # Favicon files
βββ resources/
β βββ js/
β β βββ actions/ # Action utilities
β β βββ components/ # Reusable Vue components
β β β βββ modals/ # Modal components (Contact, Project, Image)
β β β βββ BackgroundStars.vue
β β β βββ ScrollingThingsILike.vue
β β β βββ ToggleSwitch.vue
β β βββ composables/ # Vue 3 composables
β β β βββ useEscapeKey.ts
β β β βββ useModal.ts
β β β βββ useScrollToSection.ts
β β βββ data/ # Static data files (projects.json)
β β βββ layout/ # Layout components (Header, Footer, Nav)
β β βββ pages/ # Inertia page components (SPA.vue)
β β βββ sections/ # Page sections (AboutSection, ProjectsSection)
β β βββ stores/ # Pinia stores
β β βββ types/ # TypeScript type definitions
β β βββ wayfinder/ # Wayfinder route utilities
β β βββ app.ts # Main application entry point
β β βββ ssr.ts # SSR entry point
β βββ css/
β β βββ app.css # Main stylesheet with Tailwind
β β βββ background-stars.css # Starfield animation styles
β β βββ modal.css # Modal component styles
β βββ views/
β βββ app.blade.php # Main Inertia layout
β βββ emails/ # Email templates
βββ routes/
β βββ api.php # API routes (skills, contact)
β βββ web.php # Web routes
β βββ console.php # Console commands
βββ storage/ # Storage directory
βββ tests/ # Test suites
β βββ Feature/ # Feature tests
β βββ Unit/ # Unit tests (ContactController, SkillController)
βββ .github/workflows/ # GitHub Actions workflows
β βββ tests.yml # CI test workflow
β βββ lint.yml # Linting workflow
βββ .env.example # Environment variables example
βββ composer.json # PHP dependencies
βββ package.json # Node.js dependencies
βββ vite.config.ts # Vite configuration
βββ tailwind.config.ts # Tailwind CSS configuration
βββ tsconfig.json # TypeScript configuration
- PHP 8.3+ (8.4 recommended for CI/testing)
- Node.js 22+ (LTS recommended, matches CI configuration)
- Composer 2.5+
- SQLite (or your preferred database - MySQL/PostgreSQL supported)
- Mailgun account (for contact form functionality)
-
Clone the repository
git clone https://github.com/russellio/jonrussell.dev.git cd jonrussell.dev -
Install PHP dependencies
composer install --no-interaction --prefer-dist --optimize-autoloader
-
Install Node dependencies
npm ci
-
Environment configuration Copy the example environment file and generate an application key:
cp .env.example .env php artisan key:generate
Update the following environment variables in
.env:APP_ENV=local APP_DEBUG=true APP_URL=http://localhost:8000 DB_CONNECTION=sqlite DB_DATABASE=/absolute/path/to/database.sqlite # Mailgun Configuration (for contact form) MAIL_MAILER=mailgun MAILGUN_DOMAIN=your-domain.mailgun.org MAILGUN_SECRET=your-mailgun-secret MAILGUN_ENDPOINT=api.mailgun.net # Sentry Configuration (optional, for error tracking) SENTRY_LARAVEL_DSN=your-sentry-dsn SENTRY_TRACES_SAMPLE_RATE=1.0 # For production # APP_ENV=production # APP_DEBUG=false
-
SQLite Setup (Recommended for development)
touch database/database.sqlite php artisan migrate --seed
Or for MySQL/PostgreSQL:
# Create database and update .env with credentials # Then run migrations php artisan migrate --seed
Start the development servers:
Option 1: Separate terminals (recommended for debugging)
# Terminal 1: Start Laravel development server
php artisan serve
# Terminal 2: Start Vite dev server
npm run devOption 2: Combined development environment
# Start all services (Laravel, Vite, Queue, Logs) in one command
composer devOption 3: With Server-Side Rendering
# Build SSR bundle and start with SSR enabled
composer dev:ssrVisit http://localhost:8000 in your browser.
Run the test suite:
# PHP tests with PEST
./vendor/bin/pest
# Or use composer script
composer test
# Frontend linting
npm run lint
# Code formatting
npm run format
# PHP code style (Laravel Pint)
./vendor/bin/pint- Unit Tests: ContactController, SkillController
- Feature Tests: Example feature tests included
- CI/CD: Automated testing on push to
mainanddevelopbranches via GitHub Actions
The project uses Tailwind CSS 4 with custom theme configuration:
Custom Colors:
- Terminal-inspired palette with custom shades
- Primary (blue), Secondary (bulldog red), Gold, Bright Green
- Terminal black variants for UI elements
Custom Fonts:
- Space Mono - Monospace font for headings and code
- Sixtyfour - Display font for section titles
Configuration Files:
resources/css/app.css- Custom CSS variables and global stylestailwind.config.ts- Tailwind configuration with custom theme- Custom animations for infinite scrolling and starfield effects
NPM Scripts:
npm run dev # Start Vite development server
npm run build # Build for production
npm run build:ssr # Build with SSR support
npm run lint # Run ESLint and auto-fix issues
npm run format # Format code with Prettier
npm run format:check # Check code formatting without fixingComposer Scripts:
composer dev # Start full dev environment (server, queue, logs, vite)
composer dev:ssr # Start dev environment with SSR enabled
composer test # Run PHP test suiteArtisan Commands:
php artisan serve # Start Laravel development server
php artisan migrate # Run database migrations
php artisan migrate --seed # Run migrations with seeders
php artisan inertia:start-ssr # Start Inertia SSR server
php artisan pail # Start real-time log viewer- PHP: Follows PSR-12 standards, enforced with Laravel Pint
- JavaScript/TypeScript: ESLint 9 with Vue and TypeScript plugins + Prettier 3
- Vue.js: Vue 3 Composition API with
<script setup>syntax - CSS: Tailwind CSS utility classes with custom CSS variables
- Formatting: Automatic formatting on commit (Prettier for JS/TS, Pint for PHP)
The site is fully responsive with breakpoints:
- Mobile: < 768px
- Tablet: 768px - 1024px
- Desktop: > 1024px
# Build frontend assets
npm run build
# For SSR-enabled deployment
npm run build:ssr
# Optimize Laravel
php artisan config:cache
php artisan route:cache
php artisan view:cache# Standard deployment
npm run build
php artisan deploy
# With SSR support
npm run build:ssr
php artisan inertia:start-ssrEnsure these are set in production:
APP_ENV=productionAPP_DEBUG=falseMAILGUN_DOMAINandMAILGUN_SECRET(for contact form)SENTRY_LARAVEL_DSN(optional, for error tracking)- Database credentials
docker build -t jonrussell.dev .
docker run -p 8000:8000 jonrussell.devThis project is open source and available under the MIT License.
Jon Russell - Senior Software Engineer
- Portfolio: jonrussell.dev
- LinkedIn: linkedin.com/in/russell-jonathan
- GitHub: @russellio
- Night Sky by jo_Geek - Inspiration for animated starfield background
- Laravel - The PHP framework for building robust applications
- Vue.js - The progressive JavaScript framework
- Inertia.js - Modern monolith approach for SPAs
- Tailwind CSS - Utility-first CSS framework
- Sentry - Error tracking and performance monitoring
- FontAwesome - Icon library
- Simple Icons - Brand icons via vue3-simple-icons
π« Contact: jonrussell.dev/contact Β | Β π Visit my portfolio: jonrussell.dev
β Star this repository if you found it helpful! β
- laravel/framework: ^12.0
- inertiajs/inertia-laravel: ^2.0
- laravel/wayfinder: ^0.1.11
- sentry/sentry-laravel: ^4.18
- symfony/mailgun-mailer: ^7.3
- symfony/http-client: ^7.3
- vue: ^3.5.13
- @inertiajs/vue3: ^2.0.0
- typescript: ^5.2.2
- tailwindcss: ^4.1.1
- @tailwindcss/vite: ^4.1.11
- vite: ^7.0.4
- pinia: ^3.0.3
- @sentry/vue: ^10.22.0
- @fortawesome/vue-fontawesome: ^3.1.2
- vue3-simple-icons: ^15.6.0
- pestphp/pest: ^4.1
- laravel/pint: ^1.18
- laravel/pail: ^1.2.2
- eslint: ^9.17.0
- prettier: ^3.4.2
- vue-tsc: ^2.2.4
