Next.jsReactPortfolio

dev-portfolio-template — Next.js Portfolio Template

By Inter1ark

A portfolio website template for developers or small studios, built on Next.js 15 App Router, with case pages, form handling, SEO landing pages, and WebGL/GSAP visual effects.

Explore the design

Compare the page layouts and mobile experience. Open any screenshot for a closer look.

3 previews
Desktop homepage1 / 3
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 3

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-14View source

What stands out

A quick read of the recorded project description.

01

Next.js 15 App Router + TypeScript + Tailwind CSS 4, with dark and light theme support

02

Forms are written to disk before delivery, with three channels: Telegram, ntfy.sh, and Resend email

03

Service landing pages and blog posts are generated from typed data in lib/seo/, including structured data and a sitemap

04

WebGL fluid cursor, 3D icons generated by a Blender script, GSAP ScrollTrigger parallax

05

Built-in /privacy and /consent personal data document drafts, with a separate consent checkbox on the form

06

Provides an output: 'standalone' build and deployment scripts based on SSH and systemd

Template Details

This is a developer portfolio template extracted from a live website. The interface is in Russian, and all copy is placeholder content that must be replaced with your own information. The stack includes Next.js 15 App Router, TypeScript, Tailwind CSS 4, Motion, GSAP, Lenis, and three.js, with dark and light theme support.

The page structure includes a homepage (hero, work, approach, services, tech stack, process, testimonials, FAQ, contact), case pages at /work/<slug>, a services landing page directory at /uslugi and its subpages, a blog at /blog, privacy and consent documents at /privacy and /consent, and a token-protected /admin form list page that is excluded from search engine indexing.

Content is centralized in data files under the lib directory: site.ts manages the name, contact details, timezone, menu, and analytics counters; projects.ts and project-details.ts manage cases; content.ts manages homepage sections; the seo/ directory stores landing pages and blog posts grouped by category; legal.ts stores the operator information required for legal pages.

Form submissions are written to disk first, then delivery is attempted through three channels: Telegram, ntfy.sh, and Resend email, tried in order, with any one success being sufficient. Built-in protections include a hidden honeypot field, a limit of three submissions per address per ten minutes, field length limits, and HTML escaping.

Visual effects include a WebGL fluid cursor, 3D icons generated by a Blender script, GSAP ScrollTrigger parallax, and a cursor glow written to CSS variables. All are disabled when reduced motion is enabled; heavy effects additionally require a mouse, a width of 1024 pixels or more, four cores, and available WebGL.

The README does not provide performance data, browser compatibility ranges, or production stress test results.

Next.jsPortfolio

Is it right for your project?

Use Cases

  • Building a portfolio site with case showcases for an individual developer or small studio
  • A content-driven website that needs service landing pages and blog posts organized by search terms
  • A lead generation page where form submissions should not be lost if a notification channel fails
  • Projects that need a Russian interface and personal data document drafts related to 152-FZ

Suitable For

  • Developers familiar with Next.js and TypeScript who can replace the contents of the data files themselves
  • Individuals or small teams needing an integrated structure of case pages, service pages, and a blog
  • Deployers who can provide a Node 20+ server and configure nginx and systemd themselves

Getting started & customization

Use these recorded setup notes alongside the repository instructions for your chosen version.

  1. 1

    Requires Node 20 or higher; run npm install, optionally copy .env.example to .env.local, then npm run dev

  2. 2

    First edit lib/site.ts to fill in the name, contact details, and domain; this file also drives the header, footer, metadata, sitemap, and structured data

  3. 3

    Do not run npm run build while npm run dev is running; they share the .next directory and will overwrite each other. If this has happened, stop dev, delete .next, and restart

  4. 4

    Place case media in public/work/<slug>/; file names and dimensions must match the README table, and the actual frame count must be entered in the shots field of lib/projects.ts

  5. 5

    Deploy with npm run deploy, configured via .env.deploy; the README recommends not building on the server to avoid out-of-memory issues

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

