A desktop companion for Football Manager 2026 that watches the in-game clock and tells you when a youth intake window opens.
FM26 removed the in-game Notes and Reminders feature, and since development has ended at build 26.3.2 it is not coming back. That left no way to mark a date in the game — including the one date most worth marking, youth intake day, when a club's newgens are generated and every other club's are briefly visible and cheap to approach.
This tool fills the gap from outside the game. It reads the date off the screen once a second, compares it against a per-nation intake table, and alerts you when a nation you care about opens its window. It never writes to the game, never touches the save, and never injects anything into the process.
- What it does
- Install
- Using it
- How the alerting actually works
- Privacy
- Version compatibility
- Troubleshooting
- Building from source
- Contributing
- Licence and attribution
- Supporting the project
- Reads the in-game date from a screen region you calibrate once, using Tesseract OCR with a preprocessing pipeline you can tune live.
- Alerts when an intake window opens for any of the 91 nations you have ticked — with a sound, a taskbar flash, and a tray notification.
- Does not miss days. FM's Continue button jumps to the next event rather than advancing one day at a time, so the intervening dates are never drawn at all. Alerts fire on interval crossing rather than date equality, which is the only approach that survives that. See below.
- Survives save-scumming. Reloading to reroll an intake re-arms the alert instead of silently swallowing it.
- Copes with misreads and switching saves. A date that looks like a misread is held back rather than believed, a wrong one that persists corrects itself, and Reset date in the header gives a clean start when you switch to a different save. See Switching between saves.
- Only watches while the game is running, so it is not quietly OCR-ing your inbox.
- Windows 10 version 1809 or later (developed and tested on Windows 10 22H2)
- .NET 10 Desktop Runtime (x64)
- Football Manager running in windowed or borderless windowed mode
- Download
FMRegenNotifier-win-x64.zipfrom the latest release. - Extract the whole folder somewhere convenient.
- Run
FMRegenNotifier.exe.
That is the entire setup. You do not need to download language data
separately — tessdata/eng.traineddata ships inside the zip.
Extract the whole folder, do not just copy the .exe. Tesseract's native libraries live in an
x64\subfolder beside the executable and the OCR engine will not start without them. This is also why there is no single-file build.
On first run the app creates:
| Path | What it is |
|---|---|
data/countries.xlsx (beside the exe) |
The editable intake table |
%APPDATA%\FMRegenNotifier\settings.json |
Your configuration |
%APPDATA%\FMRegenNotifier\state.json |
Last seen date and fired alerts |
%APPDATA%\FMRegenNotifier\logs\ |
Rolling diagnostic log, 7 days |
Close the app, then extract the new zip over the old folder. Your settings and
the tracked date live in %APPDATA%\FMRegenNotifier, so they carry over
wherever you extract it.
data/countries.xlsx is the exception: it lives beside the exe and is only
written when it is missing. If you edited it and extract to a new folder, copy
it across, or the built-in table is used instead. Your ticked countries are
saved in settings.json and are kept either way.
Start Football Manager in windowed or borderless mode, then click Select on screen… and drag a box around the date in the game's top bar.
The defaults (2035, 5 to 2180, 40) suit a 2560×1440 display at 100% scaling.
If yours differs, either snip a new region or type the four numbers in; the live
cursor readout under the inputs makes manual entry straightforward.
Leave a little room around the digits. A capture that clips the top of a 7
leaves something that genuinely is a 1, and no amount of tuning recovers it.
The preview warns you when text touches the edge of the region.
The preview shows the exact image handed to the OCR engine, not the raw grab, along with the text read and the date parsed from it. If the date under Parsed date matches the game, you are done.
If not, see Troubleshooting. Every tuning control re-reads the screen immediately, so you can watch the effect of each change.
Countries are grouped by continent with collapsible headers, sortable by name, youth rating or intake date. Select top tier ticks everything at or above a youth rating you choose (130 by default, which selects the nine elite newgen nations). Lower-league rows are left out unless you tick Include lower-league rows in 'Select top tier' on the Alerts & Options tab.
The Confidence column is worth reading. The shipped dataset is FM24-era: rows
marked Medium are uncorroborated or carry a shared inactive-nation default
date, and Low rows are known to be stale or ambiguous. Correct them against
your own save — the table is a starting point, not gospel.
To get an early warning as well, set Warn this many days before the window opens on the Alerts & Options tab. You then get a "youth intake window opens soon" alert that many in-game days ahead, on top of the usual alert when the window opens. It is 0 by default, which turns the early warning off.
Press Start monitoring, then switch back to the game. Coordinates, tuning, country selection and most of Alerts & Options lock while it runs; press Stop to change them. The alert choices, Test alert, Minimise to the notification area and Reset date stay available.
With the privacy options on (the default), reading pauses whenever Football
Manager is not the active window, including while you are looking at this app,
and whenever it is not running. The header and the log say why (Paused: …),
and the preview keeps showing the last reading with a note that it is paused.
Reading starts again when you switch back to the game.
Switching to a different save? Press Stop, load the other save, press Reset date in the header, then start again. See Switching between saves.
Minimise to the tray and the tooltip keeps showing the next intake and how many in-game days away it is, so you can check without waiting for an alert.
This is the part worth understanding, because the obvious design is broken.
FM's Continue button advances to the next event, not by one day. Players report jumping from 2 June to 8 June in a single click, and the skipped days are never rendered on screen at all. So a tool that checks "is today's date equal to an intake date" can silently never fire, and sampling faster does not help — there is nothing to sample.
Instead the app remembers the last date it confirmed and asks a different question: did any armed trigger fall between where the clock was and where it is now? Holiday from January to June and every window you flew past is reported at once, correctly, labelled with how late it is:
England: intake window opened 5 day(s) ago on 14/03/2026 - you are now at 19/03/2026. Still open until 31/03/2026.
Four more things fall out of that design:
- A single misread cannot poison the state. A new date must be seen twice in a row before it is committed. A jump of more than 400 days, forwards or backwards, is held back as a misread rather than believed, and so is a jump to the same date in another year, give or take a week, however short: 2025 read as 2026 is only 365 days.
- A persistent one corrects itself. The app cannot tell which of two dates is the wrong one. If the far-off date keeps reading the same way for about twenty seconds without the old one showing up again, it switches: either the old date was the misread, or you loaded a save from another season. If the new date was the misread instead, it switches back the same way once the real one is read again, and picks up where it left off. Either way, an intake crossed meanwhile is reported, and one already alerted is not announced again, with two exceptions. While a misread year is the tracked date, intakes still fire on the right day but under the wrong year, and are reported again, correctly, when the real date comes back. And a misread by one year that holds for those twenty seconds cannot be told from a year-long holiday, so that year's intakes are reported as missed, and announced again when the game really reaches them.
- Reloading a save re-arms. Save-scumming an intake is the main reason to want this tool, so a backwards jump un-fires the alerts it crossed. A real-time cooldown stops a tight reload loop from machine-gunning the same alert.
- Only a clean read changes anything. A failed capture, a menu covering the
clock, or the game being closed are each distinct states, and none of them is
treated as "the date did not change". Each is written to the Activity Log once,
when it starts: a blank capture, no date in the region or an unreadable region
as a warning, and the game being closed or not the active window as
Paused: …. When reading resumes the log saysReading the date again.orFootball Manager detected — reading the screen., so a date that has stopped moving always has a reason next to it.
The app has no way to know which save is loaded; it only sees the date. So a switch looks like one of the moves above:
| The save you load is… | What happens |
|---|---|
| Earlier, within about a year | A reload: its upcoming intakes are re-armed at once. One almost exactly a season earlier (the same date, give or take a week) looks like a misread year, so it waits about twenty seconds first; pressing Continue meanwhile loses nothing. |
| More than about a year away, either way | About twenty seconds of "Ignored implausible jump", then it switches. Nothing is reported for the gap; windows open in that save right now are announced. |
| The one you most recently switched away from | The same, and it picks up where that save was left, as long as it is no more than about two months (in game) past that point: nothing already alerted in it is repeated. Only the most recent one is remembered; Reset date and restarting the app forget it, and going back to it after a restart announces its open windows again. |
| Later, within about a year | Indistinguishable from a holiday, so every intake in between is reported as missed. One almost exactly a season later (the same date, give or take a week) looks like a misread year, so it waits about twenty seconds first, then does the same. |
| Any, after restarting the app | The date saved last time is a starting point, not a fact. A save on screen within about a year of it is handled by the rows above, so if it is later, the intakes passed while the app was closed are reported as missed. One more than a year away is switched to at once, without the twenty-second wait. The saved date is then still remembered for the rest of the session: a save loaded later that lands up to about a year after it is taken for that save played on while the app was closed, and the intakes in between are reported as missed. |
For the "later, within about a year" row, or whenever you want a clean start, use Reset date in the header: press Stop, load the other save, press Reset date, then start again. The app forgets the tracked date and the alerts already given, adopts the next date it reads without reporting the gap, and announces any intake window open at that date. If you close the app before a date is read, the next run still starts fresh.
Press it before the other save is read, not after. While monitoring, a save up to a year later is taken as a holiday within a couple of seconds of appearing, and its gap has already been reported by the time you could switch windows.
A screen scraper that runs unattended is a liability if it is not careful, so:
- Capture is gated on Football Manager running and being the active window, both on by default. Leave the app running overnight and it reads nothing.
- A pause holds the last reading. While the gate is closed the preview keeps
the last date it read and says it is paused, so a date on screen does not mean
the app is still capturing. The Activity Log notes the pause once, for example
Paused: No 'fm.exe' process is running., and logsFootball Manager detected — reading the screen.when capture resumes. - The rolling log records events and diagnostics, not the contents of your screen.
- Nothing is sent anywhere. There is no network code in this application.
The one deliberate exception: the tuning preview works with the game closed, because otherwise you could not calibrate before launching FM. Preview text is never written to the log file.
Nothing here is specific to FM26 beyond the default coordinates and the shipped dates. Two seams make it portable:
Re-calibrate the region. Any Football Manager that draws a numeric date anywhere on screen will work — FM27, FM28, or back to FM24 and FM23. Snip the new location and the rest follows.
Edit the spreadsheet. data/countries.xlsx is the source of truth for
nations, ratings and intake windows. Change the dates for a new edition, add
nations the table is missing, or delete rows you do not care about, then press
Reload on the Countries tab. Delete the file entirely to regenerate the
built-in dataset.
| Column | Notes |
|---|---|
Code |
Unique. Selections are saved against this, so renaming a country does not clear your picks. |
Country, Continent |
Display name and grouping header. New continents create new groups. |
YouthRating |
0–200. Drives sorting and Select top tier. |
StartMonth, StartDay |
When the window opens. This is what raises the alert. |
EndMonth, EndDay |
When it closes. Leave blank for a single-day window. |
Confidence |
High, Medium or Low. Shown in the dashboard. |
EnabledByDefault |
Ticked on a fresh install. |
Notes |
Free text, shown as a tooltip. |
If the game's date format differs, set it under Date format on the Capture tab. Leave Learn the format automatically on and the app will work out day-first versus month-first the first time it sees a date with a component above 12.
The single most common OCR failure, and usually not an engine problem.
- Widen the region first. If the capture clips the crossbar off the top of a
7, what remains really is a1. The preview warns when ink touches the edge. This is the fix roughly half the time. - Raise the binarization threshold towards 160. Measured across synthetic dates at several text sizes, 160 read 6/6 correctly where the default 128 was erratic on thin text. The default is 128 because that is what was validated against the real game, but your skin or resolution may render lighter.
- Add a stroke-thickening pass. When glyphs binarise down to a one-pixel
skeleton, the crossbar of a
7is the first thing to break up. One dilation pass restores it. - Raise the upscale factor if the region is small.
- The game is in exclusive fullscreen. Switch to borderless windowed — exclusive fullscreen cannot be captured this way.
- The coordinates are off-screen. Press Reset and re-snip.
The preview then says Captured region is a single flat colour. The game may be in exclusive fullscreen., and while monitoring the log says Capture is coming back blank. If it says Reading the date again. shortly after, nothing needs
doing: a grab can come back blank for a moment, for example after a display
change, and the app then picks the screen up again on its own. If the warning
stays and the date stops moving, it is one of the two causes above.
Check the Activity Log. Common causes:
- No countries ticked — the log says so explicitly.
Paused: Football Manager is running but is not the active window.— expected while you are looking at this app. Switch back to the game and the log saysFootball Manager detected — reading the screen.Paused: No 'fm.exe' process is running.— the privacy gate is doing its job, and the header shows "Football Manager is not running". The process name defaults tofm; press Stop and change it under Alerts & Options if your installation differs.- The OCR engine is unavailable —
tessdata/eng.traineddatais missing, which usually means only the.exewas copied rather than the whole folder.
Tick Verbose in the Activity Log to see every sample.
If you see Rejected "…" - mean confidence … below … or Rejected "…" - weakest character … below … on readings whose text looks wrong, the image is too
marginal — work through the 7-vs-1 steps above.
If you see it on readings whose text looks correct, that is a different problem: Tesseract does not always report a useful confidence, and a perfectly good reading can come back at zero. Press Stop, then lower Minimum mean confidence (55% by default) and Minimum per-character confidence (70% by default) on the Alerts & Options tab, or set both to 0 to accept whatever the engine returns. A healthy setup reads around 85–99%, so if yours sits far below that consistently, tune the image rather than the floor.
If the date advances but no alerts fire, check that the countries you expect are ticked and that their windows are ahead of the current in-game date.
The app has read a date more than 400 days away from the one it is tracking, or within a week of the same date in another year, and is treating it as a misread. That is correct for a one-off, and it clears by itself as soon as the tracked date is read again.
If the log counts up to a switch (1/10, 2/10, …) and then says Switched to …, one of the two dates was wrong and the app has gone with the one that kept
reading: usually the tracked date was a misread year, such as 2013, or you
loaded another save. Nothing needs doing. If it switched to the wrong one, it
switches back once the real date keeps being read, and reports anything crossed
meanwhile. If this happens often, the region is catching something that is not
the clock, or the year is being misread: check the preview and work through the
7-vs-1 steps above.
A save up to about a year later than the one being tracked looks exactly like a holiday, and a holiday is supposed to report every window it skipped. Next time, press Stop, load the other save, press Reset date, then start again: the gap is not reported, and windows open in that save are. Pressing it after the save has been read is too late for that switch. See Switching between saves.
The Activity Log names the process it searched for. The field accepts fm,
fm.exe or a full path — all are normalised — so if it still cannot find the
game, check the name against Task Manager's Details tab, press Stop, and
update Game process name on the Alerts & Options tab.
Windows suppresses notifications under Focus Assist and over fullscreen apps; the app warns in the log when it detects this. Sound and taskbar flash still work. Use Test alert to check your configuration.
The app declares per-monitor DPI awareness, so its coordinates are physical pixels and should match. If you change your display scaling while it is running, re-snip the region.
git clone https://github.com/AlpayAydinguler/FootballManagerRegenNotifier.git
cd FootballManagerRegenNotifier
dotnet test
dotnet run --project src/FootballManagerRegenNotifier.AppRequires the .NET 10 SDK.
| Project | Target | Purpose |
|---|---|---|
Core |
net10.0 |
Date state machine, trigger calendar, parser, catalog, settings. No UI, no Win32. |
Capture |
net10.0-windows |
Screen capture, preprocessing, OCR, process gate. |
App |
net10.0-windows |
WPF control centre. |
*.Tests |
matching | xUnit. Core.Tests runs anywhere; Capture.Tests needs Windows. |
Core targets plain net10.0 deliberately: the correctness logic is where the
bugs would be expensive and invisible, so the compiler is used to keep screen and
UI code out of it, and its tests run in milliseconds with no desktop.
To regenerate the README screenshots:
dotnet run --project src/FootballManagerRegenNotifier.App -- --screenshot=docs/images/countries.png --tab=1Issues and pull requests are welcome. The most useful contributions:
- Corrected intake dates. The shipped table is FM24-era and every row is
flagged with a confidence level. If you have observed a real date in FM26,
please send it — edit
countries.seed.psv, which is plain text so changes are reviewable in a diff. Nigeria, DR Congo, U.A.E., Hong Kong, Malaysia and Singapore are missing entirely. - Defaults for other resolutions, so first-run calibration is easier.
- FM27 support when it ships in November 2026.
Please keep dotnet test green, and add a test for anything touching
DateTracker — that is the part where a silent bug costs someone an intake.
Warnings are errors in CI.
The source code is MIT licensed. See LICENSE.
Two bundled components are not:
- The youth intake dataset is third-party factual data redistributed with attribution. See data/LICENSE-DATA.md. The application runs without it.
tessdata/eng.traineddatacomes from the Tesseract OCR project under the Apache Licence 2.0. See tessdata/README.md.
Intake windows compiled from Passion4FM; youth ratings from FM Scout.
This is an unofficial tool. It is read-only, intended for single-player use, and is not affiliated with, endorsed by or sponsored by Sports Interactive, SEGA, Passion4FM or FM Scout. Football Manager is a trademark of Sports Interactive and SEGA.
FM Regen Notifier is free and always will be. If it saved you an intake you would otherwise have sailed past, you can support it through GitHub Sponsors — the Sponsor button at the top of this page.
Sponsorship is entirely optional and changes nothing about the tool: no features are held back, and there is no paid tier.
Contributions of the other kind are just as welcome — corrected intake dates in particular. See Contributing.

