PageSourceSearch

https://natolambert.com/slides

html natolambert.com collected 2026-10-03 21:21:41 UTC 10,041 bytes, 288 lines download raw bytes

1<!DOCTYPE html>
2<html data-wf-page="slides-gallery" data-wf-site="5fff4548993f61212dec8c3a">
3<head>
4  <meta charset="utf-8">
5  <title>Library - Nathan Lambert</title>
6  <meta content="Nathan Lambert's library of talk slides, recordings, and presentations on reinforcement learning, language models, and AI research." name="description">
7  <meta content="Library - Nathan Lambert" property="og:title">
8  <meta content="Nathan Lambert's library of talk slides, recordings, and presentations on reinforcement learning, language models, and AI research." property="og:description">
9  <meta content="Library - Nathan Lambert" property="twitter:title">
10  <meta content="Nathan Lambert's library of talk slides, recordings, and presentations on reinforcement learning, language models, and AI research." property="twitter:description">
11  <meta property="og:type" content="website">
12  <meta content="summary_large_image" name="twitter:card">
13  <meta content="width=device-width, initial-scale=1" name="viewport">
14  <link href="style.css" rel="stylesheet" type="text/css">
15  <link href="https://fonts.googleapis.com" rel="preconnect">
16  <link href="https://fonts.gstatic.com" rel="preconnect" crossorigin="anonymous">
17  <link href="https://fonts.googleapis.com/css2?family=Lato:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&family=Merriweather:ital,wght@0,300;0,400;0,700;0,900;1,300;1,400;1,700;1,900&family=Exo:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap" rel="stylesheet">
18  <link href="assets/icons/favicon.png" rel="shortcut icon" type="image/x-icon">
19  <link href="assets/icons/webclip.png" rel="apple-touch-icon">
20  <link href="https://natolambert.com/slides" rel="canonical">
vendor: 69 bytes, lines 20-21
20
21  <script async="" src="https://www.googletagmanager.com/gtag/js?id=
21G-4V75Z4K57V
vendor: 14 bytes, lines 21-22
21"></script>
22  
22<script type="text/javascript">
23    
vendor: 142 bytes, lines 23-26
23window.dataLayer = window.dataLayer || [];
24    function gtag() { dataLayer.push(arguments); }
25    gtag('js', new Date());
26    gtag('config', '
26G-4V75Z4K57V
vendor: 30 bytes, lines 26-27
26', {'anonymize_ip': true});
27  
27</script>
27
28  <style>
29    .slides-grid {
30      display: grid;
31      grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
32      gap: 24px;
33      margin-top: 24px;
34    }
35    .slide-card {
36      border: 1px solid #e0e0e0;
37      border-radius: 8px;
38      overflow: hidden;
39      transition: box-shadow 0.2s ease, transform 0.2s ease;
40      background: #fff;
41    }
42    .slide-card:hover {
43      box-shadow: 0 4px 12px rgba(0,0,0,0.15);
44      transform: translateY(-2px);
45    }
46    .slide-card a.slide-link {
47      text-decoration: none;
48      color: inherit;
49      display: block;
50    }
51    .slide-thumbnail-container {
52      position: relative;
53      width: 100%;
54      aspect-ratio: 16/9;
55      background: #f5f5f5;
56      overflow: hidden;
57    }
58    .slide-thumbnail-link-overlay {
59      position: absolute;
60      inset: 0;
61      z-index: 1;
62    }
63    .slide-thumbnail {
64      width: 100%;
65      height: 100%;
66      object-fit: cover;
67      display: block;
68    }
69    .slide-iframe-preview {
70      position: absolute;
71      top: 0;
72      left: 0;
73      width: 1280px;
74      height: 720px;
75      border: 0;
76      display: block;
77      background: #fff;
78      pointer-events: none;
79      transform: scale(var(--preview-scale, 0.25));
80      transform-origin: top left;
81    }
82    .slide-thumbnail-placeholder {
83      width: 100%;
84      height: 100%;
85      background: linear-gradient(135deg, #e8e8e8 0%, #f5f5f5 100%);
86      display: flex;
87      align-items: center;
88      justify-content: center;
89      color: #999;
90      font-size: 14px;
91      font-style: italic;
92    }
93    .recording-badge {
94      position: absolute;
95      top: 8px;
96      right: 8px;
97      background: rgba(0, 0, 0, 0.75);
98      color: #fff;
99      font-size: 11px;
100      font-weight: 500;
101      padding: 4px 8px;
102      border-radius: 4px;
103      text-decoration: none;
104      display: flex;
105      align-items: center;
106      gap: 4px;
107      transition: background 0.2s ease;
108    }
109    .recording-badge:hover {
110      background: rgba(0, 0, 0, 0.9);
111    }
112    .recording-badge svg {
113      width: 12px;
114      height: 12px;
115      fill: currentColor;
116    }
117    .pdf-badge {
118      position: absolute;
119      top: 8px;
120      left: 8px;
121      background: rgba(255, 255, 255, 0.92);
122      color: #222;
123      font-size: 11px;
124      font-weight: 600;
125      padding: 4px 8px;
126      border-radius: 4px;
127      text-decoration: none;
128      transition: background 0.2s ease;
129      z-index: 2;
130    }
131    .pdf-badge:hover {
132      background: rgba(255, 255, 255, 1);
133    }
134    .slide-info {
135      padding: 16px;
136    }
137    .slide-title {
138      font-size: 16px;
139      font-weight: 600;
140      margin: 0 0 8px 0;
141      line-height: 1.3;
142      color: #333;
143    }
144    .slide-meta {
145      font-size: 13px;
146      color: #666;
147      margin: 0;
148      line-height: 1.4;
149    }
150    .slide-date {
151      font-weight: 500;
152      color: #555;
153    }
154    .year-section {
155      margin-top: 40px;
156    }
157    .year-section:first-of-type {
158      margin-top: 24px;
159    }
160    .year-heading {
161      font-size: 24px;
162      font-weight: 600;
163      color: #333;
164      margin-bottom: 16px;
165      padding-bottom: 8px;
166      border-bottom: 2px solid #333;
167    }
168  </style>
169</head>
170<body class="body">
171  <div class="content-wrapper">
172    <div class="w-container">
173      <div class="white-wrapper">
174        <div style="display: flex; justify-content: space-between; align-items: flex-start; margin-bottom: 20px;">
175          <h1 class="heading-tight" style="margin: 0;">Library</h1>
176          <a href='/' style='text-decoration: none; color: #666; font-size: 14px;'>← Home</a>
177        </div>
178        <div class="blog-body w-richtext">
179          <p>Talks, slides, and recordings. Click any card to open the full presentation. Recordings available on my <a href="https://www.youtube.com/@natolambert">YouTube page</a> and <a href="https://youtube.com/@interconnects">Interconnects</a>.</p>
180        </div>
181        <div id="slides-container"></div>
182      </div>
183    </div>
184  </div>
185  <footer style="text-align: center; padding: 20px; border-top: 1px solid #eee; margin-top: 20px;">
186    <div style="margin-bottom: 10px;">
187      <a href='/' style='margin: 0 15px; text-decoration: none; color: #333;'>Home</a>
188      <a href='/contact' style='margin: 0 15px; text-decoration: none; color: #333;'>Contact</a>
189    </div>
190    <div style="font-size: 14px; color: #666;">
191      Copyright © 2021-2026 Nathan Lambert.
192    </div>
193  </footer>
194  
194<script>
195    const playIcon = '<svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>';
196
197    function getSlidesUrl(slide) {
198      return slide.slidesUrl || `https://docs.google.com/presentation/d/${slide.slidesId}/edit`;
199    }
200
201    function getThumbnailUrl(id) {
202      return `https://lh3.googleusercontent.com/d/${id}=w1200`;
203    }
204
205    function getPreviewUrl(slide) {
206      if (!slide.previewUrl) return '';
207      try {
208        const url = new URL(slide.previewUrl, window.location.href);
209        url.searchParams.set('capture', '1');
210        return url.toString();
211      } catch (err) {
212        return slide.previewUrl;
213      }
214    }
215
216    function createSlideCard(slide) {
217      const slidesUrl = getSlidesUrl(slide);
218      const previewUrl = getPreviewUrl(slide);
219      const previewHtml = slide.previewUrl
220        ? `<iframe class="slide-iframe-preview" src="${previewUrl}" title="${slide.title} preview" loading="lazy"></iframe>`
221        : slide.noPreview
222          ? '<div class="slide-thumbnail-placeholder">No preview available</div>'
223          : `<img class="slide-thumbnail" src="${getThumbnailUrl(slide.slidesId)}" alt="${slide.title} slides" loading="lazy">`;
224
225      const recordingBadge = slide.recordingUrl
226        ? `<a href="${slide.recordingUrl}" target="_blank" class="recording-badge">${playIcon} Recording</a>`
227        : '';
228      const pdfBadge = slide.pdfUrl
229        ? `<a href="${slide.pdfUrl}" target="_blank" class="pdf-badge">PDF</a>`
230        : '';
231      const thumbnailWrapper = slide.previewUrl
232        ? `${previewHtml}<a href="${slidesUrl}" target="_blank" class="slide-thumbnail-link-overlay" aria-label="Open ${slide.title} slides"></a>`
233        : `<a href="${slidesUrl}" target="_blank">${previewHtml}</a>`;
234
235      return `
236        <div class="slide-card">
237          <div class="slide-thumbnail-container">
238            ${thumbnailWrapper}
239            ${pdfBadge}
240            ${recordingBadge}
241          </div>
242          <a href="${slidesUrl}" target="_blank" class="slide-link">
243            <div class="slide-info">
244              <h3 class="slide-title">${slide.title}</h3>
245              <p class="slide-meta"><span class="slide-date">${slide.month} ${slide.year}</span> · ${slide.location}</p>
246            </div>
247          </a>
248        </div>
249      `;
250    }
251
252    function resizePreviewIframes() {
253      document.querySelectorAll('.slide-iframe-preview').forEach(iframe => {
254        const container = iframe.closest('.slide-thumbnail-container');
255        if (!container) return;
256        iframe.style.setProperty('--preview-scale', container.clientWidth / 1280);
257      });
258    }
259
260    function renderSlides(slides) {
261      const container = document.getElementById('slides-container');
262      const years = [...new Set(slides.map(s => s.year))].sort((a, b) => b - a);
263
264      let html = '';
265      for (const year of years) {
266        const yearSlides = slides.filter(s => s.year === year);
267        html += `
268          <div class="year-section">
269            <h2 class="year-heading">${year}</h2>
270            <div class="slides-grid">
271              ${yearSlides.map(createSlideCard).join('')}
272            </div>
273          </div>
274        `;
275      }
276      container.innerHTML = html;
277      resizePreviewIframes();
278    }
279
280    window.addEventListener('resize', resizePreviewIframes);
281
282    fetch('data/slides-data.json')
283      .then(res => res.json())
284      .then(renderSlides)
285      .catch(err => console.error('Failed to load slides:', err));
286  </script>
286
287</body>
288</html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.