{"id":29941758,"url":"https://github.com/danielfilho/ifex","last_synced_at":"2026-04-18T19:33:35.124Z","repository":{"id":306772010,"uuid":"1024541156","full_name":"danielfilho/ifex","owner":"danielfilho","description":"A modern CLI tool for managing EXIF data in JPEG, TIFF, DNG, RAW image files and your gear.","archived":false,"fork":false,"pushed_at":"2025-09-13T09:12:06.000Z","size":2190,"stargazers_count":11,"open_issues_count":0,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-02-13T04:45:45.593Z","etag":null,"topics":["analog","cli","dng","film","jpeg","jpg","photography","rust","terminal","tiff"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/danielfilho.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-07-22T21:39:56.000Z","updated_at":"2026-01-16T05:16:58.000Z","dependencies_parsed_at":"2025-08-24T17:23:56.890Z","dependency_job_id":null,"html_url":"https://github.com/danielfilho/ifex","commit_stats":null,"previous_names":["danielfilho/ifex"],"tags_count":7,"template":false,"template_full_name":null,"purl":"pkg:github/danielfilho/ifex","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfilho%2Fifex","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfilho%2Fifex/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfilho%2Fifex/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfilho%2Fifex/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielfilho","download_url":"https://codeload.github.com/danielfilho/ifex/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielfilho%2Fifex/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31982743,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T17:30:12.329Z","status":"ssl_error","status_checked_at":"2026-04-18T17:29:59.069Z","response_time":103,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analog","cli","dng","film","jpeg","jpg","photography","rust","terminal","tiff"],"created_at":"2025-08-03T01:28:48.931Z","updated_at":"2026-04-18T19:33:35.062Z","avatar_url":"https://github.com/danielfilho.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# IFEX - EXIF Data Manager\n\n[![CI](https://github.com/danielfilho/ifex/actions/workflows/ci.yml/badge.svg)](https://github.com/danielfilho/ifex/actions/workflows/ci.yml)\n[![Release](https://github.com/danielfilho/ifex/actions/workflows/release.yml/badge.svg)](https://github.com/danielfilho/ifex/actions/workflows/release.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nA modern CLI tool for managing EXIF data in JPEG, TIFF, DNG, and RAW image files with structured equipment management. Built with Rust for performance and reliability.\n\n\u003e **📢 Version 1.105.0**: Latest stable release with film information support and JSON output. Install via Homebrew or download from [releases](https://github.com/danielfilho/ifex/releases).\n\n## Features\n\n- 📷 **Equipment Management**: Separate CRUD operations for:\n  - Cameras (maker, model)\n  - Lenses (maker, model with aperture)\n  - Films (maker, name, ISO)\n  - Photographers (name, email)\n  - Setups (camera + lens combinations)\n- 📸 **EXIF Application**: Apply metadata to image files using:\n  - Setup selection (pre-configured camera + lens)\n  - Film selection (with ISO override option)\n  - Photographer selection (from saved photographers)\n- 🗑️ **EXIF Removal**: Erase all EXIF data from image files\n- 🎯 **Multi-Format Support**: Works with:\n  - JPEG/JPG files (direct EXIF modification)\n  - TIFF files (direct EXIF modification)\n  - DNG files (direct modification or XMP sidecar fallback)\n  - RAW files (XMP sidecar files): CR2, CR3, NEF, NRW, ARW, SRF, ORF, RW2, RAF, SRW, PEF, X3F, and more\n- 📁 **Recursive Processing**: Process subdirectories with user confirmation (defaults to yes)\n- 🔍 **Fuzzy Search**: Type to filter in all selection menus\n- 📝 **Smart Path Handling**: Supports paths with spaces, quoted paths, and escaped spaces\n- 💾 **Local Storage**: Equipment data stored in `~/.config/ifex.json`\n- 🔄 **Interactive Interface**: Easy-to-use menu system with enhanced UX\n- ✅ **Batch Processing**: Process entire folders at once with detailed reporting\n- 🛡️ **Robust Error Handling**: Graceful fallbacks and clear error messages\n- 🔍 **EXIF Inspection**: View EXIF data from image files in formatted tables or JSON format\n- 🎞️ **Film Information**: Dedicated EXIF field for film stock information (maker, name, ISO)\n- ⚡ **Performance**: Built with Rust for fast, reliable processing\n\n## Installation\n\n### From GitHub Releases (Recommended)\n\nDownload the latest binary for your platform from [GitHub Releases](https://github.com/danielfilho/ifex/releases):\n\n- **Linux x86_64**: `ifex-linux-x86_64`\n- **macOS Intel**: `ifex-macos-x86_64` \n- **macOS Apple Silicon**: `ifex-macos-aarch64`\n- **Windows**: `ifex-windows-x86_64.exe`\n\nMake the binary executable and move it to your PATH:\n\n```bash\n# Linux/macOS\nchmod +x ifex-*\nsudo mv ifex-* /usr/local/bin/ifex\n\n# Or add to your PATH\nexport PATH=\"$PATH:/path/to/ifex\"\n```\n\n### Homebrew (macOS/Linux)\n\n```bash\n# Install directly from the tap\nbrew install danielfilho/ifex/ifex\n\n# Or tap first, then install\nbrew tap danielfilho/ifex\nbrew install ifex\n\n# Upgrade to the latest version\nbrew upgrade danielfilho/ifex/ifex\n```\n\n### From Source\n\nRequires [Rust](https://rustup.rs/) 1.70 or later:\n\n```bash\ngit clone https://github.com/danielfilho/ifex.git\ncd ifex\ncargo install --path .\n```\n\n### Development Setup\n\n```bash\ngit clone https://github.com/danielfilho/ifex.git\ncd ifex\ncargo build --release\n```\n\n## Usage\n\n### Interactive Mode (Default)\n\n```bash\nifex\n```\n\n### Equipment Management Only\n\n```bash\nifex manage\n```\n\n### EXIF Inspection\n\n```bash\n# Single file\nifex read /path/to/image.jpg\n\n# Multiple files\nifex read photo1.jpg photo2.png photo3.tiff\n\n# Directory processing\nifex read /path/to/photos/\n\n# JSON output format\nifex read --json /path/to/image.jpg\nifex read --json /path/to/photos/\n```\n\n### Available Commands\n\n- `ifex` - Run interactive mode with all options\n- `ifex manage` - Equipment management only\n- `ifex run` - Explicit interactive mode (same as default)\n- `ifex read \u003cpaths...\u003e` - Read and display EXIF data from image files or directories\n- `ifex read --json \u003cpaths...\u003e` - Output EXIF data in JSON format\n\n## Equipment Management\n\nThe tool stores equipment data in a JSON file with separate collections for:\n\n### Cameras\n- Maker (e.g., \"Canon\", \"Nikon\")\n- Model (e.g., \"AE-1\", \"FM2\")\n\n### Lenses\n- Maker (e.g., \"Canon\", \"Nikon\")\n- Model (e.g., \"FD\", \"AI\")\n- Focal Length (e.g., \"50\", \"28-135\") - in mm\n- Aperture (e.g., \"1.4\", \"2.8\") - maximum aperture\n- Mount (e.g., \"FD\", \"F\", \"K\")\n\n### Films\n- Maker (e.g., \"Kodak\", \"Fuji\")\n- Name (e.g., \"Portra 400\", \"Velvia 50\")\n- ISO rating\n\n### Photographers\n- Name (e.g., \"John Doe\", \"Jane Smith\")\n- Email (optional, e.g., \"john@photography.com\")\n\n### Setups\n- Name (e.g., \"Street Photography\", \"Studio Portraits\")\n- Camera reference\n- Lens reference (optional - supports camera-only setups)\n\n## Workflow\n\n### EXIF Application\n\n1. **Manage Equipment**: Add cameras, lenses, films, and photographers\n2. **Create Setups**: Combine cameras with optional lenses (supports camera-only setups)\n3. **Apply EXIF**: Select setup + film + photographer for batch processing\n\n### EXIF Inspection\n\nUse the read command to view EXIF data from any supported image file or directory:\n\n```bash\n# Single file with table output\nifex read /path/to/image.jpg\n\n# Multiple files\nifex read photo1.jpg photo2.png\n\n# Process entire directory\nifex read /path/to/photos/\n\n# JSON output for programmatic use\nifex read --json /path/to/image.jpg\n```\n\nThe command supports:\n- **Single files**: Display EXIF data in a formatted table with all fields including camera, lens, and film information\n- **Multiple files**: Process several files in sequence\n- **Directory scanning**: Automatically find and process all supported image files in a directory\n- **JSON output**: Use `--json` flag for structured output suitable for scripts or APIs\n\n## EXIF Fields Mapped\n\n| Equipment Field | EXIF Tag | Notes |\n|-----------------|----------|-------|\n| Camera Maker | Make | Camera manufacturer |\n| Camera Model | Model | Camera model name |\n| Lens Maker | LensMake | Lens manufacturer |\n| Lens Model | LensModel | Lens model with aperture |\n| Focal Length | FocalLength | Lens focal length in mm |\n| Aperture | FNumber | Maximum aperture of the lens |\n| Film Information | Film | Film maker, name, and ISO (new in v1.105.0) |\n| Film ISO | ISOSpeedRatings | Base ISO rating of the film |\n| Shot ISO | ISOSpeed | Actual ISO used (for push/pull processing) |\n| Photographer | Artist | Photographer name |\n\n## Supported File Formats\n\n### Direct EXIF Modification\n\n- **JPEG/JPG**: Full EXIF read/write support\n- **TIFF/TIF**: Full EXIF read/write support\n- **DNG**: Adobe Digital Negative files (with fallback to XMP sidecar)\n\n### XMP Sidecar Files\n\nWhen direct EXIF modification isn't possible, IFEX creates `.xmp` sidecar files containing the metadata:\n\n- **Canon RAW**: CR2, CR3\n- **Nikon RAW**: NEF, NRW\n- **Sony RAW**: ARW, SRF, SR2\n- **Olympus RAW**: ORF\n- **Panasonic RAW**: RW2\n- **Fujifilm RAW**: RAF\n- **Samsung RAW**: SRW\n- **Pentax RAW**: PEF\n- **Sigma RAW**: X3F\n- **And many more**: ERF, MEF, MRW, DCR, KDC, 3FR, FFF, IIQ, K25, RWL\n\n## Path Handling\n\nIFEX intelligently handles various path formats:\n\n- Simple paths: `/Users/user/photos`\n- Paths with spaces: `/Users/user/My Photos`\n- Quoted paths: `\"/Users/user/My Photos\"`\n- Escaped paths: `/Users/user/My\\ Photos`\n\n## Development\n\n### Building\n\n```bash\ncargo build --release\n```\n\n### Testing\n\n```bash\ncargo test\n```\n\n### Linting\n\n```bash\ncargo clippy\ncargo fmt --check\n```\n\n### Running Development Version\n\n```bash\ncargo run\ncargo run -- manage\ncargo run -- read /path/to/image.jpg\ncargo run -- read --json /path/to/photos/\n```\n\n## Architecture\n\nIFEX uses a modular Rust architecture with separated concerns:\n\n- **CLI Module** (`src/cli.rs`) - Command-line argument parsing\n- **Interface Module** (`src/interface.rs`) - Interactive menu system\n- **Data Manager** (`src/data.rs`) - Equipment CRUD operations\n- **Models** (`src/models.rs`) - Data structures with serialization\n- **EXIF Manager** (`src/exif/exif_manager.rs`) - Main orchestrator\n- **File Type Detection** (`src/exif/file_types.rs`) - Format identification\n- **EXIF Tags** (`src/exif/tags.rs`) - Tag definitions and utilities\n- **Format Processors** (`src/exif/processors.rs`) - Specialized handlers\n- **Prompts** (`src/prompts.rs`) - Interactive user input utilities\n- **Utils** (`src/utils.rs`) - Path handling and file utilities\n\n## Contributing\n\n1. Fork the repository\n2. Create a feature branch\n3. Make your changes\n4. Run tests: `cargo test`\n5. Run linting: `cargo clippy \u0026\u0026 cargo fmt`\n6. Submit a pull request\n\n## Requirements\n\n- Rust 1.70.0 or higher (for building from source)\n- Supported image file formats (see above)\n\n## License\n\nMIT License - see [LICENSE](LICENSE) file for details.\n\n## Changelog\n\nSee [CHANGELOG.md](CHANGELOG.md) for version history and changes.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielfilho%2Fifex","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielfilho%2Fifex","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielfilho%2Fifex/lists"}