{"$schema":"https://ejfox.com/schema/page-twin@1.json","kind":"project","url":"https://ejfox.com/projects/clipgoblin","json_url":"https://ejfox.com/projects/clipgoblin.json","generator":"ejfox.com/json-twin@1","data":{"cacheVersion":"2026-05-13-gear-cards","html":"<figure role=\"figure\" aria-label=\"Clipgoblin running in a vulpes-themed terminal\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/terminal.png\" alt=\"Clipgoblin running in a vulpes-themed terminal\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/clipgoblin/terminal.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/clipgoblin/terminal.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/terminal.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/clipgoblin/terminal.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Clipgoblin running in a vulpes-themed terminal\" width=\"1351\" height=\"600\" style=\"--splay-rot:-1.8deg;\" data-dimensions=\"1351×600\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Clipgoblin running in a vulpes-themed terminal</figcaption>\n</figure>\n<p class=\"\">clipgoblin came out of a real editing problem. I was buried in a corpus of long recorded talks and lectures — hours of it — that I needed to actually navigate for a research project, and scrubbing Final Cut timelines to find the one moment someone said the thing was breaking me. So I built a tool that reads the transcript and drops a marker at every concept-relevant moment straight into the Final Cut timeline. Now I move through hours of footage by hitting <code class=\"md-inline-code\">Ctrl+'</code> instead of scrubbing.</p>\n<figure role=\"figure\" aria-label=\"The CLI — generating concept-tagged FCPXML markers from a words.json transcript\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/code2.png\" alt=\"The CLI — generating concept-tagged FCPXML markers from a words.json transcript\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/clipgoblin/code2.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/clipgoblin/code2.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/code2.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/clipgoblin/code2.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"The CLI — generating concept-tagged FCPXML markers from a words.json transcript\" width=\"1400\" height=\"900\" style=\"--splay-rot:-1.52deg;\" data-dimensions=\"1400×900\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">The CLI — generating concept-tagged FCPXML markers from a words.json transcript</figcaption>\n</figure>\n<p class=\"\">Under the hood it shells out to Whisper for word-level transcription, then generates concept-tagged FCPXML markers from the resulting <code class=\"md-inline-code\">words.json</code> — so each marker lands on the exact word, not a rough guess.</p>\n<figure role=\"figure\" aria-label=\"Resolving and shelling out to whisper for word-level transcription\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/code.png\" alt=\"Resolving and shelling out to whisper for word-level transcription\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/projects/clipgoblin/code.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/projects/clipgoblin/code.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/projects/clipgoblin/code.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/projects/clipgoblin/code.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Resolving and shelling out to whisper for word-level transcription\" width=\"1400\" height=\"900\" style=\"--splay-rot:1.54deg;\" data-dimensions=\"1400×900\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Resolving and shelling out to whisper for word-level transcription</figcaption>\n</figure>\n<h2 class=\"\" id=\"related-video-tools\">Related video tools</h2>\n<h3 class=\"\" id=\"sentry-search\">Sentry Search</h3>\n<figure role=\"figure\" aria-label=\"sentrysearch CLI help output listing the index, search, img, highlights, shell, and stats commands\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1785421788/projects/sentrysearch/cli-help.png\" alt=\"sentrysearch CLI help output listing the index, search, img, highlights, shell, and stats commands\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1785421788/projects/sentrysearch/cli-help.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1785421788/projects/sentrysearch/cli-help.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1785421788/projects/sentrysearch/cli-help.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1785421788/projects/sentrysearch/cli-help.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"sentrysearch CLI help output listing the index, search, img, highlights, shell, and stats commands\" width=\"1200\" height=\"560\" style=\"--splay-rot:1.96deg;\" data-dimensions=\"1200×560\" class=\"img-full my-8 rounded-sm img-splay w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">sentrysearch CLI help output listing the index, search, img, highlights, shell, and stats commands</figcaption>\n</figure>\n<p class=\"\">Sentry Search is semantic search over video footage: type a query and get back the matching trimmed clip, instead of scrubbing hours of timeline. Its CLI covers indexing, search, image search, highlights, and stats.</p>\n<h3 class=\"\" id=\"transcript-video\">Transcript Video</h3>\n<figure role=\"figure\" aria-label=\"Synced transcript with concept color-tagging — a word appears in Archivo Black timed to speech, with tagged terms highlighted and a QR provenance code\" class=\"\">\n<img src=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1789191612/projects/transcript-video/landing.png\" alt=\"Synced transcript with concept color-tagging — a word appears in Archivo Black timed to speech, with tagged terms highlighted and a QR provenance code\" loading=\"lazy\" decoding=\"async\" srcset=\"https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_640/v1789191612/projects/transcript-video/landing.png 640w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_960/v1789191612/projects/transcript-video/landing.png 960w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1280/v1789191612/projects/transcript-video/landing.png 1280w, https://res.cloudinary.com/ejf/image/upload/c_scale,f_auto,q_auto:good,w_1920/v1789191612/projects/transcript-video/landing.png 1920w\" sizes=\"(max-width: 430px) 92vw, (max-width: 768px) 85vw, 900px\" title=\"Synced transcript with concept color-tagging — a word appears in Archivo Black timed to speech, with tagged terms highlighted and a QR provenance code\" width=\"1920\" height=\"1080\" style=\"--splay-rot:2.57deg;\" data-dimensions=\"1920×1080\" class=\"img-full my-8 rounded-sm img-splay aspect-video w-full mx-auto py-4\" crossorigin=\"anonymous\">\n<figcaption class=\"\">Synced transcript with concept color-tagging — a word appears in Archivo Black timed to speech, with tagged terms highlighted and a QR provenance code</figcaption>\n</figure>\n<p class=\"\"><a href=\"https://github.com/ejfox/transcript-video\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"external-link group inline-flex items-center text-blue-600 dark:text-blue-400\" data-preview-url=\"https://github.com/ejfox/transcript-video\">Transcript Video<svg class=\"inline-block w-4 h-4 ml-1 opacity-50 dark:opacity-75 group-hover:opacity-100 transition-opacity align-text-bottom\" xmlns=\"http://www.w3.org/2000/svg\" width=\"1em\" height=\"1em\" viewBox=\"0 0 24 24\"><path fill=\"currentColor\" d=\"M12 .297c-6.63 0-12 5.373-12 12c0 5.303 3.438 9.8 8.205 11.385c.6.113.82-.258.82-.577c0-.285-.01-1.04-.015-2.04c-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729c1.205.084 1.838 1.236 1.838 1.236c1.07 1.835 2.809 1.305 3.495.998c.108-.776.417-1.305.76-1.605c-2.665-.3-5.466-1.332-5.466-5.93c0-1.31.465-2.38 1.235-3.22c-.135-.303-.54-1.523.105-3.176c0 0 1.005-.322 3.3 1.23c.96-.267 1.98-.399 3-.405c1.02.006 2.04.138 3 .405c2.28-1.552 3.285-1.23 3.285-1.23c.645 1.653.24 2.873.12 3.176c.765.84 1.23 1.91 1.23 3.22c0 4.61-2.805 5.625-5.475 5.92c.42.36.81 1.096.81 2.22c0 1.606-.015 2.896-.015 3.286c0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12\" class=\"\"></path></svg></a> generates 1080p synced transcript videos from audio, with word-level timing and concept color-tagging. It includes audio-reactive visualizations: a spectrogram, oscilloscopes, and a Lissajous phase scope.</p>","title":"clipgoblin","metadata":{"title":"clipgoblin","date":"2026-04-29T05:00:00.000Z","category":"Tools","featured":false,"tech":["Swift"],"state":"deployed","ai-involvement":"ai-assisted","tags":["tools"],"words":256,"images":5,"imageDetails":{"total":5,"cloudinary":5,"withDimensions":0},"links":1,"codeBlocks":0,"headers":{"h2":1},"toc":[{"text":"Related video tools","slug":"related-video-tools","level":"h2","children":[{"text":"Sentry Search","slug":"sentry-search","level":"h3","children":[]},{"text":"Transcript Video","slug":"transcript-video","level":"h3","children":[]}]}],"type":"post"}},"_links":{"self":"https://ejfox.com/projects/clipgoblin.json","html":"https://ejfox.com/projects/clipgoblin","index":"/projects.json"}}