The sidebar is the 180-pixel Win95 column pinned to the left of every career screen: your team header, the app list, the department gauges, the taskbar clock and the budget line. The Desktop is the old icon screen it grew out of — still reachable, still keyboard-driven, but no longer the default view. This page is the navigation map: every app, where it goes, when it is locked, and how the app area scrolls.
How to open it
- The sidebar is always there on career screens that declare
has_sidebar()— the Hub, every app, every profile page. Race-weekend screens (live sessions, run plans, podium, debrief) do not draw it. - The Desktop (the icon field over the background image) is the screen behind the sidebar when no app is open. It is reached implicitly by the phase-transition flow; you will normally see the Hub instead.
- The Weekend Loadout is a full-page screen with no sidebar.
The sidebar, top to bottom
1. Team header
PFS <Team Name> over a status line that changes with the phase:
| State | Status line |
|---|---|
| Mid-season window | Season N — Free Weekend — Turn n/3 |
| In season | Season N — GP n/20 |
| Season over | Season N — Complete |
| Phase 2 or 3 | Negotiation — Turn X/10 (the two phases share one window) |
| Any other phase | Phase N/6 — Turn X/5 (turn part only on multi-turn phases) |
2. The app list
Eighteen entries, in one fixed order that never changes between pre-season and season:
| # | Entry | Opens |
|---|---|---|
| 15 | Hub | Career Hub |
| 5 | News | PFS Media |
| 4 | PFS Mail — suffixed (N) when there is unread mail | |
| 11 | Standings | Competition |
| 20 | PFS Series | Series page |
| 12 | Calendar | Calendar |
| 6 | Finance | Finance |
| 10 | Car | Car app — also the entry point for R&D |
| 9 | Team | My Team |
| 2 | Scouting | Scouting |
| 0 | Infrastructure | Infrastructure |
| 18 | Academy | Driver Academy |
| 1 | Marketing | Marketing — the merged Sponsors + Suppliers app |
| 14 | World Data | World Data |
| 17 | Bug Report | the bug-report packager |
| 7 / 8 | End Phase / Next Turn / Next GP / Free Weekend / Next Season | advances the career |
| 19 | Settings | Career Settings |
| 16 | Log Out | quit to menu, via the Hub’s confirmation dialog |
Two legacy icons no longer have their own entry: Suppliers (folded into Marketing since 0.4.1) and R&D (the Car icon opens the merged Car/R&D app).
Button styling tells you the state at a glance:
- Raised, plain beige — normal.
- Raised with a warm accent and bold text — the suggested app for the current pre-season phase: Infrastructure in phase 1, Marketing in phases 2 and 3, Scouting in phase 4, the advance button in phase 5, R&D in phase 6. No suggestion is shown in season.
- Sunken red with white bold text — the app currently open.
- Flat and muted — locked. Clicking pops the reason.
3. Taskbar clock
A sunken Win95 tray well showing your system clock (HH:MM). In a multiplayer career it shows the shared-turn countdown instead, turning red under a minute.
4. Department gauges
Six sunken wells, each a read-out with a hover tooltip and a click route:
| Gauge | Shows | Tooltip | Click opens |
|---|---|---|---|
| Hammer | N WU | Engineering — Work Units left for weekend repairs | Car / R&D |
| Flask | N WU | R&D — WU left for designs and improvements (private-testing maintenance is charged at each race weekend) | Car / R&D |
| Magnifier | free/total | Scouting — observation capacity | Scouting |
| Handshake | free/total | Marketing — WU for negotiation missions | Marketing |
| (money) | $X/GP | Estimated net income per Grand Prix — green if ≥ 0, red below | Finance |
| Star | N | Team reputation — drives sponsor deals, driver interest and prize money | My Team |
The R&D figure is rnd_wu_remaining minus the private-testing reserve. It is deliberately not double-reserved: the testing maintenance is already debited for real at each post-race refill, and an extra display-side reserve used to make this gauge disagree with the R&D tabs.
The gauges are read-outs, not focus stops — they were removed from the gamepad focus ring because they sat between the app list and nothing and swallowed D-pad presses meant for the apps. Mouse clicks still route.
5. Budget line
Budget: $X at the very bottom — green while positive, red once negative.
Which apps are locked, and why
Every app is visible from phase 1. Locked ones render dimmed and pop a Win95 dialog naming the unlock. Locks apply only during the pre-season — once the season starts, locked_reason returns nothing and every app is open.
| App | Locked when | Message |
|---|---|---|
| Infrastructure | after phase 1 | ”The facilities plan is locked after Phase 1 — Infrastructure. It opens again once the season starts.” |
| Marketing | before phase 2 | ”Available in Phase 2 — the negotiation window opens (Marketing: sponsors & suppliers).” |
| Marketing | after phase 3 | ”The negotiation window is closed. Marketing opens again once the season starts.” |
| Team | before phase 5, and only in season 1 | ”Available from Phase 5 — Car Review, once your driver line-up is locked in.” |
| Car | before phase 5 | ”Available from Phase 5 — Car Review, once the season car build begins.” |
| Academy | after phase 1, while the Driver Academy department is closed | ”Opens once the Driver Academy department is built (Infrastructure, Phase 1).” |
| Standings, World Data | always, in pre-season | ”Available once the season starts.” |
The My Team rule is the subtle one: from season 2 onward the team carries a standing line-up through the rollover, so has_roster (season ≥ 2) unlocks it in every pre-season phase. Only a brand-new career has nothing to show before the first driver negotiation.
The logic behind the lock list is the phase model itself: a phase is a window, and it closes. Infrastructure spending is committed at the end of phase 1; the sponsor/supplier negotiation window spans phases 2–3 and expires at the end of phase 3 (unclaimed ready deals are withdrawn by email, missing supplier categories get emergency contracts). You cannot go back and redo a closed window.
Apps opened from other apps
Several screens are not in the sidebar at all and are only reachable through a link:
| Screen | Reached from |
|---|---|
| Driver Profile | any clickable driver name, a news headline, a mail’s driver card, Scouting, Standings |
| Team Profile | any clickable team name, news, Standings |
| Circuit Profile | the Hub’s next-GP name, the Calendar, the Debrief |
| Manufacturer Profile | World Data → Manufacturers |
| Country Profile | any clickable flag, the PFS Series page’s Countries tab |
| Development Series | World Data → Series, and the PFS page’s ladder strip |
| Mid-Season Window | the Free Weekend advance turns after GP 10 |
| R&D tabs (Inventory, Production, Repair, Improve, Design, Projects, Private Testing) | the Car / R&D app |
| The Mod Editor and Circuit Editor | the main menu only (Modding Tools / Dev Tools), never from a career |
Mails can also deep-link: a delivered-part mail jumps to R&D → Inventory, a design-ready mail to R&D → Production, a scouting mail to Scouting → Missions, a finance mail to Finance, an academy report to the Academy app, and a negotiation mail to Marketing → Missions.
The generic app scroll
Career apps do not clip. Instead, every sidebar screen except the Desk opts into one shared vertical page scroll:
- The mouse wheel scrolls, but only while the cursor is right of the sidebar (or a gamepad is active) — so the wheel never fights the sidebar.
- A purple Win95 scrollbar appears on the right edge, and only when the content genuinely overflows: the range is
content_height − (screen height − pinned footer height), and anything under a 16 px tolerance counts as “fits”. That tolerance exists because app templates usemin-height:100%, so the status bar always reaches the screen bottom whether or not there is real overflow. - The scroll position resets to 0 whenever you change app.
- The range is measured from the real laid-out content height, not from the lowest pixel drawn. An earlier version used the on-screen extent, which grew by 16 px on every scroll step and let the page run off into empty black space.
- Each app open (and any change in the range) logs one
[app-scroll] <Screen> ui_scale=… viewport_h=… content_h=… overflow=… max_scroll=…line todebug.log. If a list looks cut off at 150 % UI scale, that line is the diagnostic.
One documented exception: the Scouting app’s Browse tab virtualises its 400-row list with its own row window and scrollbar, so it opts out of the page scroll. Every other Scouting tab opts back in — two hand-rolled windowing attempts sized by estimated row heights kept cutting the Missions list at the bottom; the generic scroll measures instead of estimating.
Controls
| Input | Effect |
|---|---|
| Mouse | Click any app button, gauge, or Desktop icon |
| D-pad up/down | Switch app directly, from the Hub or any open app — skipping locked apps, the advance button and Log Out |
| Start (≡) | Fires End Phase / Next GP from any app screen |
| A | Open the highlighted entry (Desktop cursor) |
| B / Escape / Q | Back out; on the Desktop it returns to the main menu |
| S | Toggle the Desktop status overlay |
The D-pad refuses to land on the advance button or Log Out on purpose: both are irreversible, and both must be a deliberate A press. A modal dialog suppresses Start for the same reason — the dialog owns its buttons.
Advanced
- The Desk owns its own cursor. On the Desktop screen, the highlighted sidebar entry is the desk cursor’s hover, not an open app, and the sidebar’s D-pad handler stands down (
nav_claimed). Everywhere else the sidebar drives. - An app with no sidebar icon still works with the pad. A screen whose icon is not in the visible set (the Academy, for instance) starts D-pad navigation from the top of the list rather than disabling it — an earlier version left the sidebar unusable from such screens until the mouse rescued it.
- The sidebar template is cached and only re-parsed when its variables change, which is why the clock ticks but the list does not flicker.
- Log Out never quits directly. It routes to the Hub and raises the quit confirmation there, so you always get “Your progress has been saved” before leaving.
- Locks are pre-season only. If an app you expect to be closed is open, check whether the season has started —
season_statebeing present disables the whole lock table. - Impersonation (dev builds). With
--dev, F7 impersonates an AI team; while impersonating, End Phase / Next GP are inert and a red banner is drawn across the top. screen_label()names every screen for the GPU watchdog line indebug.log— including telling a live race (RaceLive) from a headless simulate (RaceSim). If you file a bug about memory growth, the label in that log line identifies which screen was open.
Common mistakes
- Hunting for a Suppliers icon. There isn’t one — Marketing tab 3 is Suppliers, tab 4 is the Supplier Market.
- Hunting for an R&D icon. There isn’t one either — the Car icon opens the merged Car/R&D app, and it carries R&D’s phase-5 unlock rule.
- Assuming a dimmed app is broken. Click it: the dialog names the exact phase it opens (or closes).
- Trying to redo Infrastructure in phase 3. The facilities plan is committed at the end of phase 1 and does not reopen until the season starts.
- Scrolling with the cursor over the sidebar. The wheel is deliberately ignored there; move right of the 180 px column.
- Expecting the wheel to work on the Desktop. The Desk keeps a fixed layout and is the one sidebar screen excluded from the page scroll.
- Pressing Start to skip a dialog. Modals suppress it; answer the dialog first.
See also
- Career Hub — the home screen and every advance gate
- New Career — the six pre-season phases the locks follow
- PFS Mail · News
- Marketing — the merged Sponsors + Suppliers app
- Career Settings — UI scale, which changes what overflows
- R&D · My Team · Scouting
- Glossary