Image Native Digital Integrity & Color Integrity Unit Monitor
A forensic tool for detecting color manipulation in images through statistical color analysis.
INDICIUM allows photographers and content creators to:
- Register original images exported from Lightroom/Photoshop (with Adobe Content Credentials already embedded).
- Calculate a "color signature" based on color statistics (mean, variance, histograms) in AdobeRGB and simulated sRGB.
- Detect subsequent color manipulations (filters, aggressive LUTs) by comparing images found on the web with registered signatures.
- Visualize detailed forensic metrics (global score, per-channel histograms, sector alteration heatmap).
- No database poisoning: Only signatures (metadata) are stored, never full images.
- Privacy-first: Signature calculation is performed locally via CLI; images are never uploaded to the backend.
- Modular architecture: Backend (NestJS), CLI (Node/TS), Web UI (SvelteKit) are independent.
- Open source: MIT licensed, code available on GitHub.
- Forensic-grade: Multiple metrics, detailed visualization, interpretable score (0–100).
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ CLI (Node/TS) │─────▶│ Backend (NestJS)│◀────│ Web UI (SvelteKit)│
│ - Calculation │ │ - API REST │ │ - Dashboard │
│ - Verification │ │ - MariaDB │ │ - Visualization│
│ - Batch │ │ - Auth (keys) │ │ - Management │
└─────────────────┘ └─────────────────┘ └─────────────────┘
| Component | Technology | Notes |
|---|---|---|
| Backend | NestJS 11.x | REST API, TypeORM, Swagger |
| Database | MariaDB 11.x | Signature storage |
| CLI | Node.js 22.x | TypeScript, sharp, imagehash |
| Web UI | SvelteKit 2.x | TypeScript, Chart.js, Tailwind |
| Image Processing | sharp (libvips) 0.34.x | ICC conversion, histograms |
| Containerization | Docker 27.x | Backend + DB + Frontend |
| License | MIT | Open source |
- Node.js 22+
- Docker & Docker Compose
- MariaDB (or use Docker Compose)
git clone https://github.com/AlexM2Media/indicium.git
cd indicium# Copy environment example
cp .env.example .env
# Edit .env with your credentials
nano .env
# Start all services
docker-compose up -dServices will be available at:
- Backend API: http://localhost:3000
- Web UI: http://localhost:3001
- MariaDB: localhost:3306
cd cli
npm install
npm link # Makes `indicium` available globallyindicium config set api-url http://localhost:3000
indicium config set api-key your-api-key-hereindicium register --image IMG_1234_AdobeRGB.jpg --name "IMG_1234"indicium verify --image downloaded.jpg --id uuid-of-image# Register a single image
indicium register --image path/to/image.jpg --name "Image Name"
# Verify an image
indicium verify --image path/to/image.jpg --id uuid-of-image
# Batch register
indicium batch --dir ./exports --pattern "IMG_*_AdobeRGB.jpg"
# Configure
indicium config set api-url http://localhost:3000
indicium config set api-key your-api-keyPOST /api/images/register- Register a new image with color signaturesGET /api/images/:id- Get image metadata and signaturesGET /api/images/hash/:sha256- Find image by SHA-256 hashPOST /api/verify- Submit verification result (optional logging)GET /api/verify/:imageId- Get verification history for an image
See full API documentation at http://localhost:3000/api (Swagger).
Access the dashboard at http://localhost:3001:
/- Landing page/register- Register images (upload signatures calculated by CLI)/verify- Verify images (upload or URL)/image/[id]- Forensic dashboard with score, histograms, sector heatmap/dashboard- List of registered images (requires authentication)
- Export image from Lightroom/Photoshop with Adobe Content Credentials.
- CLI calculates:
- SHA-256 hash of the file.
- Color statistics in AdobeRGB (global mean, variance, 32-bin histograms).
- Same statistics for 4×§ grid sectors (24 sectors total).
- Convert to sRGB (ICC profile) and recalculate statistics.
- Send signatures to backend via API.
- Backend stores in MariaDB.
- Download suspected image from the web.
- CLI calculates same statistics (assumes sRGB).
- Fetch original signature from backend.
- Compare:
- Mean deviation (global and per sector).
- Variance deviation.
- Histogram distance (Chi-square).
- Calculate score 0–100.
- Display results (score, per-channel breakdown, altered sectors).
- 0–30: Authentic (within expected variation from platform conversion/compression).
- 30–60: Possible manipulation (moderate color changes).
- 60–100: Manipulated (aggressive filters, LUTs).
cd backend
npm install
npm run start:devcd cli
npm install
npm run devcd web
npm install
npm run devSee docs/ folder for detailed technical documentation:
architecture.md- System architectureapi.md- API referencecli.md- CLI usagedeployment.md- Deployment guide
Full specification: INDICIUM-specification.md
MIT License - see LICENSE file.
Contributions are welcome! Please read our Contributing Guide first.
- Built with NestJS, SvelteKit, and sharp.
- Inspired by forensic image analysis research and C2PA standards.
Author: Alejandro Mateo - @AlexM2Media
Repo: INDICIUM
Web/Portfolio: alexm2.media