I don't "love" Obsidian yet. I'm barely a beginner.
I definitely don't "love" Webflow. It feels like overkill for a simple blog.
But I have been stuck in a loop of "Over Optimization" for months. I wanted to build this website in public, but the friction of just getting a thought online was stopping me.
So, instead of learning to code from scratch, I "vibe coded" a solution with Cursor (using Claude Sonnet 4.5 and Gemini 3.0 Pro).
This post? It's my "Hello, World!" — except instead of printing to a terminal, I'm publishing to the web.
This is the inaugural post of the Over Optimized build log.
* Time to Build: ~4 hours (including debugging terminal configs and API versions).
* Goal: Create a "zero-friction" publishing button.
* Status: Success.
I needed a way to draft a thought in my local notes, hit one button, and see it live on my site.
Here is the surprisingly simple architecture we built:
graph LR
A[📝 Obsidian<br/>Markdown + Frontmatter] --> B[🐍 Python Script<br/>publish.py]
B --> C{Status: live?}
C -->|Yes| D[🔄 Convert to HTML]
C -->|No| E[⏭️ Skip]
D --> F[📊 Generate Schema.org]
F --> G[🚀 Webflow CMS API]
G --> H[🌐 Live Site]
style A fill:#e3f2fd
style D fill:#fff3e0
style G fill:#e8f5e9
style H fill:#f3e5f5
Notes) where I drop my thoughts.| Tool | Cost | Setup Time | Purpose |
|---|---|---|---|
| Obsidian | Free | 5 min | Local note-taking |
| Python 3.8+ | Free | Pre-installed | Run the script |
| Cursor Pro | $20/mo | 15 min | AI code editor |
| Claude Sonnet 4.5 | (via Cursor) | — | Code generation |
| Gemini 3.0 Pro | Free tier | — | Additional AI assist |
| Webflow CMS | $16/mo | 10 min | CMS hosting |
Total Setup: ~30 minutes
Monthly Cost: ~$36 (Cursor Pro + Webflow CMS)
Note: While free alternatives exist, the paid tools significantly reduce debugging time and iteration cycles.
The workflow is designed to be brain-dead simple so I can't procrastinate:
Create a markdown file in your designated folder.
At the top of your note, add frontmatter to control publishing:
---
headline: "Your Post Title"
slug: "your-url-slug"
status: "live"
description: "SEO description for search results"
---
For posts with live data, create a data.json file:
{
"star_wars": {
"death_star": { "completion": "98.3%", "weakness": "thermal exhaust port" }
},
"star_trek": {
"enterprise": { "warp_capability": 9.6, "crew_count": 1012 }
}
}
Now write 98.3% in your Markdown, and the script injects the value at publish time. Perfect for dashboards or data-driven posts. "That's no moon..."
Run the script from your terminal:
python publish.py
The script scans your folder, grabs notes marked status: live, converts Markdown to HTML, and pushes them to Webflow via API.
The Real Insight: This isn't about building the perfect system. It's about building any system that removes the friction between "I have a thought" and "It's live."
I am not a coder. I've been using the Cursor[4] editor for a few months, but building a custom API integration like this would have taken me weeks on my own. With Claude Sonnet 4.5[5] (via Cursor) and Gemini 3.0 Pro[6], we built, debugged, and launched it in one session.
This isn't about the tech. It's about breaking the paralysis. Now that the "pipeline" is built, I have no excuse. I can just write.
Is it truly "Zero Friction"? No. I still have to run a script. It might break. But it is infinitely better than the copy-paste formatting hell I was in before.
What's Working:
- [x] Local Markdown workflow in Obsidian
- [x] One-command publishing via Python script
- [x] Automatic HTML conversion
- [x] Webflow CMS integration via API
- [x] SEO metadata control through frontmatter
Time to First Publish: 4 hours (including learning and debugging)
Now that the pipeline works, the natural progression:
Google Search Console Integration: Connect GSC data to see which posts actually get traffic and what queries bring people in. Close the feedback loop.
Permanent Ownership Layer: Archive published content to Arweave or IPFS so I have a cryptographically-verified, permanent record of my work — even if Webflow disappears tomorrow.
Scheduled Publishing: Move the script to a cron job or serverless function so updates can publish automatically without manual intervention.
But for now, I have a "Publish" command. And it works.
The sections below provide citations and technical documentation for reference.
[1] Obsidian - Markdown-based note-taking app
[2] Python 3.12 - Scripting language
[3] Webflow CMS - Headless CMS platform
[4] Cursor - AI-powered code editor
[5] Claude Sonnet 4.5 - Code generation (via Cursor)
[6] Gemini 3.0 Pro - AI assistance for editing and iteration
APIs Used:
- Webflow CMS API v2 - Publishing automation
- Schema.org HowTo - Structured data markup
Python Libraries:
- python-frontmatter - YAML parsing
- markdown - HTML conversion with tables and fenced_code extensions
- requests - HTTP client
Tools:
- Google Rich Results Test - Schema validation
- Git - Version control
| Version | Date | Changes |
|---|---|---|
| 1.0 | 2025-12-08 | Initial publication with SEO-optimized structure, requirements table, and step-by-step guide |
This article is version controlled for transparency. Content hash, license, and provenance data available in page metadata.
By Tree. Edited with assistance from Claude Sonnet 4.5 and Gemini 3.0 Pro via Cursor AI. Publishing script coded in Cursor AI with assistance from the same.