A modern, feature-rich personal portfolio website built with Spring Boot, showcasing professional experience and interactive applications.
- Professional Experience Display with dynamic year counter
- Responsive Design using Bootstrap 5
- Dark/Light Mode toggle for better user experience
- Interactive Bible Verse display with caching
- Dad Jokes Player with audio integration
- ๐ Foosball Management System - Complete table soccer game tracking
- ๐ฏ Dave Ramsey FPU Trivia - AI-powered Financial Peace University trivia with real-time multiplayer
- ๐ Statistics Dashboard - Player and team performance analytics
- ๐ CSRF Protection for secure form submissions
- ๐ Environment Configuration with AWS Cognito integration
- โก Caching with Caffeine for optimized performance
- ๐ Retry Logic for external API calls
- ๐ฑ Progressive Web App features
- Java 25+
- Maven 3.6+
- PostgreSQL 16+ (for local development)
- Docker (for running PostgreSQL locally)
- AWS Cognito setup (for authentication features)
- AWS Bedrock access (for AI-powered trivia questions)
-
Clone the repository
git clone https://github.com/SnapPetal/PersonalWeb.git cd PersonalWeb -
Set up environment variables
cp .env.example .env # Edit .env with your actual Cognito credentials -
Run the application
mvn spring-boot:run
- Spring Boot 3.5.6 - Core framework
- Spring Security - Authentication & CSRF protection
- Spring Cloud OpenFeign - HTTP client for microservices
- Spring WebSocket - Real-time communication for trivia
- Spring AI with AWS Bedrock - AI-powered question generation
- PostgreSQL 16 - Relational database
- Liquibase - Database migration and version control
- Caffeine Cache - In-memory caching solution
- Thymeleaf - Server-side template engine
- Bootstrap 5.3.8 - Responsive UI framework
- HTMX 2.0.7 - Dynamic HTML interactions
- Bootstrap Icons - Icon library
- SockJS & STOMP - WebSocket communication
- Vanilla JavaScript - Custom interactions
- AWS Cognito - OAuth2/OpenID authentication
- External APIs - Bible verse and dad jokes integration
- Spring Modulith - Modular monolith architecture with enforced boundaries
This project follows a modular monolith architecture using Spring Modulith:
src/
โโโ main/
โ โโโ java/biz/thonbecker/personal/
โ โ โโโ foosball/ # Foosball Module
โ โ โ โโโ api/ # Public facade interfaces
โ โ โ โโโ domain/ # Domain models (Game, Player, Stats)
โ โ โ โโโ infrastructure/ # Implementation, persistence, web
โ โ โโโ trivia/ # Trivia Module
โ โ โ โโโ api/ # Public facade interfaces
โ โ โ โโโ domain/ # Domain models (Quiz, Question)
โ โ โ โโโ infrastructure/ # Implementation, persistence, web
โ โ โโโ shared/ # Shared infrastructure
โ โ โโโ configuration/ # Spring configuration
โ โ โโโ PersonalWebApplication.java
โ โโโ resources/
โ โ โโโ templates/ # Thymeleaf HTML templates
โ โ โโโ static/ # CSS, JS, images
โ โ โโโ db/changelog/ # Liquibase migrations
โ โ โโโ application.yml # Configuration
โโโ test/
โโโ java/ # Unit tests
โโโ modulith/ # Module structure tests
See Spring Modulith Documentation for detailed module architecture.
The application implements Cross-Site Request Forgery protection using Spring Security with token-based validation for all POST requests.
Configure your development environment with AWS Cognito integration using environment variables. See .env.example for required settings.
A complete table soccer game tracking system integrated as a Spring Modulith module:
- Player Management - Create and track players with email validation
- Game Recording - Record match results with team positions and scores
- Statistics & Analytics - Comprehensive player and team performance metrics
- Win/loss records and percentages
- Head-to-head team statistics
- Player rankings by various criteria
- Game history and trends
- Tournament System - Single-elimination tournament bracket generation
- Database Persistence - PostgreSQL with Liquibase migrations
- HTMX Integration - Dynamic UI updates without page reloads
- Module Architecture - Hexagonal architecture with public facades and encapsulated implementation
Module: biz.thonbecker.personal.foosball
Public API: FoosballFacade interface
- AI-Powered Questions - Spring AI with AWS Bedrock generates Dave Ramsey Financial Peace University questions
- WebSocket Integration - Real-time multiplayer gameplay using STOMP protocol
- Difficulty Levels - Easy, Medium, and Hard question difficulty
- Fallback Questions - 20 pre-configured FPU questions when AI is unavailable
- Scoring System - Live leaderboard updates and winner determination
- Database Persistence - PostgreSQL stores quiz results and player statistics
- Event Logging - Comprehensive game session tracking
- Daily Verses - Cached daily verse retrieval
- KJV Translation - King James Version integration
- Retry Logic - Fault-tolerant API calls
- Responsive Display - Mobile-optimized presentation
- CSRF Token Protection - All POST requests secured
- OAuth2 Integration - AWS Cognito authentication
- Secure Headers - Spring Security configuration
- Environment Isolation - Separate dev/prod configs
GET /api/experience/count- Professional experience counterGET /api/bible/verse-of-day- Daily bible verseGET /api/joke- Dad joke with audio
REST Endpoints:
GET /api/foosball/players- Retrieve all playersGET /api/foosball/stats/players- Player statistics and rankingsGET /api/foosball/stats/teams- Team performance statisticsGET /api/foosball/games- Retrieve recent gamesPOST /api/foosball/players- Create new playerPOST /api/foosball/games- Record new game
HTMX Endpoints:
GET /foosball/htmx/games- Game list partialPOST /foosball/htmx/games- Record game with HTMX responseGET /foosball/htmx/stats/players- Player stats partialGET /foosball/htmx/stats/teams- Team stats partial
Tournament Endpoints:
GET /api/tournaments- List all tournamentsPOST /api/tournaments- Create new tournamentPOST /api/tournaments/{id}/register- Register player for tournamentPOST /api/tournaments/{id}/start- Start tournament and generate bracketPOST /api/tournaments/matches/{matchId}/result- Record match result
# Run all tests
./mvnw test
# Run with coverage
./mvnw test jacoco:report
# Run integration tests
./mvnw verify./mvnw spring-boot:run -Dspring-boot.run.profiles=dev# Build
./mvnw clean package -Pproduction
# Run
java -jar target/personal-0.0.1-SNAPSHOT.jar --spring.profiles.active=prodFROM openjdk:21-jre-slim
COPY target/personal-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is proprietary and confidential. All rights are reserved by Thon Becker. See the LICENSE file for details.
- GitHub: SnapPetal
- LinkedIn: Thon Becker
- Mobile App - React Native companion app
- Analytics Dashboard - Usage statistics and insights
- Blog System - Technical writing platform
- Portfolio Expansion - Additional interactive demos
- Performance Monitoring - APM integration
- CI/CD Pipeline - Automated deployment workflow
Built with โค๏ธ by Thon Becker | ยฉ 2025 All Rights Reserved