quit and reopen firefox to sync the sessionstore navigate to file:///data/data/org.mozilla.firefox/files/mozilla/ then click XXXXXXXX.default/sessionstore.js longtap >> select all >> copy open termux and run this: fn=~/sd/Download/sessionstore-$(date +%Y-%m%d-%H%M%S).js; termux-clipboard-get > $fn; then run this (on phone or desktop) to convert the js to a list of links: echo '' >$fn.html; cat $fn | jq '[.. | .entries? | .[]? | {url,title}]' | jq -r '.[] | "\(.url) \(.title|@html)"' >> $fn.html; (this locates "entries" on every level and, if it contains "url" and "title", prints those as an html link) also unfortunately this trick doesn't work for chrome since access to the data folder is restricted == END OF GUIDE == notes on playing with the js and figuring out how to parse it open the json in firefox on a desktop, hit F12, console the current structure is roughly: { "windows": [ { "tabs": [ { "entries": [ { "url": "https://ocv.me/", "title": "https://ocv.me/" }]}, { "entries": [ { "url": "https://arstechnica.com/", "title": "https://arstechnica.com/" }, { "url": "https://arstechnica.com/some/article", "title": "article title maybe", }]}], "closedTabs": [ (same as "tabs") ]}]} notes all entries seems to have a "title" attribute, assuming this "originalURI" is punycode, "url" is human-readable unicode looks like "entries" is tab groups or something apparently "_closedWindows" can appear at the same level as "windows", probably same structure? haven't seen it "formdata" has a dontcare attribute called "url" so we want to look for entries:[{"url"}] at any level and collect tabs from there prettyprint json: var j = JSON.parse(document.childNodes[0].textContent); document.write('
' + JSON.stringify(j,null,4)); document.close();

count all urls:
  var j = JSON.parse(document.childNodes[0].textContent); var r=[]; function dive(j) { if (typeof j == 'string') return; for (var k in j) { var o = j[k]; if (o == null) continue; if (o.url) r.push(o.url); dive(o); }} dive(j); console.log(r.length);

show url list:
  document.write('
'+r.join('\n'))


"selected": 628
count: 689