Skip to content

Commit 4dec946

Browse files
committed
feat(landing): thumbnail-grid video picker + add Dev & retrospective demo
The tabbed selector overflowed past 4 videos; replaces it with an active player plus a responsive thumbnail grid (2/3/6-up across mobile/tablet/desktop) so the strip scales as we add more demos. - Refactor video metadata into a typed 'videos' array; both the active player iframe and the thumb cards are driven by a single source. - Active thumbnail gets a primary border; idle thumbs show a play-icon overlay on hover. - iframe carries a :key so switching videos forces a clean remount. - Add the sixth demo: 'Development & retrospective' (https://youtu.be/YjRihN_SKaw) covering dev, automated code review, post-deploy retrospective, and the Learning Agent feedback loop. - README demo grid + linkbar mirror the same six videos. Side effect: every thumbnail is now pre-rendered into static HTML, so all six demos are crawlable instead of only the default tab's iframe. Signed-off-by: Arun Rajkumar <mickyarunr@gmail.com>
1 parent 988608b commit 4dec946

2 files changed

Lines changed: 145 additions & 82 deletions

File tree

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,11 @@ Self-hosted on your hardware. Your data stays local. Inference engine is your ch
3636
&nbsp;
3737
<a href="https://youtu.be/lV71qhmfzzw"><img src="https://img.youtube.com/vi/lV71qhmfzzw/maxresdefault.jpg" width="48%" alt="Design phase & agent prompts"></a>
3838

39+
<a href="https://youtu.be/YjRihN_SKaw"><img src="https://img.youtube.com/vi/YjRihN_SKaw/maxresdefault.jpg" width="48%" alt="Development & retrospective"></a>
40+
&nbsp;
3941
<a href="https://youtu.be/OxoqBI7BNxU"><img src="https://img.youtube.com/vi/OxoqBI7BNxU/maxresdefault.jpg" width="48%" alt="Inside the virtual world"></a>
4042

41-
**[Setup walkthrough](https://youtu.be/ot-BmKxRgRA)** &nbsp;·&nbsp; **[Slack triage & MCP tools](https://youtu.be/i8kZdcL1bME)** &nbsp;·&nbsp; **[Requirements & estimation](https://youtu.be/YBwdTes0Fno)** &nbsp;·&nbsp; **[Design phase & agent prompts](https://youtu.be/lV71qhmfzzw)** &nbsp;·&nbsp; **[Inside the virtual world](https://youtu.be/OxoqBI7BNxU)**
43+
**[Setup walkthrough](https://youtu.be/ot-BmKxRgRA)** &nbsp;·&nbsp; **[Slack triage & MCP tools](https://youtu.be/i8kZdcL1bME)** &nbsp;·&nbsp; **[Requirements & estimation](https://youtu.be/YBwdTes0Fno)** &nbsp;·&nbsp; **[Design phase & agent prompts](https://youtu.be/lV71qhmfzzw)** &nbsp;·&nbsp; **[Development & retrospective](https://youtu.be/YjRihN_SKaw)** &nbsp;·&nbsp; **[Inside the virtual world](https://youtu.be/OxoqBI7BNxU)**
4244

4345
![Bodhiorchard Living Tree Dashboard](docs/images/livingtree.png)
4446

frontend/src/views/setup/steps/MethodologyStep.vue

Lines changed: 142 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -41,89 +41,56 @@
4141
</v-btn>
4242
</div>
4343

44-
<!-- Section 1.5: Demo videos (tabbed) -->
44+
<!-- Section 1.5: Demo videos (active player + thumbnail picker) -->
4545
<div class="mb-10">
46-
<v-tabs v-model="videoTab" align-tabs="center" color="primary" density="compact">
47-
<v-tab value="setup">Setup walkthrough</v-tab>
48-
<v-tab value="slack">Slack triage &amp; MCP tools</v-tab>
49-
<v-tab value="estimation">Requirements &amp; estimation</v-tab>
50-
<v-tab value="design">Design phase &amp; agent prompts</v-tab>
51-
<v-tab value="world">Inside the virtual world</v-tab>
52-
</v-tabs>
53-
<v-card class="mt-3" variant="outlined">
54-
<v-window v-model="videoTab">
55-
<v-window-item value="setup">
56-
<div class="methodology-video-frame">
57-
<iframe
58-
src="https://www.youtube-nocookie.com/embed/ot-BmKxRgRA"
59-
title="Bodhiorchard — Setup walkthrough"
60-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
61-
allowfullscreen
62-
loading="lazy"
63-
></iframe>
64-
</div>
65-
<p class="text-caption text-center text-medium-emphasis py-3 mb-0">
66-
Clone, configure, and bring the stack up locally.
67-
</p>
68-
</v-window-item>
69-
<v-window-item value="slack">
70-
<div class="methodology-video-frame">
71-
<iframe
72-
src="https://www.youtube-nocookie.com/embed/i8kZdcL1bME"
73-
title="Bodhiorchard — Slack triage &amp; MCP tools"
74-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
75-
allowfullscreen
76-
loading="lazy"
77-
></iframe>
78-
</div>
79-
<p class="text-caption text-center text-medium-emphasis py-3 mb-0">
80-
Chat-to-BUD in Slack: the Triage Agent drafts the spec, Claude Code drives the BUD lifecycle through MCP tools.
81-
</p>
82-
</v-window-item>
83-
<v-window-item value="estimation">
84-
<div class="methodology-video-frame">
85-
<iframe
86-
src="https://www.youtube-nocookie.com/embed/YBwdTes0Fno"
87-
title="Bodhiorchard — Requirements &amp; estimation"
88-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
89-
allowfullscreen
90-
loading="lazy"
91-
></iframe>
92-
</div>
93-
<p class="text-caption text-center text-medium-emphasis py-3 mb-0">
94-
AI-drafted requirements, AI-PERT + Monte Carlo cycle-time forecasts, and the collaborative editor with full version history.
95-
</p>
96-
</v-window-item>
97-
<v-window-item value="design">
98-
<div class="methodology-video-frame">
99-
<iframe
100-
src="https://www.youtube-nocookie.com/embed/lV71qhmfzzw"
101-
title="Bodhiorchard — Design phase &amp; agent prompts"
102-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
103-
allowfullscreen
46+
<v-card variant="outlined">
47+
<div class="methodology-video-frame">
48+
<iframe
49+
:key="activeVideo.youTubeId"
50+
:src="`https://www.youtube-nocookie.com/embed/${activeVideo.youTubeId}`"
51+
:title="`Bodhiorchard — ${activeVideo.title}`"
52+
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
53+
allowfullscreen
54+
loading="lazy"
55+
></iframe>
56+
</div>
57+
<p class="text-caption text-center text-medium-emphasis py-3 mb-0 px-4">
58+
{{ activeVideo.caption }}
59+
</p>
60+
</v-card>
61+
62+
<v-row class="mt-3" dense>
63+
<v-col v-for="v in videos" :key="v.value" cols="6" sm="4" md="2">
64+
<v-card
65+
:variant="v.value === videoTab ? 'flat' : 'outlined'"
66+
:color="v.value === videoTab ? 'primary' : undefined"
67+
class="methodology-video-thumb"
68+
:class="{ 'methodology-video-thumb--active': v.value === videoTab }"
69+
@click="videoTab = v.value"
70+
>
71+
<div class="methodology-video-thumb-img-wrap">
72+
<img
73+
:src="`https://img.youtube.com/vi/${v.youTubeId}/mqdefault.jpg`"
74+
:alt="v.title"
10475
loading="lazy"
105-
></iframe>
76+
class="methodology-video-thumb-img"
77+
/>
78+
<v-icon
79+
v-if="v.value !== videoTab"
80+
class="methodology-video-thumb-play"
81+
icon="mdi-play-circle"
82+
size="36"
83+
/>
10684
</div>
107-
<p class="text-caption text-center text-medium-emphasis py-3 mb-0">
108-
Generating wireframes and the tech architecture — and how the AI agent prompts shape each handoff.
109-
</p>
110-
</v-window-item>
111-
<v-window-item value="world">
112-
<div class="methodology-video-frame">
113-
<iframe
114-
src="https://www.youtube-nocookie.com/embed/OxoqBI7BNxU"
115-
title="Bodhiorchard — Inside the virtual world"
116-
allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
117-
allowfullscreen
118-
loading="lazy"
119-
></iframe>
85+
<div
86+
class="text-caption text-center px-2 py-2"
87+
:class="v.value === videoTab ? 'font-weight-bold' : 'text-medium-emphasis'"
88+
>
89+
{{ v.title }}
12090
</div>
121-
<p class="text-caption text-center text-medium-emphasis py-3 mb-0">
122-
The Living Tree: your org as a tended orchard.
123-
</p>
124-
</v-window-item>
125-
</v-window>
126-
</v-card>
91+
</v-card>
92+
</v-col>
93+
</v-row>
12794
</div>
12895

12996
<!-- Section 1.6: Platform screenshots -->
@@ -544,7 +511,7 @@
544511
</template>
545512

546513
<script setup lang="ts">
547-
import { ref } from 'vue'
514+
import { computed, ref } from 'vue'
548515
import LifecycleFlowchart from '@/components/setup/LifecycleFlowchart.vue'
549516
import AgentCard from '@/components/setup/AgentCard.vue'
550517
import { agents } from '@/data/agents'
@@ -553,7 +520,60 @@ const emit = defineEmits<{
553520
startBuilding: []
554521
}>()
555522
556-
const videoTab = ref<string>('setup')
523+
interface DemoVideo {
524+
value: string
525+
title: string
526+
youTubeId: string
527+
caption: string
528+
}
529+
530+
const videos: DemoVideo[] = [
531+
{
532+
value: 'setup',
533+
title: 'Setup walkthrough',
534+
youTubeId: 'ot-BmKxRgRA',
535+
caption: 'Clone, configure, and bring the stack up locally.',
536+
},
537+
{
538+
value: 'slack',
539+
title: 'Slack triage & MCP tools',
540+
youTubeId: 'i8kZdcL1bME',
541+
caption:
542+
'Chat-to-BUD in Slack: the Triage Agent drafts the spec, Claude Code drives the BUD lifecycle through MCP tools.',
543+
},
544+
{
545+
value: 'estimation',
546+
title: 'Requirements & estimation',
547+
youTubeId: 'YBwdTes0Fno',
548+
caption:
549+
'AI-drafted requirements, AI-PERT + Monte Carlo cycle-time forecasts, and the collaborative editor with full version history.',
550+
},
551+
{
552+
value: 'design',
553+
title: 'Design phase & agent prompts',
554+
youTubeId: 'lV71qhmfzzw',
555+
caption:
556+
'Generating wireframes and the tech architecture — and how the AI agent prompts shape each handoff.',
557+
},
558+
{
559+
value: 'dev',
560+
title: 'Development & retrospective',
561+
youTubeId: 'YjRihN_SKaw',
562+
caption:
563+
'Development, automated code review, post-deploy retrospective, and the Learning Agent feeding insights back into estimation.',
564+
},
565+
{
566+
value: 'world',
567+
title: 'Inside the virtual world',
568+
youTubeId: 'OxoqBI7BNxU',
569+
caption: 'The Living Tree: your org as a tended orchard.',
570+
},
571+
]
572+
573+
const videoTab = ref<string>(videos[0].value)
574+
const activeVideo = computed<DemoVideo>(
575+
() => videos.find((v) => v.value === videoTab.value) ?? videos[0],
576+
)
557577
558578
const lightboxOpen = ref(false)
559579
const lightboxSrc = ref('')
@@ -764,6 +784,47 @@ const budFeatures = [
764784
border: 0;
765785
display: block;
766786
}
787+
.methodology-video-thumb {
788+
cursor: pointer;
789+
transition: transform 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
790+
overflow: hidden;
791+
height: 100%;
792+
}
793+
.methodology-video-thumb:hover {
794+
transform: translateY(-2px);
795+
border-color: rgb(var(--v-theme-primary)) !important;
796+
}
797+
.methodology-video-thumb--active {
798+
box-shadow: 0 0 0 2px rgb(var(--v-theme-primary));
799+
}
800+
.methodology-video-thumb-img-wrap {
801+
position: relative;
802+
width: 100%;
803+
aspect-ratio: 16 / 9;
804+
background: #0d1b0f;
805+
overflow: hidden;
806+
}
807+
.methodology-video-thumb-img {
808+
display: block;
809+
width: 100%;
810+
height: 100%;
811+
object-fit: cover;
812+
}
813+
.methodology-video-thumb-play {
814+
position: absolute;
815+
top: 50%;
816+
left: 50%;
817+
transform: translate(-50%, -50%);
818+
color: rgba(255, 255, 255, 0.92);
819+
text-shadow: 0 0 8px rgba(0, 0, 0, 0.55);
820+
pointer-events: none;
821+
opacity: 0.85;
822+
transition: opacity 0.18s ease, transform 0.18s ease;
823+
}
824+
.methodology-video-thumb:hover .methodology-video-thumb-play {
825+
opacity: 1;
826+
transform: translate(-50%, -50%) scale(1.08);
827+
}
767828
.methodology-shot-card {
768829
cursor: zoom-in;
769830
transition: transform 0.18s ease, border-color 0.18s ease;

0 commit comments

Comments
 (0)