{"id":29413085,"url":"https://github.com/codeofandrin/exifoo","last_synced_at":"2026-04-16T12:38:11.289Z","repository":{"id":303292252,"uuid":"882636644","full_name":"codeofandrin/exifoo","owner":"codeofandrin","description":"Organize your photos by adding the date and time to the filenames","archived":false,"fork":false,"pushed_at":"2025-07-06T21:15:32.000Z","size":2923,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-07-06T21:19:45.681Z","etag":null,"topics":["electron","exif","exif-metadata","python3","react"],"latest_commit_sha":null,"homepage":"https://exifoo.vercel.app","language":"TypeScript","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/codeofandrin.png","metadata":{"files":{"readme":"README.md","changelog":null,"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":"2024-11-03T11:03:35.000Z","updated_at":"2025-07-06T21:15:35.000Z","dependencies_parsed_at":"2025-07-06T21:19:51.091Z","dependency_job_id":"6b3267f3-20f7-4369-9e9d-d8239eab2f05","html_url":"https://github.com/codeofandrin/exifoo","commit_stats":null,"previous_names":["codeofandrin/exifoo"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/codeofandrin/exifoo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeofandrin%2Fexifoo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeofandrin%2Fexifoo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeofandrin%2Fexifoo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeofandrin%2Fexifoo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/codeofandrin","download_url":"https://codeload.github.com/codeofandrin/exifoo/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/codeofandrin%2Fexifoo/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":264781228,"owners_count":23662818,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["electron","exif","exif-metadata","python3","react"],"created_at":"2025-07-11T10:08:02.259Z","updated_at":"2026-04-11T11:42:27.715Z","avatar_url":"https://github.com/codeofandrin.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://exifoo.vercel.app\" target=\"_blank\"\u003e\u003cimg src=\"electron/src/renderer/src/assets/images/exifoo_logo_large.png\" width=\"300px\"\u003e\u003c/a\u003e\n    \u003ch3 align=\"center\"\u003eShoot more. Organize less.\u003c/h3\u003e\n\u003c/p\u003e\n\n---\n\nexifoo helps you keep your photos and videos organized by adding the date and time of capture to the filename.\n\n\u003cp\u003eVisit: \u003ca href=\"https://exifoo.vercel.app\" target=\"_blank\"\u003eexifoo.vercel.app\u003c/a\u003e\u003c/p\u003e\n\n\u003cbr\u003e\n\n## Features\n\n- **Select unlimited files:** Rename multiple files at once with no limits. Easily organize your entire photo and video collection in just a few clicks.\n- **Flexible file naming:** Customize filenames to your needs. Choose the year and time format and add custom text to recognize files even better.\n- **Live Preview:** See your customization in action with a real-time example. Instantly preview how your filenames will look before renaming your photos and videos.\n- **Status Report:** Get a detailed status report after every renaming process, showing the number of successful and failed renames.\n- **Privacy first:** All files are processed offline, directly on your device. Your images never leave your computer.\n- **No registration:** Start using exifoo right away. No sign up for an account, newsletter or anything else.\n- **Simple and modern:** Clean, modern and easy-to-use interface. No technical knowledge required.\n\n\u003cbr\u003e\n\n## Tech Stack\n\n**Frontend**\n- Electron\n- React + TypeScript\n- Flowbite\n- TailwindCSS + Framer Motion\n- zustand\n- Vite\n\n**Backend**\n- Python\n- FastAPI with Uvicorn\n\n\u003cbr\u003e\n\n## Getting Started\n\n### Prerequisites\n\n- [Node.js](https://nodejs.org/) (for Electron frontend)\n- [Python 3.9+](https://www.python.org/) + [pip](https://pip.pypa.io/en/stable/) (for backend)\n\n### Installation\n\n1. **Clone the repository:**\n    ```bash\n    git clone https://github.com/codeofandrin/exifoo.git\n    cd exifoo\n    ```\n2. **Create and activate venv**\n    ```bash\n    # for arm64 (Apple Silicon)\n    python3.9 -m venv venv\n    source venv/bin/activate\n\n    # for x64 (Intel)\n    python3.9 -m venv venv_x64\n    eval \\\"$(/usr/local/bin/brew shellenv)\\\" \u0026\u0026 source venv_x64/bin/activate\n    ```\n3. **Install Python dependencies:**\n    ```bash\n    pip install -r requirements.txt\n    ```\n4. **Install Node.js dependencies:**\n    ```bash\n    # for concurrently\n    npm install\n\n    cd ../electron\n    npm install\n    ```\n\n### Environment Configuration\n\nThis project uses environment variables for configuration. Example files are provided:\n\n- [`backend/env.example.py`](backend/env.example.py): Example Python environment variables for the backend. Copy this file to `env.py` and adjust values as needed.\n- [`electron/.env.example`](electron/.env.example): Example environment variables for the Electron/frontend. Copy this file to `.env` and adjust values as needed.\n\nFor the production build workflow, add following variables to the repository secrets:\n- `GH_TOKEN`\n- `MAC_API_KEY`\n- `MAC_API_KEY_ID`\n- `MAC_API_KEY_ISSUER_ID`\n- `MAC_CERTS`\n- `MAC_CERTS_PASSWORD`\n- `SENTRY_AUTH_TOKEN`\n- `STORAGE_KEY`\n- `SUPABASE_KEY` (not used anymore, therefore can be empty)\n- `SUPABASE_URL` (not used anymore, therefore can be empty)\n\nMake sure to configure these files before running the app in development or production.\n\n\u003cbr\u003e\n\n## Usage\n\n### Development\n\n```bash\n# starts backend and electron app\nnpm run dev\n```\n\n### Build\n\n#### Local Build\n```bash\n# builds the app for both architectures\nnpm run local-build:mac\n```\n\n#### Production Build\nThe github workflow ([`build.yml`](.github/workflows/build.yml)) will build the app for both architectures if a tag is \ncommited starting with `v` (e.g. `v1.0.0`)\n\nThe build artifacts are published to [codeofandrin/exifoo-releases](https://github.com/codeofandrin/exifoo-releases) which is defined in\n[`electron.vite.config.ts`](electron/electron.vite.config.ts):\n```typescript\nexport default defineConfig({\n    main: {\n        // ...\n        define: {\n            __RELEASE_REPO__: s(\"https://github.com/codeofandrin/exifoo-releases\")\n        }\n    },\n    // ...\n    renderer: {\n        // ...\n        define: {\n            // ...\n            __RELEASE_REPO__: s(\"https://github.com/codeofandrin/exifoo-releases\")\n        }\n    }\n})\n```\n\n\u003cbr\u003e\n\n## Project Structure\n\n```\nbackend/      # Python backend (EXIF processing and file renaming, License Management)\nelectron/     # Electron frontend (Vite, React, TailwindCSS)\n```\n\n### License Management\n\nexifoo uses a license management system to enable free trials and full access. \nWhen starting the app, the license flow checks for a free trial or a valid license key.\n\n###### Check it out on miro: https://miro.com/app/board/uXjVL9ViQRc=/\n\u003ca href=\"https://miro.com/app/board/uXjVL9ViQRc=/\" target=\"_blank\" \u003e\u003cimg src=\"License_Management_FlowDiagram.jpg\" width=\"500px\"\u003e\u003c/a\u003e\n\n- 🟩 - Start\n- 🟦 - Getting Started\n- 🟧 - Main\n\n\u003cbr\u003e\n\n## Copyright\n\nCopyright (c) codeofandrin \n\nThis source code is licensed under the MIT license found in the\n[LICENSE](LICENSE) file in the root directory of this source tree.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeofandrin%2Fexifoo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcodeofandrin%2Fexifoo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcodeofandrin%2Fexifoo/lists"}