User:Xinacod
If you find this page on any site other than a Wikimedia one, you are viewing a mirror site. Be aware that the page may be outdated, and that the user whom this page is about may have no personal affiliation with the site. The original page is located at https://meta.wikimedia.org/wiki/User:Xinacod .
Wikimedia Foundation
Hi, I'm Kaja Erik Obinna (Xinacod on Wikimedia). I'm a backend Python developer and DevOps engineer passionate about open source, free knowledge, and building tools that serve communities at scale.
I first joined the Wikimedia technical community through Outreachy Round 31 (December 2025 – March 2026), where I worked on rewriting the PendingChangesBot from PHP to Python as part of Wikimedia Finland's effort to modernize the FlaggedRevisions workflow for Finnish Wikipedia and other wikis. I am currently preparing a proposal for Google Summer of Code 2026 with the Wikimedia Foundation.
* GitHub: xenacode-art * LinkedIn: Erik Obinna * Phabricator: Xinacod * Deployed tool: pendingchangesbot.toolforge.org
Outreachy Round 31: PendingChangesBot-ng Project Overview
Project: Rewriting PendingChangesBot from PHP to Python
Organization: Wikimedia Finland
Mentors: Zache, adiba_anjum, Ademola
Repository: PendingChangesBot-ng
The PendingChangesBot (SeulojaBot) automatically reviews edits in Finnish Wikipedia using the FlaggedRevisions extension. The goal was to rewrite the original 2016 PHP proof-of-concept in Python/Django with a proper web interface, multi-wiki support, and a path toward LLM-based edit analysis.
Key Contributions
Infrastructure & Authentication
* Implemented Wikimedia OAuth 1.0a in Django on Toolforge
* Discovered and resolved Pywikibot multi-user credential caching bug;
migrated to mwclient for thread-safe concurrent-user OAuth
* Configured Django multi-database setup: tool database (MariaDB) +
wiki replica databases (Meta-Wiki, fiwiki_p, dewiki_p)
* Deployed working application: pendingchangesbot.toolforge.org
Statistics & Data Pipeline
* Implemented direct SQL access to Wikimedia wiki replica databases
(bypassing deprecated SupersetQuery approach)
* Created WikiReplicaConnection context manager for safe connection lifecycle
* Loaded 715+ FlaggedRevs statistics records across Finnish and German Wikipedia
* Built REST API endpoints for statistics aggregation and multi-wiki visualization
Bot Control Interface
* Built Phase 2 bot control panel: start/stop bot, manual review triggering,
real-time status via Vue.js auto-refresh
* Implemented role-based permission system querying MediaWiki user groups API
(Admin / Reviewer / Public roles)
* Built audit logging middleware and BotDecisionLog model for public transparency
FlaggedRevs API Integration * Implementedget_pending_changes_status()in WikiClient usingaction=query&prop=flagged* Wrote 7 unit tests covering page ID queries, title queries, error handling, and edge cases
Testing * 44+ unit tests across PendingChangesBot-ng and Pywikibot contributions * All CI/CD checks passing (pytest, Ruff, bandit, mypy, safety)
Pull Requests
* PR #163 — Direct SQL access for statistics (1,202 additions) * PR #165 — Bot control interface * PR #166 — Permissions system * PR #168 — Public statistics dashboard + FlaggedRevs API
Upstream Pywikibot Contributions
* Gerrit +1224790 — Optimize WikiWho pickle file storage with subdirectory structure (T414087) — reduces files per directory from ~7M to ~7K * T414075 — Compression investigation: achieved ×ばつ compression ratio, potential 84% storage reduction (5.3 TB → 858 GB) for enwiki WikiWho data
=== Weekly Reports ===
| Week | Period | Highlights |
|---|---|---|
| 1 | Dec 8–12, 2025 | Django OAuth setup, Toolforge deployment, mwclient migration |
| 2 | Dec 15–21, 2025 | REST API, Vue.js frontend, i18n (EN/FI), testing pipeline |
| 3 | Dec 22–26, 2025 | Static files (WhiteNoise), CSP, database credential fixes |
| 4 | Dec 29 – Jan 2, 2026 | Direct SQL wiki replica access, 350+ statistics records loaded |
| 5 | Jan 5–10, 2026 | 37 unit tests, multi-wiki (fi+de), Gerrit T414087, compression research |
| 6 | Jan 13–17, 2026 | Mid-point review, revised timeline, identified Phase 2 gap |
| 7 | Jan 18–22, 2026 | Bot control interface (Phase 2), process management, Vue.js panel |
| 8 | Jan 26–30, 2026 | Permissions system, Gerrit rebase, role-based access control |
| 9 | Feb 2–6, 2026 | Statistics export (JSON/CSV), public dashboard (Phase 3) |
| 10 | Feb 9–13, 2026 | Integration: bot status widget on statistics, Chart.js improvements |
| 11 | Feb 16–20, 2026 | FlaggedRevs API integration, get_pending_changes_status()
|
Technical Skills
| Area | Technologies |
|---|---|
| Backend | Python, Django, Flask, Django REST Framework, Celery |
| Wikimedia stack | Pywikibot, mwclient, MediaWiki API, FlaggedRevs API, Toolforge |
| Databases | MariaDB/MySQL, SQLite, SQLAlchemy, Django ORM, wiki replica databases |
| Frontend | Vue.js 3, JavaScript, HTML/CSS, Chart.js |
| DevOps | Docker, Redis, GitHub Actions, CI/CD, uWSGI, WhiteNoise |
| Version control | Git, GitHub, Gerrit (Wikimedia code review) |
| Testing | pytest, unittest.mock, bandit, mypy, Ruff |
Userboxes
Contact ; Wikimedia Zulip : Find me in #GSoC2026 ; Phabricator : phab:Xinacod ; GitHub : xenacode-art