Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ _site
# Generated files
.docusaurus
.cache-loader
docs/agentic

# Misc
.env.local
Expand Down
32 changes: 28 additions & 4 deletions docs/community/Risk-First-Podcast.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Risk-First Podcast Series"
title: "Risk-First: Stars of Software"
description: Coming soon — a podcast exploring risk-first thinking in software development
featured:
class: bg2
Expand All @@ -9,8 +9,32 @@ tags:
sidebar_position: 6
---

## Coming Soon
import PodcastEpisode from '@site/src/components/PodcastEpisode';

Risk-First is about understanding how to manage risk in software development.

But technology is far bigger than coding, testing, and releasing. There are countless roles across the industry—each shaped by uncertainty, trade-offs, and decisions that matter.

How does risk inform those roles? And could it be that being good at any job in technology ultimately means being good at risk management? Is all work, in some sense… risk management?

In Risk-First: Stars of Software, Rob Moffat sits down with leaders, builders, and thinkers from across the software world to explore what they do, the risks they navigate every day, and the lessons they’ve learned along the way.

Because behind every successful system, career, and company, there is someone making thoughtful, informed decisions about risk.

If you want to excel in your chosen field, you need to understand how to manage risk well. So who better to learn from than the stars of software?

<PodcastEpisode
season={1}
episode={1}
title="Dom Vogel: Cybersecurity, Leadership, and the Risks We Choose Not to See"
description="In the very first episode of Risk-First: Stars of Software, Rob Moffat sits down with cybersecurity leader Dom Vogel to explore what risk really means beyond code, tools, and technology."
/>

<PodcastEpisode
season={1}
episode={2}
title="Steve Tendon: Constraints, Flow, and the Human Side of Organisational Risk"
description="Rob Moffat speaks with Steve Tendon—creator of the TameFlow approach and a leading thinker in systems thinking, organisational performance, and flow-based management."
/>

A dedicated podcast series exploring Risk-First thinking in software development is in the works.

Stay tuned for conversations with practitioners, deep dives into specific risks, and practical guidance on applying the Risk-First framework to your projects.
2 changes: 1 addition & 1 deletion docs/methods/SAFe.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ description: A set of organization and workflow patterns for scaling lean and ag
tags:
- Risk Frameworks
- Agile
- SAFe
- Scaled Agile Framework (SAFe)
featured:
class: c
element: '<image-artifact imgsrc="/public/templates/risk-first/posts/safe.svg">SAFe</image-artifact>'
Expand Down
18 changes: 18 additions & 0 deletions docs/tags.yml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,12 @@ AI Risk:
AI Risks:
label: AI Risks
permalink: AI-Risks
AI As Judge:
label: AI As Judge
permalink: AI-As-Judge
AI Practices:
label: AI Practices
permalink: AI-Practices
About:
label: About
permalink: About
Expand Down Expand Up @@ -56,6 +62,9 @@ Bet:
Bets:
label: Bets
permalink: Bets
Capability:
label: Capability
permalink: Capability
Book-Option:
label: Book-Option
permalink: Book-Option
Expand Down Expand Up @@ -356,6 +365,9 @@ Risks:
Runtime Adoption:
label: Runtime Adoption
permalink: Runtime-Adoption
Scaled Agile Framework (SAFe):
label: Scaled Agile Framework (SAFe)
permalink: Scaled-Agile-Framework-SAFe
Sales:
label: Sales
permalink: Sales
Expand Down Expand Up @@ -401,6 +413,9 @@ Terms Of Reference:
Testing Quality Assurance:
label: Testing Quality Assurance
permalink: Testing-Quality-Assurance
Threat:
label: Threat
permalink: Threat
Thinking Risk First:
label: Thinking Risk First
permalink: Thinking-Risk-First
Expand Down Expand Up @@ -428,6 +443,9 @@ Upside Risk:
User Acceptance Testing:
label: User Acceptance Testing
permalink: User-Acceptance-Testing
Verification:
label: Verification
permalink: Verification
Version Control:
label: Version Control
permalink: Version-Control
Expand Down
69 changes: 69 additions & 0 deletions src/components/PodcastEpisode/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import React from 'react';
import styles from './styles.module.css';

// Hard-coded podcast links
const PODCAST_LINKS = {
image: '/img/community/podcast.png',
spotify: 'https://open.spotify.com/show/5EU52uoqQw3PtesoHojK9j',
apple: 'https://podcasts.apple.com/us/podcast/risk-first-stars-of-software/id1877357373',
youtube: 'https://www.youtube.com/@risk-first-podcast',
};

