Daeseon Yoo
Back to project
·Tech retro·2 min·Review needed

Video as a Fourth Content Type — §1.1 A Deliberate Departure from Simplicity

By owner decision, short video (20s) was added on top of voice/photo/text. Flagged as a deliberate departure from the spec's simplicity guardrail, extending the existing capture pattern as-is. Unresolved playback compatibility caveat noted.

AI version

Context: Tension with the spec

work.md §1.1 nailed content types down to just three — voice/photo/text, "when in doubt, leave it out." Video runs head-on against that guardrail (pendant = small and intimate → video pushes the grain toward a "video message app"). I flagged this tension explicitly, and the owner chose to add it → implemented in a restrained version (20s cap).

Honest record: this was not something the AI recommended, but a decision by the product owner to deliberately extend the spec. It is a trade-off against the §1.1 spirit of depth = accuracy.

Implementation (1f14c0e) — extending the existing pattern as-is

Mirrored the audio capture pattern to keep consistency:

  • components/VideoRecorder.tsxgetUserMedia({video,audio}), live preview, 20s cap, re-record, distinguishing permission-denied/failure, unmount-safe.
  • lib/items.ts saveVideoItem + MIME whitelist (isAllowedVideoMime, video/ prefix).
  • schema/init: added 'video' to the type CHECK + idempotent migration for existing DBs (ALTER TABLE … DROP/ADD CONSTRAINT) — because CREATE TABLE IF NOT EXISTS doesn't change constraints on an existing table.
  • fourth tab on the add/contribute screen, ItemCard·SurfaceClient render, raised the upload early-block limit (MAX_UPLOAD_BYTES 45MB, video ≤40MB).
  • The media route's Range/206 already covers video seeking.

Verification (run directly)

  • Confirmed the 'Video' tab shows up.
  • Dummy video upload → 201 (= confirms the DB CHECK migration actually allows 'video' on an existing DB, 0 constraint violations).
  • video item shown in the library, media 206/video/webm/nosniff.
  • Rejection: text/html in the video slot → 400.

⚠️ Unresolved caveat — playback compatibility

ffmpeg isn't on this machine, so no server transcoding. Desktop Chrome records webm → doesn't play on iPhone (and vice versa). On the same device/browser it works fine. This is the video counterpart of the §12 audio issue; audio was solved with mp4-first + server conversion, but video is unresolved. It can be solved by putting ffmpeg + webm→mp4 conversion on the production host (reusing the audio code lib/audio.ts pattern).

This caveat is predicted from code/format knowledge without testing real-device cross playback — actual iPhone↔desktop cross playback is unverified.

Review needed

No human review on this entry yet.