Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
113 commits
Select commit Hold shift + click to select a range
42ec83b
Feature: Upgrade Ruby to version 4.0.0
newstler Jan 3, 2026
d5b7e84
Feature: Add testimonial system with AI-generated fields and home pag…
newstler Jan 27, 2026
d375a25
Almost styled carousel
newstler Jan 27, 2026
fcace69
Styled main carousel
newstler Jan 27, 2026
344d3a8
Almost finished with testimonials carousel
newstler Jan 27, 2026
9edc091
Styling user profile testimonial
newstler Jan 27, 2026
c8b165b
Editing testimonials
newstler Jan 27, 2026
bf2138d
Validating testimonial
newstler Jan 27, 2026
d6c8ac2
Validating testimonial
newstler Jan 27, 2026
5cf82ac
Add humanizer guidelines to testimonial LLM prompts and reject_reason…
newstler Jan 27, 2026
5c00404
Fix timer reset in slider
newstler Jan 27, 2026
70d2507
Almost fixed user in carousel
newstler Jan 28, 2026
baad4f5
Styled user info everywhere
newstler Jan 28, 2026
b370863
Replaced circle avatars with ruby-shaped
newstler Jan 28, 2026
692973b
Fix company/location filtering bug
newstler Jan 28, 2026
1abb3a0
Added infinite scroll to users
newstler Jan 28, 2026
ea7957d
Stick header in community
newstler Jan 28, 2026
50e1fb8
Feature: Add big + button in every content page
newstler Jan 29, 2026
80d273b
Improve testimonial carousel mobile experience and update deployment …
newstler Jan 30, 2026
6b12088
Fix deploy.yml
newstler Jan 30, 2026
b33cf20
Styled User profile on mobile
newstler Jan 30, 2026
879791f
Migrate from ULID to UUIDv7 primary keys
newstler Jan 30, 2026
aa4715f
Move to whyruby.info
newstler Jan 30, 2026
5b3f4d0
Add rubycommunity.org as separate domain for community pages
newstler Jan 31, 2026
ee38192
Fix community link
newstler Jan 31, 2026
43de1d7
Route OAuth through primary domain for multi-domain support
newstler Jan 31, 2026
20cec09
f
newstler Jan 31, 2026
b3f0c38
Implement cross-domain OAuth with session sync for whyruby.info and r…
newstler Jan 31, 2026
39d25f2
Fix cross-domain session sync and community logo URLs
newstler Jan 31, 2026
46a1233
Styled community pages
newstler Feb 1, 2026
2fa805d
Update legal policies for multi-domain setup and reduce token expiration
newstler Feb 1, 2026
62bdfe9
Update community pages meta tags for rubycommunity.org branding
newstler Feb 1, 2026
62fbfe2
Fix community page titles to use Ruby Community branding
newstler Feb 1, 2026
fab5997
Update community pages with proper Ruby Community branding
newstler Feb 1, 2026
a530756
Replace Google Analytics with Nullitics
newstler Feb 1, 2026
b2a0da0
Fix infinite scroll routing on rubycommunity.org domain
newstler Feb 1, 2026
987e595
Add country code tracking to Nullitics analytics
newstler Feb 1, 2026
11550dd
Fix company/location filter links on user profile page
newstler Feb 1, 2026
0cce297
Upgraded Ruby version to 4.0.1
newstler Feb 1, 2026
b8179b6
Fix post URLs to always point to primary domain from community pages
newstler Feb 1, 2026
86c5ff4
Allow empty quote
newstler Feb 1, 2026
2d972ef
Fix MaxMind API: require account_id for GeoLite2 download
newstler Feb 1, 2026
8758aab
Updated favicon
newstler Feb 1, 2026
586994b
Fix user links to point to community domain in production
newstler Feb 1, 2026
24f3529
Fix edit/delete post links to always use primary domain
newstler Feb 1, 2026
ab0630e
Fix edit/delete links in post tiles to use primary domain
newstler Feb 1, 2026
9e473ba
Added Open to work
newstler Feb 1, 2026
b1371f6
Fix counters
newstler Feb 1, 2026
cb8cded
Fix stars
newstler Feb 1, 2026
76fbdba
Fix long company/location
newstler Feb 1, 2026
3f82060
Linkify links in user bio
newstler Feb 1, 2026
73c3b04
Fix toggles on mobile
newstler Feb 1, 2026
8a2f325
Fix sign-in redirect to always go to rubycommunity.org profile
newstler Feb 1, 2026
892fe6e
Migrate GitHub data fetching to GraphQL with batching
newstler Feb 2, 2026
aa593e5
Optimize performance across controllers, views, and helpers
newstler Feb 2, 2026
340c5c0
Updated community page
newstler Feb 2, 2026
6cb1247
Updated community page
newstler Feb 2, 2026
9446f2b
Styled logo to react on hover
newstler Feb 2, 2026
864d0ad
Add github production api key
newstler Feb 2, 2026
d80f0c9
Refactor minimal nav into shared partial and fix testimonial tests
newstler Feb 2, 2026
eb6b05f
Sticky menu on home page
newstler Feb 2, 2026
780e46e
Sticky menu on home page
newstler Feb 2, 2026
ae18106
Styled the menu on home page
newstler Feb 2, 2026
13c6cd5
Fix UI
newstler Feb 2, 2026
9d728e6
Add newsletter mailer with tracking and admin notifications
newstler Feb 2, 2026
7ae05dd
Corrected the flash messages
newstler Feb 2, 2026
8b821ea
Add newsletter unsubscribe and improve email templates
newstler Feb 3, 2026
1ebb12f
Rewrite newsletter v1 with improved copy and formatting
newstler Feb 3, 2026
fdf8049
Update newsletter subject line
newstler Feb 3, 2026
148b0cd
Keep only 3 app versions
newstler Feb 3, 2026
07b492c
Fix Vladimir Dementyev name spelling
newstler Feb 3, 2026
3718cd0
Add newsletter subscription toggle to profile settings
newstler Feb 4, 2026
85bd18d
Add newsletter open tracking via tracking pixel
newstler Feb 4, 2026
ca2e62e
Feature: Upgrade Ruby to version 4.0.0 (#134)
newstler Jan 3, 2026
7b5a9fc
Update newsletter subject
newstler Feb 4, 2026
fff61d9
Add automated community OG image generation
newstler Feb 5, 2026
d1ff091
Update newsletter copy to invite community contributions
newstler Feb 5, 2026
566d8e0
Fix mailer
newstler Feb 5, 2026
a45e7fe
Fix newsletter and article copy
newstler Feb 5, 2026
e3e15bf
User avatar in design
newstler Feb 5, 2026
f222d6f
Add location normalization for community filtering
newstler Feb 7, 2026
55c6ad3
Add interactive community map with geocoded user locations
newstler Feb 7, 2026
23ab886
Tweak community map marker styling and cluster behavior
newstler Feb 7, 2026
31b7967
Map affects the user list
newstler Feb 7, 2026
dcbae9f
current user link on community page
newstler Feb 7, 2026
89354c7
Styled community page
newstler Feb 7, 2026
78d96c0
Fix location normalizer missing city names and improve community map
newstler Feb 8, 2026
891431e
Add Open to work filter
newstler Feb 8, 2026
0b5b080
Fixes
newstler Feb 8, 2026
23e546e
Replace locations rake tasks with single refresh task and use gem ava…
newstler Feb 8, 2026
d690d85
bug fixes
newstler Feb 8, 2026
2ff8d25
Apply Rails performance patterns from RorVsWild article
newstler Feb 8, 2026
13ff872
Projects and trends
newstler Feb 8, 2026
fcbc5ba
Ready to deploy
newstler Feb 8, 2026
06eb394
Add timezone-aware newsletter scheduling
newstler Feb 8, 2026
a6e4bbb
Add malicious path blocker middleware
newstler Feb 8, 2026
f090715
Update article and newsletter with new community features
newstler Feb 8, 2026
20c263c
Add sorting of projects to user profile
newstler Feb 8, 2026
6120c45
UI fixes
newstler Feb 8, 2026
ca9947f
Fix legacy timezone identifiers breaking newsletter scheduling
newstler Feb 8, 2026
2f1c8e1
Community UX improvements and cross-domain fixes
newstler Feb 9, 2026
b085bdc
Add star trend display in admin and Avo resource controllers
newstler Feb 9, 2026
a4f5895
Fix brakeman security warnings and add brakeman to pre-commit hook
newstler Feb 9, 2026
a3520c8
Update AGENTS.md and README with branch changes
newstler Feb 9, 2026
3e9fd4f
docs: update README and AGENTS.md titles for both domains
newstler Feb 9, 2026
d89f770
Move article draft to docs/articles with links and images
newstler Feb 9, 2026
6328c17
Merge origin/main into feature/projects
newstler Feb 9, 2026
afb5b5c
Fix 404 for /community paths on rubycommunity.org
newstler Feb 9, 2026
ff921c0
Fix icons
newstler Feb 9, 2026
e54ac8e
Fix sorting on profile page
newstler Feb 9, 2026
dbd1a76
Merge origin/main into feature/projects
newstler Feb 9, 2026
79c4708
Improve Turbo navigation on community pages
newstler Feb 9, 2026
e31d120
Sync username and email on GitHub data refresh
newstler Feb 9, 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
268 changes: 268 additions & 0 deletions .claude/agents/code-reviewer.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
---
name: og-image
description: Generate social media preview images (Open Graph) for Rails apps. Creates an OG image using Ruby image libraries and configures meta tags in the layout head.
---

This skill creates Open Graph images for social media sharing in Rails applications. It generates an image file and adds the necessary meta tags to the layout.

## Workflow

### Phase 1: Codebase Analysis

Explore the project to understand:

1. **Design System Discovery (Tailwind 4)**
- Check CSS config in `app/assets/stylesheets/application.css`:
```css
@import "tailwindcss";

@theme {
--color-primary: oklch(0.7 0.15 250);
--color-background: oklch(0.15 0.02 260);
--font-display: "Inter", sans-serif;
}
```
- Find color tokens and fonts from `@theme` block

2. **Branding Assets**
- Find logo in `app/assets/images/` or `public/`
- Check for favicon in `public/`

3. **Product Information**
- Extract product name from landing page
- Find tagline/description

### Phase 2: Generate OG Image

Generate `public/og-image.png` (1200×630px) using one of these approaches:

**Option A: Using ruby-vips (already in Rails 7+)**

```ruby
# lib/tasks/og_image.rake
namespace :og do
desc "Generate OG image"
task generate: :environment do
require "vips"

width = 1200
height = 630

# Create background with gradient
background = Vips::Image.black(width, height).add([30, 41, 59]) # slate-800

# Add text
title = Vips::Image.text(
"Product Name",
font: "Inter Bold 72",
width: width - 200
).gravity("centre", width, 200)

tagline = Vips::Image.text(
"Your tagline here",
font: "Inter 36",
width: width - 200
).gravity("centre", width, 100)

# Composite layers
result = background
.composite(title.add([255, 255, 255]), :over, x: 0, y: 200)
.composite(tagline.add([148, 163, 184]), :over, x: 0, y: 350)

result.write_to_file(Rails.root.join("public/og-image.png").to_s)
puts "✓ Generated public/og-image.png"
end
end
```

**Option B: Using MiniMagick**

```ruby
# Gemfile
gem "mini_magick"

# lib/tasks/og_image.rake
namespace :og do
desc "Generate OG image"
task generate: :environment do
require "mini_magick"

MiniMagick::Tool::Convert.new do |img|
img.size "1200x630"
img << "xc:#1e293b" # slate-800 background
img.gravity "center"
img.font "Inter-Bold"
img.pointsize 72
img.fill "white"
img.annotate "+0-50", "Product Name"
img.font "Inter-Regular"
img.pointsize 36
img.fill "#94a3b8" # slate-400
img.annotate "+0+50", "Your tagline here"
img << Rails.root.join("public/og-image.png").to_s
end

puts "✓ Generated public/og-image.png"
end
end
```

**Option C: Playwright MCP (for complex designs)**

For complex designs, create temp HTML and screenshot:

```ruby
# lib/tasks/og_image.rake
namespace :og do
desc "Generate OG image HTML for Playwright screenshot"
task html: :environment do
html_path = Rails.root.join("tmp/og-image.html")

File.write(html_path, <<~HTML)
<!DOCTYPE html>
<html>
<head>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
width: 1200px;
height: 630px;
background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
font-family: system-ui, sans-serif;
}
h1 { color: white; font-size: 72px; font-weight: 700; }
p { color: #94a3b8; font-size: 36px; margin-top: 24px; }
.domain { position: absolute; bottom: 40px; color: #64748b; }
</style>
</head>
<body>
<h1>Product Name</h1>
<p>Your tagline here</p>
<div class="domain">yourproduct.com</div>
</body>
</html>
HTML

puts "Use Playwright MCP:"
puts " browser_navigate file://#{html_path}"
puts " browser_resize 1200x630"
puts " browser_screenshot → public/og-image.png"
end
end
```

### Phase 3: Add Meta Tags to Layout

**Create helper** (`app/helpers/meta_tags_helper.rb`):

```ruby
module MetaTagsHelper
def meta_tags(options = {})
defaults = {
title: "Product Name",
description: "Your product description for social sharing",
image: og_image_url,
url: request.original_url,
twitter_handle: nil
}
tags = defaults.merge(options)

safe_join([
tag.meta(name: "description", content: tags[:description]),
tag.meta(name: "theme-color", content: "#1e293b"),

# Open Graph
tag.meta(property: "og:type", content: "website"),
tag.meta(property: "og:title", content: tags[:title]),
tag.meta(property: "og:description", content: tags[:description]),
tag.meta(property: "og:url", content: tags[:url]),
tag.meta(property: "og:image", content: tags[:image]),
tag.meta(property: "og:image:width", content: "1200"),
tag.meta(property: "og:image:height", content: "630"),

# Twitter/X
tag.meta(name: "twitter:card", content: "summary_large_image"),
tag.meta(name: "twitter:title", content: tags[:title]),
tag.meta(name: "twitter:description", content: tags[:description]),
tag.meta(name: "twitter:image", content: tags[:image]),
tags[:twitter_handle] ? tag.meta(name: "twitter:site", content: tags[:twitter_handle]) : nil
].compact, "\n")
end

private

def og_image_url
host = Rails.application.config.action_mailer.default_url_options&.dig(:host) || "localhost:3000"
protocol = Rails.env.production? ? "https" : "http"
"#{protocol}://#{host}/og-image.png"
end
end
```

**Update layout** (`app/views/layouts/application.html.erb`):

```erb
<!DOCTYPE html>
<html>
<head>
<title><%= content_for(:title) || "Product Name" %></title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>

<%= meta_tags(content_for(:meta_tags) || {}) %>

<%= stylesheet_link_tag "application", "data-turbo-track": "reload" %>
<%= javascript_importmap_tags %>
</head>
<body>
<%= yield %>
</body>
</html>
```

**Per-page custom meta** (optional):

```erb
<% content_for :meta_tags do %>
<%= meta_tags(
title: "Custom Page Title",
description: "Custom description"
) %>
<% end %>
```

### Phase 4: Verification

```bash
# Generate image
bin/rails og:generate

# Verify
ls -la public/og-image.png

# Test validators
# - Facebook: https://developers.facebook.com/tools/debug/
# - Twitter: https://cards-dev.twitter.com/validator
# - LinkedIn: https://www.linkedin.com/post-inspector/
```

## Files Created

```
lib/tasks/og_image.rake # Rake task to generate image
app/helpers/meta_tags_helper.rb # Meta tag helper
public/og-image.png # Generated image (1200×630)
```

## Quality Checklist

- [ ] Image is 1200×630 pixels
- [ ] Image saved to `public/og-image.png`
- [ ] `meta_tags` helper in layout `<head>`
- [ ] Production URL configured for absolute image path
- [ ] Tested with social media validators
Loading