Slide 1

Slide 1 text

Everything Is Showbiz: Lessons from a PHP + AI Side Project Paul Conroy / @conroyp

Slide 2

Slide 2 text

Paul Conroy From Dublin, Ireland Started playing with the web 30+ years ago (Notepad, Frontpage & Geocities!) CTO at Square1 conroyp.com / @conroyp 👴 🌍 🇮🇪

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

● Interview comedians and celebrities


Slide 5

Slide 5 text

● Interview comedians and celebrities
 ● Ask them what they did yesterday


Slide 6

Slide 6 text

● Interview comedians and celebrities
 ● Ask them what they did yesterday
 ● That’s it!

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

What do I want?

Slide 11

Slide 11 text

● Some kind of episode transcription
 What do I want?

Slide 12

Slide 12 text

● Some kind of episode transcription
 ● Searchable
 What do I want?

Slide 13

Slide 13 text

● Some kind of episode transcription
 ● Searchable
 ● Easily share specific parts
 What do I want?

Slide 14

Slide 14 text

● Some kind of episode transcription
 ● Searchable
 ● Easily share specific parts
 ● That’s it! What do I want?

Slide 15

Slide 15 text

● Some kind of episode transcription
 ● Searchable
 ● Easily share specific parts
 ● That’s it! What do I want?

Slide 16

Slide 16 text

● Some kind of episode transcription
 ● Searchable
 ● Easily share specific parts
 ● That’s it! What do I want?

Slide 17

Slide 17 text

● Some kind of episode transcription
 ● Searchable
 ● Easily share specific parts
 ● That’s it! What do I want?

Slide 18

Slide 18 text

INGEST TRANSCRIBE SERVE A Simple Plan!

Slide 19

Slide 19 text

Things I already know how to do Challenges in this project Audio Transcription Semantic Search Dynamic front end Model evaluation RSS Parsing Queues Cost-effective hosting Saying “we’ll tidy that up later Convincing myself it’s “MVP” 
 
 Making confusing Venn diagrams

Slide 20

Slide 20 text

I needed: I get: Something to run an ingest twice a week Scheduler Process files in the background Queues Try different AI tools Service classes & container A simple UI to browse results Blade, Alpine Deploy & run at low cost Cache, config, cheap VPS

Slide 21

Slide 21 text

TRANSCRIBE SERVE INGEST A Simple Plan

Slide 22

Slide 22 text

Let’s get started!

Slide 23

Slide 23 text

● Design the entities / models Let’s get started!

Slide 24

Slide 24 text

● Design the entities / models ● Map out the Controllers, Jobs, Services Let’s get started!

Slide 25

Slide 25 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments Let’s get started!

Slide 26

Slide 26 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig Let’s get started!

Slide 27

Slide 27 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig ● Fix problems with test / validation rig Let’s get started!

Slide 28

Slide 28 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig ● Fix problems with test / validation rig ● Build queue infrastructure Let’s get started!

Slide 29

Slide 29 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig ● Fix problems with test / validation rig ● Build queue infrastructure ● Fix problems with queues not running Let’s get started!

Slide 30

Slide 30 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig ● Fix problems with test / validation rig ● Build queue infrastructure ● Fix problems with queues not running ● …. Let’s get started!

Slide 31

Slide 31 text

No content

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

No content

Slide 34

Slide 34 text

No content

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

● Design the entities / models ● Map out the Controllers, Jobs, Services ● Set up config and environments ● Set up test / validation rig ● Fix problems with test / validation rig ● Build queue feature ● Fix problems with queues not running ● …. Let’s get started!

Slide 38

Slide 38 text

No content

Slide 39

Slide 39 text

No content

Slide 40

Slide 40 text

No content

Slide 41

Slide 41 text

TRANSCRIBE SERVE INGEST A Simple Plan

Slide 42

Slide 42 text

Whisper curl --request POST \ --url https://api.openai.com/v1/audio/transcriptions \ --header "Authorization: Bearer $OPENAI_API_KEY" \ --header 'Content-Type: multipart/form-data' \ --form file=@/path/to/file/audio.mp3 \ --form model=gpt-4o-transcribe { "text": “Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger.....” } ● OpenAI API ● Fast! ● Supports prompting ● Post-processing https://developers.openai.com/api/docs/guides/speech-to-text/

Slide 43

Slide 43 text

Whisper curl --request POST \ --url https://api.openai.com/v1/audio/transcriptions \ --header "Authorization: Bearer $OPENAI_API_KEY" \ --header 'Content-Type: multipart/form-data' \ --form file=@/path/to/file/audio.mp3 \ --form model=gpt-4o-transcribe { "text": “Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger.....” } ● OpenAI API ● Fast! ● Supports prompting ● Post-processing https://developers.openai.com/api/docs/guides/speech-to-text/

