A production-ready personal portfolio built with Laravel. It features SEO-optimized public pages, an admin area to manage content, and visitor analytics.
Visit Here: jayxcoder.duckdns.org
- Public pages: Home, About, Skills, Projects, Portfolio, Experience, Contact
- Individual portfolio items by slug (
/portfolio/{slug}) - Contact form submission with admin review workflow
- Admin authentication, profile management, and role-based access
- Portfolio and Work Experience CRUD (publish, feature, sort order)
- Visitor analytics API and admin dashboards (unique visitors, page views, devices, browsers, countries)
- Agentic RAG chat grounded in portfolio, skills, achievements, experience, and LinkedIn posts
- Local Ollama inference with separate qwen chat/reasoning and embedding models
- Admin knowledge console for health, reindexing, LinkedIn OAuth sync, and LinkedIn export import
- SEO: sitemap, robots, Open Graph, Twitter cards, structured data slots
- Asset pipeline via Vite; modern, responsive Bootstrap 5 UI
- Secure route grouping for admin with HTTPS enforcement
- Laravel 10/11 (PHP 8.2+)
- MySQL or MariaDB (any SQL DB supported by Laravel)
- Redis (optional) for cache/queue
- Bootstrap 5, Font Awesome, Google Fonts
- Vite for asset bundling
- Docker and Docker Compose (optional)
- Ollama with
qwen3.5:2bandqwen3-embedding:0.6b
app/Http/Controllers— Public and admin controllersapp/Models— Eloquent models:Portfolio,WorkExperience,Contact,Visitor,Userresources/views— Blade views;layouts/app.blade.phpis the main layoutroutes/web.php— Public/admin routes, SEO routes, file-serving helperspublic/— Public assets,robots.txt,sitemap*.xmlstorage/— Uploaded images and framework storage
- PHP 8.2+
- Composer
- Node 18+ and npm (for Vite dev/build)
- MySQL/MariaDB running locally
- Copy environment file and set credentials:
cp .env.example .env
php artisan key:generate-
Configure DB in
.env(DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD). -
Install dependencies:
composer install
npm install- Run migrations and optionally seed:
php artisan migrate
# php artisan db:seed- Link storage and start servers:
php artisan storage:link
php artisan serve
npm run devVisit http://127.0.0.1:8000.
The stack (docker-compose.yml, Dockerfile) is at the repository root.
See PORTAINER.md for deploying via Portainer → Stacks → Git repository with your .env.
Quick local test:
cp .env.example .env
# Set APP_KEY, DB_PASSWORD, OLLAMA_HOST, etc.
docker compose up -d --buildOpen http://localhost:8080 (or APP_PORT).
- Shell into PHP container:
docker compose exec app sh - Run artisan:
docker compose exec app php artisan <cmd> - Assets are built inside the image (
npm run buildat build time)
- Visit
/admin/login - Set in
.env(Docker/Portainer environment variables):
ADMIN_NAME=Admin
ADMIN_EMAIL=you@example.com
ADMIN_PASSWORD=your-strong-password-hereOn container start, admin:sync creates or updates that user. After changing ADMIN_PASSWORD, restart the app container.
Manual sync:
php artisan admin:sync
# Docker: docker compose exec app php artisan admin:syncYou can still change name/email/password later in Admin → Profile (/admin/profile).
GET /sitemap.xmlandGET /robots.txtare generated by routes- Set
APP_URLin.envcorrectly for canonical links
Key variables you may need:
APP_NAME,APP_ENV,APP_KEY,APP_URLDB_*— database configurationSESSION_DRIVER,CACHE_DRIVER,QUEUE_CONNECTIONLOG_CHANNEL,LOG_LEVELOLLAMA_HOST,OLLAMA_MODEL,OLLAMA_EMBEDDING_MODELRAG_ENABLED,RAG_TOP_K,RAG_MIN_SEMANTIC_SCORELINKEDIN_CLIENT_ID,LINKEDIN_CLIENT_SECRET,LINKEDIN_REDIRECT_URI(optional)
See docs/RAG.md for indexing, LinkedIn ingestion, verification, and operations.
php artisan test- Ensure
APP_ENV=productionandAPP_DEBUG=false - Run
php artisan config:cache route:cache view:cache - Serve the
public/directory via your web server - Configure HTTPS termination and set
APP_URLtohttps://...
This project is licensed under the Eclipse Public License v2.0 (EPL-2.0).
- Open Source: Free to use, modify, and distribute
- Commercial Use: Allowed for commercial purposes
- Copyleft: Derivative works must also be distributed under EPL-2.0
- Patent Protection: Includes patent grants and protections
- Source Code: Must be made available when distributing
See LICENSE.txt for the complete license terms.
You are free to:
- ✅ Use this software for any purpose
- ✅ Modify and create derivative works
- ✅ Distribute copies (with source code)
- ✅ Use in commercial products
You must:
- 📋 Include the license text with distributions
- 📋 Make source code available when distributing
- 📋 License derivative works under EPL-2.0