This entry covers the free version under the MIT license in the public repository; the free scope is the code of this version and does not mean that external services or third-party assets are free.

Must comply with when using

  • You may use, modify, commercially use, and distribute the code of this version for free.
  • When distributing copies or substantial portions of the code, retain the original author's copyright notice and the full MIT license notice.
  • The code is provided as is; warranties and limitations of liability are governed by the original license and applicable law.

Additional costs & items to verify

  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; they cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments, or AI may incur additional charges.
  • The Telegram notification channel requires you to provide TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID; if the server cannot access api.telegram.org, you also need your own proxy specified via TELEGRAM_API_BASE.
  • The ntfy.sh channel requires you to set NTFY_TOPIC and subscribe to that topic in the ntfy app.
  • The email channel requires a Resend RESEND_API_KEY, as well as LEADS_EMAIL_TO and LEADS_EMAIL_FROM configuration.
  • Viewing the form list requires access via /admin?token=$ADMIN_TOKEN, and you must set ADMIN_TOKEN yourself.
  • Before publishing, you must fill in the operator information in lib/legal.ts; the values in parentheses are placeholders. These legal documents are only a starting point and need review by a lawyer.
  • Building on the server is not recommended: next build will fail due to out-of-memory on a VPS with 1GB of memory, so build locally and then deploy.
  • Licenses for third-party code within the template are listed in the NOTICE file, which must be retained when distributing.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

