Skip to content

Commit ca34116

Browse files
paoloanznclaude
andcommitted
feat: add markdown-powered blog system
Build-time blog generator that converts markdown posts with frontmatter into fully styled HTML pages matching the site's design system. Includes blog index page, individual post pages with structured data, breadcrumbs, read time estimates, and tag support. Workflow: write .md in blog/posts/ → npm run build generates HTML → deploy. Includes a sample post: "Why AI Agents Need Dedicated CLI Tools" Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent 756877f commit ca34116

File tree

10 files changed

+817
-3
lines changed

10 files changed

+817
-3
lines changed

.gitignore

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ credentials.json
3131
# Claude
3232
.claude/
3333

34+
# Blog generated HTML (source is blog/posts/*.md + blog/_*.html templates)
35+
blog/index.html
36+
blog/*/index.html
37+
3438
# Drafts / reference files
3539
gladium-ai.html
3640
public/Frame*

blog/_index-template.html

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>Blog | Gladium AI</title>
7+
<meta name="description" content="Insights on AI agents, automation, and developer tools from the Gladium AI team.">
8+
<link rel="canonical" href="https://gladium.ai/blog/">
9+
<!-- Open Graph -->
10+
<meta property="og:type" content="website">
11+
<meta property="og:title" content="Blog | Gladium AI">
12+
<meta property="og:description" content="Insights on AI agents, automation, and developer tools from the Gladium AI team.">
13+
<meta property="og:url" content="https://gladium.ai/blog/">
14+
<meta property="og:site_name" content="Gladium AI">
15+
<meta property="og:image" content="https://gladium.ai/og-image.png">
16+
<meta property="og:locale" content="en_US">
17+
<!-- Twitter Card -->
18+
<meta name="twitter:card" content="summary_large_image">
19+
<meta name="twitter:title" content="Blog | Gladium AI">
20+
<meta name="twitter:description" content="Insights on AI agents, automation, and developer tools from the Gladium AI team.">
21+
<meta name="twitter:image" content="https://gladium.ai/og-image.png">
22+
<!-- Favicons -->
23+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
24+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
25+
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
26+
<meta name="theme-color" content="#0e0e0e">
27+
<!-- Fonts -->
28+
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500&family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
29+
<link rel="stylesheet" href="/src/style.css">
30+
<link rel="stylesheet" href="/src/blog.css">
31+
<!-- Structured Data -->
32+
<script type="application/ld+json">
33+
{
34+
"@context": "https://schema.org",
35+
"@type": "Blog",
36+
"name": "Gladium AI Blog",
37+
"description": "Insights on AI agents, automation, and developer tools.",
38+
"url": "https://gladium.ai/blog/",
39+
"publisher": { "@type": "Organization", "name": "Gladium AI", "url": "https://gladium.ai" }
40+
}
41+
</script>
42+
</head>
43+
<body>
44+
45+
<!-- NAV -->
46+
<div class="nav-wrapper">
47+
<nav>
48+
<a href="/" class="nav-logo">
49+
<img src="/gladium-logo.png" alt="Gladium AI" class="logo-img">
50+
</a>
51+
<div class="nav-center">
52+
<a href="/#solutions">Solutions</a>
53+
<a href="/#agents">Agents</a>
54+
<a href="/#open-source">Open Source</a>
55+
<a href="/blog/" class="active">Blog</a>
56+
<a href="/#faq">FAQ</a>
57+
<a href="/#contact">Contact</a>
58+
<button class="nav-cta nav-cta-mobile" onclick="window.location.href='/#open-source'">View Ecosystem</button>
59+
</div>
60+
<button class="nav-cta nav-cta-desktop" onclick="window.location.href='/#open-source'">View Ecosystem</button>
61+
<button class="nav-toggle" aria-label="Menu">
62+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
63+
<line x1="4" y1="7" x2="20" y2="7"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="17" x2="20" y2="17"/>
64+
</svg>
65+
</button>
66+
</nav>
67+
</div>
68+
69+
<!-- BLOG INDEX -->
70+
<section class="blog-index">
71+
<div class="blog-index-header">
72+
<span class="section-label">Blog</span>
73+
<h1>Insights & <em>Updates</em></h1>
74+
<p>Thoughts on AI agents, automation, and the tools we're building.</p>
75+
</div>
76+
<div class="blog-grid">
77+
{{posts}}
78+
</div>
79+
</section>
80+
81+
<!-- FOOTER -->
82+
<footer>
83+
<div class="footer-inner">
84+
<div class="footer-left">
85+
<div class="footer-brand"><img src="/gladium-logo.png" alt="Gladium AI" class="logo-img"></div>
86+
<div class="footer-tagline">AI agents that deliver real results.</div>
87+
<div class="footer-address">Gladium Agency AI LLC<br>30N South Gould Street, STE R<br>Sheridan, WY 82801<br>United States</div>
88+
<div class="footer-copy">&copy; 2026 Gladium Agency AI LLC. All rights reserved.</div>
89+
</div>
90+
<div class="footer-right">
91+
<div class="footer-col">
92+
<h4>Company</h4>
93+
<a href="/#solutions">Solutions</a>
94+
<a href="/#agents">Agents</a>
95+
<a href="/#open-source">Open Source</a>
96+
<a href="/#contact">Contact</a>
97+
</div>
98+
<div class="footer-col">
99+
<h4>Connect</h4>
100+
<div class="footer-socials">
101+
<a href="#" aria-label="X"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a>
102+
<a href="#" aria-label="LinkedIn"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a>
103+
<a href="https://github.com/gladium-ai" aria-label="GitHub"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg></a>
104+
</div>
105+
</div>
106+
</div>
107+
</div>
108+
</footer>
109+
110+
<script type="module" src="/src/blog-nav.js"></script>
111+
</body>
112+
</html>

blog/_post-template.html

Lines changed: 137 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
6+
<title>{{title}} | Gladium AI Blog</title>
7+
<meta name="description" content="{{description}}">
8+
<link rel="canonical" href="{{site}}/blog/{{slug}}/">
9+
<!-- Open Graph -->
10+
<meta property="og:type" content="article">
11+
<meta property="og:title" content="{{title}}">
12+
<meta property="og:description" content="{{description}}">
13+
<meta property="og:url" content="{{site}}/blog/{{slug}}/">
14+
<meta property="og:site_name" content="Gladium AI">
15+
<meta property="og:image" content="{{image}}">
16+
<meta property="og:image:width" content="1200">
17+
<meta property="og:image:height" content="630">
18+
<meta property="og:locale" content="en_US">
19+
<meta property="article:published_time" content="{{date}}">
20+
<meta property="article:author" content="{{author}}">
21+
<!-- Twitter Card -->
22+
<meta name="twitter:card" content="summary_large_image">
23+
<meta name="twitter:title" content="{{title}}">
24+
<meta name="twitter:description" content="{{description}}">
25+
<meta name="twitter:image" content="{{image}}">
26+
<!-- Favicons -->
27+
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
28+
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
29+
<link rel="apple-touch-icon" href="/apple-touch-icon.png">
30+
<meta name="theme-color" content="#0e0e0e">
31+
<!-- Fonts -->
32+
<link href="https://fonts.googleapis.com/css2?family=DM+Sans:wght@300;400;500&family=Instrument+Serif:ital@0;1&family=DM+Mono:wght@400;500&display=swap" rel="stylesheet">
33+
<link rel="stylesheet" href="/src/style.css">
34+
<link rel="stylesheet" href="/src/blog.css">
35+
<!-- Structured Data -->
36+
<script type="application/ld+json">
37+
{
38+
"@context": "https://schema.org",
39+
"@type": "BlogPosting",
40+
"headline": "{{title}}",
41+
"description": "{{description}}",
42+
"datePublished": "{{date}}",
43+
"author": { "@type": "Organization", "name": "{{author}}", "url": "{{site}}" },
44+
"publisher": { "@type": "Organization", "name": "Gladium AI", "url": "{{site}}", "logo": { "@type": "ImageObject", "url": "{{site}}/gladium-logo.png" } },
45+
"mainEntityOfPage": "{{site}}/blog/{{slug}}/",
46+
"image": "{{image}}"
47+
}
48+
</script>
49+
</head>
50+
<body>
51+
52+
<!-- NAV -->
53+
<div class="nav-wrapper">
54+
<nav>
55+
<a href="/" class="nav-logo">
56+
<img src="/gladium-logo.png" alt="Gladium AI" class="logo-img">
57+
</a>
58+
<div class="nav-center">
59+
<a href="/#solutions">Solutions</a>
60+
<a href="/#agents">Agents</a>
61+
<a href="/#open-source">Open Source</a>
62+
<a href="/blog/">Blog</a>
63+
<a href="/#faq">FAQ</a>
64+
<a href="/#contact">Contact</a>
65+
<button class="nav-cta nav-cta-mobile" onclick="window.location.href='/#open-source'">View Ecosystem</button>
66+
</div>
67+
<button class="nav-cta nav-cta-desktop" onclick="window.location.href='/#open-source'">View Ecosystem</button>
68+
<button class="nav-toggle" aria-label="Menu">
69+
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.5">
70+
<line x1="4" y1="7" x2="20" y2="7"/><line x1="4" y1="12" x2="20" y2="12"/><line x1="4" y1="17" x2="20" y2="17"/>
71+
</svg>
72+
</button>
73+
</nav>
74+
</div>
75+
76+
<!-- BLOG POST -->
77+
<article class="blog-post">
78+
<div class="blog-post-header">
79+
<div class="blog-breadcrumb">
80+
<a href="/">Home</a>
81+
<span class="sep">/</span>
82+
<a href="/blog/">Blog</a>
83+
<span class="sep">/</span>
84+
<span class="current">{{title}}</span>
85+
</div>
86+
<div class="blog-post-meta">
87+
<time datetime="{{date}}">{{date_formatted}}</time>
88+
<span class="blog-meta-dot">&middot;</span>
89+
<span>{{read_time}} min read</span>
90+
</div>
91+
<h1>{{title}}</h1>
92+
<p class="blog-post-lead">{{description}}</p>
93+
<div class="blog-post-tags">{{tags}}</div>
94+
</div>
95+
96+
<div class="blog-post-body">
97+
{{content}}
98+
</div>
99+
</article>
100+
101+
<!-- BACK TO BLOG -->
102+
<div class="blog-back-wrap">
103+
<a href="/blog/" class="blog-back">&larr; All posts</a>
104+
</div>
105+
106+
<!-- FOOTER -->
107+
<footer>
108+
<div class="footer-inner">
109+
<div class="footer-left">
110+
<div class="footer-brand"><img src="/gladium-logo.png" alt="Gladium AI" class="logo-img"></div>
111+
<div class="footer-tagline">AI agents that deliver real results.</div>
112+
<div class="footer-address">Gladium Agency AI LLC<br>30N South Gould Street, STE R<br>Sheridan, WY 82801<br>United States</div>
113+
<div class="footer-copy">&copy; 2026 Gladium Agency AI LLC. All rights reserved.</div>
114+
</div>
115+
<div class="footer-right">
116+
<div class="footer-col">
117+
<h4>Company</h4>
118+
<a href="/#solutions">Solutions</a>
119+
<a href="/#agents">Agents</a>
120+
<a href="/#open-source">Open Source</a>
121+
<a href="/#contact">Contact</a>
122+
</div>
123+
<div class="footer-col">
124+
<h4>Connect</h4>
125+
<div class="footer-socials">
126+
<a href="#" aria-label="X"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"/></svg></a>
127+
<a href="#" aria-label="LinkedIn"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M20.447 20.452h-3.554v-5.569c0-1.328-.027-3.037-1.852-3.037-1.853 0-2.136 1.445-2.136 2.939v5.667H9.351V9h3.414v1.561h.046c.477-.9 1.637-1.85 3.37-1.85 3.601 0 4.267 2.37 4.267 5.455v6.286zM5.337 7.433a2.062 2.062 0 01-2.063-2.065 2.064 2.064 0 112.063 2.065zm1.782 13.019H3.555V9h3.564v11.452zM22.225 0H1.771C.792 0 0 .774 0 1.729v20.542C0 23.227.792 24 1.771 24h20.451C23.2 24 24 23.227 24 22.271V1.729C24 .774 23.2 0 22.222 0h.003z"/></svg></a>
128+
<a href="https://github.com/gladium-ai" aria-label="GitHub"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor"><path d="M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"/></svg></a>
129+
</div>
130+
</div>
131+
</div>
132+
</div>
133+
</footer>
134+
135+
<script type="module" src="/src/blog-nav.js"></script>
136+
</body>
137+
</html>
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
---
2+
title: "Why AI Agents Need Dedicated CLI Tools"
3+
description: "Generic APIs weren't designed for agents. Here's why we built purpose-built CLI tools for LinkedIn, X, n8n, and Apollo — and what makes them different."
4+
date: 2026-03-18
5+
tags: [AI Agents, CLI, Developer Tools, Open Source]
6+
author: Gladium AI
7+
---
8+
9+
Most AI agent frameworks assume one thing: that your agent can just call an API and everything will work. In practice, this is rarely true.
10+
11+
APIs are designed for human developers who read docs, handle pagination, manage auth tokens, and understand rate limits. Agents don't do any of that well — unless you build abstractions that make it effortless.
12+
13+
That's why we built dedicated CLI tools.
14+
15+
## The problem with raw APIs
16+
17+
Take LinkedIn as an example. If you want an AI agent to search for profiles, enrich contact data, and send outreach messages, you need to:
18+
19+
- Authenticate with OAuth 2.0 (with token refresh)
20+
- Navigate a complex, underdocumented API surface
21+
- Handle rate limiting and retry logic
22+
- Parse deeply nested JSON responses
23+
- Map between different entity formats
24+
25+
An agent can technically do all of this. But it's fragile, slow, and burns through tokens parsing irrelevant response data.
26+
27+
## Purpose-built for agents
28+
29+
Our CLI tools like `gladium-linkedin` and `gladium-n8n` are designed with a simple principle: **every command should map to a single agent action**.
30+
31+
```bash
32+
gladium-linkedin search --role "CTO" --location "San Francisco" --limit 20
33+
```
34+
35+
No auth management. No pagination logic. No response parsing. The agent gets clean, structured output it can immediately act on.
36+
37+
### What makes them different
38+
39+
1. **Structured output** — Every command returns JSON that agents can parse without guessing
40+
2. **Single-action commands** — One command = one agent decision, no multi-step API choreography
41+
3. **Built-in error handling** — Retries, rate limiting, and graceful failures are handled internally
42+
4. **Composable** — Pipe output between tools: search on LinkedIn → enrich with Apollo → trigger n8n workflow
43+
44+
## The architecture
45+
46+
Each CLI tool follows the same pattern:
47+
48+
- **Parser layer** — Translates high-level commands into platform-specific API calls
49+
- **Auth manager** — Handles tokens, refresh, and credential storage
50+
- **Output formatter** — Normalizes responses into a consistent JSON schema
51+
- **Error handler** — Catches failures and returns structured error objects (never stack traces)
52+
53+
This means an agent using `gladium-n8n` doesn't need to know anything about n8n's REST API. It just runs commands and gets results.
54+
55+
## Open source
56+
57+
All of our CLI tools are open source. We believe the best way to build trust with the developer community is to let them see exactly how our tools work — and contribute to making them better.
58+
59+
- [n8n-cli on GitHub](https://github.com/Gladium-AI/n8n-cli)
60+
- [x-cli on GitHub](https://github.com/Gladium-AI/x-cli)
61+
62+
## What's next
63+
64+
We're actively building CLI tools for more platforms. If you're building AI agents and hitting the same API friction we did, [get in touch](/#contact) — or open an issue on GitHub.
65+
66+
The future of AI agents isn't about better models. It's about better tools.

0 commit comments

Comments
 (0)