An open-source portfolio that publishes itself. Point your AI agent at a git repo, it writes diary entries, curates newsletters, maintains a reading log. Site rebuilds on every push. No CMS. No database. Just git push.
Your agent writes diary/2026-03-31.md. Pushes it. Vercel sees the push, rebuilds the site. Your diary entry is live in under a minute. You didn't touch a keyboard.
Code is public. Content is private. Two repos, one site:
fri-portfolio(this repo) — Next.js app, components, styles, build scripts
fri-content(private) —diary/*.mdandweekly/*.md, your actual writing
At build time, a script pulls markdown from the private repo. A GitHub webhook triggers rebuild on every push.
No API. No webhook integration. No SDK. Your agent just needs to write a markdown file and git push. That's the entire publishing interface.
Paste this into OpenClaw, Claude Code, or any agent with git access:
You publish content to my website by pushing markdown files to my GitHub repo.
DIARY — push to diary/YYYY-MM-DD.md
---
title: "Entry title"
date: YYYY-MM-DD
summary: "One-liner for the list page"
---
Write naturally in markdown.
WEEKLY — push to weekly/{slug}.md
---
title: "Newsletter Title"
date: YYYY-MM-DD
summary: "What this issue covers"
cover: "https://example.com/image.jpg"
---
Newsletter in markdown. Bare URLs on their own line
become rich link preview cards automatically.
RULES:
- One file per entry
- title + date in frontmatter required
- Commit and push — the site rebuilds on its own
What to tell your agent:
"Every night, write a diary entry reflecting on my day. Push to
diary/YYYY-MM-DD.md."
"Every Sunday, collect the best design & engineering links. Write commentary. Push to
weekly/YYYY-WNN.md."
"When I share a link, save it. Every Friday, compile them into a newsletter."
Option A — Tell your OpenClaw or Claude Code agent:
Fork https://github.com/bravohenry/fri-portfolio and deploy it to Vercel. Create a private repo for my content. Set up the webhook so the site rebuilds when content is pushed.
Your agent handles the rest.
Option B — Do it yourself:
gh repo fork bravohenry/fri-portfolio --clone && cd fri-portfolio
gh repo create my-content --private
vercel link && vercel env add CONTENT_GITHUB_TOKEN production
vercel --prodThen create a deploy hook and wire it to your content repo as a GitHub webhook.
![]() |
![]() |
| Weekly Dispatch — curated design & engineering links with cover images and link previews | Diary — personal journal entries, auto-published by your agent |
AI Terminal — Visitors chat with your agent. Has personality. Will roast you back.
Matrix Rain — Diary text flows around the reactor core, per-line width via Pretext.
Link Previews — Bare URLs in markdown become glass-panel cards with OG metadata at build time.
Dark / Light — One toggle. All colors through CSS variables. Zero hardcoded values.
Real Stats — Entry count, word count, publishing frequency — computed from content.
Pure SSG — Content pages are static HTML. Zero client JS.
Project structure
src/
app/ /, /diary, /weekly, /diary/[slug], /weekly/[slug]
api/chat/ Minimax M2.7 streaming endpoint
components/
home/ ArcReactor, Terminal, MatrixRain, Diagnostics...
content/ EntryList, EntryPage, CoverImage
ui/ GlassPanel, TechBorder, ThemeToggle
lib/ content.ts → markdown.ts → og.ts → stats.ts
styles/ Theme tokens, keyframes, dark/light modes
scripts/
fetch-content.sh Pulls content from private repo at build time
MIT · Built by Zihan + Friday

