A decentralized, privacy-preserving protocol for creating verifiable attestations about AI involvement in content creation. It works offline and there's no servers or blockchain implementation required.
attest.ink is an open-source protocol that enables transparent disclosure of AI involvement in content creation through:
- Cryptographic Attestations: Create tamper-proof records of AI usage
- Beautiful Badges: Display verification badges that link to cryptographic proofs
- Complete Decentralization: Works offline, no servers or blockchain required
- Privacy-First: Keep prompts private while proving AI involvement
- Universal Compatibility: Integrate with any platform or content type
- Simple Creation: Generate attestations in seconds at attest.ink/create
- Multiple AI Models: Support for 100+ models from OpenAI, Anthropic, Google, Meta, and more
- Flexible Roles: Document if AI generated, assisted, or edited your content
- File Support: Attest any content type - text, code, images, audio, video
- Digital Signatures: Optional Ethereum wallet signatures for enhanced verification
- Static Architecture: Runs on Vercel, Netlify, or any static host
- Client-Side Only: All operations happen in the browser
- Simple Integration: One-line badge embedding
- REST API: Programmatic attestation creation via curl/HTTP
- CI/CD Ready: Easy automation for build pipelines
- Open Protocol: MIT licensed, no vendor lock-in
- One-Click Verification: Click any badge to verify authenticity
- Content Hash Verification: Verify content hasn't been modified
- Signature Validation: Verify digital signatures when present
- Offline Verification: Download and verify attestations locally
Visit attest.ink/create and fill out the form.
# Create attestation via curl
curl -s "https://attest.ink/api/create.html?content_name=My%20Blog%20Post&model=gpt-4&role=assisted&output=curl"
# With content hash
curl -s "https://attest.ink/api/create.html?content_name=My%20Article&content=$(cat article.txt | jq -sRr @uri)&model=claude-3-opus"
# Create permanent short URL (requires API key)
curl -X POST https://attest.ink/api/shorten \
-H "Content-Type: application/json" \
-d '{"dataUrl": "data:application/json;base64,...", "apiKey": "ak_..."}'<!-- Self-contained badge with full attestation data -->
<a href="https://attest.ink/verify/?data=eyJ2ZXJzaW9uIj..." target="_blank">
<img src="https://attest.ink/assets/badges/gpt-4-generated.svg" alt="AI Generated with GPT-4" />
</a>[](https://attest.ink/verify/?data=...)<div class="ai-attest-badge" data-attestation-url="https://example.com/attestation.json"></div>
<script src="https://attest.ink/static/badge-renderer.js"></script>Click any attestation badge or visit attest.ink/verify to verify:
- Attestation format and schema validity
- Content hash (if original content provided)
- Digital signatures (if present)
- Timestamp and metadata
{
"version": "2.0",
"id": "2025-01-16-abc123",
"content_name": "My Blog Post About Quantum Computing",
"content_hash": "sha256:b6a5c8d9e2f4a3b7c1d8e9f0a1b2c3d4...",
"document_type": "markdown",
"model": "gpt-4-turbo-2024-04-09",
"role": "assisted",
"author": "Dr. Jane Smith",
"timestamp": "2025-01-16T10:30:00Z",
"platform": "attest.ink",
"prompt": "Write an introduction to quantum computing",
"prompt_hash": "sha256:a1b2c3d4...",
"signature": {
"type": "wallet",
"value": "0x1234567890abcdef...",
"signer": "0x742d35Cc6634C0532925a3b844Bc9e7595f06fD3",
"message": "{\"content_hash\":\"sha256:...\",\"model\":\"gpt-4\",\"timestamp\":\"2025-01-16T10:30:00Z\"}"
}
}| Field | Required | Description |
|---|---|---|
version |
Yes | Schema version (currently "2.0") |
id |
Yes | Unique identifier (format: YYYY-MM-DD-random) |
content_name |
Yes | Human-readable name/title of the content |
content_hash |
No | SHA-256 hash of the content (optional in v2.0) |
document_type |
Yes | Type of content (text, markdown, code, image, etc.) |
model |
Yes | AI model identifier |
role |
Yes | How AI was used: generated, assisted, or edited |
author |
No | Human author/creator name |
timestamp |
Yes | ISO 8601 timestamp of attestation creation |
platform |
Yes | Platform used to create attestation |
prompt |
No | The prompt used (can be kept private) |
prompt_hash |
No | SHA-256 hash of prompt if kept private |
signature |
No | Digital signature object |
- generated: Content was primarily created by AI
- assisted: Human and AI collaborated on the content
- edited: AI refined or improved human-created content
Modern badges with blur and transparency effects:
badge-glass- Default glass stylebadge-glass-primary- Primary color variantbadge-glass-minimal- Subtle, minimal design
Classic badge designs:
badge-terminal- Retro terminal stylebadge-neon- Animated neon glowbadge-rainbow- Animated rainbow effectbadge-matrix- Digital rain animationbadge-holographic- Shimmer effect
Pre-rendered badges for all major AI models:
https://attest.ink/assets/badges/{model}-{role}.svg
Examples:
- gpt-4-generated.svg
- claude-assisted.svg
- midjourney-generated.svg
Over 100 AI models across multiple providers:
- OpenAI: GPT-5 (Coming Soon), GPT-4, GPT-3.5, DALL-E 3, etc.
- Anthropic: Claude 4.1 Opus, Claude 4 Opus, Claude 3.5 Sonnet, Claude 3 Series
- Google: Gemini 1.5 Pro, Gemini Ultra, PaLM 2
- Meta: Llama 3 70B, Code Llama, Llama 2 Series
- Stability AI: SDXL 1.0, Stable Diffusion 2.1
- Midjourney: v6, v5.2, v5.1, Niji v6
- Mistral AI: Large, Medium, Mixtral 8x22B
- Cohere: Command R+, Command R
- xAI: Grok 1.5
- And many more...
View the complete gallery at attest.ink/showcase
attest.ink/
├── index.html # Homepage
├── create/ # Attestation creator
├── verify/ # Attestation verifier
├── protocol/ # Protocol specification
├── showcase/ # Badge gallery
├── examples/ # Integration examples
├── api/ # API endpoints
│ └── create.html # Programmatic creation
├── static/
│ ├── attestation-tool.js # Core attestation logic
│ ├── badge-renderer.js # Badge rendering engine
│ ├── ai-models.js # AI model registry
│ ├── style.css # Main styles
│ └── badge-styles.css # Badge-specific styles
├── assets/
│ └── badges/ # Pre-rendered SVG badges
└── attestations/ # Stored attestations (optional)
- Content Hashing: Uses Web Crypto API to generate SHA-256 hashes
- Data Storage: Attestations encoded as base64 data URLs or JSON files
- Verification: Client-side validation of hashes and signatures
- No Backend: Everything runs in the browser using JavaScript
Create permanent short URLs for your attestations with lifetime access:
- One-time payment of $20 for unlimited URLs
- URLs never expire
- API access for automation
- Automatic receipt emails with API key
- Professional email receipts with invoice
- California sales tax calculation (ZIP code based)
- Secure payment processing via Stripe
- API key for programmatic access
GET https://attest.ink/api/create.html
Parameters:
- content_name (required): Name of the content
- content: The actual content (for hash generation)
- model: AI model used (default: gpt-4)
- role: generated|assisted|edited (default: assisted)
- document_type: Type of content (default: text)
- author: Author name
- prompt: The prompt used
- prompt_private: true/false to hash the prompt
- output: json|curl (default: json)
POST https://attest.ink/api/shorten
Headers:
- Content-Type: application/json
Body:
{
"dataUrl": "data:application/json;base64,...",
"apiKey": "ak_..." // Required for permanent URLs
}
Response:
{
"shortUrl": "https://attest.ink/s/abc123",
"shortId": "abc123"
}
// Create badge programmatically
const badge = AttestInk.createBadgeSVG('gpt-4', 'generated');
// Get badge URL
const url = AttestInk.getBadgeUrl('claude-3-opus');
// Render all badges on page
AttestInk.renderBadges();# Clone repository
git clone https://github.com/statusdothealth/attest.ink.git
cd attest.ink
# Serve locally (any static server works)
python -m http.server 8000
# or
npx serve
# or
php -S localhost:8000- Open http://localhost:8000
- Create test attestations
- Verify badges render correctly
- Test verification flow
The site automatically deploys to Vercel when changes are pushed to the main branch.
To deploy elsewhere:
- Build not required (pure static files)
- Upload all files to your static host
- Configure your domain and environment variables:
STRIPE_SECRET_KEY- For payment processing (optional)SMTP_*- For email notifications (optional)REDIS_URL- For short URL storage (optional)
- No server configuration needed for basic features
We welcome contributions! Please see our Contributing Guidelines.
- Add new AI models to the registry
- Improve badge designs
- Add language translations
- Write integration guides
- Report bugs or suggest features
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Make your changes
- Test locally
- Commit with clear messages
- Push to your fork
- Open a Pull Request
- Protocol Specification - Technical protocol details
- Badge Gallery - Complete badge collection
- Integration Examples - Real-world usage examples
- API Reference - Complete API documentation
- CI/CD Automation Guide - Pipeline integration guide
name: AI Attestation
on: [push]
jobs:
attest:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Create AI Attestation
run: |
# Generate attestation for your README
ATTESTATION=$(curl -s "https://attest.ink/api/create.html?content_name=README&content=$(cat README.md | jq -sRr @uri)&model=gpt-4&role=assisted&output=json")
# Extract the data URL
DATA_URL=$(echo $ATTESTATION | jq -r '.dataUrl')
# Add badge to README
echo -e "\n\n[]($DATA_URL)" >> README.md
- name: Commit changes
run: |
git config --local user.email "action@github.com"
git config --local user.name "GitHub Action"
git commit -am "Add AI attestation badge"
git pushattest:
stage: deploy
script:
- |
# Create attestation for documentation
CONTENT=$(cat docs/*.md | base64 -w 0)
ATTESTATION=$(curl -X POST https://attest.ink/api/create.html \
-d "content_name=Documentation" \
-d "content=$CONTENT" \
-d "model=claude-3-opus" \
-d "role=assisted")
# Save attestation
echo $ATTESTATION > attestation.json
artifacts:
paths:
- attestation.jsonpipeline {
agent any
stages {
stage('AI Attestation') {
steps {
script {
// Create attestation for build artifacts
def content = readFile('dist/bundle.js')
def attestation = sh(
script: """curl -s 'https://attest.ink/api/create.html?content_name=Build&model=github-copilot&role=assisted&content=\${content}'""",
returnStdout: true
).trim()
// Save attestation
writeFile file: 'dist/attestation.json', text: attestation
}
}
}
}
}{
"scripts": {
"build": "webpack",
"attest": "node scripts/create-attestation.js",
"postbuild": "npm run attest"
}
}// scripts/create-attestation.js
const fs = require('fs');
const https = require('https');
async function createAttestation() {
const content = fs.readFileSync('dist/main.js', 'utf8');
const params = new URLSearchParams({
content_name: 'Production Build',
content: content,
model: 'github-copilot',
role: 'assisted',
output: 'json'
});
const response = await fetch(`https://attest.ink/api/create.html?${params}`);
const attestation = await response.json();
// Add badge to README
const badge = `[](${attestation.dataUrl})`;
const readme = fs.readFileSync('README.md', 'utf8');
fs.writeFileSync('README.md', readme + '\n\n' + badge);
}
createAttestation();#!/usr/bin/env python3
import requests
import json
import hashlib
def create_attestation(file_path, model="gpt-4"):
with open(file_path, 'r') as f:
content = f.read()
# Create attestation
response = requests.get('https://attest.ink/api/create.html', params={
'content_name': file_path,
'content': content,
'model': model,
'role': 'generated',
'output': 'json'
})
attestation = response.json()
# Save attestation
with open(f'{file_path}.attestation.json', 'w') as f:
json.dump(attestation, f, indent=2)
return attestation['verifyUrl']
# Example usage in build script
if __name__ == '__main__':
verify_url = create_attestation('src/main.py', 'github-copilot')
print(f"Attestation created: {verify_url}")// In your theme or plugin
function add_ai_attestation_badge() {
echo '<a href="https://attest.ink/verify/?data=..." target="_blank">';
echo '<img src="https://attest.ink/assets/badges/ai-assisted.svg" alt="AI Assisted" />';
echo '</a>';
}const AIBadge = ({ attestationUrl }) => (
<a href={attestationUrl} target="_blank" rel="noopener noreferrer">
<img src="https://attest.ink/assets/badges/ai-generated.svg" alt="AI Generated" />
</a>
);<template>
<a :href="attestationUrl" target="_blank">
<img src="https://attest.ink/assets/badges/ai-assisted.svg" alt="AI Assisted" />
</a>
</template>
<script>
export default {
props: ['attestationUrl']
}
</script>import Image from 'next/image';
export default function AIBadge({ attestation }) {
return (
<a href={`https://attest.ink/verify/?data=${attestation}`} target="_blank">
<Image
src="/ai-assisted-badge.svg"
alt="AI Assisted"
width={120}
height={30}
/>
</a>
);
}\usepackage{hyperref}
\href{https://attest.ink/verify/?data=...}{%
\includegraphics[width=3cm]{ai-attestation-badge.pdf}%
}- Content Integrity: SHA-256 hashes ensure content hasn't been modified
- Digital Signatures: Optional cryptographic signatures for proof of authorship
- No Data Collection: No analytics, tracking, or server-side storage
- Open Source: Fully auditable codebase
- Private Prompts: Keep prompts confidential while proving AI use
- Local Processing: All operations happen in your browser
- No Account Required: Create attestations anonymously
- Data Portability: Export and backup all attestations
- Disclose AI assistance in research
- Maintain academic integrity
- Provide verifiable proof for journals
- Build trust with readers
- Comply with disclosure requirements
- Stand out with transparency
- Document AI-assisted development
- Track AI contributions
- Maintain audit trails
- Attribute AI-generated art
- Protect artistic integrity
- Enable proper crediting
- 100+ Supported AI models
- 15+ AI providers
- 10+ Badge styles
- 8 Content types
- 3 Attestation roles
- 0 Servers required
- Browser extension for one-click attestation
- WordPress plugin
- npm package for Node.js integration
- Python library
- Additional signature methods (PGP, DID)
- Batch attestation creation
- Attestation chains for derivative works
- IPFS integration for permanent storage
- ENS integration for human-readable attestation IDs
- WebAuthn support for hardware key signatures
- Multi-language interface translations
Q: Do I need a blockchain wallet? A: No, digital signatures are optional. You can create attestations without any wallet.
Q: Where is my data stored? A: Attestations are encoded in URLs or saved as JSON files. No central storage.
Q: Can I verify attestations offline? A: Yes, download the attestation JSON and verify locally.
Q: Is this free to use? A: Yes, completely free and open source under MIT license.
Q: Can I self-host this? A: Yes, it's just static files. Host anywhere that serves HTML.
MIT License - see LICENSE file for details.
- Created by @97115104 + AI tools
- Built as a public good for the AI community
- Supported by 0x42 Research
- Special thanks to all early adopters
- Sponsors link if you're into it 🩵
- Email: info@attest.ink
- GitHub: github.com/statusdothealth/attest.ink
- Issues: Report bugs or request features