Infrastructure & Deployment PostgreSQL unavailable — Had to switch to SQLite mid-project because PG wasn't installed, requiring database config rewrite No SSH access — Password didn't work for SSH, so we had to use the OpenCode web interface to execute every command manually File transfer failures — 6 different file sharing services failed (temp.sh, transfer.sh, file.io, 0x0.st, catbox.moe, gofile.io) before tmpfiles.org worked Port conflicts — Python app (Pakistan IP Intelligence) took over port 5000, forced us to move eportal to port 5002 and update Caddy PM2 instability — Process list kept getting lost on daemon restart, had to repeatedly restart and resave Backend JWT secret missing — Deployed app.js was missing dotenv.config(), causing "secretOrPrivateKey must have a value" on login Frontend not served — app.js on VPS was missing Express static file serving and catch-all route for React pdf-lib crash — pdf-lib module caused MODULE_NOT_FOUND error when backend tried to start Frontend Wrong import paths — Button, Card, and Input components had ../lib/utils instead of ../../lib/utils Login navigation bug — After successful login, page stayed on login screen because navigate('/') was called before React state flushed; fixed with useEffect-based redirect Browser cache — Old JS/CSS files cached by browsers after deployments; fixed by building with new Vite content hashes Caddy & Networking 502 Bad Gateway — Caddy cached stale proxy connections after backend restarts TLS certificate delays — Let's Encrypt cert took time to provision, HTTPS was broken initially Dist deployment failed — First tarball extraction didn't properly replace old files
Infrastructure & Deployment PostgreSQL unavailable — Had to switch to SQLite mid-project because PG wasn't installed, requiring database config rewrite No SSH access — Password didn't work for SSH, so we had to use the OpenCode web interface to execute every command manually File transfer failures — 6 different file sharing services failed (temp.sh, transfer.sh, file.io, 0x0.st, catbox.moe, gofile.io) before tmpfiles.org worked Port conflicts — Python app (Pakistan IP Intelligence) took over port 5000, forced us to move eportal to port 5002 and update Caddy PM2 instability — Process list kept getting lost on daemon restart, had to repeatedly restart and resave Backend JWT secret missing — Deployed app.js was missing dotenv.config(), causing "secretOrPrivateKey must have a value" on login Frontend not served — app.js on VPS was missing Express static file serving and catch-all route for React pdf-lib crash — pdf-lib module caused MODULE_NOT_FOUND error when backend tried to start Frontend Wrong import paths — Button, Card, and Input components had ../lib/utils instead of ../../lib/utils Login navigation bug — After successful login, page stayed on login screen because navigate('/') was called before React state flushed; fixed with useEffect-based redirect Browser cache — Old JS/CSS files cached by browsers after deployments; fixed by building with new Vite content hashes Caddy & Networking 502 Bad Gateway — Caddy cached stale proxy connections after backend restarts TLS certificate delays — Let's Encrypt cert took time to provision, HTTPS was broken initially Dist deployment failed — First tarball extraction didn't properly replace old files
Full-Stack Development Building a complete PERN stack app from scratch (PostgreSQL/Express/React/Node) REST API design — auth, CRUD, file upload, verification endpoints JWT authentication with role-based access control (admin, signer, approver, viewer) Database modeling — relationships, associations, migrations via Sequelize File handling — multer uploads, SHA-256 hashing for integrity Frontend React + TypeScript — components, hooks, context API, routing State management — AuthContext, ToastContext patterns UI/UX design — dark theme with Tailwind CSS, glass-morphism, animations Responsive design — mobile sidebar, grid/list toggles, skeleton loading DevOps & Deployment VPS management — connecting, transferring files, diagnosing issues without SSH Reverse proxy — configuring Caddy with auto TLS (Let's Encrypt) Process management — PM2 for Node.js process persistence Port management — resolving port conflicts between multiple apps DNS configuration — wildcard domains, subdomain routing Problem-Solving Debugging login flow — state timing issues with React navigation Caching issues — browser cache busting with Vite content hashes Module errors — fixing import paths, missing dependencies Caddy troubleshooting — 502 errors, TLS delays, stale proxy connections Alternative approaches — falling back to SQLite, using web terminal when SSH failed Real-World Lessons Things break between dev and production Multiple deployment attempts often fail before one works Browser caching is a silent enemy Process managers need proper startup configuration Always check which port is already in use
uture Improvements — Summary Automate everything: Docker Compose for one-command deployment CI/CD pipeline (Git push → auto-deploy) Bash deploy script instead of manual tarballs Production hardening: Switch SQLite → PostgreSQL Add rate limiting, input validation (Zod/Joi), request logging Health check endpoint + uptime monitoring (Uptime Kuma) Code quality: Integration tests for critical flows Error tracking (Sentry) TypeScript strict mode + fix all types Resilience: Graceful shutdown handling Automated DB + upload backups Fail2ban for SSH security Runbook with restart/deploy commands
You demonstrated strong problem‑solving skills by overcoming many deployment hurdles and delivering a functional full‑stack app. To boost your score, automate environment setup (e.g., dotenv, DB migrations) and add basic tests and documentation so future deployments are smoother.
Log in to rate and review this project.
You demonstrated strong problem‑solving skills by overcoming many deployment hurdles and delivering a functional full‑stack app. To boost your score, automate environment setup (e.g., dotenv, DB migrations) and add basic tests and documentation so future deployments are smoother.