ViteReactPortfolio

portfolio-main — Vite Portfolio Template

By Garvit1000

Garvit Joshi's personal portfolio website, built with React, Vite, and TailwindCSS, featuring a postal-themed homepage and a free in-browser tool Lab.

Explore the design

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

2 previews
Desktop homepage1 / 2
Desktop captureTop of page

Actual screenshot captured by the server browser.

All pages & views 2

Screenshots show visual appearance; interactive behavior may differ.

Recorded 2026-10-02View source

What stands out

A quick read of the recorded project description.

01

Pure CSS-drawn perforated stamps, curved-text postmarks, and scroll-triggered hand-drawn circling effects

02

The Postmarked tool in the Lab performs photo engraving, EXIF reading, offline city matching, and tear-off export entirely in the browser

03

A unified UI sound system played through one delegated listener with a mute toggle

04

Content is centralized in src/data/mock.js, and project screenshots are recommended at 1200px wide WebP

05

Lab pages are lazy-loaded and do not add to the homepage bundle size

06

An optional GitHub token shows the full contribution graph; otherwise it falls back to public API statistics

Template Details

This is a portfolio template for personal presentation; the repository is Garvit Joshi's personal site. The homepage uses a warm postal theme: pure CSS-drawn perforated stamps, a postmark with curved text, and hand-drawn scribbles that circle text as it scrolls into view. Content sections include a project list with brand-colored tech tags and 1200px WebP screenshots, a "How I work" card with illustration SVGs, a GitHub card, an experience timeline with company logos, and a contact section styled as an airmail postcard. Buttons and links play UI sound effects through a single delegated event listener, with a mute toggle. The site has only one theme: warm white paper background, charcoal text, Averia Sans Libre headings, and a rounded body font.

The site also includes a Lab section offering free tools that run entirely in the browser, with no sign-up and no data uploads. Postmarked (/lab/stamp) converts travel photos into engraved-style stamps, reads capture date and GPS from photo EXIF, and generates place names using an offline list of about 370 cities; both can be edited manually. Dragging a stamp tears it off and plays a paper-tearing sound effect, and it exports as a 900 × 1140 transparent perforated PNG; up to six photos can be combined into a full sheet of stamps sharing perforations. Lab pages are lazy-loaded and do not add to the homepage bundle size.

The template uses React 19, React Router 7, Vite 8, Tailwind CSS 3 (with CSS variables), Hugeicons and Simple Icons (CDN), Lenis scrolling, and Vercel Analytics and Speed Insights. It requires Node 20.19+ or 22.12+. Content is centralized in src/data/mock.js, and project screenshots are recommended at about 1200px wide WebP. The GitHub card can optionally be configured with VITE_GITHUB_TOKEN to show the full contribution graph; without it, it falls back to the public API showing repository, follower, and account age statistics. It is deployed on Vercel, and vercel.json rewrites all routes to index.html to support deep-link refreshes. The code is MIT licensed.

ViteReactPortfolio

Is it right for your project?

Use Cases

  • Individual developers building a portfolio site with a postal-themed visual style
  • Turning travel photos into engraved-style stamps with postmarks in the browser
  • Combining multiple photos into a full sheet of stamps sharing perforations and exporting as PNG
  • Replacing the name, bio, projects, and experience content by editing src/data/mock.js
  • Adding new in-browser tool pages to the Lab

Suitable For

  • Individual developers who need a React and Vite portfolio template
  • Job seekers or freelancers who want to showcase projects, experience, and social links
  • Developers interested in postal-themed visuals and in-browser image processing tools
  • Sites deployed on Vercel that need deep-link routing support

Getting started & customization

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

  1. 1

    Requires Node 20.19+ or 22.12+; clone the repository, then run npm install and npm run dev. The dev server defaults to http://localhost:5173

  2. 2

    Optionally set VITE_GITHUB_TOKEN in .env to show the full contribution graph; this variable is bundled into the client, so do not grant it write permissions

  3. 3

    Project screenshots are recommended at about 1200px wide WebP; cards render at about 560px wide

  4. 4

    After modifying public/og-image.png, update the ?v= query parameter on og:image in index.html, because Discord, Slack, and LinkedIn cache previews by URL

  5. 5

    Deployed on Vercel; vercel.json rewrites all routes to index.html to support deep-link refreshes such as /lab/og-image

Read repository instructions

License & source material

Usage conditions & limitations

Free to use · keep license notice

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

Must comply with when using

  • You may use, modify, commercialize, 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

  • The GitHub card is an optional feature: when VITE_GITHUB_TOKEN is configured, the full contribution graph is shown; otherwise it falls back to the public API showing only repository, follower, and account age statistics. This variable is bundled into the client, so never grant it write permissions.
  • Deployment depends on the Vercel platform; vercel.json rewrites all routes to index.html to support deep-link refreshes. Using other hosting requires handling route fallback yourself.
  • The site integrates Vercel Analytics and Speed Insights; these external services are enabled when deployed to Vercel.
  • Icons are loaded via the Hugeicons and Simple Icons CDNs, creating a runtime dependency on external CDN services.
  • Demo images, fonts, icons, and other third-party assets must be checked against their respective licenses; the code's MIT license alone cannot determine this.
  • External services such as domains, hosting, databases, payments, or AI may incur separate charges.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

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.

Original README

Deployed on Vercel. `vercel.json` rewrites all routes to `index.html`

Original README

Analytics | Vercel Analytics and Speed Insights

Original README

Icons | Hugeicons, Simple Icons (CDN)

Original README
https://github.com/Garvit1000/portfolio-main/blob/master/LICENSEhttps://github.com/Garvit1000/portfolio-main/blob/master/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-02. 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 · 88 / 100
Technologies
Vite · 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-10-01
Screenshot last checked
2026-10-02

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 Vite 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.

Automatically checked against source and license rules; no manual editorial review.

Inspect the recorded source material

SHA-256: 684d8948b0c0d74b87410e8cac9d33788b0d1019a560a8aa47726ecdf051735a

2026-10-02T07:57:43.942Z

Source file / repository
# 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/)

![Preview](public/og-image.png)

## 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)
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.