Slide 44

Slide 44 text

Whisper curl --request POST \ --url https://api.openai.com/v1/audio/transcriptions \ --header "Authorization: Bearer $OPENAI_API_KEY" \ --header 'Content-Type: multipart/form-data' \ --form file=@/path/to/file/audio.mp3 \ --form model=gpt-4o-transcribe { "text": “Imagine the wildest idea that you've ever had, and you're curious about how it might scale to something that's a 100, a 1,000 times bigger.....” } ● OpenAI API ● Fast! ● Supports prompting ● Post-processing https://developers.openai.com/api/docs/guides/speech-to-text/

Slide 45

Slide 45 text

https://github.com/ggml-org/whisper.cpp

Slide 46

Slide 46 text

● Runs locally! ● Plain C/C++ implementation ● No python required ● Different models can be used ● CPU/GPU-hungry https://github.com/ggml-org/whisper.cpp

Slide 47

Slide 47 text

● Large variations in model quality ● --max-context keeps internal consistency high ● --prompt can help with noun recognition ● Prompt too long, and the quality degrades - a balancing act!

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

https://github.com/openai/whisper/discussions/194

Slide 50

Slide 50 text

● Sporadic issues with proper nouns ● Challenges with punctuation & run-on sentences ● Occasionally gets a little confused… https://github.com/openai/whisper/discussions/194

Slide 51

Slide 51 text

Symphony of the butt: https://everythingisshowbiz.com/?episode=323&segment=390151

Slide 52

Slide 52 text

● Transcription breaks on pause
 ● Lots of short segments ● Not great for search!


Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

No content

Slide 55

Slide 55 text

● Transcription breaks on pause
 ● Lots of short segments ● Not great for search!


Slide 56

Slide 56 text

● Transcription breaks on pause
 ● Lots of short segments ● Not great for search!


Slide 57

Slide 57 text

TRANSCRIBE SERVE INGEST A Simple Plan

Slide 58

Slide 58 text

TRANSCRIBE SERVE REFINE TEXT INGEST A Simple Plan

Slide 59

Slide 59 text

INGEST TRANSCRIBE SERVE REFINE TEXT A Simple(-ish) Plan

Slide 60

Slide 60 text

What’s in a name? ● Models trained on “mid-Atlantic” accent
 ● Show features strong regional accents
 ● Names pronounced differently in each episode ● Post-transcription processing needed

Slide 61

Slide 61 text

No content

Slide 62

Slide 62 text

No content

Slide 63

Slide 63 text

No content

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

Actual Conversation

Slide 66

Slide 66 text

Actual Conversation Original Transcription

Slide 67

Slide 67 text

Responsibility ● Content is AI-generated, but responsibility is ours
 ● Need guardrails to prevent incorrect publication ● Errors already costing companies

Slide 68

Slide 68 text

Responsibility ● Content is AI-generated, but responsibility is ours
 ● Need guardrails to prevent incorrect publication ● Errors already costing companies https://www.theguardian.com/world/2024/feb/16/air-canada-chatbot-lawsuit

Slide 69

Slide 69 text

No content

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

No content

Slide 73

Slide 73 text

No content

Slide 74

Slide 74 text

No content

Slide 75

Slide 75 text

INGEST TRANSCRIBE SERVE REFINE TEXT A Simple(-ish) Plan

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

🎉🥳

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

No content

Slide 82

Slide 82 text

INGEST TRANSCRIBE SERVE REFINE TEXT A Simple(-ish) Plan

Slide 83

Slide 83 text

INGEST TRANSCRIBE SERVE REFINE TEXT SEARCH SERVE A Simple(-ish) Plan

Slide 84

Slide 84 text

INGEST TRANSCRIBE SERVE REFINE TEXT SEARCH A Plan

Slide 85

Slide 85 text

Semantic Search ● Keyword search asks: “Does this text contain these words?” ● Semantic search asks: “Is this about the same thing?” ● It tolerates synonyms, paraphrasing, and noise ● Under the hood: high-dimensional math

Slide 86

Slide 86 text

Semantic Search ● Keyword search asks: “Does this text contain these words?” ● Semantic search asks: “Is this about the same thing?” ● It tolerates synonyms, paraphrasing, and noise ● Under the hood: high-dimensional math ● ✨✨ Embeddings! ✨✨

Slide 87

Slide 87 text

● Complex data reduced to simpler information [159, 837, 528, 162, …] ● The larger the embedding, the more “meaning” captured
 ● Similar words or phrases are close to each other in this multi-dimensional space

