Method
How this is built
A results-first foundation, then a carefully labelled player layer. The guiding rule is simple: never present a derived or curated number as if it were measured event data. The product principles live in About; the licence and coverage record lives in Sources.
Sources
What feeds the app
| Source | Publication lane | Rows | Last checked |
|---|---|---|---|
| football-data.co.uk | derived_display | 10,085 | 2026-10-21 |
| API-Football | derived_display | 1,741 | 2026-10-23 |
| AFC Chat — The Rumour Mill | derived_display | 83 | 2026-10-21 |
| Aberdeen FC news | derived_display | 26 | 2026-10-21 |
| SPFL official club feed | derived_display | 12 | 2026-10-21 |
| Wikipedia | derived_display | 0 | 2026-10-21 |
| Sportmonks | derived_display | 0 | 2026-10-21 |
| Aberdeen FC men's team roster | derived_display | 0 | 2026-10-24 |
League results and team match stats come from Football-Data.co.uk and are labelled as such; the current-season API-Football migration is gated on a full results-and-stats coverage probe. League Cup and Scottish Cup fixtures, lineups/roles, player match stats and the squad come from API-Football. Aberdeen club fixtures come from the SPFL feed. Availability is curated official AFC team news; the provider injury snapshot is optional and labelled separately. See Sources for the layer truth table. Raw payloads are never committed; the app publishes derived tables, fixtures and listing metadata with attribution.
Tables
Computed, not scraped
Points are 3W + D, goal difference and goals scored break ties, then a head-to-head mini-league. Playoff matches are excluded. Points deductions are stored in reference/disciplinary.yaml with a citation and applied before ranking; the raw and adjusted points are both retained.
Cut-offs
What the lines mean
The Premiership splits after 33 matches: 1st–6th contest the title and Europe, 7th–12th cannot finish higher than 7th. 11th enters the relegation play-off and 12th is relegated. European places use Scotland's 2027/28 access list — four berths, with the Scottish Cup winner's route able to move the league cut-off. The League Cup carries no European place. Checked 2026-10-21; subject to the final UEFA access list and cup outcomes.
Below the Premiership, 1st is promoted automatically and 2nd–4th enter the promotion play-off. In the Championship and League One, 9th enters the relegation play-off and 10th is relegated. In League Two, 10th enters the pyramid play-off against the winner of the Highland / Lowland East / Lowland West champions' group rather than being relegated automatically.
Cup formats
League Cup and Scottish Cup
The League Cup has 8 groups of 5; the five European representatives — Celtic, Hearts, Rangers, Motherwell and Hibernian — join in the knockout stage, along with 8 group winners and the 3 best runners-up. Group points are 3 for a win, 1 for a draw plus a shoot-out bonus. The Scottish Cup is a pure knockout of 137 clubs and 136 ties; Aberdeen enter in the fourth round on 16 January 2027. Group tables are computed from fixtures, and an unpublished draw is shown as awaiting draw.
Checked 2026-10-21. The official rule is five European representatives, not the top six. Sources: SPFL League Cup format and SFA Scottish Cup format and rules. The licensed Scottish Cup feed currently covers the First and Second Round only (50 of 136 ties); missing rounds are labelled, not invented.
Uncertainty
Assumptions are labelled
League-strength adjustment uses Elo where available and a documented prior otherwise, with a confidence flag and sensitivity check. Budget fit is fee-only until a ceiling is set; individual Scottish wages are not public and are never invented.
Coverage
Event, match, curated, value-only
Every league and player carries a coverage tier. League One/Two player data is curated because no free rich feed exists; the card says so. A value-only player is never ranked against event-data peers without a warning.
2D viewer
Reconstructed, not tracked
Goals and key passages are rebuilt from event coordinates. Only the ball and the players involved in each event are placed from source coordinates; other tokens are inferred from formation and average position. Every sequence will carry an “event-reconstructed — not tracking data” badge.
Matchday
Predicted, not team news
The next-fixture page projects both XIs from observed formations, starts, minutes and role fit, with 4–6 contenders. The style lean uses measured shot volume, shot share, shots on target and goals; possession is unknown and is not used. Form is league-only, and home/away splits use every league match. A missing formation or a small lineup sample is labelled unavailable rather than guessed.
The opponent refresh is bounded to the next fixture and cache-first. A failed refresh carries the previous snapshot as stale, or removes only the opponent XI, never the league context.
Open the matchday dashboard →Transfers
Confirmed business only
The transfer register publishes completed permanent, loan and free moves only. API-Football is the candidate feed; official AFC announcements and Wikipedia season records are the cross-checks. Fees are not in the feed and are curated only: undisclosed is never zero and is excluded from net spend. Loan end, recall and obligation terms are unknown unless confirmed.
Open the transfer register →History
The Cormack era, measured and read
The history layer joins the measured league record, curated staff and honours, transfer windows, style proxies and lineup-based selection. Manager records are league-only; a match in a gap is unattributed. Style is opponent-unadjusted match-stat proxies, not xG. Selection is unavailable rather than inferred when the historical backfill is missing.
“The read” is a labelled editorial assessment, not a measurement or the club's internal view. The 2023-24 League Cup was a runners-up finish and is not in the honours cabinet.
Open the Cormack-era record →Squad
Current-season player output
The squad is the current licensed squad plus current-season loanees out from the confirmed register. Each player has per-competition goals, assists, cards and the provider rating, plus shots/passes for outfield players and saves/conceded for goalkeepers. Starts, substitute appearances and on-pitch minutes are reconstructed from fixture lineups and substitution events, so a start and a substitute appearance are different numbers rather than one “apps” total.
Role is a primary dimension, not a decorative attribute. The licensed team sheet gives the formation and each starter's grid slot. A starting right-back, centre-back, centre-midfielder, winger or forward is read from that grid; a substitute has no grid slot and therefore no role. A missing grid or an unmapped formation is shown as unknown, not filled with the generic squad position. Kick-off shape, centre-back count and holding-midfielder count are recorded for the shape/balance view. Mid-game formation switches are not in the feed and are never inferred from substitutions; reported ones are kept as sourced context notes.
Positions are an eligibility set, not one label. The career layer uses FM-style slots (`D/WB L`, `DM/M C`, `AM R`, ...) from the last three seasons of starting-XI evidence, with primary, secondary and stretch tiers. Equal weight is given to starts; a one-off start is a stretch role, not a new primary. The broad filter is defenders/midfielders/attackers and left/centre/right. A full-back or wing-back counts as both a defender and a midfielder; a DM is a midfielder; a winger is an attacker. The current Aberdeen role is itself a multi-slot summary and only replaces the display label when it is clearly different. Curated role notes cover interpretations the kick-off grid cannot see, such as an inside forward or inverted full-back. This is a general football model for fluid formations and utility players, not an Aberdeen exception. Seedocs/career-roles.md.
The player page is a projection of one typed document, with five panels: identity, position inference, playing time, performance and records. Each fact has one home; unknown attributes are omitted rather than repeated as caveats. See docs/player-page-spec.md.
A measured zero stays zero; a missing row is unavailable and a row missing a key field is partial. Parent-club rows are never presented as loan-club output. Provider ratings are labelled as such and do not rank players. Goals conceded while on the pitch, clean sheets (60+ minutes, zero conceded on the pitch) and own goals are reconstructed from fixture lineups and events; a missing fixture is excluded and the coverage is labelled.
Preferred foot is the one profile attribute the team sheet does not contain. It comes from a separate provenance pipeline: Sportmonks when its licensed adapter is enabled, then an official page only if it states the attribute, then Wikipedia as a last resort, then Unknown. Wikipedia values carry a page revision and permalink; no article text is published. The front end never infers a value. Side is derived from the role, not from preferred foot. Player photographs are not published. Current player names link to their profile wherever they appear in structured data; former players link to the former-player register and rumour targets do not link. The 2026-27 rebuild and shape-instability context is recorded indocs/context/aberdeen-2026-27.md.
Rumours and fan signal
Two registers, one record
A rumour is an unconfirmed link with public sources, a lifecycle status and an editorial confidence. It becomes confirmed only when the move is in the transfer register, and then it links to that row. Status is not a probability.
The fan signal samples the first page of recent AFC Chat Rumour Mill topics. Names are extracted with a player gazetteer and labelled by cross-reference: press rumour, club output, recent confirmed transfer or current squad. Sentiment is rule-based VADER on sampled posts, press claims and club titles. It is descriptive and noisy, not a poll.
No raw post bodies, usernames or quotes are published. The forum advertises ai-train=no, use=reference; fitba does not train on the text. The active rumour cohort also produces an advisory recruitment profile, which never overrides the scouting fit. Community votes and submissions are a deferred separate project.
fxG
Model output, labelled
fxG is fitba's own team-match expected-goals estimate. It uses open-play inside/outside-box shots, shots on target, blocked shots and a fixed penalty value, fitted to provider xG. It publishes an 80% model range for the estimate and a separate 80% goals range for the same chances. It has no shot coordinates, distance, angle, pressure, goalkeeper position or game state.
Provider xG is carried separately where available and is never blended into fxG. The model is validated against 2026-27 provider xG; the gate is an in-season calibration, not an out-of-season holdout, and the values are descriptive rather than a performance verdict.
Policy
What is not published
- No raw source payloads, full event feeds or source-shaped tables.
- No raw forum post bodies, usernames or quotes.
- No raw market-value feeds; only bands and our derived scores.
- No club crests or player photographs without a licence.
- No odds in the public app.
- No affiliation with Aberdeen FC, the SPFL or any provider.
A source can be disabled in config/sources.yaml and the site rebuilt from the remaining sources. See docs/sources.md and DATA_LICENSE.md.
Every published number has a registry entry, a declared formula, source layer and coverage tier, and an audit result on Metrics and audit. A number whose mode is provenance_only is present and source-checked, not independently recomputed.
Provenance
How this page is sourced
Dataset 2026-10-27T12:06:31+00:00-c598315. Sources and coverage are listed below; the page keeps its own source and uncertainty labels.
Method notes describe the record; they are not a derived fact surface.
Corrections and changes are recorded on Corrections and contact.
Cite this page
Methodology. Dataset 2026-10-27T12:06:31+00:00-c598315, as of 2026-10-27T12:06:31+00:00. Source: published fitba record.