Update version to 1.0.0 across package.json and changelog. Configure netlify.toml with Convex deployment URL (agreeable-trout-200.convex.site). Verify TypeScript type-safety for src and convex directories. Confirm Netlify build passes with SPA 404 fallback configured. Update TASK.md with deployment steps and files.md with complete file structure.
5.2 KiB
title, description, date, slug, published, tags, readTime
| title | description | date | slug | published | tags | readTime | ||||
|---|---|---|---|---|---|---|---|---|---|---|
| How to Publish a Blog Post | A quick guide to writing and publishing markdown blog posts using Cursor after your blog is set up. | 2025-01-17 | how-to-publish | true |
|
3 min read |
How to Publish a Blog Post
Your blog is set up. Now you want to publish. This guide walks through writing a markdown post and syncing it to your live site using Cursor.
Create a New Post
In Cursor, create a new file in content/blog/:
content/blog/my-new-post.md
The filename can be anything. The URL comes from the slug field in the frontmatter.
Add Frontmatter
Every post starts with frontmatter between triple dashes:
---
title: "Your Post Title"
description: "A one-sentence summary for SEO and social sharing"
date: "2025-01-17"
slug: "your-post-url"
published: true
tags: ["tag1", "tag2"]
readTime: "5 min read"
---
| Field | Required | What It Does |
|---|---|---|
title |
Yes | Displays as the post heading |
description |
Yes | Shows in search results and sharing |
date |
Yes | Publication date (YYYY-MM-DD) |
slug |
Yes | Becomes the URL path |
published |
Yes | Set true to show, false to hide |
tags |
Yes | Topic labels for the post |
readTime |
No | Estimated reading time |
image |
No | Open Graph image for social sharing |
Write Your Content
Below the frontmatter, write your post in markdown:
# Your Post Title
Opening paragraph goes here.
## First Section
Content for the first section.
### Subheading
More details here.
- Bullet point one
- Bullet point two
## Code Example
\`\`\`typescript
const greeting = "Hello, world";
console.log(greeting);
\`\`\`
## Conclusion
Wrap up your thoughts.
Sync to Convex
Open Cursor's terminal and run:
npm run sync
This reads all markdown files in content/blog/, parses the frontmatter, and uploads them to your Convex database.
You should see output like:
Syncing posts to Convex...
Synced: my-new-post
Done! Synced 1 post(s).
Your post is now live. No rebuild. No redeploy. The site updates in real time.
Publish to Production
If you have separate dev and prod Convex deployments, sync to production.
First-time setup: Create .env.production.local in your project root:
VITE_CONVEX_URL=https://your-prod-deployment.convex.cloud
Get your production URL from the Convex Dashboard by selecting your project and switching to the Production deployment.
Sync to production:
npm run sync:prod
Environment Files
| File | Purpose |
|---|---|
.env.local |
Dev deployment (created by npx convex dev) |
.env.production.local |
Prod deployment (create manually) |
Both files are gitignored.
Quick Workflow in Cursor
Here is the full workflow:
- Create file:
content/blog/my-post.md - Add frontmatter: Title, description, date, slug, published, tags
- Write content: Markdown with headings, lists, code blocks
- Sync: Run
npm run syncin terminal - View: Open your site and navigate to
/your-slug
Tips
Draft posts: Set published: false to save a post without showing it on the site.
Update existing posts: Edit the markdown file and run npm run sync again. Changes appear instantly.
Delete posts: Remove the markdown file from content/blog/ and run sync. The post will be removed from the database.
Unique slugs: Each post needs a unique slug. The sync will fail if two posts share the same slug.
Date format: Use YYYY-MM-DD format for the date field.
Adding Images
Place images in public/images/ and reference them in your post:

For the Open Graph image (social sharing), add to frontmatter:
image: "/images/my-post-og.png"
Checking Your Post
After syncing, verify your post:
- Open your local dev server:
http://localhost:5173 - Your post should appear in the post list
- Click through to check formatting
- Test code blocks and images render correctly
Adding Static Pages
You can also create static pages like About, Projects, or Contact. These appear as navigation links in the top right.
- Create a file in
content/pages/:
content/pages/about.md
- Add frontmatter:
---
title: "About"
slug: "about"
published: true
order: 1
---
Your page content here...
- Run
npm run sync
The page will appear in the navigation. Use order to control the display sequence (lower numbers appear first).
Summary
Publishing is three steps:
- Write markdown in
content/blog/orcontent/pages/ - Run
npm run sync - Done
The Convex database updates immediately. Your site reflects changes in real time. No waiting for builds or deployments.