Slide 88

Slide 88 text

● Complex data reduced to simpler information [159, 837, 528, 162, …] ● The larger the embedding, the more “meaning” captured
 ● Similar words or phrases are close to each other in this multi-dimensional space

Slide 89

Slide 89 text

Embeddings ● Postgres extension pgvector ● Generate embedding for each text block ● Store embedding alongside original text ● Generate embedding for each query ● Search by similarity https://github.com/pgvector/pgvector My interesting query

Slide 90

Slide 90 text

Embeddings ● Postgres extension pgvector ● Generate embedding for each text block ● Store embedding alongside original text ● Generate embedding for each query ● Search by similarity https://github.com/pgvector/pgvector My interesting query [938, 324, 5, 234.. ]

Slide 91

Slide 91 text

Embeddings ● Postgres extension pgvector ● Generate embedding for each text block ● Store embedding alongside original text ● Generate embedding for each query ● Search by similarity https://github.com/pgvector/pgvector My interesting query [938, 324, 5, 234.. ] [11, 903, 675, 837.. ]

Slide 92

Slide 92 text

Embeddings ● Postgres extension pgvector ● Generate embedding for each text block ● Store embedding alongside original text ● Generate embedding for each query ● Search by similarity https://github.com/pgvector/pgvector My interesting query [938, 324, 5, 234.. ] [11, 903, 675, 837.. ]

Slide 93

Slide 93 text

No content

Slide 94

Slide 94 text

Embeddings ● Use local model (Ollama) or API (OpenAI) ● Really basic model is ok! (text-embedding-3-small) ● Makes remote APIs very cheap

Slide 95

Slide 95 text

How cheap exactly?

Slide 96

Slide 96 text

How cheap exactly?

Slide 97

Slide 97 text

No content

Slide 98

Slide 98 text

Observers ● Hook into model lifecycle events ● Automate side-effects cleanly ● Remove glue code from controllers ● Keep business logic cohesive

Slide 99

Slide 99 text

No content

Slide 100

Slide 100 text

No content

Slide 101

Slide 101 text

No content

Slide 102

Slide 102 text

No content

Slide 103

Slide 103 text

Real-world users! ● Tend to use really short queries ● Hard to parse intent! ● How to handle both?

Slide 104

Slide 104 text

Real-world users! ● Tend to use really short queries ● Hard to parse intent! ● How to handle both?

Slide 105

Slide 105 text

Real-world users! ● Tend to use really short queries ● Hard to parse intent! ● How to handle both?

Slide 106

Slide 106 text

No content

Slide 107

Slide 107 text

No content

Slide 108

Slide 108 text

Sub query, avoid recalculation

Slide 109

Slide 109 text

Boost score for exact match Sub query, avoid recalculation

Slide 110

Slide 110 text

No content

Slide 111

Slide 111 text

No content

Slide 112

Slide 112 text

No content

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

● Search for text segments ● Click segment to autoplay
 ● Share deeplink ● URLs always update!

Slide 115

Slide 115 text

🤨 🤖 Issue Spotted

Slide 116

Slide 116 text

🤨 🤖 🚀 Issue Spotted Magic Fix

Slide 117

Slide 117 text

🤨 🤖 🚀 📦 Issue Spotted Magic Fix Change Integrated

Slide 118

Slide 118 text

🤨 🤖 🚀 📦 Issue Spotted Magic Fix Change Integrated But then…

Slide 119

Slide 119 text

What did I expect?

Slide 120

Slide 120 text

What did I expect? ● Discrete function classes / jobs


Slide 121

Slide 121 text

What did I expect? ● Discrete function classes / jobs
 ● Logical separation


Slide 122

Slide 122 text

What did I expect? ● Discrete function classes / jobs
 ● Logical separation
 ● Testable

Slide 123

Slide 123 text

What did I expect? ● Discrete function classes / jobs
 ● Logical separation
 ● Testable

Slide 124

Slide 124 text

What did I expect? ● Discrete function classes / jobs
 ● Logical separation
 ● Testable ● That’s it!

Slide 125

Slide 125 text

No content

Slide 126

Slide 126 text

No content

Slide 127

Slide 127 text

No content

Slide 128

Slide 128 text

● Side by side of different code ● Highlight “same but different” approach ● AI solving from 10ft, I’m approaching this from 10,000ft

Slide 129

Slide 129 text

● Side by side of different code ● Highlight “same but different” approach ● AI solving from 10ft, I’m approaching this from 10,000ft

Slide 130

Slide 130 text

