ViteReactPortfolio

personal-brand-site-template — Vite Portfolio Template

By solutionsystempro

An open-source personal brand website template for consultants, coaches, freelancers and creators, built on Vite, React, TypeScript and Tailwind CSS. All copy is centralized in src/content.ts and colors in tailwind.config.js, and it can be deployed to Vercel and other static hosts.

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-12View source

What stands out

A quick read of the recorded project description.

01

All copy, links, stats, Offers, FAQ and SEO tags are edited in a single file, src/content.ts

02

Color tokens are centralized in the brand object in tailwind.config.js, allowing adjustment of seven colors including primary, ink and muted

03

The home page includes Hero, Problem, Origin story, Proof, Offers, Free guide, FAQ and other sections, plus About, Contact and 404 pages

04

Includes semantic HTML, visible focus rings, skip links, a keyboard-friendly FAQ accordion, prefers-reduced-motion support and WCAG AA text contrast by default

05

No backend, no analytics, no tracking and no API keys; forms can connect to Formspree, Kit or other email tools that provide an action URL

06

Provides one-click Vercel deployment and SPA rewrite configuration, and can also be deployed to Netlify, Cloudflare Pages, GitHub Pages and other static hosts

Template Details

The template provides Home, About, Contact and 404 pages. The home page includes Hero, Problem, Origin story, Proof (stats and sample testimonials), Offers, Free guide (email collection), Who it is for / not for, Community, FAQ and a final call to action, along with a sticky header, an accessible mobile menu and a footer with social links. All copy, links, stats, Offers, FAQ and SEO tags are centralized in src/content.ts, and color tokens are centralized in the brand object in tailwind.config.js. The template includes semantic HTML, visible focus rings, skip links, a keyboard-friendly FAQ accordion, support for prefers-reduced-motion and WCAG AA text contrast by default, with responsive coverage from 360px phones to 1440px desktops. The project has no backend, no analytics, no tracking and no API keys; the free guide form and contact form are plain HTML forms that POST to a custom URL, and before configuration, submitting shows a "not connected yet" notice. The README also states that dependency versions are pinned and lists 11 findings (6 high, 5 medium) reported by npm audit as of October 11, 2026, involving the Tailwind CSS build-time file watcher, the Vite local development server, and open redirect and SSR hydration issues in React Router; the template is client-side rendered only, and link targets are set by the user in content.ts or fixed in the template code. Fonts are loaded from Google Fonts and can be changed to self-hosted.

ViteReactPortfolio

Is it right for your project?

Use Cases

  • Consultants, coaches, freelancers or creators building a personal brand website
  • Needing to quickly launch a static site with Home, About, Contact and 404 pages
  • Wanting to update site-wide copy and SEO tags by editing a single content file
  • Needing to connect a free guide or contact form to third-party email services such as Formspree or Kit
  • Deploying to Vercel or other static hosting platforms and using SPA fallback to support direct access to sub-routes

Suitable For

  • Consultants, coaches, freelancers and creators
  • Developers familiar with or willing to use Vite, React, TypeScript and Tailwind CSS
  • Users who need a static personal brand website with no backend and no tracking
  • Users preparing to deploy the site to Vercel or other static hosting platforms

