appydave-tools 0.21.2 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +7 -0
  3. data/bin/dam +137 -0
  4. data/docs/README.md +187 -90
  5. data/docs/architecture/dam/dam-cli-enhancements.md +642 -0
  6. data/docs/architecture/dam/dam-cli-implementation-guide.md +1041 -0
  7. data/docs/architecture/dam/dam-data-model.md +466 -0
  8. data/docs/architecture/dam/dam-visualization-requirements.md +641 -0
  9. data/docs/architecture/dam/implementation-roadmap.md +328 -0
  10. data/docs/architecture/dam/jan-collaboration-guide.md +309 -0
  11. data/lib/appydave/tools/dam/s3_operations.rb +57 -5
  12. data/lib/appydave/tools/dam/s3_scanner.rb +139 -0
  13. data/lib/appydave/tools/version.rb +1 -1
  14. data/lib/appydave/tools.rb +1 -0
  15. data/package.json +1 -1
  16. metadata +37 -32
  17. data/docs/development/CODEX-recommendations.md +0 -258
  18. data/docs/development/README.md +0 -100
  19. /data/docs/{development/pattern-comparison.md → architecture/cli/cli-pattern-comparison.md} +0 -0
  20. /data/docs/{development/cli-architecture-patterns.md → architecture/cli/cli-patterns.md} +0 -0
  21. /data/docs/{project-brand-systems-analysis.md → architecture/configuration/configuration-systems.md} +0 -0
  22. /data/docs/{dam → architecture/dam}/dam-vision.md +0 -0
  23. /data/docs/{dam/prd-client-sharing.md → architecture/dam/design-decisions/002-client-sharing.md} +0 -0
  24. /data/docs/{dam/prd-git-integration.md → architecture/dam/design-decisions/003-git-integration.md} +0 -0
  25. /data/docs/{prd-unified-brands-configuration.md → architecture/design-decisions/001-unified-brands-config.md} +0 -0
  26. /data/docs/{dam/session-summary-2025-11-09.md → architecture/design-decisions/session-2025-11-09.md} +0 -0
  27. /data/docs/{configuration/README.md → guides/configuration-setup.md} +0 -0
  28. /data/docs/{dam → guides/platforms}/windows/README.md +0 -0
  29. /data/docs/{dam → guides/platforms}/windows/dam-testing-plan-windows-powershell.md +0 -0
  30. /data/docs/{dam → guides/platforms}/windows/installation.md +0 -0
  31. /data/docs/{tools → guides/tools}/bank-reconciliation.md +0 -0
  32. /data/docs/{tools → guides/tools}/cli-actions.md +0 -0
  33. /data/docs/{tools → guides/tools}/configuration.md +0 -0
  34. /data/docs/{dam → guides/tools/dam}/dam-testing-plan.md +0 -0
  35. /data/docs/{dam/usage.md → guides/tools/dam/dam-usage.md} +0 -0
  36. /data/docs/{tools → guides/tools}/gpt-context.md +0 -0
  37. /data/docs/{tools → guides/tools}/index.md +0 -0
  38. /data/docs/{tools → guides/tools}/move-images.md +0 -0
  39. /data/docs/{tools → guides/tools}/name-manager.md +0 -0
  40. /data/docs/{tools → guides/tools}/prompt-tools.md +0 -0
  41. /data/docs/{tools → guides/tools}/subtitle-processor.md +0 -0
  42. /data/docs/{tools → guides/tools}/youtube-automation.md +0 -0
  43. /data/docs/{tools → guides/tools}/youtube-manager.md +0 -0
  44. /data/docs/{configuration → templates}/.env.example +0 -0
  45. /data/docs/{configuration → templates}/channels.example.json +0 -0
  46. /data/docs/{configuration → templates}/settings.example.json +0 -0