1. **Telegram**: задайте `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. Команда

Original README

2. **ntfy.sh**: задайте `NTFY_TOPIC` длинной случайной строкой и подпишитесь на

Original README

3. **Почта через Resend**: `RESEND_API_KEY`, `LEADS_EMAIL_TO` и

Original README

и открываются по адресу `/admin?token=$ADMIN_TOKEN`. На бою держите этот каталог

Original README

Перед публикацией заполните `lib/legal.ts`, значения в скобках это заглушки. Эти

Original README

Собирать на сервере намеренно не предлагается: на VPS с гигабайтом памяти

Original README

автора приветствуется, но не требуется. Лицензии стороннего кода в составе

Original README
https://github.com/Inter1ark/dev-portfolio-template/blob/main/LICENSEhttps://github.com/Inter1ark/dev-portfolio-template/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-14. Results only cover the materials read; dependencies, images, fonts, and subsequent term changes are subject to their respective original texts.

Project checks & description sources

Template Information

Source platforms
GitHub
Documentation and maintenance reference score
More documented · 83 / 100
Technologies
Next.js · React
Website type
Portfolio
How this score is calculated

Our heuristic uses license records (up to 30), a demo link (12), a preview (10), stars (15), recorded maintenance (15), description completeness (8), feature records (5) and classification data (5). It is not a code, security or performance test, or a Google score. A link does not establish tested functionality.

What to verify for this project

Repository update recorded
2026-09-11
Screenshot last checked
2026-10-14

A demo link is listed. Check it with your own content and viewport sizes; its presence does not confirm that forms, authentication or payments work.

The catalog identifies Next.js as the primary stack. Check the actual dependency manifest and lockfile for versions and hosting requirements. These notes use recorded metadata, not a code audit or a deployment test.

Use a selection guide →

How this description was prepared

AI-assisted description based on catalog records and repository material. Repository authors are not automatically the reviewers of this description.

Review declaration: codex-user-requested-batch-review-20261015 · 2026-10-15

Inspect the recorded source material

SHA-256: 70fc7ff2d4b6a067be3fabb08701ff5181301b59165aeab1ae649edf517c682e

2026-10-14T21:07:41.960Z

Source file / repository
# Шаблон портфолио разработчика

Готовый сайт-портфолио для разработчика или небольшой студии. Страницы кейсов,
форма заявки, которая не теряет обращения, система посадочных страниц под
поисковые запросы, документы по 152-ФЗ и три эффекта, из-за которых сайт
выглядит сделанным, а не собранным: жидкость под курсором на WebGL, объёмный
значок из Blender и параллакс на прокрутке.

Next.js 15 App Router, TypeScript, Tailwind CSS 4, Motion, GSAP, Lenis, three.js.
Тёмная и светлая темы. Интерфейс на русском, все строки лежат в нескольких
файлах данных.

> Это шаблон, снятый с работающего сайта. Личные данные, клиентские работы и
> счётчики аналитики убраны. Каждый текст, который вы увидите, это заглушка под
> ваш собственный.

## Быстрый старт

```bash
npm install
cp .env.example .env.local     # необязательно, форма работает и без него
npm run dev                    # http://localhost:3000
```

Нужен Node 20 или новее.

Дальше откройте `lib/site.ts` и впишите имя, контакты и домен. Из этого файла
собираются шапка, подвал, метаданные, карта сайта и микроразметка.

> Не запускайте `npm run build`, пока работает `npm run dev`. Оба пишут в `.next`
> и затирают друг друга, после чего сервер разработки начинает отдавать 500.
> Если так вышло: остановите dev, удалите `.next`, запустите заново.

## Что внутри

| Путь | Что это |
| --- | --- |
| `lib/site.ts` | Имя, контакты, часовой пояс, меню, счётчики аналитики |
| `lib/projects.ts` | Кейсы: тексты, стек, ссылки, число экранов |
| `lib/project-details.ts` | Подробности кейса и подписи к экранам |
| `lib/content.ts` | Услуги, стек, процесс, отзывы и вопросы на главной |
| `lib/seo/` | Посадочные страницы и статьи блога, по группам |
| `lib/legal.ts` | Данные оператора для юридических страниц |
| `app/api/lead/route.ts` | Приём заявки: проверка, лимит, запись, доставка |
| `app/globals.css` | Палитра, шкала шрифтов, анимации, стили эффектов |
| `components/ui/` | Свечение за курсором, поля, кнопка, параллакс, 3D-значок |
| `blender/code-mark.py` | Скрипт, который моделирует значок `</>` |
| `public/work/<slug>/` | Медиа одного кейса |

## Страницы

| Адрес | Назначение |
| --- | --- |
| `/` | Главная: первый экран, работы, подход, услуги, стек, процесс, отзывы, вопросы, контакты |
| `/work/<slug>` | Кейс с роликом, галереей и подписями |
| `/uslugi` | Каталог посадочных страниц по группам |
| `/uslugi/<slug>` | Отдельная страница под запрос |
| `/blog`, `/blog/<slug>` | Статьи |
| `/privacy`, `/consent` | Документы по персональным данным |
| `/admin?token=…` | Список заявок, закрыт от поисковиков |

## Медиа для кейсов

Каждый кейс берёт файлы из `public/work/<slug>/`. В шаблоне лежат три
демонстрационных проекта с заглушками, поэтому все раскладки работают сразу.
Замените их своими, сохранив имена:

| Файл | Размер | Где используется |
| --- | --- | --- |
| `01.jpg`, `02.jpg`, … | 1760 × 1100 | Галерея на странице кейса |
| `poster.jpg` | 880 × 550 | Карточки, сетка, параллакс, обложка ролика |
| `clip.mp4` | 1280 × 800, без звука | Видеоблок на странице кейса |
| `preview.mp4` | 640 × 400, без звука | Превью под курсором в списке работ |

Нумерация начинается с `01` и не должна прерываться. В `lib/projects.ts`
поставьте в поле `shots` число добавленных кадров: столько галерея и покажет.

Удобный способ их получить: снять медленную прокрутку живого сайта через
Playwright, затем нарезать кадры и собрать ролики в ffmpeg. Видео без звука,
`preview.mp4` грузится только при наведении, `clip.mp4` когда доходит до экрана.

## Форма заявки

Заявка пишется на диск **до** попытки доставки, поэтому обращение не теряется,
даже если канал уведомлений лежит. Каналы перебираются по очереди, достаточно
одного успешного:

1. **Telegram**: задайте `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. Команда
   `npm run telegram:chat-id` найдёт идентификатор чата сама. Если с вашего
   сервера `api.telegram.org` недоступен, укажите свой прокси в
   `TELEGRAM_API_BASE`.
