Title: Tlloancy Source Stamp
Author: Thomas Lloancy
Published: <strong>September 6, 2026</strong>
Last modified: October 15, 2026

---

Search plugins

![](https://ps.w.org/tlloancy-source-stamp/assets/banner-772x250.png?rev=3683847)

![](https://ps.w.org/tlloancy-source-stamp/assets/icon-256x256.png?rev=3683847)

# Tlloancy Source Stamp

 By [Thomas Lloancy](https://profiles.wordpress.org/tlloancy/)

[Download](https://downloads.wordpress.org/plugin/tlloancy-source-stamp.1.2.0.zip)

 * [Details](https://li.wordpress.org/plugins/tlloancy-source-stamp/#description)
 * [Reviews](https://li.wordpress.org/plugins/tlloancy-source-stamp/#reviews)
 *  [Installation](https://li.wordpress.org/plugins/tlloancy-source-stamp/#installation)
 * [Development](https://li.wordpress.org/plugins/tlloancy-source-stamp/#developers)

 [Support](https://wordpress.org/support/plugin/tlloancy-source-stamp/)

## Description

Tlloancy Source Stamp listens to the official WordPress AI Client (`wp_ai_client_prompt()`/`
wp_ai_client_after_generate_result`). When a generation finishes through that API,
the plugin writes a row in a table on **your** database. When the post is saved,
it is stamped (origin, model, time) from the generation that was made for it.

The journal stores metadata only: caller plugin, model, provider, context, token
counts when available, and the user account that triggered the generation. Prompt
and completion text are never stored.

An optional visitor-facing note can appear on posts the plugin stamped as generated
or assisted. Unstamped posts stay silent.

#### What it does

 * Listens to `wp_ai_client_after_generate_result` (WordPress 7.0+)
 * Writes a self-hosted journal (Tools  Source Stamp), filterable and paginated
 * Never stores prompt or completion text
 * Stamps a post from the generation made for that post (editor, REST route or `
   post_id` parameter), or from the only generation waiting for you (15 minutes)
 * Block editor sidebar panel and classic editor box to set or correct the origin
   by hand
 * Optional visitor-facing note **only** on stamped posts, also in feeds
 * CSV export of the whole journal
 * Personal data export and erasure for the journal, and suggested privacy policy
   text
 * Daily prune of rows older than 365 days (filter `tllss_retention_days`)

#### What it does not do

 * Site-wide chatbot banners or AI-tool scanners
 * Image IPTC / C2PA embedding
 * Compliance scores, Article 4 checklists, or legal templates
 * RAG, budget caps, or model routing

#### Honesty about the law

Installing this plugin does not make a site compliant with Regulation (EU) 2024/
1689. Whether Article 50 applies to a given page is a legal assessment for the site
operator. This is a technical record of AI Client use.

#### Requirements

Automatic stamps need **WordPress 7.0** (or later) so `wp_ai_client_prompt()` exists.
On older versions the journal stays empty; you can still set origin by hand in the
editor. The block editor panel is shown for post types that support custom fields
and the REST API; other types keep the classic box.

### Privacy

The journal links each generation to the WordPress user who triggered it. It stays
in your database, is deleted after the retention period, can be exported and erased
with the WordPress privacy tools (erasing detaches the account and keeps the technical
row), and is detached automatically when a user is deleted. Suggested policy text
is added to the Privacy Policy guide.

## Installation

 1. Upload the `tlloancy-source-stamp` folder to `/wp-content/plugins/`.
 2. Activate Tlloancy Source Stamp.
 3. Open **Tools  Source Stamp**. Confirm that the WordPress AI Client is detected.
 4. Generate content with any plugin that uses `wp_ai_client_prompt()`, then check 
    the journal.

## FAQ

### Does this make my site legally compliant?

No. It records AI Client use. Legal assessment stays with the site operator.

### Why was my post not stamped?

When you save a post, the plugin looks for a generation you made in the last 15 
minutes. If the generation was made from that post’s editor (or a request that names
the post), it is used, even when you generated several times: the latest one counts.
Otherwise a generation is used only when it is the only one waiting for you; with
two, there is no automatic stamp (wrong metadata is worse than a gap). Quick edit
and bulk edit never stamp. **Tools  Source Stamp  Test** calls the AI Client directly:
Generate, then Create draft in a second request. The origin field in the editor 
remains the manual fallback.

### A post I stamped by hand was changed by the plugin?

No. An origin set by hand is never overwritten by the automatic path.

### Where do I change the origin?

In the block editor, in the document sidebar under **Source Stamp**. In the classic
editor, in the **Source Stamp** box.

### Do you send data off the site?

No. The journal lives in your database. There is no account and no phone-home.

### Do you store what the model wrote?

No. Only metadata (time, caller, model, tokens, post ID, user ID).

### What happens to the data when I uninstall?

The journal table, the settings and the scheduled task are deleted, on every site
of a multisite. The stamps written on posts (`_tllss_*` post meta) stay with the
content.

### Is this legal advice?

No.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Tlloancy Source Stamp” is open source software. The following people have contributed
to this plugin.

Contributors

 *   [ Thomas Lloancy ](https://profiles.wordpress.org/tlloancy/)

[Translate “Tlloancy Source Stamp” into your language.](https://translate.wordpress.org/projects/wp-plugins/tlloancy-source-stamp)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/tlloancy-source-stamp/),
check out the [SVN repository](https://plugins.svn.wordpress.org/tlloancy-source-stamp/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/tlloancy-source-stamp/)
by [RSS](https://plugins.trac.wordpress.org/log/tlloancy-source-stamp/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.2.0

 * Fix: in the block editor, the classic box could wipe an automatic stamp right
   after saving. The block editor now has its own sidebar panel; the classic box
   only acts on a real change.
 * Fix: with automatic stamping turned off, the origin set in the editor box was
   silently ignored.
 * Fix: every save of a stamped post wrote a new journal row and moved the stamp
   time. A stamp is now written, and journaled, only when it changes.
 * Fix: CSV export HTML-escaped its cells and was open to spreadsheet formula injection.
   It is now plain RFC 4180 CSV with formula-looking cells neutralised, streams 
   the whole journal (no 5,000-row cap) and runs in the admin only.
 * New: a generation records the post it was made for, and the stamp goes to that
   post. Generations made for another post, quick edit and bulk edit can no longer
   stamp the wrong post. A stamp set by hand is never overwritten.
 * New: the origin meta only accepts generated, assisted, human or empty, and requires
   the right to edit that post (filter `tllss_user_can_set_origin`).
 * New: personal data exporter and eraser, suggested privacy policy text, automatic
   detaching of deleted users.
 * New: journal pagination and an event filter; the screen moves from a top-level
   menu to Tools  Source Stamp.
 * New: automatic stamps are marked “auto” in the post list and the editor.
 * New: the visitor note also appears in feeds, and is not printed twice when `[
   tllss_label]` is already in the content.
 * Change: the disclosure version only moves when the visitor-facing note changes,
   not on every settings save. Retired chatbot notice settings are removed.
 * Change: the stamp journal row keeps the plugin that made the generation, not 
   the one saving the post.
 * Change: uninstall also cleans every site of a multisite. Test drafts no longer
   pile up.

#### 1.1.0

 * Main file renamed to tlloancy-source-stamp.php and every internal name moved 
   from the ai_helm prefix to tllss: table tllss_log, option tllss_settings, post
   meta _tllss_*, filters tllss_retention_days, tllss_run_ttl, tllss_stampable_post_types,
   tllss_caller_plugin, shortcode [tllss_label]. The journal rows, settings, stamps,
   and cron written under the old names are adopted on activation.
 * A generation’s journal row is now also its queue entry. Attaching it to a post
   is one conditional UPDATE on the new claimed_gmt column, so two saves racing 
   for the same generation cannot both stamp it. The CSV export carries claimed_gmt.
 * Test screen wording clarified.

#### 1.0.0

 * Initial release: AI Client listener, same-request post stamp, local journal, 
   CSV export, label on stamped posts only.

## Meta

 *  Version **1.2.0**
 *  Last updated **2 weeks ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.7 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 8.1 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/tlloancy-source-stamp/)
 * Tags
 * [AI](https://li.wordpress.org/plugins/tags/ai/)[ai disclosure](https://li.wordpress.org/plugins/tags/ai-disclosure/)
   [article 50](https://li.wordpress.org/plugins/tags/article-50/)[audit log](https://li.wordpress.org/plugins/tags/audit-log/)
   [journal](https://li.wordpress.org/plugins/tags/journal/)
 *  [Advanced View](https://li.wordpress.org/plugins/tlloancy-source-stamp/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/tlloancy-source-stamp/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/tlloancy-source-stamp/reviews/)

## Contributors

 *   [ Thomas Lloancy ](https://profiles.wordpress.org/tlloancy/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/tlloancy-source-stamp/)