Desk9 AI Content Disclosure

Àpèjúwe

Desk9 AI Content Disclosure helps you document AI-assisted work in a calm, readable way. Choose tools (like OpenAI or Gemini), add a short or long disclaimer, pick a layout that fits your theme, and optionally expose a compact “tools used” line or badge-style hints.

Everything runs on your server—settings and post options are stored in your WordPress database. This plugin is a practical transparency aid; statutes and obligations depend on your context, so treat the copy as informational, not a legal guarantee.

Deutsch (Kurzfassung)

Mit diesem Plugin kennzeichnen Sie KI-unterstützte Inhalte klar für Besucherinnen und Besucher. Die ausführliche Anleitung folgt auf Englisch (Standard für WordPress.org). Übersetzungen über die Community: https://translate.wordpress.org/

Features

  • Global settings under Settings Desk9 AI Content Disclosure: pick AI tools, edit long and short disclaimers (English defaults), control card styling (including an optional accent stripe), toggle badges, and set how tool names appear (short labels, bundled icons, or full names).
  • Per-image marking: flag individual images as AI generated or edited—from the media library or straight from the image block—optionally naming the tool, and show a small pill over them on featured images, archives and images inside content.
  • Six designs, six color schemes: keep the Classic notice or switch to an accent-bar, minimal, editorial, technical or soft direction, each with contrast-checked colors and an optional dark variant.
  • Block editor: insert the dynamic disclosure block, adjust disclaimer length, AI-usage wording, and tools per instance—multiple blocks per post are supported when you need them.
  • Per-post document sidebar (supported post types): inherit global defaults, override text or tools, hide the inherited notice, or skip auto-append for that entry.
  • Shortcode [deskaico_disclosure] for precise placement in classic layouts, page builders, or template parts.
  • Optional auto-append after post content when a post is marked as AI-relevant—handy when authors should not forget a notice on long-form content.
  • Optional Beta JSON-LD (off by default): experimental machine-readable hints for advanced use cases; not canonical schema.org output and may change over time.
  • WPML-ready configuration file included for teams running multilingual sites (see FAQ).

Development

Official releases include readable source under src/ (JavaScript and Sass) plus package.json and webpack.config.js, so you can audit or fork the plugin without a separate repository. The compiled bundles that WordPress loads live in build/ and match what ships on WordPress.org when you run the production build.

Rebuild compiled assets (optional):

  1. Install Node.js (current LTS recommended) which includes npm.
  2. In the plugin directory, run npm install once to install dev dependencies.
  3. Run npm run build to regenerate the build/ assets.
  4. For active development with auto-rebuild, use npm run start.

Layout reference: src/disclosure/ contains the Gutenberg block; src/post-sidebar/ powers the document sidebar; webpack.config.js extends @wordpress/scripts so both entry points compile.

Translators and maintainers: translations are not bundled with the plugin; they are served as WordPress.org language packs, and WordPress generates the editorÌtumọ̀ Yorùbá: ’s JSON translation files from those packs itself. Contribute at https://translate.wordpress.org/projects/wp-plugins/desk9-ai-content-disclosure/ — languages/desk9-ai-content-disclosure.pot in this repository is the current string template.

Privacy / Data handling

  • No outbound analytics or telemetry are added by this plugin for its own purposes.
  • Data stays on your site: a serialized option and post meta are stored in the database with normal WordPress capability checks.
  • Deleting the plugin removes that data again: uninstall.php drops the deskaico_options option and every _deskaico_* post meta key (on each site of a multisite network).
  • No cookies are introduced by default.
  • Users with manage_options configure global defaults; authors and editors update per-entry values according to their roles.

Icon credits

The four provider icons under assets/icons/providers/ — OpenAI, Google Gemini, Anthropic and Meta — come from Simple Icons and are released under CC0 1.0, which is GPL-compatible. Full details, including what was removed and why, are listed in assets/icons/providers/ATTRIBUTION.md.

An icon is bundled only where it is the providerÌtumọ̀ Yorùbá: ’s actual mark, with no generic fallback artwork. Every other provider is shown as a short text abbreviation instead, because an invented symbol would tell a reader nothing about which tool was used.

Trademarks remain the property of their respective owners. The icons identify the tool an author worked with and imply no affiliation with, or endorsement by, those companies.

Internationalisation

Translations are delivered as WordPress.org language packs. WordPress downloads them automatically into wp-content/languages/plugins/ and loads them for both the PHP interface and the block editor — nothing is bundled inside the plugin folder, so updating a translation never requires a plugin release.

Tip: The dashboard language often follows Users Profile Language. If the site is localized but your user profile is still English, some strings may stay in English until you change that setting.

