Live demo: https://homedesignerdemo.exoa.dev/
A web portal for browsing, previewing, and managing 3D home design projects. Built with Laravel 12, Inertia.js, and React, it lets users explore a gallery of design projects with interactive 3D model previews powered by Three.js.
- Public gallery — browse all design projects with cover images and filter by type (Templates / User Files)
- 3D model preview — view GLB models directly in the browser via Three.js
- Admin panel — authenticated CRUD interface to create, edit, and delete projects
- File management — attach a GLB model, a JSON config file, and a cover image per project
- Authentication — login/register via Laravel Breeze (Sanctum-backed)
| Layer | Technology |
|---|---|
| Backend | PHP 8.2+, Laravel 12 |
| Frontend | React 18, Inertia.js v2, Tailwind CSS v3 |
| 3D rendering | Three.js |
| Database | SQLite (default) |
| Build tool | Vite 7 |
- PHP 8.2+
- Composer
- Node.js 18+ and npm
# 1. Clone the repository
git clone <repo-url>
cd HomeDesignerWebPortal
# 2. Install PHP dependencies
composer install
# 3. Set up the environment file
cp .env.example .env
php artisan key:generate
# 4. Create the SQLite database and run migrations
touch database/database.sqlite
php artisan migrate
# 5. Create the storage symlink (for public file access)
php artisan storage:link
# 6. Install JS dependencies
npm installAlternatively, steps 2–6 can be run in one shot with:
composer setupThe following command starts all four development processes concurrently (PHP server, queue worker, log viewer, and Vite):
composer devThe app will be available at http://localhost:8000.
To build assets for production instead:
npm run build
php artisan serveThere is no seeded admin account. Create one via Tinker or the registration page, then use the /admin route once logged in:
php artisan tinker
> App\Models\User::create(['name'=>'Admin','email'=>'admin@example.com','password'=>bcrypt('password')]);These steps assume a Linux server (Ubuntu/Debian) with PHP 8.2+, Composer, Node.js, and Nginx already installed, and the code deployed to /var/www/HomeDesignerWebPortal.
cd /var/www/HomeDesignerWebPortal
composer install --no-dev --optimize-autoloader
npm install
npm run buildcp .env.example .env
php artisan key:generateEdit .env for production:
APP_ENV=production
APP_DEBUG=false
APP_URL=https://your-domain.com
DB_CONNECTION=sqlite
# or mysql/pgsql — set DB_HOST, DB_DATABASE, DB_USERNAME, DB_PASSWORD
SESSION_DRIVER=database
CACHE_STORE=database
QUEUE_CONNECTION=database# If using SQLite
touch database/database.sqlite
php artisan migrate --force
php artisan storage:linkThe web server user (www-data on most distros) needs write access to storage and bootstrap/cache:
sudo chown -R www-data:www-data /var/www/HomeDesignerWebPortal
sudo find /var/www/HomeDesignerWebPortal/storage -type d -exec chmod 775 {} \;
sudo find /var/www/HomeDesignerWebPortal/bootstrap/cache -type d -exec chmod 775 {} \;php artisan config:cache
php artisan route:cache
php artisan view:cacheRe-run these three commands after every deploy or .env change.
The app uses the database queue driver, so a persistent worker process is required. Create /etc/supervisor/conf.d/homedesigner-worker.conf:
[program:homedesigner-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/HomeDesignerWebPortal/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/HomeDesignerWebPortal/storage/logs/worker.log
stopwaitsecs=3600Then reload Supervisor:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start homedesigner-worker:*Create /etc/nginx/sites-available/homedesigner:
server {
listen 80;
server_name your-domain.com;
root /var/www/HomeDesignerWebPortal/public;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-Content-Type-Options "nosniff";
index index.php;
charset utf-8;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }
error_page 404 /index.php;
location ~ \.php$ {
fastcgi_pass unix:/run/php/php8.2-fpm.sock;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.(?!well-known).* {
deny all;
}
}Enable the site and reload Nginx:
sudo ln -s /etc/nginx/sites-available/homedesigner /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxAdjust the fastcgi_pass socket path to match your installed PHP-FPM version (check with php -v and ls /run/php/).
Use Certbot to obtain and auto-renew a free TLS certificate for the Nginx server block:
sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d your-domain.comgit pull
composer install --no-dev --optimize-autoloader
npm install && npm run build
php artisan migrate --force
php artisan config:cache
php artisan route:cache
php artisan view:cache
sudo supervisorctl restart homedesigner-worker:*app/Http/Controllers/ProjectController.php — project CRUD logic
resources/js/Pages/Home.jsx — public gallery page
resources/js/Pages/Admin.jsx — admin management panel
resources/js/Components/ProjectPreviewModal — Three.js 3D viewer modal
routes/web.php — application routes
database/migrations/ — database schema
composer test