Getting started & customization

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

  1. 1

    Requires Node.js 18 or newer; after cloning the repository, run npm install, then npm run dev to start the local development server

  2. 2

    Edit src/content.ts to replace all [bracketed] placeholder content, and replace sample testimonials with real reviews obtained with client permission

  3. 3

    Modify the brand color tokens in tailwind.config.js, and update the theme-color in index.html and the hex colors in the SVGs in /public accordingly

  4. 4

    Replace the placeholder images in /public with actual images; for the social preview image, it is recommended to export a 1200x630 PNG and update og:image and twitter:image in index.html

  5. 5

    In src/content.ts, set the form endpoint URLs for leadMagnet.formAction and contact.formAction, and adjust emailFieldName according to the provider

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

  • Free use, modification, commercial use and distribution of this version's code are permitted.
  • 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 README mentions the Formspree form service; real submissions require configuring a service endpoint, and its usage quotas and fees must be checked separately.
  • Demo images, fonts, icons and other third-party assets must be checked against their respective licenses and cannot be judged solely by the code's MIT license.
  • External services such as domains, hosting, databases, payments or AI may incur additional charges.
  • Testimonials in the template are sample content and must be replaced with real reviews obtained with client permission before launch; fabricated testimonials must not be published.
  • The free guide form and contact form are not connected to any backend by default; before formAction is configured, submitting only shows a "not connected yet" notice and does not send data.
  • Using Formspree to receive form submissions requires creating a form on formspree.io and obtaining an endpoint URL.
  • Using Kit (ConvertKit) to receive form submissions requires creating a form in Kit and copying its action URL.
  • Connecting to other email tools such as Mailchimp, Tally, Basin or Getform requires providing an action URL and setting the correct emailFieldName.
  • The esbuild vulnerability in Vite 5.4.21 only affects the local development server; do not expose npm run dev to the public internet.
  • The open redirect vulnerability in React Router 6.30.6 can only be triggered when user-provided links are added; by default, template links are fixed by the user or template code.
  • Fonts are loaded from Google Fonts by default, which generates third-party requests; to avoid this, switch to self-hosted fonts.
  • It can be used free of charge for personal and commercial sites, but the LICENSE file must be retained in code copies; no visible attribution is required on the site.
View Original Text Basis

Permission is hereby granted, free of charge

Original License Text

- The testimonials are clearly marked **examples**. Replace them with real quotes from real clients, with their permission, before you launch. Do not publish invented testimonials.

Original README

The free guide form and the contact form are plain HTML forms that POST to any URL you choose. There is no backend to run. Until you add a URL, submitting shows a friendly "not connected yet" message, so nothing is sent anywhere.

Original README