Help translate the plugin into your language at https://translate.wordpress.org/projects/wp-plugins/desk9-ai-content-disclosure/ — once a locale reaches the release threshold, every site in that language receives the pack automatically.

Àwọn àwòrán ìbòjú

Àwọn ìdí

Plugin yìí pèsè 1 ìdí.

  • AI Disclosure Displays an AI-assisted content disclosure with optional badges and semantic markup.

Ìgbéwọlẹ̀

From the WordPress.org plugin directory (recommended)

  1. In your admin dashboard, go to Plugins Add New.
  2. Search for Desk9 AI Content Disclosure.
  3. Click Install Now, then Activate.

Upload a ZIP file

  1. Download the plugin ZIP (from WordPress.org or your maintainer).
  2. Go to Plugins Add New Upload Plugin, choose the ZIP, and click Install Now.
  3. Click Activate Plugin.

Install via SFTP or hosting file manager

  1. Unzip the package on your computer if needed. You should have a folder named desk9-ai-content-disclosure.
  2. Upload that folder to wp-content/plugins/ on your site.
  3. In the dashboard, open Plugins and activate Desk9 AI Content Disclosure.

After activation: open Settings Desk9 AI Content Disclosure, review defaults, then add the block or shortcode where readers should see the notice. No command line or NPM is required for normal use.

FAQ

Do I need Node.js or NPM?

No. Pre-built scripts and styles ship in the build/ folder. Developers who want to rebuild from source can use Node—see Development below.

Does this plugin guarantee legal compliance (for example EU AI Act or Article 50)?

No. It helps you disclose AI use visibly, but laws and interpretations differ by region and use case. Consult qualified counsel for compliance questions.

What does “experimental JSON-LD” mean?

When enabled, the plugin can emit a non-standard JSON-LD script plus related data-* attributes once per page load. Treat it as beta: it is not a guaranteed schema.org pattern and may evolve.

Does the plugin send data to external services?

No dedicated telemetry or analytics endpoints are bundled. Settings and per-post data stay in your WordPress database. Output is rendered on your pages like other theme and plugin content.

Does it work with WPML, Polylang, or other multilingual plugins?

Yes. A wpml-config.xml ships with the plugin so WPML can register admin strings, translate the custom disclaimer meta field, and translate the text attribute on the shortcode (HTML allowed) while keeping structural fields consistent across languages. Other multilingual setups can use similar approaches or WordPress filters—see the FAQ entry on hooks in older documentation if you customize output.

Àwọn àgbéyẹ̀wò

Kò sí àwọn àgbéyẹ̀wò fún plugin yìí.

Àwọn Olùkópa & Olùgbéejáde

“Desk9 AI Content Disclosure” jẹ́ ètò ìṣàmúlò orísun ṣíṣí sílẹ̀. Àwọn ènìyàn wọ̀nyí ti ṣe ìkópa sí plugin yìí.

Àwọn Olùkópa

Túmọ̀ “Desk9 AI Content Disclosure” sí èdè rẹ.

Ṣe o nífẹ̀ẹ́ sí ìdàgbàsókè?

Ṣàwárí koodu, ṣàyẹ̀wò ibi ìpamọ́ SVN, tàbí ṣe àgbékalẹ̀ sí àkọsílẹ̀ ìdàgbàsókè nípasẹ̀ RSS.

Àkọsílẹ̀ àwọn àyípadà

1.4.1

  • Repairs the 1.4.0 package, which reached WordPress.org incomplete: several files — including includes/class-deskaico-image-badge.php, which the plugin loads on every request — were never committed to the release tag. Installing or updating to 1.4.0 therefore ended in a fatal error. Nothing else changed; 1.4.1 is 1.4.0 with all of its files.

