Skip to content

About

Desktop app for film photographers to fix camera metadata in scanned images

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

ScanCorrect

A clean, minimal desktop application for film photographers to easily fix camera metadata in scanned film images. Built with Electron and React, inspired by ImageOptim's simple drag-and-drop interface.

This repository is organized as a monorepo containing:

  • 🖥️ Desktop App - Electron application for EXIF editing
  • 🌐 Marketing Website - Next.js landing page
  • 📦 Shared - Common types and utilities

ScanCorrect Screenshot

Features

  • Simple Drag & Drop Interface: Drop images anywhere in the window to process them
  • Camera Profile Management: Create and save camera/lens combinations for reuse
  • Batch Processing: Process multiple images simultaneously
  • Real-time Feedback: See processing results for each file instantly
  • Dark Mode Support: Light, dark, and system theme options
  • Persistent Storage: Profiles are saved between app sessions
  • Cross-platform: Works on macOS, Windows, and Linux

Supported File Formats

  • JPEG (.jpg, .jpeg)
  • TIFF (.tiff, .tif)

Prerequisites

✅ No external dependencies required! ExifTool is bundled with the application.

Installation

  1. Clone the repository:

    git clone https://github.com/yourusername/film-exif-editor.git
    cd film-exif-editor
  2. Install dependencies for all packages:

    npm install
  3. Start development servers:

    # Start both desktop app and website concurrently
    npm run dev
    
    # Or start individually:
    npm run dev:desktop    # Electron app on localhost:5173
    npm run dev:website    # Next.js site on localhost:3001

Building for Production

Build All Packages

npm run build

Build Individual Packages

npm run build:desktop    # Build Electron app
npm run build:website    # Build Next.js website

Package Desktop App

npm run dist             # Package for current platform

Built applications will be available in the release/ directory at the repository root. The built website will be in packages/website/.next/ directory.

Deployment

Automated Releases (Recommended)

The project includes automated CI/CD with GitHub Actions:

  1. Create a release:

    ./scripts/create-release.sh
  2. GitHub Actions automatically:

    • Builds for macOS, Windows, and Linux
    • Creates a GitHub Release
    • Uploads installers for all platforms
  3. Download URLs available at:

    https://github.com/YOUR_USERNAME/film-exif-editor/releases/latest
    

See DEPLOYMENT.md for complete deployment guide including:

  • Setting up GitHub Actions
  • Code signing (optional)
  • Linking downloads from website
  • Versioning and release management

Usage

Creating Camera Profiles

  1. Click the "+" button in the footer
  2. Fill in the camera details:
    • Profile Name: A descriptive name (e.g., "Nikon FM")
    • Camera Make: Manufacturer (e.g., "Nikon")
    • Camera Model: Model number (e.g., "FM")
    • Lens: Optional lens information (e.g., "50mm f/1.8")
  3. Click "Save Profile"

Processing Images

  1. Select a camera profile from the dropdown (⋯ button)
  2. Drag and drop image files onto the window, or click to browse
  3. View processing results in real-time
  4. Click "Clear Results" to reset for the next batch

Theme Switching

Click the theme button in the footer to switch between:

  • ☀️ Light mode
  • 🌙 Dark mode
  • 🖥️ System (follows your OS preference)

Development

Tech Stack

  • Frontend: React 18 + TypeScript + Vite
  • Backend: Electron (main process)
  • EXIF Processing: ExifTool (bundled via exiftool-vendored)
  • Styling: Tailwind CSS v4 (website) / custom CSS (desktop)
  • Icons: Iconify React
  • Storage: electron-store
  • Build: electron-builder

Monorepo Structure

film-exif-editor/
├── packages/
│   ├── desktop/         # Electron desktop application
│   │   ├── electron/    # Electron main process
│   │   ├── src/         # React UI components  
│   │   ├── package.json
│   │   └── vite.config.ts
│   ├── website/         # Next.js marketing website
│   │   ├── app/         # Next.js app directory
│   │   ├── public/      # Static assets
│   │   └── package.json
│   └── shared/          # Shared code and types
│       ├── src/
│       │   ├── types.ts  # Common TypeScript interfaces
│       │   ├── utils.ts  # Utility functions
│       │   └── index.ts  # Package exports
│       └── package.json
├── package.json         # Root workspace configuration
└── README.md

Available Scripts

Root workspace commands:

  • npm run dev - Start both desktop app and website concurrently
  • npm run dev:desktop - Start only the desktop app
  • npm run dev:website - Start only the marketing website
  • npm run build - Build all packages
  • npm run build:desktop - Build desktop app
  • npm run build:website - Build website
  • npm run dist - Package desktop app for distribution
  • npm run clean - Clean all build outputs
  • npm run typecheck - Run TypeScript checks on all packages

IPC API

The app uses Electron's IPC for secure communication. window.electronAPI (exposed via contextBridge in packages/desktop/electron/preload.ts) includes: profile CRUD, EXIF read/write with backups, geocoding, thumbnail extraction/caching, processing log, and window controls. See preload.ts for the full ElectronAPI interface.

Note that the interface is wider than the app. Handlers for custom values, saved locations, GPX import and the Mapbox token are registered and never called, because nothing in the UI reaches them — see "Built but not wired up" in CLAUDE.md.

Contributing

  1. Fork the repository
  2. Create a feature branch: git checkout -b feature-name
  3. Make your changes and test thoroughly
  4. Commit with descriptive messages: git commit -m "Add feature description"
  5. Push to your fork: git push origin feature-name
  6. Submit a pull request

Troubleshooting

File Permissions

The app needs read/write access to image files. On macOS, you may need to grant permissions in System Preferences > Security & Privacy.

Large Image Batches

For processing many images, be patient as ExifTool processes each file individually for accuracy.

License

MIT License - see LICENSE file for details.

Acknowledgments


Built for film photographers, by film photographers 📸

About

Desktop app for film photographers to fix camera metadata in scanned images

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages