actualbudget/actual · error · Error
Failed to fetch font file "${ref.cleanPath}" from ${fontUrl}
Error message
Failed to fetch font file "${ref.cleanPath}" from ${fontUrl}: ${response.status} ${response.statusText} What it means
Error "Failed to fetch font file "${ref.cleanPath}" from ${fontUrl}: ${response.status} ${response.statusText}" thrown in actualbudget/actual.
Source
Thrown at packages/desktop-client/src/style/customThemes.ts:607
offset = closeBrace + 1;
searchCss = searchCss.substring(offset);
}
if (fontRefs.length === 0) return css;
// Fetch fonts sequentially to enforce a running total size budget
const fetched: { ref: FontRef; dataUri: string }[] = [];
let totalBytes = 0;
for (const ref of fontRefs) {
const fontUrl = baseUrl + ref.cleanPath;
const perFontTimeout = AbortSignal.timeout(FONT_FETCH_TIMEOUT_MS);
const fetchSignal = signal
? AbortSignal.any([signal, perFontTimeout])
: perFontTimeout;
const response = await fetch(fontUrl, { signal: fetchSignal });
if (!response.ok) {
throw new Error(
`Failed to fetch font file "${ref.cleanPath}" from ${fontUrl}: ${response.status} ${response.statusText}`,
);
}
const buffer = await response.arrayBuffer();
if (buffer.byteLength > MAX_FONT_FILE_SIZE) {
throw new Error(
`Font file "${ref.cleanPath}" exceeds maximum size of ${MAX_FONT_FILE_SIZE / 1024 / 1024}MB.`,
);
}
totalBytes += buffer.byteLength;
if (totalBytes > MAX_TOTAL_FONT_SIZE) {
throw new Error(
`Total embedded font data exceeds maximum of ${MAX_TOTAL_FONT_SIZE / 1024 / 1024}MB.`,
);
}
const base64 = arrayBufferToBase64(buffer);
fetched.push({ ref, dataUri: `data:${ref.mime};base64,${base64}` });
}View on GitHub (pinned to d4334cb6e6)
When it happens
Trigger: Thrown at packages/desktop-client/src/style/customThemes.ts:607 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of actualbudget/actual@d4334cb6e6 (2026-08-29).
Data as JSON: /api/errors/91ff90b9f2c57ce9.
Report an issue: GitHub.