Skip to content

Commit 0ddd730

Browse files
Technical-1claudehappy-otter
committed
Add OG preview image and update portfolio docs
- Generate social preview image (1200x630 @2x) for project portfolio - Include og-gen/ HTML template and Puppeteer script for regeneration - Fix license badge URL (pythonforge → quickforge) in README - Update portfolio architecture and stack documentation Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
1 parent 7cd83f2 commit 0ddd730

7 files changed

Lines changed: 217 additions & 3 deletions

File tree

.portfolio/architecture.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ graph TB
7575
DET --> REC
7676
REC --> SCORE
7777
78-
Auditor --> PLAN
78+
DET -.-> PLAN
7979
PLAN --> PKG
8080
PLAN --> LINT
8181
PLAN --> TYPE

.portfolio/preview.png

611 KB
Loading

.portfolio/stack.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,12 +132,13 @@ quickforge/
132132
│ ├── generator.py # Project generation logic
133133
│ ├── auditor.py # Project analysis
134134
│ ├── upgrader.py # Migration logic
135-
│ └── templates/ # Jinja2 templates (20+ files)
135+
│ └── templates/ # Jinja2 templates (18 files)
136136
├── tests/
137137
│ ├── conftest.py # pytest fixtures
138138
│ ├── test_cli.py # CLI tests
139139
│ ├── test_models.py # Model validation tests
140140
│ ├── test_generator.py # Generation tests
141+
│ ├── test_add.py # Feature addition tests
141142
│ ├── test_auditor.py # Audit tests
142143
│ └── test_upgrader.py # Migration tests
143144
├── .github/

README.md

