Fandom Developers Wiki

KABL00EY11 KABL00EY11 15 June

Fandom Editing Guide For Dummies

This can be used for a main page for a wiki, a userpage greeting or anything you desire.

for external.

Read Full Post
Jells.b Jells.b 15 February

Deep Learning Models in Production - our presentation on WiMLDS Poznań 20th Meetup

On 30th May 2023, Fandom proudly hosted the WiMLDS Poznań 20th Meetup and Julia from our ML Engineering Team gave one of two exciting presentations.

The speech is a technical deep dive into practicalities when it comes to serving multiple deep learning models on a daily basis. It consists of two main parts:

  1. We start with introducing the project and our current working environment, and explain why we picked Sagemaker Batch Transform Inference to efficiently serve various classification models for Fandom articles.
  2. Second part of presentation describes a couple of optimisation techniques for time and cost-efficient usage of GPU on a large scale. The combination of all techniques yields an impressive result of triple cost reduction!

The recording …

Read Full Post
TimmyQuivy TimmyQuivy 20 November 2023

Fandom Is Not Rendering Links to - Here's Why

Hello everyone,

I want to make a formal announcement of a technical change we recently made to our platform.

Starting last week, Fandom began to not render links to the wiki network In order to facilitate this, we made a change to our blacklist that affects these links on the parser level. This means the inputted link is instead rendered as plaintext with no clickability. The domain itself is not blocked (i.e. we don’t prevent an edit with the URL referenced).

Over the last week, as caches expired, this change became more and more visible. As of today, this process should be complete and no links are currently rendered.

In monitoring our network, we have been aware for weeks now of what appears to be a coordinated push …

Read Full Post
Rail Rail 30 July 2023

Integrating your wiki with Mastodon

For context, this is my entirely personal project I did for fun and because I like the idea of the Fediverse and open source social media platforms. Everything here has been written in my free time, I hope you'll find it useful.

Mastodon is an open source, decentralized social networking platform offering microblogging features that are in many ways similar to what Twitter used to offer.

Given Twitter's recent rapidly evolving policies (kudos to Kirkburn for coming up with that phrasing, I love it), including its latest rebranding to "X", many users may feel like they want to find an alternative for their wiki's social media presence on Twitter, and Mastodon is just such an alternative.

There are many technical, cultural and political differe…

Read Full Post
Proclus97 Proclus97 6 July 2023

How to Do SEO for Technology Companies Step-by-Step Guide

Technology companies face a highly competitive landscape where online visibility is crucial for success.

That’s why a comprehensive understanding and application of Search Engine Optimization (SEO) strategies can make a significant difference. SEO tries to optimize a website's content, structure, and online presence to appear higher in search engine results. It is a must-have skill for any tech company aiming to stay ahead of the competition.

As algorithms change and evolve, the rules of SEO change as well, and tech companies must be agile enough to keep up.

This guide will provide you with key insights and tips to use SEO in a technology company, helping you reach your target audience more effectively, increase your organic traffic, and boos…

Read Full Post
Snowdaythirtytwo-fduser Snowdaythirtytwo-fduser 25 June 2023


skibidi dop dop

Read Full Post
Snowdaythirtytwo-fduser Snowdaythirtytwo-fduser 25 June 2023

personal thing!

@import "/load.php?mode=articles&articles=u:dev:MediaWiki:OasisRevived.css&only=styles";

how do you use @import correctly (ignore the title)

Read Full Post
Jmalyszko Jmalyszko 24 February 2023

How to maintain order in the versioning and lifecycle policies of your S3 buckets

I know that topics such as cloud storage may not seem exciting, but I find S3 to be just as cool as it can be. With S3, you can store as much data as you need, and add an analytics layer on top to create a fully operational Data Lake. This has proven to be very useful for the Data Engineering team at Fandom.

Still, as you accumulate numerous datasets and pipelines, things can become complicated and expensive. S3 provides options for object versioning and lifecycle policies, but if you do not pay attention to these things, at some stage you may find yourself in a situation where you have no idea what data actually still resides on your S3 and what is generating your higher and higher costs on AWS bills. Not to mention losing your data due to…

Read Full Post
Mech.wikia Mech.wikia 3 October 2022

Replacing memcached proxy - a bumpy road from Twemproxy to Mcrouter

This is an example of how to replace a critical component with zero downtime, how and why projects grow in size, and where risks can come from.

