- TypeScript 83.7%
- CSS 15.7%
- HTML 0.6%
| public | ||
| src | ||
| .gitignore | ||
| index.html | ||
| LICENSE | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.app.json | ||
| tsconfig.json | ||
| tsconfig.node.json | ||
| vite.config.ts | ||
Hire-Me!
Job application site, reachable at your-domain.tld/hire-me/{company-slug} — personalized per-company application pages. Desktop is the primary target; the layout is still usable on mobile.
React + TypeScript + Vite, no backend. Per-company slugs change the color palette, WebGL shader background and logo, each defined in its own config file, with a generic default config used when no/unknown slug is given.
Structure
src/
App.tsx # resolves the company slug, loads data, applies theme, lays out sections
hooks/useCompanySlug.ts # reads /hire-me/{slug} from the URL
components/ # Nav, Hero, Skills, Career, Projects, Footer, PasswordGate, ShaderCanvas
lib/shader.ts # WebGL shader engine (noise / particles background)
styles/ # "Organic" design-system tokens + component classes, app-specific layout/responsive rules
data/
resume.types.ts # shared types
resume.example.ts # COMMITTED placeholder content
resume.ts # GITIGNORED — your real résumé content
companies/
types.ts # CompanyConfig shape
default.ts # COMMITTED — ungated fallback config
example.ts # COMMITTED — demo config with a demo password, reachable at /hire-me/example
index.ts # COMMITTED — auto-discovers every *.ts file here at build time
<your-slug>.ts # GITIGNORED — real per-company configs you create locally
Local setup
Résumé content and per-company configs contain personal/identifying data and are gitignored — they're never pushed. Set them up locally:
cp src/data/resume.example.ts src/data/resume.ts
# edit src/data/resume.ts with your real content
cp src/companies/example.ts src/companies/<your-company-slug>.ts
# edit the copy: label, colors, shaderMode, logo, password
src/companies/index.ts picks up any *.ts file placed in that directory automatically (via import.meta.glob) — no need to register it anywhere else. The project won't build until src/data/resume.ts exists.
npm install
npm run dev # http://localhost:5173/hire-me/<your-slug>
npm run build # static output in dist/
Password gate
Each non-default company config may set a plaintext password. It's a client-side deterrent only, not real access control — the password and gated content both ship inside the built JS bundle and are visible via browser devtools. It just stops someone from casually opening a link that wasn't meant for them. default has no password and is always publicly reachable.
Deployment
This is a static build (dist/) with no server component. The host must rewrite /hire-me and /hire-me/* to serve index.html (client-side routing reads the slug from location.pathname). That rewrite is configured separately in your own server/reverse-proxy setup, not in this repo.