Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
dde3725
Add the Telegraph introduction deck for 9 October 2026
vahid-ahmadi Oct 8, 2026
6476acc
Telegraph deck: more users, eight press and work cards, map and scatter
vahid-ahmadi Oct 8, 2026
22170f9
Telegraph deck: newest citations, land value tax post, overview and map
vahid-ahmadi Oct 8, 2026
3d90679
Telegraph deck: organisation cards with CPS, new cover title
vahid-ahmadi Oct 8, 2026
d32ca93
Telegraph deck: community logos, Neidle thread, slide 2 cards
vahid-ahmadi Oct 8, 2026
ceea620
Telegraph deck: Good Growth Foundation logo and borderless community …
vahid-ahmadi Oct 8, 2026
a309bdd
Telegraph deck: add the CapX citation
vahid-ahmadi Oct 8, 2026
b54ec03
Telegraph deck: grouped community rows, Telegraph and Fabian cards
vahid-ahmadi Oct 8, 2026
f577c1a
Telegraph deck: community slide as a single logo grid
vahid-ahmadi Oct 8, 2026
75dd0ce
Telegraph deck: NEF job-quality report replaces the Fabian card
vahid-ahmadi Oct 8, 2026
fcae68c
Telegraph deck: drop the cover subtitle
vahid-ahmadi Oct 9, 2026
75af9e0
Rename the introduction deck so its address doesn't name the outlet
vahid-ahmadi Oct 9, 2026
1c16f14
Correct the Telegraph date, the open-data claim and the Lords card
MaxGhenis Oct 9, 2026
b3d515a
Match the Budget slides to what we did and can do, and fix three cards
MaxGhenis Oct 9, 2026
e9a0494
Say what PolicyEngine contributed on each press card
MaxGhenis Oct 9, 2026
b73e5c9
Shorten three press-card lines so they fit two lines
MaxGhenis Oct 9, 2026
e8b78ec
Add the House of Lords logo to the community slide
vahid-ahmadi Oct 9, 2026
b0c2f33
Merge main into introduction-october-2026
vahid-ahmadi Oct 25, 2026
11ff24e
Rework the deck for the Autumn Budget 2026: intro, preparation, past …
vahid-ahmadi Oct 25, 2026
a25aa97
Webinar deck: one intro slide, a dashboard QR code and a cleaner close
vahid-ahmadi Oct 25, 2026
ad8287a
Webinar deck: a brief "What PolicyEngine is", and no footer text
vahid-ahmadi Oct 25, 2026
b186727
Webinar deck: the analysis as one live-dashboard slide
vahid-ahmadi Oct 25, 2026
56b9755
Webinar deck: embed the live dashboard on the analysis slide
juaristi22 Oct 26, 2026
ef40fcd
Webinar deck: five mock Budgets, Modal, and the dashboard's new tabs
vahid-ahmadi Oct 26, 2026
f5514e5
Webinar deck: drop the Past Budgets slide (5 slides)
vahid-ahmadi Oct 26, 2026
4f9e77c
Webinar deck: embed the Drill 5 build of the dashboard on the analysi…
juaristi22 Oct 26, 2026
870da6a
Webinar deck notes: #185 has merged, so the live site has the new tabs
juaristi22 Oct 26, 2026
49537b0
Webinar deck: point the analysis slide at the drill's stable address
juaristi22 Oct 26, 2026
aeadf8f
Webinar deck: lay the slides out like the BLS and CPID decks
juaristi22 Oct 26, 2026
4f5bcdc
Webinar deck: say what PolicyEngine is, list the main rules, add last…
juaristi22 Oct 26, 2026
e23d3ee
Webinar deck: point the analysis slide and the closing QR code at the…
juaristi22 Oct 28, 2026
ea72ca7
Webinar deck: no UK on the cover, preparation slide for a general aud…
juaristi22 Oct 28, 2026
e0106f4
Webinar deck: credit the Nuffield Foundation on the closing slide
MaxGhenis Oct 26, 2026
7d20716
Webinar deck: serve it at /slides/autumn-budget-2026
MaxGhenis Oct 28, 2026
20e6a16
Merge pull request #82 from PolicyEngine/webinar-nuffield-credit
MaxGhenis Oct 28, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions lib/slideshows.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,10 @@ import { overhang2026LightningConfig } from "@/slideshows/overhang-2026-lightnin
import { blsTaxsim2026Config } from "@/slideshows/bls-taxsim-2026/config";
import { scottishGovernment2026Config } from "@/slideshows/scottish-government-2026/config";
import { goodGrowthFoundation2026Config } from "@/slideshows/good-growth-foundation-2026/config";
import { autumnBudget2026Config } from "@/slideshows/autumn-budget-2026/config";

