editor.tanna.dev
editor.tanna.dev is a Micropub client, built by Jamie Tanna for the community, as a way to get a fully auto-configuring Micropub client, to make it possible to use not-as-standard post-types without having to hand-craft your own Micropub editor.
Features:
- Refresh tokens
- IndieAuth metadata
- Autoconfiguring
- Bookmarklet friendly
Requirements
This Micropub client requires two key extensions, q=properties, and the q=config
containing a list of supported post-types and their properties.
Example q=config response
{
"syndicate-to": [
{
"uid": "https://indieweb.xyz/en/microformats",
"name": "/en/Microformats"
},
{
"uid": "https://indieweb.xyz/en/indieweb",
"name": "/en/IndieWeb"
},
{
"uid": "https://news.indieweb.org/en",
"name": "IndieNews"
},
{
"uid": "https://indieweb.xyz/en/blogging",
"name": "/en/Blogging"
},
{
"uid": "https://brid.gy/publish/github",
"name": "Brid.gy GitHub Syndication"
},
{
"uid": "https://brid.gy/publish/twitter",
"name": "Brid.gy Twitter Syndication"
},
{
"uid": "https://indieweb.xyz/en/tools",
"name": "/en/Tools"
}
],
"media-endpoint": "https://www-api.jvt.me/micropub/media",
"q": [
"post-types",
"contact",
"syndicate-to",
"source",
"category",
"config",
"properties"
],
"post-types": [
{
"type": "bookmark",
"name": "Bookmark",
"h": "entry",
"properties": [
"bookmark-of",
"published",
"name",
"category",
"content",
"post-status",
"syndication"
],
"required-properties": [
"bookmark-of",
"published"
]
},
{
"type": "like",
"name": "Like",
"h": "entry",
"properties": [
"like-of",
"published",
"category",
"content",
"name",
"post-status",
"syndication"
],
"required-properties": [
"like-of",
"published"
]
},
{
"type": "reply",
"name": "Reply",
"h": "entry",
"properties": [
"content",
"in-reply-to",
"published",
"category",
"name",
"photo",
"post-status",
"syndication",
"mp-photo-alt"
],
"required-properties": [
"content",
"in-reply-to",
"published"
]
},
{
"type": "reads",
"name": "Reading",
"h": "entry",
"properties": [
"published",
"read-of",
"read-status",
"post-status",
"syndication"
],
"required-properties": [
"published",
"read-of",
"read-status"
]
},
{
"type": "repost",
"name": "Repost",
"h": "entry",
"properties": [
"published",
"repost-of",
"content",
"category",
"post-status",
"syndication"
],
"required-properties": [
"published",
"repost-of"
]
},
{
"type": "rsvp",
"name": "RSVP",
"h": "entry",
"properties": [
"in-reply-to",
"published",
"rsvp",
"category",
"content",
"post-status",
"syndication"
],
"required-properties": [
"in-reply-to",
"published",
"rsvp"
]
},
{
"type": "note",
"name": "Note",
"h": "entry",
"properties": [
"content",
"published",
"category",
"post-status",
"syndication"
],
"required-properties": [
"content",
"published"
]
},
{
"type": "photo",
"name": "Photo",
"h": "entry",
"properties": [
"photo",
"published",
"mp-photo-alt",
"category",
"content",
"post-status",
"syndication"
],
"required-properties": [
"photo",
"published",
"mp-photo-alt"
]
},
{
"type": "step",
"name": "Step Counts",
"h": "measure",
"properties": [
"unit",
"num",
"published",
"start",
"end",
"post-status"
],
"required-properties": [
"unit",
"num",
"published",
"start",
"end"
]
},
{
"type": "event",
"name": "Event",
"h": "event",
"properties": [
"end",
"name",
"published",
"start",
"content",
"url"
],
"required-properties": [
"end",
"name",
"published",
"start"
]
},
{
"type": "contact",
"name": "Contact",
"h": "card",
"properties": [
"name",
"nickname",
"url",
"rel=twitter"
],
"required-properties": [
"name",
"nickname",
"url"
]
},
{
"type": "listen",
"name": "Listen",
"h": "entry",
"properties": [
"listen-of",
"published",
"name",
"category",
"content",
"post-status",
"syndication"
],
"required-properties": [
"listen-of",
"published"
]
},
{
"type": "article",
"name": "Article",
"h": "entry",
"properties": [
"content",
"name",
"published",
"summary",
"category",
"post-status",
"code-license",
"prose-license",
"series",
"featured",
"syndication"
],
"required-properties": [
"content",
"name",
"published",
"summary"
]
}
]
}
Example q=properties response
{
"properties": [
{
"name": "name",
"hints": [],
"display-name": "Title"
},
{
"name": "nickname",
"hints": [],
"display-name": "Nickname"
},
{
"name": "photo",
"hints": [
"url"
],
"display-name": "Photo"
},
{
"name": "published",
"hints": [
"date"
],
"display-name": "Date Published"
},
{
"name": "category",
"hints": [
"multivalue"
],
"display-name": "Category / tag"
},
{
"name": "rsvp",
"hints": [],
"options": [
"yes",
"no",
"maybe",
"interested"
],
"default": "yes",
"display-name": "RSVP"
},
{
"name": "content",
"hints": [
"multiline"
],
"display-name": "content"
},
{
"name": "syndication",
"hints": [
"multivalue",
"url"
],
"display-name": "Syndication URL"
},
{
"name": "summary",
"hints": [],
"display-name": "Summary"
},
{
"name": "end",
"hints": [
"date"
],
"display-name": "End Date"
},
{
"name": "start",
"hints": [
"date"
],
"display-name": "Start Date"
},
{
"name": "num",
"hints": [],
"display-name": "Number"
},
{
"name": "unit",
"hints": [],
"display-name": "Unit"
},
{
"name": "url",
"hints": [
"url"
],
"display-name": "Url"
},
{
"name": "rel=twitter",
"hints": [],
"display-name": "Twitter username"
},
{
"name": "repost-of",
"hints": [
"url"
],
"display-name": "URL to be Reposted"
},
{
"name": "like-of",
"hints": [
"url"
],
"display-name": "URL to Like"
},
{
"name": "in-reply-to",
"hints": [
"url"
],
"display-name": "URL to Reply To"
},
{
"name": "bookmark-of",
"hints": [
"url"
],
"display-name": "URL to Bookmark"
},
{
"name": "read-status",
"hints": [],
"options": [
"to-read",
"reading",
"finished"
],
"default": "finished",
"display-name": "Reading Status"
},
{
"name": "read-of",
"hints": [
"url"
],
"display-name": "URL to Mark Reading Status Of"
},
{
"name": "post-status",
"hints": [],
"options": [
"draft",
"published"
],
"default": "published",
"display-name": "Whether the post is `published` or `draft`"
},
{
"name": "code-license",
"hints": [],
"display-name": "The license for all code snippets in the post"
},
{
"name": "prose-license",
"hints": [],
"display-name": "The license for all written content in the post"
},
{
"name": "series",
"hints": [],
"display-name": "A set of posts with a common theme / a set order"
},
{
"name": "featured",
"hints": [],
"display-name": "The featured image to be used for "
},
{
"name": "listen-of",
"hints": [
"url"
],
"display-name": "Listen-of"
}
]
}
editor.tanna.dev also requires the IndieAuth Server Metadata to be exposed by your website, and supports the refresh token grant.