Skip to content

Commit a7103ed

Browse files
author
calderbuild
committed
feat: homepage CRO, tag archive system, SEO fixes, and copy editing
Homepage: restructure CTAs, add RSS feed, make stats clickable, reduce posts to 3, reorder featured projects, simplify terminal block. Tags: create 20 tag archive pages + index, convert tag spans to links across all templates, standardize AI Agent -> AI Agents in 8 posts. SEO: integrate jekyll-seo-tag (replaces manual meta tags), add OG image, complete robots.txt, exclude junk from sitemap, add BlogPosting schema for posts, move ProfilePage schema to homepage only. Copy: fix Jason -> Calder across all posts, rewrite about page, update site description.
1 parent 1712c3a commit a7103ed

File tree

55 files changed

+491
-108
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+491
-108
lines changed

.claude/settings.local.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,8 @@
2828
"mcp__chrome-devtools__get_console_message"
2929
],
3030
"deny": []
31+
},
32+
"enabledPlugins": {
33+
"secondme-skills@secondme-skills": false
3134
}
3235
}

CLAUDE.md

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,19 @@ This file provides guidance to Claude Code (claude.ai/code) when working with co
44

55
## Project Overview
66

7-
Minimal Jekyll blog with Cyberpunk Brutalism design. Live at https://jasonrobert.me.
7+
Minimal Jekyll blog with Cyberpunk Brutalism design. Live at https://calderbuild.github.io.
88

99
## Development Commands
1010

1111
```bash
1212
bundle install # Install dependencies
1313
bundle exec jekyll serve # Local dev server (localhost:4000)
1414
bundle exec jekyll build # Production build to _site/
15+
JEKYLL_ENV=production bundle exec jekyll build # Validate production build locally
1516
```
1617

18+
Always run `bundle exec jekyll build` before pushing. For layout/content changes, run `serve` and verify `/`, `/blog/`, `/projects/`, `/about/`, `/archive/`, and at least one post page.
19+
1720
### Custom Slash Commands
1821

1922
- `/deploy` - Commit and push important files to GitHub (excludes docs/tests)
@@ -25,27 +28,43 @@ bundle exec jekyll build # Production build to _site/
2528

2629
`default.html` is the root layout. Both `post.html` and `page.html` extend it via `layout: default`.
2730

28-
- `default.html` -- site shell: header nav, `<main>{{ content }}</main>`, footer. Includes Google Analytics, Open Graph/Twitter meta, font loading.
31+
- `default.html` -- site shell: header nav, `<main>{{ content }}</main>`, footer. Includes Google Analytics, Open Graph/Twitter meta, JSON-LD structured data, font loading.
2932
- `post.html` -- article template with schema.org markup, prev/next navigation. Has its own `<style>` block for post-specific styles.
3033
- `page.html` -- simple title + content wrapper. Also has a page-specific `<style>` block.
3134

35+
### Pages and Routing
36+
37+
- `index.html` -- homepage: hero section, featured projects (`site.data.projects limit:3`), latest posts (`site.posts limit:6`). No pagination.
38+
- `blog/index.html` -- paginated blog listing using `paginator.posts`. This file MUST stay at `blog/index.html` (not root) for `paginate_path: "/blog/page:num/"` to work.
39+
- `projects.html` (`permalink: /projects/`) -- full project listing from `_data/projects.yml`.
40+
- `about.md` (`permalink: /about/`) -- uses `page` layout.
41+
- `archive.html` -- non-paginated chronological post list.
42+
3243
### Data Files
3344

34-
`_data/projects.yml` -- structured project data (name, tagline, description, stars, award, tech, url). Used by both `index.html` (featured projects) and `projects.html` (full listing).
45+
`_data/projects.yml` -- structured project data (name, tagline, description, stars, award, tech, url, category). Used by both `index.html` (featured projects, limit:3, filtered by `project.url`) and `projects.html` (full listing, shows "Private Project" for null URLs).
3546

3647
### CSS Architecture
3748

38-
Single stylesheet at `css/style.css` using CSS custom properties (`:root` vars). Individual layouts and pages add page-specific styles via inline `<style>` blocks at the bottom of their HTML files (`index.html`, `blog.html`, `post.html`, `page.html`, `projects.html`).
49+
Single stylesheet at `css/style.css` using CSS custom properties (`:root` vars). Individual pages add page-specific styles via inline `<style>` blocks at the bottom of their HTML files (`index.html`, `blog/index.html`, `post.html`, `page.html`, `projects.html`).
50+
51+
Key design tokens: colors (`--bg-primary: #0a0a0f`, `--accent-cyan: #00ffff`, `--accent-magenta: #ff00ff`), fonts (`--font-display: Space Mono`, `--font-body: IBM Plex Sans`, `--font-mono: JetBrains Mono`), spacing (`--space-xs` through `--space-3xl`), effects (`--glow-cyan`, `--border-glow`).
3952

