Disclose chatbots
People must know they are interacting with an AI system, at the latest at the first interaction.
<ai-disclosure>
Mark AI-generated images with two invisible layers, tell users they are talking to an AI in 24 languages, and verify any file — with one TypeScript toolkit that runs everywhere.
Article 50 of the AI Act applies since 2 August 2026, with fines up to €15 million or 3 % of worldwide turnover.
People must know they are interacting with an AI system, at the latest at the first interaction.
<ai-disclosure>
Outputs must be machine-readable and detectable as AI-generated. The Code of Practice expects at least two marking layers.
markImage() · markText()
Deployers must visibly label deepfakes and AI text published on matters of public interest.
<ai-label>
Metadata can be stripped by a social network. Pixels can be edited. Together, the layers keep the signal alive.
A cryptographically signed record of how the image was made. Any edit to the file breaks the signature, so tampering is evident.
The flag search engines, social networks and photo tools already read to show “AI-generated”.
A 64-bit code spread over thousands of frequency coefficients, invisible to the eye (≈ 43 dB PSNR), linked to the manifest.
Pure TypeScript, zero native dependencies: Node.js, browsers, Deno, Bun and edge runtimes.
import { createLocalSigner, markImage } from '@filigranejs/core'; const signer = await createLocalSigner({ certificate, privateKey }); // After your model returns an image: const { bytes, layers } = await markImage(png, { signer, model: { name: 'gpt-image-1' }, }); // layers → ['watermark', 'metadata', 'c2pa']
import '@filigranejs/ui'; <!-- Chatbot banner, in the page language (24 EU languages) --> <ai-disclosure model="Mistral Large" dismissible></ai-disclosure> <!-- Label on AI images or texts --> <ai-label kind="generated" variant="overlay"></ai-label>
# Find chatbots and generators without transparency measures npx filigrane scan . --format markdown # Mark and verify files npx filigrane mark cover.png --model "Flux@1.1" --cert chain.pem --key key.pem npx filigrane verify cover.ai.png
# .github/workflows/ai-transparency.yml on: [pull_request] permissions: { contents: read, security-events: write } jobs: scan: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: Sailxe42/filigrane@v0
Accessible, themable with CSS variables, and they keep a visible “AI” chip after the banner is dismissed.
It implements the technical measures described in the Commission’s Code of Practice: multi-layer marking, detection and visible disclosure. Compliance also depends on your role, your product and how you publish content — this is not legal advice.
For production, use a certificate from a certification authority on the C2PA trust list. For tests, `filigrane keygen` creates a development certificate: manifests are valid but shown as “untrusted”.
No. Everything runs in your browser; the file never leaves your device.
It survives JPEG recompression down to quality 50, resizing, brightness changes and metadata stripping. Cropping and rotation are not supported yet. Every release is tested automatically.
Yes. Every commit is checked against the C2PA reference implementation (c2pa-rs), and Filigrane reads manifests produced by other tools.