@@ -0,0 +1,641 @@
1
+ # DAM Visualization Requirements
2
+
3
+ **Digital Asset Management - Web-Based Dashboard Specification**
4
+
5
+ This document defines the requirements for a web-based visual dashboard to manage video projects across brands, focusing on David ↔ Jan collaboration via S3 staging.
6
+
7
+ ---
8
+
9
+ ## Project Scope
10
+
11
+ **What This Is:**
12
+ - **DAM-specific visualization** - NOT a unified tool dashboard
13
+ - **Web-based** (Astro static site) - NOT terminal/CLI UI
14
+ - **S3 collaboration focus** - Short/medium-term staging, not long-term archival
15
+ - **Two-view system** - Brand overview + Project detail
16
+
17
+ **What This Is NOT:**
18
+ - Configuration management UI (config is foundational, not visualized)
19
+ - Unified dashboard for all tools (GPT Context, YouTube Manager, Subtitles are separate)
20
+ - Database-driven application (reads JSON manifests only)
21
+ - Replacement for CLI commands (provides clipboard buttons instead)
22
+
23
+ ---
24
+
25
+ ## User Personas
26
+
27
+ ### David Cruwys (Primary User)
28
+ - **Role:** Owner, content creator, system architect
29
+ - **Environment:** Mac, code version (git clone)
30
+ - **Brands:** All 6 brands (appydave, aitldr, voz, kiros, beauty-and-joy, supportsignal)
31
+ - **Primary Workflows:**
32
+ - Switch between projects quickly (b64 → b70 → SupportSignal)
33
+ - Check S3 sync status before/after collaboration
34
+ - Know what's on SSD when drive is unplugged
35
+ - Find project codes for video cross-references
36
+ - **Pain Points:**
37
+ - Remembering CLI commands (`dam s3-up appydave b65` vs `dam s3-down ...`)
38
+ - Switching context between brands/projects
39
+ - Knowing if Jan has uploaded changes to S3
40
+
41
+ ### Jan (Support Team)
42
+ - **Role:** Team member, image/animation support
43
+ - **Environment:** Windows/WSL, gem version (`gem install appydave-tools`)
44
+ - **Brands:** Primarily appydave, aitldr (David assigns work)
45
+ - **Primary Workflows:**
46
+ - Download project from S3 for editing
47
+ - Upload edited files back to S3
48
+ - See what projects are available
49
+ - **Pain Points:**
50
+ - Getting lost in text-heavy help screens
51
+ - Remembering complex command syntax
52
+ - Understanding project status at a glance
53
+
54
+ ### Mary (Future User)
55
+ - **Role:** Content creator (AI-TLDR)
56
+ - **Environment:** Non-technical (NO Ruby setup)
57
+ - **Access Method:** Public Cloudflare Pages deployment
58
+ - **Requirement:** View-only access to project status
59
+
60
+ ### Vasilios & Ronnie (Client Users)
61
+ - **Role:** Clients (VOZ, Kiros, SupportSignal)
62
+ - **Environment:** Non-technical
63
+ - **Access Method:** Public Cloudflare Pages deployment
64
+ - **Requirement:** View project status (no access restrictions for MVP)
65
+ - **Note:** Not locked down per-brand (can see all projects)
66
+
67
+ ---
68
+
69
+ ## Core Use Cases
70
+
71
+ ### Use Case 1: Daily Check-In (David)
72
+ **Goal:** "What's happening across my projects?"
73
+
74
+ **Scenario:**
75
+ - David opens dashboard in morning
76
+ - Sees brand overview: appydave (21), aitldr (3), voz (2)
77
+ - Notices b65 has S3 changes (Jan uploaded edits)
78
+ - Clicks b65 → Detail view
79
+ - Clicks "Sync from S3" button → Copies `dam s3-down appydave b65` to clipboard
80
+ - Runs command in terminal
81
+
82
+ **Data Needed:**
83
+ - Brand list with project counts
84
+ - Per-project S3 status indicator
85
+ - Quick-action clipboard buttons
86
+
87
+ ---
88
+
89
+ ### Use Case 2: Project Context Switching (David)
90
+ **Goal:** "I'm recording b64, but need to reference b57"
91
+
92
+ **Scenario:**
93
+ - David is mid-recording, mentions "see video b57 for details"
94
+ - Opens dashboard, searches for "b57"
95
+ - Sees b57 is archived (SSD only, not local)
96
+ - Notes: Can reference transcript/assets, but not video files
97
+ - Continues recording with correct info
98
+
99
+ **Data Needed:**
100
+ - Search/filter projects
101
+ - Storage location status (local/S3/SSD)
102
+ - Visual indication of what's available
103
+
104
+ ---
105
+
106
+ ### Use Case 3: Collaboration Workflow (David → Jan)
107
+ **Goal:** "Upload b70 for Jan to edit animations"
108
+
109
+ **Scenario:**
110
+ - David finishes recording b70
111
+ - Opens dashboard → b70 detail view
112
+ - Clicks "Upload to S3" → Copies `dam s3-up appydave b70`
113
+ - Runs command in terminal
114
+ - Sends Jan a message: "b70 ready for editing"
115
+
116
+ ---
117
+
118
+ ### Use Case 4: Collaboration Workflow (Jan → David)
119
+ **Goal:** "Download b70, edit, upload back"
120
+
121
+ **Scenario:**
122
+ - Jan receives message from David
123
+ - Opens dashboard → appydave brand
124
+ - Sees b70 with "S3 available" indicator
125
+ - Clicks "Download from S3" → Copies `dam s3-down appydave b70`
126
+ - Runs command in WSL terminal
127
+ - Edits animations
128
+ - Clicks "Upload to S3" → Copies `dam s3-up appydave b70`
129
+ - Uploads changes
130
+ - Notifies David
131
+
132
+ **Data Needed:**
133
+ - S3 availability indicator
134
+ - Download/upload clipboard buttons
135
+ - Project file listing (what's in S3)
136
+
137
+ ---
138
+
139
+ ### Use Case 5: Check SSD Status (David)
140
+ **Goal:** "What's on my SSD? (Drive not plugged in)"
141
+
142
+ **Scenario:**
143
+ - David's SSD is at home (not connected)
144
+ - Opens dashboard (reads cached manifest)
145
+ - Sees projects marked "SSD only" (400GB on SSD)
146
+ - Knows which projects need SSD connected to access
147
+
148
+ **Data Needed:**
149
+ - SSD status from manifest (last scan)
150
+ - Disk usage totals
151
+ - List of SSD-only projects
152
+
153
+ ---
154
+
155
+ ## Two-View System
156
+
157
+ ### View 1: Brand Overview
158
+
159
+ **Purpose:** High-level status across all brands
160
+
161
+ **URL Structure:** `/` or `/brands`
162
+
163
+ **Data Displayed:**
164
+
165
+ 1. **Brand Cards** (6 cards, grid layout)
166
+ - Brand name (AppyDave, AITLDR, VOZ, etc.)
167
+ - Project count (21 projects)
168
+ - Disk usage (local: 11.5 GB, SSD: 400 GB)
169
+ - Team members (David, Jan)
170
+ - Quick stats:
171
+ - Projects with S3 staging (3)
172
+ - Local-only projects (15)
173
+ - SSD-only projects (5)
174
+
175
+ 2. **Filters/Search**
176
+ - Text search (project ID or name)
177
+ - Filter by brand
178
+ - Filter by storage (has-s3, local-only, ssd-only)
179
+
180
+ 3. **Recent Activity** (Future)
181
+ - Last 5 projects updated
182
+ - S3 uploads/downloads
183
+
184
+ **Interactions:**
185
+ - Click brand card → Navigate to Project List view for that brand
186
+ - Search bar → Filter visible brands/projects
187
+
188
+ **Layout:**
189
+ ```
190
+ ┌─────────────────────────────────────────────────────┐
191
+ │ DAM Dashboard - Brand Overview │
192
+ │ │
193
+ │ [Search: ____________] [Filter: All Brands ▼] │
194
+ │ │
195
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
196
+ │ │ AppyDave │ │ AITLDR │ │ VOZ │ │
197
+ │ │ 21 projects│ │ 3 projects │ │ 2 projects │ │
198
+ │ │ 11.5 GB │ │ 0.5 GB │ │ 0.45 GB │ │
199
+ │ │ S3: 3 │ │ S3: 1 │ │ S3: 0 │ │
200
+ │ └────────────┘ └────────────┘ └────────────┘ │
201
+ │ │
202
+ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
203
+ │ │ Beauty&Joy │ │ Kiros │ │ SupportSig │ │
204
+ │ │ 0 projects │ │ 0 projects │ │ 0 projects │ │
205
+ │ │ 0 GB │ │ 0 GB │ │ 0 GB │ │
206
+ │ └────────────┘ └────────────┘ └────────────┘ │
207
+ └─────────────────────────────────────────────────────┘
208
+ ```
209
+
210
+ ---
211
+
212
+ ### View 2: Project Detail
213
+
214
+ **Purpose:** Detailed status for a specific project
215
+
216
+ **URL Structure:** `/brands/{brand}/projects/{project-id}`
217
+
218
+ Example: `/brands/appydave/projects/b65-guy-monroe-marketing-plan`
219
+
220
+ **Data Displayed:**
221
+
222
+ 1. **Project Header**
223
+ - Project ID (b65-guy-monroe-marketing-plan)
224
+ - Brand (AppyDave)
225
+ - Type (FliVideo | Storyline | General)
226
+ - Breadcrumb: Home → AppyDave → b65
227
+
228
+ 2. **Storage Status** (3 sections)
229
+ - **Local Storage**
230
+ - Status: Present | Absent
231
+ - Structure: Flat | Archived
232
+ - Heavy files: Yes/No
233
+ - Light files: Yes/No
234
+ - Disk usage: 125 MB
235
+ - **S3 Staging**
236
+ - Status: Has files | Empty
237
+ - File count: 2 files
238
+ - Last sync: 2 hours ago (future)
239
+ - **SSD Backup**
240
+ - Status: Present | Absent
241
+ - Path: b50-b99/b65-guy-monroe-marketing-plan
242
+ - Disk usage: 8.2 GB
243
+
244
+ 3. **Quick Actions** (Clipboard Buttons)
245
+ - [📋 Upload to S3] → `dam s3-up appydave b65`
246
+ - [📋 Download from S3] → `dam s3-down appydave b65`
247
+ - [📋 Check S3 Status] → `dam s3-status appydave b65`
248
+ - [📋 Archive to SSD] → `dam archive appydave b65`
249
+ - [📋 Sync from SSD] → `dam sync-ssd appydave`
250
+
251
+ 4. **File Listing** (if local exists)
252
+ - `/recordings` (75 files, 6.5 GB)
253
+ - `/assets` (12 files, 2 MB)
254
+ - `/s3-staging` (2 files, 125 MB)
255
+
256
+ **Layout:**
257
+ ```
258
+ ┌──────────────────────────────────────────────────────────┐
259
+ │ AppyDave > b65-guy-monroe-marketing-plan │
260
+ │ │
261
+ │ Type: FliVideo │
262
+ │ │
263
+ │ Storage Locations: │
264
+ │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐│
265
+ │ │ 📁 Local │ │ ☁️ S3 Staging │ │ 💾 SSD ││
266
+ │ │ ✅ Present │ │ ✅ 2 files │ │ ❌ Absent ││
267
+ │ │ Flat structure │ │ │ │ ││
268
+ │ │ 125 MB │ │ │ │ ││
269
+ │ └─────────────────┘ └─────────────────┘ └─────────────┘│
270
+ │ │
271
+ │ Quick Actions: │
272
+ │ [📋 Upload to S3] [📋 Download from S3] │
273
+ │ [📋 S3 Status] [📋 Archive to SSD] │
274
+ │ │
275
+ │ Files: │
276
+ │ /recordings (75 files, 6.5 GB) │
277
+ │ /assets (12 files, 2 MB) │
278
+ │ /s3-staging (2 files, 125 MB) │
279
+ └──────────────────────────────────────────────────────────┘
280
+ ```
281
+
282
+ ---
283
+
284
+ ## Data Sources
285
+
286
+ **All data comes from existing JSON manifests** (no database required):
287
+
288
+ 1. **Brand configuration** - `~/.config/appydave/brands.json`
289
+ 2. **Project manifests** - `{brand}/projects.json` (per brand)
290
+ 3. **Settings** - `~/.config/appydave/settings.json`
291
+
292
+ **Data Refresh:**
293
+ - Static site reads manifests at build time
294
+ - User manually regenerates manifests via CLI: `dam manifest <brand>`
295
+ - Dashboard shows "Last updated" timestamp from manifest
296
+
297
+ ---
298
+
299
+ ## Technology Stack
300
+
301
+ ### Frontend: Astro
302
+
303
+ **Why Astro:**
304
+ - Static site generation (no server required)
305
+ - Can read JSON directly (no database)
306
+ - Fast, modern, component-based
307
+ - Supports React/Svelte/Vue if needed
308
+ - Easy deployment (local file:// or hosted)
309
+
310
+ **Data Loading:**
311
+ ```javascript
312
+ // src/pages/brands/[brand]/projects/[project].astro
313
+ ---
314
+ import { getBrandProjects } from '@/data/manifests';
315
+
316
+ const { brand, project } = Astro.params;
317
+ const manifest = getBrandProjects(brand);
318
+ const projectData = manifest.projects.find(p => p.id === project);
319
+ ---
320
+ ```
321
+
322
+ ### Deployment Options
323
+
324
+ 1. **Local Development** (David's machine)
325
+ - Source of truth (only David has all brands)
326
+ - Astro dev server: `npm run dev`
327
+ - Builds to `dist/` folder
328
+
329
+ 2. **Static Build** (Shareable)
330
+ - Build: `npm run build`
331
+ - Output: `dist/` (HTML, CSS, JS)
332
+ - Jan/Mary can open `dist/index.html` in browser
333
+
334
+ 3. **Hosted** (Future)
335
+ - Deploy to Netlify/Vercel/GitHub Pages
336
+ - Auto-rebuild on manifest changes
337
+ - Requires exposing manifests (git or API)
338
+
339
+ ---
340
+
341
+ ## UI Design Principles
342
+
343
+ ### 1. Dyslexia-Friendly
344
+
345
+ **Do:**
346
+ - ✅ Soft color coding (green=good, yellow=warning, red=problem)
347
+ - ✅ Generous whitespace
348
+ - ✅ Large, readable fonts (16px+ body text)
349
+ - ✅ High contrast (but not harsh)
350
+ - ✅ Consistent layout/positioning
351
+
352
+ **Don't:**
353
+ - ❌ No emoji spam (avoid 📊 🎬 ⚙️ everywhere)
354
+ - ❌ No walls of text
355
+ - ❌ No complex tables
356
+ - ❌ No tiny fonts or low contrast
357
+
358
+ ### 2. Color Coding System
359
+
360
+ | Color | Meaning | Usage |
361
+ |-------|---------|-------|
362
+ | **Green** (`#22c55e`) | Good / Present / Synced | Storage exists, files backed up |
363
+ | **Yellow** (`#eab308`) | Warning / Needs attention | Out of sync, needs upload |
364
+ | **Red** (`#ef4444`) | Problem / Missing | Storage absent, error |
365
+ | **Blue** (`#3b82f6`) | Info / Neutral | Informational badges |
366
+ | **Gray** (`#6b7280`) | Disabled / Inactive | Unavailable actions |
367
+
368
+ ### 3. Spatial Design
369
+
370
+ **Avoid:**
371
+ - Long vertical lists (hard to scan)
372
+ - Horizontal scrolling
373
+ - Hidden/nested menus
374
+
375
+ **Prefer:**
376
+ - Grid layouts (brand cards)
377
+ - Visual hierarchy (header > sections > details)
378
+ - Inline status indicators (badges, icons)
379
+
380
+ ---
381
+
382
+ ## Clipboard Button Behavior
383
+
384
+ **Goal:** Don't execute commands, just copy them to clipboard
385
+
386
+ **Implementation:**
387
+ ```javascript
388
+ function copyToClipboard(command) {
389
+ navigator.clipboard.writeText(command);
390
+ // Show toast: "Copied: dam s3-up appydave b65"
391
+ }
392
+ ```
393
+
394
+ **Button Design:**
395
+ ```html
396
+ <button
397
+ class="clipboard-btn"
398
+ data-command="dam s3-up appydave b65"
399
+ onclick="copyToClipboard(this.dataset.command)"
400
+ >
401
+ 📋 Upload to S3
402
+ </button>
403
+ ```
404
+
405
+ **User Workflow:**
406
+ 1. Click button → Command copied to clipboard
407
+ 2. Open terminal
408
+ 3. Paste (Cmd+V / Ctrl+V)
409
+ 4. Run command
410
+
411
+ ---
412
+
413
+ ## Additional Requirements
414
+
415
+ ### Command Execution Options
416
+
417
+ **Clipboard Buttons (MVP):**
418
+ - Copy CLI command to clipboard
419
+ - User pastes and runs in terminal
420
+ - Safe, simple, works everywhere
421
+
422
+ **Direct Execution (Future):**
423
+ - Local development only (David/Jan)
424
+ - "Run it for me" button
425
+ - Calls Astro API endpoint → Executes Ruby CLI command
426
+ - Requires:
427
+ - Astro running locally
428
+ - Ruby CLI tools available
429
+ - Server-side execution capability
430
+
431
+ ### Manifest Data Source Challenges
432
+
433
+ **Problem:** Whose manifest is source of truth?
434
+
435
+ **Scenario:**
436
+ - David and Jan both run DAM locally
437
+ - Each generates manifests from their local state
438
+ - Manifests differ (David has SSD data, Jan doesn't)
439
+ - Astro site needs consistent data for Cloudflare Pages
440
+
441
+ **Solution (MVP):**
442
+ - **Source of truth:** David's machine (only one with all brands + SSD)
443
+ - **Workflow:**
444
+ 1. David generates manifests (`dam manifest all`, `dam s3-scan all`)
445
+ 2. David pushes manifests to Astro data folder (ETL process)
446
+ 3. Git commit → Cloudflare Pages rebuilds site
447
+ 4. Jan/Mary/Clients see David's view of the world
448
+
449
+ **Jan's Local Astro:**
450
+ - Jan can run Astro locally
451
+ - Reads David's manifests (from git)
452
+ - Cannot update published site (only David can)
453
+ - **Question:** Should Jan be able to generate his own local manifests for his local Astro view?
454
+
455
+ **Database Alternative (Out of Scope):**
456
+ - Use Convex database
457
+ - Both David/Jan push manifest updates to DB
458
+ - Astro site reads from DB (not git)
459
+ - Enables real-time collaborative view
460
+ - More complex infrastructure
461
+
462
+ ### Project-Level Manifests
463
+
464
+ **Purpose:** Detailed file tree for single project
465
+
466
+ **Command:** `dam project-manifest <brand> <project>`
467
+
468
+ **Output:** `{project}/.project-manifest.json`
469
+
470
+ **Structure:**
471
+ ```json
472
+ {
473
+ "project_id": "b64-bmad-claude-sdk",
474
+ "type": "flivideo",
475
+ "generated_at": "2025-11-18T12:00:00Z",
476
+ "tree": {
477
+ "recordings": {
478
+ "type": "directory",
479
+ "file_count": 75,
480
+ "total_bytes": 6800000000,
481
+ "subdirectories": {
482
+ "recordings-bmad-v6": {
483
+ "type": "directory",
484
+ "file_count": 26,
485
+ "total_bytes": 1200000000
486
+ }
487
+ }
488
+ },
489
+ "assets": {
490
+ "type": "directory",
491
+ "file_count": 12,
492
+ "total_bytes": 2000000
493
+ },
494
+ "s3-staging": {
495
+ "type": "directory",
496
+ "file_count": 2,
497
+ "total_bytes": 125000000
498
+ },
499
+ "transcripts": {
500
+ "type": "directory",
501
+ "file_count": 3,
502
+ "total_bytes": 500000
503
+ }
504
+ }
505
+ }
506
+ ```
507
+
508
+ **Characteristics:**
509
+ - **Transient** - Not required, regenerate on demand
510
+ - **Optional** - Dashboard works without it (shows booleans instead)
511
+ - **Git-ignored** - Too volatile to commit
512
+ - **On-demand** - Generate when needed for detail view
513
+ - **Future:** Clickable button in Astro to generate (local dev only)
514
+
515
+ ### S3 Commands
516
+
517
+ **Brand-Level S3 Scan:**
518
+ - `dam s3-scan <brand>` - Scan all projects in brand
519
+ - `dam s3-scan all` - Scan all brands
520
+ - Updates brand manifest with real S3 file listings
521
+ - Queries AWS S3 bucket (not just local `s3-staging/` folder)
522
+
523
+ **Project-Level S3 Discover (Exists):**
524
+ - `dam s3-discover <brand> <project>` - List files for one project
525
+ - Shows available files in S3 staging
526
+ - Can generate shareable pre-signed URLs
527
+
528
+ ### Transcript Locations
529
+
530
+ **FliVideo Projects:**
531
+ - **Primary:** `{project}/transcripts/` (future standard)
532
+ - **Legacy:** `{project}/s3-staging/*.srt` (temporary, migrating away)
533
+ - **Formats:** `.srt`, `.txt`
534
+ - **Per-segment transcripts:** Future enhancement (chapter-level + segment-level)
535
+
536
+ **Storyline Projects:**
537
+ - **Location:** `{project}/data/source/`
538
+ - **Files:**
539
+ - `transcript.srt` - Subtitle format
540
+ - `transcript.txt` - Plain text
541
+ - `transcript-raw.txt` - Unedited
542
+ - `words.json` - Word-level timing
543
+ - `beats.json` - Story beats
544
+ - `timestamps.txt` - Timing data
545
+
546
+ **Dashboard Integration:**
547
+ - Show "Has transcript: Yes/No" indicator (MVP)
548
+ - Link to open transcript (future)
549
+ - Full transcript preview (out of scope)
550
+
551
+ ### Brand Configuration Extensions
552
+
553
+ **Color Coding:**
554
+ - Add `color` property to brands.json
555
+ - Example: `"color": "#3b82f6"` (blue), `"color": "#22c55e"` (green)
556
+ - Use for brand card backgrounds, badges, visual distinction
557
+ - May need multiple colors (primary, secondary)
558
+
559
+ **Example:**
560
+ ```json
561
+ {
562
+ "appydave": {
563
+ "name": "AppyDave",
564
+ "shortcut": "ad",
565
+ "type": "owned",
566
+ "color": "#3b82f6",
567
+ "...": "..."
568
+ }
569
+ }
570
+ ```
571
+
572
+ ## Future Enhancements (Out of Scope for MVP)
573
+
574
+ 1. **Real S3 Sync Detection** - ✅ Addressed (dam s3-scan command)
575
+ 2. **File-Level Diff** - Compare local vs S3 files (which changed?)
576
+ 3. **Team Activity Feed** - Who uploaded what, when?
577
+ 4. **Transcript Search** - Full-text search across all project transcripts
578
+ 5. **FliVideo Chapter View** - Visual timeline of recordings
579
+ 6. **Storyline Script View** - Display storyline.json data
580
+ 7. **YouTube Publish Status** - Link projects to published videos
581
+ 8. **Disk Usage Trends** - Historical disk usage over time
582
+ 9. **Project-Level Manifest Auto-Generation** - Button in Astro to generate on-demand
583
+ 10. **Direct Command Execution** - Run Ruby commands from Astro (local dev)
584
+ 11. **Database Backend** - Convex for collaborative manifest updates
585
+
586
+ ---
587
+
588
+ ## Success Metrics
589
+
590
+ **MVP is successful if:**
591
+
592
+ 1. **David can answer these questions in <5 seconds:**
593
+ - "Does b65 have changes in S3?"
594
+ - "What's my next project code?"
595
+ - "Is b57 on my SSD or local?"
596
+
597
+ 2. **Jan can perform these actions without asking David:**
598
+ - Download a project from S3
599
+ - Upload edited files back to S3
600
+ - See what projects are available to work on
601
+
602
+ 3. **Command confusion is eliminated:**
603
+ - No more "was it `dam s3-up` or `dam up-s3`?"
604
+ - Clipboard buttons provide exact syntax
605
+
606
+ 4. **Context switching is faster:**
607
+ - David can switch brands/projects without digging through filesystems
608
+ - Visual layout reduces cognitive load
609
+
610
+ ---
611
+
612
+ ## Implementation Phases
613
+
614
+ ### Phase 1: Data Model & Manifest Understanding (COMPLETED)
615
+ - ✅ Document entity schema
616
+ - ✅ Map data sources
617
+ - ✅ Understand manifest generation
618
+
619
+ ### Phase 2: Astro Project Setup (Next)
620
+ - Create Astro project structure
621
+ - Set up data loading from manifests
622
+ - Basic routing (`/brands`, `/brands/{brand}/projects/{project}`)
623
+
624
+ ### Phase 3: Brand Overview View
625
+ - Grid layout of brand cards
626
+ - Project counts, disk usage
627
+ - Search/filter
628
+
629
+ ### Phase 4: Project Detail View
630
+ - Storage status display
631
+ - Clipboard buttons
632
+ - File listing
633
+
634
+ ### Phase 5: Polish & Testing
635
+ - Dyslexia-friendly design
636
+ - Color coding
637
+ - David + Jan user testing
638
+
639
+ ---
640
+
641
+ **Last updated**: 2025-11-18