● Side by side of different code ● Highlight “same but different” approach ● AI solving from 10ft, I’m approaching this from 10,000ft

Slide 131

Slide 131 text

● Side by side of different code ● Highlight “same but different” approach ● AI solving from 10ft, I’m approaching this from 10,000ft

Slide 132

Slide 132 text

What’s happening? ● Lots of near-duplicate code ● Huge amount of dead code ● AI is focusing on low-level context alone
 Working at 10ft while I’m at 10,000ft ● Need to match the code to my mental model

Slide 133

Slide 133 text

Cognitive debt https://margaretstorey.com/blog/2026/02/09/cognitive-debt/

Slide 134

Slide 134 text

Cognitive debt https://margaretstorey.com/blog/2026/02/09/cognitive-debt/

Slide 135

Slide 135 text

Use AI to tidy up AI ● Much tighter feedback loops ● Personas ○ “You are a senior PHP dev…”
 ● Less vibes, more control ● Closer to pair programming

Slide 136

Slide 136 text

Use AI to tidy up AI ● Much tighter feedback loops ● Personas ○ “You are a senior PHP dev…”
 ● Less vibes, more control ● Closer to pair programming

Slide 137

Slide 137 text

SERVE A Plan INGEST TRANSCRIBE REFINE TEXT SEARCH

Slide 138

Slide 138 text

Workload Generation ● Heavy GPU load ● But only 2-3x a week ● Admin tooling Public site ● Effectively read-only ● Updated 2-3x a week ● Strong caching candidate

Slide 139

Slide 139 text

Workload Generation ● Heavy GPU load ● But only 2-3x a week ● Admin tooling Public site ● Effectively read-only ● Updated 2-3x a week ● Strong caching candidate 💸💸💸

Slide 140

Slide 140 text

Workload Generation ● Heavy GPU load ● But only 2-3x a week ● Admin tooling Public site ● Effectively read-only ● Updated 2-3x a week ● Strong caching candidate 💸💸💸 💸

Slide 141

Slide 141 text

Mac Mini RSS Feed (Cheap!) VPS

Slide 142

Slide 142 text

Mac Mini RSS Feed (Cheap!) VPS

Slide 143

Slide 143 text

Mac Mini RSS Feed (Cheap!) VPS

Slide 144

Slide 144 text

Mac Mini RSS Feed (Cheap!) VPS

Slide 145

Slide 145 text

🧑💻 Mac Mini RSS Feed (Cheap!) VPS

Slide 146

Slide 146 text

🧑💻 Mac Mini RSS Feed (Cheap!) VPS

Slide 147

Slide 147 text

No content

Slide 148

Slide 148 text

No content

Slide 149

Slide 149 text

No content

Slide 150

Slide 150 text

No content

Slide 151

Slide 151 text

No content

Slide 152

Slide 152 text

No content

Slide 153

Slide 153 text

No content

Slide 154

Slide 154 text

No content

Slide 155

Slide 155 text

No content

Slide 156

Slide 156 text

No content

Slide 157

Slide 157 text

No content

Slide 158

Slide 158 text

No content

Slide 159

Slide 159 text

No content

Slide 160

Slide 160 text

No content

Slide 161

Slide 161 text

No content

Slide 162

Slide 162 text

A Plan INGEST SERVE TRANSCRIBE REFINE TEXT SEARCH

Slide 163

Slide 163 text

TIDY UP A Plan INGEST SERVE TRANSCRIBE REFINE TEXT SEARCH

Slide 164

Slide 164 text

INGEST TRANSCRIBE SERVE REFINE TEXT SEARCH

Slide 165

Slide 165 text

INGEST TRANSCRIBE SERVE REFINE TEXT SEARCH TIDY UP

Slide 166

Slide 166 text

Late 2025 ● Step-change in AI tooling
 ● Moving from the IDE to CLI ● From “check this code I wrote” to “I’ll check the code you wrote”

Slide 167

Slide 167 text

No content

Slide 168

Slide 168 text

No content

Slide 169

Slide 169 text

AI-Assisted Engineering ● Vibe coding optimises for speed ● Engineering optimises for sustainability

Slide 170

Slide 170 text

https://addyosmani.com/blog/ai-assisted-engineering-idea/ AI-Assisted Engineering ● Vibe coding optimises for speed ● Engineering optimises for sustainability

Slide 171

Slide 171 text

https://addyosmani.com/blog/ai-assisted-engineering-idea/ AI-Assisted Engineering ● Vibe coding optimises for speed ● Engineering optimises for sustainability

Slide 172

Slide 172 text

