{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"blog_tag","url":"https://ejfox.com/blog/tag/journalism","json_url":"https://ejfox.com/blog/tag/journalism.json","generator":"ejfox.com/json-twin@1","data":{"tag":"journalism","count":10,"posts":[{"slug":"2013/the-magazine-experience-on-the-web","title":"The Magazine Experience on the Web","date":"2013-01-25T10:00:00.000Z","type":"words","hidden":false,"dek":"In which the author muses about 2013-era web design aesthetics","modified":"2026-01-04T01:37:32.000Z","tags":["journalism","webdesign","photography"],"toc":[{"text":"The Magazine Experience on the Web","slug":"the-magazine-experience-on-the-web","level":"h2","children":[{"text":"A hint of what's to come","slug":"a-hint-of-whats-to-come","level":"h3","children":[]},{"text":"Full Bleed Photos","slug":"full-bleed-photos","level":"h3","children":[]},{"text":"Collecting stories differently","slug":"collecting-stories-differently","level":"h3","children":[]},{"text":"Seamlessly importing more mediums","slug":"seamlessly-importing-more-mediums","level":"h3","children":[]},{"text":"Great presentation requires great stories","slug":"great-presentation-requires-great-stories","level":"h3","children":[]},{"text":"Everything should be naturally responsive","slug":"everything-should-be-naturally-responsive","level":"h3","children":[]},{"text":"Finding the path","slug":"finding-the-path","level":"h3","children":[]}]}],"metadata":{"dek":"In which the author muses about 2013-era web design aesthetics","type":"words","hidden":false,"inprogress":false,"date":"2013-01-25T10:00:00.000Z","modified":"2026-01-04T01:37:32.000Z","tags":["journalism","webdesign","photography"],"words":1539,"images":0,"imageDetails":{"total":0,"cloudinary":0,"withDimensions":0},"links":31,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"The Magazine Experience on the Web","slug":"the-magazine-experience-on-the-web","level":"h2","children":[{"text":"A hint of what's to come","slug":"a-hint-of-whats-to-come","level":"h3","children":[]},{"text":"Full Bleed Photos","slug":"full-bleed-photos","level":"h3","children":[]},{"text":"Collecting stories differently","slug":"collecting-stories-differently","level":"h3","children":[]},{"text":"Seamlessly importing more mediums","slug":"seamlessly-importing-more-mediums","level":"h3","children":[]},{"text":"Great presentation requires great stories","slug":"great-presentation-requires-great-stories","level":"h3","children":[]},{"text":"Everything should be naturally responsive","slug":"everything-should-be-naturally-responsive","level":"h3","children":[]},{"text":"Finding the path","slug":"finding-the-path","level":"h3","children":[]}]}],"slug":"2013/the-magazine-experience-on-the-web"}},{"slug":"2020/online-brigades-gaming-twitter","title":"Online Nazis Have Figured Out How To Game Twitter","date":"2020-02-14T21:19:39-04:00","type":"words","hidden":false,"dek":"The newest weapon in the arsenal of internet nazis is mass-brigading Twitter reports, and it’s working","tags":["activism","journalism","twitter","security"],"toc":[{"text":"Online Nazis Have Figured Out How To Game Twitter","slug":"online-nazis-have-figured-out-how-to-game-twitter","level":"h1","children":[]}],"metadata":{"dek":"The newest weapon in the arsenal of internet nazis is mass-brigading Twitter reports, and it’s working","type":"words","hidden":false,"inprogress":false,"date":"2020-02-14T21:19:39-04:00","tags":["activism","journalism","twitter","security"],"words":447,"images":0,"imageDetails":{"total":0,"cloudinary":0,"withDimensions":0},"links":7,"codeBlocks":0,"headers":{"h1":1},"toc":[{"text":"Online Nazis Have Figured Out How To Game Twitter","slug":"online-nazis-have-figured-out-how-to-game-twitter","level":"h1","children":[]}],"slug":"2020/online-brigades-gaming-twitter"}},{"slug":"2020/things-ive-learned-about-elections","title":"Things I've learned about elections","date":"2020-02-09T03:19:38.000Z","type":"words","hidden":false,"dek":"In which we explore the knotted beauty of American democracy","modified":"2024-09-23T16:13:21.000Z","tags":["elections","politics","data","journalism","media","research"],"toc":[{"text":"Things I've learned about elections","slug":"things-ive-learned-about-elections","level":"h2","children":[{"text":"Edge cases","slug":"edge-cases","level":"h3","children":[]},{"text":"Races","slug":"races","level":"h3","children":[]},{"text":"Voting","slug":"voting","level":"h3","children":[]},{"text":"Reporting units","slug":"reporting-units","level":"h3","children":[]},{"text":"Election data","slug":"election-data","level":"h3","children":[]},{"text":"Primary elections","slug":"primary-elections","level":"h3","children":[]},{"text":"Voting machines","slug":"voting-machines","level":"h3","children":[]},{"text":"Coverage of elections","slug":"coverage-of-elections","level":"h3","children":[]},{"text":"Why do we have elections on Tuesdays?","slug":"why-do-we-have-elections-on-tuesdays","level":"h3","children":[]},{"text":"Resources","slug":"resources","level":"h3","children":[]}]}],"metadata":{"dek":"In which we explore the knotted beauty of American democracy","type":"words","hidden":false,"inprogress":true,"date":"2020-02-09T03:19:38.000Z","modified":"2024-09-23T16:13:21.000Z","tags":["elections","politics","data","journalism","media","research"],"words":2369,"images":1,"imageDetails":{"total":1,"cloudinary":0,"withDimensions":0},"links":71,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"Things I've learned about elections","slug":"things-ive-learned-about-elections","level":"h2","children":[{"text":"Edge cases","slug":"edge-cases","level":"h3","children":[]},{"text":"Races","slug":"races","level":"h3","children":[]},{"text":"Voting","slug":"voting","level":"h3","children":[]},{"text":"Reporting units","slug":"reporting-units","level":"h3","children":[]},{"text":"Election data","slug":"election-data","level":"h3","children":[]},{"text":"Primary elections","slug":"primary-elections","level":"h3","children":[]},{"text":"Voting machines","slug":"voting-machines","level":"h3","children":[]},{"text":"Coverage of elections","slug":"coverage-of-elections","level":"h3","children":[]},{"text":"Why do we have elections on Tuesdays?","slug":"why-do-we-have-elections-on-tuesdays","level":"h3","children":[]},{"text":"Resources","slug":"resources","level":"h3","children":[]}]}],"slug":"2020/things-ive-learned-about-elections"}},{"slug":"2025/paramilitary-telegram-leaks-001","title":"Processing Telegram Leaks for Fast Web Visualization","date":"2025-03-09T17:49:01.000Z","type":"post","dek":"In which I describe my workflow for transforming a Telegram database dump into a web-friendly format for analysis and visualization","modified":"2025-03-16T01:25:05.000Z","tags":["data","dataviz","journalism","politics"],"toc":[{"text":"Paramilitary Telegram Leaks: From Dump To Data","slug":"paramilitary-telegram-leaks-from-dump-to-data","level":"h2","children":[]},{"text":"From SQLite to Parquet: Processing Telegram Leaks for Fast Web Visualization","slug":"from-sqlite-to-parquet-processing-telegram-leaks-for-fast-web-visualization","level":"h2","children":[{"text":"The Challenge","slug":"the-challenge","level":"h3","children":[]},{"text":"The Workflow","slug":"the-workflow","level":"h3","children":[]},{"text":"The Frontend","slug":"the-frontend","level":"h3","children":[]},{"text":"Data Exploration Examples","slug":"data-exploration-examples","level":"h3","children":[]},{"text":"Building Custom Visualizations","slug":"building-custom-visualizations","level":"h3","children":[]}]}],"metadata":{"date":"2025-03-09T17:49:01.000Z","modified":"2025-03-16T01:25:05.000Z","title":"Processing Telegram Leaks for Fast Web Visualization","dek":"In which I describe my workflow for transforming a Telegram database dump into a web-friendly format for analysis and visualization","inprogress":true,"tags":["data","dataviz","journalism","politics"],"words":782,"images":6,"imageDetails":{"total":6,"cloudinary":6,"withDimensions":0},"links":21,"codeBlocks":5,"headers":{"h2":2},"toc":[{"text":"Paramilitary Telegram Leaks: From Dump To Data","slug":"paramilitary-telegram-leaks-from-dump-to-data","level":"h2","children":[]},{"text":"From SQLite to Parquet: Processing Telegram Leaks for Fast Web Visualization","slug":"from-sqlite-to-parquet-processing-telegram-leaks-for-fast-web-visualization","level":"h2","children":[{"text":"The Challenge","slug":"the-challenge","level":"h3","children":[]},{"text":"The Workflow","slug":"the-workflow","level":"h3","children":[]},{"text":"The Frontend","slug":"the-frontend","level":"h3","children":[]},{"text":"Data Exploration Examples","slug":"data-exploration-examples","level":"h3","children":[]},{"text":"Building Custom Visualizations","slug":"building-custom-visualizations","level":"h3","children":[]}]}],"type":"post","slug":"2025/paramilitary-telegram-leaks-001"}},{"slug":"projects/ccrb-clusters","title":"Clusters of NYPD Misconduct","date":"2021-06-15T04:00:00.000Z","type":"post","modified":"2025-08-26T19:52:56.000Z","tags":["data","nypd","journalism","database"],"toc":[],"metadata":{"title":"Clusters of NYPD Misconduct","date":"2021-06-15T04:00:00.000Z","modified":"2025-08-26T19:52:56.000Z","url":"https://gothamist.com/news/mapping-clusters-nypd-officers-repeatedly-accused-misconduct","tech":["Neo4j","SQLite","Gephi","Network Analysis","Cypher"],"featured":true,"state":"deployed","aiInvolvement":"human-only","context":"client","tags":["data","nypd","journalism","database"],"words":114,"images":2,"imageDetails":{"total":2,"cloudinary":2,"withDimensions":0},"links":2,"codeBlocks":0,"headers":{},"toc":[],"type":"post","slug":"projects/ccrb-clusters"}},{"slug":"projects/dataproofer","title":"Dataproofer","date":"2015-11-03T05:00:00.000Z","type":"post","modified":"2025-08-26T19:53:33.000Z","tags":["data","javascript","tool","journalism"],"toc":[],"metadata":{"title":"Dataproofer","date":"2015-11-03T05:00:00.000Z","modified":"2025-08-26T19:53:33.000Z","url":"https://github.com/dataproofer/Dataproofer","tech":["JavaScript","Electron","Data Quality","CSV"],"featured":false,"state":"deployed","aiInvolvement":"human-only","context":"collaborative","tags":["data","javascript","tool","journalism"],"words":157,"images":1,"imageDetails":{"total":1,"cloudinary":1,"withDimensions":0},"links":3,"codeBlocks":1,"headers":{},"toc":[],"type":"post","slug":"projects/dataproofer"}},{"slug":"projects/nbcnews-specials","title":"NBC News Specials","date":"2016-12-14T20:01:50.000Z","type":"post","modified":"2025-08-13T16:01:12.000Z","tags":["dataviz","journalism","webdesign","elections"],"toc":[],"metadata":{"title":"NBC News Specials","date":"2016-12-14T20:01:50.000Z","modified":"2025-08-13T16:01:12.000Z","url":"https://nbcnews.com/specials","context":"client","tags":["dataviz","journalism","webdesign","elections"],"words":104,"images":3,"imageDetails":{"total":3,"cloudinary":3,"withDimensions":0},"links":10,"codeBlocks":0,"headers":{},"toc":[],"type":"post","slug":"projects/nbcnews-specials"}},{"slug":"reading/Hastings-The Last Magazine","title":"The Last Magazine","type":"post","tags":["book","journalism","writing"],"toc":[{"text":"The Last Magazine","slug":"the-last-magazine","level":"h1","children":[{"text":"Highlights","slug":"highlights","level":"h2","children":[]},{"text":"Metadata","slug":"metadata","level":"h2","children":[]}]}],"metadata":{"kindle-sync":{"bookId":"14217","title":"The Last Magazine: A Novel","author":"Michael Hastings","asin":"B00G3L7TRM","lastAnnotatedDate":"2019-04-11","bookImageUrl":"https://m.media-amazon.com/images/I/819oeJKp3wL._SY160.jpg","highlightsCount":6},"tags":["book","journalism","writing"],"words":304,"images":0,"imageDetails":{"total":0,"cloudinary":0,"withDimensions":0},"links":1,"codeBlocks":0,"headers":{"h1":1},"toc":[{"text":"The Last Magazine","slug":"the-last-magazine","level":"h1","children":[{"text":"Highlights","slug":"highlights","level":"h2","children":[]},{"text":"Metadata","slug":"metadata","level":"h2","children":[]}]}],"type":"post","slug":"reading/Hastings-The Last Magazine"}},{"slug":"reading/Kramer-Call-Telling True Stories","title":"Telling True Stories","type":"post","tags":["book","journalism","writing"],"toc":[{"text":"Telling True Stories","slug":"telling-true-stories","level":"h1","children":[{"text":"Highlights","slug":"highlights","level":"h2","children":[]},{"text":"Metadata","slug":"metadata","level":"h2","children":[]}]}],"metadata":{"kindle-sync":{"bookId":"16215","title":"Telling True Stories: A Nonfiction Writers' Guide from the Nieman Foundation at Harvard University","author":"Mark Kramer and Wendy Call","asin":"B000SEH1KK","lastAnnotatedDate":"2020-09-02","bookImageUrl":"https://m.media-amazon.com/images/I/91i1oLvTQGL._SY160.jpg","highlightsCount":7},"tags":["book","journalism","writing"],"words":291,"images":0,"imageDetails":{"total":0,"cloudinary":0,"withDimensions":0},"links":1,"codeBlocks":0,"headers":{"h1":1},"toc":[{"text":"Telling True Stories","slug":"telling-true-stories","level":"h1","children":[{"text":"Highlights","slug":"highlights","level":"h2","children":[]},{"text":"Metadata","slug":"metadata","level":"h2","children":[]}]}],"type":"post","slug":"reading/Kramer-Call-Telling True Stories"}},{"slug":"week-notes/2024-37","title":"Overview of the Week","date":"2024-09-09T14:55:30.000Z","type":"post","modified":"2024-09-23T13:52:21.000Z","tags":["weekly-notes","reflections","progress","elections","journalism","politics"],"toc":[{"text":"Overview of the Week","slug":"overview-of-the-week","level":"h2","children":[]}],"metadata":{"tags":["weekly-notes","reflections","progress","elections","journalism","politics"],"modified":"2024-09-23T13:52:21.000Z","date":"2024-09-09T14:55:30.000Z","words":560,"images":27,"imageDetails":{"total":27,"cloudinary":26,"withDimensions":0},"links":27,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"Overview of the Week","slug":"overview-of-the-week","level":"h2","children":[]}],"type":"post","slug":"week-notes/2024-37"}}]},"_links":{"self":"https://ejfox.com/blog/tag/journalism.json","html":"https://ejfox.com/blog/tag/journalism","tag_page":"/tag/journalism.json"}}