{"_id":"@affectively/synthetic-watermark","_rev":"2-d3afb5296906ecbb42a2dbbf89022d75","name":"@affectively/synthetic-watermark","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@affectively/synthetic-watermark","version":"1.0.0","keywords":["watermark","ai-generated","synthetic","authenticity","png","mp3","id3","metadata","ai-safety","content-authenticity","digital-watermark","steganography"],"author":{"name":"AFFECTIVELY","email":"opensource@affectively.ai"},"license":"MIT","_id":"@affectively/synthetic-watermark@1.0.0","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"homepage":"https://github.com/affectively-ai/synthetic-watermark#readme","bugs":{"url":"https://github.com/affectively-ai/synthetic-watermark/issues"},"dist":{"shasum":"00cf6a4d8078918f3eb71d4ffceea7b9527462fe","tarball":"https://registry.npmjs.org/@affectively/synthetic-watermark/-/synthetic-watermark-1.0.0.tgz","fileCount":8,"integrity":"sha512-ZY6YqX4JKCPKQ1HhIOOFmFYEmctME4vHmyof0ViXgqwJb1i2gtsZuDOVl3lmtG9z4nUdZHO/jPQsbPY1asWIzg==","signatures":[{"sig":"MEQCIA4Kd0eOniYcfnfTU6jZfPIEgzBJFH2m1E/pF7ciqI6bAiBEkT/QKw+PuC7aEkZY5Lx39ixa8qhSXNdaHbyYGDhVeA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":38320},"main":"dist/index.js","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"}},"gitHead":"aea638b472a4e3464f4b68c4bba3437d836ea3cf","scripts":{"test":"bun test","build":"tsup src/index.ts --format cjs,esm --dts","prepublishOnly":"npm run build"},"_npmUser":{"name":"buley","email":"buley@outlook.com"},"repository":{"url":"git+https://github.com/affectively-ai/synthetic-watermark.git","type":"git"},"_npmVersion":"11.7.0","description":"Invisible watermarking for AI-generated content. Embeds synthetic origin markers into PNG images (iTXt chunks) and MP3 audio (ID3v2 tags) for authenticity verification.","directories":{},"_nodeVersion":"25.4.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.9.0","@types/node":"^22.0.0"},"_npmOperationalInternal":{"tmp":"tmp/synthetic-watermark_1.0.0_1769380343833_0.6000171160381129","host":"s3://npm-registry-packages-npm-production"},"deprecated":"This package is deprecated and no longer supported. Do not use."}},"time":{"created":"2026-01-25T22:32:23.722Z","modified":"2026-03-27T20:03:46.914Z","1.0.0":"2026-01-25T22:32:23.999Z"},"bugs":{"url":"https://github.com/affectively-ai/synthetic-watermark/issues"},"author":{"name":"AFFECTIVELY","email":"opensource@affectively.ai"},"license":"MIT","homepage":"https://github.com/affectively-ai/synthetic-watermark#readme","keywords":["watermark","ai-generated","synthetic","authenticity","png","mp3","id3","metadata","ai-safety","content-authenticity","digital-watermark","steganography"],"repository":{"url":"git+https://github.com/affectively-ai/synthetic-watermark.git","type":"git"},"description":"Invisible watermarking for AI-generated content. Embeds synthetic origin markers into PNG images (iTXt chunks) and MP3 audio (ID3v2 tags) for authenticity verification.","maintainers":[{"name":"buley","email":"buley@outlook.com"}],"readme":"# @affectively/synthetic-watermark\n\nInvisible watermarking for AI-generated content. Embeds synthetic origin markers into PNG images and MP3 audio files for authenticity verification and AI safety compliance.\n\n## Features\n\n- **Image Watermarking** - Embeds invisible metadata into PNG files using iTXt chunks\n- **Audio Watermarking** - Embeds metadata into MP3 files using ID3v2 tags\n- **Detection** - Verify if content has synthetic origin markers\n- **Zero Dependencies** - Uses only Node.js Buffer API\n- **Non-Destructive** - Watermarks are stored in metadata, not visible/audible content\n- **AI Safety** - Helps identify AI-generated content for authenticity verification\n\n## Installation\n\n```bash\nnpm install @affectively/synthetic-watermark\n# or\nbun add @affectively/synthetic-watermark\n# or\nyarn add @affectively/synthetic-watermark\n```\n\n## Quick Start\n\n### Image Watermarking\n\n```typescript\nimport {\n  embedImageWatermark,\n  detectSyntheticImageWatermark,\n} from '@affectively/synthetic-watermark';\n\n// Watermark an AI-generated image\nconst pngBuffer = await fs.readFile('ai-generated-image.png');\nconst watermarkedImage = embedImageWatermark(pngBuffer, 'png', {\n  source: 'dalle',\n  model: 'dall-e-3',\n  platform: 'MyApp',\n});\n\n// Save the watermarked image\nawait fs.writeFile('watermarked-image.png', watermarkedImage);\n\n// Detect watermark\nconst detected = detectSyntheticImageWatermark(watermarkedImage);\nif (detected) {\n  console.log('Synthetic origin detected:', detected);\n  // { platform: 'MyApp', source: 'dalle', model: 'dall-e-3', timestamp: 1234567890 }\n}\n```\n\n### Audio Watermarking\n\n```typescript\nimport {\n  embedAudioWatermark,\n  detectSyntheticWatermark,\n} from '@affectively/synthetic-watermark';\n\n// Watermark AI-generated audio\nconst mp3Buffer = await fs.readFile('tts-audio.mp3');\nconst watermarkedAudio = embedAudioWatermark(mp3Buffer, 'mp3', {\n  source: 'tts',\n  platform: 'MyApp',\n});\n\n// Save the watermarked audio\nawait fs.writeFile('watermarked-audio.mp3', watermarkedAudio);\n\n// Detect watermark\nconst detected = detectSyntheticWatermark(watermarkedAudio);\nif (detected) {\n  console.log('Synthetic audio detected:', detected);\n  // { platform: 'MyApp', source: 'tts', timestamp: 1234567890 }\n}\n```\n\n## Convenience Functions\n\n### For Images\n\n```typescript\nimport {\n  watermarkDallEImage,\n  watermarkGeminiImage,\n  watermarkDigitalTwinImage,\n  watermarkCyranoImage,\n} from '@affectively/synthetic-watermark';\n\n// Pre-configured for specific AI image generators\nconst watermarked = watermarkDallEImage(imageBuffer, 'png', optionalUserIdHash);\n```\n\n### For Audio\n\n```typescript\nimport {\n  watermarkDigitalTwinAudio,\n  watermarkHologramAudio,\n  watermarkCyranoAudio,\n} from '@affectively/synthetic-watermark';\n\n// Pre-configured for specific TTS systems\nconst watermarked = watermarkCyranoAudio(audioBuffer, 'mp3');\n```\n\n## Watermark Format\n\n### Image Watermark (PNG iTXt chunk)\n\n```\nSyntheticOrigin: SYNTHETIC_IMAGE|platform|source|timestamp|userIdHash|model\n```\n\n### Audio Watermark (ID3v2 COMM frame)\n\n```\nSYNTHETIC_ORIGIN: SYNTHETIC_AUDIO|platform|source|timestamp|userIdHash\n```\n\n## API Reference\n\n### Image Functions\n\n#### `embedImageWatermark(buffer, format, config?)`\n\nEmbeds an invisible watermark into a PNG image.\n\n- `buffer` - Image data (Uint8Array)\n- `format` - Image format (currently only 'png' supported)\n- `config` - Optional configuration:\n  - `platform` - Platform identifier (default: 'SYNTHETIC')\n  - `source` - Source system (e.g., 'dalle', 'gemini')\n  - `model` - Model name (e.g., 'dall-e-3')\n  - `userIdHash` - Hashed user ID for audit trail\n\nReturns: Watermarked image buffer\n\n#### `detectSyntheticImageWatermark(buffer)`\n\nDetects and extracts watermark from PNG image.\n\nReturns: `ImageWatermarkConfig | null`\n\n### Audio Functions\n\n#### `embedAudioWatermark(buffer, format, config?)`\n\nEmbeds an invisible watermark into MP3 audio.\n\n- `buffer` - Audio data (Buffer)\n- `format` - Audio format (currently only 'mp3' supported)\n- `config` - Optional configuration:\n  - `platform` - Platform identifier (default: 'SYNTHETIC')\n  - `source` - Source system (e.g., 'tts', 'hologram')\n  - `userIdHash` - Hashed user ID for audit trail\n\nReturns: Watermarked audio buffer\n\n#### `detectSyntheticWatermark(buffer)`\n\nDetects and extracts watermark from MP3 audio.\n\nReturns: `WatermarkConfig | null`\n\n## Use Cases\n\n1. **AI Safety Compliance** - Mark AI-generated content for authenticity verification\n2. **Content Authentication** - Verify the origin of synthetic media\n3. **Audit Trail** - Track when and by whom content was generated\n4. **Platform Trust** - Help users identify AI-generated content\n5. **Regulatory Compliance** - Support emerging AI content disclosure requirements\n\n## Technical Details\n\n### PNG Watermarking\n\n- Uses iTXt (International Text) chunk per PNG specification\n- Inserted before IEND chunk\n- Includes proper CRC32 checksum\n- Non-destructive to image data\n\n### MP3 Watermarking\n\n- Uses ID3v2.3 COMM (Comment) frame\n- Replaces existing ID3 tag if present\n- Syncsafe integer encoding for size\n- Compatible with standard ID3 readers\n\n## Browser Support\n\nWorks in Node.js and browser environments (requires Buffer polyfill in browser).\n\n## License\n\nMIT © AFFECTIVELY\n","readmeFilename":"README.md"}