Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
4b21436
feat: add blog post retrieval functions
Thompson-Jason Dec 16, 2025
a33b67d
chore: update dependencies in package.json to include prismjs and rem…
Thompson-Jason Dec 16, 2025
7118bb0
feat: add BlogPage component to display blog posts
Thompson-Jason Dec 16, 2025
1aea53c
feat: implement BlogPost component for dynamic blog post rendering
Thompson-Jason Dec 16, 2025
d62089b
fix: update FormatPathName function to replace hyphens in path names
Thompson-Jason Dec 16, 2025
9ba4161
fix: add entry to .gitignore for local sample blog posts
Thompson-Jason Dec 16, 2025
06b5462
feat: enhance blog post metadata handling and add description generat…
Thompson-Jason Dec 16, 2025
1cfed90
feat: enhance BlogPage layout and improve post rendering with tags an…
Thompson-Jason Dec 16, 2025
2657335
feat: enhance BlogPost component with improved layout, metadata gener…
Thompson-Jason Dec 16, 2025
eb2d464
style: adjust z-index for improved mobile navigation visibility in Na…
Thompson-Jason Dec 17, 2025
6b582b6
Merge pull request #28 from Thompson-Jason/update_mobile_layout
Thompson-Jason Dec 17, 2025
5d0f9f0
fix: add hello-world.md to .gitignore to prevent tracking of local sa…
Thompson-Jason Dec 19, 2025
3901826
chore: add @tailwindcss/typography dependency to enhance text styling…
Thompson-Jason Dec 19, 2025
15e0e47
feat: add BlogLayout component and improve BlogPage post description …
Thompson-Jason Dec 19, 2025
4f30b6e
feat: implement transition navigation context and enhance navigation …
Thompson-Jason Dec 19, 2025
ea21d60
feat: add typography plugin to Tailwind CSS configuration for enhance…
Thompson-Jason Dec 19, 2025
72dc816
refactor: rename event parameter in click handlers for consistency
Thompson-Jason Dec 19, 2025
cc1fd72
Merge remote-tracking branch 'origin/develop' into blog
Thompson-Jason Dec 19, 2025
6c6def1
docs: update README to enhance project description and clarify blog c…
Thompson-Jason Dec 19, 2025
78ef6f7
feat: add introductory blog post explaining the purpose and structure…
Thompson-Jason Dec 19, 2025
5db4780
refactor: add TypeScript interface for NavLink props to improve type …
Thompson-Jason Dec 20, 2025
00b20f8
Merge pull request #29 from Thompson-Jason/blog
Thompson-Jason Dec 20, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# Ignore local sample blog posts
content/blog/sample-*.md
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
Expand Down Expand Up @@ -39,3 +41,4 @@ next-env.d.ts
#Idea
.idea/
.idea/personal-website.iml
content/blog/hello-world.md
40 changes: 38 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
# [Personal Website](https://jasonthompson.org)

This is the source code for my personal website, built with Next.js, TypeScript, and Tailwind CSS. The site showcases my portfolio, skills, and contact information, and is designed for performance, accessibility, and modern best practices.
This is the source code for my personal website, built with Next.js (App Router), TypeScript, and Tailwind CSS. The site includes a portfolio, skills, contact form, and a Markdown-powered blog, with a focus on performance, accessibility, and modern best practices.

## Features

- **Next.js App Router**: Server-side rendering, static site generation, and API routes.
- **Next.js App Router**: Page routing, layouts, and static rendering.
- **TypeScript**: End-to-end type safety and strict configuration.
- **Tailwind CSS**: Custom semantic color system and responsive design.
- **Blog**: Markdown posts with frontmatter (via `gray-matter`).
- **Page Transitions**: Framer Motion “curtain” transition that delays navigation until the screen is fully covered.
- **Accessibility**: ARIA roles, focus styles, keyboard navigation, and semantic HTML.
- **SEO**: Per-page metadata, OpenGraph, robots.txt, and sitemap.xml.
- **Security**: Content Security Policy, security headers, and client-side rate limiting.
Expand All @@ -15,17 +17,51 @@ This is the source code for my personal website, built with Next.js, TypeScript,
- **Mobile Friendly**: Responsive layouts, touch targets, and mobile navigation.
- **Developer Experience**: Utilities for analytics, rate limiting, and reusable style constants.

