Next.js 15 App Router + TypeScript + Tailwind CSS 4,支持深色与浅色主题
dev-portfolio-template — Next.js 作品集模板
作者 Inter1ark
面向开发者或小型工作室的作品集网站模板,基于 Next.js 15 App Router,含案例页、表单接收、SEO 落地页与 WebGL/GSAP 视觉效果。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 3
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
表单先落盘再投递,支持 Telegram、ntfy.sh、Resend 邮件三种通道
由 lib/seo/ 类型化数据生成服务落地页与博客文章,含结构化数据与站点地图
WebGL 流体光标、Blender 脚本生成的 3D 图标、GSAP ScrollTrigger 视差
内置 /privacy 与 /consent 个人数据文件草稿,表单含独立同意勾选框
提供 output: 'standalone' 构建与基于 SSH 和 systemd 的部署脚本
模板详细介绍
这是一个从实际运行网站提取的开发者作品集模板,界面为俄语,所有文案均为占位内容,需要替换为自己的信息。技术栈包括 Next.js 15 App Router、TypeScript、Tailwind CSS 4、Motion、GSAP、Lenis 和 three.js,支持深色与浅色主题。
页面结构包含首页(首屏、作品、方法、服务、技术栈、流程、评价、问答、联系方式)、案例页 /work/<slug>、服务落地页目录 /uslugi 及其子页、博客 /blog、隐私与同意文件 /privacy 与 /consent,以及受 token 保护、禁止搜索引擎收录的 /admin 表单列表页。
内容集中在 lib 目录下的数据文件中:site.ts 管理名称、联系方式、时区、菜单与分析计数器;projects.ts 与 project-details.ts 管理案例;content.ts 管理首页各板块;seo/ 目录按分组存放落地页与博客文章;legal.ts 存放法律页面所需运营者信息。
表单提交会先写入磁盘再尝试投递,支持 Telegram、ntfy.sh 和 Resend 邮件三种通道,依次尝试,任一成功即可。内置隐藏蜜罐字段、每地址十分钟三条限制、字段长度限制与 HTML 转义。
视觉效果包括 WebGL 流体光标、由 Blender 脚本生成的 3D 图标、GSAP ScrollTrigger 视差,以及写入 CSS 变量的光标光晕。系统开启减少动画时全部关闭,重型效果还要求鼠标、宽度 1024 像素以上、四核与可用 WebGL。
README 未提供性能数据、浏览器兼容范围或生产环境压力测试结果。
适合你的项目吗?
适用场景
- 为开发者个人或小型工作室搭建带案例展示的作品集站点
- 需要按搜索词组织服务落地页与博客文章的内容型网站
- 希望表单提交不因通知通道故障而丢失线索的接单页面
- 需要俄语界面与 152-ФЗ 相关个人数据文件草稿的项目
适合人群
- 熟悉 Next.js 与 TypeScript,能自行替换数据文件内容的开发者
- 需要案例页、服务页与博客一体化结构的个人或小团队
- 可提供 Node 20+ 服务器并自行配置 nginx 与 systemd 的部署者
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node 20 或更高版本;执行 npm install,可选复制 .env.example 为 .env.local,然后 npm run dev
- 2
先编辑 lib/site.ts 填写名称、联系方式与域名,该文件同时驱动页头、页脚、元数据、站点地图与结构化数据
- 3
不要在 npm run dev 运行时执行 npm run build,两者共用 .next 目录会互相覆盖;若已发生,停止 dev、删除 .next 后重启
- 4
案例媒体放在 public/work/<slug>/,文件名与尺寸需按 README 表格保持,并在 lib/projects.ts 的 shots 字段填写实际帧数
- 5
部署使用 npm run deploy,通过 .env.deploy 配置,README 建议不在服务器上构建以避免内存不足
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
- Telegram 通知通道需要自行提供 TELEGRAM_BOT_TOKEN 与 TELEGRAM_CHAT_ID;若服务器无法访问 api.telegram.org,还需自备代理并通过 TELEGRAM_API_BASE 指定。
- ntfy.sh 通道需要自行设置 NTFY_TOPIC 并在 ntfy 应用中订阅该主题。
- 邮件通道需要 Resend 的 RESEND_API_KEY,以及 LEADS_EMAIL_TO 与 LEADS_EMAIL_FROM 配置。
- 查看表单列表需通过 /admin?token=$ADMIN_TOKEN 访问,必须自行设置 ADMIN_TOKEN。
- 发布前必须填写 lib/legal.ts 中的运营者信息,括号内为占位值;这些法律文件只是起点,需交由律师审阅。
- 不建议在服务器上构建:在内存 1GB 的 VPS 上 next build 会因内存不足失败,需在本地构建后部署。
- 模板内第三方代码的许可证列在 NOTICE 文件中,分发时需保留该文件。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
1. **Telegram**: задайте `TELEGRAM_BOT_TOKEN` и `TELEGRAM_CHAT_ID`. Команда
README 原文
2. **ntfy.sh**: задайте `NTFY_TOPIC` длинной случайной строкой и подпишитесь на
README 原文
3. **Почта через Resend**: `RESEND_API_KEY`, `LEADS_EMAIL_TO` и
README 原文
и открываются по адресу `/admin?token=$ADMIN_TOKEN`. На бою держите этот каталог
README 原文
Перед публикацией заполните `lib/legal.ts`, значения в скобках это заглушки. Эти
README 原文
Собирать на сервере намеренно не предлагается: на VPS с гигабайтом памяти
README 原文
https://github.com/Inter1ark/dev-portfolio-template/blob/main/LICENSEhttps://github.com/Inter1ark/dev-portfolio-template/blob/main/README.mdавтора приветствуется, но не требуется. Лицензии стороннего кода в составе
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-14。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 83 / 100
- 技术栈
- Next.js · React
- 网站类型
- 作品集
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-09-11
- 截图检查日期
- 2026-10-14
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Next.js。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: codex-user-requested-batch-review-20261015 · 2026-10-15
查看当时使用的来源资料
SHA-256: 70fc7ff2d4b6a067be3fabb08701ff5181301b59165aeab1ae649edf517c682e
2026-10-14T21:07:41.960Z
来源文件 / 仓库# Шаблон портфолио разработчика Готовый сайт-портфолио для разработчика или небольшой студии. Страницы кейсов, форма заявки, которая не теряет обращения, система посадочных страниц под поисковые запросы, документы по 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), этот файл нужно сохранять при распространении.
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

react-resume-template
A personal resume website template built with React.js, Typescript, Next.js, and styled with Tailwind css
Next.js · 作品集

nxt-lnk
Custom bio links for creatives who love coding. A perfect custom alternative for linktree, bio and other short…
Next.js · 作品集

sylph
A minimal portfolio template.
Next.js · 作品集

sleek-portfolio
sleek-portfolio 是一个面向开发者个人品牌展示的现代作品集模板,基于 Next.js 15、TypeScript、Tailwind CSS 和 Shadcn UI 构建。
Next.js · 作品集

research-website-template
React + Next.js template for research websites (for PhD students, researchers, etc)
Next.js · 作品集

shadcn-portfolio
shadcn-portfolio 是一个面向开发者的作品集模板,技术栈为 Next.js 15、shadcn/ui、Tailwind CSS 和 Framer Motion。
Next.js · 作品集
