Advertise yourself to the unforgiving job market!
  • TypeScript 83.7%
  • CSS 15.7%
  • HTML 0.6%
Find a file
2026-10-10 04:50:26 +02:00
public feat: replace default Vite favicon with simple ring icon 2026-07-31 19:41:35 +02:00
src refactor: unneeded example file 2026-10-10 04:50:26 +02:00
.gitignore refactor: missing file ending 2026-10-10 04:25:35 +02:00
index.html feat: add dark mode theming with a nav toggle 2026-08-08 02:27:37 +02:00
LICENSE docs: add MIT license 2026-07-31 20:57:28 +02:00
package-lock.json refactor: replace hand-copied SVG icons with lucide-react 2026-07-31 14:35:40 +02:00
package.json docs: add MIT license 2026-07-31 20:57:28 +02:00
README.md docs: rename project title to Hire-Me! in README 2026-07-31 20:58:13 +02:00
tsconfig.app.json feat: rebuild site as React + TypeScript + Vite 2026-07-31 13:57:55 +02:00
tsconfig.json feat: rebuild site as React + TypeScript + Vite 2026-07-31 13:57:55 +02:00
tsconfig.node.json feat: rebuild site as React + TypeScript + Vite 2026-07-31 13:57:55 +02:00
vite.config.ts feat: wire up to nginx 2026-07-31 18:26:37 +02:00

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.