export const slideshows: SlideshowConfig[] = [
autumnBudget2026Config,
goodGrowthFoundation2026Config,
scottishGovernment2026Config,
blsTaxsim2026Config,
Expand Down
10 changes: 10 additions & 0 deletions next.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ const nextConfig: NextConfig = {
env: {
NEXT_PUBLIC_BASE_PATH: '/slides',
},
// The Autumn Budget 2026 webinar deck was introduction-2026 until 28 October.
async redirects() {
return [
{
source: '/introduction-2026/:path*',
destination: '/autumn-budget-2026/:path*',
permanent: true,
},
];
},
// Pin the workspace root so Turbopack does not silently pick up a stray
// lockfile from a parent directory during local development or CI.
turbopack: {
Expand Down
1 change: 1 addition & 0 deletions public/images/autumn-budget-2026/dashboard-qr.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions public/logos/funders/nuffield-foundation-white.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added public/logos/orgs/good-growth-foundation.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
33 changes: 33 additions & 0 deletions slideshows/autumn-budget-2026/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Analysing the Autumn Budget 2026 with PolicyEngine

5 slides at `/slides/autumn-budget-2026`, for the 28 October 2026 webinar
(`/slides/introduction-2026` redirects here):
what PolicyEngine is, how we prepared for Budget day, and a slide with the live
[Autumn Budget 2026 dashboard](https://ab2026-local-preview.vercel.app/uk/autumn-budget-2026)
embedded in it, where the analysis is presented. The closing slide links the
same address, with its QR code, and credits the Nuffield Foundation, which
funds our UK Budget analysis.

- `config.ts` controls the slide order and metadata.
- `content.ts` holds the sources, the three pillars of What PolicyEngine is,
the dates of the Budget-day rehearsals (the mock Budgets) and the
preparation items, written for a general audience.
- `slides/index.tsx` contains the slides. The analysis slide embeds the
dashboard itself (`slides/DashboardEmbed.tsx`): Expand stretches the same
frame over the whole screen, so whatever is open in it is kept, and New tab
opens it in the browser. Buttons in its bar load the Public finances,
Pensioners (By age) and Living standards sub-tabs and the Household
calculator tab into the frame. The deck draws no charts of its own, so nothing
here goes stale when the dashboard's data change.
- `SPEAKER-NOTES.md` gives the presenter track.

`public/images/autumn-budget-2026/dashboard-qr.svg` encodes
the dashboard's address.

`public/logos/funders/nuffield-foundation-white.svg` is the Nuffield
Foundation's white logo, downloaded from nuffieldfoundation.org on 22 October
2026 (3,432 bytes, SHA-256
`b3727385be9295f8daa3938c745f87b2e00e5675130354f6394ae6b3fec5654c`). That day
its communications team asked for "funded" rather than "supported", and for
its logo, the white version on a dark background. Keep the file as
downloaded; don't recolour or redraw it.
70 changes: 70 additions & 0 deletions slideshows/autumn-budget-2026/SPEAKER-NOTES.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
# Speaker notes: Analysing the UK Autumn Budget 2026 with PolicyEngine

## 1. Title

Webinar, Wednesday 28 October 2026, 4:30pm UK time. Presenters: Vahid
Ahmadi, Max Ghenis, María Juaristi.

## 2. What PolicyEngine is

A brief view: PolicyEngine in one line (a nonprofit building free,
open-source tools, in policyengine.org's own words), then the rules, the
households and the results, and that all the code is public.

## 3. How we prepared

The slide is for a general audience: the rehearsals and what they gave us.
The detail below is background, if asked.

- Last year's Budget (26 November 2025): the dashboard went live on Budget
day, and the other measures and the household calculator followed by 28
November (the 2025 dashboard repo's commit history).
- Five Budget-day rehearsals, the mock Budgets (28 September; 5, 12, 19 and
26 October): drill issues #6 (with the drill 1 retrospective), #8, #10, #53
and #144 in the dashboard repo.
- The model and data: the policyengine package 6.11.1, with policyengine-uk
2.151.0 and the Microcosm UK 2024-25 households. The live dashboard's
publication manifest records it for every measure and the package, and
main's uv.lock pins it (28 October).
- National results run on Modal, one machine per measure: all ten units (nine
measures and the package) took 8.1 minutes on 26 October (dashboard PR
#178). The household calculator also runs on Modal and is kept warm.
- Mark anything still in review as such on the slide before presenting.

## 4. The analysis: live dashboard

The dashboard itself is on the slide; it loads while slide 3 is showing.
Press **Expand** to fill the screen with it and present from there. **Back to
the slide** returns to the deck with the same tab, measures and household
still open. **New tab** opens it in a browser tab, if the embedded copy ever
misbehaves.

While you are using the dashboard, the arrow keys, Space and a clicker go to
it, not to the deck (the arrows switch its tabs). Press **Back to the slide**,
or click the bar above the dashboard, before moving on.

The buttons in the bar (Public finances, Pensioners, Living standards,
Household calculator) load that view into the frame; each click reloads it,
so measures or a household chosen in the frame are not kept. Its tabs:

- **Population impact**, with five sub-tabs: **Public finances** (the
default: revenue by year and the OBR comparison), **All households** (the
constituency map and households by income), **By age** (the Pensioners
button opens it at pensioners), **Living standards** (income by decile and
inequality) and **Poverty**.
- **Household calculator**: run one household live with Calculate, or pick
an example card.
- **Pre-measures forecast**: the outlook before the Budget's measures, with
the OBR forecast named on the tab.
- **Policies**: what each measure does.
- **Methodology**.

These are the tabs at ab2026-local-preview.vercel.app/uk/autumn-budget-2026
on 28 October. The frame and the closing slide's link and QR code all open
that address.

## 5. Close

The dashboard link, with a QR code for phones, and how to reach us. Thank
the Nuffield Foundation, which funds our UK Budget analysis ("funded by",
not "supported by").
26 changes: 26 additions & 0 deletions slideshows/autumn-budget-2026/config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import type { SlideshowConfig } from "@/lib/types";
import {
ClosingSlide,
DashboardSlide,
PreparationSlide,
TitleSlide,
WhatSlide,
} from "./slides";

export const autumnBudget2026Config: SlideshowConfig = {
id: "autumn-budget-2026",
title: "Analysing the Autumn Budget 2026 with PolicyEngine",
description:
"What PolicyEngine is, how we prepared for Budget day, and the analysis, presented live on the dashboard.",
date: "2026-10-28",
location: "PolicyEngine",
// The slides keep this clear of the viewer's slide counter (deck.module.css).
footerText: "Autumn Budget 2026 webinar · 28 October 2026",
slides: [
TitleSlide,
WhatSlide,
PreparationSlide,
DashboardSlide,
ClosingSlide,
],
};
144 changes: 144 additions & 0 deletions slideshows/autumn-budget-2026/content.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
// Content for the PolicyEngine and Autumn Budget 2026 deck.

export type Source = { label: string; href: string };

export const sources = {
home: { label: "policyengine.org", href: "https://www.policyengine.org/uk" },
model: {
label: "PolicyEngine UK code",
href: "https://github.com/PolicyEngine/policyengine-uk",
},
data: {
label: "Microcosm data pipeline",
href: "https://github.com/PolicyEngine/microcosm",
},
hansard: {
label: "Hansard, 24 February 2026",
href: "https://hansard.parliament.uk/Lords/2026-02-24/debates/A381F7D6-0A3C-48FD-8D9E-67751E25877A/NationalInsuranceContributions(EmployerPensionsContributions)Bill",
},
tpa: {
label: "Tax Policy Associates, September 2026",
href: "https://taxpolicy.org.uk/2026/09/10/universities-uk-national-insurance-proposal/",
},
cps: {
label: "Centre for Policy Studies, July 2023",
href: "https://cps.org.uk/research/family-friendly-taxation/",
},
nuffield: {
label: "Nuffield Foundation project",
href: "https://www.nuffieldfoundation.org/project/enhancing-localising-and-democratising-tax-benefit-policy-analysis",
},
nef: {
label: "New Economics Foundation, July 2026",
href: "https://neweconomics.org/2026/07/insecure-low-quality-work-a-major-driver-of-uks-neets-and-inactivity-crisis",
},
no10Post: {
label: "PolicyEngine at No 10",
href: "https://www.policyengine.org/uk/research/policyengine-10-downing-street",
},
// The dashboard the webinar presents, on the analysis slide and in the
// closing slide's link and QR code. The host alone returns 404.
dashboard: {
label: "Autumn Budget 2026 dashboard",
href: "https://ab2026-local-preview.vercel.app/uk/autumn-budget-2026",
},
dashboardCode: {
label: "Dashboard code",
href: "https://github.com/PolicyEngine/uk-autumn-budget-dashboard-2026",
},
dashboard2025Code: {
label: "2025 dashboard code",
href: "https://github.com/PolicyEngine/uk-autumn-budget-dashboard",
},
};

// How policyengine.org/uk/donate describes PolicyEngine.
export const about =
"PolicyEngine is a nonprofit building free, open-source tools that help people understand tax and benefit policies.";

// The Nuffield Foundation's credit. On 22 October its communications team
// asked for "funded" rather than "supported", and for its logo, the white
// version on a dark background. The logo is the white one from
// nuffieldfoundation.org, kept as downloaded (3,432 bytes, SHA-256
// b3727385…); its own size is 117.862 by 70.
export const funder = {
label: "Funded by",
name: "Nuffield Foundation",
logo: "/logos/funders/nuffield-foundation-white.svg",
width: 118,
height: 70,
};

// What PolicyEngine is: the rules, the households and the results. The rules
// are the main ones in the Good Growth Foundation deck's checked list.
export const pillars = [
{
title: "Rules",
items: [
"Income tax and National Insurance",
"Universal Credit and other benefits",
"State Pension and Pension Credit",
"VAT, fuel duty and capital gains tax",
],
},
{
title: "Households",
items: [
"Built from the Family Resources Survey",
"With HMRC tax records and other surveys",
"Weighted to match official statistics",
"Or enter any household yourself",
],
},
{
title: "Results",
items: [
"Cost or saving to the Treasury",
"Who gains and loses, by income decile",
"Poverty and inequality",
"By region and constituency",
],
},
];

// Last year's Budget, from the 2025 dashboard's commit history: the dashboard
// went live on the day, and the other measures and the household calculator
// followed by 28 November.
export const lastBudget = {
title: "Autumn Budget 2025",
text: "Analysed on the day, 26 Nov",
};

// The five Budget-day rehearsals (the mock Budgets): full runs of the day on
// invented measures.
export const mockBudgets = ["28 Sep", "5 Oct", "12 Oct", "19 Oct", "26 Oct"];

export type PrepItem = { title: string; text: string; status: "Done" | "In review" };

// Written for a general audience: the technical detail is in the speaker
// notes. Each line is checked against PolicyEngine/uk-autumn-budget-dashboard-2026;
// the version is the one in the live dashboard's publication manifest and in
// main's uv.lock on 28 October.
export const preparation: PrepItem[] = [
{
title: "Fixed model and data",
text: "Every figure comes from PolicyEngine 6.11.1 and the same set of households, so anyone can reproduce it.",
status: "Done",
},
{
title: "A household calculator",
text: "Enter any household to see how the measures change its income, live on the dashboard.",
status: "Done",
},
{
title: "Every measure in about 8 minutes",
text: "The cost of each measure, and who gains and loses, worked out all at once rather than one by one.",
status: "Done",
},
{
title: "Each measure published once reviewed",
text: "A measure goes on the dashboard as soon as its figures have been checked.",
status: "In review",
},
];

31 changes: 31 additions & 0 deletions slideshows/autumn-budget-2026/funder.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { createHash } from "node:crypto";
import { readFileSync } from "node:fs";
import path from "node:path";
import { describe, expect, it } from "vitest";
import { funder } from "./content";

// The white logo as downloaded from nuffieldfoundation.org on 22 October. Keep
// it byte for byte: don't recolour or redraw it.
const DOWNLOADED_SHA256 =
"b3727385be9295f8daa3938c745f87b2e00e5675130354f6394ae6b3fec5654c";

describe("the Nuffield Foundation credit on the closing slide", () => {
const file = path.join(__dirname, "../../public", funder.logo);
const bytes = readFileSync(file);

it("uses the logo exactly as downloaded", () => {
expect(bytes.length).toBe(3432);
expect(createHash("sha256").update(bytes).digest("hex")).toBe(DOWNLOADED_SHA256);
});

it("matches the logo's own dimensions", () => {
const svg = bytes.toString("utf8");
const size = (name: string) => Number(svg.match(new RegExp(`${name}="([\\d.]+)"`))?.[1]);
expect(Math.round(size("width"))).toBe(funder.width);
expect(Math.round(size("height"))).toBe(funder.height);
});

it('reads "Funded by"', () => {
expect(funder.label).toBe("Funded by");
});
});
Loading
Loading