Personal portfolio website for Jerome Villaruel (VeoScript), featuring career experience, selected projects, technology stack, contact links, and the Pandan POS promotion.
- Next.js 16.3.8 with the App Router and Turbopack
- React 19.3 and TypeScript
- Tailwind CSS 3.4
next-themesfor light/dark mode, with persisted green, purple, orange, and blue accent choices- Headless UI, Framer Motion, and Sonner for accessible UI, animation, and notifications
next/imageand Sharp for image delivery- ESLint 9 with
eslint-config-next; pnpm for package management
The UI uses the Raleway font through next/font/google.
- Node.js 22.15.0 (see
.nvmrc; Next.js 16 requires Node.js 20.9 or newer) - pnpm 10.10.0 (see the
packageManagerfield inpackage.json)
Install dependencies and create a local environment file:
pnpm install
cp .env.example .envSet the environment variables in .env:
| Variable | Purpose |
|---|---|
DEV_URL |
Absolute local URL used as the metadata base in development, for example http://localhost:3000. |
PROD_URL |
Absolute deployed site URL used as the metadata base outside development. |
PROMOTION_FLAG |
Set to true to show the Pandan POS promotion; otherwise leave it unset or set it to false. |
Both URL values should include the protocol (http:// or https://). Keep .env local and do not commit secrets.
pnpm dev # Start the development server at http://localhost:3000
pnpm lint # Run ESLint
pnpm exec tsc --noEmit # Run the TypeScript check
pnpm build # Create a production build
pnpm start # Serve the production buildRun pnpm build before pnpm start.
src/
app/ App Router layout, home page, and API routes
components/ Navigation, profile, appearance controls, social links, and promotion flag
constants/ Experience, project, service, social, and stack data
hooks/ Theme and media-query hooks
layouts/ Page composition and homepage sections
styles/ Global Tailwind styles and theme tokens
utils/ Icons and shared helpers
public/
files/ Resume and Pandan POS version data
images/ Portfolio, project, experience, and promotion media
The homepage composition is in src/app/page.tsx. Update portfolio content in src/constants/ and add or replace static media under public/.
The navigation controls let visitors choose a green, purple, orange, or blue accent and switch between light and dark mode. The accent and mode are saved in browser storage; the initial mode follows the operating system until the visitor chooses one.
GET /api/pandan-pos returns the JSON version data stored in public/files/pandan_app_version.json.
Set PROD_URL to the deployed site’s absolute URL, then run pnpm build. Deploy the generated Next.js application using a Node.js host compatible with Next.js 16.3.8.