Skip to content

Come say hi

Drop me a line

lhernandez025cz@gmail.com

Career & updates

Where the code lives

Credits

Type
Instrument Serif · Geist
Motion
GSAP · Lenis
Stack
Next.js 16 · TypeScript
Source on GitHub
LittlePitza/portfolio
Back to work

05/09 · Corporate website

PIMSA Web

Public website of an engineering-plastics recycler, with the panel that runs it: Marketing works the leads and the stock catalogue, HR runs a job board that takes CVs, and neither area sees the other's data.

Public, in production
Role
Sole authorArt directionTechnical SEO
Stack
Next.js 16Drizzle ORMMySQLTailwind v4Zod v4JSON-LD
Launch
2026
Status
Public, in production
  • 8

    schema.org types

  • 3

    panel roles

  • 8

    MySQL tables

  • 0

    animation libraries

About the project

The role is read from the database on every request rather than carried in the session token, so moving someone to another area takes effect at once. The same lookup ends a deleted account's sessions, and a password-version claim in the token ends them when a password is reset. Guards run in every page, every server action and the CV download route; a hidden link is only cosmetic.

A lead or an application is stored before anything is emailed, so a failed SMTP call never loses one. Recipients and the sending account are changed from the panel without a redeploy, and the SMTP password is kept encrypted with AES-256-GCM. Every attempt, test sends included, lands in a delivery log as sent, failed or skipped, and the last two record why.

A vacancy keeps its place, pay and closing date as separate fields instead of free text, with schema.org values for the job type and pay period, so one record feeds its page, the JobPosting data Google reads and an Indeed-format XML feed for the job boards. Across the site, eight schema.org types describe the company, its services, its FAQs and its openings.

Built to replace the company's WordPress site, it renders on the server by default and needs no animation library. The ORM stays out of client bundles, and photographs promoted from the camera originals go through a script built on sharp that bakes in the EXIF rotation, caps the long edge at 2000 px and strips GPS data. It runs as a Node app on Hostinger over MySQL, deployed from main.