The core of the model is a uniform swing model. If a party is performing ten percent better than its popular vote numbers in a previous election, then I assume it will overperform by its individual riding results from that election by ten percent in every riding.
The model has two main parts, the projected 2018 results and the polling average.
The projected 2018 results are derived from 2014 and 2011 election results, with 75% of the projection coming from 2014 results and 25% coming from 2011 results.
Because of the redistricting that occurred prior to the 2018 election, results from 2014 and 2011 cannot be directly applied to the current riding map.
Shapefiles taken from here are used to assign results from each polling location to the 2018 riding they overlap. Stations that overlap multiple ridings are split among those ridings based on the percentage of area they share with each one.
Advanced polls are divided with the same method, but using the area overlapped by each riding, since they are reported on a per-riding basis.
There are many ways to construct a polling average, with weight given to sample size and method. I know nothing about such things.
Instead a simple 6 poll rolling average is used.
Using the projected 2018 results, I calculate how much each party under or over performed from its province-wide result.
I then add this per-riding swing to the averaged polls and determine the winner of each riding and determine how many seats each party wins.
This is used to determine which party will win the most seats and whether they will have a minority or a majority.
Other sites include factors like incumbency and party leader status in their models. I know nothing about these things also and they are not included.