At Fandom, we make heavy use of memcached as our primary caching solution for backends. We’ve been using Twemproxy as a layer of abstraction between our backends and memcached, as it provides us with consistent caching and other useful features. Twemproxy was serving us well but recently we’ve decided to replace it with Mcrouter. In this blog post, I’ll describe the project I took on - migrating our biggest service, the MediaWiki-based Community Platform, from Twemproxy to Mcrouter. Although executed successfully, it was not without its surprises.

  • 1 The plan
    • 1.1 Divide and conquer
  • 2 Learning points
    • 2.1 Have…

Read Full Post
JacekThePie2 JacekThePie2 3 October 2022

Working Data Engineering

Have you ever looked for information about new TV series like House of the Dragon or The Rings of Power? A new Marvel movie has been released and you want to catch up with what has happened so far in the universum? Maybe you are a game addict and Minecraft is your middle name? Or wonder who this famous Geralt is? Or are you passionate about any other things, like music, books, or public transportation in San Francisco? The chances are very high that you have visited one of the 382 535 174 Fandom articles on one of the 282 503 Fandoms!

That sounds like a lot! Yes, a lot of data: pages, traffic, ads!

  • 1 How big is Big Data at Fandom?
  • 2 What do we do?
    • 2.1 Data processing
    • 2.2 DataOps
    • 2.3 MLOps
  • 3 Cross-team cooperation
  • 4 What do we exactly do?
    • 4.1 Near real-time…

Read Full Post
Polymeric Polymeric 2 September 2022

Focus-oriented design

Fandom is a very popular website, visited daily by millions of people around the world in look for information about their favorite topics. Most of the visits come from mobile devices, but a lot of these are done on desktop and computers.

As with all popular websites, the demographics details starts to amplify to unexpected lenghts, to the point that it is practically impossible to adjust your wiki to accomplish with everyone's needs equally. One of the topics I'll be adressing in this blog is regarding design, and more specifically, accesible design with focus/keyboard navigaton.

  • 1 Why does this matter
  • 2 What you need to know
  • 3 Potential improvements
    • 3.1 Skip navigation links
    • 3.2 Main page

More than 95% of websites don't offer full accessibility, and…

Read Full Post
DonaldChronosKing DonaldChronosKing 21 July 2022

Tech Talk: Go For Java Developers

Hi, Fandom fans!

Last month I did a Fandom-internal tech talk, on the topic of learning how to develop software in Go, from the perspective of an experienced Java software developer with a deep understanding of the JVM. The same talk was a hit with my own team when I first gave it earlier in the year, but that instance of the talk wasn’t recorded.

Luckily, we had the foresight to record it this time, and now it’s available on YouTube. Fully captioned by me, the presenter. Here it is:

Talk: Go For Java Developers (Fandom internal, 2022-06-15)

And here are the slides in Google Docs:

Go For Java Developers

And here is the transcript:


First I’m going to paste my slides into the chat so folks can follow along if they would rather do it themselves…

Read Full Post
Arturekm Arturekm 15 April 2022

How do we onboard new hires in mobile team

At Fandom, we believe that a well-structured onboarding is a crucial part of successfully hiring new talent no matter if you have a distributed team, work from the office or in a hybrid solution. The onboarding process should be well known and understood by new hires, the team and other people from your organizations.

The Mobile Apps team breaks down the process into ten days. Each day is devoted to a theme and during the day a new hire will meet with one person on the team for approximately 60 minutes to go through the content together.

Day 1 - Intro

On the first day, the new member is likely to be already busy with other onboarding meetings, e.g. with the IT, finance and HR teams. To not overwhelm them, we start with an intro day. During th…

Read Full Post
Bmanczak Bmanczak 16 December 2021

Playwright on Jenkins at scale with HTML reports

A comprehensive guide to running Playwright tests in Parallel on Jenkins

If you’re anything like me, sometimes you need to integrate old battle-tested solutions with new and shiny technologies. In today episode, my perennial butler called Jenkins was asked to run end-to-end tests using Playwright, the new hot and steamy test automation framework.

To be able to run any tests on Jenkins, we need tests. If you have your own repo, skip this part.