1. Create a form at [formspree.io](https://formspree.io).

Original README

1. In Kit, create a form and open its embed options (HTML).

Original README

Mailchimp, Tally, Basin, Getform and most email tools give you an HTML form with an `action` URL. Copy the URL into `formAction` and set `emailFieldName` to the input name they use.

Original README

- **Vite 5.4.21** (high, via moderate `esbuild`): affects the local dev server only. Do not expose `npm run dev` to the internet. npm's suggested fix is `vite` 8.3.4, a breaking upgrade.

Original README

- **React Router 6.30.6** (moderate): an open redirect via backslash paths in `<Link>` and `useNavigate`, and a server-side rendering hydration issue. The advisories cover versions below 7.18.0, and npm's suggested fix is `react-router-dom` 7.18.4, a breaking upgrade. This site renders on the client only and link targets are either set by you in `content.ts` or fixed in the template code (such as the logo link to `/`). None come from visitors, so neither path is reachable unless you add user-supplied links.

Original README

Fonts load from Google Fonts (a third-party request, no tracking). To self-host instead, remove the `<link>` tags in `index.html` and add the font files to `public/`.

Original README

You are free to use this template for personal and commercial sites. Keep the LICENSE file in your copy of the code. A visible credit on your site is not required.

Original README
https://github.com/solutionsystempro/personal-brand-site-template/blob/main/LICENSEhttps://github.com/solutionsystempro/personal-brand-site-template/blob/main/README.md

Compiled by DeepSeek based on repository license and README ·2026-10-12. 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 · 85 / 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-12
Screenshot last checked
2026-10-12

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.

Review declaration: codex-user-requested-batch-review-20261017 · 2026-10-16

Inspect the recorded source material

SHA-256: ac18c26a32f483a96a3021f0e1e3cb996d586b497daa6f625ed591e6b2ec3909

2026-10-12T18:56:29.512Z

Source file / repository
# Personal Brand Site Template

A free, open-source website template for consultants, coaches, freelancers and creators.
Edit one content file, change seven colours if you want, and deploy to Vercel in a few minutes.

[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https://github.com/solutionsystempro/personal-brand-site-template)

**Live demo:** [personal-brand-site-template.vercel.app](https://personal-brand-site-template.vercel.app)

![Template home page, hero section](docs/screenshot.png)

## What you get

- **Home page** with Hero, Problem, Origin story, Proof (stats and example testimonials), Offers, Free guide (email capture), Who it is for / not for, Community, FAQ and a final call to action.
- **About**, **Contact** and **404** pages.
- Sticky header with an accessible mobile menu, plus a footer with social links.
- **All copy in one file:** `src/content.ts`.
- **All colours in one place:** `tailwind.config.js`.
- Per-page title, description, Open Graph and canonical tags.
- Accessible by default: semantic HTML, visible focus rings, skip link, keyboard-friendly FAQ accordion, `prefers-reduced-motion` respected, WCAG AA text contrast.
- Responsive from 360px phones to 1440px desktops.
- No backend, no analytics, no tracking, no API keys.

**Stack:** Vite 5, React 18, TypeScript, Tailwind CSS 3, React Router 6, Lucide icons. All dependency versions are pinned.

## Quick start

You need [Node.js](https://nodejs.org) 18 or newer.

**macOS / Linux (Terminal)**

```bash
git clone https://github.com/solutionsystempro/personal-brand-site-template.git my-site
cd my-site
npm install
npm run dev
```

**Windows (PowerShell)**

```powershell
git clone https://github.com/solutionsystempro/personal-brand-site-template.git my-site
cd my-site
npm install
npm run dev
```

Open the URL Vite prints (usually http://localhost:5173). Changes show up as you save.

| Command           | What it does                                  |
| ----------------- | --------------------------------------------- |
| `npm run dev`     | Start the local dev server                    |
| `npm run build`   | Type-check and build the site into `dist/`    |
| `npm run preview` | Serve the built site locally to check it      |

## Make it yours

### 1. Edit your content

Open `src/content.ts`. Every headline, paragraph, link, stat, offer, FAQ and SEO tag lives there, grouped by section with comments.

- Anything in `[square brackets]` is a placeholder. Search the file for `[` to find what is left.
- The testimonials are clearly marked **examples**. Replace them with real quotes from real clients, with their permission, before you launch. Do not publish invented testimonials.
- To reorder or remove home page sections, edit `src/pages/Home.tsx`.

### 2. Change the colours

Open `tailwind.config.js` and edit the `brand` object at the top:

| Token          | Default   | Used for                                   |
| -------------- | --------- | ------------------------------------------ |
| `primary`      | `#2563EB` | Buttons, links, key accents                |
| `primary-dark` | `#1E40AF` | Hover states, text on soft blue            |
| `primary-soft` | `#EAF1FF` | Tinted chips, icon backgrounds             |
| `ink`          | `#0F172A` | Headings and main text                     |
| `muted`        | `#475569` | Body copy and secondary text               |
| `surface`      | `#F5F8FE` | Alternate section backgrounds              |
| `border`       | `#DCE5F3` | Card outlines and dividers                 |

Keep `ink` and `muted` dark enough to stay readable on white (a contrast checker such as WebAIM's helps). Also update `theme-color` in `index.html` and the hex values inside the SVGs in `/public` if you want them to match.

### 3. Swap the images

Placeholder images live in `/public`:

| File              | Where it shows                      | Suggested size |
| ----------------- | ----------------------------------- | -------------- |
| `headshot.svg`    | Hero and About page                 | 960 x 1120     |
| `story.svg`       | Origin story section                | 1120 x 1280    |
| `guide.svg`       | Free guide cover                    | 680 x 880      |
| `og-image.svg`    | Link previews on social media       | 1200 x 630     |
| `favicon.svg`     | Browser tab icon                    | square         |

You can use `.jpg`, `.png` or `.webp` instead. Drop the file in `/public` and update the path in `src/content.ts`.

**Social preview image:** most social networks do not render SVG previews. Export a 1200 x 630 PNG, save it as `public/og-image.png`, and update `site.ogImage` in `src/content.ts` and the two `og:image` / `twitter:image` tags in `index.html`.

### 4. Update the default SEO tags

Link-preview crawlers do not run JavaScript, so they read the tags in `index.html`. Update the title, description and image there to match `src/content.ts`. Each page also sets its own title and description at runtime from the `seo` block in `src/content.ts`. Set `site.url` to your real domain so canonical and Open Graph URLs are correct.

## Connect the email forms

The free guide form and the contact form are plain HTML forms that POST to any URL you choose. There is no backend to run. Until you add a URL, submitting shows a friendly "not connected yet" message, so nothing is sent anywhere.

### Formspree (works for both forms)

1. Create a form at [formspree.io](https://formspree.io).
2. Copy its endpoint, for example `https://formspree.io/f/abcdwxyz`.
3. In `src/content.ts`, set `leadMagnet.formAction` (and/or `contact.formAction`) to that URL.
4. Leave `leadMagnet.emailFieldName` as `"email"`.

### Kit (ConvertKit)

1. In Kit, create a form and open its embed options (HTML).
2. Copy the `action` URL from the embed code, for example `https://app.kit.com/forms/1234567/subscriptions` (older accounts show `app.convertkit.com`).
3. Set `leadMagnet.formAction` to that URL.
4. Set `leadMagnet.emailFieldName` to `"email_address"`.

### Any other provider

Mailchimp, Tally, Basin, Getform and most email tools give you an HTML form with an `action` URL. Copy the URL into `formAction` and set `emailFieldName` to the input name they use.

## Deploy

### Vercel (one click)

Click the **Deploy with Vercel** button at the top. Vercel copies the repo to your GitHub account and deploys it. Every push to your main branch redeploys automatically.

### Vercel (from your own copy)

1. Push your copy to GitHub.
2. In Vercel, choose **Add New > Project** and import the repo.
3. Vercel detects Vite. The defaults (`npm run build`, output `dist`) are correct.

`vercel.json` rewrites every path to `index.html`, so routes like `/about` work when visited directly.

### Other hosts

Any static host works (Netlify, Cloudflare Pages, GitHub Pages). Build with `npm run build`, publish the `dist` folder, and add a single-page-app fallback so unknown paths serve `index.html`.

## Sitemap and robots

`public/robots.txt` allows all crawlers. After you deploy, add a `public/sitemap.xml` listing your pages, for example:

```xml
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://www.yourdomain.com/</loc></url>
  <url><loc>https://www.yourdomain.com/about</loc></url>
  <url><loc>https://www.yourdomain.com/contact</loc></url>
</urlset>
```

Then uncomment the `Sitemap:` line in `robots.txt` and point it at that file.

## Project structure

```
public/             Images, favicon, robots.txt
src/
  content.ts        All site copy, links and SEO  <- edit this
  pages/            Home, About, Contact, NotFound
  sections/         One file per home page section
  components/       Header, Footer, Button, forms, SEO hook
  index.css         Base styles and focus rings
tailwind.config.js  Colour tokens and fonts        <- and this
index.html          Default meta tags and fonts
vercel.json         SPA rewrite for Vercel
```

## Notes on dependencies

Versions are pinned exactly. On 11 October 2026, `npm audit` reported 11 findings (6 high, 5 moderate) in three groups:

- **Tailwind CSS 3.4.19** (high): `braces`, `micromatch`, `fast-glob` and `chokidar` in Tailwind's build-time file watcher, plus moderate `postcss-nested` and `postcss-selector-parser`. Build-time only, nothing ships to visitors. npm's suggested fix is `tailwindcss` 4.3.3, a breaking upgrade.
- **Vite 5.4.21** (high, via moderate `esbuild`): affects the local dev server only. Do not expose `npm run dev` to the internet. npm's suggested fix is `vite` 8.3.4, a breaking upgrade.
- **React Router 6.30.6** (moderate): an open redirect via backslash paths in `<Link>` and `useNavigate`, and a server-side rendering hydration issue. The advisories cover versions below 7.18.0, and npm's suggested fix is `react-router-dom` 7.18.4, a breaking upgrade. This site renders on the client only and link targets are either set by you in `content.ts` or fixed in the template code (such as the logo link to `/`). None come from visitors, so neither path is reachable unless you add user-supplied links.

Run `npm audit` yourself for the current state.

Fonts load from Google Fonts (a third-party request, no tracking). To self-host instead, remove the `<link>` tags in `index.html` and add the font files to `public/`.

## License

MIT. Copyright (c) 2026 Ian Ryan Kirk. See [LICENSE](LICENSE).
You are free to use this template for personal and commercial sites. Keep the LICENSE file in your copy of the code. A visible credit on your site is not required.
Report a correction

Explore similar templates

Compare previews and descriptions within the same stack and category.