纯 CSS 绘制的齿孔邮票、弧形文字邮戳与滚动触发的手绘圈选效果
portfolio-main — Vite 作品集模板
作者 Garvit1000
Garvit Joshi 的个人作品集网站,采用 React、Vite 与 TailwindCSS 构建,包含邮政主题的首页与浏览器内运行的免费工具 Lab。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 2
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
Lab 中的 Postmarked 工具在浏览器内完成照片雕刻、EXIF 读取、离线城市匹配与撕下导出
统一的 UI 音效系统,通过一个委托监听器播放并提供静音开关
内容集中在 src/data/mock.js,项目截图建议 1200px 宽 WebP
Lab 页面懒加载,不增加首页包体积
可选 GitHub Token 显示完整贡献图,否则回退到公共 API 统计
模板详细介绍
这是一个面向个人展示的作品集模板,仓库为 Garvit Joshi 的个人站点。首页采用温暖的邮政主题:用纯 CSS 绘制带齿孔的邮票、带弧形文字的邮戳,以及滚动进入视口时圈出文字的手绘涂鸦。内容区块包括带品牌色技术标签和 1200px WebP 截图的项目列表、配插画 SVG 的“How I work”卡片、GitHub 卡片、带公司 logo 的经历时间线,以及航空邮件明信片风格的联络区。按钮与链接通过一个统一的事件监听器播放 UI 音效,并提供静音开关。站点只有一套主题:暖白纸张底色、炭黑文字、Averia Sans Libre 标题与圆润正文字体。
站点还包含一个 Lab 区域,提供完全在浏览器中运行的免费工具,无需注册,也不上传数据。其中 Postmarked(/lab/stamp)可把旅行照片转成雕刻风格邮票,并从照片 EXIF 读取拍摄日期与 GPS,配合约 370 个城市的离线列表生成地名,两者均可手动编辑;拖动邮票可撕下并合成纸张撕裂音效,导出为 900 × 1140 的透明齿孔 PNG,最多可把六张照片拼成共享齿孔的整版邮票。Lab 页面为懒加载,不增加首页包体积。
模板使用 React 19、React Router 7、Vite 8、Tailwind CSS 3(配合 CSS 变量)、Hugeicons 与 Simple Icons(CDN)、Lenis 滚动,以及 Vercel Analytics 和 Speed Insights。需要 Node 20.19+ 或 22.12+。内容集中在 src/data/mock.js,项目截图建议约 1200px 宽的 WebP。GitHub 卡片可选配置 VITE_GITHUB_TOKEN 以显示完整贡献图,未配置时回退到公共 API 显示仓库、关注者与账号年龄统计。部署在 Vercel,vercel.json 将所有路由重写到 index.html 以支持深链接刷新。代码采用 MIT 许可。
适合你的项目吗?
适用场景
- 个人开发者搭建带邮政主题视觉的作品集站点
- 在浏览器内将旅行照片制作成带邮戳的雕刻风格邮票
- 把多张照片拼成共享齿孔的整版邮票并导出 PNG
- 通过修改 src/data/mock.js 替换姓名、简介、项目与经历内容
- 在 Lab 中新增浏览器内运行的小工具页面
适合人群
- 需要 React 与 Vite 作品集模板的个人开发者
- 希望展示项目、经历与社交链接的求职者或自由职业者
- 对邮政主题视觉与浏览器内图像处理工具感兴趣的开发者
- 使用 Vercel 部署并需要深链接路由支持的站点
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node 20.19+ 或 22.12+,克隆仓库后执行 npm install 与 npm run dev,开发服务器默认在 http://localhost:5173
- 2
可选在 .env 中设置 VITE_GITHUB_TOKEN 以显示完整贡献图;该变量会打包进客户端,不要赋予写权限
- 3
项目截图建议约 1200px 宽的 WebP,卡片实际渲染宽度约 560px
- 4
修改 public/og-image.png 后需更新 index.html 中 og:image 的 ?v= 查询参数,因为 Discord、Slack 和 LinkedIn 按 URL 缓存预览
- 5
部署在 Vercel,vercel.json 将所有路由重写到 index.html 以支持 /lab/og-image 等深链接刷新
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- GitHub 卡片为可选功能:配置 VITE_GITHUB_TOKEN 时显示完整贡献图,未配置时回退到公共 API 仅显示仓库、关注者与账号年龄统计。该变量会打包进客户端,切勿赋予写权限。
- 部署依赖 Vercel 平台,vercel.json 将所有路由重写到 index.html 以支持深链接刷新;使用其他托管方式需自行处理路由回退。
- 站点集成 Vercel Analytics 与 Speed Insights 分析服务,部署到 Vercel 时会启用这些外部服务。
- 图标通过 Hugeicons 与 Simple Icons 的 CDN 加载,运行时依赖外部 CDN 服务。
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
With a token, the GitHub card shows the full contribution graph. Without one, it falls back to the public API and shows repo, follower and account-age stats.
README 原文
Deployed on Vercel. `vercel.json` rewrites all routes to `index.html`
README 原文
Analytics | Vercel Analytics and Speed Insights
README 原文
https://github.com/Garvit1000/portfolio-main/blob/master/LICENSEhttps://github.com/Garvit1000/portfolio-main/blob/master/README.mdIcons | Hugeicons, Simple Icons (CDN)
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-02。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 88 / 100
- 技术栈
- Vite · React
- 网站类型
- 作品集
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-10-01
- 截图检查日期
- 2026-10-02
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 Vite。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
已完成服务器许可规则与 AI 来源核对;未经过人工编辑审核。
查看当时使用的来源资料
SHA-256: 684d8948b0c0d74b87410e8cac9d33788b0d1019a560a8aa47726ecdf051735a
2026-10-02T07:57:43.942Z
来源文件 / 仓库# Garvit Joshi · Portfolio
The personal site of **Garvit Joshi**, full stack developer. A warm, postal-themed portfolio with a small **Lab** of free tools people can use in their browser.
**Live:** [garvit.me](https://www.garvit.me/)

## What's inside
### Portfolio
- **Postage-stamp hero.** Perforated stamps drawn in pure CSS (two masks unioned), a postmark with curved ring text, and a hand-drawn scribble that circles a word as it scrolls into view.
- **Projects** with brand-coloured tech pills and 1200px WebP screenshots.
- **How I work** cards with illustrated SVG visuals, a **GitHub card**, and an **experience timeline** with company logos.
- **Air-mail postcard** contact section with a handwritten address and a "REPLY PAID" postmark.
- **UI sounds** on every button and link through one delegated listener, with a mute toggle.
- One single theme: warm off-white paper, charcoal ink, Averia Sans Libre headings and rounded body type.
### Lab
Free tools that run entirely in the browser. No sign-up and nothing uploaded.
- **Postmarked** (`/lab/stamp`). Turn a trip photo into an engraved postage stamp, postmarked from where and when it was taken.
- **Engraving:** the photo is redrawn as one-ink line engraving (carmine, ultramarine, olive, sepia or black), with auto-levels and partial histogram equalisation so dark photos keep their detail.
- **Self-postmarking:** the capture date and GPS are read from the photo's EXIF in the browser, and the place name comes from an offline list of about 370 cities (`src/data/places.js`). Both are editable, and photos without location data ask you to type it.
- **Tear to download:** drag the stamp off the sheet and it rips free with a synthesised paper-tear sound, then saves as a 900 × 1140 PNG with transparent perforations.
- **Sheets:** add up to six photos for a sheet of stamps that share perforations, each with its own postmark.
Lab pages are lazy-loaded, so they add nothing to the homepage bundle.
## Tech stack
| | |
|---|---|
| Framework | React 19, React Router 7 |
| Build | Vite 8 |
| Styling | Tailwind CSS 3 with CSS variables |
| Icons | Hugeicons, Simple Icons (CDN) |
| Scrolling | Lenis |
| Analytics | Vercel Analytics and Speed Insights |
## Getting started
Requires **Node 20.19+** (or 22.12+).
```bash
git clone https://github.com/Garvit1000/portfolio-main.git
cd portfolio-main
npm install
npm run dev
```
The dev server runs at <http://localhost:5173>.
### GitHub card (optional)
With a token, the GitHub card shows the full contribution graph. Without one, it falls back to the public API and shows repo, follower and account-age stats.
```env
# .env
VITE_GITHUB_TOKEN=your_github_personal_access_token
```
A classic token with no scopes is enough, since it only reads public data. Note that `VITE_` variables are bundled into the client, so never give this token write access.
## Scripts
| Command | What it does |
|---|---|
| `npm run dev` | Start the dev server |
| `npm run build` | Production build into `dist/` |
| `npm run preview` | Serve the production build locally |
## Project structure
```
src/
├── App.jsx # Routes: /, /lab, /lab/og-image (others redirect home)
├── index.css # Design tokens, surfaces, buttons, stamps, postcard
├── data/mock.js # All portfolio content: bio, projects, experience, links
├── components/
│ ├── Hero.jsx, HeroStamps.jsx, stamp-art.jsx # Hero, stamps, postmark, stamp artwork
│ ├── Projects.jsx, About.jsx, Experience.jsx, Contact.jsx
│ ├── Scribble.jsx # Hand-drawn circle highlight
│ ├── SocialLinks.jsx, TechPill.jsx, GitHubCard.jsx
│ └── SoundProvider.jsx # UI sounds
├── pages/
│ ├── Lab.jsx # Lab index (tool cards)
│ └── StampTool.jsx # Postmarked: stamp tool UI and tear-off interaction
├── data/places.js # Offline city list for turning GPS into a place name
└── lib/
├── stamp-render.js # Engraving, stamp layout, postmark and sheet renderer
├── exif.js # Minimal EXIF reader (capture date + GPS)
├── tear-sound.js # Synthesised paper-tear sound
└── sound-engine.js … # Synthesised UI sounds
```
## Editing content
Almost everything you'd want to change lives in [`src/data/mock.js`](src/data/mock.js): name, title, bio, projects (with images in `src/assets/`), work experience (with logos in `src/assets/logos/`) and social links.
Project screenshots should be about 1200px wide WebP files. Anything larger is wasted, because cards render at around 560px.
## Adding to the Lab
To add a new tool, create a page in `src/pages/`, add a lazy route in `App.jsx`, and add an entry (with a `Preview` component for the card) to the `TOOLS` array in [`src/pages/Lab.jsx`](src/pages/Lab.jsx).
## Deployment
Deployed on Vercel. `vercel.json` rewrites all routes to `index.html` so deep links like `/lab/og-image` work on refresh.
When you change `public/og-image.png`, bump the `?v=` query on the `og:image` URLs in `index.html`. Link previews on Discord, Slack and LinkedIn are cached by URL.
## License
MIT. See [LICENSE](LICENSE).
## Contact
**Garvit Joshi** · [[email protected]](mailto:[email protected]) · [LinkedIn](https://linkedin.com/in/garvit-joshi1) · [GitHub](https://github.com/Garvit1000) · [X](https://x.com/Garvit1000)
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

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 · 作品集

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

HackFolio
A high-performance, SEO-optimized hacker-themed portfolio website tailored for for ethical hackers, penetratio…
Vite · 作品集