## Getting Started

- Install dependencies: `npm install`
- Run locally: `npm run dev`
- Production build: `npm run build`
- Start production server: `npm run start`

## Project Structure

- `src/app/` — Next.js app directory (pages, layouts, API, etc.)
- `src/components/` — Reusable React components
- `src/constants/` — Design tokens and style constants
- `src/data/` — Portfolio and skills data
- `src/lib/` — Shared helpers (e.g., blog parsing)
- `src/util/` — Utilities (rate limiting, analytics)
- `content/blog/` — Markdown blog posts
- `public/` — Static assets (images, robots.txt, etc.)
- `tailwind.config.ts` — Tailwind CSS configuration
- `tsconfig.json` — TypeScript configuration

## Blog Content

Blog posts live in `content/blog/*.md` and are parsed with `gray-matter`.

Frontmatter fields used by the site:

- `title`
- `date`
- `description`
- `tags` (optional)

## Transitions (How Navigation Works)

The site uses a Framer Motion curtain transition to avoid flashing the next page before the transition is fully covering the screen:

- Clicking a navbar link triggers `startNavigate(...)` via a context hook.
- The curtain animates up (cover).
- Only once fully covered, the router navigates.
- Once the new route is active, the curtain animates down (reveal).

Key files:

- `src/components/transitionProvider.tsx`
- `src/components/transitionNavigation.tsx`

## Improvements & Highlights

- Comprehensive metadata and SEO for all pages
Expand Down
65 changes: 65 additions & 0 deletions content/blog/Why-I-Added-a-Blog-to-My-Personal-Site.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
---
title: "Why I Added a Blog to My Personal Site"
date: "2025-12-19"
tags: ["personal-site", "nextjs", "blog"]
---

I’ve had a personal website for a while now, but until recently it was mostly static: a short bio, a resume, and a portfolio. Useful, but finished. The problem with finished things is that they don’t really reflect how I actually work.

I decided to add a blog not because I want to become a “content creator,” but because I wanted a place to write things down publicly as I build, learn, and occasionally get stuck.

## Why add a blog at all?

Most of my day-to-day learning already ends up somewhere: scratch notes, README files, random Markdown docs, or half-forgotten Slack threads. A blog felt like a way to bring some of that together in one place.

Writing helps me think. It forces me to slow down and explain things clearly, even if the only guaranteed reader is future me. If something here ends up being useful to someone else, that’s a bonus.

## The constraints I cared about

I didn’t want this to turn into a side project that needed constant care. I set a few constraints up front:

- Static hosting only
- No database
- No CMS
- Markdown files in Git
- Fast builds

If posting ever felt like friction, I knew I just wouldn’t do it.

## How the blog is built

This site is built with Next.js using the App Router and statically exported. Blog posts live as Markdown files in the repo, and the site is generated at build time.

A few details I cared about more than I expected:

- Each post has proper metadata, including titles, descriptions, and canonical URLs
- Links generate clean previews when shared
- Everything works without a server

None of this is particularly novel, but it’s solid, predictable, and easy to maintain, which is exactly what I wanted.

## What I plan to write about

This blog will mostly be notes from things I’m already doing:

- Building and refining side projects
- Things I learn at work that are safe to share
- Homelab experiments and setup notes
- Small problems that took longer than they should have

I’m not aiming for a strict posting schedule. I’m aiming for consistency over time.

## What’s next for the blog

The blog is intentionally simple right now, but I already have a couple quality of life improvements in mind:

- Tag filtering (so you can click a tag and see related posts)
- Search (so you can quickly find older posts)

I haven’t built either of these yet, but they’re on my list as the number of posts grows.

## Closing thoughts

This blog exists mostly for me. It’s a place to document ideas, decisions, and lessons learned so I don’t have to relearn them later.

If you’re reading this and find something helpful here down the line, that’s great. If not, that’s fine too. It’s doing its job either way.
Loading