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 Ztrace2<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 pipeline17<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 images31 <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 timeline42 <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 landmarks51 });52 53 // Extract timestamp if available from EXIF54 <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 connections66 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 confidence69 <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 = results70 .<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 report76 <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 visualization81 <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> 1km97 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 calculation111<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: number114): 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> meters116 <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 investigation130<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?