Rebrand SooSeF to FieldWitness

Complete project rebrand for better positioning in the press freedom
and digital security space. FieldWitness communicates both field
deployment and evidence testimony — appropriate for the target audience
of journalists, NGOs, and human rights organizations.

Rename mapping:
- soosef → fieldwitness (package, CLI, all imports)
- soosef.stegasoo → fieldwitness.stego
- soosef.verisoo → fieldwitness.attest
- ~/.soosef/ → ~/.fwmetadata/ (innocuous data dir name)
- SOOSEF_DATA_DIR → FIELDWITNESS_DATA_DIR
- SoosefConfig → FieldWitnessConfig
- SoosefError → FieldWitnessError

Also includes:
- License switch from MIT to GPL-3.0
- C2PA bridge module (Phase 0-2 MVP): cert.py, export.py, vendor_assertions.py
- README repositioned to lead with provenance/federation, stego backgrounded
- Threat model skeleton at docs/security/threat-model.md
- Planning docs: docs/planning/c2pa-integration.md, docs/planning/gtm-feasibility.md

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Aaron D. Lee
2026-04-02 15:05:13 -04:00
parent 6325e86873
commit 490f9d4a1d
188 changed files with 4588 additions and 2017 deletions

View File

@@ -1,9 +1,9 @@
/**
* Stegasoo Authentication Pages JavaScript
* FieldWitness Authentication Pages JavaScript
* Handles login, setup, account, and admin user management pages
*/
const StegasooAuth = {
const StegoAuth = {
// ========================================================================
// PASSWORD VISIBILITY TOGGLE
@@ -128,15 +128,15 @@ const StegasooAuth = {
// Make togglePassword available globally for onclick handlers
function togglePassword(inputId, btn) {
StegasooAuth.togglePassword(inputId, btn);
StegoAuth.togglePassword(inputId, btn);
}
// Make copyField available globally for onclick handlers
function copyField(fieldId) {
StegasooAuth.copyField(fieldId);
StegoAuth.copyField(fieldId);
}
// Make regeneratePassword available globally for onclick handlers
function regeneratePassword() {
StegasooAuth.regeneratePassword();
StegoAuth.regeneratePassword();
}

View File

@@ -1,9 +1,9 @@
/**
* Stegasoo Frontend JavaScript
* FieldWitness Frontend JavaScript
* Shared functionality across encode, decode, and generate pages
*/
const Stegasoo = {
const Stego = {
// ========================================================================
// PASSWORD/PIN VISIBILITY TOGGLES
@@ -97,10 +97,10 @@ const Stegasoo = {
if (this.files && this.files[0]) {
const file = this.files[0];
if (file.type.startsWith('image/') && preview) {
Stegasoo.showImagePreview(file, preview, label, zone);
Stego.showImagePreview(file, preview, label, zone);
} else if (file.type.startsWith('audio/') || !file.type.startsWith('image/')) {
// Audio or non-image files: show file info instead of image preview
Stegasoo.showAudioFileInfo(file, zone);
Stego.showAudioFileInfo(file, zone);
if (label) {
label.classList.add('d-none');
}
@@ -155,9 +155,9 @@ const Stegasoo = {
// Trigger appropriate animation
if (isScanContainer) {
Stegasoo.triggerScanAnimation(zone, file);
Stego.triggerScanAnimation(zone, file);
} else if (isPixelContainer) {
Stegasoo.triggerPixelReveal(zone, file);
Stego.triggerPixelReveal(zone, file);
}
};
reader.readAsDataURL(file);
@@ -264,7 +264,7 @@ const Stegasoo = {
if (hashEl) {
// Generate a deterministic fake hash preview from filename + size
const fakeHash = Stegasoo.generateFakeHash(file.name + file.size);
const fakeHash = Stego.generateFakeHash(file.name + file.size);
hashEl.textContent = `SHA256: ${fakeHash.substring(0, 8)}····${fakeHash.substring(56)}`;
}
}
@@ -328,7 +328,7 @@ const Stegasoo = {
tracesContainer.style.left = imgLeft + 'px';
// Generate Tron-style circuit traces covering the image
Stegasoo.generateEmbedTraces(tracesContainer, imgWidth, imgHeight);
Stego.generateEmbedTraces(tracesContainer, imgWidth, imgHeight);
};
// Wait for image to be ready
@@ -349,7 +349,7 @@ const Stegasoo = {
if (grid) grid.remove();
// Populate data panel
Stegasoo.populatePixelDataPanel(container, file, preview);
Stego.populatePixelDataPanel(container, file, preview);
}, duration);
},
@@ -453,7 +453,7 @@ const Stegasoo = {
input.addEventListener('change', function() {
if (this.files && this.files[0]) {
Stegasoo.showImagePreview(this.files[0], preview, label, container);
Stego.showImagePreview(this.files[0], preview, label, container);
}
});
});
@@ -1721,10 +1721,10 @@ const Stegasoo = {
document.addEventListener('DOMContentLoaded', () => {
// Detect page and initialize
if (document.getElementById('encodeForm')) {
Stegasoo.initEncodePage();
Stego.initEncodePage();
} else if (document.getElementById('decodeForm')) {
Stegasoo.initDecodePage();
Stego.initDecodePage();
} else if (document.querySelector('[data-page="generate"]')) {
Stegasoo.initGeneratePage();
Stego.initGeneratePage();
}
});

View File

@@ -1,9 +1,9 @@
/**
* Stegasoo Generate Page JavaScript
* FieldWitness Stego Generate Page JavaScript
* Handles credential generation form and display
*/
const StegasooGenerate = {
const StegoGenerate = {
// ========================================================================
// FORM CONTROLS
@@ -260,20 +260,20 @@ const StegasooGenerate = {
// Global function wrappers for onclick handlers
function togglePinVisibility() {
StegasooGenerate.togglePinVisibility();
StegoGenerate.togglePinVisibility();
}
function togglePassphraseVisibility() {
StegasooGenerate.togglePassphraseVisibility();
StegoGenerate.togglePassphraseVisibility();
}
function printQrCode() {
StegasooGenerate.printQrCode();
StegoGenerate.printQrCode();
}
// Auto-init form controls
document.addEventListener('DOMContentLoaded', () => {
if (document.querySelector('[data-page="generate"]')) {
StegasooGenerate.initForm();
StegoGenerate.initForm();
}
});