Eagle is distributed on PyPI as eagle-x and exposes the terminal command eagle. Install the package directly using pip, then analyze any image on your local filesystem with eagle hunt photo.jpg. For automation and OSINT pipelines, stream pure structured JSON output using eagle hunt photo.jpg --json, or perform reverse geocoding via eagle hunt photo.jpg --geocode.
# Install from PyPI
pip install eagle-x
# Launch the purple flight manual
eagle
# Hunt down metadata & GPS telemetry
eagle hunt photo.jpg
eagle hunt "C:\Users\YourName\Pictures\photo.jpg"
# Reverse-geocode coordinates to street address
eagle hunt photo.jpg --geocode
# Output clean JSON to stdout
eagle hunt photo.jpg --json
# Upgrade to latest version
pip install --upgrade eagle-x# Install from PyPI
pip3 install eagle-x
# Launch the purple flight manual
eagle
# Hunt down metadata & GPS telemetry
eagle hunt photo.jpg
eagle hunt ~/Pictures/photo.jpg
# Reverse-geocode coordinates to street address
eagle hunt photo.jpg --geocode
# Output clean JSON to stdout
eagle hunt photo.jpg --json
# Upgrade to latest version
pip3 install --upgrade eagle-x
Eagle analysis is 100% local by default. No image data or metadata is ever uploaded or transmitted over the network unless --geocode is explicitly passed to query OpenStreetMap Nominatim. Input images exceeding 100 Megapixels are rejected to protect against decompression bomb attacks, and binary tags are sanitized to prevent crashes.
Eagle supports deep header inspection across JPEG, PNG, HEIC/HEIF, TIFF, WebP, and BMP images. Extracted telemetry includes file dimensions, color mode, megapixels, camera hardware, exposure settings, GPS coordinates (Decimal & DMS), altitude, GPS timestamp, and standard raw EXIF IFD structures.
You can integrate Eagle directly into your Python scripts:
from eagle import analyze_image_file
result = analyze_image_file("photo.jpg", geocode=False)
print(f"Camera: {result.camera_info.make} {result.camera_info.model}")
if result.has_gps:
print(f"Coordinates: {result.latitude}, {result.longitude}")
Pop open a terminal, hop into the backend directory with cd backend, and create an isolated virtual environment:
cd backend
python -m venv .venv
.venv\Scripts\Activate.ps1
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000
Your backend is now listening at http://localhost:8000, and you can inspect the interactive Swagger docs at http://localhost:8000/docs.
In a second terminal window, head over to the frontend with cd frontend and install the necessary dependencies using npm install. Once that's done, fire up the Vite dev server with npm run dev, open http://localhost:5173 in your browser, drag and drop an image in, and you're good to go.
cd frontend
npm install
npm run devThis project is open-source and available under the MIT License.

