OSINT Reconnaissance Framework

Ztrace Documentation

Build powerful open-source intelligence workflows with Ztrace. This guide covers investigation pipelines, evidence correlation, and reporting.

Investigation Workflow

1

Evidence Collection

Gather images from various sources (social media, uploads, archives)

2

Batch Analysis

Process all images through Ztrace for geolocation

3

Timeline Construction

Correlate locations with timestamps from EXIF data

4

Pattern Detection

Identify geographic patterns and connections

5

Report Generation

Compile findings into actionable intelligence reports

Complete Investigation Pipeline

osint-investigation.ts
TypeScript
1// OSINT Investigation Workflow with Ztrace
2<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>import</span></span> { <span class="text-yellow-300">Ztrace</span> } <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>from</span></span> <span class="text-emerald-<span class="text-orange-400">400</span>">'@ztrace/sdk'</span>;
3<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>import</span></span> { writeFileSync } <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>from</span></span> <span class="text-emerald-<span class="text-orange-400">400</span>">'fs'</span>;
4 
5<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> client = <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>new</span> <span class="text-blue-400"><span class="text-yellow-300">Ztrace</span></span>({ apiKey: process.<span class="text-cyan-300">env</span>.<span class="text-cyan-300">ZTRACE_API_KEY</span> });
6 
7<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>interface</span> <span class="text-yellow-300">InvestigationReport</span> {
8 case_id: string;
9 images_analyzed: number;
10 locations_identified: <span class="text-yellow-300">Location</span>[];
11 timeline: <span class="text-yellow-300">TimelineEvent</span>[];
12 connections: <span class="text-yellow-300">Connection</span>[];
13 confidence_score: number;
14}
15 
16// Complete OSINT investigation pipeline
17<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>async</span></span> <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>function</span> <span class="text-blue-400">runInvestigation</span>(caseId: string, images: string[]) {
18 console.<span class="text-blue-400">log</span>(<span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-emerald-<span class="text-orange-400">400</span>"</span>>`<span class="text-yellow-300">Starting</span> investigation: ${caseId}`</span>);
19 console.<span class="text-blue-400">log</span>(<span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-emerald-<span class="text-orange-400">400</span>"</span>>`<span class="text-yellow-300">Analyzing</span> ${images.<span class="text-cyan-300">length</span>} images...`</span>);
20
21 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> report: <span class="text-yellow-300">InvestigationReport</span> = {
22 case_id: caseId,
23 images_analyzed: images.<span class="text-cyan-300">length</span>,
24 locations_identified: [],
25 timeline: [],
26 connections: [],
27 confidence_score: <span class="text-orange-400">0</span>
28 };
29
30 // Step 1: Analyze all images
31 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> results = <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>await</span></span> client.<span class="text-cyan-300">batch</span>.<span class="text-blue-400">analyze</span>({
32 images: images.<span class="text-blue-400">map</span>((img, i) => ({ id: <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-emerald-<span class="text-orange-400">400</span>"</span>>`img-${i}`</span>, path: img })),
33 options: {
34 model: <span class="text-emerald-<span class="text-orange-400">400</span>">'geo-v3-precision'</span>,
35 include_features: <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>true</span>,
36 include_landmarks: <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>true</span>,
37 include_weather: <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>true</span>
38 }
39 });
40
41 // Step 2: Extract locations and build timeline
42 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>for</span></span> (<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> result <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>of</span> results) {
43 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>if</span></span> (result.<span class="text-cyan-300">success</span> && result.<span class="text-cyan-300">result</span>) {
44 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> { location, features, landmarks } = result.<span class="text-cyan-300">result</span>;
45
46 report.<span class="text-cyan-300">locations_identified</span>.<span class="text-blue-400">push</span>({
47 ...<span class="text-cyan-300">location</span>,
48 image_id: result.<span class="text-cyan-300">image_id</span>,
49 features,
50 landmarks
51 });
52
53 // Extract timestamp if available from EXIF
54 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>if</span></span> (result.<span class="text-cyan-300">result</span>.<span class="text-cyan-300">metadata</span>?.<span class="text-cyan-300">exif</span>?.<span class="text-cyan-300">datetime</span>) {
55 report.<span class="text-cyan-300">timeline</span>.<span class="text-blue-400">push</span>({
56 timestamp: result.<span class="text-cyan-300">result</span>.<span class="text-cyan-300">metadata</span>.<span class="text-cyan-300">exif</span>.<span class="text-cyan-300">datetime</span>,
57 location,
58 image_id: result.<span class="text-cyan-300">image_id</span>,
59 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>type</span>: <span class="text-emerald-<span class="text-orange-400">400</span>">'location_captured'</span>
60 });
61 }
62 }
63 }
64
65 // Step 3: Find geographic connections
66 report.<span class="text-cyan-300">connections</span> = <span class="text-blue-400">findLocationConnections</span>(report.<span class="text-cyan-300">locations_identified</span>);
67
68 // Step 4: Calculate overall confidence
69 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> confidences = results
70 .<span class="text-blue-400">filter</span>(r => r.<span class="text-cyan-300">success</span>)
71 .<span class="text-blue-400">map</span>(r => r.<span class="text-cyan-300">result</span>!.<span class="text-cyan-300">confidence</span>);
72 report.<span class="text-cyan-300">confidence_score</span> =
73 confidences.<span class="text-blue-400">reduce</span>((a, b) => a + b, <span class="text-orange-400">0</span>) / confidences.<span class="text-cyan-300">length</span>;
74
75 // Step 5: Generate report
76 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> reportPath = <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-emerald-<span class="text-orange-400">400</span>"</span>>`./reports/${caseId}-report.<span class="text-cyan-300">json</span>`</span>;
77 <span class="text-blue-400">writeFileSync</span>(reportPath, <span class="text-yellow-300">JSON</span>.<span class="text-blue-400">stringify</span>(report, <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>null</span>, <span class="text-orange-400">2</span>));
78 console.<span class="text-blue-400">log</span>(<span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-emerald-<span class="text-orange-400">400</span>"</span>>`<span class="text-yellow-300">Report</span> saved to: ${reportPath}`</span>);
79
80 // Step 6: Generate map visualization
81 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>await</span></span> <span class="text-blue-400">generateMapVisualization</span>(report);
82
83 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>return</span></span> report;
84}
85 
86<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>function</span> <span class="text-blue-400">findLocationConnections</span>(locations: <span class="text-yellow-300">Location</span>[]) {
87 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> connections: <span class="text-yellow-300">Connection</span>[] = [];
88
89 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>for</span></span> (<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>let</span> i = <span class="text-orange-400">0</span>; i < locations.<span class="text-cyan-300">length</span>; i++) {
90 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>for</span></span> (<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>let</span> j = i + <span class="text-orange-400">1</span>; j < locations.<span class="text-cyan-300">length</span>; j++) {
91 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> distance = <span class="text-blue-400">calculateDistance</span>(
92 locations[i].<span class="text-cyan-300">lat</span>, locations[i].<span class="text-cyan-300">lng</span>,
93 locations[j].<span class="text-cyan-300">lat</span>, locations[j].<span class="text-cyan-300">lng</span>
94 );
95
96 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>if</span></span> (distance < <span class="text-orange-400">1000</span>) { // <span class="text-yellow-300">Within</span> 1km
97 connections.<span class="text-blue-400">push</span>({
98 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>from</span></span>: locations[i].<span class="text-cyan-300">image_id</span>,
99 to: locations[j].<span class="text-cyan-300">image_id</span>,
100 distance_m: distance,
101 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>type</span>: <span class="text-emerald-<span class="text-orange-400">400</span>">'proximity'</span>
102 });
103 }
104 }
105 }
106
107 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>return</span></span> connections;
108}
109 
110// Haversine formula for distance calculation
111<span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>function</span> <span class="text-blue-400">calculateDistance</span>(
112 lat1: number, lng1: number,
113 lat2: number, lng2: number
114): number {
115 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> <span class="text-yellow-300">R</span> = 6371e3; // <span class="text-yellow-300">Earth</span>'s radius <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>in</span></span> meters
116 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> φ<span class="text-orange-400">1</span> = lat1 * <span class="text-yellow-300">Math</span>.<span class="text-cyan-300"><span class="text-yellow-300">PI</span></span> / <span class="text-orange-400">180</span>;
117 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> φ<span class="text-orange-400">2</span> = lat2 * <span class="text-yellow-300">Math</span>.<span class="text-cyan-300"><span class="text-yellow-300">PI</span></span> / <span class="text-orange-400">180</span>;
118 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> Δφ = (lat2 - lat1) * <span class="text-yellow-300">Math</span>.<span class="text-cyan-300"><span class="text-yellow-300">PI</span></span> / <span class="text-orange-400">180</span>;
119 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> Δλ = (lng2 - lng1) * <span class="text-yellow-300">Math</span>.<span class="text-cyan-300"><span class="text-yellow-300">PI</span></span> / <span class="text-orange-400">180</span>;
120 
121 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> a = <span class="text-yellow-300">Math</span>.<span class="text-blue-400">sin</span>(Δφ/<span class="text-orange-400">2</span>) * <span class="text-yellow-300">Math</span>.<span class="text-blue-400">sin</span>(Δφ/<span class="text-orange-400">2</span>) +
122 <span class="text-yellow-300">Math</span>.<span class="text-blue-400">cos</span>(φ<span class="text-orange-400">1</span>) * <span class="text-yellow-300">Math</span>.<span class="text-blue-400">cos</span>(φ<span class="text-orange-400">2</span>) *
123 <span class="text-yellow-300">Math</span>.<span class="text-blue-400">sin</span>(Δλ/<span class="text-orange-400">2</span>) * <span class="text-yellow-300">Math</span>.<span class="text-blue-400">sin</span>(Δλ/<span class="text-orange-400">2</span>);
124 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>const</span> c = <span class="text-orange-400">2</span> * <span class="text-yellow-300">Math</span>.<span class="text-blue-400">atan2</span>(<span class="text-yellow-300">Math</span>.<span class="text-blue-400">sqrt</span>(a), <span class="text-yellow-300">Math</span>.<span class="text-blue-400">sqrt</span>(<span class="text-orange-400">1</span>-a));
125 
126 <span <span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>class</span>=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>><span class=<span class="text-emerald-<span class="text-orange-400">400</span>">"text-purple-<span class="text-orange-400">400</span> font-medium"</span>>return</span></span> <span class="text-yellow-300">R</span> * c;
127}
128 
129// Run investigation
130<span class="text-blue-400">runInvestigation</span>(<span class="text-emerald-<span class="text-orange-400">400</span>">'<span class="text-yellow-300">CASE</span>-<span class="text-orange-400">2024</span>-<span class="text-orange-400">001</span>'</span>, [
131 <span class="text-emerald-<span class="text-orange-400">400</span>">'./evidence/photo1.<span class="text-cyan-300">jpg</span>'</span>,
132 <span class="text-emerald-<span class="text-orange-400">400</span>">'./evidence/photo2.<span class="text-cyan-300">jpg</span>'</span>,
133 <span class="text-emerald-<span class="text-orange-400">400</span>">'./evidence/photo3.<span class="text-cyan-300">jpg</span>'</span>
134]);

Legal Considerations

Always ensure your OSINT activities comply with applicable laws and regulations. Obtain proper authorization before conducting investigations.

Last updated December 2025

Was this helpful?