Docs · Signing in · What Quill sends · Syndication and channels · Photos and the media endpoint · Food and drink · Keyboard shortcuts and bookmarklets

What Quill sends

Every post is a POST to your Micropub endpoint with Content-Type: application/json and Authorization: Bearer …. The body is the JSON syntax from the spec: a type and a properties object whose values are always lists. Quill expects 201 or 202 with a Location header naming the new post, and takes you there.

Properties that are empty are left out. The mp-* commands sit beside the ordinary properties.

Note

{
  "type": ["h-entry"],
  "properties": {
    "content": ["Hello world"],
    "category": ["indieweb", "quill"],
    "photo": [{"value": "https://example.com/media/1.jpg", "alt": "A cat"}, "https://example.com/media/2.jpg"],
    "in-reply-to": ["https://other.example/post"],
    "rsvp": ["yes"],
    "location": ["geo:45.5231,-122.6765;u=20"],
    "published": ["2026-10-02T08:30:00-07:00"],
    "mp-slug": ["hello"],
    "mp-syndicate-to": ["https://fed.example/@me"],
    "mp-channel": ["notes"],
    "post-status": ["draft"],
    "visibility": ["private"]
  }
}

rsvp is only sent when replying to an event. published, mp-slug, mp-channel, post-status and visibility are only sent when you set them (the published date is behind Ctrl+Shift+D). p3k-content-type: text/markdown is added when you switch the content type to Markdown (Ctrl+Shift+M).

Article

Articles are written in Markdown. By default the HTML is sent: "content": [{"html": "<p>…</p>"}] with name, category, mp-slug and post-status (draft only; published is the default and is not sent). In Settings you can choose to send the Markdown source instead: "content": ["…"] plus "p3k-content-type": ["text/markdown"].

Bookmark, like, repost

bookmark-of (with optional name, content and category), like-of, repost-of, each with the URL. Editing a like or repost sends an update:

{"action": "update", "url": "https://example.com/likes/1", "replace": {"like-of": ["https://new.example/"]}}

Event

{
  "type": ["h-event"],
  "properties": {
    "name": ["IndieWebCamp"],
    "start": ["2026-11-01T09:00-07:00"],
    "end": ["2026-11-02"],
    "location": [{"type": ["h-card"], "properties": {"name": ["Venue"], "latitude": [45.52], "longitude": [-122.68], "locality": ["Portland"], "region": ["OR"], "country-name": ["United States"]}}],
    "content": ["…"],
    "mp-channel": ["events"]
  }
}

Without a venue match, location is the text you typed. The presentation fields (Ctrl+Shift+P) add slides, slides-embed, video-link, video-embed and a nested conference h-event.

Review

{"type": ["h-review"], "properties": {"item": [{"type": ["h-product"], "properties": {"name": ["…"], "url": ["…"]}}], "rating": [4], "best": [5], "content": ["…"], "summary": ["…"]}}

Weight

{"type": ["h-entry"], "properties": {"weight": [{"type": ["h-measure"], "properties": {"num": [72.5], "unit": ["kg"]}}], "published": ["…"]}}

Itinerary

{"type": ["h-entry"], "properties": {"itinerary": [{"type": ["h-leg"], "properties": {"transit-type": ["air"], "operator": ["Alaska"], "number": ["123"], "origin": ["PDX"], "destination": ["SFO"], "departure": ["2026-10-10T08:00:00-07:00"], "arrival": ["2026-10-10T10:00:00-07:00"]}}]}}

Food and drink

{"type": ["h-entry"], "properties": {"published": ["…"], "summary": ["Just drank: Americano"], "location": ["geo:…"], "drank": [{"type": ["h-food"], "properties": {"name": ["Americano"]}}]}}

Food uses ate. The location is either a geo: URI or the URL of your most recent checkin post.

Troubleshooting

When a post fails, the page shows the exact request and the raw response from your endpoint. The last response is also kept on the Settings page.