Add port numbers, HTTPS configuration instructions, and
systemctl enable commands to help users get started.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Move bip39-words.txt into package data directory and use
importlib.resources for reliable path resolution. The wordlist
was previously only included in sdist but not in wheel builds.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update pkgver fallback to 4.2.1 in all PKGBUILDs
- Add test-aur-build.sh for Docker-based testing
- Add test-aur-nspawn.sh for systemd-nspawn testing
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The CLI api commands were using a hardcoded path to find frontends/
which didn't work when installed as a package. Now tries both:
- Development: .../stegasoo/frontends
- Installed: .../site-packages/frontends
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New package in aur-api/ for API-only installation:
- Installs [api,cli,compression] extras
- Has fastapi/uvicorn for REST API
- No flask/gunicorn (web UI deps)
- 74MB package size
- Systemd service with TLS enabled by default
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
API Authentication (v4.2.1):
- API key auth via X-API-Key header
- Keys hashed (SHA-256) and stored in ~/.stegasoo/api_keys.json
- Auth disabled when no keys configured
- Protected endpoints: encode, decode, generate, channel/*, compare, etc.
- Public endpoints: /, /docs, /modes, /auth/status, /channel/status
TLS Support:
- Auto-generates self-signed certs on first run
- Certs include localhost, local IPs, hostname.local
- Stored in ~/.stegasoo/certs/
CLI Commands:
- stegasoo api keys list/create/delete
- stegasoo api tls generate/info
- stegasoo api serve (starts with TLS by default)
Updated systemd service to use TLS.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
New package in aur-cli/ for CLI-only installation:
- Installs [cli,dct,compression] extras only
- No flask/gunicorn/fastapi/uvicorn/pyzbar dependencies
- 68MB vs 79MB for full package
- Conflicts with stegasoo-git (can't install both)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Port Web UI image tools to CLI for parity:
- compress: JPEG compression with size reduction stats
- rotate: Rotation and flip with jpegtran for JPEGs (DCT-safe)
- convert: Format conversion between PNG, JPG, BMP, WebP
Rotate tool supports flip-only operations without rotation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
CLI encode:
- Auto-detect output format from extension (.jpg → DCT mode, .png → LSB)
- Default to JPEG output for JPEG carriers (preserves DCT benefits)
- Pass embed_mode and dct_output_format to encode function
jpegtran fix (critical for rotation fallback):
- Remove -trim flag which was dropping edge blocks and destroying stego data
- Remove -perfect flag which fails on non-MCU-aligned images
- Plain jpegtran without flags works correctly for lossless rotation
This enables: encode → external rotation → decode to work correctly.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
EXIF Viewer:
- Card-based grid layout with categories (Camera, Image, Date/Time, Exposure, GPS, Other)
- Icons for each category
- Truncation for long values with full value on hover
Tools UI:
- Reduced padding from 1.25rem to 0.5rem on all tool panels
- Smaller fonts for labels (0.55rem) and values (0.7rem)
- Compact headers and action buttons
- Tighter grid gaps and card padding
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
DCT steganography improvements:
- Add _apply_exif_orientation() to fix portrait photos encoding rotated
- Add _jpegtran_rotate() for lossless JPEG rotation preserving DCT data
- Add rotation fallback in extract_from_dct() - tries 0°, 90°, 180°, 270°
- Quick header validation to skip invalid rotations efficiently
- Fix: wrap debug.print in try/except to prevent extraction failures
Web UI rotate tool:
- Use jpegtran for JPEGs (lossless, preserves DCT steganography)
- Fall back to PIL for non-JPEGs
- Dynamic UI shows "DCT Safe" for JPEGs, warning for other formats
This enables the workflow: encode → compress → rotate → decode
Rotated stego JPEGs can now be decoded by trying all orientations.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Pentax and other cameras have binary EXIF fields (MakerNote, etc.) that
contain raw bytes. The previous code used errors="replace" which still
produced strings with replacement characters that broke JSON parsing.
Now properly detect non-printable binary data and display as
"<N bytes binary>" instead.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace jpegio references with jpeglib in comments/docstrings
- Update sanitize-for-image.sh to use system Python 3.11+ (no pyenv)
- Update rpi/patches/README.md for jpeglib world
- Add AUR build artifacts to .gitignore
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Update remote-build-pi.sh to use new naming
- Rewrite build-runtime-tarball.sh for pyenv-free world (system Python)
- Removed pyenv references, now just tarballs the venv
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Only remove dictionary entries for turbo/mozjpeg versions in setup.py
(they need cmake-generated headers). Keep the if blocks intact - they
safely evaluate to False for standard libjpeg versions.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
APIs changed between libjpeg versions, so each version directory
needs its matching headers:
- 6b gets 6b headers
- 7 gets 7 headers
- 8-8d get 8d headers
- 9-9f get 9f headers
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The setup.py has broken include_dirs that reference 'jpeglib/cjpeglib'
but the source files are in 'src/jpeglib/cjpeglib'. Create a symlink
to fix the include path resolution.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
The PyPI source tarball is missing both jpeglib's own headers
(cjpeglib_common.h, etc.) and libjpeg headers. Clone from GitHub
which has the jpeglib headers, then download libjpeg headers.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
jpeglib has no pre-built ARM64 wheel and the source tarball is missing
libjpeg header files. This adds a workaround that downloads the official
libjpeg headers before building.
- Add rpi/patches/jpeglib/install-jpeglib-arm64.sh helper script
- Update setup.sh to download headers when building from source
- Downloads headers for libjpeg 6b, 7-9f, turbo, and mozjpeg versions
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Rewrite setup.sh to use system Python instead of pyenv
- Add Python version check (3.11-3.14 supported)
- Remove jpegio build steps (jpeglib installs cleanly via pip)
- Simplify prebuilt tarball (just venv, no pyenv)
- Reduce install time: 5-10 min from source (was 15-20 min)
- Update README.md and BUILD_IMAGE.md accordingly
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Default branch: 4.1 → 4.2
- Update prebuilt URL to v4.2.0
- Update example filenames to 4.2.0
- Remove jpegio references (now using jpeglib)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Move zbar from optdepends to depends (required for Web UI QR reading)
- Create temp_files directories for web and api frontends
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace jpegio with jpeglib (jpeglib.to_jpegio compatibility layer)
- Update Python requirement to >=3.11, add 3.13/3.14 classifiers
- AUR: Add install script for user creation and permissions
- AUR: Install frontends to site-packages, create Flask instance dir
- AUR: Use dynamic ${pyver} for systemd WorkingDirectory
Tested: CLI, Web UI (Gunicorn), API (Uvicorn), DCT jpeglib roundtrip
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Uses python312 from AUR for jpegio 3.13 compatibility
- Self-contained venv in /opt/stegasoo
- Includes systemd service files for web and API
- CLI symlinked to /usr/bin/stegasoo
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added zstandard>=0.22.0 to base image dependencies
- Updated verification to check zstd import
- Bumped base image version label to 4.2.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- rebuild: cleans everything, rebuilds base and services with --no-cache
- Updated help text to clarify full vs rebuild
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
CLI generate command:
- --qr <file.png|jpg> to save RSA key as QR image
- --qr-ascii to print ASCII QR code to terminal
API endpoints:
- POST /generate-key-qr - generate QR from key_pem
- Supports png, jpg, and ascii output formats
- Uses zstd compression by default
- Added has_qrcode_write to /capabilities
Core:
- generate_qr_code() now supports jpg/jpeg output format
- New generate_qr_ascii() for terminal display
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
zstd is now the default compression algorithm across all frontends,
so it should always be installed with the base package.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- RSA key size capped at 3072 bits (4096 too large for QR codes)
- Added zstd compression for QR code RSA keys (better ratio than zlib)
- New prefix STEGASOO-ZS: for zstd, backward compatible with STEGASOO-Z: (zlib)
- Added zstandard dependency to web/api/compression extras
- Updated all docs, CLI options, and web UI to reflect 3072 max
- Version bump to 4.2.0
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
When encode form was submitted in async mode, validation errors
returned HTML (render_template) instead of JSON, causing
"Unexpected token '<'" parse errors in the browser.
Added _error_response() helper that returns JSON in async mode
and HTML flash in sync mode.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Create stegasoo-api.service for FastAPI on port 8000
- Prompt user during setup with security warning (no auth)
- Default to disabled (recommended)
- Update help text and start commands for both services
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>