ExifTool (13.30) powered by WebAssembly to extract and write metadata from files in browsers and Node.js environments using zeroperl.
npm install @uswriting/exiftool
This package provides a WebAssembly-based implementation of ExifTool that works in both browser and Node.js environments. It leverages zeroperl to execute ExifTool without requiring any native binaries or system dependencies.
import { parseMetadata } from '@uswriting/exiftool';
// Browser usage with File API
document.querySelector('input[type="file"]').addEventListener('change', async (event) => {
  const file = event.target.files[0];
  const result = await parseMetadata(file);
  
  if (result.success) {
    console.log(result.data);
  } else {
    console.error('Error:', result.error);
  }
});import { writeMetadata } from '@uswriting/exiftool';
const result = await writeMetadata(file, {
  'Author': 'John Doe',
  'Title': 'My Photo',
  'Keywords': 'nature,photography'
});
if (result.success) {
  // result.data contains the modified file as Uint8Array
  const modifiedBlob = new Blob([result.data]);
}import { parseMetadata } from '@uswriting/exiftool';
const result = await parseMetadata(file, {
  args: ['-Author', '-CreateDate', '-Make', '-Model']
});
if (result.success) {
  console.log(result.data);
}import { parseMetadata } from '@uswriting/exiftool';
const result = await parseMetadata(file, {
  args: ['-json', '-n'],
  transform: (data) => JSON.parse(data)
});
if (result.success) {
  // Typed access to properties
  console.log(result.data); // { ... }
}- In browser environments, pass the Fileobject directly from file inputs. Do not convert it to an ArrayBuffer or Uint8Array.
- This package uses asynchronous web APIs for file processing which allows handling files over 2GB without loading them entirely into memory.
- ExifTool is executed entirely within the browser or Node.js environment - no server requests are made for metadata extraction.
async function parseMetadata<TReturn = string>(
  file: Binaryfile | File,
  options: ExifToolOptions<TReturn> = {}
): Promise<ExifToolOutput<TReturn>>- file: Either a browser- Fileobject or a- Binaryfileobject with- nameand- dataproperties.
- options: Configuration options for the metadata extraction.
async function writeMetadata(
  file: Binaryfile | File,
  tags: ExifTags,
  options: ExifToolOptions = {}
): Promise<ExifToolOutput<ArrayBuffer>>- file: Either a browser- Fileobject or a- Binaryfileobject with- nameand- dataproperties.
- tags: Object containing metadata tags to write, where keys are tag names and values are tag values.
- options: Configuration options for the write operation.
Returns a Promise that resolves to an ExifToolOutput object:
type ExifToolOutput<TOutput> =
  | {
      success: true;
      data: TOutput;
      error: string;
      exitCode: 0;
    }
  | {
      success: false;
      data: undefined;
      error: string;
      exitCode: number | undefined;
    };Apache License, Version 2.0