-
- Redarc Labs · Where the safety layer holds
-
-
-
+
+
+
+
+
+
+ Field building
+
Growing the field
+
+
+
+ Adversarial interpretability has no dedicated institution — so part of the work is building the field. Alongside the research we teach an open curriculum, give talks, and run hands-on workshops with each cohort.
+
+
+ {[
+ ['Curriculum', '/curriculum'],
+ ['Talks', '/talks'],
+ ['Workshops', '/workshops'],
+ ].map(([label, href]) => (
+
{label}
+ ))}
+
+
+ Community
+
+
+
-
-
-
-
-
-
+
+
+
diff --git a/src/pages/talks.astro b/src/pages/talks.astro
new file mode 100644
index 0000000..e2c5206
--- /dev/null
+++ b/src/pages/talks.astro
@@ -0,0 +1,73 @@
+---
+import Base from '../layouts/Base.astro';
+import { getCollection } from 'astro:content';
+import { formatDate } from '../lib/date';
+
+const talks = (await getCollection('talks', ({ data }) => !data.draft)).sort(
+ (a, b) => b.data.date.valueOf() - a.data.date.valueOf(),
+);
+
+const linkStyle =
+ 'font-family: var(--font-mono); font-size: 0.6875rem; font-weight: 500; letter-spacing: 0.08em; text-transform: uppercase; color: var(--color-ink); text-decoration: none; border-bottom: 1px solid var(--color-rule-strong); padding-bottom: 1px; transition: border-color 120ms;';
+---
+
+
+
+
+
+
+
+
+ Public talks and guest lectures introducing adversarial interpretability to new audiences. Slides and recordings are linked where available.
+
+
+ {talks.length === 0 ? (
+
No talks published yet.
+ ) : (
+ talks.map((t, i) => (
+
+
+ {formatDate(t.data.date)}
+
+ {t.data.venue}{t.data.location ? ` · ${t.data.location}` : ''}
+
+
+
{t.data.title}
+ {t.data.speaker && (
+
{t.data.speaker}
+ )}
+ {t.data.tags.length > 0 && (
+
+ {t.data.tags.map(tag => {tag})}
+
+ )}
+
+
+ ))
+ )}
+
+
+
+
+
+
diff --git a/src/pages/workshops/[...slug].astro b/src/pages/workshops/[...slug].astro
new file mode 100644
index 0000000..894bf82
--- /dev/null
+++ b/src/pages/workshops/[...slug].astro
@@ -0,0 +1,55 @@
+---
+import Base from '../../layouts/Base.astro';
+import { getCollection, render } from 'astro:content';
+import { formatDate } from '../../lib/date';
+
+export async function getStaticPaths() {
+ const workshops = await getCollection('workshops', ({ data }) => !data.draft);
+ return workshops.map((entry) => ({ params: { slug: entry.id }, props: { entry } }));
+}
+
+const { entry } = Astro.props;
+const { Content } = await render(entry);
+const meta = [
+ formatDate(entry.data.date),
+ entry.data.cohort,
+ entry.data.format,
+ entry.data.location,
+].filter(Boolean);
+---
+
+
+
+
+
← Workshops
+
+
Workshop
+
{entry.data.title}
+
{entry.data.summary}
+
+ {meta.join(' · ')}
+
+ {entry.data.tags.length > 0 && (
+
+ {entry.data.tags.map(tag => {tag})}
+
+ )}
+ {entry.data.materials && (
+
+ Materials
+
+
+ )}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/workshops/index.astro b/src/pages/workshops/index.astro
new file mode 100644
index 0000000..4865c00
--- /dev/null
+++ b/src/pages/workshops/index.astro
@@ -0,0 +1,59 @@
+---
+import Base from '../../layouts/Base.astro';
+import { getCollection } from 'astro:content';
+import { formatDate } from '../../lib/date';
+
+const workshops = (await getCollection('workshops', ({ data }) => !data.draft)).sort(
+ (a, b) => b.data.date.valueOf() - a.data.date.valueOf(),
+);
+---
+
+
+
+
+