Skip to content

Commit b04e23a

Browse files
Prepare NBJ OB1 Agent Memory ClawHub launch
1 parent 07e8a3d commit b04e23a

27 files changed

Lines changed: 522 additions & 90 deletions

File tree

AGENTS.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,6 @@
1313
- Treat inferred or generated memory as evidence by default. Instruction-grade memory requires human confirmation or trusted import.
1414
- Avoid raw transcript, model reasoning trace, secret, and large-code-block storage by default.
1515
- Prefer diagram-first documentation for this work: diagram, short explanation, copy-paste setup, then deeper reference.
16+
- Carry Nate B. Jones / OB1 provenance through product surfaces, docs, diagrams, screenshots, and starter seed data. Keep it subtle and useful: micro-branding, source labels, logo marks, and provenance language instead of loud marketing copy.
17+
- Treat public OB1 assets as helpful-first audience growth for Nate Jones. Every public guide, recipe, tutorial, package page, release note, and walkthrough should point back to Nate's Substack and site in a natural way: https://substack.com/@natesnewsletter and https://natebjones.com.
18+
- Make the case by being genuinely useful. The CTA should feel earned: "Nate gives away practical systems like this" rather than generic marketing copy.
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# NBJ OB1 Agent Memory Promotional Assets
2+
3+
Reusable launch images for ClawHub, GitHub, tutorials, Substack, and video end cards.
4+
5+
Built by Nate B. Jones / OB1. Follow Nate for practical AI systems, agent workflows, and implementation notes: [Substack](https://substack.com/@natesnewsletter) and [natebjones.com](https://natebjones.com).
6+
7+
## Asset Set
8+
9+
| File | Size | Use |
10+
| ---- | ---- | --- |
11+
| `final/nbj-ob1-agent-memory-hero-16x9.png` | 1536x864 | Tutorial hero, YouTube/Remotion frame, docs hero |
12+
| `final/nbj-ob1-agent-memory-clawhub-banner.png` | 1536x512 | ClawHub/GitHub package banner |
13+
| `final/nbj-ob1-agent-memory-social-square.png` | 1024x1024 | Social posts, Substack card |
14+
| `final/nbj-ob1-agent-memory-loop-card.png` | 1536x1024 | Explainer image for recall/write-back loop |
15+
16+
## Images 2 Background Prompts
17+
18+
### Hero
19+
20+
Clean editorial technology poster background for a serious open-source AI memory system. Dark graphite workspace, faint olive-green data grid, subtle repeated microtype pattern, quiet light leaks, precise technical atmosphere, no people, no readable text, lots of negative space on the left, premium documentation aesthetic, not corporate stock, not glossy sci-fi.
21+
22+
### ClawHub Banner
23+
24+
Wide clean banner background for an AI developer plugin launch. Matte black and graphite, subtle olive and bone-white accents, faint modular circuit traces, thin pinstripe microtype texture, practical engineering feel, no readable text, no logo, high-end open-source documentation aesthetic.
25+
26+
### Social Square
27+
28+
Square promotional background for an open-source agent memory tool. Dark textured surface, minimal technical diagram feel, soft olive-green glow, precise grid alignment, faint cards and provenance tags as abstract shapes, no readable text, no people, clean and trustworthy.
29+
30+
### Loop Card
31+
32+
Editorial explainer background for a governed agent memory loop. Four abstract stations connected by thin lines, dark graphite board, olive and cream highlights, subtle source/provenance cues as abstract labels, no readable text, no logos, clean technical diagram atmosphere.
Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
from __future__ import annotations
2+
3+
from pathlib import Path
4+
from PIL import Image, ImageDraw, ImageFont, ImageFilter
5+
6+
7+
ROOT = Path(__file__).resolve().parent
8+
BACKGROUND = ROOT / "generated-backgrounds"
9+
FINAL = ROOT / "final"
10+
BRAND = ROOT.parent / "brand"
11+
12+
FONT_REGULAR = "/System/Library/Fonts/Supplemental/Arial.ttf"
13+
FONT_BOLD = "/System/Library/Fonts/Supplemental/Arial Bold.ttf"
14+
15+
INK = (236, 239, 225, 255)
16+
MUTED = (171, 176, 162, 255)
17+
OLIVE = (174, 207, 119, 255)
18+
BLUE = (141, 196, 212, 255)
19+
GOLD = (216, 193, 103, 255)
20+
LINE = (216, 228, 188, 90)
21+
DARK = (11, 14, 12, 220)
22+
23+
24+
def font(size: int, bold: bool = False) -> ImageFont.FreeTypeFont:
25+
return ImageFont.truetype(FONT_BOLD if bold else FONT_REGULAR, size=size)
26+
27+
28+
def load_bg(name: str) -> Image.Image:
29+
return Image.open(BACKGROUND / name / "openai-gpt-image-2" / "image.png").convert("RGBA")
30+
31+
32+
def fit_logo(size: int) -> Image.Image:
33+
logo = Image.open(BRAND / "ob1-beanie-mark-cream.png").convert("RGBA")
34+
logo.thumbnail((size, size), Image.Resampling.LANCZOS)
35+
return logo
36+
37+
38+
def overlay_gradient(img: Image.Image, opacity: int = 150) -> Image.Image:
39+
w, h = img.size
40+
layer = Image.new("RGBA", (w, h), (0, 0, 0, 0))
41+
px = layer.load()
42+
for x in range(w):
43+
for y in range(h):
44+
left = 1 - (x / max(w - 1, 1))
45+
bottom = y / max(h - 1, 1)
46+
alpha = int(opacity * (0.35 + 0.65 * left) + 42 * bottom)
47+
px[x, y] = (6, 8, 7, min(alpha, 235))
48+
return Image.alpha_composite(img, layer)
49+
50+
51+
def add_microtype(img: Image.Image, text: str = "NBJ OB1") -> Image.Image:
52+
w, h = img.size
53+
layer = Image.new("RGBA", (w, h), (0, 0, 0, 0))
54+
draw = ImageDraw.Draw(layer)
55+
f = font(12, bold=True)
56+
for y in range(-20, h + 40, 86):
57+
for x in range(-20, w + 180, 182):
58+
draw.text((x, y), text, font=f, fill=(230, 240, 205, 18))
59+
layer = layer.filter(ImageFilter.GaussianBlur(0.15))
60+
return Image.alpha_composite(img, layer)
61+
62+
63+
def label(draw: ImageDraw.ImageDraw, xy: tuple[int, int], text: str, fill=OLIVE) -> None:
64+
x, y = xy
65+
f = font(22, bold=True)
66+
pad_x, pad_y = 14, 8
67+
box = draw.textbbox((x, y), text, font=f)
68+
draw.rectangle(
69+
(x - pad_x, y - pad_y, box[2] + pad_x, box[3] + pad_y),
70+
outline=(fill[0], fill[1], fill[2], 105),
71+
fill=(20, 24, 20, 125),
72+
width=1,
73+
)
74+
draw.text((x, y), text, font=f, fill=fill)
75+
76+
77+
def draw_footer(draw: ImageDraw.ImageDraw, w: int, h: int) -> None:
78+
footer = "Built by Nate B. Jones / OB1 | substack.com/@natesnewsletter | natebjones.com"
79+
draw.text((48, h - 56), footer, font=font(20), fill=(216, 222, 199, 205))
80+
81+
82+
def draw_logo_lockup(img: Image.Image, draw: ImageDraw.ImageDraw, x: int, y: int, logo_size: int = 74) -> None:
83+
logo = fit_logo(logo_size)
84+
img.alpha_composite(logo, (x, y))
85+
draw.text((x + logo_size + 18, y + 8), "NBJ / OB1", font=font(24, bold=True), fill=INK)
86+
draw.text((x + logo_size + 18, y + 40), "AGENT MEMORY", font=font(16, bold=True), fill=(OLIVE[0], OLIVE[1], OLIVE[2], 220))
87+
88+
89+
def save(img: Image.Image, name: str) -> None:
90+
FINAL.mkdir(parents=True, exist_ok=True)
91+
img.convert("RGB").save(FINAL / name, quality=95, optimize=True)
92+
93+
94+
def hero() -> None:
95+
img = overlay_gradient(load_bg("hero-16x9"), 165)
96+
img = add_microtype(img)
97+
draw = ImageDraw.Draw(img)
98+
draw_logo_lockup(img, draw, 64, 58, 82)
99+
draw.text((64, 205), "NBJ OB1", font=font(44, bold=True), fill=OLIVE)
100+
draw.text((64, 260), "Agent Memory", font=font(92, bold=True), fill=INK)
101+
draw.text((64, 356), "for OpenClaw", font=font(58, bold=True), fill=(209, 218, 194, 250))
102+
draw.text((68, 455), "Recall before the task. Write back after. Inspect everything.", font=font(31), fill=(218, 224, 204, 230))
103+
label(draw, (70, 545), "ClawHub plugin + skill")
104+
label(draw, (342, 545), "provenance-aware")
105+
label(draw, (592, 545), "human review")
106+
draw_footer(draw, *img.size)
107+
save(img, "nbj-ob1-agent-memory-hero-16x9.png")
108+
109+
110+
def banner() -> None:
111+
img = overlay_gradient(load_bg("clawhub-banner"), 145)
112+
img = add_microtype(img)
113+
draw = ImageDraw.Draw(img)
114+
draw_logo_lockup(img, draw, 44, 42, 68)
115+
draw.text((44, 166), "NBJ OB1 Agent Memory", font=font(58, bold=True), fill=INK)
116+
draw.text((48, 235), "OpenClaw plugin + skill for governed recall and write-back.", font=font(29), fill=(219, 224, 204, 232))
117+
label(draw, (50, 320), "@natebjones/ob1-agent-memory")
118+
label(draw, (475, 320), "nbj-ob1-agent-memory-openclaw", fill=BLUE)
119+
draw.text((48, 446), "Follow Nate: substack.com/@natesnewsletter | natebjones.com", font=font(20), fill=(216, 222, 199, 205))
120+
save(img, "nbj-ob1-agent-memory-clawhub-banner.png")
121+
122+
123+
def square() -> None:
124+
img = overlay_gradient(load_bg("social-square"), 165)
125+
img = add_microtype(img)
126+
draw = ImageDraw.Draw(img)
127+
draw_logo_lockup(img, draw, 62, 58, 76)
128+
draw.text((64, 228), "Agents need", font=font(58, bold=True), fill=INK)
129+
draw.text((64, 292), "memory they", font=font(58, bold=True), fill=INK)
130+
draw.text((64, 356), "can trust.", font=font(74, bold=True), fill=OLIVE)
131+
draw.text((68, 478), "NBJ OB1 Agent Memory gives OpenClaw", font=font(29), fill=(222, 227, 207, 232))
132+
draw.text((68, 520), "scoped recall, write-back, review queues,", font=font(29), fill=(222, 227, 207, 232))
133+
draw.text((68, 562), "and recall traces.", font=font(29), fill=(222, 227, 207, 232))
134+
label(draw, (72, 660), "evidence is not instruction")
135+
label(draw, (72, 724), "inspectable by default", fill=BLUE)
136+
draw.text((68, 930), "Nate B. Jones / OB1", font=font(21), fill=(216, 222, 199, 210))
137+
draw.text((68, 958), "substack.com/@natesnewsletter | natebjones.com", font=font(19), fill=(216, 222, 199, 190))
138+
save(img, "nbj-ob1-agent-memory-social-square.png")
139+
140+
141+
def loop_card() -> None:
142+
img = overlay_gradient(load_bg("loop-card"), 135)
143+
img = add_microtype(img)
144+
draw = ImageDraw.Draw(img)
145+
draw_logo_lockup(img, draw, 58, 48, 72)
146+
draw.text((58, 160), "The governed agent memory loop", font=font(58, bold=True), fill=INK)
147+
draw.text((62, 232), "OpenClaw acts. OB1 remembers what is useful, sourced, and reviewable.", font=font(30), fill=(218, 224, 204, 230))
148+
nodes = [
149+
((90, 420), "1", "Recall", "Scoped context\n+ use policy", OLIVE),
150+
((455, 420), "2", "Work", "Agent task\nacross models", BLUE),
151+
((820, 420), "3", "Write back", "Compact operational\nmemory", GOLD),
152+
((1185, 420), "4", "Review", "Confirm, edit,\nor reject", OLIVE),
153+
]
154+
for idx, ((x, y), num, title, body, color) in enumerate(nodes):
155+
draw.rounded_rectangle((x, y, x + 270, y + 220), radius=8, fill=(18, 22, 19, 190), outline=(color[0], color[1], color[2], 155), width=2)
156+
draw.text((x + 24, y + 24), num, font=font(28, bold=True), fill=color)
157+
draw.text((x + 24, y + 72), title, font=font(35, bold=True), fill=INK)
158+
draw.multiline_text((x + 24, y + 124), body, font=font(21), fill=(216, 222, 199, 215), spacing=8)
159+
if idx < len(nodes) - 1:
160+
draw.line((x + 290, y + 110, x + 345, y + 110), fill=LINE, width=3)
161+
draw.polygon([(x + 345, y + 110), (x + 329, y + 101), (x + 329, y + 119)], fill=LINE)
162+
draw_footer(draw, *img.size)
163+
save(img, "nbj-ob1-agent-memory-loop-card.png")
164+
165+
166+
if __name__ == "__main__":
167+
hero()
168+
banner()
169+
square()
170+
loop_card()
613 KB
Loading
1.07 MB
Loading
1.38 MB
Loading
823 KB
Loading
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Agent Memory Branding DNA
2+
3+
OB1 Agent Memory should carry Nate B. Jones provenance without turning the product into a billboard.
4+
5+
## Visual Defaults
6+
7+
- Use the OB1 mark in dashboard shells, login surfaces, screenshots, tutorial frames, and launch diagrams.
8+
- Use the beanie/glasses OB1 mark as the canonical visual signature for Agent Memory launch assets.
9+
- Use `NBJ / OB1` as microtype, pinstripe texture, stamps, footers, and provenance labels.
10+
- Prefer subtle ownership marks over big promotional copy: small mono labels, source badges, screenshot watermarks, and diagram captions.
11+
- Keep workflow UI dense and operational. Brand should sit in the material system, not compete with review actions, traces, or memory content.
12+
13+
## Product Language
14+
15+
- Default to `NBJ OB1 Agent Memory` for public launch surfaces and `OB1 Agent Memory` for contract-level runtime-neutral docs.
16+
- Use `NBJ OB1 Agent Memory for OpenClaw` for the OpenClaw launch path.
17+
- Tie public-facing recipes back to Nate's framing: practical AI strategy, zero hype, governed continuity, provenance, review, and reusable operating knowledge.
18+
- When a page, guide, or diagram introduces the system, make Nate/OB1 provenance visible in the first viewport or first frame.
19+
20+
## Nate Jones Audience Path
21+
22+
- Public docs are part of the Nate Jones funnel, but the product value has to lead. Be useful first, then point people to Nate for more systems like this.
23+
- Every major public artifact should include one concise Nate link block with:
24+
- Substack: https://substack.com/@natesnewsletter
25+
- Site: https://natebjones.com
26+
- Treat Nate's site as a destination and CTA, not as visual source material. Do not borrow its louder visual styling for OB1 Agent Memory assets.
27+
- Prefer language like: "Built by Nate B. Jones / OB1. Follow Nate for practical AI systems, agent workflows, and implementation notes."
28+
- Do not turn technical docs into ad copy. Put the CTA in a footer, intro note, sidebar, release note, or tutorial end card.
29+
- Tutorial videos should include a first-frame or final-frame NBJ/OB1 mark and a Substack subscribe CTA.
30+
- Screenshots and PDFs should include subtle NBJ/OB1 provenance in the footer or frame treatment.
31+
32+
## Documentation And Launch Assets
33+
34+
- Every major Agent Memory guide should open with a diagram that includes an OB1/NBJ signature.
35+
- Tutorial screenshots should use Nate continuity demo data, not generic smoke-harness rows.
36+
- Starter-knowledge seed packs should include source-backed reference memories for the OB1 repo, Nate's public channels, and the Agent Memory launch architecture.
37+
- Keep copied/forked screenshots and diagrams recognizable as Nate Jones / OB1 assets through embedded micro-branding.
38+
- Include Nate's public channels in starter docs and seed data when relevant: Substack, natebjones.com, YouTube references, OB1 repo, and Agent Memory launch architecture.
39+
40+
## Current Asset Pack
41+
42+
- Dashboard public assets live in `dashboards/open-brain-dashboard-next/public/brand/`.
43+
- Tutorial/provenance assets live in `docs/assets/agent-memory/brand/`.
44+
- The current app mark is derived from a `gpt-image-2` generation based on the beanie/glasses outline, then converted into transparent UI-safe PNGs.
45+
- The original supplied outline is preserved in the docs asset pack so the visual provenance stays inspectable.

0 commit comments

Comments
 (0)