2. **ntfy.sh**: задайте `NTFY_TOPIC` длинной случайной строкой и подпишитесь на
   неё в приложении ntfy. Аккаунт не нужен, работает из закрытых сетей.
3. **Почта через Resend**: `RESEND_API_KEY`, `LEADS_EMAIL_TO` и
   `LEADS_EMAIL_FROM`. Выручает, когда хостер закрыл порты SMTP.

Заявки лежат в формате JSON Lines в каталоге `LEADS_DIR` (по умолчанию `.data/`)
и открываются по адресу `/admin?token=$ADMIN_TOKEN`. На бою держите этот каталог
вне папки с релизом, чтобы он пережил выкладку.

Встроенная защита: скрытое поле-ловушка, три заявки с адреса за десять минут,
ограничение длины каждого поля и экранирование HTML перед отправкой.

## Посадочные страницы

Из типизированных данных генерируются две ветки: услуги в `/uslugi` и статьи в
`/blog`. У каждой страницы свои заголовок, описание, канонический адрес,
хлебные крошки, микроразметка `Service` или `Article`, блок вопросов и ссылки на
смежные страницы и кейсы. Всё это само попадает в карту сайта.

Чтобы добавить страницу, допишите объект в `lib/seo/pages.ts` или
`blog-posts.ts`. Обязательные поля описаны в `lib/seo/types.ts`.

Одно предупреждение, которое стоит повторить: не плодите десятки почти
одинаковых страниц перестановкой ключевых слов. Поисковики это узнают и
понижают сайт целиком. У каждой страницы должны быть свой текст, своя цена и
свои примеры, иначе она не нужна.

## Эффекты

**Жидкость под курсором.** Симуляция несжимаемой жидкости на WebGL: движение
мыши впрыскивает импульс в поле скоростей, краситель переносится потоком и
растворяется. Настройки лежат в `components/fluid-backdrop.tsx`.

**Объёмный значок.** Значок `</>` в первом экране собирается скриптом, а не
руками:

```bash
blender --background --python blender/code-mark.py
```

Скрипт строит контуры штрихов, выдавливает их, снимает фаски, прорезает канавку
в передней грани и вкладывает внутрь светящуюся вставку, после чего выгружает
`public/hero/code-mark.glb` (30 КБ, 641 полигон, два материала). Пропорции
задаются константами в начале файла. three.js освещает модель процедурной картой
окружения, поэтому отдельный HDRI-файл не нужен.

**Параллакс.** Сцена на GSAP ScrollTrigger прилипает к экрану и разводит
скриншоты проектов по четырём слоям глубины.

**Свечение за курсором, подсветка полей, блик на кнопке.** Позиция курсора
пишется прямо в CSS-переменные, поэтому React при движении мыши ничего не
перерисовывает.

Всё, что двигается, выключается, если в системе включён режим уменьшенной
анимации. Тяжёлые эффекты дополнительно требуют мышь, ширину от 1024 пикселей,
четыре ядра и рабочий WebGL, иначе заменяются статикой.

## Аналитика

Идентификаторы задаются в объекте `analytics` в `lib/site.ts`. Пустая строка
полностью выключает счётчик, а заодно убирает упоминание о нём из плашки про
cookie и из политики обработки данных, чтобы документы не обещали того, чего
сайт не делает. Из коробки поддерживаются Яндекс.Метрика с Вебвизором, Google
Analytics 4 и проверочный тег Яндекс.Вебмастера.

