<!-- Copyright (c) 2026 defconxt. All rights reserved. -->
<!-- Licensed under AGPL-3.0 — see LICENSE file for details. -->
---
name: conducting-chronolocation-investigation
description: >-
  Establish the date and time when an image or video was captured using shadow
  analysis, sun position calculation, astronomical events, weather correlation,
  and metadata cross-referencing. Bellingcat temporal verification technique.
domain: cybersecurity
subdomain: investigation-attribution
tags:
  - chronolocation
  - shadow-analysis
  - suncalc
  - temporal-verification
  - osint
  - bellingcat
version: "1.0"
author: defconxt
license: AGPL-3.0
metadata:
  mitre-attack: []
---

# Conducting Chronolocation Investigation

## Overview

Chronolocation determines *when* an image or video was captured by analyzing
temporal indicators: shadow length and direction, sun position, astronomical
events, weather conditions, and seasonal vegetation. Combined with geolocation,
it provides full spatiotemporal verification of media.

## Prerequisites

| Requirement | Install |
|---|---|
| SunCalc library | `pip install suncalc` |
| ExifTool | `sudo apt install libimage-exiftool-perl` |
| Python 3.10+ | Agent tooling |
| Pillow | `pip install Pillow` |

## Key Concepts

### Shadow Analysis

Shadow direction and length encode sun position, which maps to time of day:

```
Shadow Direction → Sun Azimuth (opposite direction)
Shadow Length + Object Height → Sun Elevation Angle
Sun Azimuth + Elevation + Known Location → Time of Day
```

### SunCalc Integration

```python
from suncalc import get_position
from datetime import datetime, timezone

# Calculate sun position for known location and time
pos = get_position(datetime(2026, 3, 15, 14, 0, tzinfo=timezone.utc), 48.8566, 2.3522)
print(f"Azimuth: {pos['azimuth']:.4f} rad, Altitude: {pos['altitude']:.4f} rad")
```

### Temporal Indicators

| Indicator | Method |
|---|---|
| **Shadow length** | Measure shadow, calculate sun elevation angle |
| **Shadow direction** | Determine sun azimuth (shadow points opposite) |
| **Star positions** | Visible stars in twilight/night images |
| **Weather** | Cross-reference with historical weather data |
| **Vegetation** | Seasonal foliage indicates month range |
| **Lighting conditions** | Golden hour, blue hour, overcast diffusion |

## Quick Reference

```bash
# Calculate sun position
node agent.js sun-position --lat 48.8566 --lon 2.3522 --date 2026-03-15 --time 14:00

# Estimate time from shadow
node agent.js shadow-time --lat 48.8566 --lon 2.3522 --date 2026-03-15 --shadow-length 2.5 --object-height 1.8

# Check weather history
node agent.js weather-check --lat 48.8566 --lon 2.3522 --date 2026-03-15

# Extract temporal metadata
node agent.js extract-timestamps image.jpg
```

## Workflow

```
1. GEOLOCATE  — Establish known location first (required for chronolocation)
2. MEASURE    — Identify shadow-casting objects and measure shadow length/direction
3. CALCULATE  — Compute sun position from shadow geometry
4. CORRELATE  — Match sun position to time using SunCalc for location+date
5. VERIFY     — Cross-reference with weather data and metadata timestamps
6. DOCUMENT   — Record established timeframe with confidence interval
```

## Verification

```bash
python3 -c "from suncalc import get_position; print('SunCalc OK')"
node agent.js --self-test
```

## References

- [SunCalc — Sun Position Calculator](https://www.suncalc.org/)
- [Bellingcat Shadow Analysis Guide](https://www.bellingcat.com/resources/how-tos/2021/12/03/shadow-analysis/)
- [SunCalc Python Library](https://pypi.org/project/suncalc/)