/**
* PodcastEpisode component for displaying podcast episodes with links to various platforms.
*
* @param {Object} props
* @param {string} props.title - Episode title
* @param {number} props.season - Season number
* @param {number} props.episode - Episode number
* @param {string} props.description - Episode description
*/
export default function PodcastEpisode({
title,
season,
episode,
description
}) {
const { image, spotify, apple, youtube } = PODCAST_LINKS;
return (
<div className={styles.episode}>
<div className={styles.artwork}>
{image && <img src={image} alt={title} />}
</div>
<div className={styles.content}>
<div className={styles.meta}>
{season && <span className={styles.season}>Season {season}</span>}
{episode && <span className={styles.episodeNum}>Episode {episode}</span>}
</div>
<h3 className={styles.title}>{title}</h3>
<p className={styles.description}>{description}</p>
<div className={styles.links}>
{spotify && (
<a href={spotify} target="_blank" rel="noopener noreferrer" className={styles.link}>
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
<path d="M12 0C5.4 0 0 5.4 0 12s5.4 12 12 12 12-5.4 12-12S18.66 0 12 0zm5.521 17.34c-.24.359-.66.48-1.021.24-2.82-1.74-6.36-2.101-10.561-1.141-.418.122-.779-.179-.899-.539-.12-.421.18-.78.54-.9 4.56-1.021 8.52-.6 11.64 1.32.42.18.479.659.301 1.02zm1.44-3.3c-.301.42-.841.6-1.262.3-3.239-1.98-8.159-2.58-11.939-1.38-.479.12-1.02-.12-1.14-.6-.12-.48.12-1.021.6-1.141C9.6 9.9 15 10.561 18.72 12.84c.361.181.54.78.241 1.2zm.12-3.36C15.24 8.4 8.82 8.16 5.16 9.301c-.6.179-1.2-.181-1.38-.721-.18-.601.18-1.2.72-1.381 4.26-1.26 11.28-1.02 15.721 1.621.539.3.719 1.02.419 1.56-.299.421-1.02.599-1.559.3z"/>
</svg>
Spotify
</a>
)}
{apple && (
<a href={apple} target="_blank" rel="noopener noreferrer" className={`${styles.link} ${styles.appleLink}`}>
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
<path d="M12.152 6.896c-.948 0-2.415-1.078-3.96-1.04-2.04.027-3.91 1.183-4.961 3.014-2.117 3.675-.546 9.103 1.519 12.09 1.013 1.454 2.208 3.09 3.792 3.039 1.52-.065 2.09-.987 3.935-.987 1.831 0 2.35.987 3.96.948 1.637-.026 2.676-1.48 3.676-2.948 1.156-1.688 1.636-3.325 1.662-3.415-.039-.013-3.182-1.221-3.22-4.857-.026-3.04 2.48-4.494 2.597-4.559-1.429-2.09-3.623-2.324-4.39-2.376-2-.156-3.675 1.09-4.61 1.09zM15.53 3.83c.843-1.012 1.4-2.427 1.245-3.83-1.207.052-2.662.805-3.532 1.818-.78.896-1.454 2.338-1.273 3.714 1.338.104 2.715-.688 3.559-1.701"/>
</svg>
Apple Podcasts
</a>
)}
{youtube && (
<a href={youtube} target="_blank" rel="noopener noreferrer" className={styles.link}>
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
<path d="M23.498 6.186a3.016 3.016 0 0 0-2.122-2.136C19.505 3.545 12 3.545 12 3.545s-7.505 0-9.377.505A3.017 3.017 0 0 0 .502 6.186C0 8.07 0 12 0 12s0 3.93.502 5.814a3.016 3.016 0 0 0 2.122 2.136c1.871.505 9.376.505 9.376.505s7.505 0 9.377-.505a3.015 3.015 0 0 0 2.122-2.136C24 15.93 24 12 24 12s0-3.93-.502-5.814zM9.545 15.568V8.432L15.818 12l-6.273 3.568z"/>
</svg>
YouTube
</a>
)}
</div>
</div>
</div>
);
}
147 changes: 147 additions & 0 deletions src/components/PodcastEpisode/styles.module.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
.episode {
display: flex;
gap: 1.5rem;
padding: 1.5rem 0;
margin-bottom: 1.5rem;
}

.artwork {
flex-shrink: 0;
width: 140px;
height: 140px;
border-radius: 8px;
overflow: hidden;
background: linear-gradient(135deg, #6366f1 0%, #a855f7 100%);
}

.artwork img {
width: 100%;
height: 100%;
object-fit: cover;
}

.content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: space-between;
min-width: 0;
}

.meta {
display: flex;
gap: 0.75rem;
margin-bottom: 0.5rem;
}

.season,
.episodeNum {
font-size: 0.75rem;
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.05em;
padding: 0.25rem 0.5rem;
border-radius: 4px;
background: rgba(99, 102, 241, 0.15);
color: #6366f1;
}

html[data-theme='dark'] .season,
html[data-theme='dark'] .episodeNum {
background: rgba(99, 102, 241, 0.25);
color: #a5b4fc;
}

.title {
margin: 0 0 0.5rem 0;
font-size: 1.25rem;
font-weight: 700;
line-height: 1.3;
color: var(--ifm-heading-color);
}

.description {
margin: 0 0 1rem 0;
font-size: 0.95rem;
line-height: 1.5;
color: var(--ifm-color-emphasis-700);
display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;
}

.links {
display: flex;
flex-wrap: wrap;
gap: 0.75rem;
}

.link {
display: inline-flex;
align-items: center;
gap: 0.5rem;
padding: 0.5rem 1rem;
font-size: 0.875rem;
font-weight: 500;
text-decoration: none;
color: #fff;
background: #1db954;
border-radius: 20px;
transition: transform 0.15s ease, background 0.15s ease;
}

.link:hover {
transform: scale(1.05);
text-decoration: none;
color: #fff;
}

/* Spotify */
.link:nth-child(1) {
background: #1db954;
}

.link:nth-child(1):hover {
background: #1ed760;
}

/* Apple Podcasts - black with white text */
.appleLink {
background: #000 !important;
}

.appleLink:hover {
background: #333 !important;
}

/* YouTube */
.link:nth-child(3) {
background: #ff0000;
}

.link:nth-child(3):hover {
background: #ff3333;
}

/* Responsive */
@media (max-width: 600px) {
.episode {
flex-direction: column;
align-items: center;
text-align: center;
}

.artwork {
width: 200px;
height: 200px;
}

.meta {
justify-content: center;
}

.links {
justify-content: center;
}
}
Binary file added static/img/community/podcast.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.