Skip to content

Commit e7e0031

Browse files
committed
Publishing the Risk-First podcast
1 parent 02329b6 commit e7e0031

File tree

7 files changed

+264
-5
lines changed

7 files changed

+264
-5
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ _site
2424
# Generated files
2525
.docusaurus
2626
.cache-loader
27+
docs/agentic
2728

2829
# Misc
2930
.env.local

docs/community/Risk-First-Podcast.md

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
title: "Risk-First Podcast Series"
2+
title: "Risk-First: Stars of Software"
33
description: Coming soon — a podcast exploring risk-first thinking in software development
44
featured:
55
class: bg2
@@ -9,8 +9,32 @@ tags:
99
sidebar_position: 6
1010
---
1111

12-
## Coming Soon
12+
import PodcastEpisode from '@site/src/components/PodcastEpisode';
13+
14+
Risk-First is about understanding how to manage risk in software development.
15+
16+
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.
17+
18+
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?
19+
20+
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.
21+
22+
Because behind every successful system, career, and company, there is someone making thoughtful, informed decisions about risk.
23+
24+
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?
25+
26+
<PodcastEpisode
27+
season={1}
28+
episode={1}
29+
title="Dom Vogel: Cybersecurity, Leadership, and the Risks We Choose Not to See"
30+
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."
31+
/>
32+
33+
<PodcastEpisode
34+
season={1}
35+
episode={2}
36+
title="Steve Tendon: Constraints, Flow, and the Human Side of Organisational Risk"
37+
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."
38+
/>
1339

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

16-
Stay tuned for conversations with practitioners, deep dives into specific risks, and practical guidance on applying the Risk-First framework to your projects.

docs/methods/SAFe.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ description: A set of organization and workflow patterns for scaling lean and ag
44
tags:
55
- Risk Frameworks
66
- Agile
7-
- SAFe
7+
- Scaled Agile Framework (SAFe)
88
featured:
99
class: c
1010
element: '<image-artifact imgsrc="/public/templates/risk-first/posts/safe.svg">SAFe</image-artifact>'

