{"repo":"joshmu/videonote","free":true,"listed":false,"github":"https://github.com/joshmu/videonote","clone":"git clone https://github.com/joshmu/videonote.git","description":"Slick video review note taking app 🎬","language":"TypeScript","stars":12,"topics":["videonote","tool","video","todo","notetaking","rehearsal","creative"],"license":null,"category":"productivity","readme_excerpt":"VideoNote A video review app with slick intuitive controls to create timestamped notes on the fly. ✨ Tech Stack - Next.js - Tailwind CSS - Framer Motion - react-intersection-observer - react-icons - mongoose - react-player - nodemailer - universal-cookie - nanoid Some additional experimental features are enabled in tailwind.config.js : uniformColorPalette, extendedSpacingScale, extendedFontSizeScale Setup - MongoDB database - SMTP email server - JWT Create a .env.local based on the .env.example for local development. Run it npm i && npm run dev API conventions Routes under pages/api/ use two small higher-order wrappers from utils/auth/withAuthenticatedUser.ts to keep authentication out of the handler bodies: - withAuthenticatedUser(handler) — required for routes that mutate user data ( auth , user , settings , project ). The handler receives a third ctx argument with { userDoc, email, newToken } . Missing/invalid tokens short-circuit with 401; missing users short-circuit with 401. - withOptionalUser(handler) — used by pages/api/note.ts , which allows guest note creation. The handler receives a discriminated ctx : either { isGuest: true, ... null } or the full authenticated context. A token that is present but invalid still 401s — there is no silent fallback to the guest branch. Shared-project access goes through utils/share/sharePassword.ts : - hashSharePassword(plaintext) — used by pages/api/project.ts when creating or updating a Share document. Returns null for empty input.","default_branch":null,"files":null,"tree":[],"storefront":"/r/joshmu","claimed":false,"request_supported":{"post":"https://gitbuyer.com/r/joshmu/videonote/request-supported","requests":0},"note":"indexed from public GitHub; nothing is for sale on this page. Clone it from GitHub. Paid listings live at /search."}