PageSourceSearch

https://dawarich.app/assets/js/26960463.dea30b22.js

js dawarich.app collected 2026-10-03 22:15:34 UTC 55,948 bytes, 1 lines download raw bytes

1"use strict";(globalThis.webpackChunkdawarich_app=globalThis.webpackChunkdawarich_app||[]).push([[5755],{89582(e,t,o){o.d(t,{A:()=>s});var a=o(96540),i=o(75330),n=o(74848);function s({onFilesLoaded:e,onClear:t}){const[o,s]=(0,a.useState)(!1),[r,l]=(0,a.useState)(0),[c,m]=(0,a.useState)(!1),[d,p]=(0,a.useState)(""),h=(0,a.useCallback)(async t=>{const o=Array.from(t).filter(e=>e.name.endsWith(".json"));if(0!==o.length){m(!0);try{const t=[];for(let e=0;e<o.length;e++){const a=o[e];p(`Reading file ${e+1}/${o.length}: ${a.name}`),console.log(`[FileUploader] Reading ${a.name} (${(a.size/1024/1024).toFixed(2)} MB)`);const i=await a.text();p(`Parsing file ${e+1}/${o.length}: ${a.name}`);const n=JSON.parse(i);t.push({filename:a.name,data:n,size:a.size,blob:a})}t.length>0&&(p("Processing timeline data..."),l(t.length),console.log(`[FileUploader] \u2713 Loaded ${t.length} files, passing to handler`),e(t),await new Promise(e=>setTimeout(e,500))),p(""),m(!1)}catch(a){console.error("[FileUploader] Error loading files:",a),alert(`Error loading files: ${a.message}`),m(!1),p("")}}else alert("No JSON files found. Please upload Google Timeline JSON files.")},[e]),g=(0,a.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),s(!0)},[]),u=(0,a.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),s(!1)},[]),f=(0,a.useCallback)(e=>{e.preventDefault(),e.stopPropagation()},[]),y=(0,a.useCallback)(e=>{e.preventDefault(),e.stopPropagation(),s(!1);const t=e.dataTransfer.files;t&&t.length>0&&h(t)},[h]),x=(0,a.useCallback)(e=>{const t=e.target.files;t&&t.length>0&&h(t)},[h]),v=(0,a.useCallback)(()=>{l(0),t()},[t]);return(0,n.jsxs)("div",{className:i.A.container,children:[(0,n.jsxs)("div",{className:`${i.A.dropzone} ${o?i.A.dragging:""} ${r>0?i.A.hasFiles:""}`,onDragEnter:g,onDragLeave:u,onDragOver:f,onDrop:y,children:[(0,n.jsx)("input",{"aria-label":"Choose files to process",type:"file",id:"fileInput",multiple:!0,accept:".json",onChange:x,className:i.A.fileInput}),(0,n.jsx)("label",{htmlFor:"fileInput",className:i.A.label,children:c?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:i.A.spinner}),(0,n.jsx)("p",{children:(0,n.jsx)("strong",{children:d})}),(0,n.jsx)("p",{className:i.A.hint,children:"Please wait..."})]}):r>0?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("svg",{className:i.A.icon,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M5 13l4 4L19 7"})}),(0,n.jsxs)("p",{children:[(0,n.jsx)("strong",{children:r})," file",1!==r?"s":""," loaded"]}),(0,n.jsx)("p",{className:i.A.hint,children:"Click or drag to add more files"})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("svg",{className:i.A.icon,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,n.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M7 16a4 4 0 01-.88-7.903A5 5 0 1115.9 6L16 6a5 5 0 011 9.9M15 13l-3-3m0 0l-3 3m3-3v12"})}),(0,n.jsx)("p",{children:"Drop Google Timeline JSON files here"}),(0,n.jsx)("p",{className:i.A.hint,children:"or click to browse"}),(0,n.jsx)("p",{className:i.A.formats,children:"Supports: Records, Semantic, Semantic Segments, Settings, TimelineEdits, Location History"})]})})]}),r>0&&(0,n.jsx)("button",{onClick:v,className:i.A.clearButton,children:"Clear All Files"})]})}},3616(e,t,o){o.d(t,{A:()=>g});o(96540);const a="wrapper_EAMR",i="container_kpj0",n="pills_ica5",s="pill_ZeQE",r="pillValue_ubLw",l="pillLabel_de_w",c="headline_In1q",m="body_XuAA",d="button_Olhu";var p=o(74848);function h(e){return`https://my.dawarich.app/users/sign_up?utm_source=tool&utm_medium=personalized-cta&utm_campaign=${e}`}function g({toolName:e,headline:t,stats:o}){return(0,p.jsx)("div",{className:a,children:(0,p.jsxs)("div",{className:i,children:[o&&o.length>0&&(0,p.jsx)("div",{className:n,children:o.map((e,t)=>(0,p.jsxs)("span",{className:s,children:[(0,p.jsx)("span",{className:r,children:e.value}),(0,p.jsx)("span",{className:l,children:e.label})]},t))}),(0,p.jsx)("h3",{className:c,dangerouslySetInnerHTML:{__html:t}}),(0,p.jsx)("p",{className:m,children:"Self-hosted or cloud. Cancel anytime."}),(0,p.jsx)("a",{href:h(e),className:d,target:"_blank",rel:"noopener noreferrer",children:"Start Your Free Trial"})]})})}},46672(e,t,o){o.d(t,{A:()=>p});o(96540);const a={"gpx-to-kml":[{href:"/tools/kml-to-gpx/",label:"KML to GPX",note:"Reverse direction"},{href:"/tools/gpx-to-geojson/",label:"GPX to GeoJSON",note:"Same source, web-mapping target"},{href:"/tools/gpx-merger/",label:"GPX Merger",note:"Combine multiple GPX files first"}],"kml-to-gpx":[{href:"/tools/gpx-to-kml/",label:"GPX to KML",note:"Reverse direction"},{href:"/tools/kml-to-geojson/",label:"KML to GeoJSON",note:"Same source, web-mapping target"},{href:"/tools/kmz-to-gpx/",label:"KMZ to GPX",note:"Compressed KML version"}],"gpx-to-geojson":[{href:"/tools/geojson-to-gpx/",label:"GeoJSON to GPX",note:"Reverse direction"},{href:"/tools/gpx-to-kml/",label:"GPX to KML",note:"Same source, Google Earth target"},{href:"/interactive-map/",label:"Interactive Map",note:"Visualize GeoJSON in Dawarich"}],"geojson-to-gpx":[{href:"/tools/gpx-to-geojson/",label:"GPX to GeoJSON",note:"Reverse direction"},{href:"/tools/geojson-to-kml/",label:"GeoJSON to KML",note:"Same source, Google Earth target"},{href:"/tools/geojson-to-kmz/",label:"GeoJSON to KMZ",note:"Compressed Google Earth format"}],"geojson-to-kml":[{href:"/tools/kml-to-geojson/",label:"KML to GeoJSON",note:"Reverse direction"},{href:"/tools/geojson-to-gpx/",label:"GeoJSON to GPX",note:"Same source, GPS-device target"},{href:"/tools/geojson-to-kmz/",label:"GeoJSON to KMZ",note:"Compressed Google Earth format"}],"kml-to-geojson":[{href:"/tools/geojson-to-kml/",label:"GeoJSON to KML",note:"Reverse direction"},{href:"/tools/kml-to-gpx/",label:"KML to GPX",note:"Same source, GPS-device target"},{href:"/tools/kmz-to-geojson/",label:"KMZ to GeoJSON",note:"Compressed KML version"}
1],"gpx-to-kmz":[{href:"/tools/kmz-to-gpx/",label:"KMZ to GPX",note:"Reverse direction"},{href:"/tools/gpx-to-kml/",label:"GPX to KML",note:"Uncompressed equivalent"},{href:"/tools/gpx-merger/",label:"GPX Merger",note:"Combine GPX files first"}],"kmz-to-gpx":[{href:"/tools/gpx-to-kmz/",label:"GPX to KMZ",note:"Reverse direction"},{href:"/tools/kml-to-gpx/",label:"KML to GPX",note:"Uncompressed equivalent"},{href:"/tools/kmz-to-kml/",label:"KMZ to KML",note:"Decompress for editing"}],"kml-to-kmz":[{href:"/tools/kmz-to-kml/",label:"KMZ to KML",note:"Reverse direction (decompress)"},{href:"/tools/kml-to-gpx/",label:"KML to GPX",note:"Same source, GPS-device target"},{href:"/tools/kml-to-geojson/",label:"KML to GeoJSON",note:"Same source, web-mapping target"}],"kmz-to-kml":[{href:"/tools/kml-to-kmz/",label:"KML to KMZ",note:"Reverse direction (compress)"},{href:"/tools/kmz-to-gpx/",label:"KMZ to GPX",note:"Same source, GPS-device target"},{href:"/tools/kmz-to-geojson/",label:"KMZ to GeoJSON",note:"Same source, web-mapping target"}],"kmz-to-geojson":[{href:"/tools/geojson-to-kmz/",label:"GeoJSON to KMZ",note:"Reverse direction"},{href:"/tools/kml-to-geojson/",label:"KML to GeoJSON",note:"Uncompressed equivalent"},{href:"/tools/kmz-to-kml/",label:"KMZ to KML",note:"Decompress for editing"}],"geojson-to-kmz":[{href:"/tools/kmz-to-geojson/",label:"KMZ to GeoJSON",note:"Reverse direction"},{href:"/tools/geojson-to-kml/",label:"GeoJSON to KML",note:"Uncompressed equivalent"},{href:"/tools/geojson-to-gpx/",label:"GeoJSON to GPX",note:"Same source, GPS-device target"}],"fit-to-gpx":[{href:"/tools/fit-to-kml/",label:"FIT to KML",note:"Same source, Google Earth target"},{href:"/tools/fit-to-geojson/",label:"FIT to GeoJSON",note:"Same source, web-mapping target"},{href:"/docs/comparisons/vs-strava/",label:"Dawarich vs Strava",note:"Where to keep your activities"}],"fit-to-kml":[{href:"/tools/fit-to-gpx/",label:"FIT to GPX",note:"Most-compatible GPS format"},{href:"/tools/fit-to-geojson/",label:"FIT to GeoJSON",note:"Web-mapping target"},{href:"/tools/heatmap-generator/",label:"Heatmap Generator",note:"Visualize FIT activities"}],"fit-to-geojson":[{href:"/tools/fit-to-gpx/",label:"FIT to GPX",note:"Most-compatible GPS format"},{href:"/tools/fit-to-kml/",label:"FIT to KML",note:"Google Earth target"},{href:"/tools/heatmap-generator/",label:"Heatmap Generator",note:"Visualize FIT activities"}],"tcx-to-gpx":[{href:"/tools/tcx-to-kml/",label:"TCX to KML",note:"Same source, Google Earth target"},{href:"/tools/tcx-to-geojson/",label:"TCX to GeoJSON",note:"Web-mapping target"},{href:"/tools/fit-to-gpx/",label:"FIT to GPX",note:"Newer Garmin format"}],"tcx-to-kml":[{href:"/tools/tcx-to-gpx/",label:"TCX to GPX",note:"Most-compatible GPS format"},{href:"/tools/tcx-to-geojson/",label:"TCX to GeoJSON",note:"Web-mapping target"},{href:"/tools/heatmap-generator/",label:"Heatmap Generator",note:"Visualize TCX activities"}],"tcx-to-geojson":[{href:"/tools/tcx-to-gpx/",label:"TCX to GPX",note:"Most-compatible GPS format"},{href:"/tools/tcx-to-kml/",label:"TCX to KML",note:"Google Earth target"},{href:"/tools/fit-to-geojson/",label:"FIT to GeoJSON",note:"Newer Garmin format"}],"google-timeline-converter":[{href:"/tools/route-video-maker/",label:"Route Video Maker",note:"Turn your Timeline into a travel video"},{href:"/tools/google-timeline-splitter/",label:"Timeline Splitter",note:"Split a giant Takeout export"},{href:"/tools/timeline-merger/",label:"Timeline Merger",note:"Combine multiple exports"},{href:"/blog/migrating-from-google-location-history-to-dawarich/",label:"Migration guide",note:"Step-by-step move to Dawarich"}],"google-timeline-splitter":[{href:"/tools/google-timeline-converter/",label:"Timeline Converter",note:"Convert split files to GPX/KML/CSV"},{href:"/tools/timeline-format-detector/",label:"Format Detector",note:"Identify what kind of export you have"},{href:"/blog/whats-inside-your-google-timeline-export/",label:"What's in a Timeline export",note:"Understand the formats"}],"timeline-merger":[{href:"/tools/google-timeline-converter/",label:"Timeline Converter",note:"Convert merged file to GPX/KML/CSV"},{href:"/tools/timeline-statistics/",label:"Timeline Statistics",note:"Analyze your merged history"},{href:"/tools/google-timeline-splitter/",label:"Timeline Splitter",note:"Reverse direction"}],"timeline-format-detector":[{href:"/tools/google-timeline-converter/",label:"Timeline Converter",note:"Convert once you know the format"},{href:"/tools/google-timeline-splitter/",label:"Timeline Splitter",note:"Split large exports"},{href:"/blog/whats-inside-your-google-timeline-export/",label:"What's in a Timeline export",note:"Format reference"}],"timeline-visualizer":[{href:"/tools/route-video-maker/",label:"Route Video Maker",note:"Turn the same file into a video"},{href:"/interactive-map/",label:"Interactive Map",note:"Full visualization in Dawarich"},{href:"/tools/map-poster-maker/",label:"Map Poster Maker",note:"Turn the same file into wall art"},{href:"/tools/timeline-statistics/",label:"Timeline Statistics",note:"Numbers behind the map"}],"timeline-statistics":[{href:"/tools/timeline-mileage-calculator/",label:"Mileage Calculator",note:"Distance-only quick stat"},{href:"/tools/timeline-visualizer/",label:"Timeline Visualizer",note:"See the same data on a map"},{href:"/statistics/",label:"Dawarich Statistics",note:"Persistent dashboards"}],"timeline-mileage-calculator":[{href:"/tools/timeline-statistics/",label:"Timeline Statistics",note:"Full stats breakdown"},{href:"/tools/timeline-visualizer/",label:"Timeline Visualizer",note:"Map view of the same data"},{href:"/statistics/",label:"Dawarich Statistics",note:"Track mileage over time"}],"gpx-merger":[{href:"/tools/gps-file-splitter/",label:"GPS File Splitter",note:"Reverse direction"},{href:"/tools/map-poster-maker/",label:"Map Poster Maker",note:"Print the merged track"},{href:"/import-export/",label:"Import & Export",note:"Bring merged data into Dawarich"}],"gps-file-splitter":[{href:"/tools/gpx-merger/",label:"GPX Merger",note:"Reverse direction"},{href:"/tools/google-timeline-splitter/",label:"Timeline Splitter",note:"Split Google Takeout exports"},{href:"/tools/timeline-format-detector/",label:"Format Detector",note:"Identify a file before splitting"}],"heatmap-generator":[{href:"/interactive-map/",label:"Interactive Map",note:"Heatmap layer + tracks + visits"},{href:"/tools/timeline-visualizer/",label:"Timeline Visualizer",note:"Per-track view"},{href:"/tools/map-poster-maker/",label:"Map Poster Maker",note:"Same file, printable poster"}],"map-poster-maker":[{href:"/poster-studio/",label:"Poster Studio in Dawarich",note:"Print any month of your history"},{href:"/tools/route-video-maker/",label:"Route Video Maker",note:"Same file, animated video"},{href:"/tools/heatmap-generator/",label:"Heatmap Generator",note:"Density view of the same file"},{href:"/tools/gpx-merger/",label:"GPX Merger",note:"Combine tracks into one poster"}],"route-video-maker":[{href:"/tools/map-poster-maker/",label:"Map Poster Maker",note:"Same file, printable poster"},{href:"/tools/heatmap-generator/",label:"Heatmap Generator",note:"Density view of the same file"},{href:"/tools/gpx-merger/",label:"GPX Merger",note:"Combine tracks into one video"}],"photo-geotagging":[{href:"/integrations/",label:"Photo Integrations",note:"Immich & PhotoPrism geodata import"},{href:"/docs/features/photos/",label:"Photos in Dawarich",note:"How photos work in the app"},{href:"/docs/tools/phototagger/",label:"PhotoTagger CLI",note:"Bulk geotagging on the command line"}]},i="container_ddlj",n="heading_g38U",s="list_s9U9",r="item_gOl4",l="link_lmvz",c="label_ECgr",m="note_ldWT";var d=o(74848);function p({slug:e}){const t=a[e];return t&&0!==t.length?(0,d.jsxs)("nav",{"aria-label":"Related tools and pages",className:i,children:[(0,d.jsx)("h2",{className:n,children:"Related tools & pages"}),(0,d.jsx)("ul",{className:s,children:t.map(e=>(0,d.jsx)("li",{className:r,children:(0,d.jsxs)("a",{href:e.href,className:l,children:[(0,d.jsx)("span",{className:c,children:e.label}),e.note&&(0,d.jsx)("span",{className:m,children:e.note})]})},e.href))})]}):null}},95870(e,t,o){o.r(t),o.d(t,{default:()=>S});var a=o(96540),i=o(54644),n=o(5260),s=o(89582),r=o(51109),l=o(3616),c=o(46672);const m={container:"container_W3e6",contentWrapper:"contentWrapper_snsH",header:"header_Msal",topSection:"topSection_WLv6",instructions:"instructions_v1t3",instructionsList:"instructionsList_ytNe",instructionItem:"instructionItem_wFd1",uploaderWrapper:"uploaderWrapper_etv7",privacyNote:"privacyNote_TZb9",privacyIcon:"privacyIcon_J1qX",preCtaPanel:"preCtaPanel__O4s",preCtaContent:"preCtaContent_XabK",preCtaIcon:"preCtaIcon_Xbcl",ctaContent:"ctaContent__neR",ctaButton:"ctaButton_YFBK",resultsSection:"resultsSection__dfp",resultsSummary:"resultsSummary_ScOb",resultsSummaryDot:"resultsSummaryDot_IxaN",resultCard:"resultCard_MXyu",resultCardError:"resultCardError_MgFT",resultHeader:"resultHeader_uuKB",resultFilename:"resultFilename_DFct",formatBadge:"formatBadge_p2tX",format_records:"format_records_GmSp",format_semantic:"format_semantic_Wc8k",format_settings:"format_settings_O9gi",format_timelineEdits:"format_timelineEdits_HFte",format_semanticSegments:"format_semanticSegments_hW_P",format_locationHistory:"format_locationHistory_IrUe",format_unknown:"format_unknown_tOTV",formatDescription:"formatDescription_fXy9",statGrid:"statGrid_Eqhk",statItem:"statItem_H261",statLabel:"statLabel_RduU",statValue:"statValue_lzMj",qualitySection:"qualitySection_YpdJ",qualityGrid:"qualityGrid_BLq1",qualityItem:"qual
1ityItem_DZIz",qualityBar:"qualityBar_npNm",qualityFill:"qualityFill_XqkX",qualityLabel:"qualityLabel_tkkZ",recommendedTools:"recommendedTools_PTEq",toolLinks:"toolLinks_ZX9E",toolLink:"toolLink_G0wk",toolIcon:"toolIcon_R0yi",infoSection:"infoSection_LVQo",infoGrid:"infoGrid_pqQP",infoCard:"infoCard_wKJB",faqSection:"faqSection_E8ga",faqList:"faqList_jVh5",faqItem:"faqItem_TK9M",faqQuestion:"faqQuestion_LpBV",faqAnswer:"faqAnswer_yvxK",bottomCtaPanel:"bottomCtaPanel_wLGI"};var d=o(74848);const p="Google Timeline Format Detector - Identify Your Location Export File Type",h="Free tool to detect your Google Timeline export format. Upload any Google Takeout location file to instantly see the format name, point count, date range, file size, and data quality. All processing in your browser.",g="https://dawarich.app/tools/timeline-format-detector/",u="https://dawarich.app/img/meta-image.png",f={records:"Records.json (Raw GPS Data)",semantic:"Semantic Location History",settings:"Settings.json (Device Info)",timelineEdits:"Timeline Edits",semanticSegments:"Semantic Segments",locationHistory:"Location History (New Format)",unknown:"Unknown Format"},y={records:"This is the classic Google Takeout export containing raw GPS coordinates in E7 format. It includes every location ping recorded by Google, along with accuracy, altitude, velocity, and device metadata. These files can be very large (100+ MB for years of data).",semantic:"This format contains structured monthly location data with place visits (including addresses and business names) and activity segments (walking, driving, cycling). Files are named like 2022_APRIL.json.",settings:"This file contains device configuration information from your Google Timeline export. It lists devices that contributed location data but does not contain GPS coordinates.",timelineEdits:"This format contains edits and corrections made to your Timeline data, including place aggregates and raw signals. It may contain some location points from user modifications.",semanticSegments:"This is a parsed version of the location history with semantic segments containing timeline paths. It includes geo-coordinates in string format and time ranges for each segment.",locationHistory:"This is the newer Google Timeline export format from Android/iOS phone exports. It contains visit and activity data with geo-coordinates in string format, timeline paths, and probability scores.",unknown:"The format of this file could not be identified. It may not be a Google Timeline export, or it could be a format variant not yet supported."},x=[{name:"Google Timeline Converter",href:"/tools/google-timeline-converter",description:"Convert your Timeline data to GPX, GeoJSON, or KML",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M4 4v5h.582m15.356 2A8.001 8.001 0 004.582 9m0 0H9m11 11v-5h-.581m0 0a8.003 8.003 0 01-15.357-2m15.357 2H15"})})},{name:"Timeline Visualizer",href:"/tools/timeline-visualizer",description:"View your location history on an interactive map",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 20l-5.447-2.724A1 1 0 013 16.382V5.618a1 1 0 011.447-.894L9 7m0 13l6-3m-6 3V7m6 10l4.553 2.276A1 1 0 0021 18.382V7.618a1 1 0 00-.553-.894L15 4m0 13V4m0 0L9 7"})})},{name:"Statistics Analyzer",href:"/tools/timeline-statistics",description:"Get detailed stats about your location data",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z"})})},{name:"File Splitter",href:"/tools/gps-file-splitter",description:"Split large Timeline files into smaller chunks",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M8 7h12m0 0l-4-4m4 4l-4 4m0 6H4m0 0l4 4m-4-4l4-4"})})},{name:"Data Merger",href:"/tools/timeline-merger",description:"Combine multiple Timeline files into one",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M17 16v2a2 2 0 01-2 2H5a2 2 0 01-2-2V8a2 2 0 012-2h2m10 0h4a2 2 0 012 2v8a2 2 0 01-2 2h-4m-6-4l4-4m0 0l4 4m-4-4v12"})})},{name:"Mileage Calculator",href:"/tools/timeline-mileage-calculator",description:"Calculate total distance traveled from your data",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6"})})}],v=[{question:"What Google Timeline formats does this tool detect?",answer:"This tool detects all six known Google Timeline export formats: Records.json (raw GPS data from Google Takeout), Semantic Location History (monthly files with place visits and activity segments), Settings.json (device information), Timeline Edits (user corrections), Semantic Segments (parsed location history with timeline paths), and Location History (the newer phone-based export format from Android and iOS). The format is identified automatically the moment you upload a file."},{question:"Is my data safe when I upload it here?",answer:"Yes. All data processing happens entirely in your browser using JavaScript. Your Google Timeline files are never uploaded to any server \u2014 they stay on your device the entire time. When you close the tab, the data is gone. The tool is open source, so you can verify exactly what the code does. No accounts, no sign-ups, no tracking."},{question:"What happened to Google Maps Timeline?",answer:"In late 2024, Google discontinued the web-based version of Google Maps Timeline and moved all location data to on-device storage on your phone. Users were given a limited window to export their data \u2014 only the last 90 days were automatically migrated, and older data was deleted unless manually backed up through Google Takeout. Many users lost years of location history. This tool helps you understand what format your exported files are in so you can use them with the right tools."},{question:"How do I export my Google Timeline data?",answer:"There are three methods: (1) Google Takeout at takeout.google.com \u2014 select Location History and export as JSON. This produces Records.json, Semantic Location History files, Settings.json, and Timeline Edits. (2) On Android: Google Maps > Settings > Location > Location Services > Timeline > Export Timeline. This produces the newer Location History format. (3) On iOS: Google Maps > Settings > Personal Content > Export Timeline data. We recommend trying all methods and keeping all exported files."},{question:"What's the difference between Records.json and Semantic Location History?",answer:"Records.json contains raw GPS coordinates \u2014 every single location ping Google recorded, with timestamps, accuracy values, altitude, and velocity. These files are very large and contain the most granular data. Semantic Location History files (named like 2022_APRIL.json) are more structured: they contain place visits with business names and addresses, activity segments (walking, driving, cycling) 
1with routes, and duration information. Records.json is best for precise location data; Semantic files are best for understanding where you went and how you got there."},{question:"Which tool should I use after detecting my format?",answer:"It depends on what you want to do. To see your data on a map, use the Timeline Visualizer. To convert to GPX/GeoJSON/KML for use in other apps, use the Google Timeline Converter. To understand your travel patterns and statistics, use the Statistics Analyzer. If your file is too large, the File Splitter can break it into smaller pieces. If you have multiple export files, the Data Merger can combine them. For distance calculations, use the Mileage Calculator."},{question:"Why can't the tool detect my file's format?",answer:"If the tool shows 'Unknown Format', your file may not be a Google Timeline export. Common reasons include: uploading a non-JSON file (the tool only accepts .json files), uploading a Google Takeout file from a different service (like YouTube or Chrome), or uploading a corrupted or truncated file. Make sure you're uploading files from the Location History section of your Google Takeout export."},{question:"Can I detect the format of multiple files at once?",answer:"Yes. You can upload multiple JSON files simultaneously. The tool will analyze each file individually and display the detected format, point count, path count, date range, and data quality for every file. This is useful when you have a full Google Takeout export with multiple files (Records.json, Semantic files, Settings.json, etc.)."}];function j(e){if(0===e)return"0 B";const t=Math.floor(Math.log(e)/Math.log(1024));return parseFloat((e/Math.pow(1024,t)).toFixed(2))+" "+["B","KB","MB","GB"][t]}function b(e){if(!e)return null;try{const t=new Date(e);return isNaN(t.getTime())?null:t.toLocaleDateString("en-US",{year:"numeric",month:"long",day:"numeric"})}catch{return null}}function S(){const[e,t]=(0,a.useState)([]),[o,S]=(0,a.useState)([]),w=(0,a.useCallback)(async e=>{t(e);const o=[];for(let t=0;t<e.length;t++){const i=e[t];try{const e=(0,r.Tz)(i.data),t=(0,r.pv)(i.data);let a=null,n=null,s=0,l=0;for(let o=0;o<t.points.length;o++){const e=t.points[o];if(e.timestamp){s++;const t=new Date(e.timestamp);isNaN(t.getTime())||((!a||t<a)&&(a=t),(!n||t>n)&&(n=t))}null!==e.accuracy&&void 0!==e.accuracy&&l++}for(let o=0;o<t.paths.length;o++){const e=t.paths[o];if(e.startTimestamp){const t=new Date(e.startTimestamp);isNaN(t.getTime())||((!a||t<a)&&(a=t),(!n||t>n)&&(n=t))}if(e.endTimestamp){const t=new Date(e.endTimestamp);isNaN(t.getTime())||((!a||t<a)&&(a=t),(!n||t>n)&&(n=t))}}o.push({filename:i.filename,fileSize:i.size,format:e,formatName:f[e]||f.unknown,formatDescription:y[e]||y.unknown,pointCount:t.points.length,pathCount:t.paths.length,minDate:a?a.toISOString():null,maxDate:n?n.toISOString():null,pointsWithTimestamp:s,pointsWithAccuracy:l,metadata:t.metadata})}catch(a){o.push({filename:i.filename,fileSize:i.size,format:"unknown",formatName:"Parse Error",formatDescription:`Could not parse this file: ${a.message}`,pointCount:0,pathCount:0,minDate:null,maxDate:null,pointsWithTimestamp:0,pointsWithAccuracy:0,metadata:{},error:!0})}}S(o)},[]),T=(0,a.useCallback)(()=>{t([]),S([])},[]),N=o.reduce((e,t)=>e+t.pointCount,0),k=o.reduce((e,t)=>e+t.pathCount,0);return(0,d.jsxs)(i.A,{title:p,description:h,children:[(0,d.jsxs)(n.A,{children:[(0,d.jsx)("meta",{name:"title",content:p}),(0,d.jsx)("meta",{name:"description",content:h}),(0,d.jsx)("meta",{name:"keywords",content:"google timeline format, what format is my google export, google takeout location file type, google location history format, google timeline file detector, google maps timeline export format, google takeout json format, location history file type, google timeline data format, identify google export file"}),(0,d.jsx)("link",{rel:"canonical",href:g}),(0,d.jsx)("meta",{property:"og:type",content:"website"}),(0,d.jsx)("meta",{property:"og:url",content:g}),(0,d.jsx)("meta",{property:"og:title",content:p}),(0,d.jsx)("meta",{property:"og:description",content:h}),(0,d.jsx)("meta",{property:"og:image",content:u}),(0,d.jsx)("meta",{property:"og:site_name",content:"Dawarich"}),(0,d.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,d.jsx)("meta",{name:"twitter:url",content:g}),(0,d.jsx)("meta",{name:"twitter:title",content:p}),(0,d.jsx)("meta",{name:"twitter:description",content:h}),(0,d.jsx)("meta",{name:"twitter:image",content:u}),(0,d.jsx)("meta",{name:"author",content:"Dawarich"}),(0,d.jsx)("meta",{name:"robots",content:"index, follow"}),(0,d.jsx)("meta",{name:"language",content:"English"}),(0,d.jsx)("meta",{name:"revisit-after",content:"7 days"}),(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"WebApplication",name:"Google Timeline Format Detector",url:g,description:h,applicationCategory:"UtilityApplication",operatingSystem:"Any",offers:{"@type":"Offer",price:"0",priceCurrency:"USD"},featureList:["Detect Google Timeline export format instantly","Support for all 6 Google Timeline formats","Show point count, path count, and date range","Data quality indicators","Privacy-first - all processing in browser","No data sent to any server"]})}),(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"HowTo",name:"How to Identify Your Google Timeline Export Format",description:"Upload your Google Timeline export file to instantly detect its format, see statistics, and get recommendations for what to do next.",step:[{"@type":"HowToStep",name:"Export your Google Timeline data",text:"Visit takeout.google.com, select Location History (Timeline), and export. Alternatively, on Android: Google Maps > Settings > Location > Timeline > Export. On iOS: Google Maps > Settings > Personal Content > Export Timeline data."},{"@type":"HowToStep",name:"Upload your JSON file",text:"Drag and drop your exported Google Timeline JSON file into the detector. The tool automatically identifies the format within seconds."},{"@type":"HowToStep",name:"Review your results",text:"See the detected format, point count, path count, date range, file size, and data quality indicators. Then follow the recommended tool links based on your format."}],tool:{"@type":"HowToTool",name:"Google Timeline Format Detector by Dawarich"}})}),(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"FAQPage",mainEntity:v.map(e=>
1({"@type":"Question",name:e.question,acceptedAnswer:{"@type":"Answer",text:e.answer}}))})}),(0,d.jsx)("script",{type:"application/ld+json",children:JSON.stringify({"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:[{"@type":"ListItem",position:1,name:"Home",item:"https://dawarich.app"},{"@type":"ListItem",position:2,name:"Free Tools",item:"https://dawarich.app/tools"},{"@type":"ListItem",position:3,name:"Google Timeline Format Detector",item:g}]})})]}),(0,d.jsxs)("main",{children:[(0,d.jsxs)("div",{className:m.container,children:[(0,d.jsxs)("div",{className:m.contentWrapper,children:[(0,d.jsxs)("div",{className:m.header,children:[(0,d.jsx)("h1",{children:"Google Timeline Format Detector"}),(0,d.jsx)("p",{children:"Upload any Google Timeline export file to instantly identify its format, see data statistics, and get recommendations for what to do next. All processing happens in your browser."})]}),(0,d.jsxs)("div",{className:m.topSection,children:[(0,d.jsxs)("div",{className:m.instructions,children:[(0,d.jsx)("h2",{children:"How to Get Your Timeline Data"}),(0,d.jsx)("p",{children:"You can export your Google Timeline data using one of the following methods. If one of them doesn't work, try another."}),(0,d.jsx)("p",{children:"Unfortunately, some users might not be able to export their location data due to how Google went with transition to new location storage policies."}),(0,d.jsxs)("div",{className:m.instructionsList,children:[(0,d.jsxs)("div",{className:m.instructionItem,children:[(0,d.jsx)("strong",{children:"Google Takeout:"}),(0,d.jsxs)("p",{children:["Visit ",(0,d.jsx)("a",{href:"https://takeout.google.com/",target:"_blank",rel:"noopener noreferrer",children:"takeout.google.com"})," \u2192 Choose Location History (Timeline) \u2192 Export"]}),(0,d.jsxs)("p",{children:["This way might not work for everyone because Google changed the way location data is being stored and exported. More details in our ",(0,d.jsx)("a",{href:"https://dawarich.app/blog/migrating-from-google-location-history-to-dawarich",children:"blog"}),"."]})]}),(0,d.jsxs)("div",{className:m.instructionItem,children:[(0,d.jsx)("strong",{children:"On Android:"}),(0,d.jsx)("p",{children:"Open Google Maps \u2192 Settings \u2192 Location \u2192 Location Services \u2192 Timeline \u2192 Export Timeline"})]}),(0,d.jsxs)("div",{className:m.instructionItem,children:[(0,d.jsx)("strong",{children:"On iOS:"}),(0,d.jsx)("p",{children:"Open Google Maps \u2192 Settings \u2192 Personal Content \u2192 Export Timeline data"})]})]})]}),(0,d.jsxs)("div",{className:m.uploaderWrapper,children:[(0,d.jsx)(s.A,{onFilesLoaded:w,onClear:T}),(0,d.jsx)("div",{className:m.privacyNote,children:(0,d.jsxs)("div",{children:[(0,d.jsxs)("strong",{children:[(0,d.jsx)("svg",{className:m.privacyIcon,fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"})}),"Privacy First"]}),(0,d.jsx)("p",{children:"All data processing happens entirely in your browser. Your location data never leaves your device and is not sent to any server."})]})})]})]}),0===e.length&&(0,d.jsx)("div",{className:m.preCtaPanel,children:(0,d.jsxs)("div",{className:m.preCtaContent,children:[(0,d.jsx)("span",{className:m.preCtaIcon,children:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"20",height:"20",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"})})}),(0,d.jsxs)("span",{children:["Not sure what to do with your Google Timeline data? Upload your file above to find out, or explore ",(0,d.jsx)("a",{href:"/?utm_source=tool&utm_medium=inline-cta&utm_campaign=timeline-format-detector",children:"Dawarich"})," for automatic location tracking with full data ownership."]})]})}),o.length>0&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(l.A,{toolName:"timeline-format-detector",headline:`You analyzed <strong>${o.length}</strong> file${1!==o.length?"s":""} with <strong>${new Set(o.map(e=>e.formatName)).size}</strong> detected format${1!==new Set(o.map(e=>e.formatName)).size?"s":""}. Dawarich handles all of them \u2014 import and visualize your location history instantly.`,stats:[{label:"files",value:o.length.toString()},{label:"formats",value:new Set(o.map(e=>e.formatName)).size.toString()},...N>
10?[{label:"points",value:N.toLocaleString()}]:[]]}),(0,d.jsxs)("div",{className:m.resultsSection,children:[(0,d.jsx)("h2",{children:"Detection Results"}),o.length>1&&(0,d.jsxs)("div",{className:m.resultsSummary,children:[(0,d.jsxs)("span",{children:[o.length," files analyzed"]}),(0,d.jsx)("span",{className:m.resultsSummaryDot,children:"\xb7"}),(0,d.jsxs)("span",{children:[N.toLocaleString()," total points"]}),(0,d.jsx)("span",{className:m.resultsSummaryDot,children:"\xb7"}),(0,d.jsxs)("span",{children:[k.toLocaleString()," total paths"]})]}),o.map((e,t)=>(0,d.jsxs)("div",{className:`${m.resultCard} ${e.error?m.resultCardError:""}`,children:[(0,d.jsxs)("div",{className:m.resultHeader,children:[(0,d.jsxs)("div",{className:m.resultFilename,children:[(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",viewBox:"0 0 24 24",width:"18",height:"18",children:(0,d.jsx)("path",{strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:2,d:"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z"})}),(0,d.jsx)("span",{children:e.filename})]}),(0,d.jsx)("span",{className:`${m.formatBadge} ${m[`format_${e.format}`]||""}`,children:e.formatName})]}),(0,d.jsx)("p",{className:m.formatDescription,children:e.formatDescription}),(0,d.jsxs)("div",{className:m.statGrid,children:[(0,d.jsxs)("div",{className:m.statItem,children:[(0,d.jsx)("span",{className:m.statLabel,children:"Points"}),(0,d.jsx)("span",{className:m.statValue,children:e.pointCount.toLocaleString()})]}),(0,d.jsxs)("div",{className:m.statItem,children:[(0,d.jsx)("span",{className:m.statLabel,children:"Paths"}),(0,d.jsx)("span",{className:m.statValue,children:e.pathCount.toLocaleString()})]}),(0,d.jsxs)("div",{className:m.statItem,children:[(0,d.jsx)("span",{className:m.statLabel,children:"File Size"}),(0,d.jsx)("span",{className:m.statValue,children:j(e.fileSize)})]}),(0,d.jsxs)("div",{className:m.statItem,children:[(0,d.jsx)("span",{className:m.statLabel,children:"Date Range"}),(0,d.jsx)("span",{className:m.statValue,children:e.minDate&&e.maxDate?`${b(e.minDate)} \u2014 ${b(e.maxDate)}`:"No dates found"})]})]}),(e.pointCount>0||e.pathCount>0)&&(0,d.jsxs)("div",{className:m.qualitySection,children:[(0,d.jsx)("h4",{children:"Data Quality"}),(0,d.jsxs)("div",{className:m.qualityGrid,children:[(0,d.jsxs)("div",{className:m.qualityItem,children:[(0,d.jsx)("div",{className:m.qualityBar,children:(0,d.jsx)("div",{className:m.qualityFill,style:{width:e.pointCount>0?`${Math.round(e.pointsWithTimestamp/e.pointCount*100)}%`:"0%"}})}),(0,d.jsx)("span",{className:m.qualityLabel,children:e.pointCount>0?`${Math.round(e.pointsWithTimestamp/e.pointCount*100)}% have timestamps`:"No timestamp data"})]}),(0,d.jsxs)("div",{className:m.qualityItem,children:[(0,d.jsx)("div",{className:m.qualityBar,children:(0,d.jsx)("div",{className:m.qualityFill,style:{width:e.pointCount>0?`${Math.round(e.pointsWithAccuracy/e.pointCount*100)}%`:"0%"}})}),(0,d.jsx)("span",{className:m.qualityLabel,children:e.pointCount>0?`${Math.round(e.pointsWithAccuracy/e.pointCount*100)}% have accuracy info`:"No accuracy data"})]})]})]}),!e.error&&(e.pointCount>0||e.pathCount>0)&&(0,d.jsxs)("div",{className:m.recommendedTools,children:[(0,d.jsx)("h4",{children:"Recommended Tools"}),(0,d.jsx)("div",{className:m.toolLinks,children:x.map((e,t)=>(0,d.jsxs)("a",{href:`${e.href}?utm_source=tool&utm_medium=recommendation&utm_campaign=timeline-format-detector`,className:m.toolLink,children:[(0,d.jsx)("span",{className:m.toolIcon,children:e.icon}),(0,d.jsxs)("div",{children:[(0,d.jsx)("strong",{children:e.name}),(0,d.jsx)("span",{children:e.description})]})]},t))})]})]},t))]})]})]}),(0,d.jsx)("div",{className:m.infoSection,children:(0,d.jsxs)("div",{className:m.infoGrid,children:[(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"What Is a Google Timeline Format Detector?"}),(0,d.jsx)("p",{children:"When you export your Google Timeline data through Google Takeout or your phone, you get JSON files in several possible formats. Each format has a different structure, different data fields, and is suited for different tools. This detector reads your file, identifies the format, and tells you exactly what you're working with \u2014 so you know 
1which conversion tool, visualizer, or analysis method to use."}),(0,d.jsx)("p",{children:"The detection happens instantly in your browser. Your data never leaves your device."})]}),(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"Google Timeline Export Formats Explained"}),(0,d.jsxs)("ul",{children:[(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Records.json"})," \u2014 Raw GPS data in E7 coordinate format with timestamps, accuracy, altitude, and velocity. The largest and most detailed format"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Semantic Location History"})," \u2014 Monthly files with place visits (addresses, names) and activity segments (walking, driving)"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Location History (New)"})," \u2014 Phone-based export with visits, activities, and geo-coordinates in string format"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Semantic Segments"})," \u2014 Timeline paths with geo-coordinates and time ranges"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Settings.json"})," \u2014 Device metadata, no GPS coordinates"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Timeline Edits"})," \u2014 User corrections and place aggregates"]})]})]}),(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"Why Does the Format Matter?"}),(0,d.jsx)("p",{children:"Different formats contain different types of data. Records.json has the most precise location coordinates but no place names. Semantic Location History has addresses and activity types but fewer raw GPS points. The newer phone export format combines both but uses a different coordinate encoding."}),(0,d.jsx)("p",{children:"Knowing your format helps you choose the right tool: converters need to know the input format, visualizers handle different fields, and statistics analyzers extract different metrics depending on the format."})]}),(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"What Happened to Google Maps Timeline?"}),(0,d.jsxs)("p",{children:["In late 2024, Google shut down the web version of Google Maps Timeline and moved all location data to on-device storage. Only the last 90 days were migrated \u2014 older data was deleted unless users manually backed it up. Many people ",(0,d.jsx)("a",{href:"https://www.reddit.com/r/GoogleMaps/comments/1diivt3/megathread_google_maps_timeline_moving_to/",target:"_blank",rel:"noopener noreferrer",children:"lost years of location history"})," in the transition."]}),(0,d.jsxs)("p",{children:["If you have exported files, this detector helps you understand what you've got. For a long-term replacement, ",(0,d.jsx)("a",{href:"/?utm_source=tool&utm_medium=info-section&utm_campaign=timeline-format-detector",children:"Dawarich"})," offers self-hosted and cloud-based location tracking with full data ownership."]})]}),(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"Data Quality Indicators"}),(0,d.jsx)("p",{children:"The detector shows two key quality metrics for your data:"}),(0,d.jsxs)("ul",{children:[(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Timestamp coverage"})," \u2014 What percentage of data points include a timestamp. High coverage means you can filter by date, calculate travel times, and build timelines"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("strong",{children:"Accuracy coverage"})," \u2014 What percentage of data points include GPS accuracy values. This helps you assess how precise the location data is (lower accuracy values mean more precise GPS readings)"]})]}),(0,d.jsx)("p",{children:"Records.json typically has the highest quality scores, while Semantic Location History prioritizes structured data over raw GPS precision."})]}),(0,d.jsxs)("div",{className:m.infoCard,children:[(0,d.jsx)("h2",{children:"Related Tools"}),(0,d.jsxs)("ul",{children:[(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/timeline-visualizer",children:"Timeline Visualizer"})," \u2014 View your location history on an interactive map"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/google-timeline-converter",children:"Google Timeline Converter"})," \u2014 Convert to GPX, GeoJSON, or KML"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/timeline-statistics",children:"Statistics Analyzer"})," \u2014 Get detailed stats about your data"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/gps-file-splitter",children:"File Splitter"})," \u2014 Split large files into smaller chunks"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/timeline-merger",children:"Data Merger"})," \u2014 Combine multiple Timeline files"]}),(0,d.jsxs)("li",{children:[(0,d.jsx)("a",{href:"/tools/timeline-mileage-calculator",children:"Mileage Calculator"})," \u2014 Calculate total distance traveled"]})]}),(0,d.jsxs)("p",{children:["Read more: ",(0,d.jsx)("a",{href:"/blog/migrating-from-google-location-history-to-dawarich",children:"Migrating from Google Location History"})]})]})]})}),(0,d.jsxs)("div",{className:m.faqSection,children:[(0,d.jsx)("h2",{children:"Frequently Asked Questions"}),(0,d.jsx)("div",{className:m.faqList,children:v.map((e,t)=>(0,d.jsxs)("details",{className:m.faqItem,children:[(0,d.jsx)("summary",{className:m.faqQuestion,children:e.question}),(0,d.jsx)("p",{className:m.faqAnswer,children:e.answer})]},t))})]}),(0,d.jsx)("div",{className:m.bottomCtaPanel,children:(0,d.jsxs)("div",{className:m.ctaContent,children:[(0,d.jsx)("h3",{children:"Looking for a Google Timeline Replacement?"}),(0,d.jsx)("p",{children:"Dawarich is an open-source location tracking platform that gives you full control over your data. Import your Google Timeline export, track ongoing location from your phone, and visualize years of movement history \u2014 all self-hosted or in the cloud."}),(0,d.jsx)("a",{href:"/?utm_source=tool&utm_medium=bottom-cta&utm_campaign=timeline-format-detector",className:m.ctaButton,children:"Try Dawarich Free for 7 Days"})]})})]}),(0,d.jsx)(c.A,{slug:"timeline-format-detector"})]})]})}},51109(e,t,o){function a(e){return e/1e7}function i(e,t){return"number"==typeof e&&"number"==typeof t&&!isNaN(e)&&!isNaN(t)&&isFinite(e)&&isFinite(t)&&e>=-90&&e<=90&&t>=-180&&t<=180}function n(e,t){if(!e||!t)return null;const o=new Date(e),a=new Date(t)-o,i=Math.floor(a/6e4),n=Math.floor(i/60),s=Math.floor(n/24);if(s>0){return`${s}d ${n%24}h`}if(n>0){return`${n}h ${i%60}m`}return`${i}m`}function s(e){const t={IN_PASSENGER_VEHICLE:"#3b82f6",IN_BUS:"#f59e0b",IN_TRAIN:"#8b5cf6",IN_SUBWAY:"#8b5cf6",WALKING:"#10b981",RUNNING:"#ef4444",CYCLING:"#06b6d4",MOTORCYCLING:"#f97316",FLYING:"#6366f1",SKIING:"#0ea5e9",SAILING:"#14b8a6",UNKNOWN:"#6b7280"};return t[e]||t.UNKNOWN}function r(e){return e.locations&&Array.isArray(e.locations)?"records":e.timelineObjects&&Array.isArray(e.timelineObjects)?"semantic":e.deviceSettings&&Array.isArray(e.deviceSettings)?"settings":e.timelineEdits&&Array.isArray(e.timelineEdits)?"timelineEdits":e.semanticSegments&&Array.isArray(e.semanticSegments)?"semanticSegments":Array.isArray(e)&&e.length>0&&e[0].startTime&&e[0].endTime?"locationHistory":"unknown"}function l(e){if(!e||"string"!=typeof e)return null;let t=e.replace(/^geo:/,"");t=t.replace(/\xb0/g,"");const o=t.split(",");if(2!==o.length)return null;const a=parseFloat(o[0].trim()),i=parseFloat(o[1].trim());return isNaN(a)||isNaN(i)||a<-90||a>90||i<-180||i>180?null:{lat:a,lng:i}}function c(e){if(!e)return null;if("string"==typeof e)return l(e);
1if("object"==typeof e){if(e.latLng)return l(e.latLng);if(null!=e.latitude&&null!=e.longitude){const t=parseFloat(e.latitude),o=parseFloat(e.longitude);if(i(t,o))return{lat:t,lng:o}}if(null!=e.latitudeE7&&null!=e.longitudeE7){const t=a(e.latitudeE7),o=a(e.longitudeE7);if(i(t,o))return{lat:t,lng:o}}}return null}function m(e){switch(r(e)){case"records":return function(e){console.log("[parseRecords] Starting to parse Records.json format");const t=[],o=Math.random().toString(36).substr(2,9);if(!e.locations||!Array.isArray(e.locations))return console.log("[parseRecords] No locations array found"),{points:t,paths:[],metadata:{format:"records"}};console.log(`[parseRecords] Found ${e.locations.length} location records`);for(let n=0;n<e.locations.length;n++){const s=e.locations[n];if(!s.latitudeE7||!s.longitudeE7)continue;const r=a(s.latitudeE7),l=a(s.longitudeE7);if(!i(r,l))continue;let c=null,m=null;if(s.activity&&Array.isArray(s.activity)&&s.activity.length>0){const e=s.activity[0];if(e.activity&&Array.isArray(e.activity)&&e.activity.length>0){const t=e.activity.reduce((e,t)=>t.confidence>(e?.confidence||0)?t:e,null);t&&(c=t.type,m=t.confidence)}}t.push({id:`record-${o}-${n}`,lat:r,lng:l,timestamp:s.timestamp||s.timestampMs||null,accuracy:s.accuracy||null,altitude:s.altitude||null,velocity:s.velocity||null,heading:s.heading||null,verticalAccuracy:s.verticalAccuracy||null,source:s.source||null,deviceTag:s.deviceTag||null,platformType:s.platformType||null,formFactor:s.formFactor||null,deviceDesignation:s.deviceDesignation||null,osLevel:s.osLevel||null,batteryCharging:s.batteryCharging||null,placeId:s.placeId||null,type:"location_record",activityType:c,activityConfidence:m})}return console.log(`[parseRecords] Parsed ${t.length} valid points`),console.log("[parseRecords] Sorting points by timestamp..."),t.length>1e5&&console.log("[parseRecords] Large dataset detected, using optimized sort"),t.sort((e,t)=>e.timestamp&&t.timestamp?new Date(e.timestamp).getTime()-new Date(t.timestamp).getTime():0),console.log("[parseRecords] \u2713 Sorting complete"),{points:t,paths:[],metadata:{format:"records",totalPoints:t.length}}}(e);case"semantic":return function(e){const t=[],o=[],s=Math.random().toString(36).substr(2,9);return e.timelineObjects&&Array.isArray(e.timelineObjects)?(e.timelineObjects.forEach((e,r)=>{if(e.placeVisit){const o=e.placeVisit,l=o.location||{};if(l.latitudeE7&&l.longitudeE7){const e=a(l.latitudeE7),c=a(l.longitudeE7);i(e,c)&&t.push({id:`visit-${s}-${r}`,lat:e,lng:c,timestamp:o.duration?.startTimestamp||null,arrived:o.duration?.startTimestamp||null,departed:o.duration?.endTimestamp||null,duration:n(o.duration?.startTimestamp,o.duration?.endTimestamp),address:l.address||null,name:l.name||null,type:"place_visit"})}}if(e.activitySegment){const t=e.activitySegment,l=t.startLocation,c=t.endLocation;if(l?.latitudeE7&&l?.longitudeE7&&c?.latitudeE7&&c?.longitudeE7){const e=[];if(t.simplifiedRawPath?.points&&t.simplifiedRawPath.points.forEach(t=>{if(t.latE7&&t.lngE7){const o=a(t.latE7),n=a(t.lngE7);i(o,n)&&e.push([o,n])}}),0===e.length){const t=a(l.latitudeE7),o=a(l.longitudeE7),n=a(c.latitudeE7),s=a(c.longitudeE7);i(t,o)&&i(n,s)&&e.push([t,o],[n,s])}e.length>=2&&o.push({id:`activity-path-${s}-${r}`,coordinates:e,activityType:t.activityType,distance:t.distance||null,startTimestamp:t.duration?.startTimestamp||null,endTimestamp:t.duration?.endTimestamp||null,duration:n(t.duration?.startTimestamp,t.duration?.endTimestamp)})}}}),t.sort((e,t)=>e.timestamp&&t.timestamp?new Date(e.timestamp)-new Date(t.timestamp):0),{points:t,paths:o,metadata:{format:"semantic",totalPoints:t.length,totalPaths:o.length}}):{points:t,paths:o,metadata:{format:"semantic"}}}(e);case"settings":return function(e){const t=[];return e.deviceSettings&&Array.isArray(e.deviceSettings)&&e.deviceSettings.forEach((e,o)=>{t.push({id:`device-${o}`,deviceTag:e.deviceTag,deviceName:e.devicePrettyName||"Unknown Device",platform:e.platformType||"UNKNOWN"})}),{points:[],paths:[],metadata:{format:"settings",devices:t}}}(e);case"timelineEdits":return function(e){const t=[],o=Math.random().toString(36).substr(2,9);return e.timelineEdits&&Array.isArray(e.timelineEdits)?(e.timelineEdits.forEac
1h((e,n)=>{if(e.placeAggregates?.placeAggregateInfo&&e.placeAggregates.placeAggregateInfo.forEach((e,s)=>{if(e.point?.latE7&&e.point?.lngE7){const r=a(e.point.latE7),l=a(e.point.lngE7);i(r,l)&&t.push({id:`aggregate-${o}-${n}-${s}`,lat:r,lng:l,type:"place_aggregate"})}}),e.rawSignal?.signal?.position){const s=e.rawSignal.signal.position;if(s.point?.latE7&&s.point?.lngE7){const e=a(s.point.latE7),r=a(s.point.lngE7);i(e,r)&&t.push({id:`signal-${o}-${n}`,lat:e,lng:r,timestamp:s.timestamp||null,type:"raw_signal"})}}}),{points:t,paths:[],metadata:{format:"timelineEdits",totalPoints:t.length}}):{points:t,paths:[],metadata:{format:"timelineEdits"}}}(e);case"semanticSegments":return function(e){console.log("[parseSemanticSegments] Starting to parse semantic segments format");const t=[],o=[];if(!e.semanticSegments||!Array.isArray(e.semanticSegments))return console.log("[parseSemanticSegments] No semanticSegments array found"),{points:t,paths:o,metadata:{}};console.log(`[parseSemanticSegments] Found ${e.semanticSegments.length} semantic segments`);const a=Math.random().toString(36).substr(2,9);for(let i=0;i<e.semanticSegments.length;i++){const r=e.semanticSegments[i];if(r.visit){const e=r.visit.topCandidate;if(e){const o=c(e.placeLocation);o&&t.push({id:`visit-${a}-${i}`,lat:o.lat,lng:o.lng,timestamp:r.startTime||null,arrived:r.startTime||null,departed:r.endTime||null,duration:n(r.startTime,r.endTime),placeId:e.placeId||e.placeID||null,type:"place_visit",semanticType:e.semanticType||null,probability:e.probability||null})}}if(r.timelinePath&&Array.isArray(r.timelinePath)){const e=[];for(let o=0;o<r.timelinePath.length;o++){const s=r.timelinePath[o];if(s.point){const c=l(s.point);c&&(e.push([c.lat,c.lng]),0===o&&t.push({id:`segment-${a}-${i}`,lat:c.lat,lng:c.lng,timestamp:r.startTime||s.time||null,arrived:r.startTime||null,departed:r.endTime||null,duration:n(r.startTime,r.endTime),type:"activity_start"}))}}e.length>=2&&o.push({id:`segment-path-${a}-${i}`,coordinates:e,type:"activity_segment",activityType:"UNKNOWN",startTimestamp:r.startTime||null,endTimestamp:r.endTime||null,duration:n(r.startTime,r.endTime),color:s("UNKNOWN")})}e.semanticSegments.length>1e4&&(i+1)%1e4==0&&console.log(`[parseSemanticSegments] Processed ${i+1}/${e.semanticSegments.length} segments (${Math.round((i+1)/e.semanticSegments.length*100)}%)`)}return console.log(`[parseSemanticSegments] Parsed ${t.length} points and ${o.length} paths`),console.log("[parseSemanticSegments] Sorting points by timestamp..."),t.length>1e5&&console.log("[parseSemanticSegments] Large dataset detected, using optimized sort"),t.sort((e,t)=>e.timestamp&&t.timestamp?new Date(e.timestamp).getTime()-new Date(t.timestamp).getTime():0),console.log("[parseSemanticSegments] \u2713 Sorting complete"),console.log("[parseSemanticSegments] Parsing complete"),{points:t,paths:o,metadata:{format:"semanticSegments",totalPoints:t.length,totalPaths:o.length}}}(e);case"locationHistory":return function(e){console.log("[parseLocationHistory] Starting to parse location-history format");const t=[],o=[];if(!Array.isArray(e))return console.log("[parseLocationHistory] Data is not an array"),{points:t,paths:o,metadata:{}};console.log(`[parseLocationHistory] Found ${e.length} timeline entries`);const a=Math.random().toString(36).substr(2,9);for(let i=0;i<e.length;i++){const r=e[i];if(r.visit){const e=r.visit.topCandidate;if(e&&e.placeLocation){const o=c(e.placeLocation);if(o){const s={id:`visit-${a}-${i}`,lat:o.lat,lng:o.lng,timestamp:r.startTime,arrived:r.startTime,departed:r.endTime,duration:n(r.startTime,r.endTime),placeId:e.placeID||null,type:"place_visit",semanticType:e.semanticType||null,probability:e.probability||null};t.push(s)}}}if(r.activity){const e=r.activity,t=e.topCandidate,c=[];if(r.timelinePath&&Array.isArray(r.timelinePath))for(let o=0;o<r.timelinePath.length;o++){const e=r.timelinePath[o];if(e.point){const t=l(e.point);t&&c.push([t.lat,t.lng])}}c.length>=2&&o.push({id:`activity-path-${a}-${i}`,coordinates:c,type:"activity_segment",activityType:t?.type||"UNKNOWN",distance:e.distanceMeters?parseInt(e.distanceMeters):null,
1startTimestamp:r.startTime,endTimestamp:r.endTime,duration:n(r.startTime,r.endTime),color:s(t?.type||"UNKNOWN"),probability:t?.probability||null})}e.length>1e4&&(i+1)%1e4==0&&console.log(`[parseLocationHistory] Processed ${i+1}/${e.length} entries (${Math.round((i+1)/e.length*100)}%)`)}return console.log(`[parseLocationHistory] Parsed ${t.length} points and ${o.length} paths`),console.log("[parseLocationHistory] Sorting points by timestamp..."),t.length>1e5&&console.log("[parseLocationHistory] Large dataset detected, using optimized sort"),t.sort((e,t)=>e.timestamp&&t.timestamp?new Date(e.timestamp).getTime()-new Date(t.timestamp).getTime():0),console.log("[parseLocationHistory] \u2713 Sorting complete"),console.log("[parseLocationHistory] Parsing complete"),{points:t,paths:o,metadata:{format:"locationHistory",totalPoints:t.length,totalPaths:o.length}}}(e);default:return{points:[],paths:[],metadata:{format:"unknown"}}}}o.d(t,{Tz:()=>r,pv:()=>m})},75330(e,t,o){o.d(t,{A:()=>a});const a={container:"container_UCYM",dropzone:"dropzone__JwE",dragging:"dragging_MWxi",hasFiles:"hasFiles_hJ3o",fileInput:"fileInput_XvDy",label:"label_B_lx",icon:"icon_YYC7",hint:"hint_R3uS",formats:"formats_XDtn",spinner:"spinner_Ahaq",spin:"spin_uVXj",loadingText:"loadingText_G6pE",progressBarContainer:"progressBarContainer_g_he",progressBar:"progressBar_D17U",progressText:"progressText_Mtda",error:"error_druZ",errorIcon:"errorIcon_ygYn",clearButton:"clearButton_xt9N"}}}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.