daniel-c-harvey
621c4f9cb3
docs(phase-16): draft anonId privacy-note copy; note deferred Postgres integration harness
2026-06-19 15:10:15 -04:00
daniel-c-harvey
67eeb38529
Merge fix-large-upload-cap into dev (raise CMS upload cap to ~1.86 GB + nginx timeouts)
2026-06-19 15:08:48 -04:00
daniel-c-harvey
9aa66e8a62
docs: resolve remaining seven Phase 17 open questions (all 11 now closed)
2026-06-19 15:08:39 -04:00
daniel-c-harvey
3b9ca700c9
raise upload size cap to ~1.86 GB and nginx timeouts to 1200s
...
Raise RequestSizeLimit/MultipartBodyLengthLimit on upload+replace-audio,
MaxUploadBytes in BatchUpload/BatchEdit, and DefaultResponseTimeoutSeconds to
1200s. Add client_max_body_size 2000m and proxy_read/send_timeout 1200s to the
nginx manager/public confs.
2026-06-19 15:02:49 -04:00
daniel-c-harvey
4317a2f9e7
docs(phase-16): record 16.2 absorption + 16.3 anonId landing
...
PLAN/COMPLETED mark 16.2 absorbed into 16.1 and 16.3 landed (no migration). Folder CLAUDE.md files reflect anonId now accepted/persisted + the distinct-listener queries.
2026-06-19 14:57:23 -04:00
daniel-c-harvey
297805b5a8
Merge p16-w3-anonid into dev (Phase 16 Wave 16.3: unique-listener anonId layer)
2026-06-19 14:43:46 -04:00
daniel-c-harvey
944f23a88c
docs: reflect Phase 17 Wave 17.1 landing (queue Move/RemoveAt + QueueList)
2026-06-19 14:43:36 -04:00
daniel-c-harvey
75e5d99aea
Merge p17-w1-queue-engine-list into dev (Phase 17 Wave 17.1: queue Move/RemoveAt + shared QueueList)
2026-06-19 14:38:25 -04:00
daniel-c-harvey
c084efa78e
feat(phase-16.3): light up anonId unique-listener layer
...
Mint a first-party localStorage anonId, thread it onto play/share beacons,
persist it via EventController, and add all-time distinct-listener counts
(site/track/release). Storage columns + indexes already existed from 16.1.
2026-06-19 14:37:55 -04:00
daniel-c-harvey
f296bbdf00
Add queue Move/RemoveAt + dormant-Enqueue coherence and shared QueueList (Phase 17.1)
2026-06-19 14:32:08 -04:00
daniel-c-harvey
ebbaa3f84f
docs: resolve four Phase 17 open questions (OQ1/OQ4/OQ8/OQ10), defer ReleaseGallery card affordance
2026-06-19 13:42:19 -04:00
daniel-c-harvey
a715f4b28d
Merge p16-w1-foundation into dev (Phase 16 Wave 16.1: anonymous play & share telemetry substrate)
2026-06-19 13:34:01 -04:00
daniel-c-harvey
90555dc4e0
docs: spec Phase 17 player-bar queue view (queue button, overlay/embed modes, add-to-queue)
2026-06-19 13:29:57 -04:00
daniel-c-harvey
0fbf81b23e
Merge branch 'dev' into p16-w1-foundation
...
# Conflicts:
# DeepDrftPublic.Client/Controls/SharePopover.razor.cs
2026-06-19 13:28:50 -04:00
daniel-c-harvey
4114aa0be4
docs: reflect embed new-tab title link and embed queue skip buttons
2026-06-19 13:22:29 -04:00
daniel-c-harvey
884ccab826
Merge p16-embed-newwindow into dev (embed: new-tab title link + queue skip buttons)
2026-06-19 13:17:36 -04:00
daniel-c-harvey
3c1998de4f
feat(embed): show skip-prev/next buttons in embed when queue exists
2026-06-19 13:10:50 -04:00
daniel-c-harvey
622ee940f4
fix(phase-16): forward X-Forwarded-For from EventProxyController so the API rate limiter partitions per client IP
...
Proxy chains any inbound XFF with the connection IP before relaying upstream; UseForwardedHeaders resolves it to the limiter's partition key. Documents the EventRepository first-play counter race (unique index is the backstop).
2026-06-19 13:09:21 -04:00
daniel-c-harvey
18e171213c
feat: open player title link in new tab when embedded (Fixed mode)
2026-06-19 13:08:04 -04:00
daniel-c-harvey
e9c61bac1a
docs: reflect whole-release embeds, queue armed-idle state, and per-track share
2026-06-19 13:00:13 -04:00
daniel-c-harvey
dbd90ee52a
feat(phase-16): anonymous play & share telemetry substrate (wave 16.1)
...
Player-service play-session tracker (floor + 3-bucket classify), SharePopover share tracker with debounce, sendBeacon interop, proxied rate-limited POST api/event/{play,share}, append-only event logs + incremental play_counter with server-side release resolution. Migration authored, not applied. No anonId, no read surface.
2026-06-19 12:59:00 -04:00
daniel-c-harvey
1b7861e168
Merge p16-release-embed into dev (whole-release embeds + per-track share)
2026-06-19 12:55:11 -04:00
daniel-c-harvey
098020db32
feat: add per-track SharePopover to Cut detail track rows
2026-06-19 12:08:27 -04:00
daniel-c-harvey
912256d99a
Add whole-release embeds to FramePlayer and un-gate the release embed share affordance
...
The queue gains an armed-but-idle state (Arm/Start) so a release embed stages track 0 prerender-safe, then queues the full release on first play and auto-advances.
2026-06-19 12:05:35 -04:00
daniel-c-harvey
1931574ad4
Merge gitattributes-knob-eol into dev (pin knob.js to LF, stop CRLF churn on Windows checkout)
2026-06-19 11:39:40 -04:00
daniel-c-harvey
25aba1cbb7
docs(phase-16): resolve decisions D1-D7; re-sequence waves bottom-up, card last
2026-06-19 11:32:24 -04:00
daniel-c-harvey
81d0028f2b
fix: pin knob.js to LF in .gitattributes to stop CRLF churn on Windows checkout
2026-06-19 11:32:18 -04:00
daniel-c-harvey
62007a6517
fix: Icons
Deploy DeepDrftManager / Build & Publish (push) Successful in 2m9s
Deploy DeepDrftPublic / Build & Publish (push) Successful in 4m18s
Deploy DeepDrftManager / Deploy (push) Successful in 1m31s
Deploy DeepDrftPublic / Deploy (push) Successful in 1m28s
2026-06-19 11:15:19 -04:00
daniel-c-harvey
13b07beb0b
fix: Styles & Links & Content
2026-06-19 11:15:09 -04:00
daniel-c-harvey
7711c5067c
docs: reflect DurationSeconds write on replace-audio
...
Deploy DeepDrftAPI / Build, Publish & Bundle (push) Successful in 4m3s
Deploy DeepDrftAPI / Deploy (push) Successful in 1m35s
Replace path now updates SQL DurationSeconds via unconditional SetDuration; document SetDuration vs null-guarded UpdateDuration and correct the stale 'SQL is not written' note.
2026-06-19 10:15:59 -04:00
daniel-c-harvey
eaa71ebea3
Merge replace-audio-duration-sync into dev (sync DurationSeconds on audio replace via unconditional SetDuration)
2026-06-19 10:13:19 -04:00
daniel-c-harvey
e8359d5473
fix: replace-audio duration write now unconditional via SetDuration
...
UpdateDuration's null guard matched zero rows for tracks that already had a duration (all normally-uploaded tracks). Add SetDurationAsync/SetDuration/ITrackService.SetDuration with no null guard; fail on zero rows. ReplaceAudioAsync now calls SetDuration.
2026-06-19 04:19:39 -04:00
daniel-c-harvey
7265754c27
fix: write DurationSeconds to SQL after replace-audio vault swap
2026-06-18 15:03:38 -04:00
daniel-c-harvey
abc832467d
docs(plan): add Phase 16 spec — anonymous play & share tracking
...
Design spec for the telemetry layer behind the home-hero Plays card:
completion-bucketed plays, shares, optional anonymous unique listeners
under a no-PII constraint. Seven open decisions flagged for Daniel.
2026-06-18 14:28:02 -04:00
daniel-c-harvey
47919a226e
feature: Home page graphics
Deploy DeepDrftAPI / Build, Publish & Bundle (push) Successful in 2m22s
Deploy DeepDrftManager / Build & Publish (push) Successful in 1m23s
Deploy DeepDrftPublic / Build & Publish (push) Successful in 4m16s
Deploy DeepDrftAPI / Deploy (push) Successful in 1m35s
Deploy DeepDrftManager / Deploy (push) Successful in 1m29s
Deploy DeepDrftPublic / Deploy (push) Successful in 1m28s
2026-06-18 14:25:08 -04:00
daniel-c-harvey
933b7145e5
Merge knob-js-deploy-fix into dev (commit compiled RCL knob JS so it ships in publish output)
2026-06-18 13:18:43 -04:00
daniel-c-harvey
f21647423a
docs: document track replace-audio endpoint and edit-form gating
2026-06-18 13:17:30 -04:00
daniel-c-harvey
df7acd9e80
docs: reflect live home-hero stats (duration column, stats endpoint, backfill, NowPlayingStats wiring)
2026-06-18 13:14:52 -04:00
daniel-c-harvey
3a4db834ac
fix: track compiled RCL knob JS for MapStaticAssets deployment
2026-06-18 13:14:09 -04:00
daniel-c-harvey
d12151278a
Merge cms-track-replace-gating into dev
...
Replace track audio in CMS edit form + gate last-track delete.
2026-06-18 13:14:08 -04:00
daniel-c-harvey
ca90302f21
fix: register-new-then-remove-old in ReplaceTrackAudioAsync; replace wording in timeout messages; doc comment on ExistingTrackCount
...
On partial failure the old path deleted the original audio before
confirming the new write succeeded. Now: load old extension, register
new audio first (original untouched on failure), then clean up stale
backing file only on success and only when extension changed.
2026-06-18 13:11:59 -04:00
daniel-c-harvey
16784b37f2
feat(cms): replace track audio in edit form, gate last-track delete
...
Swap a track's audio by EntryKey (metadata/release/position preserved, waveform regenerated); hide per-track remove on a release's sole persisted track so it can only be replaced or release-deleted.
2026-06-18 12:59:56 -04:00
daniel-c-harvey
e9e6b6054f
Merge nowplaying-stats into dev (live home-hero aggregate stats + track duration column)
2026-06-18 12:58:54 -04:00
daniel-c-harvey
8fa330fbd3
fix: exclude live tracks under soft-deleted releases from home stats cut/mix figures
2026-06-18 12:42:23 -04:00
daniel-c-harvey
5f0422a263
Wire NowPlayingStats to live aggregates: add SQL track duration column, stats endpoint, and duration backfill
2026-06-18 11:53:49 -04:00
daniel-c-harvey
8ddecb4acc
about styles
Deploy DeepDrftPublic / Build & Publish (push) Successful in 3m57s
Deploy DeepDrftPublic / Deploy (push) Successful in 1m28s
2026-06-17 22:35:41 -04:00
daniel-c-harvey
17a35247c1
docs: mark About page follow-ups (2) + (4) resolved in COMPLETED.md
Deploy DeepDrftAPI / Build, Publish & Bundle (push) Successful in 2m11s
Deploy DeepDrftManager / Build & Publish (push) Successful in 1m20s
Deploy DeepDrftPublic / Build & Publish (push) Successful in 3m54s
Deploy DeepDrftAPI / Deploy (push) Successful in 1m34s
Deploy DeepDrftManager / Deploy (push) Successful in 1m30s
Deploy DeepDrftPublic / Deploy (push) Successful in 1m28s
2026-06-17 22:27:10 -04:00
daniel-c-harvey
fb987acc18
Merge p12-w5-khabran-bio into dev (Khabran bio + multi-paragraph bio render)
2026-06-17 22:18:06 -04:00
daniel-c-harvey
b524b8e6ec
feature: Images edits
2026-06-17 22:18:01 -04:00
daniel-c-harvey
9cfc31f725
content(about): wire Khabran's bio + multi-paragraph render
...
Bio embedded as \n\n-delimited string; render splits on that boundary
into per-para <p class="bio-body">. Adjacent-sibling margin keeps
stacked paragraphs readable. Daniel's single-para bio is unaffected.
2026-06-17 22:16:18 -04:00