100644100755
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
[![PyPI](https://img.shields.io/pypi/v/quickforge?style=for-the-badge&color=blue&cacheSeconds=0)](https://pypi.org/project/quickforge/)
66
![Python](https://img.shields.io/badge/Python-3.11+-3776AB?style=for-the-badge&logo=python&logoColor=white)
7-
[![License](https://img.shields.io/github/license/Technical-1/pythonforge?style=for-the-badge)](LICENSE)
7+
[![License](https://img.shields.io/github/license/Technical-1/quickforge?style=for-the-badge)](LICENSE)
88

99
**Modern Python project bootstrapper with 2025's best toolchain.**
1010

og-gen/generate.mjs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import puppeteer from 'puppeteer';
2+
import path from 'path';
3+
import { fileURLToPath } from 'url';
4+
5+
const __filename = fileURLToPath(import.meta.url);
6+
const __dirname = path.dirname(__filename);
7+
8+
async function generateImages() {
9+
const browser = await puppeteer.launch({ headless: 'new' });
10+
const page = await browser.newPage();
11+
await page.setViewport({ width: 1200, height: 630, deviceScaleFactor: 2 });
12+
const htmlPath = path.join(__dirname, 'og-home.html');
13+
await page.goto(`file://${htmlPath}`, { waitUntil: 'networkidle0' });
14+
await page.evaluateHandle('document.fonts.ready');
15+
await new Promise(r => setTimeout(r, 1000));
16+
17+
const outputPath = path.join(__dirname, '..', '.portfolio', 'preview.png');
18+
const element = await page.$('.og-card');
19+
if (element) {
20+
await element.screenshot({ path: outputPath, type: 'png' });
21+
console.log('Generated: ' + outputPath);
22+
} else {
23+
console.error('Could not find .og-card element');
24+
process.exit(1);
25+
}
26+
await page.close();
27+
await browser.close();
28+
}
29+
30+
generateImages().catch(e => { console.error(e); process.exit(1); });

og-gen/og-home.html

Lines changed: 182 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,182 @@
1+
<!DOCTYPE html>
2+
<html>
3+
<head>
4+
<meta charset="UTF-8">
5+
<style>
6+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800;900&family=JetBrains+Mono:wght@400;500;600&display=swap');
7+
* { margin: 0; padding: 0; box-sizing: border-box; }
8+
.og-card {
9+
width: 1200px;
10+
height: 630px;
11+
background: #0a0a0f;
12+
position: relative;
13+
overflow: hidden;
14+
display: flex;
15+
flex-direction: column;
16+
padding: 60px 70px;
17+
font-family: 'Inter', system-ui, sans-serif;
18+
}
19+
.og-card::before {
20+
content: '';
21+
position: absolute;
22+
inset: 0;
23+
background-image:
24+
linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px),
25+
linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px);
26+
background-size: 40px 40px;
27+
}
28+
.glow-1 {
29+
position: absolute;
30+
top: -120px;
31+
right: -80px;
32+
width: 500px;
33+
height: 500px;
34+
background: radial-gradient(circle, rgba(59, 130, 246, 0.15) 0%, transparent 70%);
35+
pointer-events: none;
36+
}
37+
.glow-2 {
38+
position: absolute;
39+
bottom: -150px;
40+
left: -100px;
41+
width: 600px;
42+
height: 600px;
43+
background: radial-gradient(circle, rgba(249, 115, 22, 0.10) 0%, transparent 70%);
44+
pointer-events: none;
45+
}
46+
.top-section {
47+
position: relative;
48+
z-index: 1;
49+
display: flex;
50+
align-items: center;
51+
gap: 20px;
52+
margin-bottom: 28px;
53+
}
54+
.icon { font-size: 52px; line-height: 1; }
55+
.title {
56+
font-size: 64px;
57+
font-weight: 900;
58+
color: #ffffff;
59+
letter-spacing: -2px;
60+
line-height: 1;
61+
}
62+
.tagline {
63+
position: relative;
64+
z-index: 1;
65+
font-size: 26px;
66+
font-weight: 500;
67+
color: rgba(255,255,255,0.6);
68+
line-height: 1.4;
69+
margin-bottom: 40px;
70+
max-width: 700px;
71+
}
72+
.command-block {
73+
position: relative;
74+
z-index: 1;
75+
background: rgba(255,255,255,0.05);
76+
border: 1px solid rgba(255,255,255,0.08);
77+
border-radius: 12px;
78+
padding: 20px 28px;
79+
margin-bottom: 40px;
80+
display: inline-flex;
81+
align-items: center;
82+
gap: 12px;
83+
}
84+
.prompt {
85+
color: rgba(59, 130, 246, 0.8);
86+
font-family: 'JetBrains Mono', monospace;
87+
font-size: 22px;
88+
font-weight: 500;
89+
}
90+
.command {
91+
color: rgba(255,255,255,0.85);
92+
font-family: 'JetBrains Mono', monospace;
93+
font-size: 22px;
94+
font-weight: 500;
95+
}
96+
.tools-row {
97+
position: relative;
98+
z-index: 1;
99+
display: flex;
100+
gap: 12px;
101+
flex-wrap: wrap;
102+
margin-top: auto;
103+
margin-bottom: 0;
104+
}
105+
.tool-pill {
106+
display: flex;
107+
align-items: center;
108+
gap: 8px;
109+
padding: 10px 20px;
110+
background: rgba(255,255,255,0.06);
111+
border: 1px solid rgba(255,255,255,0.08);
112+
border-radius: 100px;
113+
font-size: 16px;
114+
font-weight: 600;
115+
color: rgba(255,255,255,0.7);
116+
font-family: 'Inter', sans-serif;
117+
}
118+
.tool-pill .dot {
119+
width: 8px;
120+
height: 8px;
121+
border-radius: 50%;
122+
flex-shrink: 0;
123+
}
124+
.dot-blue { background: #3b82f6; }
125+
.dot-orange { background: #f97316; }
126+
.dot-green { background: #22c55e; }
127+
.dot-purple { background: #a855f7; }
128+
.dot-pink { background: #ec4899; }
129+
.bottom-bar {
130+
position: absolute;
131+
bottom: 0;
132+
left: 0;
133+
right: 0;
134+
height: 4px;
135+
background: linear-gradient(90deg, #3b82f6, #8b5cf6, #f97316);
136+
}
137+
.badge {
138+
position: relative;
139+
z-index: 1;
140+
display: inline-flex;
141+
align-items: center;
142+
gap: 8px;
143+
padding: 6px 14px;
144+
background: rgba(55, 118, 171, 0.12);
145+
border: 1px solid rgba(55, 118, 171, 0.3);
146+
border-radius: 6px;
147+
font-size: 14px;
148+
font-weight: 600;
149+
color: #60a5fa;
150+
font-family: 'JetBrains Mono', monospace;
151+
margin-bottom: 20px;
152+
letter-spacing: 0.5px;
153+
}
154+
</style>
155+
</head>
156+
<body>
157+
<div class="og-card">
158+
<div class="glow-1"></div>
159+
<div class="glow-2"></div>
160+
<div class="badge">PYTHON CLI TOOL</div>
161+
<div class="top-section">
162+
<span class="icon">&#9889;</span>
163+
<span class="title">quickforge</span>
164+
</div>
165+
<div class="tagline">
166+
Modern Python project bootstrapper with 2025's best toolchain. One command, production-ready.
167+
</div>
168+
<div class="command-block">
169+
<span class="prompt">$</span>
170+
<span class="command">quickforge new myproject</span>
171+
</div>
172+
<div class="tools-row">
173+
<div class="tool-pill"><span class="dot dot-orange"></span>uv</div>
174+
<div class="tool-pill"><span class="dot dot-blue"></span>ruff</div>
175+
<div class="tool-pill"><span class="dot dot-purple"></span>basedpyright</div>
176+
<div class="tool-pill"><span class="dot dot-green"></span>pytest</div>
177+
<div class="tool-pill"><span class="dot dot-pink"></span>pre-commit</div>
178+
</div>
179+
<div class="bottom-bar"></div>
180+
</div>
181+
</body>
182+
</html>

og-gen/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{"type":"module","private":true,"dependencies":{"puppeteer":"^24.37.1"}}

0 commit comments

Comments
 (0)