Files
wiki/public/openapi.yaml
Wayne Sutton 87e02d00dc feat: add featured section, logo gallery, Firecrawl import, and API export
Featured Section
- Frontmatter-controlled featured items with featured: true and featuredOrder
- Card view with excerpts and list/card toggle button
- View preference saved to localStorage
- New Convex queries for featured posts and pages with by_featured index

Logo Gallery
- Continuous marquee scroll with clickable logos
- CSS animation, grayscale with color on hover
- Configurable speed, position, and title
- 5 sample logos included

Firecrawl Content Importer
- npm run import <url> scrapes external URLs to markdown drafts
- Creates local files in content/blog/ with frontmatter
- Then sync to dev or prod (no separate import:prod command)

API Enhancements
- New /api/export endpoint for batch content fetching
- AI plugin discovery at /.well-known/ai-plugin.json
- OpenAPI 3.0 spec at /openapi.yaml
- Enhanced llms.txt documentation

Documentation
- AGENTS.md with codebase instructions for AI agents
- Updated all sync vs deploy tables to include import workflow
- Renamed content/pages/changelog.md to changelog-page.md

Technical
- New components: FeaturedCards.tsx, LogoMarquee.tsx
- New script: scripts/import-url.ts
- New dependency: @mendable/firecrawl-js
- Schema updates with featured, featuredOrder, excerpt fields
2025-12-18 12:28:25 -08:00

196 lines
4.9 KiB
YAML

openapi: 3.0.3
info:
title: Markdown Blog API
description: |
API for accessing blog posts and pages as markdown content.
All endpoints return JSON by default. Use format=md for raw markdown.
version: 1.6.0
contact:
url: https://github.com/waynesutton/markdown-site
servers:
- url: https://markdowncms.netlify.app
description: Production server
paths:
/api/posts:
get:
summary: List all posts
description: Returns a list of all published blog posts with metadata
operationId: listPosts
responses:
'200':
description: List of posts
content:
application/json:
schema:
type: object
properties:
site:
type: string
example: Markdown Site
url:
type: string
example: https://markdowncms.netlify.app
posts:
type: array
items:
$ref: '#/components/schemas/PostSummary'
/api/post:
get:
summary: Get a single post
description: Returns a single post by slug. Use format=md for raw markdown.
operationId: getPost
parameters:
- name: slug
in: query
required: true
description: The post slug (URL path)
schema:
type: string
- name: format
in: query
required: false
description: Response format (json or md)
schema:
type: string
enum: [json, md, markdown]
default: json
responses:
'200':
description: Post content
content:
application/json:
schema:
$ref: '#/components/schemas/Post'
text/markdown:
schema:
type: string
'400':
description: Missing slug parameter
'404':
description: Post not found
/api/export:
get:
summary: Export all posts with content
description: Returns all posts with full markdown content for batch processing
operationId: exportPosts
responses:
'200':
description: All posts with full content
content:
application/json:
schema:
type: object
properties:
site:
type: string
url:
type: string
exportedAt:
type: string
format: date-time
posts:
type: array
items:
$ref: '#/components/schemas/Post'
/rss.xml:
get:
summary: RSS feed
description: Standard RSS 2.0 feed with post descriptions
operationId: rssFeed
responses:
'200':
description: RSS XML feed
content:
application/rss+xml:
schema:
type: string
/rss-full.xml:
get:
summary: Full content RSS feed
description: RSS feed with complete post content (for LLMs)
operationId: rssFullFeed
responses:
'200':
description: RSS XML feed with full content
content:
application/rss+xml:
schema:
type: string
/sitemap.xml:
get:
summary: XML Sitemap
description: Dynamic sitemap for search engines
operationId: sitemap
responses:
'200':
description: XML Sitemap
content:
application/xml:
schema:
type: string
components:
schemas:
PostSummary:
type: object
properties:
title:
type: string
example: How to Build a Blog
slug:
type: string
example: how-to-build-blog
description:
type: string
example: A guide to building a markdown blog
date:
type: string
format: date
example: '2025-01-15'
readTime:
type: string
example: 5 min read
tags:
type: array
items:
type: string
example: [tutorial, markdown]
url:
type: string
example: https://markdowncms.netlify.app/how-to-build-blog
markdownUrl:
type: string
example: https://markdowncms.netlify.app/api/post?slug=how-to-build-blog
Post:
type: object
properties:
title:
type: string
slug:
type: string
description:
type: string
date:
type: string
format: date
readTime:
type: string
tags:
type: array
items:
type: string
url:
type: string
content:
type: string
description: Full markdown content