40-
Key design tokens are defined as CSS custom properties: colors (`--bg-primary`, `--accent-cyan`), fonts (`--font-display`, `--font-body`, `--font-mono`), spacing (`--space-xs` through `--space-3xl`), effects (`--glow-cyan`, `--border-glow`).
53+
No JavaScript in the codebase. Mobile nav toggle uses inline `onclick` to flip a CSS class.
4154

4255
### Pagination
4356

44-
`jekyll-paginate` only works on `blog.html` (the file with `paginate_path` matching). The homepage (`index.html`) uses `site.posts limit:6` directly -- it does not paginate. The homepage also renders featured projects from `site.data.projects limit:3`.
57+
`jekyll-paginate` only works on `blog/index.html` (the file with `paginate_path` matching). The homepage (`index.html`) uses `site.posts limit:6` directly -- it does not paginate. Post permalinks follow `/blog/:year/:month/:day/:title/` from `_config.yml`.
4558

4659
### Build Constraints
4760

48-
The `Gemfile` uses the `github-pages` gem, which pins Jekyll and all plugin versions to match GitHub Pages. Do not add gems outside the [GitHub Pages dependency list](https://pages.github.com/versions/). The `future: true` config flag means future-dated posts are published.
61+
The `Gemfile` uses the `github-pages` gem, which pins Jekyll and all plugin versions to match GitHub Pages. Do not add gems outside the [GitHub Pages dependency list](https://pages.github.com/versions/). The `future: true` config flag means future-dated posts are published. `_config.yml` excludes `CLAUDE.md` from the built site.
62+
63+
## Coding Style
64+
65+
- 2-space indentation in HTML, CSS, and YAML front matter
66+
- `kebab-case` for page and asset filenames
67+
- Match existing patterns in `css/style.css`; keep selectors descriptive and grouped by section
4968

5069
## Content Guidelines
5170

@@ -73,6 +92,10 @@ tags:
7392
---
7493
```
7594

95+
## Commits
96+
97+
Conventional Commit style: `feat:`, `fix:`, `refactor:`, `perf:`, `chore:`, `docs:`. Scopes optional (e.g., `fix(seo): ...`). Keep commits atomic.
98+
7699
## Deployment
77100

78101
Push to `master` triggers GitHub Actions (`.github/workflows/jekyll.yml`). Ruby 3.1, auto-deploys to GitHub Pages. No manual build step needed.

_config.yml

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# Minimal Jekyll Configuration
33

44
title: "Calder's Lab"
5-
description: "Agent Developer building AI-driven MVPs, multi-agent systems, and open source tools."
5+
description: "Calder ships multi-agent systems and AI-driven MVPs from idea to production. 1.6k+ GitHub stars, 4 hackathon wins."
66
url: "https://calderbuild.github.io"
77
baseurl: ""
88
author: "Calder"
@@ -23,17 +23,33 @@ plugins:
2323
- jekyll-paginate
2424
- jekyll-seo-tag
2525
- jekyll-sitemap
26+
- jekyll-feed
2627

2728
kramdown:
2829
input: GFM
2930
syntax_highlighter_opts:
3031
block:
3132
line_numbers: true
3233

33-
# Social
34+
# Social / jekyll-seo-tag
35+
twitter:
36+
username: CalderBuild
37+
card: summary_large_image
38+
social:
39+
name: Calder
40+
links:
41+
- https://github.com/calderbuild
42+
- https://x.com/CalderBuild
3443
github_username: calderbuild
3544
twitter_username: CalderBuild
3645

46+
# Default front matter values
47+
defaults:
48+
- scope:
49+
path: ""
50+
values:
51+
image: /img/og-image.png
52+
3753
# Analytics
3854
ga_track_id: G-DNFKJG8R74
3955

@@ -61,6 +77,9 @@ exclude:
6177
- Gemfile.lock
6278
- README.md
6379
- CLAUDE.md
80+
- AGENTS.md
81+
- calderprofile.md
82+
- docs
6483
- "*.sh"
6584
- vendor
6685
- .git

_data/projects.yml

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,6 @@
1616
url: https://github.com/calderbuild/VibeDoc
1717
category: ai
1818

19-
- name: "L'Oreal Data Insight"
20-
tagline: "B2B Natural Language Database Query"
21-
description: "Text-to-SQL agent allowing non-technical staff to query complex business databases using natural language."
22-
stars: null
23-
award: "Rising Star Prize, L'Oreal Hackathon"
24-
tech: [Text-to-SQL, NLP]
25-
url: null
26-
category: data
27-
2819
- name: WeFinance
2920
tagline: "Intelligent Financial Analysis Agent"
3021
description: "Vision LLMs achieving >90% structural extraction accuracy from complex billing images."
@@ -33,3 +24,12 @@
3324
tech: [Vision LLMs, Image Extraction]
3425
url: https://github.com/calderbuild/WeFinance
3526
category: ai
27+
28+
- name: "L'Oreal Data Insight"
29+
tagline: "B2B Natural Language Database Query"
30+
description: "Text-to-SQL agent allowing non-technical staff to query complex business databases using natural language."
31+
stars: null
32+
award: "Rising Star Prize, L'Oreal Hackathon"
33+
tech: [Text-to-SQL, NLP]
34+
url: null
35+
category: data

_layouts/default.html

Lines changed: 5 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,9 @@
33
<head>
44
<meta charset="UTF-8">
55
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6-
<title>{% if page.title %}{{ page.title }} | {% endif %}{{ site.title }}</title>
7-
<meta name="description" content="{{ page.description | default: site.description }}">
8-
<meta name="keywords" content="{{ site.keywords }}">
9-
<meta name="author" content="{{ site.author }}">
106

11-
<!-- Open Graph -->
12-
<meta property="og:title" content="{{ page.title | default: site.title }}">
13-
<meta property="og:description" content="{{ page.description | default: site.description }}">
14-
<meta property="og:type" content="{% if page.layout == 'post' %}article{% else %}website{% endif %}">
15-
<meta property="og:url" content="{{ page.url | absolute_url }}">
16-
<meta property="og:image" content="{{ site.url }}/img/og-image.png">
17-
18-
<!-- Twitter Card -->
19-
<meta name="twitter:card" content="summary_large_image">
20-
<meta name="twitter:title" content="{{ page.title | default: site.title }}">
21-
<meta name="twitter:description" content="{{ page.description | default: site.description }}">
7+
<!-- SEO: title, description, OG, Twitter Card, JSON-LD -->
8+
{% seo %}
229

2310
<!-- Fonts - Brutalist Raw + Developer Mono -->
2411
<link rel="preconnect" href="https://fonts.googleapis.com">
@@ -31,8 +18,8 @@
3118
<!-- Favicon -->
3219
<link rel="icon" type="image/x-icon" href="{{ '/img/favicon.ico' | relative_url }}">
3320

34-
<!-- Canonical -->
35-
<link rel="canonical" href="{{ page.url | absolute_url }}">
21+
<!-- RSS Feed -->
22+
{% feed_meta %}
3623

3724
{% if site.ga_track_id %}
3825
<!-- Google Analytics -->
@@ -44,26 +31,6 @@
4431
gtag('config', '{{ site.ga_track_id }}');
4532
</script>
4633
{% endif %}
47-
48-
<!-- JSON-LD Structured Data -->
49-
<script type="application/ld+json">
50-
{
51-
"@context": "https://schema.org",
52-
"@type": "ProfilePage",
53-
"mainEntity": {
54-
"@type": "Person",
55-
"name": "Calder",
56-
"alternateName": "Lin Luo",
57-
"url": "{{ site.url }}",
58-
"sameAs": [
59-
"https://github.com/calderbuild",
60-
"https://x.com/CalderBuild"
61-
],
62-
"jobTitle": "Agent Developer",
63-
"knowsAbout": ["Multi-Agent Systems", "AI Agents", "Prompt Engineering", "RAG"]
64-
}
65-
}
66-
</script>
6734
</head>
6835
<body>
6936
<!-- Header -->
@@ -100,6 +67,7 @@
10067
{% for link in site.links %}
10168
<li><a href="{{ link.url }}" target="_blank" rel="noopener">{{ link.title }}</a></li>
10269
{% endfor %}
70+
<li><a href="{{ '/feed.xml' | relative_url }}">RSS</a></li>
10371
</ul>
10472
<p class="footer-copy">&copy; {{ 'now' | date: '%Y' }} {{ site.title }}. All rights reserved.</p>
10573
</div>

_layouts/post.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ <h1 class="post-title" itemprop="headline">{{ page.title }}</h1>
2222
{% if page.tags.size > 0 %}
2323
<div class="post-tags">
2424
{% for tag in page.tags %}
25-
<span class="tag">{{ tag }}</span>
25+
<a href="/tags/{{ tag | slugify }}/" class="tag">{{ tag }}</a>
2626
{% endfor %}
2727
</div>
2828
{% endif %}

_layouts/tag.html

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
---
2+
layout: default
3+
---
4+
5+
<section class="tag-archive">
6+
<header class="tag-header container">
7+
<div class="tag-label">Tag</div>
8+
<h1 class="page-title">{{ page.tag }}</h1>
9+
<p class="tag-count">
10+
{% assign count = 0 %}
11+
{% for post in site.posts %}
12+
{% if post.tags contains page.tag %}
13+
{% assign count = count | plus: 1 %}
14+
{% endif %}
15+
{% endfor %}
16+
{{ count }} post{% if count != 1 %}s{% endif %}
17+
</p>
18+
<a href="/tags/" class="btn">All Tags</a>
19+
</header>
20+
21+
<div class="container">
22+
<div class="post-grid">
23+
{% for post in site.posts %}
24+
{% if post.tags contains page.tag %}
25+
<article class="post-card">
26+
<div class="post-meta">{{ post.date | date: "%b %d, %Y" }}</div>
27+
<h3 class="post-title">
28+
<a href="{{ post.url | relative_url }}">{{ post.title }}</a>
29+
</h3>
30+
{% if post.subtitle %}
31+
<p class="post-excerpt">{{ post.subtitle | truncate: 120 }}</p>
32+
{% elsif post.description %}
33+
<p class="post-excerpt">{{ post.description | truncate: 120 }}</p>
34+
{% endif %}
35+
{% if post.tags.size > 0 %}
36+
<div class="post-tags">
37+
{% for tag in post.tags limit:3 %}
38+
<a href="/tags/{{ tag | slugify }}/" class="tag">{{ tag }}</a>
39+
{% endfor %}
40+
</div>
41+
{% endif %}
42+
</article>
43+
{% endif %}
44+
{% endfor %}
45+
</div>
46+
</div>
47+
</section>
48+
49+
<style>
50+
.tag-header {
51+
padding: calc(80px + var(--space-3xl)) 0 var(--space-2xl);
52+
text-align: center;
53+
border-bottom: 1px solid rgba(0, 255, 255, 0.1);
54+
margin-bottom: var(--space-2xl);
55+
}
56+
57+
.tag-label {
58+
font-family: var(--font-mono);
59+
font-size: 0.75rem;
60+
text-transform: uppercase;
61+
letter-spacing: 0.1em;
62+
color: var(--accent-cyan);
63+
margin-bottom: var(--space-sm);
64+
}
65+
66+
.tag-count {
67+
font-family: var(--font-mono);
68+
font-size: 0.875rem;
69+
color: var(--text-muted);
70+
margin-bottom: var(--space-lg);
71+
}
72+
</style>

_posts/2025-01-13-ai-agent-intelligent-revolution.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,15 @@ updated: 2025-12-23 16:00:00
88
author: "Calder"
99
header-img: "img/post-bg-digital-partner.jpg"
1010
tags:
11-
- AI Agent
11+
- AI Agents
1212
- Autonomous Systems
1313
- Human-Computer Interaction
1414
- Digital Assistants
1515
- Technology Evolution
1616
seo:
1717
keywords: "AI Agent revolution, autonomous agents, task execution, human-computer interaction, AI limitations, enterprise AI deployment"
1818
author: "Calder"
19-
publisher: "Jason's Tech Blog"
19+
publisher: "Calder's Lab"
2020
---
2121

2222
<div class="lang-en" markdown="1">

_posts/2025-01-14-ai-agent-reality-check.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ date: 2025-01-14 14:30:00
77
author: "Calder"
88
header-img: "img/post-bg-reality-check.jpg"
99
tags:
10-
- AI Agent
10+
- AI Agents
1111
- Production Experience
1212
- Real Metrics
1313
- Technical Reality
@@ -18,7 +18,7 @@ tags:
1818
seo:
1919
keywords: "AI Agent reality check, production AI deployment, real AI Agent metrics, framework comparison actual usage, AI Agent failures costs, autonomous system implementation, LLM agent performance, real AI ROI analysis"
2020
author: "Calder"
21-
publisher: "Jason's Tech Blog"
21+
publisher: "Calder's Lab"
2222
tldr:
2323
- "10.6%4-8%15-25%23++"
2424
- "TOP535%API26%22%13%4%"

_posts/2025-01-15-ai-agent-deep-analysis.markdown

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ date: 2025-01-15 14:30:00
77
author: "Calder"
88
header-img: "img/post-bg-ai-analysis.jpg"
99
tags:
10-
- AI Agent
10+
- AI Agents
1111
- Production Architecture
1212
- System Design
1313
- Performance Optimization
@@ -18,7 +18,7 @@ tags:
1818
seo:
1919
keywords: "AI Agent architecture real implementation, production agent system design, multi-agent coordination patterns, AI performance optimization lessons, LangChain production experience, agent framework comparison, autonomous system architecture, real AI infrastructure costs"
2020
author: "Calder"
21-
publisher: "Jason's Tech Blog"
21+
publisher: "Calder's Lab"
2222
tldr:
2323
- "Agent20%+3+++"
2424
- "73%6.8s→4.2s-38%"

0 commit comments

Comments
 (0)