Take Two

A browser-local video review demo with timestamped feedback, visual annotations, version comparison and approval tied to a specific cut.

Try live demoVersion 1.0.4
Take Two Cover
Take Two Cover

About Take Two

Take Two keeps video feedback connected to the cut it concerns. A comment can point to a moment, a time range or an area of the image, and a required change keeps its original evidence as the film moves through revisions.

Create a project, add a supported local video and submit it for review. Switch to the Reviewer role to leave comments, draw a pin or rectangle annotation, flag required changes and request another pass. Submitted versions keep their own media and review history.

Take Two showing a rectangle annotation on the first cut and the required changes carried into the current review.

Timestamped feedback retains the original version, range and visual annotation.

The comparison view puts two versions beside each other, with linked or independent playback and a choice of audio source. Linked playback follows elapsed time. Each cut keeps its own evidence anchors, so an edit that changes timing does not move an earlier comment to a different scene.

Two video versions playing side by side in Take Two, with required changes listed beneath them.

Compare the cuts while keeping the original feedback and proposed fixes in view.

Editors mark fixes as addressed; reviewers verify them. Open and addressed requirements block approval until they are resolved or withdrawn. Approval records identify the exact submitted version, and reopening a review preserves its earlier decision. Printable review reports and JSON exports keep the discussion, requirements and decisions together; video files are excluded from those exports.

Take Two showing Version 2 approved and both required changes resolved.

Approval belongs to Version 2, with the resolved requirements and earlier feedback still visible.

The interface uses warm neutral surfaces, charcoal text and coral accents. On a narrow screen, the video comes first and the review controls follow underneath. Unsent feedback drafts, conflicting edits and failed local saves have recovery paths that keep the work visible.

Take Two's mobile review layout, with the video player above required changes and comments.

The same review workspace at a 390-pixel mobile viewport.

Built with React, TypeScript, Vite and IndexedDB. This is an independent portfolio demo with fictional sample projects and two bundled motion-graphic cuts. One visitor switches between simulated Editor and Reviewer roles. Project data and imported videos stay in the current browser profile; there is no account service or remote collaboration.

Notes & updates

Release history

Version 1.0.4
  • Added the standard NikoCodes playground breadcrumb and links: NikoCodes, Take Two, About this project, and All demos. The project link targets the Take Two software page.
  • Fixed the video review stage remaining on “Loading video...” when Chromium exposed metadata and playback but did not fire a usable canplay transition. Metadata, first-frame, user-initiated playback, and playing events now all clear the waiting state.
  • Added Chrome regressions for the playground header links and a media path with both canplay and loadeddata listeners unavailable.
  • Expanded verification to 29 domain/persistence tests and 20 Chrome journeys.
Version 1.0.3
  • Replaced inherited sessionStorage draft identity with per-browsing-context ownership stored in window.name. Opener-created and duplicated tabs get a new owner immediately, while reloads, back-forward restores, and SPA navigation retain the same recoverable drafts.
  • Added real-Chrome coverage for a child opened with window.open, including independent comment drafts and reload recovery in both tabs.
  • Serialized storage recovery and conflict resolution. Project and media edits attempted while recovery is active are rejected without replacing the committed recovery snapshot.
  • Retained any pending project revision that changes while an earlier snapshot is saving and advanced its durable base to the committed revision.
  • Added a synchronous recovery lock and stable recovery-copy operation identity. Repeated or double-clicked copy actions cannot create duplicate projects, and the lock is released on success and failure.
  • Added delayed-IndexedDB Chromium regressions for intervening edits and repeated recovery-copy actions, including durable-record checks after reload.
  • Expanded verification to 29 domain/persistence tests and 18 Chrome journeys.
Version 1.0.2
  • Gave each browser tab a stable draft owner and gave every draft save a monotonic revision, preventing another tab from overwriting or consuming an unrelated comment, reply, or edit draft.
  • Disabled composer mutation while an exact comment or text-draft revision is being submitted, so completing an earlier save cannot clear newer input.
  • Moved submitted-draft validation and deletion into the same IndexedDB transaction as feedback persistence. A cleanup failure rolls back the project write, and recovery consumes the exact draft once without duplicating feedback.
  • Made session media resolve from the in-memory Blob cache when an aborted durable write leaves no stored media, including playback before recovery.
  • Retained session-only projects, edits, imported media, and submitted-draft references until durable persistence is confirmed or explicitly discarded.
  • Reconciled pending work against its durable base revision before replacing application state. Repeated recovery is idempotent.
  • Added explicit conflict recovery that can apply session changes, keep the stored version, or save the session version as a separate recovery copy while preserving the stored project.
  • Added storage and browser regressions for tab-owned drafts, earlier-save completion, failed draft cleanup, replies, edits, quota failures, imported media playback, existing-project edits, reload recovery, and conflicts.
  • Expanded verification to 29 domain/persistence tests and 15 Chrome journeys.
Version 1.0.1
  • Added SHA-256 media fingerprints and content-exact relinking for submitted media.
  • Made relink authorization, revision checking, Blob writes, and restoration audit updates one atomic IndexedDB transaction.
  • Added explicit handling for legacy media records without fingerprints.
  • Froze required-change mutations while a review is approved; only a reasoned review reopen enables them again.
  • Corrected current-version labels after reopening an approved review.
  • Separated editor proposed-fix evidence from reviewer verification events and validated explicit anchor changes against their target media.
  • Reworked linked comparison transport so pause and play are coordinated, natural end does not pause the longer clip, and one selected player owns audio.
  • Repaired comparison timeline markers and source/proposed evidence navigation.
  • Persisted comment, reply, and edit drafts by project, version, and actor, with durable/session-only status and retry-safe stale refresh.
  • Added application-owned media usage enforcement, orphan cleanup, and rollback coverage for interrupted Blob/project writes.
  • Made browser tests portable across discovered system browsers and the Playwright-managed browser, using OS temporary directories.
  • Expanded verification to 26 domain/persistence tests and 9 Chrome journeys.
Version 1.0.0
  • Added the complete local Editor/Reviewer review workflow.
  • Added IndexedDB project records, media blobs, transactional revision checks, storage estimates, sample reset, and confirmed data removal.
  • Added two original playable 24-second demo cuts with generated posters and a reproducible FFmpeg source.
  • Added measured local video import, browser decode validation, a 100 MB clip limit, relink verification, and recovery states.
  • Added anchored point/range/general comments, replies, author edits, tombstones, filters, and per-version composer draft preservation.
  • Added normalized pin and rectangle annotations that remap across player resizing and responsive layouts.
  • Added required-change history with Open, Addressed, Resolved, and Withdrawn states plus role-specific commands.
  • Added request-changes decisions, revision delivery, carried requirements, and source/fix evidence links that do not invent new timestamps.
  • Added side-by-side comparison with independent and linked elapsed-time playback, one visible audio source, and shorter-duration clamping.
  • Added exact-version approval, blocker checks, stale-write rejection, historical approval records, and reasoned reopening.
  • Added printable reports and JSON metadata/approval exports with an explicit no-media warning.
  • Added desktop/mobile layouts, in-app expanded review, keyboard playback controls, focus states, and reduced-motion handling.
  • Added 12 domain tests, 3 persistence tests, and 5 Playwright journeys with review, annotation, comparison, recovery, approval, and mobile screenshots.
  • Added README, QA report, NikoCodes draft copy, playground tags, and handoff notes.