1.4.0

  • New: design directions for the notice. The existing look is now named Classic and remains the default, joined by Accent bar (clear and official, with a small heading and the same sparkle the image pill uses), Minimal (reads like a footnote), Editorial (serif, masthead tone), Technical (monospace marker) and Soft (frameless, rounded, warm).
  • New: six color schemes — neutral grey, blue, warm grey/sand, green, violet and black-and-white — each setting background, border and text together at a verified contrast ratio of at least 4.5:1. Every scheme also carries a dark variant that can follow the visitorÌtumọ̀ Yorùbá: ’s system preference.
  • New: Custom colors as the seventh option. Choosing it reveals the individual color fields — background, border and now text as well — each as a WordPress color picker: a swatch that opens the picker, with the hex value still editable as text. Picking a ready-made scheme hides those fields and shows that schemeÌtumọ̀ Yorùbá: ’s palette as read-only swatches instead, including its dark variant.
  • The text color is new and defaults to empty, meaning the notice keeps inheriting the color from your theme exactly as before.
  • Existing sites are untouched: Classic plus Custom colors is what an update selects, so the notice keeps looking exactly as before until you change it.
  • Per-block color overrides still win over a scheme, so a single placement can deviate deliberately.
  • New providers: Mistral AI, xAI / Grok, DeepSeek, Perplexity, Adobe Firefly, Black Forest Labs (FLUX) and Leonardo.ai — fifteen entries in total, still with “Other” for anything not listed.
  • Icons now ship only where the providerÌtumọ̀ Yorùbá: ’s actual logo is bundled, with no generic stand-in artwork at all — the “Other” gear and the generic sparkle went too, so an unbranded chip is now always plain text. Invented motifs for Midjourney and Stability AI were removed, and so was the Copilot icon, which was in fact the GitHub Copilot mark — a different product. Those providers fall back to their abbreviation badge, which the renderer already did on its own. A made-up logo tells a reader nothing about which tool was used, and one drawn close enough to be recognised would be a knock-off.
  • While Icons is the selected display style, the provider list only offers the ones a real logo exists for. Anything you already ticked stays visible and keeps working, so no stored selection can go missing.
  • The provider list is now handed to the block editor from PHP instead of being repeated in three JavaScript bundles, where it had already fallen out of step.
  • Fix: other.svg, the icon for the “Other” provider, contained two raw control characters in a comment and was therefore not well-formed XML. Browsers refused to render it, so the chip stayed blank whenever “Other” was shown in icon mode. Present since the first release.
  • New: a Restore bundled wording button under each disclaimer preset. Once you have edited a preset there was previously no way back to the shipped text; the button rebuilds it from the pluginÌtumọ̀ Yorùbá: ’s own wording plus the lead sentence of the selected usage scope.
  • All directions render from one shared markup tree and rearrange through CSS, so the editor preview and the front end cannot drift apart.

1.3.0

  • New: mark individual images as AI generated or AI edited. The marking is stored on the image itself, so it follows the picture everywhere it is used — featured image, archive listings and images placed in post content, including inside galleries.
  • Mark images from wherever you happen to be: a pair of fields in the media library next to the alt text, or an AI disclosure panel on the selected image block, so a picture you just inserted can be flagged without opening the media library at all.
  • Record the tool that made the image and let the pill name it, for example “AI generated · Midjourney”.
  • New: an optional overlay pill on marked images — choose the corner, the size, icon-only or icon plus wording, and your own text. Icon-only keeps the wording available to screen readers rather than dropping it.
  • Marked images carry the pill in the block editor too, so you see the marking while writing rather than only after publishing.
  • The pill is drawn over the picture with CSS and never alters the image file, so it disappears when the picture is downloaded or screenshotted — the settings screen says so plainly rather than implying a permanent watermark.
  • Styled entirely through CSS custom properties, so its look can be retuned from a child theme without touching plugin markup.
  • Off by default; enabling the pill under Settings Image marking is what makes marked images show it.

1.2.0

  • The block editor preview is now produced by the blockÌtumọ̀ Yorùbá: ’s own PHP renderer through the block-renderer REST route, so the canvas shows the exact markup and styling the front end outputs. It replaces a separate JavaScript approximation that had drifted apart from the real output: it showed placeholder badges (“OAI ⋯”) instead of your configured tools, truncated the disclaimer at 220 characters, dropped the AI usage lead sentence, and — because the front-end stylesheet was only ever enqueued during rendering — displayed no card, border, background or badge styling at all.
  • The front-end stylesheet is now loaded into the editor canvas as well, so preview and front end are styled by one and the same file.
  • Fix: alignment and margin set on the block applied in the editor but were dropped on the front end, because the renderer builds its own element and never called get_block_wrapper_attributes(). Both are now carried through to the published markup.
  • Fix: per-post overrides were resolved against no post at all when rendering outside a singular view; the renderer now falls back to the post the REST request sets up.
  • Removed roughly 400 lines of duplicated preview logic in JavaScript along with the deskaicoEditorConfig payload that only fed it.