Parallel & Structured ● Sub-agents with defined roles ● Reusable skills
 (Laravel clean code, frontend design…) ● Worktrees for isolation ● Inter-agent communication 🤖 🤖 🤖 🤖 The Boss Design Security Architect

Slide 173

Slide 173 text

From prompting to planning ● Interview with the model first ● Capture decisions in plan.md ● Make constraints explicit ● Break work into checkable steps

Slide 174

Slide 174 text

From prompting to planning ● Interview with the model first ● Capture decisions in plan.md ● Make constraints explicit ● Break work into checkable steps

Slide 175

Slide 175 text

No content

Slide 176

Slide 176 text

No content

Slide 177

Slide 177 text

No content

Slide 178

Slide 178 text

Ralphing ● Models cut corners on long tasks ● Hook in to finished state ● “Did you really finish? Hmmmm???” ● Keep going relentlessly until it’s done https://github.com/anthropics/claude-code/blob/main/plugins/ralph-wiggum/README.md

Slide 179

Slide 179 text

Cleanup Complete! ● It works (mostly..) ● Documented ● Tested ● Public https://github.com/conroyp/podcast-transcription

Slide 180

Slide 180 text

Side Projects! ● Abstract away the boring boilerplate ● Dopamine hit of fast feedback ● Keep the momentum going ● Quick to prototype & validate ● From noodling on phone to live app

Slide 181

Slide 181 text

https://www.kidssudoku.com https://www.tictacgoaway.com https://www.jdcaptcha.com

Slide 182

Slide 182 text

https://www.kidssudoku.com https://www.tictacgoaway.com https://www.jdcaptcha.com

Slide 183

Slide 183 text

https://www.kidssudoku.com https://www.tictacgoaway.com https://www.jdcaptcha.com

Slide 184

Slide 184 text

Where does that leave us developers? ● AI is already faster than most mid-level devs ● Productivity up 5-6× → headcount down? ● “Good enough” beats “well-engineered.” ● Why hire juniors when AI does the boilerplate?

Slide 185

Slide 185 text

No content

Slide 186

Slide 186 text

Geoffrey Hinton, “Godfather of AI”

Slide 187

Slide 187 text

“[I]f you work as a radiologist you are like Wile E. Coyote in the cartoon. You’re already over the edge of the cliff, but you haven’t yet looked down. Geoffrey Hinton, “Godfather of AI”

Slide 188

Slide 188 text

“[I]f you work as a radiologist you are like Wile E. Coyote in the cartoon. You’re already over the edge of the cliff, but you haven’t yet looked down. 
 It’s just completely obvious that in five years deep learning is going to do better than radiologists.” Geoffrey Hinton, “Godfather of AI”

Slide 189

Slide 189 text

What Happened Next? ● Demand went up ● Salaries increased! ● The nature of the work
 changed

Slide 190

Slide 190 text

What Happened Next? ● Demand went up ● Salaries increased! ● The nature of the work
 changed https://worksinprogress.co/issue/the-algorithm-will-see-you-now/

Slide 191

Slide 191 text

What Happened Next? ● Demand went up ● Salaries increased! ● The nature of the work
 changed https://worksinprogress.co/issue/the-algorithm-will-see-you-now/

Slide 192

Slide 192 text

Who gets to build? ● Doctors can ship apps ● Lawyers can prototype tools ● Contractors can automate their workflows ● Founders can validate ideas without devs (?)

Slide 193

Slide 193 text

We’ve been here before ● Assembly → C ● C → PHP ● PHP → Low-/no-code tools ● Manual infra → DevOps ● On-prem → Cloud

Slide 194

Slide 194 text

We’ve been here before ● Assembly → C ● C → PHP ● PHP → Low-/no-code tools ● Manual infra → DevOps ● On-prem → Cloud https://addyosmani.com/blog/the-efficiency-paradox/ “Every time we’ve made it easier to write software, we’ve ended up writing exponentially more of it.”

Slide 195

Slide 195 text

What changes for us? ● Execution is getting cheaper ● Prototypes are cheaper ● Boilerplate is getting cheaper ● Judgment is not

Slide 196

Slide 196 text

What changes for us? ● Execution is getting cheaper ● Prototypes are cheaper ● Boilerplate is getting cheaper ● Judgment is not https://addyosmani.com/blog/the-efficiency-paradox/ The real question is whether we’re prepared for a world where the bottleneck shifts from “can we build this?” to “should we build this?”

Slide 197

Slide 197 text

No content

Slide 198

Slide 198 text

Thank you! Conroyp.com @conroyp [email protected] 🌍 🌐 📧 https://joind.in/event/php-uk-conference-2026/everything-is-showbiz-lessons-from-a-php--ai-side-projects