for journalism.
code for investigative newsrooms · data journalism · OSINT · human-rights research
Eight years as a fixer and investigative reporter for the Yomiuri Shimbun, the Financial Times, the Guardian, and Amnesty International Turkey — then I started writing Python. Now I build tooling for newsrooms and human-rights organisations: OSINT pipelines, public-record parsers, graph analyses of institutional data. The instincts are the same; the output is code.
[01] batu@batu0:~/for-journalism/past-engagements
- EuroMed Rights (Contract, Nov 2023 – May 2024, Copenhagen/remote) — data-engineering for the judicial-independence research programme; extended the BitzeOOP pipeline into deliverables that informed two published investigative reports.
- Amnesty International Turkey (Oct 2019 – Sep 2023) — Trial Observation Programme Officer. Four years attending court hearings on free speech, press freedom, and impunity; detailed reports, lawyer liaison, published explanatory articles.
- P24 Independent Journalism Foundation (Jun 2019 – Feb 2021) — 1 of 4 scholarship winners. Investigated Istanbul's taxi industry through 50+ FOI requests to 8 state institutions; published in T24, featured in a YouTube documentary.
- Yomiuri Shimbun, Cairo HQ (Nov 2015 – Dec 2018) — Turkey & Middle East Consultant. Reports on political, economic, and cultural developments; interviews under coup, post-terror, and state-of-emergency conditions.
[02] batu@batu0:~/for-journalism/tooling
- BitzeOOP — 60,000+ Turkish judicial appointments over 13 years, normalized from messy PDF/CSV gazettes into person-level career histories. Neo4j graph of people / posts / appointments / locations; transition analysis and anomaly detection. Informed 2 EuroMed Rights reports.
- Court Files Parser — extracted 4 years of hearing records and indictments from a free-journalism archive; exported crimes / judges / prosecutors to CSV for follow-on analysis.
- Jurisprudence Pipeline — end-to-end pipeline over 8M+ Turkish Court of Cassation decisions and 12K Constitutional Court decisions: scrapers, normalizers, and NLP ops (TensorFlow + NLTK + scikit-learn + pytesseract) for categorization, topic modeling, and text enrichment.
- Parliament MPs performance-stats scraper — Turkish parliament website scraper extracting question proposals, research proposals, parliamentary questions, and MP resumes; item pipelines aggregating parallel pages.
- TBMM Observation Engine (Jan – Apr 2025) — Turkish Grand National Assembly observation pipeline reading the daily parliamentary record (tutanak). Scrapy with Puppeteer middleware; ~68 commits. Successor to the MPs performance-stats scraper above — same target, larger scope.
- News archive scraper — crawled news sites backward into a database for archival and search.
[03] batu@batu0:~/for-journalism/how-i-collaborate
The work I take: one-off OSINT data pipelines tied to a specific investigation, in-house tool building for a newsroom's recurring data needs, stringer-with-Python engagements (I find the story and build the scaffolding), and consulting for human-rights organisations that need engineering depth without a full-time hire. I also read Turkish and have low-level Ottoman, which matters for judicial and archival sources.
Any of the tooling above can also be re-used for broader engineering needs. See the general /hire page for backend and LLM-systems work.