Repository navigation
Releases: ahmetomerv/photoc
Release list
photoc v0.7.1
photoc 0.7.1
This release focuses on performance and correctness. Scans, hashing, contact
sheets, compression, metadata reads, and interactive review all do less work
for the same results. There are no new commands and no changes to command
options, exit codes, or JSON schemas.
Changes since 0.6.0
Performance
- SHA-256 now dispatches at runtime to the CPU's SHA extensions: Intel SHA-NI
on x86_64 and ARMv8 SHA-2 on AArch64, with the scalar path as the fallback.
SetPHOTOC_SHA256_FORCE_SCALARin the environment (or define it when
compiling) to force the scalar path. Digests are unchanged. duplicatesreads 64-byte prefixes for large same-size cohorts through the
thread pool, keeping the full hashes for actual matches.contactdecodes each source at roughly thumbnail scale instead of up to
4096 px, while still admitting TurboJPEG's coarsest 1/8 scale for large
sources. Thumbnails are unchanged; large sources still render.compressreads the source JPEG once for both metadata and decoding, and
reuses the chosen encode from a--targetsearch instead of re-encoding.imagedecoding reuses one TurboJPEG handle across a batch instead of
creating and destroying one per file.renameprecompiles the--formattemplate once per command and renders
each entry from it rather than re-parsing per photo.statsuses an indexed lookup for distribution buckets instead of linear
scans once a table grows.- JPEG metadata inspection reads EXIF in the single file pass, and entropy
data is block-scanned rather than read one byte at a time. focusscores photos in parallel.- The progress display samples the monotonic clock only as often as the
90 ms redraw cadence needs, while slow and changing phases still update
promptly.
Fixes
- A shared JPEG decode context now re-creates its TurboJPEG handle after a
rejected header or decode, so a batch keeps working after one bad file on
older libjpeg-turbo releases (for example Ubuntu 22.04's 2.1.2). - SHA-256 acceleration now requires every instruction-set feature the
accelerated block function uses (SHA, SSSE3, and SSE4.1) before it is
selected. This preventsSIGILLon CPUs or VMs that expose SHA while
masking SSSE3 or SSE4.1. - EXIF capture allocation failures are now reported as metadata errors
instead of silently dropping fields. - The progress update-rate estimate is reset correctly across phase changes.
Tests and documentation
- Added contact-sheet checks for thumbnail detail, scale, orientation,
cropping, and blank tiles at both thumbnail-size extremes and for sources
beyond the old decode cap. - Added scalar-vs-accelerated hashing coverage, a compress output golden, and
deterministic progress rendering in the CLI tests. - Documents
compresspeak memory and the probe cache bound.
Compatibility and safety
No command, option, exit code, or JSON schema changed in this release, and the
runtime dependencies are unchanged. The SHA-256 acceleration is a transparent
speedup with a scalar fallback, so files hash to the same digests on every CPU.
File-safety behavior is unchanged: rename and sort preview unless --apply
is given; compress, contact, and scrub write new copies and never
overwrite unrelated files; scrub --in-place still replaces originals with no
backup; review writes only its separate state file and never changes JPEGs.
See the file-safety table.
Upgrading
Installed copies do not update automatically. Follow the
upgrade steps
to replace an owned release installation. Homebrew users can upgrade after
the tap formula has been updated for this release. Source installations should
be rebuilt and reinstalled from the new tag. Verify with photoc --version,
which should print photoc 0.7.1.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turbo libxml2on the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), TurboJPEG (libturbojpeg.so.0), libjpeg
(libjpeg.so.8), and libxml2 (libxml2.so.2). On Ubuntu, install them
withsudo apt install libexif12 libturbojpeg libjpeg8 libxml2.
These libraries are dynamically linked and are not bundled. macOS binaries
are not developer-signed or notarized. Other CPUs and Linux systems without
glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables; SHA256SUMS-<platform> covers that
platform's archive and executable. Verify downloaded files with
shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
What's Changed
- perf(progress): drop the pre-count directory walk by @ahmetomerv in #5
- ci: run push checks only on main by @ahmetomerv in #6
- docs: describe pull request checks and release flow by @ahmetomerv in #7
- perf(fs): classify walk entries with
d_typeand reuse the path buffer by @ahmetomerv in #8 - perf(metadata): read EXIF in the single JPEG inspection pass by @ahmetomerv in #9
- perf(jpeg): block-scan entropy data instead of per-byte
fgetcby @ahmetomerv in #10 - perf(compress): reuse the chosen encode from the target search by @ahmetomerv in #11
- perf(stats): index bucket lookups instead of linear scans by @ahmetomerv in #12
- test(progress_cli): give the progress runs a large, cheap workload by @ahmetomerv in #13
- perf(compress): read the source JPEG once for metadata and decode by @ahmetomerv in #14
- perf(contact): decode thumbnails at thumbnail scale by @ahmetomerv in #15
- perf(hash): accelerate SHA-256 and parallelize prefix reads by @ahmetomerv in #16
- perf(rename): precompile filename templates by @ahmetomerv in #17
- perf(progress): cap per-file clock reads to the display cadence by @ahmetomerv in #18
- perf(image): reuse a decode handle across a batch by @ahmetomerv in #19
- docs(compress): document peak memory and the probe cache bound by @ahmetomerv in #20
- fix: report EXIF capture allocation failures by @ahmetomerv in #21
- perf(compress): retain only the winning target encode by @ahmetomerv in #22
- fix(progress): reset clock stride on phase changes by @ahmetomerv in #23
- fix(hash): require all x86 SHA features before dispatch by @ahmetomerv in #24
- test(contact): verify thumbnail decode detail, scale and orientation by @ahmetomerv in #25
- chore: prepare release 0.7.0 by @ahmetomerv in #26
- fix(image): recreate the decode handle after a failed decode by @ahmetomerv in #27
- chore: prepare release 0.7.1 by @ahmetomerv in #28
Full Changelog: v0.6.0...v0.7.1
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libxml2
libxml2 parses standard XMP packets
for selective privacy removal. It is installed separately and dynamically
linked. libxml2 uses the MIT License; retain the notice supplied by the
installed package when redistributing its library. No libxml2 binary or source
is bundled with photoc.
libexif
[libexif](https:/...
photoc v0.6.0
photoc 0.6.0
This release adds interactive JPEG review. Browse a shoot in the terminal,
inspect metadata and sharpness, and save picked or rejected marks without
changing the photos.
Changes since 0.5.0
- Added
photoc review <directory>with keyboard navigation, pick (p),
reject (x), unmark (u), metadata detail (i), help (?), and quit (q).
Letter keys accept either case. The action keys have prominent labels and
colors that can be disabled withNO_COLOR=1. - Added flat or recursive JPEG discovery, deterministic name or capture-date
ordering, and--show all|unmarked|picked|rejectednavigation filters.
Counts always cover the full discovered collection. - Added a versioned
.photoc-review.jsonstate file with atomic saves after
each changed mark. Review resumes saved selections, retains entries for
temporarily absent photos, and refuses malformed or wrong-root state files. - Added
--images auto|iterm|none. Auto mode uses inline JPEG display in a
confidently detected direct iTerm2 session and otherwise uses text only.
itermforces protocol output but cannot make an unsupported terminal show
images;nonekeeps the metadata and controls without an image. Sharpness
is computed when first needed and cached for the session. - Improved iTerm2 review navigation with bounded in-memory JPEG previews and
idle preparation of adjacent photos. Resize bursts redraw after the window
settles. ICC-profiled photos retain original-byte display, and source JPEGs
remain unchanged. - Added review coverage for state safety, unusual filenames, ordering, image
encoding, terminal restoration, and interactive navigation. Updated help,
the man page, command guide, and shell completions.
Compatibility and safety
review requires a directory and interactive stdin and stdout. It supports
JPEG files only, does not support --json, and never edits, moves, or deletes
photos. Its only persistent write is the separate review-state JSON file.
Existing commands, JSON schemas, and runtime dependencies are unchanged.
Review supports macOS and Linux terminals; inline images use iTerm2's protocol,
with a text-only fallback elsewhere. See the review guide
for controls, state behavior, and terminal limits.
Upgrading
Installed copies do not update automatically. Follow the
upgrade steps
to replace an owned release installation. Homebrew users can upgrade after
the tap formula has been updated for this release. Source installations should
be rebuilt and reinstalled from the new tag. Verify with photoc --version,
which should print photoc 0.6.0.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turbo libxml2on the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), TurboJPEG (libturbojpeg.so.0), libjpeg
(libjpeg.so.8), and libxml2 (libxml2.so.2). On Ubuntu, install them
withsudo apt install libexif12 libturbojpeg libjpeg8 libxml2.
These libraries are dynamically linked and are not bundled. macOS binaries
are not developer-signed or notarized. Other CPUs and Linux systems without
glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables; SHA256SUMS-<platform> covers that
platform's archive and executable. Verify downloaded files with
shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
What's Changed
- Request Homebrew tap PRs after releases by @ahmetomerv in #2
Full Changelog: v0.5.0...v0.6.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libxml2
libxml2 parses standard XMP packets
for selective privacy removal. It is installed separately and dynamically
linked. libxml2 uses the MIT License; retain the notice supplied by the
installed package when redistributing its library. No libxml2 binary or source
is bundled with photoc.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
The ARW metadata backend reuses libexif's byte-order utilities, entry ownership,
and common field interpretation. Its bounded TIFF directory reader is original
photoc code; no RAW decoder, new library, or third-party implementation is
bundled. The dependency and licensing terms are unchanged.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG and libjpeg APIs)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo supplies both the
TurboJPEG API used by image operations and the streaming libjpeg API used by
the read-only JPEG audit. Both shared libraries are installed separately and
dynamically linked; no additional upstream source or library binary is bundled.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Modified BSD notice from libjpeg-turbo 2.1.2
photoc v0.5.0
photoc 0.5.0
This release makes file sizes easier to read in terminal output and reorganizes
the documentation. JSON retains exact numeric byte values for scripts.
Changes since 0.4.0
exif,stats,timeline,duplicates, andcompressdisplay file sizes
using decimal B, KB, MB, GB, TB, PB, or EB. Values above B use one decimal
place, such as2.3 MB. This also applies to compression summaries and
target-miss diagnostics.- Added shared size formatting and tests for unit boundaries and a 2.3 MB EXIF
file. JSON byte fields keep their existing names, types, and exact values. - The README now gives a shorter overview with a demo GIF. Detailed usage,
installation, scripting, and command references are linked from it. - Removed duplicate installer and uninstaller files from the repository root.
The maintained checkout paths arescripts/install.shand
scripts/uninstall.sh; the Quick start still downloads them as
install-photoc.shanduninstall-photoc.sh.
Compatibility and safety
Human-readable size text has changed. Scripts that need exact byte counts
should use the existing JSON output. There are no JSON schema or exit-code
changes and no new runtime dependencies. Read-only commands remain read only;
file-modifying commands keep their existing overwrite, preview, and rollback
behavior. See the command guides
for their safety and metadata limits.
Upgrading
Installed copies do not update automatically. Follow the
upgrade steps
to replace an owned release installation. Source installations should be
rebuilt and reinstalled from the new tag. Verify with photoc --version,
which should print photoc 0.5.0.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turbo libxml2on the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), TurboJPEG (libturbojpeg.so.0), libjpeg
(libjpeg.so.8), and libxml2 (libxml2.so.2). On Ubuntu, install them
withsudo apt install libexif12 libturbojpeg libjpeg8 libxml2.
These libraries are dynamically linked and are not bundled. macOS binaries
are not developer-signed or notarized. Other CPUs and Linux systems without
glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables; SHA256SUMS-<platform> covers that
platform's archive and executable. Verify downloaded files with
shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
Full Changelog: v0.4.0...v0.5.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libxml2
libxml2 parses standard XMP packets
for selective privacy removal. It is installed separately and dynamically
linked. libxml2 uses the MIT License; retain the notice supplied by the
installed package when redistributing its library. No libxml2 binary or source
is bundled with photoc.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
The ARW metadata backend reuses libexif's byte-order utilities, entry ownership,
and common field interpretation. Its bounded TIFF directory reader is original
photoc code; no RAW decoder, new library, or third-party implementation is
bundled. The dependency and licensing terms are unchanged.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG and libjpeg APIs)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo supplies both the
TurboJPEG API used by image operations and the streaming libjpeg API used by
the read-only JPEG audit. Both shared libraries are installed separately and
dynamically linked; no additional upstream source or library binary is bundled.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Modified BSD notice from libjpeg-turbo 2.1.2
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2.1.2/LICENSE.md
Copyright (C)2009-2021 D. R. Commander. All Rights Reserved.
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO E...
photoc v0.4.0
photoc 0.4.0
This release makes long-running photo operations easier to follow in an
interactive terminal. It adds a shared progress display and the global
--no-progress option. Existing command results, JSON output, and file-safety
behavior are unchanged.
Changes since 0.3.0
- Directory scans show a spinner during discovery. When the number of photos
or files is known, processing shows a count and percentage. Duplicate
detection also distinguishes discovery, candidate grouping, and hashing. - Progress is available in directory operations for
stats,duplicates,
focus,compress,scrub,rename,sort,query,check,timeline,
andcontact. Rename and sort show progress during planning and--apply.
Single-fileexifremains immediate and does not show progress. - Progress is written to stderr; requested results and JSON stay on stdout.
Animation starts only when stderr is a terminal and the operation lasts at
least about 200 ms. Redirected stderr,--quiet, and--no-progressdisable
the display. JSON alone does not disable it. - Progress redraws are throttled, completion can show elapsed time, and
interruption leaves the terminal line clean. Worker threads report counts
to the caller thread, which alone renders progress. - The README now uses a banner image, and the installer no longer prints a
fish-specific PATH suggestion.
There are no intentional command removals, JSON schema changes, or new runtime
dependencies. The global --no-progress option works before or after the
command. See the command guides
for exact options and output contracts.
File safety and limits
Read-only commands remain read only. rename and sort still preview changes
unless --apply is supplied; progress does not change their preflight or
rollback behavior. scrub writes new copies by default, while --in-place
atomically replaces originals without a backup. Directory scrub operations
are not transactional across photos. Contact sheets do not overwrite an
existing output. See the command guides for the existing metadata, JPEG,
privacy, and color-management limits.
The progress display advances at file or work-unit boundaries. A single
long-running synchronous file operation may leave its current spinner frame
visible until that operation returns. Progress is informational and does not
guarantee that every file can be processed.
Upgrading
Installed copies do not update automatically. Follow the
upgrade steps
to replace an owned release installation. Source installations should be
rebuilt and reinstalled from the new tag. Verify with photoc --version,
which should print photoc 0.4.0.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turbo libxml2on the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), TurboJPEG (libturbojpeg.so.0), libjpeg
(libjpeg.so.8), and libxml2 (libxml2.so.2). On Ubuntu, install them
withsudo apt install libexif12 libturbojpeg libjpeg8 libxml2.
These libraries are dynamically linked and are not bundled. macOS binaries
are not developer-signed or notarized. Other CPUs and Linux systems without
glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables; SHA256SUMS-<platform> covers that
platform's archive and executable. Verify downloaded files with
shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
Full Changelog: v0.3.0...v0.4.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libxml2
libxml2 parses standard XMP packets
for selective privacy removal. It is installed separately and dynamically
linked. libxml2 uses the MIT License; retain the notice supplied by the
installed package when redistributing its library. No libxml2 binary or source
is bundled with photoc.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
The ARW metadata backend reuses libexif's byte-order utilities, entry ownership,
and common field interpretation. Its bounded TIFF directory reader is original
photoc code; no RAW decoder, new library, or third-party implementation is
bundled. The dependency and licensing terms are unchanged.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG and libjpeg APIs)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo supplies both the
TurboJPEG API used by image operations and the streaming libjpeg API used by
the read-only JPEG audit. Both shared libraries are installed separately and
dynamically linked; no additional upstream source or library binary is bundled.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Modified BSD notice from libjpeg-turbo 2.1.2
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2.1.2/LICENSE.md
Copyright (C)2009-2021 D. R. Commander. All Rights Re...
photoc v0.3.0
photoc 0.3.0
This release adds JPEG integrity and metadata search, Sony ARW metadata support,
shooting timelines, expanded statistics, privacy metadata removal, and JPEG
contact sheets. Existing scrub --gps behavior remains available.
Changes since 0.2.0
checkaudits JPEG marker structure, decodes every scanline, and reports
EXIF and decoder warnings. It is read only and supports human or JSON output.querysearches JPEG metadata with camera, exposure, capture-date, and GPS
filters. It emits paths, NUL-separated paths, or JSON for scripts.exif,stats,timeline,rename, andsortnow read common metadata from
Sony ARW files. RAW pixels are never developed or rewritten. Other RAW
formats remain unsupported.statsadds file-size, exposure, dimension, calendar, and session summaries.
Existing JSON fields remain; new fields are additive.timelinegroups JPEG and ARW photos by recorded date and capture-time
session, with configurable gaps and JSON output.scrub --privacyselectively removes supported EXIF identifiers and GPS,
standard XMP location and personal fields, and supported IPTC location
fields.scrub --all-metadataremoves descriptive metadata while retaining
ICC profiles and EXIF orientation. The three scrub modes are exclusive.contactgenerates paged JPEG contact sheets with filenames and optional
exposure lines. Thumbnails keep aspect ratio and apply EXIF orientation.
The built-in text font needs no platform GUI or extra font package.
See the command guides
for exact options, output contracts, and limits.
File safety and limits
check, query, stats, and timeline do not modify photos. rename and
sort still preview changes unless --apply is supplied. scrub writes new
copies by default; --in-place atomically replaces originals without making
a backup. Contact sheets never overwrite an existing output. If a later page
fails, earlier completed sheets remain. Directory scrub operations are also
not transactional across photos.
Privacy mode does not parse or guarantee sanitization of MakerNotes.
Sensitive fields may remain in MakerNotes, unsupported proprietary markers,
filenames, sidecars, or visible image content. Unsupported or malformed XMP
layouts can cause scrub to fail rather than publish a partial edit. Review
outputs before sharing. --all-metadata retains ICC and orientation, but
contact sheets copy neither source metadata nor ICC and do not perform color
profile conversion. They are for review, not color-managed proofs.
check reports detected readability problems; an OK result is not a backup or
a full metadata/security audit. Contact scans are limited to 1,000 JPEGs,
64 MiB per source file, 24 tiles per page, and a 64 MiB RGB canvas. Large
shoots are paged with -001, -002, and subsequent filename suffixes.
The CLI remains in the 0.x series; review each release's notes when
upgrading. There are no intentional removals of existing commands or flags
in this release.
Upgrading
Installed copies do not update automatically. Follow the
upgrade steps
to replace an owned release installation. Source installations should be
rebuilt and reinstalled from the new tag. Verify with photoc --version,
which should print photoc 0.3.0.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turbo libxml2on the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), TurboJPEG (libturbojpeg.so.0), libjpeg
(libjpeg.so.8), and libxml2 (libxml2.so.2). On Ubuntu, install them
withsudo apt install libexif12 libturbojpeg libjpeg8 libxml2.
These libraries are dynamically linked and are not bundled. macOS binaries
are not developer-signed or notarized. Other CPUs and Linux systems without
glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables; SHA256SUMS-<platform> covers that
platform's archive and executable. Verify downloaded files with
shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
What's Changed
- chore: prepare photoc 0.3.0 release by @ahmetomerv in #1
New Contributors
- @ahmetomerv made their first contribution in #1
Full Changelog: v0.2.0...v0.3.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libxml2
libxml2 parses standard XMP packets
for selective privacy removal. It is installed separately and dynamically
linked. libxml2 uses the MIT License; retain the notice supplied by the
installed package when redistributing its library. No libxml2 binary or source
is bundled with photoc.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
The ARW metadata backend reuses libexif's byte-order utilities, entry ownership,
and common field interpretation. Its bounded TIFF directory reader is original
photoc code; no RAW decoder, new library, or third-party implementation is
bundled. The dependency and licensing terms are unchanged.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG and libjpeg APIs)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo supplies both the
TurboJPEG API used by image operations and the streaming libjpeg API used by
the read-only JPEG audit. Both shared libraries are installed separately and
dynamically linked; no additional upstream source or library binary is bundled.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY E...
photoc v0.2.0
photoc 0.2.0
This release adds working global output verbosity and preserves photographic
metadata when recompressing JPEGs. Runtime dependencies and installation
commands are unchanged from 0.1.0.
Changes since 0.1.0
--verbose/-vadds command diagnostics on stderr, including operating
mode, paths, scan/skip/failure counts, and relevant processing settings.--quiet/-qsuppresses informational status and non-critical metadata
warnings while keeping requested results and errors visible. JSON schemas
are unchanged, and JSON stdout remains uncontaminated in both modes.- Quiet and verbose flags work before or after the command. Combining them
now returns usage status 2; in 0.1.0 both flags were accepted without
affecting output. compressnow preserves EXIF APP1, ICC_PROFILE APP2 chunks, and standard
and Extended Adobe XMP APP1 payloads byte for byte, in their original
relative order. This applies to quality, target-size, and directory modes.- Compression validates complete, consistent ICC chunk sets and rejects
malformed sets without publishing that file's output. Target-size searches
include all preserved marker overhead. Outputs are decoded and checked for
dimensions and metadata before publication; grayscale inputs with ICC stay
grayscale, and EXIF Orientation is retained without rotating pixels. - Documentation now includes source-install uninstall instructions and clearer
shell PATH setup.
See the verbosity guide
and metadata support
for exact behavior.
Included commands
exif: read JPEG dimensions, camera and exposure settings, capture time, and GPS.stats: summarize a JPEG collection's storage, dates, cameras, and exposure settings.duplicates: find exact file duplicates using SHA-256.renameandsort: preview metadata-based filenames and date/session folders,
then apply changes with--apply.compress: make JPEG copies at a chosen quality or target size.focus: compare JPEG sharpness scores as a photo-review aid.scrub: remove EXIF GPS tags, writing copies by default.
JSON output is available for exif, stats, duplicates, and focus.
Shell completions are included for zsh, bash, and fish.
File safety and current limits
Rename and sort preview by default and never overwrite existing destinations.
Compression is lossy and can increase file size. Preserved EXIF and XMP include
GPS and other location information; compression is not a privacy scrub.
ICC packaging is validated without interpreting or converting the profile.
Standard and Extended XMP are copied as opaque packets; XML, GUID links, and
extended completeness are not validated or repaired. Other original APP
markers, comments, Photoshop/IPTC resources, and MPF/MPO offset data are not
copied. Recognized metadata after the first scan is rejected, and metadata
snapshots are capped at 64 MiB including segment bookkeeping. The existing
decoder does not support CMYK/YCCK JPEGs.
Scrub behavior is unchanged: it removes EXIF GPS only;
location data in other metadata may remain. scrub --in-place replaces
originals without creating a backup. See the
file-safety notes
and command guides before changing or sharing important photos.
Image commands currently support JPEG files. Sharpness scores are review hints,
not proof of blur. The command-line interface may change during the 0.x series;
review each release's notes before upgrading.
Upgrading
Existing installations do not update automatically. Follow the
upgrade steps
to replace an owned release installation. For source installations, rebuild
from the new tag and reinstall as documented there. Confirm the update with
photoc --version, which should print photoc 0.2.0.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turboon the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), and TurboJPEG (libturbojpeg.so.0). On Ubuntu,
install them withsudo apt install libexif12 libturbojpeg.
Dependency libraries are dynamically linked and are not bundled. macOS
binaries are not developer-signed or notarized. Other CPUs and Linux systems
without glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables;
SHA256SUMS-<platform> covers that platform's archive and executable. Verify
downloaded files with shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
Full Changelog: v0.1.0...v0.2.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG API)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY...
photoc v0.1.0
photoc 0.1.0
First public release of photoc, a command-line application for local photo
collections on macOS and Linux.
Included commands
exif: read JPEG dimensions, camera and exposure settings, capture time, and GPS.stats: summarize a JPEG collection's storage, dates, cameras, and exposure settings.duplicates: find exact file duplicates using SHA-256.renameandsort: preview metadata-based filenames and date/session folders,
then apply changes with--apply.compress: make JPEG copies at a chosen quality or target size.focus: compare JPEG sharpness scores as a photo-review aid.scrub: remove EXIF GPS tags, writing copies by default.
JSON output is available for exif, stats, duplicates, and focus.
Shell completions are included for zsh, bash, and fish.
File safety and current limits
Rename and sort preview by default and never overwrite existing destinations.
Compression is lossy and drops ICC/XMP metadata. Scrub removes EXIF GPS only;
location data in other metadata may remain. scrub --in-place replaces
originals without creating a backup. See the
file-safety notes
and command guides before changing or sharing important photos.
Image commands currently support JPEG files. Sharpness scores are review hints,
not proof of blur. --verbose and --quiet are accepted but do not change
output yet. The command-line interface may change during the 0.x series;
review each release's notes before upgrading.
Downloads and requirements
Choose the archive or executable matching your OS and CPU:
- macOS arm64 or x86_64: macOS 15 or newer. Install runtime libraries with
brew install libexif jpeg-turboon the matching architecture. - Linux x86_64: built on Ubuntu 22.04; requires glibc 2.35 or newer,
libexif (libexif.so.12), and TurboJPEG (libturbojpeg.so.0). On Ubuntu,
install them withsudo apt install libexif12 libturbojpeg.
Dependency libraries are dynamically linked and are not bundled. macOS
binaries are not developer-signed or notarized. Other CPUs and Linux systems
without glibc should build from source.
Archives contain bin/photoc, its man page, shell completions, documentation,
the MIT license, and third-party notices and license texts. SHA256SUMS covers
all archives and raw executables;
SHA256SUMS-<platform> covers that platform's archive and executable. Verify
downloaded files with shasum -a 256 -c SHA256SUMS-<platform> (macOS) or
sha256sum -c SHA256SUMS-<platform> (Linux), with both files in that directory.
See the installation guide
for the checksum-verified release installer and safe uninstall flow.
Full Changelog: https://github.com/ahmetomerv/photoc/commits/v0.1.0
Licenses
MIT License
Copyright (c) 2026 photoc contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Third-party notices
photoc's own source is licensed under the MIT License in LICENSE.
The following libraries are installed separately and dynamically linked;
release archives do not bundle their binaries or source. Build tools and
optional test tools are not runtime dependencies.
libexif
libexif is used under the GNU Lesser
General Public License version 2.1. Some source files permit LGPL 2.0 or later;
the upstream COPYING supplies version 2.1, reproduced in
licenses/libexif/COPYING. libexif retains its upstream authors' copyrights.
Its source and individual notices are available from the upstream repository
and from the package manager providing the installed library.
Compatible replacement shared libraries can be installed without rebuilding
photoc. photoc source and build instructions are also available so users can
rebuild against a modified library. If distributing a statically linked build
or bundling dependency libraries, review their additional distribution terms.
libjpeg-turbo (TurboJPEG API)
This software is based in part on the work of the Independent JPEG Group.
libjpeg-turbo uses the IJG
license and the Modified BSD License; its SIMD implementation also uses the
zlib license, whose conditions are subsumed by the IJG license as explained
upstream. The TurboJPEG API wraps the libjpeg implementation, so both IJG
and Modified BSD terms apply. The unaltered IJG README is included in
licenses/libjpeg-turbo/README.ijg.
The full upstream license summaries for 3.2.0 (the audited macOS library)
and 2.1.2 (the Ubuntu 22.04 release build dependency) are included in
licenses/libjpeg-turbo/. Package managers can update these versions; check
their installed notices as well. Both BSD notices follow so these materials
also accompany raw executable downloads in GitHub release notes.
Modified BSD notice from libjpeg-turbo 3.2.0
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/3.2.0/LICENSE.md
Copyright (C) 2009-2026 D. R. Commander
Copyright (C) 2018-2023 Randy randy408@protonmail.com
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
Modified BSD notice from libjpeg-turbo 2.1.2
Source: https://github.com/libjpeg-turbo/libjpeg-turbo/blob/2.1.2/LICENSE.md
Copyright (C)2009-2021 D. R. Commander. All Rights Reserved.
Copyright (C)2015 Viktor Szathmáry. All Rights Reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
- Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution. - Neither the name of the libjpeg-turbo Project nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS",
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
POSSIBILITY OF SUCH DAMAGE.
GNU LESSER GENERAL PUBLIC LICENSE
Version 2.1, February 1999
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
[This is the first released version of the Lesser GPL. It also counts
as the successor of the GNU Library Public License, version 2, hence
the version number 2.1.]
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
Licenses are intended to guarantee your freedom to share and change
free software--to make sure the software is f...