深色工程/终端风格界面,含网格纹理、终端标记、边框面板与 HUD 式元数据
developer-portfolio — Vite 作品集模板
作者 hoanglong1811
基于 React、Vite、Tailwind CSS v4 与 Motion 的深色工程风格开发者作品集模板,内容由常量文件驱动,联系表单通过 Cloudflare Worker 调用 Resend 发送邮件。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 2
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
首屏打字机序列展示姓名、角色、简介、邮箱与位置,并处理减少动态效果偏好
桌面端提供目录导航、当前区块跟踪与阅读进度,移动端使用对话框式菜单
项目展示按项目数量切换特色卡片布局,另有经历时间线、技能矩阵、教育记录与分组证书卡片
联系表单具备加载、成功与错误状态,前端通过可配置的外部 API 地址提交
仓库包含 GitHub Pages 的 Actions 部署工作流、自定义域名文件与设计系统文档
模板详细介绍
该模板是一个面向开发者的个人作品集站点,采用深色终端风格界面,包含网格纹理、终端标记、边框面板和 HUD 式元数据。页面覆盖个人简介、技能、工作经历、项目、教育、证书与联系方式,并提供打字机式首屏、桌面端目录与阅读进度、滚动触发的区块动画、响应式项目展示、经历时间线和技能矩阵等结构。内容主要通过 src/constants 下的数据文件配置,便于替换而不改动组件结构。
技术栈方面,README 列出 React 19、Vite 8、Tailwind CSS v4,以及 Motion、Lenis、Lucide React、Base UI 等 UI 与动效依赖;Tailwind 通过 @tailwindcss/vite 和 CSS 中的 @theme inline 配置,没有 JavaScript 配置文件。构建产物输出到 dist/,仓库包含 GitHub Pages 的 GitHub Actions 部署工作流,并配置了自定义域名。
联系表单不直接发送邮件:前端读取 VITE_CONTACT_API_URL,向外部接口发送 JSON POST 请求;workers/contact-worker/ 中的 Cloudflare Worker 负责校验请求、处理 CORS,并使用 RESEND_API_KEY 调用 Resend 发送通知和访客确认邮件。README 说明首屏和项目图片为空时会显示工程风格占位内容,profile.cvHref 指向的简历文件在当前工作树中不存在,需要自行补充媒体与简历后再发布。README 未提供关于浏览器兼容范围、性能指标或生产环境安全审计的说明。
适合你的项目吗?
适用场景
- 开发者需要一份结构化的个人作品集,集中展示简介、技能、经历、项目、教育与证书
- 希望通过修改常量数据文件更新站点内容,而不改动组件结构
- 需要将静态前端部署到 GitHub Pages,并使用自定义域名
- 希望联系表单不暴露邮件服务密钥,而是经由 Cloudflare Worker 调用 Resend 发送邮件
适合人群
- 具备 React 与 Vite 使用经验、愿意自行配置内容与部署的开发者
- 需要深色工程风格个人站点并接受自行准备图片与简历文件的用户
- 计划使用 GitHub Pages 托管静态前端、并可选接入 Cloudflare Worker 联系接口的开发者
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node.js 24 与 npm;克隆仓库后运行 npm install,使用 npm run dev 本地开发,npm run build 生成 dist/
- 2
前端联系表单需在 .env.local 中设置 VITE_CONTACT_API_URL;该值会嵌入客户端包,属于公开信息
- 3
Worker 侧需配置 CONTACT_TO_EMAIL、CONTACT_FROM_EMAIL、CORS_ALLOWED_ORIGINS,并将 RESEND_API_KEY 存为加密 secret,不要提交 .dev.vars
- 4
GitHub Pages 部署由 main 分支推送触发;当前工作流不会自动注入 VITE_CONTACT_API_URL,需按 README 在构建步骤中显式传入
- 5
使用自定义域名时需替换 CNAME 与 public/CNAME,并在 GitHub Pages 设置中配置域名与 DNS;发布前补充首屏/项目图片和简历文件
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
- 首屏与项目图片为空时显示工程风格占位内容;profile.cvHref 指向的简历文件在当前工作树中不存在,发布前需自行补充媒体与简历。
- 联系表单需在 .env.local 中设置 VITE_CONTACT_API_URL,该值会嵌入客户端包,属于公开信息。
- 邮件发送需自备 Resend API 密钥,并以加密 Worker secret 形式存储 RESEND_API_KEY,不得使用 VITE_ 前缀。
- Worker 需配置 CONTACT_TO_EMAIL 作为新消息通知的收件邮箱。
- Worker 需配置 CONTACT_FROM_EMAIL,且须为 Resend 中已验证的发件人。
- Worker 需配置 CORS_ALLOWED_ORIGINS,列出允许调用联系接口的前端来源。
- workers/contact-worker/.dev.vars 含本地占位值且被 Git 忽略,测试真实邮件前需在本地替换 Resend 密钥,切勿提交。
- 当前 GitHub Pages 工作流不会自动注入 VITE_CONTACT_API_URL,启用联系表单需在构建步骤中显式传入。
- 使用 Resend 发送邮件前需在 Resend 中验证发件域名。
- 使用自定义域名需替换或删除 CNAME 与 public/CNAME,并在 GitHub Pages 设置中配置域名与 DNS。
- 需更新 profile.cvHref 并在其指向位置添加简历文件。
- 如需替换教育机构图片,需替换 src/assets/images/education.png。
- 远程技术、联系与证书 logo URL 与内容不符时需自行替换。
- 发布前需替换所有个人邮箱、电话、个人主页 URL 与域名引用。
- 发布前需替换全部个人信息、素材、凭据、域名、分析标识与联系配置。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
> The hero and projects intentionally render engineering-style placeholders when image values are empty. The current `profile.cvHref` also expects a resume file that is not present in this working tree. Add your media and resume before publishing a fork.
README 原文
| `VITE_CONTACT_API_URL` | Vite frontend | Contact form | Full HTTPS URL that accepts the contact form's JSON `POST` request. Vite embeds this value in the client bundle, so it is public. |
README 原文
| `RESEND_API_KEY` | Cloudflare Worker | Email delivery | Secret Resend API key. Store it as an encrypted Worker secret; never use a `VITE_` prefix. |
README 原文
| `CONTACT_TO_EMAIL` | Cloudflare Worker | Owner notification | Destination inbox for new portfolio messages. |
README 原文
| `CONTACT_FROM_EMAIL` | Cloudflare Worker | Email delivery | Verified Resend sender, including the display name when desired. |
README 原文
| `CORS_ALLOWED_ORIGINS` | Cloudflare Worker | Browser access | Comma-separated frontend origins allowed to call the contact endpoint, including local development and production domains. |
README 原文
> `workers/contact-worker/.dev.vars` contains local-only values and is ignored by Git. Replace its placeholder Resend key locally before testing real email delivery; never commit that file.
README 原文
The current workflow does not inject this variable automatically.
README 原文
4. Verify the sender domain in Resend.
README 原文
1. Replace both files with your domain, or remove them when using the default `github.io` address.
README 原文
- Update `profile.cvHref` and add your resume at the referenced location.
README 原文
- Replace `src/assets/images/education.png` with your institution asset if needed.
README 原文
- Replace remote technology, contact, and certificate logo URLs when they do not match your content.
README 原文
- Replace all personal email addresses, phone numbers, profile URLs, and domain references before publishing.
README 原文
https://github.com/hoanglong1811/developer-portfolio/blob/main/LICENSEhttps://github.com/hoanglong1811/developer-portfolio/blob/main/README.mdReplace all personal information, assets, credentials, domains, analytics identifiers, and contact configuration before publishing. Keeping the original engineering visual language is optional; the component and token structure is intended to support redesigns.
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-17。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 85 / 100
- 技术栈
- Vite · React
- 网站类型
- 作品集
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-07-18
- 截图检查日期
- 2026-10-17
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Vite。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: codex-user-requested-batch-review-20261018 · 2026-10-18
查看当时使用的来源资料
SHA-256: ccdcd496a564cfdaf674eff2f80c29fbb7cf9f774feadc845c203e97dd2aeb60
2026-10-17T22:06:27.642Z
来源文件 / 仓库# Engineering Portfolio
> A reusable, engineering-inspired portfolio template built with React, Vite, Tailwind CSS v4, and Motion.
Engineering Portfolio is a dark, terminal-influenced personal site for developers who want a structured way to present their profile, skills, experience, projects, education, certificates, and contact details. The implementation is component-driven, responsive from 320 px upward, deploys the static frontend through GitHub Pages, and connects the contact form to an external Cloudflare Worker/Resend email API.
## Live Demo
The repository is configured for the following custom domain:
**https://hlongdev.com**
## Preview
Screenshots are not currently included in the repository.
| View | Preview |
| ------- | -------------------------------------------------------- |
| Desktop | Add a desktop screenshot after customizing the template. |
| Mobile | Add a mobile screenshot after customizing the template. |
## Features
- Hero typewriter sequence for profile, role, summary, email, and location.
- Dark engineering interface with grid textures, terminal markers, bordered panels, and HUD-style metadata.
- Responsive header with a mobile/tablet dialog menu and desktop contact action.
- Desktop table of contents with active-section tracking and reading progress.
- Scroll-triggered section and capability-row animations.
- Reduced-motion handling for typewriter, reveal, and loading behavior.
- Responsive project showcase with featured-card layouts based on project count.
- Experience timeline, skills matrix, education record, and grouped certificate cards.
- Contact form with loading, success, and error states.
- External contact API boundary designed for Cloudflare Workers and Resend.
- Configurable resume download action.
- Semantic sections, labeled controls, keyboard focus styles, and ARIA state for navigation and live feedback.
- GitHub Pages deployment workflow and custom-domain support.
- Maintained, code-derived [design system documentation](docs/design-system/README.md).
> [!NOTE]
> The hero and projects intentionally render engineering-style placeholders when image values are empty. The current `profile.cvHref` also expects a resume file that is not present in this working tree. Add your media and resume before publishing a fork.
## Tech Stack
| Category | Technologies |
| ---------------- | -------------------------------------------------------------- |
| Frontend | React 19, Vite 8, Tailwind CSS v4 |
| UI and motion | Motion, Lenis, Lucide React, Base UI, Class Variance Authority |
| Contact delivery | Cloudflare Workers, Resend |
| Deployment | GitHub Pages, GitHub Actions, Cloudflare DNS/Worker routing |
| Development | npm, ESLint, React Compiler |
Tailwind is configured through `@tailwindcss/vite` and the `@theme inline` block in `src/styles/index.css`; there is no JavaScript `tailwind.config.*` file.
## Project Structure
```text
.
├── .github/workflows/ # GitHub Pages build and deployment
├── docs/design-system/ # Visual, component, motion, and coding conventions
├── public/ # Static files copied directly into the Vite build
├── workers/contact-worker/ # Cloudflare Worker contact API and Wrangler config
├── src/
│ ├── assets/ # Local images and downloadable assets
│ ├── components/
│ │ ├── cards/ # Project, certificate, highlight, and timeline cards
│ │ ├── layout/ # Header, navigation, section frame, ToC, and footer
│ │ ├── portfolio/ # Complete portfolio sections
│ │ ├── shared/ # Reusable visual and behavioral components
│ │ └── ui/ # Button, badge, and field primitives
│ ├── constants/ # Profile and portfolio content records
│ ├── hooks/ # Motion, typewriter, scroll, and navigation behavior
│ ├── lib/ # Generic helpers such as cn()
│ ├── services/ # Frontend service boundaries, including contact API calls
│ ├── styles/ # Theme variables and engineering visual patterns
│ └── utils/ # Project-specific mappings such as IconMap
├── CNAME # Configured GitHub Pages custom domain
├── package.json
└── vite.config.js
```
`workers/contact-worker/` contains the Worker entry point and Wrangler configuration. Local secrets are loaded from its ignored `.dev.vars` file.
## Getting Started
### Prerequisites
- Node.js 24, matching the GitHub Actions workflow.
- npm, included with Node.js.
### Clone and install
```bash
git clone https://github.com/hoanglong1811/my-portfolio.git
cd my-portfolio
npm install
```
### Run locally
```bash
npm run dev
```
Vite prints the local development URL, normally `http://localhost:5173`.
### Build and preview
```bash
npm run build
npm run preview
```
The production output is written to `dist/`.
### Available scripts
| Command | Purpose |
| ----------------- | --------------------------------------------------------------------------------------- |
| `npm run dev` | Start the Vite development server. |
| `npm run build` | Create a production build in `dist/`. |
| `npm run preview` | Serve the production build locally. |
| `npm run lint` | Run ESLint across the repository. |
| `npm run deploy` | Run the production build command. GitHub Pages deployment itself is handled by Actions. |
- `npm run worker:dev` starts the local contact Worker through Wrangler.
- `npm run worker:deploy` deploys the contact Worker through Wrangler.
## Environment Variables
Create `.env.local` in the repository root for frontend development:
```env
VITE_CONTACT_API_URL=https://api.example.com/contact
```
| Variable | Runtime | Required for | Description |
| ---------------------- | ----------------- | ------------------ | --------------------------------------------------------------------------------------------------------------------------------- |
| `VITE_CONTACT_API_URL` | Vite frontend | Contact form | Full HTTPS URL that accepts the contact form's JSON `POST` request. Vite embeds this value in the client bundle, so it is public. |
| `RESEND_API_KEY` | Cloudflare Worker | Email delivery | Secret Resend API key. Store it as an encrypted Worker secret; never use a `VITE_` prefix. |
| `CONTACT_TO_EMAIL` | Cloudflare Worker | Owner notification | Destination inbox for new portfolio messages. |
| `CONTACT_FROM_EMAIL` | Cloudflare Worker | Email delivery | Verified Resend sender, including the display name when desired. |
| `CORS_ALLOWED_ORIGINS` | Cloudflare Worker | Browser access | Comma-separated frontend origins allowed to call the contact endpoint, including local development and production domains. |
Do not commit real API keys or private environment files. Only `VITE_CONTACT_API_URL` belongs in frontend configuration.
## Contact Form Architecture
```text
Portfolio frontend (GitHub Pages)
│
│ POST { name, email, subject, message }
▼
Cloudflare Worker contact endpoint
│
│ authenticated server-side request
▼
Resend API
│
├── owner notification
└── visitor confirmation email
```
`ContactForm.jsx` owns form state and calls `sendContactMessage()` from `src/services/contactService.js`. The service reads `VITE_CONTACT_API_URL`, sends JSON, and converts non-successful responses into UI error feedback.
The frontend must never receive `RESEND_API_KEY`. A Worker or equivalent server-side endpoint validates the request, applies CORS and abuse controls, and communicates with Resend using the secret key.
> [!IMPORTANT]
> `workers/contact-worker/.dev.vars` contains local-only values and is ignored by Git. Replace its placeholder Resend key locally before testing real email delivery; never commit that file.
## Deployment
### GitHub Pages
The checked-in `.github/workflows/deploy.yml` runs when `main` is pushed. It uses Node.js 24, installs dependencies with `npm ci`, runs `npm run build`, uploads `dist/`, and deploys through GitHub Pages.
1. Fork the repository.
2. In **Settings → Pages**, select **GitHub Actions** as the source.
3. Customize the site and push to `main`.
4. Review the `Deploy to GitHub Pages` workflow run.
If the contact form is enabled, create a GitHub Actions repository variable named `VITE_CONTACT_API_URL` and expose it to the existing build step:
```yaml
- name: Build
env:
VITE_CONTACT_API_URL: ${{ vars.VITE_CONTACT_API_URL }}
run: npm run build
```
The current workflow does not inject this variable automatically.
### Cloudflare Worker and Resend
Deploy the contact API separately from the static frontend:
1. Review the Worker implementation and `workers/contact-worker/wrangler.toml` configuration.
2. Configure `CONTACT_TO_EMAIL`, `CONTACT_FROM_EMAIL`, and `CORS_ALLOWED_ORIGINS` as Worker variables.
3. Store `RESEND_API_KEY` as a Cloudflare Worker secret, not plain text configuration.
4. Verify the sender domain in Resend.
5. Deploy the Worker and optionally attach an API custom domain.
6. Set the resulting `/contact` URL as the frontend's `VITE_CONTACT_API_URL`.
7. Submit the form from both local and production origins.
Refer to the official [Cloudflare Workers secret documentation](https://developers.cloudflare.com/workers/configuration/secrets/) and [Resend Cloudflare Worker guide](https://resend.com/docs/send-with-cloudflare-workers/) when deploying the Worker.
### Custom domain
The current frontend domain is declared as `hlongdev.com` in both `CNAME` and `public/CNAME`.
For a fork:
1. Replace both files with your domain, or remove them when using the default `github.io` address.
2. Add the same domain in **Settings → Pages**.
3. Configure the required DNS records with your DNS provider.
4. Enable HTTPS after GitHub verifies the domain.
5. Add the final origin to the Worker's `CORS_ALLOWED_ORIGINS`.
Use GitHub's [custom-domain documentation](https://docs.github.com/en/pages/configuring-a-custom-domain-for-your-github-pages-site/managing-a-custom-domain-for-your-github-pages-site) for the current DNS record values rather than copying stale addresses from third-party guides.
## Customization Guide
Most portfolio content is data-driven and can be replaced without changing component structure.
| What to customize | File or location |
| -------------------------------------------------------------- | --------------------------------- |
| Name, role, summary, email, location, social links, resume URL | `src/constants/profile.js` |
| About highlight cards | `src/constants/profile.js` |
| Navigation labels and section anchors | `src/constants/navigation.js` |
| Skill groups, responsibilities, and technology logos | `src/constants/skills.js` |
| Work experience and timeline responsibilities | `src/constants/experience.js` |
| Projects, stack, links, metrics, and image values | `src/constants/projects.js` |
| Education record | `src/constants/education.js` |
| Certificates, issuers, skills, logos, and credential URLs | `src/constants/certificates.js` |
| Contact API client contract | `src/services/contactService.js` |
| Theme colors, fonts, and radius tokens | `src/styles/index.css` |
| Engineering panels, grid, labels, and technical copy | `src/styles/App.css` |
| Custom domain | `CNAME` and `public/CNAME` |
### Resume and images
- Update `profile.cvHref` and add your resume at the referenced location.
- Set each project's `image` value or keep the built-in engineering placeholder.
- Replace `src/assets/images/education.png` with your institution asset if needed.
- Replace remote technology, contact, and certificate logo URLs when they do not match your content.
- Replace all personal email addresses, phone numbers, profile URLs, and domain references before publishing.
For visual rules, component contracts, spacing, motion, and accessibility guidance, read the [Design System](docs/design-system/README.md).
## Using This Template
You are welcome to use this repository as a starting point for your own portfolio. Under the MIT License, you may:
- fork or clone the repository;
- replace the personal content;
- modify or redesign the interface;
- add sections and components;
- deploy it to your preferred hosting platform;
- extend the contact and content architecture.
Replace all personal information, assets, credentials, domains, analytics identifiers, and contact configuration before publishing. Keeping the original engineering visual language is optional; the component and token structure is intended to support redesigns.
## Contributing
Contributions are welcome, including:
- UI and UX improvements;
- performance optimization;
- accessibility fixes;
- responsive-layout improvements;
- bug fixes;
- documentation corrections;
- reusable components;
- well-scoped features.
For substantial behavior, architecture, or design changes, open an Issue first so the proposed direction can be discussed.
```text
Fork
↓
Create a feature branch
↓
Implement and validate the change
↓
Commit with a clear message
↓
Open a pull request
```
Suggested workflow:
```bash
git checkout -b feat/short-description
npm install
npm run build
npm run lint
git commit -m "feat: describe the change"
```
Pull requests should explain the problem, the chosen solution, affected responsive states, and any accessibility or deployment implications. Include screenshots for visual changes.
## License
This project is available under the [MIT License](LICENSE). It is intentionally licensed for community reuse, modification, distribution, and extension, subject to the license terms.
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

Resumify
Free, privacy-first resume builder — 6 ATS-friendly templates, full customization, JSON import/export. No sign…
Vite · 作品集

showlit
✨ Showlit - A modern and clean template for creating a personal website
Vite · 作品集

folium
Professional developer portfolio boilerplate (React • TypeScript • Tailwind • Vite) with simple content custom…
Vite · 作品集

kurizu-discord
A Discord themed website built using React & Vite
Vite · 作品集

cv-educornelsen
Production portfolio with a streaming AI chatbot (Gemini + SSE), containerized via Docker, deployed to Google …
Vite · 作品集

about-me-personal-portfolio-website-template
Simple Personal Website Template, built with bootstrap and vite js project.
Vite · 作品集
