Here’s the more technical version of the Crosspost to Inkwell WordPress plugin until it gets published on WordPress. Will likely put it up on Github eventually.
Crosspost to Inkwell — Development ChangelogVersion 1.0.0 — Submitted 03/10/2602/27/26 — 1:02 AM — Initial buildPlugin created with auto-crosspost on publish via
transition_post_statushookManual crosspost button in the post editor sidebar (AJAX, no page reload)
Featured image upload via
POST /api/imagesbefore entry creationPost tags synced and sanitized to Inkwell's alphanumeric+hyphen format
Per-post overrides: disable crosspost, custom category, custom privacy
Crosspost status and Inkwell entry URL stored in post meta and displayed in sidebar
Configurable default privacy (
public,friends_only,private)Optional featured image and excerpt sending
Support for custom post types in addition to standard posts
03/01/26 — 12:55 AM — API layer & double-post fixRebuilt API integration against the official Inkwell API docs (inkwell.social/developers)
Added live API key verification on settings page
Fixed double-posting bug: WordPress fires
transition_post_statusmultiple times per save; resolved with static$fired[]array + transient lock +_inkwell_crosspostedmeta guardPlugin renamed to "WP Inkwell Crosspost"
03/05/26 — 9:12 AM — StabilityRolled back an unstable version of the double-post fix; restored stable build
03/06/26 — 12:39 AM — Submission prep beginsMapped full WordPress.org plugin directory submission checklist
03/09/26 — 4:02 PM — readme & validatorreadme.txtwritten to WordPress.org specDonate link added
Tested up toupdated to 6.9
03/09/26 — 6:15 PM — Naming compliancePlugin renamed from "WP Inkwell Crosspost" → "Crosspost to Inkwell" per WP.org Guideline 17
03/09/26 — 7:04 PM — Security audit & PCP complianceFull output escaping audit:
esc_html(),esc_attr(),esc_url(),esc_textarea()applied throughoutAll
$_POSTreads wrapped withwp_unslash()+ appropriate sanitize functionsanitize_key()for post type slugs;sanitize_text_field()for all other string inputsAll forms and AJAX actions protected by nonces via
check_ajax_referer()register_setting()modernized to array format withsanitize_callbackin_array()uses strict comparison (true) throughoutmb_substr()explicitly specifiesUTF-8encodingfile_get_contents()replaced with WP Filesystem API
03/09/26 — 8:39 PM — i18n, JS & form cleanupFull i18n across all ~99 user-facing strings with
/* translators: */commentsload_plugin_textdomain()removed (auto-loaded since WP 4.6)Nested
<form>removed — Verify Key button converted to pure AJAXAll JavaScript moved to properly registered handles via
wp_add_inline_script(); no raw<script>blocksVersion set to 1.0.0; settings stored in
wp_options; no custom database tables
03/10/26 — 10:02 PM — Final pre-submission fixesAll
wp_enqueue_script()calls moved toadmin_enqueue_scriptshookcurrent_time('mysql')replaced withwp_date('Y-m-d H:i:s')(deprecated since WP 5.3)wp_register_script()srcchanged from''tofalsefor inline-only handlesRequires at least: 5.8andRequires PHP: 7.4added to PHP file headerLicense URI unified to
gpl-2.0.htmlacross PHP header and readmeExternal service disclosure and privacy notice added to readme.txt
Plugin slug renamed from
inkwell-crosspost→crosspost-to-inkwellthroughoutText domain:
crosspost-to-inkwellSubmitted to WordPress.org plugin directory ✅
Marginalia3
This is so cool @eve! So lucky to have you on here and building things to talk to Inkwell.
Naw thank you for creating a platform that is really filling a void. I just like to contribute to things I’m passionate about
I’m so happy you are enjoying Inkwell. I am too. I love seeing posts from all over and new users trickling in. We will always remember that Eve was first!