1.1.0

  • Breaking (CSS only): every CSS class, HTML id and CSS custom property now uses the deskaico- prefix instead of the legacy acd- shorthand (.acd-disclosure .deskaico-disclosure, --acd-bg --deskaico-bg, and so on). The old three-letter prefix predates the plugin’s rename and no longer matched anything else in the codebase. Custom CSS targeting the old names needs updating; settings, content and stored data are untouched.
  • Translations now ship exclusively as WordPress.org language packs instead of files bundled in /languages/, so a corrected translation reaches sites without a plugin release. Help translate at https://translate.wordpress.org/projects/wp-plugins/desk9-ai-content-disclosure/
  • Fix: the block’s front-end stylesheet targeted .wp-block-ai-content-disclosure-disclosure, a class generated by the block namespace used before the plugin was renamed. The rule never matched anything; it now targets .wp-block-deskaico-disclosure.
  • Compatibility: all runtime registrations (block, shortcode, post meta, auto-append, JSON-LD collector) now boot on init instead of plugins_loaded. This removes the WordPress 6.7+ debug notices about _load_textdomain_just_in_time and about wp_register_script / wp_register_style running before the enqueue hooks.
  • Fix: an empty or invalid border color fell back to the background default, so the card border became invisible. Background, border and accent colors now each fall back to their own default.
  • New: uninstall.php removes the plugin option and all _deskaico_* post meta when the plugin is deleted (multisite-aware).
  • Housekeeping: declared Tested up to 7.1; removed a stray temporary file from the plugin folder.

1.0.6

  • Settings/runtime: fix global long / short presets accidentally saved as only the informational usage-scope lead (no preset body)—options are rebuilt from the bundled texts plus your selected scope whenever that pattern is detected, so Settings and the front end stay consistent until you intentionally edit the presets.

1.0.5

  • Settings: fixing how AI usage scope merges its introductory paragraph into long and short disclaimer presets in the browser—strip legacy leads whether they appear as plaintext or wrapped in a leading <p>…</p>, refresh both textareas once on page load, and clarify the helper text beneath the dropdown (German strings updated).

1.0.4

  • Block: when AI usage extent is Inherit site setting and the block uses global site disclaimer text, the front end now outputs the wording stored under Settings as-is (the admin screens already merge the usage-scope sentence into those textareas when you save). Applying the programmatic prefix twice no longer hides or duplicates the canonical Settings copy compared with choosing None.

1.0.3

  • Frontend: prevent duplicated AI usage-scope lead sentences. Saved disclaimer HTML from Settings often wraps the introductory sentence inside <p>…</p>; stripping only matched raw prefixes at the beginning of the string, so WordPress appended the same lead again—now trimmed whether it is plaintext or first matching paragraph (deskaico_strip_leading_usage_scope_prefixes).

1.0.2

  • Frontend: fixing disclaimer resolution so Settings Disclaimer text is honored whenever a disclosure block or shortcode explicitly uses global site defaults, even if the document sidebar uses “Custom message & tools” for auto-append/overrides on the same entry.
  • Front-end ignores “empty-looking” markup (such as stray empty paragraphs): only real visible text satisfies custom disclaimer fields, preventing the notice from collapsing to nothing.
  • Document sidebar help text clarified for how per-post customs interact with globally defaulted blocks.

1.0.1

  • Block editor preview: the canvas now reflects Settings Default disclaimer length (long vs short) and the saved long/short disclaimer texts, including the block inserter preview—no more “blank” or always-long English placeholder when the short template is selected.
  • Developer note: deskaicoEditorConfig now passes defaultDisclaimerVariant, disclaimerPlainLong, and disclaimerPlainShort for editor preview only (front-end markup is unchanged).

1.0.0

  • First public release on WordPress.org: settings UI, disclosure renderer, dynamic block (inspector presets for disclaimer length, AI usage extent, per-block tools, multiple blocks per post) and shortcode [deskaico_disclosure], document sidebar (post overrides and optional auto-append layout), Beta JSON-LD collector, German translation starter pack.
  • Distinctive listing title Desk9 AI Content Disclosure, slug desk9-ai-content-disclosure, Text Domain aligned with the slug; all PHP identifiers use the deskaico / DESKAICO / Deskaico prefix for Plugin Check compliance.
  • Toolbar buttons load from @wordpress/components for current WordPress block editor compatibility; block namespace deskaico/disclosure.
  • Show selected tools as: abbreviations, bundled SVG icons, or plain full names (comma-separated).
  • Front-end compact layout uses neutral “Tools used:” wording (no automatic plugin credits or outbound promotional links on the public site).
  • Source transparency: human-readable JavaScript and Sass under src/ with package.json and webpack.config.js; Development section in this readme documents npm install / npm run build; compiled assets ship in build/.
  • Defense-in-depth output escaping: Deskaico_Renderer::render() runs final HTML through wp_kses() with allow-list deskaico_kses_allowed_disclosure.
  • Beta JSON-LD emitted via wp_print_inline_script_tag() with safe JSON encoding flags.
  • Bundled PHP translations via Text Domain + Domain Path with WordPress JIT loading (per Plugin Check). Ship languages/desk9-ai-content-disclosure-{locale}.mo; duplicate msgid removed in de_DE.po.
  • Verified with WordPress Plugin Check “plugin-review” PHPCS ruleset and relevant security/naming sniffs.