[{"data":1,"prerenderedAt":267},["ShallowReactive",2],{"project-42547538":3},{"id":4,"name":5,"line":6,"line_source":7,"title":8,"url":9,"domain":9,"maker":10,"posted_at":11,"year":12,"points":13,"comments":14,"rank_in_year":15,"shown_in_year":16,"top":17,"tier":18,"category":19,"subcategory":20,"format":21,"keywords":22,"reception":27,"sentiment":28,"stance_mix":29,"scored_comments":33,"aspects":34,"strip":38,"post_text":40,"what":41,"said":74,"maker_in_thread":156,"shape":168,"grid":173,"attempts":228,"same_week":229,"maker_shows":258,"maker_hidden":259,"reader_version":260,"card":261},"42547538","Unlace","I reverse engineered X to Read Threads without Any Account as Articles","title","Show HN: I reverse engineered X to Read Threads without Any Account as Articles",null,"vednig",1735547099,2024,59,27,1187,3515,34,"notable","productivity","thread reader","web_app",[23,24,25,26],"twitter thread reader","read threads","unroll threads","x reader","mixed",0,{"positive":30,"neutral":31,"mixed":32,"critical":30},1,3,2,7,{"execution":35,"design":36,"idea":37},{"positive":30,"critical":30},{"positive":28,"critical":28},{"positive":28,"critical":28},[31,31,28,28,31,28,28,28,28,28,28,28,39,28,28,28,28,28,31,28,30,28,31,28,28,28,28],5,"Hi fellow hackers,\n\nI'm Ved, I came across the pain point of having a reader that could provide threads as articles after scrolling them many times and missing the context of the original info shared.\n\nTo solve my itch I decided to build a thread reader without Ads(all existing sol. were full of them), since X\u002FTwitter API was very pricey, I did some reverse engineering to convert rendered X.com\u002Ftwitter pages to an API and host it in a VM (which obv. was dead cheap).\n\nAll of your data is saved in LocalStorage. Including your comments and saved threads(there is a known issue with Linux and MacOS",{"problem":42,"audience":9,"pricing":48,"motivation":54,"time_to_build":9,"stack":58,"openness":71,"stage":72,"team_size":73},{"value":43,"source":44,"evidence":45},"Threads on X are hard to read in context; existing reader sites are full of ads and X's API is expensive.","maker",[46],{"id":47},"post",{"value":49,"source":44,"evidence":50},"Free; no ads, no T&C, minimal data collection.",[51],{"id":52,"by":10,"text":53},"42551824","Sure, service is free for all(it's highly cached, so it shouldn't be a problem), code is open source and if it helps that would be great. Here are few things to consider: - First…",{"value":55,"source":44,"evidence":56},"Maker wanted a readable, ad-free way to read X threads after missing context while scrolling.",[57],{"id":47},[59,63,67],{"value":60,"source":44,"evidence":61},"NextJS",[62],{"id":47},{"value":64,"source":44,"evidence":65},"FastAPI",[66],{"id":47},{"value":68,"source":44,"evidence":69},"Selenium",[70],{"id":47},"open_source","launched","solo",{"praise":75,"objections":96,"requests":109,"questions":121,"alternatives":133},[76,92],{"value":77,"source":78,"evidence":79},"Useful and needed given X's paywalled API.","commenter",[80,84,88],{"id":81,"by":82,"text":83},"42550906","garciasn","Interesting and much needed--I absolutely refuse to go to Twitter links anymore; why bother, they don't usually work unless you're logged in. So, I clicked some of the links and,…",{"id":85,"by":86,"text":87},"42551302","jimmySixDOF","I had the same experience and suggest a loading progress bar of some sort. I also didn't see any of the Selenium process on their Github so can't see exactly how the tweets are…",{"id":89,"by":90,"text":91},"42551839","matcha-video","Very cool! I'm very impressed that Twitter hasn't detected your selenium usage, it seems like they're really trying to push people towards their paid API. I made a similar tool,…",{"value":93,"source":78,"evidence":94},"Selenium-based approach impressively avoids bot detection.",[95],{"id":89,"by":90,"text":91},[97,102],{"value":98,"source":78,"evidence":99},"Threads loaded slowly and duplicated content at first.",[100,101],{"id":81,"by":82,"text":83},{"id":85,"by":86,"text":87},{"value":103,"source":78,"evidence":104},"Does not render with JavaScript disabled on the client-side route.",[105],{"id":106,"by":107,"text":108},"42553326","HelloUsername","https:\u002F\u002Funlace.app\u002F?url=https:\u002F\u002Fx.com\u002Fianwcrosby\u002Fstatus\u002F1872724231999381790 Doesn't load with Javascript disabled https:\u002F\u002Funlace.app\u002Fthread\u002Fianwcrosby\u002Fstatus\u002F1872724231999381790…",[110,114],{"value":111,"source":78,"evidence":112},"Add a loading progress bar.",[113],{"id":85,"by":86,"text":87},{"value":115,"source":78,"evidence":116},"Archive unrolled threads to Internet Archive and archive.today.",[117],{"id":118,"by":119,"text":120},"42551580","toomuchtodo","Great work! Can I chip in to support archiving unrolled threads to the Internet Archive and archive.today (it’s a trivial HTTP request to do so)? I asked threadreaderapp.com for…",[122,126],{"value":123,"source":78,"evidence":124},"Why does one URL view work with JavaScript disabled and the other does not?",[125],{"id":106,"by":107,"text":108},{"value":127,"source":78,"evidence":128},"How is the Python backend hosted and deployed?",[129],{"id":130,"by":131,"text":132},"42555596","moon82","Thanks for sharing! Let me ask one quick question -- how do you host\u002Fdeploy python backend (x-api)?",[134,148,152],{"value":135,"source":78,"evidence":136},"Nitter instances such as xcancel.com and nitter.poast.org.",[137,141,144],{"id":138,"by":139,"text":140},"42552202","derdi","> I absolutely refuse to go to Twitter links anymore; why bother, they don't usually work unless you're logged in. Replace \"x.com\" by \"xcancel.com\" (or some other still working…",{"id":142,"by":82,"text":143},"42552978","> still working Nitter instance This is the issue with Nitter instances; they seem too ephemeral for reliable use.",{"id":145,"by":146,"text":147},"42557078","Akronymus","nitter.poast.org is pretty reliable for me.",{"value":149,"source":78,"evidence":150},"Thread to Markdown browser extension.",[151],{"id":89,"by":90,"text":91},{"value":153,"source":78,"evidence":154},"threadreaderapp.com",[155],{"id":118,"by":119,"text":120},{"comments":157,"answered":39,"key":158},14,[159,162,165],{"id":160,"text":161},"42551838","backend server's code is now available at https:\u002F\u002Fgithub.com\u002Fvednig\u002Fx-api , you can have a look there for more info.",{"id":163,"text":164},"42551710","Backend server's source code is now located at https:\u002F\u002Fgithub.com\u002Fvednig\u002Fx-api ,currently the script waits for complete page to load and then extracts info to send out a…",{"id":166,"text":167},"42552298","Xcancel is also a great service, it's a complete X replacement.",{"commenters":169,"max_depth":170,"maker_replies":157,"first_comment_mins":171,"lifespan_hours":172},10,6,498,79,[174,176,178,180,182,184,186,187,188,190,193,195,197,199,202,204,206,208,210,212,214,216,218,220,222,224,226],[81,28,31,175,82,28],"project\u002Fmixed\u002Fexecution",[85,28,31,177,86,28],"project\u002Fmixed\u002Fdesign",[160,28,28,179,10,30],"maker\u002Fneutral\u002Fdocs",[163,28,28,181,10,30],"project\u002Fneutral\u002Fexecution",[138,28,31,183,139,28],"project\u002Fneutral\u002Fnone",[166,28,28,185,10,30],"other\u002Fneutral\u002Fnone",[142,28,28,185,82,28],[145,28,28,185,146,28],[189,28,28,185,10,30],"42557596",[191,28,28,185,192,28],"42559587","KomoD",[194,28,28,181,10,30],"42552367",[196,28,28,181,10,30],"42574957",[89,30,39,198,90,28],"project\u002Fpositive\u002Fexecution",[200,30,28,201,10,30],"42552315","commenter\u002Fneutral\u002Fnone",[203,30,28,201,90,28],"42552519",[205,30,28,201,10,30],"42552713",[207,30,28,201,90,28],"42553155",[209,30,28,201,90,28],"42561055",[118,32,31,211,119,28],"project\u002Fneutral\u002Fidea",[52,32,28,213,10,30],"project\u002Fneutral\u002Fperformance",[106,31,30,215,107,28],"project\u002Fcritical\u002Fexecution",[217,31,28,181,10,30],"42553562",[130,219,31,181,131,28],4,[221,219,28,181,10,30],"42557591",[223,39,28,213,10,30],"42552030",[225,39,28,213,10,30],"42552376",[227,39,28,213,10,30],"42552690",[],[230,235,240,245,249,253],{"id":231,"name":232,"points":233,"category":234},"42565821","API Parrot",456,"dev_tools",{"id":236,"name":237,"points":238,"category":239},"42559744","trading.snagra.com",270,"ai",{"id":241,"name":242,"points":243,"category":244},"42534931","Anki AI Utils",253,"learning_science",{"id":246,"name":247,"points":248,"category":239},"42524848","DoodleDreams",242,{"id":250,"name":251,"points":252,"category":234},"42521769","GitDiagram",222,{"id":254,"name":255,"points":256,"category":257},"42513276","Trio",208,"creative",11,false,"v2",{"id":262,"name":5,"line":6,"ai":259,"cat":19,"year":12,"points":13,"comments":14,"rec":27,"s":28,"top":17,"kw":263,"maker":10,"domain":264,"tier":18,"attempts":28,"strip":265,"url":-1,"mix":266,"praise":77,"objection":98,"sub":20},42547538,[23,24,25,26],"","330030000000500000301030000",[30,31,32,30],1794036666483]