Build the skills your teams need

Give your teams the O’Reilly learning platform and equip them with the resources that drive business outcomes.

From the Radar blog

More posts

Subscribe to our Substack to get Radar in your inbox.

Level up with expert-led live events

Reserve your seat for interactive workshops to gain hands-on experience—and ask questions along the way.

See all events

AI Codecon Building with Open Source AI

Tim O’ReillyO’Reilly Media

Addy OsmaniSoftware engineer

Open source AI gives teams more choice and transparency along with greater control over costs, data privacy, and what they build. Join Tim O’Reilly and Addy Osmani on August 31 for a free virtual event on open-weight models, self-hosted infrastructure, and real-world AI workflows.

Sign up for free

Verifiable skills: Close key gaps and prove your ability

Personalized learning with structured courses that teach today’s most critical skills, tailored to only what you need to know.

Learn more
0:00 / `; } return `
${postImgSrc ? `` : ''}

${postType}${postCategory ? ` | ${postCategory}` : ''}

${postTitle}

${meta}
${audioControls}
`; } function loadBlogFeed() { fetch('https://www.oreilly.com/radar/feed/') .then(response => response.text()) .then(str => { const parser = new window.DOMParser(); const xml = parser.parseFromString(str, 'text/xml'); const items = xml.querySelectorAll('item'); const container = document.getElementById('post-feed-container'); container.innerHTML = ''; items.forEach((item, idx) => { if (idx { initializeAllAudioPlayers(); }); observer.observe(container, { childList: true, subtree: true }); } }) .catch(err => { document.getElementById('post-feed-container').innerHTML = '

Unable to load blog feed.

'; }); } document.addEventListener('DOMContentLoaded', loadBlogFeed); // initialize blog feed audio player const initializeAudioPlayer = (audioPlayer) => { const inputs = audioPlayer.querySelectorAll("input, select, button"); inputs.forEach((input) => { input.addEventListener("click", (event) => { event.preventDefault(); event.stopPropagation(); }); }); const audio = audioPlayer.querySelector(".player-audio"); const playPauseButton = audioPlayer.querySelector(".play-pause"); const seekBar = audioPlayer.querySelector(".seek-bar"); const currentTimeDisplay = audioPlayer.querySelector(".time-current"); const durationDisplay = audioPlayer.querySelector(".time-total"); const formatTime = (time) => { const minutes = Math.floor(time / 60); const seconds = Math.floor(time % 60) .toString() .padStart(2, "0"); return `${minutes}:${seconds}`; }; const playPause = () => { const playIcon = playPauseButton.querySelector(".play"); const pauseIcon = playPauseButton.querySelector(".pause"); if (audio.paused) { document .querySelectorAll(".audioPlayer-controls") .forEach((playerElement) => { const otherAudio = playerElement.querySelector(".player-audio"); if (otherAudio !== audio) { playerElement.classList.remove("playing"); otherAudio.pause(); const otherPlayIcon = playerElement.querySelector(".play-pause .play"); const otherPauseIcon = playerElement.querySelector(".play-pause .pause"); otherPlayIcon.classList.add("visible"); otherPlayIcon.classList.remove("hidden"); otherPauseIcon.classList.remove("visible"); otherPauseIcon.classList.add("hidden"); } }); audioPlayer.classList.add("playing"); audio.play(); pauseIcon.classList.add("visible"); pauseIcon.classList.remove("hidden"); playIcon.classList.remove("visible"); playIcon.classList.add("hidden"); let { gaEventName, gaCategory, gaEvent, gaLabel } = playPauseButton.dataset; gaLabel = gaLabel.toLowerCase(); const eventData = { event: gaEventName || "eventTracker", eventCat: gaCategory || "marketing", eventAct: gaEvent || "radar module", eventLbl: gaLabel || "play", eventVal: 0, nonInteraction: 0, }; if (typeof dataLayer !== "undefined" && Array.isArray(dataLayer)) { dataLayer.push(eventData); } else { console.warn( "dataLayer is not defined. Event not tracked:", eventData ); } } else { audio.pause(); playIcon.classList.add("visible"); playIcon.classList.remove("hidden"); pauseIcon.classList.remove("visible"); pauseIcon.classList.add("hidden"); } playPauseButton.blur(); }; playPauseButton.addEventListener("click", (event) => { event.preventDefault(); event.stopPropagation(); playPause(); }); audio.addEventListener("timeupdate", () => { seekBar.value = audio.currentTime; currentTimeDisplay.textContent = formatTime(audio.currentTime); }); if (audio.duration) { seekBar.max = audio.duration; durationDisplay.textContent = formatTime(audio.duration); } audio.addEventListener("loadedmetadata", () => { seekBar.max = audio.duration; durationDisplay.textContent = formatTime(audio.duration); }); seekBar.addEventListener("input", () => { audio.currentTime = seekBar.value; }); audioPlayer.classList.add("fadeIn"); }; const initializeAllAudioPlayers = () => { const audioPlayers = document.querySelectorAll( ".audioPlayer-controls:not(.initialized)" ); audioPlayers.forEach((audioPlayer) => { initializeAudioPlayer(audioPlayer); audioPlayer.classList.add("initialized"); }); }; // Google Analytics event tracking document.addEventListener('click', (event) => { const radarFeedItem = event.target.closest('#blog-feed-section .feed-item'); if (radarFeedItem) { const itemType = radarFeedItem.dataset.itemType ? radarFeedItem.dataset.itemType.toLowerCase() : ''; const itemTitle = radarFeedItem.dataset.itemTitle ? radarFeedItem.dataset.itemTitle.toLowerCase() : ''; eventLabel = itemType + '|' + itemTitle; console.log(eventLabel); const eventData = { 'event': 'eventTracker', 'eventCat': 'marketing', 'eventAct': 'radar module', 'eventLbl': eventLabel, 'eventVal': 0, 'nonInteraction': 0 }; dataLayer.push(eventData); }; const radarMorePosts = event.target.closest('#moreRadarPosts'); if (radarMorePosts) { const eventData = { 'event': 'eventTracker', 'eventCat': 'marketing', 'eventAct': 'radar module', 'eventLbl': 'more posts', 'eventVal': 0, 'nonInteraction': 0 }; dataLayer.push(eventData); }; });

We share the knowledge of innovators. You put it to work.

Tech teams love tapping into the minds of innovators through our expert-led courses, renowned text-based content, and bite-size online Superstream tech conferences.

More than 5,000 organizations count on O’Reilly

logo: AirBnBlogo: Blue Originlogo: Electronic Artslogo: Home Depotlogo: Nasdaqlogo: Rakutenlogo: TCS

The 2025 O’Reilly Awards winners are in!

Learn who best put the O’Reilly learning platform to work for their organization and what the judges were looking for in winning submissions.

See the results

Hear why Jose is on O’Reilly every day

Jose, a principal software engineer, trusts our learning platform to filter what his teams need to know to stay ahead.

See more testimonials

See how O’Reilly can help your tech teams stay ahead