Счётчики работают только на боевом домене, поэтому разработка не портит
статистику. При переходах внутри сайта просмотр отправляется вручную, первый
просмотр не считается дважды. Поля формы помечены `ym-hide-content` и
`ym-disable-keys`, так что в записи Вебвизора не попадают имя, контакт и текст
сообщения.

При успешной отправке срабатывает цель `lead`: `reachGoal` в Метрике и
`generate_lead` в GA4.

## Документы по персональным данным

Страницы `/privacy` и `/consent` идут рабочими черновиками: что собирает форма,
зачем, где хранится, сколько и как отозвать согласие. В форме есть отдельная
галочка согласия без предварительной отметки, внизу плашка про cookie.

Перед публикацией заполните `lib/legal.ts`, значения в скобках это заглушки. Эти
документы отправная точка, а не юридическая консультация: покажите итоговый
текст юристу.

## Выкладка

Работает везде, где есть Node. Сборка идёт в режиме `output: 'standalone'`,
команда `npm run deploy` собирает проект локально, отправляет архив по SSH,
подменяет каталог релиза и перезапускает службу systemd, оставляя прошлую
версию в `<APP>.prev` для мгновенного отката. Настраивается через `.env.deploy`,
образец лежит в `.env.deploy.example`.

Собирать на сервере намеренно не предлагается: на VPS с гигабайтом памяти
`next build` падает по нехватке памяти.

Минимальный сервер под это: Node 20+, nginx с проксированием на
`127.0.0.1:3000`, юнит systemd, запускающий `node server.js`, и certbot для
сертификата.

## Поддержать

Шаблон бесплатный. Если он сэкономил вам время, поддержать можно так:

- **USDT, сеть TRC-20**: `TBwwoB4SiQ4skzw8ARnGha1MtWAh6NWz4d`
- **Подписка в Telegram-боте**: [@Eassssy_connect_bot](https://t.me/Eassssy_connect_bot)

## Лицензия

MIT. Пользуйтесь в коммерческих проектах, меняйте, публикуйте. Упоминание
автора приветствуется, но не требуется. Лицензии стороннего кода в составе
шаблона перечислены в [NOTICE](NOTICE), этот файл нужно сохранять при
распространении.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.

react-resume-template

react-resume-template

A personal resume website template for software developers, built with Next.js, React, and TypeScript and styled with Tailwind CSS. Site content is driven by a single data file at /src/data/data.tsx, with types in dataDef.ts and images in src/images/.

Next.js · Portfolio

nxt-lnk

nxt-lnk

nxt-lnk is a Next.js-based bio link page template that manages personal information and links via BioData.js and LinksData.js, positioned as a self-hosted alternative to Linktree. It groups links by type, supports enabling/disabling individual links, and offers hexagonal or oval avatars.

Next.js · Portfolio

sylph

sylph

Sylph is a minimal portfolio and blog template built on Next.js, supporting MDX/Markdown writing, light/dark themes, and automatic OG image generation. It includes sitemap, robots.txt, metadata, and syntax highlighting, with automatic blog timestamps.

Next.js · Portfolio

sleek-portfolio

sleek-portfolio

A modern, responsive portfolio template built with Next.js 15, TypeScript, Tailwind CSS, and Shadcn UI. It includes an MDX blog, project showcase, work experience timeline, and a contact form that receives messages via Telegram Bot.

Next.js · Portfolio

research-website-template

research-website-template

A React + Next.js template for research personal websites, aimed at PhD students and researchers. It centralizes publications, projects, and other content in src/data as arrays of objects, with optional fields automatically generating UI components.

Next.js · Portfolio

shadcn-portfolio

shadcn-portfolio

A developer portfolio template built with Next.js 15, shadcn/ui, Tailwind CSS, and Framer Motion, featuring an MDX blog, light and dark modes, responsive design, and SEO meta tags.

Next.js · Portfolio