Skip to content
PerminovEugenePublic

About

Personal site

Resources

Stars

0 stars

Watchers

1 watching

Forks

Repository files navigation

Evgenii Perminov’s personal website

evgeniiperminov.dev is my personal website, portfolio, and living CV. It collects my professional experience, technology history, current learning, technical writing, and contact details in one place.

The site uses a terminal-inspired interface and is built as a Next.js App Router application.

What is on the site

  • Home (/) — a short introduction and links to the main sections.
  • Career — three CVs based on the same professional history:
  • Learning (/learning) — a searchable, filterable log of books, courses, articles, and videos that are queued, in progress, completed, or dropped.
  • Blog (/blog) — technical articles hosted on this site and links to multi-part series published elsewhere.
  • Contacts (/contacts) — direct contact links and a Formspree-backed message form.

The repository also publishes downloadable PDF versions of every CV, sitemap.xml, robots.txt, and llms.txt/llms-full.txt for machine-readable discovery.

Technology

  • Next.js 15 and React 19
  • TypeScript
  • Tailwind CSS 3
  • Puppeteer Core for CV PDF generation
  • Google Analytics with consent gating
  • Vercel Speed Insights

Run locally

Prerequisites

  • Node.js 22.12 or newer
  • npm

Google Chrome is only required when generating CV PDFs. The website itself does not require local environment variables.

Setup

npm ci
npm run dev

Open http://localhost:3000.

Commands

Command Purpose
npm run dev Start the local development server.
npm run build Create a production build.
npm run start Serve the production build.
npm run lint Run the project’s ESLint checks.
npm run cv:pdf Regenerate all downloadable CV PDFs.

There is currently no automated test suite; linting and a production build are the main project checks.

Project structure

.
├── public/
│   ├── files/cv/               # Generated, downloadable CV PDFs
│   ├── files/design/           # Photos and visual assets
│   ├── llms.txt                # Concise machine-readable profile
│   └── llms-full.txt           # Extended machine-readable profile
├── scripts/
│   └── generate-cv-pdfs.mjs  # CV-to-PDF generator
└── src/
    ├── app/                   # Pages, metadata, sitemap, and robots rules
    ├── components/
    │   ├── career/           # CVs and technology timeline
    │   ├── learning/         # Learning data, filters, and views
    │   ├── blog/             # Blog navigation
    │   ├── contacts/         # Contact form and transfer-status UI
    │   └── header/           # Multi-level site navigation
    └── routing/               # Shared route definitions

Updating content

Most content is stored as typed data close to the component that renders it:

  • Learning log: edit src/components/learning/learning.data.ts. Medium pages, navigation entries, and sitemap entries are derived from this configuration. See src/components/learning/SPEC.md for the data model and editing rules.
  • Blog: add locally hosted articles under src/app/blog/, register them in src/app/blog/articles.ts, and maintain externally hosted series in src/app/blog/series.ts.
  • CVs: the complete CV lives under src/components/career/cv/; the role-focused versions live under src/components/career/cv-v2/ and src/components/career/cv-v3/.
  • Routes and navigation: shared routes are in src/routing/routing.tsx, while the visible top-level navigation is configured in src/components/header/config.ts.
  • Search and crawler metadata: update src/app/metadata.ts, page-level metadata, src/app/sitemap.ts, and src/app/crawl-policy.ts when public content changes. Keep public/llms.txt and public/llms-full.txt current as well.

Regenerating CV PDFs

The web CVs are laid out as fixed-size sheets. The generator opens those same pages in headless Chrome so the downloadable files match the website.

After changing CV content or layout, run:

npm run cv:pdf

The generator reuses a server at http://localhost:3000 when one is available; otherwise, it starts and stops a development server for the run. It writes:

  • public/files/cv/CV_Evgenii_Perminov.pdf
  • public/files/cv/CV_Evgenii_Perminov_Full_Stack.pdf
  • public/files/cv/CV_Evgenii_Perminov_AI_Engineer.pdf

On macOS, the script uses the standard Google Chrome location. Elsewhere, or when Chrome is installed in a different location, provide its executable path:

CHROME_PATH="/path/to/chrome" npm run cv:pdf

To render from another running instance, set CV_PDF_BASE_URL:

CV_PDF_BASE_URL="http://localhost:3001" npm run cv:pdf

Review all three generated PDFs before committing them.

Deployment

The production site is deployed on Vercel. Any platform that supports a standard Next.js server can use npm run build followed by npm run start.

About

Personal site

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages