API-first publishing for the AI-IDE era
The first wave of blogging platforms had web editors. The second wave had markdown files in git repos. The third wave โ the one we're in now โ has AI agents that can write, edit, and publish content autonomously.
scsiwyg is built for the third wave.
The API is the product
Every scsiwyg interaction goes through the REST API:
| Endpoint | Method | What it does |
|---|---|---|
/api/{username}/posts | GET | List published posts |
/api/{username}/posts | POST | Create a post |
/api/{username}/posts/{slug} | GET | Read a post |
/api/{username}/posts/{slug} | PUT | Update a post |
/api/{username}/posts/{slug} | DELETE | Delete a post |
Read endpoints are public. Write endpoints use Bearer token auth. That's the entire API surface for content operations.
There's no web editor that's secretly the "real" way to use the platform. There's no admin panel that has features the API doesn't. The API is the product. The web views are just rendering what the API serves.
Why this matters for AI IDEs
When you work in Cursor, Claude Code, or GitHub Copilot, your AI assistant can:
- Read the OpenAPI spec at
/api/openapi.jsonand understand every endpoint, request format, and response schema - Generate valid post JSON from a natural language prompt like "write a blog post about my experience at the conference"
- Publish directly via the API with your Bearer token
- Check the result by GETting the published post
The entire workflow โ from "I want to blog about X" to "the post is live" โ can happen inside your IDE without you ever opening a browser.
# From Claude Code or any terminal:
curl -X POST https://scsiwyg.com/api/alice/posts \
-H "Authorization: Bearer $SCSIWYG_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"slug": "conference-recap",
"title": "Conference Recap",
"body": "# What I learned\n\nThe keynote was about..."
}'
The Node.js script pattern
For teams that want something more structured than curl but less complex than a full CMS client:
import { readFileSync } from 'fs';
const post = JSON.parse(readFileSync('post.json', 'utf-8'));
const res = await fetch(
`https://scsiwyg.com/api/${process.env.SCSIWYG_USER}/posts`,
{
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SCSIWYG_TOKEN}`,
'Content-Type': 'application/json',
},
body: JSON.stringify(post),
}
);
console.log(res.status, await res.json());
That's a complete publishing client. 15 lines. No dependencies.
Convention over configuration
Your blog URL is /username. Your post URL is /username/slug. There's nothing to configure, no custom domains to set up, no routing rules to define. The convention IS the configuration.
This means an AI agent can construct URLs without asking you. It knows where your blog is. It knows where each post will live. It can link between posts, preview URLs, and verify publication โ all from the URL convention alone.