For those of you who want to try stuff from scratch, run npm init playwright demo in your terminal. Project creator will ask you a few questions. I chose my project to be TypeScript and disabled GitHub Actions. This resulted in creation of 1 test tests/example.spec.ts`: in place, our job will still be faile…

Read Full Post
Ritaly-dev Ritaly-dev 10 December 2021

Keep programmers’ decisions documentation up-to-date and simple with Architecture Decision Records

Developing a system over years is hard, as is writing clean, maintainable, up-to-date code. But believe me, writing easy-to-maintain AND up-to-date documentation is not trivial either.

Once upon a time, I heard at a conference that software engineers are not good at making a long-term commitment to their code. We all love greenfields more than diving into decades-long bloated projects, sounds familiar?

But actually, that's not true. At least not for every mature project. The difference is in the documentation.

  • 1 Spooky story time
  • 2 What is ADR?
  • 3 Benefits
  • 4 Qualities of an effective ADR
  • 5 When should I write ADR?
  • 6 Where should ADR be stored?
  • 7 ADR template

Of course, code grows over time. Dependencies get complicated, and decisions made in the past that w…

Read Full Post
Mnowicka Mnowicka 10 November 2021

Platform Team’s Technical Decision Process - Actor Migration Case Study

As the Platform team at Fandom we are responsible for providing core functionalities and shared services used by all the teams that work on the Unified Community Platform. As a part of our job, we are responsible for keeping our platform secure, performant, and technically up-to-date.

That includes keeping MediaWiki (the wiki engine we are using) upgraded to the newest version, providing users with a secure platform with the newest features. This article describes our decision-making process for a project which was blocking us from upgrading MediaWiki to the new version.

  • 1 What is MediaWiki and why do we need to keep it up-to-date?
    • 1.1 What was blocking us from migrating to the newest version of MediaWiki?
  • 2 Challenges (aka problems) we have face…

Read Full Post
Gaperlinski Gaperlinski 17 August 2021

Five Ways in which D&D Beyond Benefits from Dogfooding

Eating your own dog food, or “dogfooding”, is the practice of using one's own products or services. The rationale is that real-world usage of a product by the developers leads to improved quality and confidence in the product. First pioneered by Microsoft and adopted by a number of “big players”, including Facebook, dogfooding has perhaps been overused as a cover-up of extended QA on company employees. While it is true that there are some risks associated with the practice, when executed well and paired with reliable quality control, it can prove to be an effective technique.

Most of the engineering teams working on the D&D Beyond toolkit incorporate dogfooding into their process. In the context of my team, this practice means that each spr…

Read Full Post
Ritaly-dev Ritaly-dev 23 April 2021

Auto linking Jira ticket in PR description via Github Action

I was looking for an easy way to generate a URL to a Jira ticket in the pull request description or as the first comment. The ticket number/code should be automatically extracted from the branch name.

Neat, automated solutions, but unfortunately, all the top articles from Google led me to the opposite problem - how to see PRs or commits from GitHub in Jira.

The final solution is really simple, so maybe someone will use it.

(or any other project management tool)

First things first - What is Github Action?

GitHub Action is a tool added to Github that allows you to automate your entire software development workflow such as CI/CD, custom steps, E2E testing, etc.

There is a lot of things you can just drop into GitHub Action and not have to worry about…

Read Full Post
Kudak Kudak 10 February 2021

Announcing Talkbox

Today I am proud to present the beta phase of a new tool available to Fandom developers. Talkbox is a cloud server that will automatically poll any wiki's Recent Changes feed for you (every 30 seconds) and send back to you through a websocket connection that latest data that it has collected. This tool enables developers to worry less about the acquisition of data and focus more on doing the most with it.

Talkbox enables multiple developers to subscribe to the feeds of a single wiki and share that data among them so that instead of hitting the wiki's API multiple times in order to get the same data they can all wait for Talkbox to hit it just once and distribute it to each of them. This reduces the burden on Fandom's endpoint servers while …

Read Full Post
MadjerFd MadjerFd 16 December 2020

Coroutines Channel

This blogpost is a continuation of the previous post: Coroutines Flow, and goes deeper into coroutine streams. In this article, I’m going to explore hot streams called Channel. What is it? What does it do? How does it work? How to create and handle it? How does it compare with the cold streams? And finally, is there a place for both hot and cold streams? Let’s find out!

  • 1 Transfering values
  • 2 Producer-Consumer
  • 3 Pipeline
  • 4 Fan
  • 5 Buffer
  • 6 Hot and cold
  • 7 Broadcast
  • 8 Hot Flow
  • 9 Conclusion

Transferring a single value between coroutines can be done by the Deferred object (the result of async job). But when you need to transfer a stream of values between multiple coroutines, there could be a place for channels. Channel easily allows to transfer a stream of values (very …

Read Full Post
MadjerFd MadjerFd 3 December 2020

Coroutines Flow

This blogpost is a continuation of the previous post: Coroutines Basics, and covers more advanced mechanisms than basic coroutines have to offer. In this article, I'm going to present an idea of coroutine streams called Flow. Why and when do we need it? What can be achieved by using it? How to create and manage it? And how does it affect and cooperate with coroutines? I hope you will find all the answers below.

  • 1 Multiple values problem
  • 2 Flow to the rescue
  • 3 Builders
  • 4 Launching
  • 5 Cancellation
  • 6 Context
  • 7 Operators
  • 8 Buffering
  • 9 Composing and flattening
  • 10 Exception

As far as we already know from the previous article, a suspending function can return a single value. What if there is a need to return multiple asynchronously calculated values? Let's make it clear w…

Read Full Post
Kviatkovsky Kviatkovsky 9 November 2020

Verifying tracking events in XCUITest

UI tests are a great way to verify if your application is working correctly. Using them, you can verify if certain actions cause certain effects. However, you usually don’t want your application to send any data to production services, especially when the application is doing requests that modify the data on the server. In case when we know what request and response bodies should look like, it’s not a big problem. We can mock all the requests that the application makes and stub the responses.

However, it’s harder if you want to mock requests that are sent to analytics, which is very often handled by some third party provider like Google Firebase. Doing it the same way would require you to intercept requests sent to the third party provider …

Read Full Post
Jmalyszko Jmalyszko 5 November 2020

AWS S3 - Disaster recovery using versioning and objects metadata

  • 1 AWS S3 - Disaster recovery using versioning and objects metadata
    • 1.1 General Procedure for disaster recovery using S3 versioning and objects’ metadata
    • 1.2 Warning!
    • 1.3 OK, let’s do this!
    • 1.4 Summary

AUTHOR: Jacek Małyszko, Data Egnineering

June 2020

Accidental removal of data on S3 is something that no Data Engineer on AWS wants to be involved in. Unfortunately, sometimes it may happen; storage of data on S3 may be expensive so from time to time you may need to get rid of some terabytes here and there. Such data deletions may be performed automatically or manually. As we’re “only humans”, some mistakes may occur. For example, once I had this sad situation; instead of removing all files under 2020/05/01 prefix, I removed 2020/01.

Fortunately, the buck…

Read Full Post
MadjerFd MadjerFd 3 November 2020

Coroutines basics

We developers are constantly on a lookout for new solutions, the best approaches so no wonder the world is changing and asynchronous programming is changing with it. At Fandom we do the same: we want to follow and apply the best solutions for specific problems. And that's what we did for one of our latest projects. We decided to use Kotlin Coroutines in our Android app, not only because they are native (less dependencies, loosely coupled) but especially their usage has certain benefits.

It doesn't matter if you write mobile or desktop or even server-side applications, there could be a place for Kotlin Coroutines in your code. But what actually are they? How do they work? What problem do they solve? Where and when should they be used? In thi…

Read Full Post
MikolajFromDataEngineering MikolajFromDataEngineering 9 October 2020

Before you build your next ETL, answer these!

At Fandom Data Engineering team, we are responsible for not only building internal analytics capabilities, but also delivering features such as recommendations and Analytics Dashboard for our community.
In total, we are custodians of ~170 TB Data Warehouse.

Internally, we are using Apache Airflow to build and manage ~35 ETLs (Extract-Transform-Load), making it all possible.
This is a challenging task, no matter what technology is used.
Based on our experience, here are some questions we consider essential before anyone writes a data pipeline.

The world of data is alluring to almost anyone in a modern organisation.
Especially if it can be automated.

Most of our processes expose their results as tables on Amazon Athena, available for later consumption by to…

Read Full Post
JacekThePie2 JacekThePie2 24 September 2020

How to save some $$$ using Amazon Web Services?

Is using AWS cloud cool? Definitely! What is not so cool about using those kinds of services is quite a limited way to keep track of how much it costs or avoid surprising bills at the end of the month. Working on-premise does not make you concerned about those matters, but on the other hand, you have to give up on benefits that the cloud serves, like flexibility, auto-scaling, short time-to-market, robustness, easy research, and development, etc. 
The aforementioned end of the month comes, and after receiving a receipt, you are thinking only about two things: how is it possible that I burned so much money on this and how to make the next receipt less painful. Answer six questions below and find out how much you can save.

  • 1 Am I still using it…

Read Full Post
Kviatkovsky Kviatkovsky 19 August 2020

Faster pull request checks for modular iOS app

This blog post is a follow-up of Enhancing XcodeGen for simpler maintenance of dependencies in modular iOS app . In the mentioned article I showed you how we enhanced XcodeGen format so only direct dependencies of modules are needed to be specified in project definitions. In this article I would like to present to you a solution that made our PR checks faster, as we run them only for modules that need it. It’s best if you first read the mentioned article to fully understand the issues that we faced. Anyway, I’ll start with a quick recap of the problem.

In the sample setup we had 3 projects defined with XcodeGen:

  • "ModularApp" application
  • “FeatureModule” dynamic framework imported by the application
  • “ApiModule” dynamic framework imported by the …

Read Full Post
IrTriskit IrTriskit 17 July 2020

Beyond Remote

Remote work is quickly becoming the norm in the tech industry, but that was definitely not the case pre-2020. At D&D Beyond, we’ve always had some remote staff, but the vast majority of our team has been collocated at our office in Huntsville, Alabama. Historically, there were two main concerns around embracing more remote work - communication and culture.

As I mentioned, we were already working with some remote folks, but that certainly had some challenges. Most of our important communication happened in-office and in a lot of cases required you to be in close proximity to the conversation or else you’d probably miss out. Even having a desk on the opposite side of the office presented problems, let alone on the other side of the country or…

Read Full Post
Kviatkovsky Kviatkovsky 28 May 2020

Enhancing XcodeGen for simpler maintenance of dependencies in modular iOS app

  • 1 Breaking the monolith
  • 2 What’s the problem?
  • 3 What’s the solution?
  • 4 Summary

Developers that take the challenge of breaking the monolith in their iOS codebase and splitting it into separate modules face another problem: How to best manage multiple .xcodeproj files and potential conflict resolution on them? Fortunately, there’s a really convenient tool called XcodeGen that makes it quite easy – it generates the .xcodeproj files based on the YAML files stored in the codebase. Using YAML files greatly simplifies conflict resolution since you no longer need to version control .xcodeproj files. Instead, you can define your project with a much simpler syntax.

However, when you have a bunch of dynamic framework targets with dependencies between them and…

Read Full Post
Andrzej Łukaszewski Andrzej Łukaszewski 1 May 2020

Improving mobile-web performance - a case-study

In 2007 Steve Souders wrote a book High Performance Web Sites which was the first book I read about web performance. Two years later he published another book with a catchy title Even Faster Web Sites which I also read and I recommend both of them as a great source of basics in the web performance world.

However, the first one is really special in my opinion because 10 out of 14 pieces of advice are connected to the frontend. This led to forming the golden rule of web performance which I’d like every web developer to know: “Only 10-20% of the end user response time is spent downloading the HTML document. The other 80-90% is spent downloading all the components in the page”.

With the golden rule of web performance in mind let’s fast-forward to…

Read Full Post
Gaperlinski Gaperlinski 28 February 2020

Priming CMSampleBuffer containing AAC-encoded data using Apple's Core Media API

Lately, I’ve been spending a lot of my free time on a side project that focuses on converting real-time data obtained from AVCaptureSession into H.264 and AAC streams and saving them to an .mp4 file. While AVFoundation offers developers a pretty straightforward way of converting CMSampleBuffer into the desired format by means of AVAssetWriterInput and relevant output settings, I was unable to use that API because my use case required me to have direct access to converted raw bytes before they got appended to the target file.

In my case, I needed to utilize VTCompressionSession and AudioConverter in order to encode the data and then pass the resulting CMSampleBuffers to AVAssetWriter. I’m not going to get into the details of compression here; …

Read Full Post
Damian Bielecki Damian Bielecki 23 January 2020

Tree Shaking - Ad Engineering Journey

  • 1 Tree Shaking — Ad Engineering Journey
  • 2 Our setup
    • 2.1 Legacy Build
    • 2.2 Solution?
  • 3 Tree Shaking
    • 3.1 What is tree shaking?
    • 3.2 How it is done?
      • 3.2.1 How to setup a Typescript to support Tree Shanking?
  • 4 Problems
    • 4.1 Classes
    • 4.2 Instances
  • 5 Summary

Our journey with tree shaking and some nuisance we had to face.

In Ad Engineering we work on AdEngine our library for managing ads, as well as on integrating that library with various sites (apps) we support. So, we have a library and multiple apps that we need to adjust for tree shaking to work.

For building library (AdEngine) we use Typescript with Rollup.

For building apps we use Typescript with Webpack.

Before tree shaking we used to split AdEngine into separate modules to limit bundle size. That solution was hard to m…

Read Full Post
Dorotamierzwa15 Dorotamierzwa15 11 December 2019

5 different data sources accessed from one Jupyter notebook - Sroka library use cases

Sroka is an open source Python library that enables quick access to various data sources (e.g. S3, Athena, Google Ad Manager). Name of this library comes from Polish language - “sroka” means magpie.

Having introduced Sroka to the public in the first Medium article , I want to now share an example of a real analysis, where Sroka shows a wide spectrum of its capabilities (though not all of it!). As an Ads Data Analyst, I will show Sroka usage in a project that leveraged advertising technology. If you are interested in how to use Sroka to access specific data source, feel free to jump straight to the respective section.

  • 1 Why
  • 2 Project intro
  • 3 Analysis goals
  • 4 Google Ad Manager (GAM)
  • 5 Athena
  • 6 Google Analytics
  • 7 Google Sheets
  • 8 S3
  • 9 Summary

Before diving into t…

Read Full Post
Amelable Amelable 18 October 2019

Increasing the CTR of ad banners through design

  • 1 Introduction
  • 2 Round 1: A/B testing
    • 2.1 Results
    • 2.2 Summary
  • 3 Round 2: A/B/C/D testing
    • 3.1 Results
    • 3.2 Summary
  • 4 Round 3: A/B/C/D/E testing
    • 4.1 Results
    • 4.2 Summary
  • 5 Conclusions
  • 6 Tools and techniques
  • 7 References

Optimizing the advertising strategy has recently become even more challenging than it used to be. The main reason for this is the overall declining CTR, which is the ratio between clicks and impressions, one of the key metrics in digital advertising. One cause for this observed trend might be the growing importance of the web as a sales channel and the resulting need to advertise online. The amount of unique online advertisements has grown tremendously over the years, severely impacting the user experience on websites¹. Ads became more and more intrusiv…

Read Full Post
Nikodamn Nikodamn 30 September 2019

How to start writing automated tests using WebdriverIO

End-to-end tests are useful tool for checking if current state of an application meets business requirements. In Fandom we put a lot of emphasis on such tests and ensuring that those needs are met along with application changes to make sure that we deliver the best possible experience for our users.

In this article series I’d like to present how to create functional tests in WebdriverIO, integrate them with Jenkins, containerize, scale and setup a good-looking test reports dashboard with Allure and implement a Continuous Deployment solution. But let’s start from the beginning.

WebdriverIO (or just wdio) is an Open Source test framework for Node.js. Currently it’s one of the most popular testing frameworks in the JS automation world next to S…

Read Full Post
Damian Bielecki Damian Bielecki 30 August 2019

Jenkins Jobs Runner

  • 1 Jenkins Jobs Runner
  • 2 How it works?
    • 2.1 Await Execute Batch
    • 2.2 Display Stream
    • 2.3 Combined Stream
  • 3 How to use it?
  • 4 Summary

This article is part of a Jenkins CLI series in which we describe how we built CLI application for executing a series of parallel Jenkins Jobs in a terminal.

Jenkins Jobs Runner is a library powered by Jenkins RxJs that enables sequential execution of n batches, each of m parallel jobs. On top of that, it provides a visual interface to display the current status of jobs.

Jenkins Jobs Runner takes as an input array of JobBatchDescriptor object. They are expressed through an interface:

import { JobBuildOptions } from 'jenkins';
export interface JobBatchDescriptor { displayName: T1; jobDescriptor: JobDescriptor[]; }
export interfac…

Read Full Post
Bielik20 Bielik20 20 August 2019

Jenkins RxJs

  • 1 Jenkins RxJs
  • 2 How it works?
  • 3 How to use it?
  • 4 Summary

This article is part of the Jenkins CLI series in which we describe how we built CLI application for executing a series of parallel Jenkins Jobs in a terminal

Jenkins RxJs is a small wrapper library on top of the Jenkins npm package that can be used in CLI, node, or browser environment. It encapsulates the whole process of starting a job and tracking it in a quiet, queue and build states. The consumer of the library simply executes run command with job options and receives a stream of JobResponse objects.

This diagram describes the entire process:

And JobReponse can be expressed in the following interfaces:

type JobStatus = 'FAILURE' | 'SUCCESS' | 'PROGRESS';
type JobResponse = JobProgress | Job…

Read Full Post
Mech.wikia Mech.wikia 24 May 2019

Migrating domains from to

  • 1 Rationale
  • 2 Challenges
    • 2.1 Certificates and non-English language subdomains
    • 2.2 User submitted content
    • 2.3 Several thousand community domains
    • 2.4 Ads and ad networks
    • 2.5 Several applications
    • 2.6 Internal (proxied) requests
    • 2.7 Caching
    • 2.8 Anonymous vs logged-in users
    • 2.9 Development/staging domains
    • 2.10 “” hardcoded everywhere
    • 2.11 Confidentiality/PR
  • 3 Planning
  • 4 Execution
  • 5 Migrations/Final switch
  • 6 Conclusions and lessons learned
  • 7 Summary

In the first few months of 2019, we switched all our communities to HTTPS and migrated them to new domains. That switch is the end of a year-long project during which we touched several pieces of our infrastructure. This blog post summarizes the project, from planning through execution up to the results of the switch.

The decis…

Read Full Post
Brudne plaze Brudne plaze 25 February 2019

Portable Infoboxes Graphs - PIGs

As in most companies, at the end of the year everything seems to slow down. December is the month of closing budgets, focusing on platform stability and starting of holidays season that results with a pause in release cycles. Last year, we took this time and allowed ourselves to do a small experiment, a fun engineering project, which we affectionately called PIGS and I would like to share with you its results.

  • 1 Refreshing your knowledge on Portable Infoboxes
  • 2 Case #1 — trying out graphs in team sports
  • 3 Case #2 — TV Series
  • 4 PIGs Experiment afterthoughts

A few years ago, one of the product teams released Portable Infoboxes. PI’s are the tables that usually contain rich metadata related to the article topic, they have key — value table structure, …

Read Full Post
JCel JCel 6 February 2019

AWS Athena Alerter

  • 1 The Challenge
  • 2 What is Athena Alerter
  • 3 The Road Ahead
  • 4 Under the Hood

Athena is a convenient big data query engine offered by AWS. It quickly got adopted in our company by multiple departments, however, its serverless nature has also created the risk of our Athena bill getting out of hand.

Our data set contains terabytes of data and it’s easy to write a very expensive query. The users can avoid such a scenario by using partitions which allow them to limit the amount of accessed data to only the time period of interest. However, when working on a report in an external tool or implementing some complex queries, it’s easy to make a mistake or forget about partitioning. Also, external tools often do not show the amount of data scanned, so it’s not…

Read Full Post
Wiki-o-slay Wiki-o-slay 16 August 2018

Why shouldn't you use health checks?

At FANDOM we believe our applications should be resilient, that is they should be able to recover from failures and while the failure occurs still be useful for the users. Health checks are one of the ways to make applications self-healing.

The idea is that the health checks detect when an instance of the application reaches an invalid state. A supervisor monitors those health checks and attempts to fix any issues. Depending on your platform the action might be different.

Many frameworks (like Dropwizard and Spring) and platforms (like Kubernetes and Marathon) encourage you to implement health checks for your web applications.

When a health check fails, AWS will stop sending requests to that instance. That’s pretty straightforward — we suspec…

Read Full Post
Jrogan92 Jrogan92 23 July 2018


As the GDPR deadline has come and past, our team has reflected on its efforts of building the front-end library. The task was to build a front-end modal which FANDOM would integrate across its web products. For obvious reasons (a $20 million fine), we set a strict zero tolerance level for any failures. Our goal from the outset was to create the most well tested piece of code at FANDOM.

The first problem we had to tackle was being able to reliably detect where in the world the user currently viewing a given page is visiting from. Our network provider Fastly provides a Geo Detection service through its Varnish servers. This exposes a wealth of information, but most importantly, an ISO 3166-2 country code associated with the client IP address.…

Read Full Post
RubberDuckie3 RubberDuckie3 29 January 2017


guys this will help you

Here is the test wiki, i use it for CSS tests

you need to add this code to your Wikia CSS

You can change Comic Sans MS to anything you want

First, you will need to insert this code

However you may run into problems with the Icons having a blue frame around them, the simplest solution is to remove the Icons using this code. Also you can change the Hex code and border to anything you want (Just dont make it too big)

This will make the links have a cool effect on them when hovered

TIP: You can add :hover to something to make the Styling activate on hover

Read Full Post
Saftzie Saftzie 17 June 2016

ECMAScript 2015 Promises

Read Full Post
Bognix Bognix 23 October 2015

Wikia's adventure with TypeScript

For the time being we are using TypeScript in our Mercury project.

If you want to know what TypeScript is I recommend this [ article] or official documentation. Long story short TypeScirpt is a typed superset of JavaScript which compiles to (readable) JavaScript.

If you want to know more about Mercury [ here] you can find small description or if you prefer to read code instead of articles here is the link to the github repo.

  • 1 TypeScript @Wikia
    • 1.1 What worked for us
      • 1.1.1 It compiles
      • 1.1.2 ES6
    • 1.2 What didn't work for us
      • 1.2.1 It's typed
      • 1.2.2 Ember + TypeScript
    • 1.3 Conclusion

It's typed

When there is 40+ developers working on one project it's hard to keep up with all the changes. Having types makes it easier to understand parts of code you didn't know exi…

Read Full Post
Penguin-Pal Penguin-Pal 27 November 2013

Self-destructive code

Hi there,

If you're looking for a way of creating a script that not only uses conditions to decide whether or not to apply it but are also looking for a method of completely removing it from a certain script page, maybe you'd find this useful.

Basically the syntax of this code isn't too long. It's made of:

  • A function to begine with, to make it work.
  • Wrapping "tags" to be used as some sort of anchors, to determine what part of the code to remove.
  • A certain code to do, placed between the wrapping tags.
  • A condition, also trapped between the "anchors". If it's true then trigger the self-destruction code.

When and if the condition is true, it then would use $.getJSON to get the content of the JS page on which the code is found, remove the requested "a…

Read Full Post
Seadrus Seadrus 30 October 2013


Not entirely sure if this is the right place to do this, but it is technical.

My site needs a major spice-up.

  1. If anyone knows how to do the header and edit buttons custom (like here: ), I NEED TO KNOW!
  2. Does anyone know how to make the color for a user (like an admin) a separate color? I have searched the internet with tutorials that don't work on my wiki.
  3. By the way, my wiki is
  4. Again with the custom Dr. What - How did they customize... everything? Esp. the 'recent activity', 'Chat welcome messages' and the time on the top-right corner, near your name.
  5. Is there a way to change the alignment of the chat so that the textboxes could be…
Read Full Post
Mathmagician Mathmagician 25 April 2013

Feedback — Article Layout

Hey everyone,

So, I've recently created a couple of a boilerplate templates [ , Template:ConfigOptions, with possibility for more to follow ] aimed at educating end-users of JavaScript. These boilerplate templates are designed to...

  • Prevent script authors from having to write the same general information over and over again on their informational pages. E.g. "config options need to come before the import statement" — that's general information that's true for most scripts.
  • Summarize key points in a concise, reader friendly format
  • Contain useful, educational code examples that readers can generalize upon
  • Make information attention-grabbing and immediately accessible in the articles themselves, rather than tucked away in Help: pages that people m…
Read Full Post
Benjaminthewill123123 Benjaminthewill123123 24 March 2013

Adding AJAX to this code

First off I want to add AJAX to the code below so It doesn't refresh the page once it's done but rather adds a confirmation message to the button once it is done removing the red links. I have no idea how to begin, I have tried combining it with other AJAX scripts such as Quick delete and AJAX RC with no luck. Any help would be appreciated!

/******************************************************/ /* Red Link Fixer */ /* Idea by Madnessfan34537 */ /* Code by Madnessfan34537 and Monchoman45 */ /******************************************************/   $('#WikiHeader').append('<a class="wikia-button" onclick="this.innerHTML = span class="es0" style="font-weight:bold;…

Read Full Post
Relwell Relwell 17 October 2012

Wikia is moving to GitHub!

At Wikia, we're always looking for ways to make it easier to collaborate on our code, both with our user community as well as with the WikiMedia Foundation. Moving our version control solution from Subversion to Git will help us succeed in collaborating more effectively, more rapidly, and more often. Git is fast, flexible, and powerful. It is well suited for easily integrating changes from numerous sources. It is also used for version control by the MediaWiki project. This means that it will be easier for us to upgrade to newer versions of MediaWiki as they become available.

As of Monday, October 22nd, Wikia's code will be publicly hosted on GitHub. We chose GitHub because many of us are already on it. We believe that hosting on GitHub will…

Read Full Post