Skip to content

Commit 1a41e18

Browse files
rodmen07claude
andcommitted
feat(v1.1): patch notes, linkedin graphic and post copy
- Update infraportal submodule pointer to 823ffa7 (v1.1 patch notes) - Add docs/linkedin/v1.1-release-graphic.html — 1200x627 dark-theme HTML graphic for LinkedIn announcement - Add docs/linkedin/v1.1-post.md — ready-to-paste LinkedIn post copy Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent dc302aa commit 1a41e18

3 files changed

Lines changed: 344 additions & 1 deletion

File tree

docs/linkedin/v1.1-post.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# LinkedIn Post — v1.1 Release
2+
3+
---
4+
5+
Shipped two portfolio releases today (v1.1 + v1.1.1) — one focused on developer experience, one on AI research.
6+
7+
**v1.1 — CI/CD Pipeline Overhaul**
8+
9+
The workspace now has a two-stage CI pipeline: a custom Docker runner image (Rust + Go + Python toolchain baked in) is built once and pushed to GCP Artifact Registry via OIDC, then reused across every test job. No more per-run toolchain installs. The workspace test script also got hardened — submodule auto-init, cross-platform venv creation, and a 100KB log cap per project to keep artifacts clean.
10+
11+
**v1.1.1 — Vertex AI SecondBrain Phase A**
12+
13+
A FastAPI prototype that grounds query answers in a Google Drive document corpus using Vertex AI Agent Builder and Gemini 2.5 Pro. You point it at a Drive file ID, it ingests the document, and subsequent `/agent/query` calls return answers with source citations. The service degrades gracefully when GCP credentials aren't present (useful locally), and all 8 unit tests pass against a mock client hook.
14+
15+
GCP-side wiring (data store + agent instructions) is next — Phase B adds Gmail OAuth and Firestore session memory.
16+
17+
Full patch notes: https://rodmen07.github.io/#/patch-notes
18+
19+
---
20+
21+
#CloudEngineering #GCP #VertexAI #Rust #Python #Go #DevOps #GitHubActions #Docker #CICD #Portfolio #SoftwareEngineering
Lines changed: 322 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,322 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=1200" />
6+
<title>v1.1 Release — InfraPortal Portfolio</title>
7+
<style>
8+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
9+
10+
body {
11+
width: 1200px;
12+
height: 627px;
13+
overflow: hidden;
14+
font-family: 'Inter', 'Segoe UI', system-ui, sans-serif;
15+
background: #09090b;
16+
color: #e4e4e7;
17+
}
18+
19+
/* ── Background grid texture ── */
20+
.bg {
21+
position: absolute;
22+
inset: 0;
23+
background-image:
24+
linear-gradient(rgba(251,191,36,0.03) 1px, transparent 1px),
25+
linear-gradient(90deg, rgba(251,191,36,0.03) 1px, transparent 1px);
26+
background-size: 40px 40px;
27+
}
28+
29+
/* Amber glow blobs */
30+
.glow-left {
31+
position: absolute;
32+
top: -120px; left: -120px;
33+
width: 500px; height: 500px;
34+
border-radius: 50%;
35+
background: radial-gradient(circle, rgba(251,191,36,0.10) 0%, transparent 70%);
36+
pointer-events: none;
37+
}
38+
.glow-right {
39+
position: absolute;
40+
bottom: -100px; right: -80px;
41+
width: 400px; height: 400px;
42+
border-radius: 50%;
43+
background: radial-gradient(circle, rgba(99,102,241,0.10) 0%, transparent 70%);
44+
pointer-events: none;
45+
}
46+
47+
/* ── Layout ── */
48+
.frame {
49+
position: relative;
50+
width: 1200px;
51+
height: 627px;
52+
display: flex;
53+
flex-direction: column;
54+
padding: 40px 48px 32px;
55+
gap: 0;
56+
}
57+
58+
/* ── Top bar ── */
59+
.topbar {
60+
display: flex;
61+
align-items: center;
62+
justify-content: space-between;
63+
margin-bottom: 28px;
64+
}
65+
.topbar-left {
66+
display: flex;
67+
align-items: center;
68+
gap: 14px;
69+
}
70+
.ver-badge {
71+
background: rgba(251,191,36,0.12);
72+
color: #fbbf24;
73+
border: 1px solid rgba(251,191,36,0.28);
74+
border-radius: 10px;
75+
padding: 5px 14px;
76+
font-size: 22px;
77+
font-weight: 800;
78+
letter-spacing: -0.3px;
79+
}
80+
.latest-badge {
81+
background: rgba(34,197,94,0.12);
82+
color: #4ade80;
83+
border: 1px solid rgba(34,197,94,0.28);
84+
border-radius: 20px;
85+
padding: 4px 12px;
86+
font-size: 12px;
87+
font-weight: 600;
88+
letter-spacing: 0.4px;
89+
}
90+
.active-badge {
91+
background: rgba(99,102,241,0.12);
92+
color: #a5b4fc;
93+
border: 1px solid rgba(99,102,241,0.28);
94+
border-radius: 20px;
95+
padding: 4px 12px;
96+
font-size: 12px;
97+
font-weight: 600;
98+
letter-spacing: 0.4px;
99+
}
100+
.date {
101+
color: #71717a;
102+
font-size: 13px;
103+
}
104+
.logo-area {
105+
font-size: 13px;
106+
color: #52525b;
107+
font-weight: 500;
108+
letter-spacing: 0.3px;
109+
}
110+
.logo-area span { color: #a1a1aa; }
111+
112+
/* ── Headline ── */
113+
.headline {
114+
font-size: 30px;
115+
font-weight: 800;
116+
color: #ffffff;
117+
letter-spacing: -0.6px;
118+
line-height: 1.15;
119+
margin-bottom: 6px;
120+
}
121+
.headline em {
122+
font-style: normal;
123+
background: linear-gradient(90deg, #fbbf24, #f59e0b);
124+
-webkit-background-clip: text;
125+
-webkit-text-fill-color: transparent;
126+
background-clip: text;
127+
}
128+
.subline {
129+
font-size: 14px;
130+
color: #71717a;
131+
margin-bottom: 28px;
132+
}
133+
134+
/* ── Two-column grid ── */
135+
.grid {
136+
display: grid;
137+
grid-template-columns: 1fr 1fr;
138+
gap: 18px;
139+
flex: 1;
140+
}
141+
142+
.card {
143+
background: rgba(255,255,255,0.03);
144+
border: 1px solid rgba(255,255,255,0.07);
145+
border-radius: 16px;
146+
padding: 20px 22px;
147+
display: flex;
148+
flex-direction: column;
149+
gap: 10px;
150+
}
151+
152+
.card-header {
153+
display: flex;
154+
align-items: center;
155+
gap: 10px;
156+
margin-bottom: 2px;
157+
}
158+
.card-icon {
159+
width: 32px; height: 32px;
160+
border-radius: 8px;
161+
display: flex; align-items: center; justify-content: center;
162+
font-size: 16px;
163+
flex-shrink: 0;
164+
}
165+
.card-icon.amber { background: rgba(251,191,36,0.12); }
166+
.card-icon.indigo { background: rgba(99,102,241,0.12); }
167+
168+
.card-title {
169+
font-size: 14px;
170+
font-weight: 700;
171+
color: #e4e4e7;
172+
letter-spacing: -0.1px;
173+
}
174+
.card-sub {
175+
font-size: 11px;
176+
color: #fbbf24;
177+
font-weight: 600;
178+
letter-spacing: 0.6px;
179+
text-transform: uppercase;
180+
}
181+
182+
.item-list {
183+
list-style: none;
184+
display: flex;
185+
flex-direction: column;
186+
gap: 7px;
187+
}
188+
.item-list li {
189+
display: flex;
190+
align-items: flex-start;
191+
gap: 8px;
192+
font-size: 12.5px;
193+
color: #a1a1aa;
194+
line-height: 1.45;
195+
}
196+
.item-list li::before {
197+
content: '';
198+
width: 5px; height: 5px;
199+
border-radius: 50%;
200+
background: rgba(251,191,36,0.55);
201+
flex-shrink: 0;
202+
margin-top: 5px;
203+
}
204+
.item-list li strong { color: #d4d4d8; font-weight: 600; }
205+
206+
/* ── Footer ── */
207+
.footer {
208+
margin-top: 22px;
209+
display: flex;
210+
align-items: center;
211+
justify-content: space-between;
212+
}
213+
.pills {
214+
display: flex;
215+
gap: 7px;
216+
flex-wrap: wrap;
217+
}
218+
.pill {
219+
background: rgba(255,255,255,0.05);
220+
border: 1px solid rgba(255,255,255,0.09);
221+
border-radius: 20px;
222+
padding: 3px 10px;
223+
font-size: 11px;
224+
color: #71717a;
225+
font-weight: 500;
226+
}
227+
.footer-link {
228+
font-size: 12px;
229+
color: #52525b;
230+
font-weight: 500;
231+
}
232+
.footer-link span { color: #71717a; }
233+
234+
/* thin top rule */
235+
.divider {
236+
height: 1px;
237+
background: rgba(255,255,255,0.06);
238+
margin-bottom: 22px;
239+
}
240+
</style>
241+
</head>
242+
<body>
243+
<div class="bg"></div>
244+
<div class="glow-left"></div>
245+
<div class="glow-right"></div>
246+
247+
<div class="frame">
248+
249+
<!-- Top bar -->
250+
<div class="topbar">
251+
<div class="topbar-left">
252+
<span class="ver-badge">v1.1</span>
253+
<span class="latest-badge">Latest</span>
254+
<span class="active-badge">Active</span>
255+
<span class="date">April 9, 2026</span>
256+
</div>
257+
<div class="logo-area">InfraPortal Portfolio &nbsp;·&nbsp; <span>rodmen07.github.io</span></div>
258+
</div>
259+
260+
<!-- Headline -->
261+
<div class="headline">Portfolio Release — <em>CI/CD Pipeline</em> &amp; Vertex AI Prototype</div>
262+
<div class="subline">Developer experience overhaul + document-grounded AI assistant — two releases shipping the same day.</div>
263+
264+
<div class="divider"></div>
265+
266+
<!-- Two-column grid -->
267+
<div class="grid">
268+
269+
<!-- Card 1 — CI/CD -->
270+
<div class="card">
271+
<div class="card-header">
272+
<div class="card-icon amber">🚀</div>
273+
<div>
274+
<div class="card-sub">v1.1 &nbsp;·&nbsp; CI/CD &amp; DevEx</div>
275+
<div class="card-title">Two-Stage Runner Image Pipeline</div>
276+
</div>
277+
</div>
278+
<ul class="item-list">
279+
<li><strong>build-runner-image.yml</strong> — Rust + Go + Python toolchain baked into a Docker image; pushed to Artifact Registry via OIDC on every merge.</li>
280+
<li><strong>run-tests-with-runner-image.yml</strong> — reuses the image for all cargo/pytest/go test jobs; log artifacts capped at 100 KB per project.</li>
281+
<li><strong>gcp-setup.sh</strong> — gains <code>NONINTERACTIVE=1</code> mode for headless CI provisioning.</li>
282+
<li><strong>Frontend UX</strong> — motion override toggle, animation replay, dynamic hero tagline, gradient pulse badge.</li>
283+
</ul>
284+
</div>
285+
286+
<!-- Card 2 — Vertex AI -->
287+
<div class="card">
288+
<div class="card-header">
289+
<div class="card-icon indigo">🧠</div>
290+
<div>
291+
<div class="card-sub">v1.1.1 &nbsp;·&nbsp; AI Research</div>
292+
<div class="card-title">Vertex AI SecondBrain — Phase A</div>
293+
</div>
294+
</div>
295+
<ul class="item-list">
296+
<li><strong>Agent Builder</strong> — queries grounded in a Drive document corpus via <code>google-cloud-discoveryengine</code>; returns answer + citations.</li>
297+
<li><strong>Drive connector</strong><code>DriveConnector.from_env()</code> loads ADC or service account credentials; <code>POST /ingest/drive</code> ingests files by ID.</li>
298+
<li><strong>Graceful degradation</strong> — runs locally without GCP credentials; <code>_TEST_AGENT_CLIENT</code> hook keeps all 8 unit tests passing.</li>
299+
<li><strong>Stack:</strong> FastAPI · Vertex AI Agent Builder · Google Drive API · Gemini 2.5 Pro</li>
300+
</ul>
301+
</div>
302+
303+
</div>
304+
305+
<!-- Footer -->
306+
<div class="footer">
307+
<div class="pills">
308+
<span class="pill">Rust</span>
309+
<span class="pill">Python</span>
310+
<span class="pill">Go</span>
311+
<span class="pill">GCP</span>
312+
<span class="pill">Vertex AI</span>
313+
<span class="pill">Docker</span>
314+
<span class="pill">GitHub Actions</span>
315+
<span class="pill">OIDC</span>
316+
</div>
317+
<div class="footer-link">github.com/<span>rodmen07</span></div>
318+
</div>
319+
320+
</div>
321+
</body>
322+
</html>

infraportal

0 commit comments

Comments
 (0)