Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
58 commits
Select commit Hold shift + click to select a range
c33f08f
Test deployment to dev
jakebodea Feb 5, 2026
7ff60ea
Add DEV banner for dev branch deployments
jakebodea Feb 5, 2026
1341e2f
Update Next.js to 15.5.12
jakebodea Feb 5, 2026
cd96393
Merge main into dev
jakebodea Feb 5, 2026
eb9c264
Exclude scripts from build, update Next.js to 15.5.12
jakebodea Feb 5, 2026
0bf6829
Add full notion.ts with blog support, update Next.js to 16.1.6
jakebodea Feb 5, 2026
bcdc995
Complete frontend redesign: new theme, top nav, minimal layout
jakebodea Feb 5, 2026
883bcfc
Add caching for Notion API calls with background prefetch
jakebodea Feb 5, 2026
070b365
Add mobile navigation overhaul with hamburger menu and sticky titles
jakebodea Feb 5, 2026
b51156d
Fix keyboard shortcut tooltips not showing on desktop
jakebodea Feb 5, 2026
9f47934
Add CLAUDE.md for Claude Code guidance
jakebodea Feb 5, 2026
2c19eb8
Add Vercel Analytics
jakebodea Feb 5, 2026
c8f0e29
Remove unnecessary console logs and Simple Analytics
jakebodea Feb 5, 2026
2be74bc
Remove GitHub Actions and Notion check scripts
jakebodea Feb 5, 2026
4eddab2
Update docs and config for Vercel deployment
jakebodea Feb 5, 2026
231bf1f
Update bun.lock
jakebodea Feb 5, 2026
cf217cd
Remove dead toast code, add GPT-slop toast
jakebodea Feb 5, 2026
8d0f5cf
Add unified PageWrapper component for consistent page layouts
jakebodea Feb 5, 2026
6436a06
Add unfurl exit animation to mobile menu
jakebodea Feb 5, 2026
f43507d
Add page transition animations with directional swipe
jakebodea Feb 5, 2026
c7c0c0d
Disable swipe animation on mobile, fix vertical drift
jakebodea Feb 5, 2026
f3ce218
Use variant props instead of className on PageTitle components
jakebodea Feb 5, 2026
ca151cd
Add CI workflow with lint, typecheck, and build
jakebodea Feb 5, 2026
962be45
Fix fetch type error for Next.js revalidate option
jakebodea Feb 5, 2026
d1e80f4
Make quotes page dynamic to avoid build-time env vars
jakebodea Feb 5, 2026
af17f92
Merge pull request #6 from jakebodea/refactor
jakebodea Feb 5, 2026
5a05425
Remove redundant CI trigger on push to main/dev
jakebodea Feb 5, 2026
624615d
Merge pull request #7 from jakebodea/fix/ci-trigger
jakebodea Feb 5, 2026
91f3da3
Move dev tag to top left
jakebodea Feb 5, 2026
4287603
Merge pull request #8 from jakebodea/fix/dev-tag-position
jakebodea Feb 5, 2026
9a0821d
Add theme dropdown with animated icon morphing
jakebodea Feb 8, 2026
a292361
Merge pull request #11 from jakebodea/feat/theme-dropdown
jakebodea Feb 8, 2026
910c758
Fix nav indicator animation when navigating from scrolled page
jakebodea Feb 8, 2026
3b60838
Merge origin/dev into fix/nav-indicator-scroll
jakebodea Feb 8, 2026
445ba6b
Merge pull request #12 from jakebodea/fix/nav-indicator-scroll
jakebodea Feb 8, 2026
dbb33a5
Fix theme dropdown tooltip and refactor to Radix DropdownMenu (#13)
jakebodea Feb 8, 2026
e1bc3ff
Sticky page title on desktop + theme dropdown fixes (#14)
jakebodea Feb 8, 2026
84fd147
Fix blog page animations and scrollbar shimmer (#18)
jakebodea Feb 10, 2026
b40bbed
Add contact page with styling and animations (#19)
jakebodea Feb 10, 2026
136deab
Add circular reveal animation for theme transitions (#21)
jakebodea Feb 10, 2026
c3c4e5a
Add projects page with project cards and embedded tweets
jakebodea Feb 10, 2026
0037470
Style project card titles white and use transparent ghost button hover
jakebodea Feb 10, 2026
9376cb5
Taller desktop nav and conditional nav background for pages without s…
jakebodea Feb 10, 2026
1e830e0
Add gradient fade below nav and sticky title on scroll
jakebodea Feb 10, 2026
33b6f3d
Revert nav to compact height and clean up gradient rendering
jakebodea Feb 10, 2026
f58f893
Improve secondary badge contrast with translucent foreground fill
jakebodea Feb 10, 2026
f7ebf33
Add GitHub contributions calendar to projects page
jakebodea Feb 10, 2026
76cae12
Add "and more..." text below projects list
jakebodea Feb 10, 2026
671ee34
Swap projects and timeline nav tab order
jakebodea Feb 10, 2026
a8b4a38
Fix hydration mismatch by deferring GitHub calendar render to client
jakebodea Feb 10, 2026
4f16f1d
Merge pull request #22 from jakebodea/feat/projects-page
jakebodea Feb 10, 2026
252d4a5
update home page: add bio, remove tacky line, add contact link, fix a…
jakebodea Feb 12, 2026
bd0d606
fix: correct page transition direction and centralize nav config
jakebodea Feb 12, 2026
baa9d3f
fix: remove as const to resolve TypeScript errors for readonly compat…
jakebodea Feb 12, 2026
2316064
Merge pull request #25 from jakebodea/fix/nav-transition-shared-config
jakebodea Feb 12, 2026
fc1e634
fix(contact): prevent open line shift, even spacing between links
jakebodea Feb 12, 2026
39097b6
Merge pull request #26 from jakebodea/fix/contact-comment-spacing
jakebodea Feb 12, 2026
d98193b
Merge main into dev: resolve package.json conflicts
jakebodea Feb 12, 2026
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
45 changes: 44 additions & 1 deletion .eslintrc.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,53 @@
{
"extends": ["next/core-web-vitals", "next/typescript"],
"plugins": ["check-file"],
"rules": {
"max-lines": ["warn", { "max": 300, "skipBlankLines": true, "skipComments": true }],
"check-file/filename-naming-convention": [
"error",
{ "**/*.{js,ts,jsx,tsx}": "KEBAB_CASE" },
{ "ignoreMiddleExtensions": true }
],
"check-file/folder-naming-convention": [
"error",
{ "src/**/!(*\\[*\\]|*\\(*\\))": "KEBAB_CASE", "app/**/!(*\\[*\\]|*\\(*\\))": "KEBAB_CASE" }
],
"@typescript-eslint/no-unused-vars": ["error", { "argsIgnorePattern": "^_" }],
"indent": ["error", 2, { "SwitchCase": 1 }],
"@typescript-eslint/no-explicit-any": "warn",
"@typescript-eslint/consistent-type-imports": ["error", { "prefer": "type-imports" }],
"react/self-closing-comp": ["error", { "component": true, "html": true }],
"react/jsx-boolean-value": ["error", "never"],
"react/jsx-curly-brace-presence": ["error", { "props": "never", "children": "never" }],
"react/hook-use-state": "error",
"react-hooks/exhaustive-deps": "warn",
"react/forbid-component-props": ["error", {
"forbid": [{
"propName": "className",
"allowedFor": ["div", "span", "button", "input", "a", "img", "ul", "li", "ol", "p", "h1", "h2", "h3", "h4", "h5", "h6", "section", "article", "nav", "header", "footer", "main", "form", "label", "table", "thead", "tbody", "tr", "td", "th", "svg", "path", "textarea", "select", "option", "pre", "code", "blockquote", "hr", "br", "strong", "em", "small", "sup", "sub", "cite", "Link", "Image", "motion.div", "motion.span", "motion.section", "motion.article", "motion.ul", "motion.li", "motion.p", "motion.button", "motion.a", "motion.nav", "motion.header", "ArrowLeft", "Check", "CheckSquare", "Copy", "Search", "Square", "Sun", "Moon", "Database", "Skeleton"],
"message": "Use variant props instead of className on design system components"
}]
}]
},
"overrides": [
{
"files": ["next-env.d.ts"],
"rules": {
"@typescript-eslint/triple-slash-reference": "off"
"@typescript-eslint/triple-slash-reference": "off",
"check-file/filename-naming-convention": "off"
}
},
{
"files": ["components/**/*.tsx"],
"rules": {
"react/forbid-component-props": "off"
}
},
{
"files": ["lib/notion.ts"],
"rules": {
"max-lines": "off",
"@typescript-eslint/no-explicit-any": "off"
}
}
]
Expand Down
72 changes: 0 additions & 72 deletions .github/workflows/check-quotes.yml

This file was deleted.

28 changes: 28 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: CI

on:
pull_request:
branches: [main, dev]

jobs:
check:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- uses: oven-sh/setup-bun@v2
with:
bun-version: latest

- name: Install dependencies
run: bun install --frozen-lockfile

- name: Lint
run: bun run lint

- name: Type check
run: bun run tsc

- name: Build
run: bun run build
86 changes: 0 additions & 86 deletions .github/workflows/nextjs.yml

This file was deleted.

3 changes: 0 additions & 3 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
.pnp.js
.yarn/install-state.gz

# scripts generated files
quotes-hash.txt

# testing
/coverage

Expand Down
55 changes: 55 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# CLAUDE.md

This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.

## Commands

```bash
bun run dev # Start development server
bun run build # Production build
bun run lint # Run ESLint with --fix
```

Always use Bun, not Node.js/npm/pnpm. Bun automatically loads `.env` files.

## Architecture

**Stack**: Next.js 16 (App Router) + TypeScript + Tailwind CSS + Shadcn UI + Framer Motion

**Deployed on Vercel** with ISR (Incremental Static Regeneration). Notion content auto-refreshes hourly via `revalidate: 3600` in fetch calls.

### Content Sources
- **Quotes**: Fetched from Notion API, cached 1 hour, client-side searchable
- **Blogs**: Markdown files in `/content/blogs/`, parsed with gray-matter
- **Timeline**: Static TypeScript data in `/content/timeline-data.ts`

### Key Files
- `lib/notion.ts` - All Notion API integration (exempted from max-lines rule)
- `lib/quotes.ts` - Quote fetching entry point
- `lib/blogs.ts` - Markdown blog loading with search
- `app/layout.tsx` - Root layout with Vercel Analytics

### Server vs Client Components
- Pages are server components by default
- `"use client"` used for interactive components (TopNav, search features)

## Code Standards

### Naming (enforced via ESLint)
- Files: `kebab-case` (e.g., `top-nav.tsx`)
- Folders: `kebab-case` (except `[slug]` and `(groups)` for Next.js routing)
- Max 300 lines per file (exceptions: `lib/notion.ts`)

### TypeScript
- Use `type` imports: `import type { Foo } from './bar'`
- Unused vars must be prefixed with `_`

### React/JSX
- Self-closing components: `<Component />` not `<Component></Component>`
- No unnecessary boolean values: `disabled` not `disabled={true}`
- No unnecessary curly braces: `prop="value"` not `prop={"value"}`

### Styling
- Use variant props on Shadcn UI components, not `className`
- `className` allowed only on HTML primitives, Link, Image, and motion.* components
- Component files in `/components/` are exempt from this rule
Loading