[{"description":"","id":0,"section":"2026","tags":["tutorial","mediawiki"],"title":"Glossary of ambiguous terms","uri":"https://river.me/blog/glossary/"},{"description":"","id":1,"section":"2025","tags":["cargo","performance"],"title":"Everything about cargo_attach","uri":"https://river.me/blog/attach/"},{"description":"","id":2,"section":"2025","tags":["cargo"],"title":"snake_case in Cargo sucks","uri":"https://river.me/blog/cargo-snake-case/"},{"description":"","id":3,"section":"2025","tags":["jigsaw_puzzles"],"title":"Gluing \u0026 framing a 9000-piece jigsaw","uri":"https://river.me/blog/puzzle-glue-9000/"},{"description":"","id":4,"section":"2025","tags":["firefox","windows","autohotkey"],"title":"How to fix Alt+Shift+S","uri":"https://river.me/blog/alt-shift-s/"},{"description":"","id":5,"section":"2025","tags":["jigsaw_puzzles"],"title":"Pink Water Lilies timelapse","uri":"https://river.me/blog/pink-water-lilies/"},{"description":"","id":6,"section":"2025","tags":["talk"],"title":"ParserPower, argmap, and iargmap","uri":"https://river.me/blog/argmap/"},{"description":"","id":7,"section":"2025","tags":["firefox"],"title":"Bookmark keywords, again","uri":"https://river.me/blog/bookmark-keywords-again/"},{"description":"When you edit a template, you will need to bypass cache somehow to see the effect of that edit on a content page","id":8,"section":"2025","tags":["tutorial","mediawiki"],"title":"How to see your template edits in action","uri":"https://river.me/blog/template-preview/"},{"description":"","id":9,"section":"2025","tags":["books"],"title":"Books published in 2024 (part 2)","uri":"https://river.me/blog/pub-in-2024-2/"},{"description":"","id":10,"section":"2025","tags":["books"],"title":"Books I read that were published in 2024","uri":"https://river.me/blog/pub-in-2024/"},{"description":"","id":11,"section":"2024","tags":[null],"title":"How to join the Wikipedia Discord","uri":"https://river.me/blog/wikipedia-discord/"},{"description":"","id":12,"section":"2024","tags":["mediawiki","best_practices"],"title":"The Tag That Shall Not Be Named","uri":"https://river.me/blog/the-tag-that-shall-not-be-named/"},{"description":"","id":13,"section":"2024","tags":null,"title":"A Great Comet live performance review","uri":"https://river.me/blog/natasha-pierre/"},{"description":"","id":14,"section":"2024","tags":null,"title":"What I have learned about 3D printing","uri":"https://river.me/blog/3d-printing/"},{"description":"","id":15,"section":"2024","tags":null,"title":"Give people early successes","uri":"https://river.me/blog/teaching-new-devs/"},{"description":"","id":16,"section":"2024","tags":["caching","mediawiki","css","javascript","cargo"],"title":"How to refresh cache in MediaWiki","uri":"https://river.me/blog/refreshing-cache/"},{"description":"","id":17,"section":"2024","tags":["news","python"],"title":"mwclient 0.11","uri":"https://river.me/blog/mwclient-0.11/"},{"description":"","id":18,"section":"2024","tags":["chainmaille","graph_theory"],"title":"How to make Moorish 8-4","uri":"https://river.me/blog/moorish-84/"},{"description":"","id":19,"section":"2024","tags":["best_practices","mediawiki"],"title":"Please use recentchanges","uri":"https://river.me/blog/recentchanges/"},{"description":"","id":20,"section":"2024","tags":["cargo"],"title":"Representing one-to-many relations","uri":"https://river.me/blog/one-to-many/"},{"description":"","id":21,"section":"2024","tags":["cargo","react","sorcerer"],"title":"Introducing the SORCERER example wiki","uri":"https://river.me/blog/sorcerer/"},{"description":"","id":22,"section":"2024","tags":["books"],"title":"Notes on \"Charlatan\" by Pope Brock","uri":"https://river.me/blog/book-charlatan/"},{"description":"","id":23,"section":"2024","tags":["books"],"title":"Notes on The Sleepwalkers: How Europe Went to War in 1914","uri":"https://river.me/blog/sleepwalkers-notes/"},{"description":"","id":24,"section":"2024","tags":["mediawiki"],"title":"What's up with Variables and Parsoid?","uri":"https://river.me/blog/variables-and-parsoid/"},{"description":"A review of and some notes on \"Building a StoryBrand\"","id":25,"section":"2024","tags":["books"],"title":"Book Review - Building a StoryBrand","uri":"https://river.me/blog/book-review-storybrand/"},{"description":"","id":26,"section":"2024","tags":["gadget_tools","javascript","css"],"title":"Gadget - Copy title","uri":"https://river.me/blog/copy-title/"},{"description":"","id":27,"section":"2024","tags":["mediawiki","css"],"title":"Style your code blocks with Pygments","uri":"https://river.me/blog/mw-pygments/"},{"description":"","id":28,"section":"2024","tags":["mediawiki"],"title":"Markdown vs Wikitext","uri":"https://river.me/blog/markdown-vs-wikitext/"},{"description":"","id":29,"section":"2024","tags":["cargo"],"title":"One-to-many tables \u0026 #vardefine","uri":"https://river.me/blog/one-to-many-vardefine/"},{"description":"","id":30,"section":"2024","tags":["mediawiki"],"title":"Send me your wiki-updating scripts!","uri":"https://river.me/blog/send-me-scripts/"},{"description":"","id":31,"section":"2024","tags":["tutorial","mediawiki"],"title":"Dealing with defaults","uri":"https://river.me/blog/default-params/"},{"description":"","id":32,"section":"2024","tags":["sublimetext","tutorial"],"title":"How to install Sublime Text \u0026 Mediawiker","uri":"https://river.me/blog/sublime-tutorial/"},{"description":"","id":33,"section":"2024","tags":["best_practices","mediawiki"],"title":"If {{NAMESPACE}} do nothing, otherwise...","uri":"https://river.me/blog/if-namespace/"},{"description":"A review of \"A Field Guide to Global Payments,\" including a table of initialisms used in the book.","id":34,"section":"2023","tags":["books"],"title":"Book Review - The Field Guide to Global Payments","uri":"https://river.me/blog/book-review-global-payments/"},{"description":"How can you enforce a sorting order on a Cargo field when displaying tabular data?","id":35,"section":"2023","tags":["cargo","best_practices"],"title":"Ordering a Cargo field","uri":"https://river.me/blog/cargo-order/"},{"description":"How to use ShareX image effects \u0026 spam your friends with rainbows","id":36,"section":"2023","tags":["sharex","tutorial"],"title":"ShareX image effects","uri":"https://river.me/blog/sharex-image-effects/"},{"description":"A guide to using Weblate as a translator","id":37,"section":"2023","tags":["weblate","tutorial"],"title":"How to use Weblate","uri":"https://river.me/blog/weblate/"},{"description":"Learn how to edit CSS interactively","id":38,"section":"2023","tags":["css","firefox","tutorial"],"title":"How to use Dev Tools","uri":"https://river.me/blog/dev-tools/"},{"description":"Embedding a grid on a surface doesn't really work, but we can approximate.","id":39,"section":"2023","tags":["pentominoes","graph_theory","topology"],"title":"Surfaces with pentominoes","uri":"https://river.me/blog/surfaces-with-pentominoes/"},{"description":"My journey of encoding pentominoes on surfaces into permalinks","id":40,"section":"2023","tags":["react","typescript","pentominoes"],"title":"Serialization woes","uri":"https://river.me/blog/serialization-woes/"},{"description":"I attended EMWCon 2023 remotely again in 2023 and finally gave the presentation everyone has been waiting for: I don't like infoboxes.","id":41,"section":"2023","tags":["talk","best_practices","mediawiki"],"title":"I don't like infoboxes - EMWCon 2023","uri":"https://river.me/blog/emwcon-2023-talk/"},{"description":"What are list-type fields? What *aren't* they? How do I query them?","id":42,"section":"2023","tags":["cargo","best_practices"],"title":"List-type fields, for realsies","uri":"https://river.me/blog/cargo-list-type-fields/"},{"description":"SublimeText extension Mediawiker 3.6.14 release update, plus some bonuses","id":43,"section":"2023","tags":["sublimetext","news"],"title":"Mediawiker 3.6.14","uri":"https://river.me/blog/mediawiker-3-6-14/"},{"description":"\"Everybody Writes\" was deeply disappointing to me because it wasn't the book I wanted to read. That said, I think it can be a valuable resource for people who want an introductory and accessible writing book.","id":44,"section":"2023","tags":["books"],"title":"Book review - Everybody Writes","uri":"https://river.me/blog/book-review-everybody-writes/"},{"description":"","id":45,"section":"2023","tags":["books","information-science"],"title":"How I found four marketing books","uri":"https://river.me/blog/found-marketing-books/"},{"description":"How to paste a transparent-background image file over another file using PIL, or WTF is a mask and how does it work?","id":46,"section":"2023","tags":["python","pil","tsubaki"],"title":"Paste a transparent-background image with PIL","uri":"https://river.me/blog/pil-mask/"},{"description":"An update on my time with Leaguepedia.","id":47,"section":"2022","tags":[null],"title":"Fandom update","uri":"https://river.me/blog/fandom-update/"},{"description":"A review of the book \"Recoding Gender: Women's Changing Participation in Computing\"","id":48,"section":"2022","tags":["books"],"title":"Book review - Recoding Gender","uri":"https://river.me/blog/book-review-recoding-gender/"},{"description":"Lua Branches is a prototype/proof-of-concept MediaWiki extension for making branches of Lua modules \u0026 their dependency chains.","id":49,"section":"2022","tags":["mediawiki_extensions","lua"],"title":"Lua Branches","uri":"https://river.me/blog/lua-branches/"},{"description":"I wrote my second-ever MediaWiki extension! Easily translate interface \u0026 navigational elements using a dedicated parser function, with native Lua support.","id":50,"section":"2022","tags":["news","mediawiki_extensions"],"title":"Live I18n","uri":"https://river.me/blog/live-i18n/"},{"description":"My EMWCon 2022 talk","id":51,"section":"2022","tags":["talk","emwcon","best_practices"],"title":"Handling internal data in MediaWiki","uri":"https://river.me/blog/handling-internal-data/"},{"description":"A relatively straightforward task turned out to be a bit more complicated because I didn't find the right page in the official documentation at first. So here's a post to tell you what I did wrong!","id":52,"section":"2022","tags":["hugo"],"title":"How to crosslink two Hugo blogs","uri":"https://river.me/blog/hugo-menus/"},{"description":"Custom Logs 1.0 has been released!","id":53,"section":"2022","tags":["news","mediawiki_extensions"],"title":"CustomLogs 1.0","uri":"https://river.me/blog/custom-logs-1-0/"},{"description":"A framework for inserting Lua errors into HTML tables using a singleton class","id":54,"section":"2022","tags":["lua","css"],"title":"Lua table errors","uri":"https://river.me/blog/table-errors/"},{"description":"A simple interface to automatically let users toggle columns in any data table on the entire wiki.","id":55,"section":"2022","tags":["lua","widgets","javascript","css","leaguepedia","mediawiki"],"title":"Toggleable columns","uri":"https://river.me/blog/toggleable-columns/"},{"description":"When I set up my fantasy blog, I had to configure a Hugo blog at a non-root location on my domain. This was easier than my Flask site, but it still took me some time to figure out what to do.","id":56,"section":"2022","tags":["hugo","nginx"],"title":"Serving Hugo from a non-root location with Nginx","uri":"https://river.me/blog/hugo-non-root-location/"},{"description":"How to organize your Hugo content folder into subfolders by year without affecting any URLs","id":57,"section":"2022","tags":["hugo"],"title":"Organize your Hugo content folder by year, without affecting any URLs","uri":"https://river.me/blog/hugo-content-by-year/"},{"description":"A review of \"Foundations of Library and Information Science\"","id":58,"section":"2021","tags":["books"],"title":"Book review - Foundations of Library and Information Science","uri":"https://river.me/blog/book-review-foundations-lis/"},{"description":"There's a number (haha) of ways to find namespace numbers; this is the one I find to be the easiest (plus some bonus options)","id":59,"section":"2021","tags":["mediawiki"],"title":"How to find a namespace number","uri":"https://river.me/blog/find-namespace-number/"},{"description":"Instead of putting all of your code experiments on a single page, make lots of little sandbox pages!","id":60,"section":"2021","tags":["best_practices","mediawiki"],"title":"Make lots of sandbox pages","uri":"https://river.me/blog/lot-of-sandbox-pages/"},{"description":"A tutorial for configuring Sphinx for Read the Docs for your Python projects","id":61,"section":"2021","tags":["python","sphinx"],"title":"How to set up Sphinx for Read the Docs","uri":"https://river.me/blog/how-to-readthedocs/"},{"description":"An overview of mwcleric","id":62,"section":"2021","tags":["news","python"],"title":"mwcleric, my Python MediaWiki client library","uri":"https://river.me/blog/mwcleric/"},{"description":"A review of \"The Elements of User Experience\"","id":63,"section":"2021","tags":["books"],"title":"Book review - The Elements of User Experience","uri":"https://river.me/blog/book-review-elements-user-experience/"},{"description":"A spiritual follow-up to my \"MediaWiki hotkeys (the useful ones)\" post, this time I go over my Firefox Gesturefy bindings and what I use them for when working with MediaWiki.","id":64,"section":"2021","tags":["firefox"],"title":"Mouse Gestures (the useful ones)","uri":"https://river.me/blog/mouse-gestures/"},{"description":"A review and chapter summaries of \"Free to All: Carnegie Libraries \u0026 American Culture, 1890-1920\"","id":65,"section":"2021","tags":["books"],"title":"Book review - Free to All","uri":"https://river.me/blog/book-review-free-to-all/"},{"description":"A Cargo field I was going to store as a timestamp but decided to store as a boolean instead","id":66,"section":"2021","tags":["cargo","best_practices"],"title":"I stored a boolean instead of a timestamp","uri":"https://river.me/blog/boolean-instead-of-timestamp/"},{"description":"A review of \"Celebration, U.S.A.: Living in Disney's Brave New Town\"","id":67,"section":"2021","tags":["books"],"title":"Book review - Celebration, U.S.A.","uri":"https://river.me/blog/book-review-celebration-usa/"},{"description":"A review of \"The Library as Place: History, Community, and Culture\"","id":68,"section":"2021","tags":["books"],"title":"Book review - Library as Place","uri":"https://river.me/blog/book-review-library-as-place/"},{"description":"A list of just the useful hotkeys/access keys in MediaWiki","id":69,"section":"2021","tags":["mediawiki"],"title":"MediaWiki hotkeys (the useful ones)","uri":"https://river.me/blog/mediawiki-hotkeys-useful/"},{"description":"A review of, including chapter-by-chapter notes on, \"Looking for Information: A Survey of Research on Information Seeking, Needs, and Behavior\"","id":70,"section":"2021","tags":["books"],"title":"Book review \u0026 notes -  Looking for Information","uri":"https://river.me/blog/book-review-looking-for-information/"},{"description":"A review of \"Strategic Writing for UX\"","id":71,"section":"2021","tags":["books"],"title":"Book review - Strategic Writing for UX","uri":"https://river.me/blog/book-review-strategic-writing-ux/"},{"description":"Similar to the copy category members gadget, but for search results - and more!","id":72,"section":"2021","tags":["gadget_tools"],"title":"Gadget - Copy search results","uri":"https://river.me/blog/copy-search/"},{"description":"A review of \"Writing and Designing Manuals and Warnings, Fifth Edition\"","id":73,"section":"2021","tags":["books"],"title":"Book review - Writing and Designing Manuals and Warnings","uri":"https://river.me/blog/book-review-writing-designing-manuals-warnings/"},{"description":"A quick CSS bugfix that was particularly satisfying - and interesting!","id":74,"section":"2021","tags":["css"],"title":"Bracket zoom bug","uri":"https://river.me/blog/bracket-zoom-bug/"},{"description":"A gadget to copy all members of a category","id":75,"section":"2021","tags":["gadget_tools","javascript"],"title":"Gadget - Copy category members","uri":"https://river.me/blog/copy-category-members/"},{"description":"An indepth introduction to frame objects in Scribunto","id":76,"section":"2021","tags":["lua"],"title":"Frame, wtf?","uri":"https://river.me/blog/frame-wtf/"},{"description":"My notes on \"Operating Systems: Three Easy Pieces\" - part 3, Persistence","id":77,"section":"2021","tags":["books"],"title":"Book notes - OSTEP (part 3)","uri":"https://river.me/blog/book-notes-ostep-3/"},{"description":"My notes on \"Operating Systems: Three Easy Pieces\" - part 2, Concurrency","id":78,"section":"2021","tags":["books"],"title":"Book notes - OSTEP (part 2)","uri":"https://river.me/blog/book-notes-ostep-2/"},{"description":"My notes on \"Operating Systems: Three Easy Pieces\" - part 1, Virtualization","id":79,"section":"2021","tags":["books"],"title":"Book notes - OSTEP (part 1)","uri":"https://river.me/blog/book-notes-ostep-1/"},{"description":"A review of \"Microcopy: The Complete Guide\"","id":80,"section":"2021","tags":["books"],"title":"Book review - Microcopy","uri":"https://river.me/blog/book-review-microcopy/"},{"description":"In the module namespace, it's nice to see categories at the top of the page, so let's do that","id":81,"section":"2021","tags":["css","gadget_tools"],"title":"Gadget - Top-of-page categories","uri":"https://river.me/blog/top-of-page-categories/"},{"description":"A bookmarklet that enables a prompt before navigating away from your current location","id":82,"section":"2021","tags":["firefox","javascript"],"title":"Bookmarklet - stay here","uri":"https://river.me/blog/bookmarklet-stay-here/"},{"description":"This one trick will save you 80% of your wikitext debugging time!","id":83,"section":"2021","tags":["best_practices","mediawiki"],"title":"Comment your closing braces","uri":"https://river.me/blog/comment-closing-braces/"},{"description":"The final of three Cargo queries I recently optimized on Leaguepedia","id":84,"section":"2021","tags":["Cargo","Leaguepedia","Lua"],"title":"Optimizing Cargo - query 3","uri":"https://river.me/blog/optimizing-cargo-3/"},{"description":"A review of the book \"Developing Quality Technical Information: A Handbook for Writers and Editors\"","id":85,"section":"2021","tags":["books"],"title":"Book review - Developing Quality Technical Information","uri":"https://river.me/blog/book-review-quality-technical-information/"},{"description":"Sublime Text 4 has been released! Here's what I'm excited about!","id":86,"section":"2021","tags":["news","sublimetext"],"title":"Sublime Text 4 is released!","uri":"https://river.me/blog/sublimetext-4/"},{"description":"At EMWCon 2021 (once again held virtually), I gave a talk about easily performing tasks with Python on MediaWiki wikis.","id":87,"section":"2021","tags":["emwcon","python","talk"],"title":"My EMWCon 2021 talk","uri":"https://river.me/blog/emwcon-2021-talk/"},{"description":"The second of three Cargo queries I recently optimized.","id":88,"section":"2021","tags":["cargo"],"title":"Optimizing Cargo - query 2","uri":"https://river.me/blog/optimizing-cargo-2/"},{"description":"A Cargo query I optimized recently on Leaguepedia","id":89,"section":"2021","tags":["cargo","leaguepedia","lua","lua_class_system"],"title":"Optimizing Cargo - query 1","uri":"https://river.me/blog/optimizing-cargo-1/"},{"description":"mwparserfromhell released version 0.6 a couple months ago with a couple really exciting changes!","id":90,"section":"2021","tags":["python","mwparserfromhell","news"],"title":"mwparserfromhell 0.6","uri":"https://river.me/blog/mwparserfromhell-0-6/"},{"description":"When debugging confusing Cargo queries, a module that just prints everything for you can be incredibly helpful","id":91,"section":"2021","tags":["cargo","lua"],"title":"A Lua module to print all args","uri":"https://river.me/blog/cargo-debug-print-all-args/"},{"description":"Our CSS-grid-powered tournament brackets on Leaguepedia","id":92,"section":"2021","tags":["css","html","leaguepedia","lua"],"title":"Tournament brackets (part 1)","uri":"https://river.me/blog/tournament-brackets/"},{"description":"A long story about how I corrected one of the biggest mistakes in my initial Cargo database design from two years ago","id":93,"section":"2021","tags":["cargo","leaguepedia","lua","lua_class_system"],"title":"Setting common match \u0026 game keys","uri":"https://river.me/blog/common-game-id/"},{"description":"I reinstalled Windows this month. Let's document what I did!","id":94,"section":"2021","tags":["windows","vscode"],"title":"Reinstalling Windows","uri":"https://river.me/blog/reinstalling-windows/"},{"description":"Use cases for my extension CustomLogs","id":95,"section":"2021","tags":["caching","javascript","leaguepedia","python","mediawiki_extensions"],"title":"Use cases for Extension:CustomLogs","uri":"https://river.me/blog/customlogs-use-cases/"},{"description":"A funny commit I made today","id":96,"section":"2021","tags":["cargo","leaguepedia","python"],"title":"Escape item[\"id\"]","uri":"https://river.me/blog/escape-item-id/"},{"description":"A couple lines of CSS to improve the user experience of Special:ListGroupRights","id":97,"section":"2021","tags":["gadget_tools","css","firefox"],"title":"Gadget - Improving Special:ListGroupRights CSS","uri":"https://river.me/blog/listgrouprights-css/"},{"description":"A list of books I read in 2019","id":98,"section":"2021","tags":["books"],"title":"Books I read in 2019","uri":"https://river.me/blog/books-in-2019/"},{"description":"A list of books I read in 2020","id":99,"section":"2021","tags":["books"],"title":"Books I read in 2020","uri":"https://river.me/blog/books-in-2020/"},{"description":"Firefox is considering removing bookmark keywords. They should keep them.","id":100,"section":"2021","tags":["firefox"],"title":"Firefox, keep bookmark keywords","uri":"https://river.me/blog/firefox-keep-bookmark-keywords/"},{"description":"In a recent patch, Riot introduced non-unique item names, and we had to create a system for dealing with this.","id":101,"section":"2020","tags":["leaguepedia","lua"],"title":"Non-unique item names","uri":"https://river.me/blog/non-unique-item-names/"},{"description":"I add line numbers to Lua modules with JS \u0026 CSS.","id":102,"section":"2020","tags":["gadget_tools","javascript","css","leaguepedia"],"title":"Gadget - Line numbers in modules","uri":"https://river.me/blog/line-numbers-modules/"},{"description":"Introducing a new repo containing example Python wiki scripts I write","id":103,"section":"2020","tags":["python","mediawiki_api","news"],"title":"Example wiki scripts","uri":"https://river.me/blog/example-wiki-scripts/"},{"description":"An improvement to the Cargo pagevalues view using just JS \u0026 CSS.","id":104,"section":"2020","tags":["gadget_tools","javascript","css","cargo"],"title":"Gadget - Cargo pagevalues improvement","uri":"https://river.me/blog/cargo-pagevalues-improvement/"},{"description":"Let's make a gadget so that Alt+Shift+E creates a new page from the Special:Search screen when a page doesn't exist!","id":105,"section":"2020","tags":["gadget_tools","javascript","leaguepedia","autohotkey"],"title":"Gadget - Search results new page hotkey","uri":"https://river.me/blog/search-new-page-hotkey/"},{"description":"A small JS gadget to disable display title for wiki editors","id":106,"section":"2020","tags":["gadget_tools","javascript","leaguepedia"],"title":"Gadget - Disable Display Title","uri":"https://river.me/blog/disable-display-title/"},{"description":"Multi-instance subtemplates are common in MediaWiki; when we're using Lua, they can be much more powerful than in wikitext.","id":107,"section":"2020","tags":["lua","mediawiki","leaguepedia"],"title":"Multi-Instance Subtemplates in Lua","uri":"https://river.me/blog/lua-multi-instance-subtemplates/"},{"description":"How I created a global site banner on Leaguepedia using the extension Header Footer and some JavaScript, but no api calls","id":108,"section":"2020","tags":["caching","leaguepedia","mediawiki","python"],"title":"Top Schedule","uri":"https://river.me/blog/top-schedule/"},{"description":"How to configure PWB for third-party wikis, specifically in Windows Subsystem for Linux","id":109,"section":"2020","tags":["pywikibot","windows","linux"],"title":"Run Pywikibot in Windows Subsystem for Linux","uri":"https://river.me/blog/pywikibot-windows-subsystem-linux/"},{"description":"When working with wikis, you can use your URL bar as a CLI-like interface for navigation, making your life a lot easier and more efficient!","id":110,"section":"2020","tags":["firefox","leaguepedia"],"title":"Your URL bar is a CLI","uri":"https://river.me/blog/url-bar-is-a-cli/"},{"description":"A bunch of things I did wrong because learning is fun!","id":111,"section":"2020","tags":["leaguepedia","lua"],"title":"CompoundRole","uri":"https://river.me/blog/compound-role/"},{"description":"Cargo actually provides a way to cleanly rename tables without any \"downtime,\" but it's not obvious or documented how to do this.","id":112,"section":"2020","tags":["caching","cargo","leaguepedia","best_practices"],"title":"How to rename Cargo tables safely","uri":"https://river.me/blog/rename-cargo-tables-safely/"},{"description":"What's a bot password? What's the difference between bot accounts and bot passwords? Why do I need all this anyway?","id":113,"section":"2020","tags":["mediawiki","best_practices"],"title":"Bot passwords \u0026 you (\u0026 your bot (\u0026 you))","uri":"https://river.me/blog/bot-passwords/"},{"description":"Sometimes it can seem convenient to use the built-in _pageName field that Cargo provides; however, _pageName is a metadata field, and you should take care to use it only as such.","id":114,"section":"2020","tags":["cargo","best_practices"],"title":"Don't use _pageName","uri":"https://river.me/blog/dont-use-pagename/"},{"description":"DisplayPort sucks in a multi-monitor setup and I'm celebrating not using it anymore.","id":115,"section":"2020","tags":["windows"],"title":"Die, DisplayPort!","uri":"https://river.me/blog/die-displayport/"},{"description":"I couldn't find much documentation on how to serve Flask with uWSGI and Nginx from a non-root location, so, here's some.","id":116,"section":"2020","tags":["flask","nginx","linux"],"title":"Serving Flask from a non-root location with Nginx","uri":"https://river.me/blog/flask-nginx-non-root-location/"},{"description":"In which I report a bug and discover I have to write an extension, sigh","id":117,"section":"2020","tags":["vscode"],"title":"Vscode 2","uri":"https://river.me/blog/vscode-2/"},{"description":"A new AutoHotKey mini-adventure, in which I want a hotkey to create a new tab in a specific container, but here there be dragons!","id":118,"section":"2020","tags":["autohotkey","firefox"],"title":"A new-tab-in-container Firefox hotkey","uri":"https://river.me/blog/new-tab-account-container/"},{"description":"Highlight Links In Category has a number of incredibly nice use cases; here I give some examples.","id":119,"section":"2020","tags":["mediawiki","mediawiki_extensions","leaguepedia"],"title":"Use cases for Highlight Links in Category","uri":"https://river.me/blog/highlight-links-in-category/"},{"description":"The pattern of store -\u003e query -\u003e store -\u003e query can lead to caching nightmares when working with Cargo or SMW in MediaWiki. This is the story of how I dealt with one.","id":120,"section":"2020","tags":["cargo","caching","leaguepedia","lua","mediawiki"],"title":"Adventures in caching primary keys","uri":"https://river.me/blog/primary-key-caching-adventures/"},{"description":"Here's how I've built a framework for both static and lazily-loaded popups.","id":121,"section":"2020","tags":["mediawiki","javascript","css","mediawiki_api"],"title":"Popups","uri":"https://river.me/blog/popups/"},{"description":"Last week I installed VSCode for the first time, after using exclusively SublimeText for about two years (and Notepad++ prior to that). I'm going to document my learning curve.","id":122,"section":"2020","tags":["vscode","sublimetext"],"title":"VSCode 1","uri":"https://river.me/blog/vscode-1/"},{"description":"Disambiguations are typically somewhat user-unfriendly; I describe my method for improving quality of life when disambiguation links do appear.","id":123,"section":"2020","tags":["mediawiki","javascript","lua","cargo","css"],"title":"Highlighting disambiguations","uri":"https://river.me/blog/disambig-highlight/"},{"description":"CharInsert is one of my favorite extensions. Here's how I made a Lua wrapper for it to create a user-friendly interface for anyone to add snippets they want.","id":124,"section":"2020","tags":["mediawiki","mediawiki_extensions","javascript","lua"],"title":"CharInsert: Why you should \"char\"","uri":"https://river.me/blog/charinsert/"},{"description":"The \"Mediawiker\" plugin makes Sublime the best IDE-like experience for editing wikis, particularly when one is primarily writing Scribunto/Lua modules. Here's how I've set up my environment.","id":125,"section":"2020","tags":["sublimetext","mediawiki"],"title":"Sublimetext for Mediawiki","uri":"https://river.me/blog/sublime-for-mediawiki/"},{"description":"At EMWCon 2020, I gave one talk and hosted two Create Camp sessions, discussing different aspects of usage of Cargo and Lua in MediaWiki.","id":126,"section":"2020","tags":["emwcon","mediawiki","talk"],"title":"My EMWCon 2020 Talks","uri":"https://river.me/blog/emwcon-2020-talks/"},{"description":"The story of the April Fools Day joke for 2020 that I didn't do, and the \"Snap\" that we may or may not still do.","id":127,"section":"2020","tags":["leaguepedia"],"title":"The Anti-Thanos Snap That Wasn't","uri":"https://river.me/blog/anti-thanos-april-fools/"},{"description":"The Gadgets extension is a great way to organize code instead of using Common.css and Common.js for everything.","id":128,"section":"2020","tags":["mediawiki","javascript","css"],"title":"Gadgets for code organization","uri":"https://river.me/blog/gadgets-for-code-organization/"},{"description":"I document my system of using hooks in Scribunto before removing it from my wiki.","id":129,"section":"2020","tags":["mediawiki","lua"],"title":"Lua Hooks System","uri":"https://river.me/blog/lua-hooks-system/"},{"description":"How to set up a global hotkey to toggle mute a tab of Firefox (for example a Twitch stream) using AutoHotKey","id":130,"section":"2020","tags":["autohotkey","firefox"],"title":"Setting up a global hotkey to mute-unmute a Firefox stream","uri":"https://river.me/blog/global-hotkey-mute-firefox-stream/"},{"description":"Using the MediaWiki API doesn't require coding.","id":131,"section":"2020","tags":["mediawiki","mediawiki_api"],"title":"Using the Mediawiki API without coding","uri":"https://river.me/blog/mediawiki-api-without-coding/"},{"description":"Managing complexity using Cargo with MediaWiki to track League of Legends esports roster changes.","id":132,"section":"2020","tags":["caching","cargo","leaguepedia","mediawiki"],"title":"Determining team members from roster change data: A Leaguepedia case study","uri":"https://river.me/blog/team-members-cargo-options/"},{"description":"How to disable autocompletion in SublimeText markdown syntax","id":133,"section":"2020","tags":["sublimetext"],"title":"Fixing autocomplete in Sublimetext Markdown syntax","uri":"https://river.me/blog/sublime-markup-code-intel/"},{"description":"About - RheingoldRiver","id":134,"section":"","tags":null,"title":"About","uri":"https://river.me/about/"},{"description":"A post about how to create workarounds in MediaWiki in a reasonably well-controlled manner.","id":135,"section":"2020","tags":["mediawiki","cargo","lua","javascript"],"title":"How to add Cargo docstrings on table pages","uri":"https://river.me/blog/cargo-docstrings/"},{"description":"An overview of the process I used to create our single-source-of-truth roster change database tables on Leaguepedia.","id":136,"section":"2020","tags":["leaguepedia","mediawiki","cargo"],"title":"New Roster Changes","uri":"https://river.me/blog/new-roster-changes/"}]