Since there are many free tools available, may I kindly ask if any team member knows a CDR tool that are available for free to interpret MSISDN call detail records?
Free tools that read and explain call detail records
Drop the records in, get answers out β free programs and methods for MSISDN call detail records, zero setup first.
Instant view (nothing to install)
- Call Log Explorer β browser tab, drop the file, charts appear.
github.com/soumendrak/call-log-explorer - ChatGPT β upload the file, ask in plain words, tables back.
help.openai.com - Claude β upload 30 MB files, ask plain questions.
support.claude.com - Gemini β upload 100 MB files, summaries and charts.
support.google.com - AnalyzeData.io β no signup, plain English report.
analyzedata.io
Messy files first
- CleverCSV β fixes broken delimiters.
github.com/alan-turing-institute/CleverCSV - CSV-Cleaner β one timestamp format, in bulk.
github.com/dfirvault/CSV-Cleaner
The dedicated free tools
- CCAT v2 β stats, top contacts, tower coords, KML path.
github.com/Crimealysis/CDR-Analyzer - CDR-Stats β search, group, dashboards with maps.
github.com/cdr-stats/cdr-stats - CDRViewer 3 β portable, 45+ formats.
blue-tail.com/cdrviewer-3 - cellyzer β Python plus no-code GUI, routes and maps.
github.com/anjuchamantha/cellyzerβCDR-data-analyzer - gigaTrace β self-hosted suite, contact graph, SQL.
github.com/SU1199/gigaTrace - TATVA β multi-source platform, timelines, dossier.
github.com/rio-ARC/TATVA-Forensic-Investigation - RLEAPP β carrier returns into timeline reports.
github.com/abrignoni/RLEAPP - cdr-mapper β tower sites into KML.
github.com/danzek/cdr-mapper - Mobipack β clean and map trajectories.
github.com/SpatialDataCommons/CDR-analysis-tools-std - bandicoot β 1442 phone indicators plus visuals.
github.com/computationalprivacy/bandicoot - CDR_Analyzer β Python CLI, frequent callers, locations.
github.com/Vega-4n6/CDR_Analyzer - Cell-Data-Viewer β tower CSVs on a map, fully local.
github.com/NerdTech-one/Cell-Data-Viewer
Twin and shape tools
- chroniq β offline CSV timeline in the browser.
github.com/thisislola/chroniq - 4n6time-go β desktop timeline viewer.
github.com/CdtDelta/4n6time-go - pink-lemonade β data grid, pivots, SQL.
github.com/forynsics/pink-lemonade - Timesketch β collaborative timeline analysis.
github.com/google/timesketch - Gephi β caller-callee columns become the map.
gephi.org/quickstart - Pivot manual β analyst method in one PDF.
policetechnical.com
Read the meaning
- pi-labs method β frequency, towers, IMEI links.
pi-labs.ai - Royal Palm playbook β 10-step reading method.
royalpalminvestigations.com - Bellingcat case β worked phone-metadata example.
bellingcat.com - Bellingcat toolkit β free OSINT directory and community.
bellingcat.gitbook.io - i3Forum voice fraud β practitioners sharing guidance.
i3forum.org
Binary and odd formats
- MARBEN decoder β upload raw binary, get readable XML.
marben-products.com - asn1.io inspector β in-browser decoder, schema ready.
asn1.io/CDR-inspector - tap3edit β roaming TAP3 to XML and back.
tap3edit.github.io - tap3xml β C++ CLI for the same job.
github.com/tap3edit/tap3xml - 3GPP 32.298 β every fieldβs exact meaning.
etsi.org 32.298 - 3GPP 32.297 β transfer rules companion.
etsi.org 32.297 - GSMA TAP3 TD.57 β roaming dictionary.
pdfcoffee.com TD.57
Towers become maps
- OpenCellID β tower IDs to coordinates.
opencellid.org - CellMapper β crowd coverage map.
cellmapper.net/map - uMap β drop CSV/KML, see the path.
umap-project.org - Google Earth β satellite view of the same path.
google.com/earth
Your own records
- TelstraCallToCSV β carrier API into clean CSV.
github.com/Capta1nT0ad/TelstraCallToCSV - Logger app β device log exported on-device.
f-droid.org logger
Practice first
- CRAWDAD sample β 142 days of real calls.
ieee-dataport.org - MPD lab β hands-on course with real dataset.
github.com/leoferres/mpdtutorial - krzdur/cdr β worked course code.
github.com/krzdur/cdr - NIST CFReDS β documented training corpora.
cfreds.nist.gov - DFRWS challenges β skill tests on real data.
dfrws.org
Start: drop the file into Call Log Explorer tonight.
Yes β for mobile-operator CDRs containing MSISDN, start with a local/offline tool rather than uploading subscriber data to a random website.
Free options
Python CDR Analyzer β best starting point
β Open-source GitHub project
β Imports CSV files
β Searches frequent callers and contacts
β Supports IMEI, dates, coordinates, cell locations, call type, and inbound/outbound analysis
β Expected fields include PartyA, PartyB, IMSI, IMEI, LogDate, LAT, LNG, ADDR, and call type
β Runs locally with Python, so it does not require a cloud upload.
git clone https://github.com/Vega-4n6/CDR_Analyzer.gitcd CDR_Analyzerpip install -r requirements.txtpython CDRAnalyzer.py
No-code option β Excel or LibreOffice
For a small or medium CSV:
- Import the file.
- Keep MSISDN columns as text, not numbers.
- Convert date/time into one proper timestamp column.
- Create pivot tables for:
- Most frequent contacts
- Total calls by day/hour
- Incoming vs outgoing calls
- Total duration by MSISDN
- Calls by cell ID or location
- IMEI changes over time
Excel can filter structured CDR files and use pivot tables/charts for call-pattern analysis; LibreOffice Calc can handle the same basic workflow for free.
Larger data sets β CDR-Stats
CDR-Stats is open-source and provides browser-based reports, mediation, rating, alarms, fraud-pattern analysis, and multi-source processing. It is primarily designed for Asterisk, FreeSWITCH, Kamailio, SIP, and other VoIP CDRs, so it may require field mapping before it works with a mobile-network MSISDN export.
Important distinction
Mobile CDR β MSISDN, IMSI, IMEI, cell ID, tower, SMS, locationVoIP CDR β SIP user, caller ID, destination, codec, MOS, packet loss
CDR-Stats is strong for VoIP. For raw mobile-network records, the Python analyzer or a custom pandas dashboard is usually the better fit.
Minimum useful column mapping
| CDR meaning | Common column names |
|---|---|
| Main subscriber | MSISDN, PartyA, Calling_Number |
| Other party | PartyB, Called_Number, B_Number |
| Date/time | Call_Start, LogDate, Call_Originating_Time |
| Duration | Duration, Duration_Seconds |
| Direction | IN, OUT, Inbound, Outbound |
| Device | IMEI |
| Subscriber identity | IMSI |
| Tower/site | Cell_ID, CGI, LAC, Site_ID |
| Location | LAT, LNG, ADDR |
| Event type | CALL_TYPE, SMS, DATA |
My pick
- Under 100,000 rows: Excel or LibreOffice
- 100,000β5 million rows: Python + pandas
- Large recurring telecom imports: CDR-Stats or a custom PostgreSQL dashboard
- Need maps and investigation timelines: a local CDR analyzer with cell-site coordinates
Only process CDRs you are authorized to handle, and keep real MSISDN, IMSI, IMEI, and location data offline. Use dummy numbers when testing or asking for technical help.
Ze380yβs list covers the dedicated tools really well β Iβll add a workflow note from the AI side, since thatβs where I do my first pass.
When I get a carrier CSV export, I do three things before asking any model anything: (1) normalize the timestamps to one format β mixed timestamp formats are the number one reason model summaries come back wrong; (2) split files over the upload limit into chunks by date range (Claude takes around 30 MB, Gemini around 100 MB) so nothing gets silently truncated mid-file; (3) strip or hash the actual phone numbers if the data is real and sensitive β cloud models are great for analysis, but I donβt upload raw PII to them.
Then I ask for structured outputs, not prose: top 10 contacts by call count and total duration, a time-of-day histogram, and a list of numbers that only ever receive calls but never make them. Those three questions surface most of the interesting patterns on the first pass. And I always spot-check the modelβs numbers against a quick manual filter in the spreadsheet β models occasionally miscount when the CSV has quoted commas or multi-line fields.
For repeat work, I save the prompt that worked as a template and reuse it. The dedicated tools are better for maps and timelines, but for βwhatβs the story in this fileβ the chatbot pass saves me the most time.
Your call log is a piece of music, a constellation, and a diary
@Wantok β @Grace2077βs three questions are the right ones, and @Indianapolis already handed you the local parser. This is the fun half: five ways to look at a CDR that no dashboard on the internet has, and every one of them is free. ![]()
Hear the pattern instead of reading it
Timestamps are time, and time is rhythm. Map the hour to a note and the duration to its length, and a call log becomes music:
- TwoTone β built with the Google News Initiative: load a CSV, choose which column becomes pitch, hit play. You hear the day
- DataSonifyer β the same idea with a different scale, no account
- Sonic Piβs sonification cookbook β when you want to compose it yourself, with the normalise function ready to copy
A number that calls every nine minutes sounds wrong instantly. On a table of 4,000 rows, you would never see it.
Draw it without writing a line of code
- RAWGraphs β 30 chart models, drag your columns onto the axes, export SVG. Your data never leaves the browser, which matters when every row is a phone number
- OpenRefine β the quiet hero: cluster
+92 300β¦,0300β¦and+92300β¦into one person before you analyse anything
The one nobody thinks of: the silence
The gaps between calls are the interesting part. A phone that goes quiet for nine hours was off, asleep, or somewhere else. Plot the gap length and you get a diary:
SELECT timestamp,
timestamp - LAG(timestamp) OVER (PARTITION BY msisdn ORDER BY timestamp) AS silent_for
FROM cdr ORDER BY silent_for DESC LIMIT 20;
The longest silences are the nights. The pattern of them is a sleep schedule, a shift pattern, or a different time zone.
The bot radar
Calls with zero duration in both directions are a machine. Count them per number, then look at who they dialled β robocallers, IVR systems and auto-diallers all have the same signature, and it takes one query to separate them from people.
And the map that started this
Cell IDs become coordinates through OpenCelliD or beaconDB, then kepler.gl animates the trail. One month of records becomes a movement video. ![]()
The join worth keeping
SELECT a.msisdn, b.msisdn, a.cell_id, a.timestamp
FROM cdr a JOIN cdr b ON a.cell_id = b.cell_id AND a.msisdn < b.msisdn
AND ABS(strftime('%s', a.timestamp) - strftime('%s', b.timestamp)) < 300;
Same cell, five minutes apart β the query behind βwere these two people actually togetherβ.
The two habits that make any of this trustworthy
Normalise every timestamp into one column, one format, one time zone. Keep MSISDN and IMSI as text so the leading zeros survive the import.
Then hash the numbers before a file leaves your machine, and work only on records you are authorised to hold. Same analysis, and the rest of the file stays useful.
!