docs/tags.yml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,12 @@ AI Risk:
55
AI Risks:
66
label: AI Risks
77
permalink: AI-Risks
8+
AI As Judge:
9+
label: AI As Judge
10+
permalink: AI-As-Judge
11+
AI Practices:
12+
label: AI Practices
13+
permalink: AI-Practices
814
About:
915
label: About
1016
permalink: About
@@ -56,6 +62,9 @@ Bet:
5662
Bets:
5763
label: Bets
5864
permalink: Bets
65+
Capability:
66+
label: Capability
67+
permalink: Capability
5968
Book-Option:
6069
label: Book-Option
6170
permalink: Book-Option
@@ -356,6 +365,9 @@ Risks:
356365
Runtime Adoption:
357366
label: Runtime Adoption
358367
permalink: Runtime-Adoption
368+
Scaled Agile Framework (SAFe):
369+
label: Scaled Agile Framework (SAFe)
370+
permalink: Scaled-Agile-Framework-SAFe
359371
Sales:
360372
label: Sales
361373
permalink: Sales
@@ -401,6 +413,9 @@ Terms Of Reference:
401413
Testing Quality Assurance:
402414
label: Testing Quality Assurance
403415
permalink: Testing-Quality-Assurance
416+
Threat:
417+
label: Threat
418+
permalink: Threat
404419
Thinking Risk First:
405420
label: Thinking Risk First
406421
permalink: Thinking-Risk-First
@@ -428,6 +443,9 @@ Upside Risk:
428443
User Acceptance Testing:
429444
label: User Acceptance Testing
430445
permalink: User-Acceptance-Testing
446+
Verification:
447+
label: Verification
448+
permalink: Verification
431449
Version Control:
432450
label: Version Control
433451
permalink: Version-Control
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
import React from 'react';
2+
import styles from './styles.module.css';
3+
4+
// Hard-coded podcast links
5+
const PODCAST_LINKS = {
6+
image: '/img/community/podcast.png',
7+
spotify: 'https://open.spotify.com/show/5EU52uoqQw3PtesoHojK9j',
8+
apple: 'https://podcasts.apple.com/us/podcast/risk-first-stars-of-software/id1877357373',
9+
youtube: 'https://www.youtube.com/@risk-first-podcast',
10+
};
11+
12+
/**
13+
* PodcastEpisode component for displaying podcast episodes with links to various platforms.
14+
*
15+
* @param {Object} props
16+
* @param {string} props.title - Episode title
17+
* @param {number} props.season - Season number
18+
* @param {number} props.episode - Episode number
19+
* @param {string} props.description - Episode description
20+
*/
21+
export default function PodcastEpisode({
22+
title,
23+
season,
24+
episode,
25+
description
26+
}) {
27+
const { image, spotify, apple, youtube } = PODCAST_LINKS;
28+
return (
29+
<div className={styles.episode}>
30+
<div className={styles.artwork}>
31+
{image && <img src={image} alt={title} />}
32+
</div>
33+
<div className={styles.content}>
34+
<div className={styles.meta}>
35+
{season && <span className={styles.season}>Season {season}</span>}
36+
{episode && <span className={styles.episodeNum}>Episode {episode}</span>}
37+
</div>
38+
<h3 className={styles.title}>{title}</h3>
39+
<p className={styles.description}>{description}</p>
40+
<div className={styles.links}>
41+
{spotify && (
42+
<a href={spotify} target="_blank" rel="noopener noreferrer" className={styles.link}>
43+
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
44+
<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"/>
45+
</svg>
46+
Spotify
47+
</a>
48+
)}
49+
{apple && (
50+
<a href={apple} target="_blank" rel="noopener noreferrer" className={`${styles.link} ${styles.appleLink}`}>
51+
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
52+
<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"/>
53+
</svg>
54+
Apple Podcasts
55+
</a>
56+
)}
57+
{youtube && (
58+
<a href={youtube} target="_blank" rel="noopener noreferrer" className={styles.link}>
59+
<svg viewBox="0 0 24 24" width="20" height="20" fill="currentColor">
60+
<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"/>
61+
</svg>
62+
YouTube
63+
</a>
64+
)}
65+
</div>
66+
</div>
67+
</div>
68+
);
69+
}
Lines changed: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,147 @@
1+
.episode {
2+
display: flex;
3+
gap: 1.5rem;
4+
padding: 1.5rem 0;
5+
margin-bottom: 1.5rem;
6+
}
7+
8+
.artwork {
9+
flex-shrink: 0;
10+
width: 140px;
11+
height: 140px;
12+
border-radius: 8px;
13+
overflow: hidden;
14+
background: linear-gradient(135deg, #6366f1 0%, #a855f7 100%);
15+
}
16+
17+
.artwork img {
18+
width: 100%;
19+
height: 100%;
20+
object-fit: cover;
21+
}
22+
23+
.content {
24+
flex: 1;
25+
display: flex;
26+
flex-direction: column;
27+
justify-content: space-between;
28+
min-width: 0;
29+
}
30+
31+
.meta {
32+
display: flex;
33+
gap: 0.75rem;
34+
margin-bottom: 0.5rem;
35+
}
36+
37+
.season,
38+
.episodeNum {
39+
font-size: 0.75rem;
40+
font-weight: 600;
41+
text-transform: uppercase;
42+
letter-spacing: 0.05em;
43+
padding: 0.25rem 0.5rem;
44+
border-radius: 4px;
45+
background: rgba(99, 102, 241, 0.15);
46+
color: #6366f1;
47+
}
48+
49+
html[data-theme='dark'] .season,
50+
html[data-theme='dark'] .episodeNum {
51+
background: rgba(99, 102, 241, 0.25);
52+
color: #a5b4fc;
53+
}
54+
55+
.title {
56+
margin: 0 0 0.5rem 0;
57+
font-size: 1.25rem;
58+
font-weight: 700;
59+
line-height: 1.3;
60+
color: var(--ifm-heading-color);
61+
}
62+
63+
.description {
64+
margin: 0 0 1rem 0;
65+
font-size: 0.95rem;
66+
line-height: 1.5;
67+
color: var(--ifm-color-emphasis-700);
68+
display: -webkit-box;
69+
-webkit-line-clamp: 3;
70+
-webkit-box-orient: vertical;
71+
overflow: hidden;
72+
}
73+
74+
.links {
75+
display: flex;
76+
flex-wrap: wrap;
77+
gap: 0.75rem;
78+
}
79+
80+
.link {
81+
display: inline-flex;
82+
align-items: center;
83+
gap: 0.5rem;
84+
padding: 0.5rem 1rem;
85+
font-size: 0.875rem;
86+
font-weight: 500;
87+
text-decoration: none;
88+
color: #fff;
89+
background: #1db954;
90+
border-radius: 20px;
91+
transition: transform 0.15s ease, background 0.15s ease;
92+
}
93+
94+
.link:hover {
95+
transform: scale(1.05);
96+
text-decoration: none;
97+
color: #fff;
98+
}
99+
100+
/* Spotify */
101+
.link:nth-child(1) {
102+
background: #1db954;
103+
}
104+
105+
.link:nth-child(1):hover {
106+
background: #1ed760;
107+
}
108+
109+
/* Apple Podcasts - black with white text */
110+
.appleLink {
111+
background: #000 !important;
112+
}
113+
114+
.appleLink:hover {
115+
background: #333 !important;
116+
}
117+
118+
/* YouTube */
119+
.link:nth-child(3) {
120+
background: #ff0000;
121+
}
122+
123+
.link:nth-child(3):hover {
124+
background: #ff3333;
125+
}
126+
127+
/* Responsive */
128+
@media (max-width: 600px) {
129+
.episode {
130+
flex-direction: column;
131+
align-items: center;
132+
text-align: center;
133+
}
134+
135+
.artwork {
136+
width: 200px;
137+
height: 200px;
138+
}
139+
140+
.meta {
141+
justify-content: center;
142+
}
143+
144+
.links {
145+
justify-content: center;
146+
}
147+
}

static/img/community/podcast.png

1.05 MB
Loading

0 commit comments

Comments
 (0)