diff --git a/frontend/src/lib/components/chronik/ChronikEmptyState.svelte b/frontend/src/lib/components/chronik/ChronikEmptyState.svelte
new file mode 100644
index 00000000..ecf2b865
--- /dev/null
+++ b/frontend/src/lib/components/chronik/ChronikEmptyState.svelte
@@ -0,0 +1,92 @@
+
+
+
+ {#if variant === 'first-run'}
+
+ {:else if variant === 'filter-empty'}
+
+ {:else}
+
+ {/if}
+
+
+ {title}
+
+ {#if body}
+
+ {body}
+
+ {/if}
+
diff --git a/frontend/src/lib/components/chronik/ChronikEmptyState.svelte.spec.ts b/frontend/src/lib/components/chronik/ChronikEmptyState.svelte.spec.ts
new file mode 100644
index 00000000..4e3446a4
--- /dev/null
+++ b/frontend/src/lib/components/chronik/ChronikEmptyState.svelte.spec.ts
@@ -0,0 +1,30 @@
+import { describe, it, expect, afterEach } from 'vitest';
+import { cleanup, render } from 'vitest-browser-svelte';
+import { page } from 'vitest/browser';
+
+import ChronikEmptyState from './ChronikEmptyState.svelte';
+
+afterEach(cleanup);
+
+describe('ChronikEmptyState', () => {
+ it('renders first-run variant title', async () => {
+ render(ChronikEmptyState, { variant: 'first-run' });
+ await expect.element(page.getByText('Noch nichts geschehen')).toBeInTheDocument();
+ });
+
+ it('renders filter-empty variant title', async () => {
+ render(ChronikEmptyState, { variant: 'filter-empty' });
+ await expect.element(page.getByText('Nichts in dieser Ansicht')).toBeInTheDocument();
+ });
+
+ it('renders inbox-zero variant title', async () => {
+ render(ChronikEmptyState, { variant: 'inbox-zero' });
+ await expect.element(page.getByText('Keine neuen Erwähnungen')).toBeInTheDocument();
+ });
+
+ it('applies the expected data-variant attribute', async () => {
+ render(ChronikEmptyState, { variant: 'first-run' });
+ const wrapper = document.querySelector('[data-testid="chronik-empty-state"]');
+ expect(wrapper?.getAttribute('data-variant')).toBe('first-run');
+ });
+});
diff --git a/frontend/src/lib/components/chronik/ChronikErrorCard.svelte b/frontend/src/lib/components/chronik/ChronikErrorCard.svelte
new file mode 100644
index 00000000..98de6321
--- /dev/null
+++ b/frontend/src/lib/components/chronik/ChronikErrorCard.svelte
@@ -0,0 +1,46 @@
+
+
+