[{"data":1,"prerenderedAt":1358},["ShallowReactive",2],{"blog:index":3,"site":1341},[4,114,305,916,1177],{"id":5,"title":6,"author":7,"body":8,"ctaLine":98,"ctaTitle":98,"date":99,"description":100,"extension":101,"heroAlt":102,"heroImage":98,"meta":103,"navigation":104,"ogImage":105,"path":106,"seo":107,"stem":108,"tags":109,"updated":98,"__hash__":113},"blog\u002Fblog\u002Fa-condensed-memory-of-the-work.md","A condensed memory of the work","Michael Ruescher, Founder",{"type":9,"value":10,"toc":90},"minimark",[11,15,28,31,36,39,46,50,57,63,66,70,77,84,87],[12,13,14],"p",{},"Andrew coaches strength athletes in person, and he films every session. When\na client drives home, a short reel follows them: the best lift of the day,\nthe fix that finally clicked, the rep that looked the way it's supposed to\nlook.",[12,16,17,18,22,23,27],{},"The first time he described this, we almost mis-heard it as a marketing\nhabit. It isn't. The reels are ",[19,20,21],"strong",{},"part of the coaching",". A session is two\nhours; what a client can hold onto is about ninety seconds. The reel is that\nninety seconds, a condensed memory of the work, something to replay between\nvisits. Reel after reel, they become a running record of progress, and that\ncontinuity ",[24,25,26],"em",{},"is"," the relationship.",[12,29,30],{},"We think that's what recordings are actually for.",[32,33,35],"h2",{"id":34},"most-of-what-you-record-you-lose","Most of what you record, you lose",[12,37,38],{},"Think about your own archive for a second. The podcast episodes, the client calls,\nthe coaching sessions, the interviews: hours of the realest material your\nwork produces, and almost all of it is write-only. You record it, store it,\nand never open it again, because opening it costs too much. An hour of video\nis an hour of your life to review.",[12,40,41,42,45],{},"The industry's answer has been to make more content out of it. Ten viral\nclips from every episode. That treats your archive as ore for the feed, and\nit misses what Andrew understands instinctively: the recording's first\naudience is ",[24,43,44],{},"the people who were in it",".",[32,47,49],{"id":48},"clips-as-citations","Clips as citations",[12,51,52,53,56],{},"Everything BitterClip makes keeps a receipt. A clip isn't a loose file. It\npoints back to the exact words, the exact speaker, the exact seconds of the\nsource it came from. We think of a finished clip as a ",[19,54,55],{},"citation",": a claim\nabout what mattered, with the evidence attached.",[12,58,59,60,62],{},"That's what makes the condensed-memory habit trustworthy. Andrew's reel\nisn't \"content inspired by Tuesday's session.\" It ",[24,61,26],{}," Tuesday's session,\nthe true ninety seconds of it, with nothing invented in between. When he and\na client disagree about how the lift looked, the source is one step away.\nThe clip settles it, because the clip can prove where it came from.",[12,64,65],{},"And because your assistant can read the transcript, search it, and zoom into\nthe moment where someone actually said the thing, \"find where we talked\nabout her grip\" is a question, not an afternoon.",[32,67,69],{"id":68},"the-archive-should-age-like-wine","The archive should age like wine",[12,71,72,73,76],{},"Here's where this goes, and we'll be plain that we're partway there: an\narchive you can ",[24,74,75],{},"study",", not just store.",[12,78,79,80,83],{},"Andrew doesn't have one session with a client. He has months of them, in\norder. The good questions live across that sequence: what changed since\nMarch, which cue finally worked, what to plan for next Tuesday. BitterClip\nalready gives you the pieces, with every session transcribed, every speaker\nknown, every moment addressable. The work ahead of us is making the\n",[24,81,82],{},"sequence"," as readable as the session, so your assistant can read a season\nof work the way it reads an episode.",[12,85,86],{},"Most footage just sits in a folder somewhere. It piles up, and you never\nreally go back into it. Andrew's archive works the other way: every session\nhe adds makes the older ones more useful, because now there's a history to\nread across. It actually gets better with age, like good wine.",[12,88,89],{},"That's the promise of recording everything: not more posts, but a memory of\nyour work that's condensed enough to hold onto and cited well enough to\ntrust.",{"title":91,"searchDepth":92,"depth":92,"links":93},"",3,[94,96,97],{"id":34,"depth":95,"text":35},2,{"id":48,"depth":95,"text":49},{"id":68,"depth":95,"text":69},null,"2026-07-08","A coach we work with sends every client a highlight reel of their session — not as marketing, but as memory. That habit explains more about where BitterClip is going than any feature list.","md","A ledger of weekly training reels — five dated highlight reels, each sent to the client, the newest marked ready.",{},true,"\u002Fimages\u002Fblog\u002Fcondensed-memory\u002Fledger-og.jpg","\u002Fblog\u002Fa-condensed-memory-of-the-work",{"title":6,"description":100},"blog\u002Fa-condensed-memory-of-the-work",[110,111,112],"coaching","memory","receipts","lJEWFRPO95nYKskMEkRYzL7XhOJRv4f-DcH69UItBRA",{"id":115,"title":116,"author":7,"body":117,"ctaLine":98,"ctaTitle":98,"date":289,"description":290,"extension":101,"heroAlt":291,"heroImage":292,"meta":293,"navigation":104,"ogImage":294,"path":295,"seo":296,"stem":297,"tags":298,"updated":303,"__hash__":304},"blog\u002Fblog\u002Fgemini-3-7-multiple-witnesses.md","Visual analysis in BitterClip just got a lot faster",{"type":9,"value":118,"toc":284},[119,122,125,128,131,134,137,140,144,147,157,160,167,170,173,179,182,188,192,195,198,259,262,265,269,272,275,278,281],[12,120,121],{},"Visual analysis in BitterClip just got a lot faster.",[12,123,124],{},"We upgraded our main visual model from Gemini 3.6 to Gemini 3.7. In matched\ntesting, median model response time fell from 27.8 seconds to 10.8 seconds. That\nis a 61.1% lower response time. Estimated cost was 24.6% lower too.",[12,126,127],{},"We did not find a strong semantic difference between the two models in the\nfootage we reviewed. Both generally understood the scene. So we put the faster\none in front and kept Gemini 3.6 as the fallback.",[12,129,130],{},"The route there was less direct. Our first Gemini 3.7 production test went\nbackward in time.",[12,132,133],{},"The model said a visual event began at 146 seconds and ended at 20.8 seconds. If\nyou were looking for a reason not to upgrade, there it was.",[12,135,136],{},"Then Gemini 3.6 did the same kind of thing.",[12,138,139],{},"That was the useful moment. We had blamed the new model before looking closely\nat the question we were asking it.",[32,141,143],{"id":142},"we-were-asking-for-too-much","We were asking for too much",[12,145,146],{},"BitterClip uses Gemini to understand what is happening in a video and when it\nhappens. Our old response format asked for a precise start and end for every\nvisual observation:",[148,149,154],"pre",{"className":150,"code":152,"language":153,"meta":91},[151],"language-text","start_seconds: 146.0\nend_seconds:    20.8\n","text",[155,156,152],"code",{"__ignoreMap":91},[12,158,159],{},"The numbers were individually valid. Together, they were impossible.",[12,161,162],{},[163,164],"img",{"alt":165,"src":166},"A sanitized model response shows an impossible interval running from 146 seconds back to 20.8 seconds.","\u002Fimages\u002Fblog\u002Fgemini-3-7-benchmark\u002Ftimestamp-reversal.svg",[12,168,169],{},"The deeper problem was that video often does not contain a clean ending. A\ncamera can show someone beginning a movement, then turn away while the movement\ncontinues. Asking the model for an exact duration invites it to guess.",[12,171,172],{},"So we tried a smaller question: where can you actually see the thing?",[148,174,177],{"className":175,"code":176,"language":153,"meta":91},[151],"at_seconds: 146.0\n",[155,178,176],{"__ignoreMap":91},[12,180,181],{},"That point is still a model claim, and BitterClip still has to check it against\nthe source. But it is a much cleaner unit of evidence. BitterClip can build a\nshort playback range around it for navigation without pretending the action\nlasted for that whole range.",[12,183,184],{},[163,185],{"alt":186,"src":187},"A model-guessed duration is replaced by one model-authored evidence point and a separate playback range.","\u002Fimages\u002Fblog\u002Fgemini-3-7-benchmark\u002Fevidence-point-contract.svg",[32,189,191],{"id":190},"what-the-testing-showed","What the testing showed",[12,193,194],{},"We ran 192 matched calls across the same two video chunks and four response\nformats. We did not find a strong semantic difference between Gemini 3.6 and\n3.7 in the material we reviewed. Both could understand the scene, and both\ncould produce bad timing under the old interval format.",[12,196,197],{},"The operational difference was clear:",[199,200,201,218],"table",{},[202,203,204],"thead",{},[205,206,207,211,215],"tr",{},[208,209,210],"th",{},"Fixed test workload",[208,212,214],{"align":213},"right","Gemini 3.6",[208,216,217],{"align":213},"Gemini 3.7",[219,220,221,233,246],"tbody",{},[205,222,223,227,230],{},[224,225,226],"td",{},"Raw temporal checks passed",[224,228,229],{"align":213},"94 \u002F 96",[224,231,232],{"align":213},"92 \u002F 96",[205,234,235,238,241],{},[224,236,237],{},"Median provider latency",[224,239,240],{"align":213},"27.8 s",[224,242,243],{"align":213},[19,244,245],{},"10.8 s",[205,247,248,251,254],{},[224,249,250],{},"Estimated provider cost",[224,252,253],{"align":213},"$2.75",[224,255,256],{"align":213},[19,257,258],{},"$2.08",[12,260,261],{},"Google charged both models at the same rate; 3.7 simply used fewer tokens in\nthis test. The point format also passed all 48 of its raw timing checks.",[12,263,264],{},"A larger follow-up stopped early because of a bug in our audit code, so we did\nnot use it to declare a benchmark winner. It did not change the practical read:\n3.7 was much faster, a little cheaper, and not meaningfully different in the\nfootage we reviewed.",[32,266,268],{"id":267},"we-upgraded","We upgraded",[12,270,271],{},"We ran a strict two-chunk production canary, changed one model pin, and ran one\nmore live visual-path check. All three calls used Gemini 3.7 without falling\nback or retrying.",[12,273,274],{},"Gemini 3.7 is now the primary model for BitterClip’s visual analysis. Gemini 3.6\nremains the fallback. If wider use exposes a problem, we can put 3.6 back in\nfront with the same small pin change.",[12,276,277],{},"The point-format work remains separate from the model upgrade. The useful result\nfor people using BitterClip today is simpler: visual analysis now spends much\nless time waiting on the model. We upgraded, kept a clean way back, and moved\non.",[279,280],"hr",{},[12,282,283],{},"The comparison used 96 calls per model on two fixed silent video chunks. The\ncost figures are rate-card estimates, not a reconciled provider bill. This was a\nfocused product test, not a general benchmark of video understanding.",{"title":91,"searchDepth":92,"depth":92,"links":285},[286,287,288],{"id":142,"depth":95,"text":143},{"id":190,"depth":95,"text":191},{"id":267,"depth":95,"text":268},"2026-08-14","Gemini 3.7 cut median model response time by 61% in our video tests, with no strong semantic difference from 3.6. So we upgraded and kept 3.6 as the fallback.","BitterClip visual analysis comparison showing median model response time falling from 27.8 seconds with Gemini 3.6 to 10.8 seconds with Gemini 3.7.","\u002Fimages\u002Fblog\u002Fgemini-3-7-benchmark\u002Fgemini-3-7-benchmark-chart.svg",{},"\u002Fimages\u002Fblog\u002Fgemini-3-7-benchmark\u002Fgemini-3-7-benchmark-og.png","\u002Fblog\u002Fgemini-3-7-multiple-witnesses",{"title":116,"description":290},"blog\u002Fgemini-3-7-multiple-witnesses",[299,300,301,302],"Gemini","visual understanding","benchmarks","engineering","2026-08-16","dwi7iKkE-aZ8oTT7lI-QDSa6osyNGEljVbTcLlSiVdQ",{"id":306,"title":307,"author":7,"body":308,"ctaLine":901,"ctaTitle":902,"date":903,"description":904,"extension":101,"heroAlt":905,"heroImage":906,"meta":907,"navigation":104,"ogImage":908,"path":909,"seo":910,"stem":911,"tags":912,"updated":98,"__hash__":915},"blog\u002Fblog\u002Fpi-vs-deepseek-harness.md","Pi vs. DeepSeek Harness: why we chose Pi",{"type":9,"value":309,"toc":890},[310,313,316,319,336,340,343,360,363,367,374,381,384,387,403,409,413,428,434,443,446,449,618,621,624,627,631,634,723,726,730,739,742,751,754,757,766,769,773,782,785,803,806,810,813,816,819,822,826,829,846,849,853,856,873,876,879,881,886],[12,311,312],{},"An early version of BitterClip's in-product agent got confused about a missing\ntool, searched through the server filesystem, and then told us BitterClip could\nnot add background music.",[12,314,315],{},"BitterClip could add background music. The agent just couldn't see the right way\nto do it.",[12,317,318],{},"That was the moment our harness decision became much simpler. Inside a video\neditor, we did not want a coding agent with a side job. We wanted an agent that\ncould do exactly what BitterClip could do, through the same operations every\nother client uses, and nothing else.",[12,320,321,322,329,330,335],{},"We chose the ",[323,324,328],"a",{"href":325,"rel":326},"https:\u002F\u002Fpi.dev\u002F",[327],"nofollow","Pi agent harness"," for that job.\n",[323,331,334],{"href":332,"rel":333},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness",[327],"DeepSeek Harness"," arrived\nafter that decision, so this is not a story about rejecting it in a bake-off.\nIt is an impressive foundation and, for some products, the better choice. For\nBitterClip, we would still choose Pi.",[32,337,339],{"id":338},"what-is-an-agent-harness","What is an agent harness?",[12,341,342],{},"The model is the intelligence. The harness is everything that lets that\nintelligence get work done: the conversation loop, tools, streaming, retries,\nmemory, compaction, and the connection to a user interface.",[12,344,345,346,351,352,359],{},"That makes the title easy to misread. This isn't Pi versus a DeepSeek model.\nBoth harnesses can call models from multiple providers. Can Pi run a DeepSeek\nmodel? ",[323,347,350],{"href":348,"rel":349},"https:\u002F\u002Fapi-docs.deepseek.com\u002Fquick_start\u002Fagent_integrations\u002Fpi_mono\u002F",[327],"Yes—DeepSeek publishes an official Pi integration guide",".\nThat is a separate decision from using DeepSeek Harness. In fact, one DeepSeek\nHarness adapter uses Pi's lower-level\n",[323,353,356],{"href":354,"rel":355},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fdsh-v0.1.0-rc.7\u002Fpackages\u002Fllm\u002Fllm-pi-ai\u002FREADME.md",[327],[155,357,358],{},"pi-ai","\npackage.",[12,361,362],{},"Models and harnesses are separate choices. We can change the model without\nrebuilding the product around it.",[32,364,366],{"id":365},"what-bitterclip-actually-needed","What BitterClip actually needed",[12,368,369,373],{},[323,370,372],{"href":371},"\u002Fdocs\u002Fgetting-started\u002Fwhat-is-bitterclip","BitterClip"," is a transcript-first\nmedia workshop. You can ask the agent to find a moment, trim a section, create a\nClip, start a Render, or undo an edit without leaving the editor.",[12,375,376,377,45],{},"Most of that machinery already existed before the embedded agent. Rails owns\nthe recordings, transcripts, edit operations, permissions, revisions, renders,\nand account boundaries. ",[323,378,380],{"href":379},"\u002Fdocs\u002Fassistants\u002Foverview","ChatGPT and Claude already reach those operations\nthrough BitterClip's MCP server",[12,382,383],{},"The new agent didn't need another workflow engine. It needed to become one\nmore careful client of the product we already had.",[12,385,386],{},"That gave us four requirements:",[388,389,390,394,397,400],"ol",{},[391,392,393],"li",{},"The model should see only BitterClip's MCP tools: no shell, filesystem,\nbrowser, skills, or subagents.",[391,395,396],{},"The editor should receive live text, progress, tool activity, cancellation,\nand usage events while the agent works.",[391,398,399],{},"Conversations should survive a reload, and the stored copy should stay with\nBitterClip.",[391,401,402],{},"The harness should remain replaceable without rewriting the editor or the\nproduct's operations.",[12,404,405,406],{},"Our internal shorthand is: ",[19,407,408],{},"BitterClip remembers the video. The harness\nremembers the conversation. MCP is the only way between them.",[32,410,412],{"id":411},"how-we-embedded-pi-in-bitterclip","How we embedded Pi in BitterClip",[12,414,415,416,421,422,427],{},"Two protocols keep those jobs separate.\n",[323,417,420],{"href":418,"rel":419},"https:\u002F\u002Fagentclientprotocol.com\u002Fget-started\u002Fintroduction",[327],"ACP"," carries the\nconversation between the editor and the agent.\n",[323,423,426],{"href":424,"rel":425},"https:\u002F\u002Fmodelcontextprotocol.io\u002Fdocs\u002Fgetting-started\u002Fintro",[327],"MCP"," gives the model\na typed set of things BitterClip can do. In production, the path looks like\nthis:",[148,429,432],{"className":430,"code":431,"language":153,"meta":91},[151],"BitterClip editor\n      │  ACP: prompts, progress, tool activity, cancellation\n      ▼\nRails bridge\n      │  ACP\n      ▼\nPi session\n      │  MCP: BitterClip tools only\n      ▼\nRails operations, authorization, recordings, and edits\n",[155,433,431],{"__ignoreMap":91},[12,435,436,437,442],{},"Pi owns the middle. Its\n",[323,438,441],{"href":439,"rel":440},"https:\u002F\u002Fgithub.com\u002Fearendil-works\u002Fpi\u002Fblob\u002Fv0.84.1\u002Fpackages\u002Fcoding-agent\u002Fdocs\u002Fsdk.md",[327],"SDK","\ngives us the agent loop, streaming events, provider adapters, retries,\ncompaction, and tree-structured sessions. We wrote the two adapters around it:\nan ACP server facing the editor and an MCP client facing BitterClip.",[12,444,445],{},"We use ACP's session and activity vocabulary, plus small BitterClip-specific\nupdates for save receipts and diagnostics. A replacement harness could keep the\neditor and product operations, but its adapter would still need to implement\nthat contract.",[12,447,448],{},"The important part is how we create the session. This is a simplified version\nof our Pi 0.84.1 setup:",[148,450,454],{"className":451,"code":452,"language":453,"meta":91,"style":91},"language-ts shiki shiki-themes github-dark-dimmed","const tools = await loadBitterClipMcpTools()\nconst names = tools.map((tool) => tool.name)\n\nconst { session } = await createAgentSession({\n  tools: names,\n  customTools: tools,\n  excludeTools: [\"read\", \"bash\", \"edit\", \"write\", \"grep\", \"find\", \"ls\"],\n  resourceLoader: lockedDownResourceLoader,\n  sessionManager,\n})\n","ts",[155,455,456,483,514,519,544,550,556,600,606,612],{"__ignoreMap":91},[457,458,461,465,469,472,475,479],"span",{"class":459,"line":460},"line",1,[457,462,464],{"class":463},"scLw-","const",[457,466,468],{"class":467},"sDGpf"," tools",[457,470,471],{"class":463}," =",[457,473,474],{"class":463}," await",[457,476,478],{"class":477},"sLyBy"," loadBitterClipMcpTools",[457,480,482],{"class":481},"s1ain","()\n",[457,484,485,487,490,492,495,498,501,505,508,511],{"class":459,"line":95},[457,486,464],{"class":463},[457,488,489],{"class":467}," names",[457,491,471],{"class":463},[457,493,494],{"class":481}," tools.",[457,496,497],{"class":477},"map",[457,499,500],{"class":481},"((",[457,502,504],{"class":503},"s7B5-","tool",[457,506,507],{"class":481},") ",[457,509,510],{"class":463},"=>",[457,512,513],{"class":481}," tool.name)\n",[457,515,516],{"class":459,"line":92},[457,517,518],{"emptyLinePlaceholder":104},"\n",[457,520,522,524,527,530,533,536,538,541],{"class":459,"line":521},4,[457,523,464],{"class":463},[457,525,526],{"class":481}," { ",[457,528,529],{"class":467},"session",[457,531,532],{"class":481}," } ",[457,534,535],{"class":463},"=",[457,537,474],{"class":463},[457,539,540],{"class":477}," createAgentSession",[457,542,543],{"class":481},"({\n",[457,545,547],{"class":459,"line":546},5,[457,548,549],{"class":481},"  tools: names,\n",[457,551,553],{"class":459,"line":552},6,[457,554,555],{"class":481},"  customTools: tools,\n",[457,557,559,562,566,569,572,574,577,579,582,584,587,589,592,594,597],{"class":459,"line":558},7,[457,560,561],{"class":481},"  excludeTools: [",[457,563,565],{"class":564},"sP_-H","\"read\"",[457,567,568],{"class":481},", ",[457,570,571],{"class":564},"\"bash\"",[457,573,568],{"class":481},[457,575,576],{"class":564},"\"edit\"",[457,578,568],{"class":481},[457,580,581],{"class":564},"\"write\"",[457,583,568],{"class":481},[457,585,586],{"class":564},"\"grep\"",[457,588,568],{"class":481},[457,590,591],{"class":564},"\"find\"",[457,593,568],{"class":481},[457,595,596],{"class":564},"\"ls\"",[457,598,599],{"class":481},"],\n",[457,601,603],{"class":459,"line":602},8,[457,604,605],{"class":481},"  resourceLoader: lockedDownResourceLoader,\n",[457,607,609],{"class":459,"line":608},9,[457,610,611],{"class":481},"  sessionManager,\n",[457,613,615],{"class":459,"line":614},10,[457,616,617],{"class":481},"})\n",[12,619,620],{},"The allowlist comes straight from BitterClip's MCP server. If a tool isn't on\nthat list, Pi never registers it. We also turn off extension, skill,\nprompt-template, theme, and context-file discovery, then replace Pi's coding\nprompt with BitterClip's own prompt.",[12,622,623],{},"At startup, we inspect Pi's live tool registry and refuse to serve unless it\ncontains every expected BitterClip tool and zero built-ins.",[12,625,626],{},"That may sound fussy. It is cheaper than discovering later that an inactive\nshell could be switched back on.",[32,628,630],{"id":629},"pi-vs-deepseek-harness-at-a-glance","Pi vs. DeepSeek Harness at a glance",[12,632,633],{},"The two projects overlap, but they start from different centers of gravity.",[199,635,636,649],{},[202,637,638],{},[205,639,640,643,646],{},[208,641,642],{},"Question",[208,644,645],{},"Pi in BitterClip",[208,647,648],{},"DeepSeek Harness v0.1.0-rc.7",[219,650,651,662,673,684,695,706],{},[205,652,653,656,659],{},[224,654,655],{},"What do you start with?",[224,657,658],{},"A small TypeScript agent runtime with an SDK",[224,660,661],{},"A plugin-based agent platform with web and headless profiles",[205,663,664,667,670],{},[224,665,666],{},"How do you customize it?",[224,668,669],{},"Construct a session in code with a prompt, model, tools, resources, and storage",[224,671,672],{},"Assemble or replace Cordis plugins",[205,674,675,678,681],{},[224,676,677],{},"What does it provide?",[224,679,680],{},"Loop, streaming, retries, providers, compaction, and session history",[224,682,683],{},"Those foundations plus a UI, jobs, goals, workflows, subagents, policy, and more",[205,685,686,689,692],{},[224,687,688],{},"Which tools reach the model?",[224,690,691],{},"The exact custom-tool allowlist we construct and check",[224,693,694],{},"The tools registered by the chosen plugin profile; the shipped base is broad but can be recomposed",[205,696,697,700,703],{},[224,698,699],{},"How does its current ACP path fit our editor?",[224,701,702],{},"We own the adapter, including live deltas, tool traces, history loading, and BitterClip receipts",[224,704,705],{},"The upstream adapter creates fresh sessions and sends committed answers; live progress, tool activity, resume, fork, and delete are not exposed over ACP",[205,707,708,711,714],{},[224,709,710],{},"What evidence do we have today?",[224,712,713],{},"Pi 0.84.1 is pinned and serving in BitterClip; upgrades still need tool-surface, migration, and resume tests",[224,715,716,717,722],{},"v0.1.0-rc.7 is a ",[323,718,721],{"href":719,"rel":720},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fdsh-v0.1.0-rc.7\u002FREADME.md#developer-preview",[327],"developer preview"," whose maintainers warn of breaking changes",[12,724,725],{},"DeepSeek Harness is aiming at a larger problem. That is precisely what makes it\ninteresting.",[32,727,729],{"id":728},"what-we-like-about-deepseek-harness","What we like about DeepSeek Harness",[12,731,732,733,738],{},"DeepSeek Harness is built around one powerful idea:\n",[323,734,737],{"href":735,"rel":736},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fdsh-v0.1.0-rc.7\u002Fdocs\u002Farchitecture.md",[327],"everything is a plugin",".\nModels, tools, sessions, policies, jobs, and the UI all plug into Cordis. Its\nappend-only session log makes runs easier to replay and inspect, and you can\nreplace one capability without forking the core.",[12,740,741],{},"If we were building a general agent workbench, that would be hard to ignore. The\nweb UI, job panel, goals, workflows, sandbox policies, and subagent providers\nwould save real work.",[12,743,744,745,750],{},"It isn't limited to the bundled web UI. DeepSeek Harness also has public agent\nAPIs and ",[323,746,749],{"href":747,"rel":748},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fdsh-v0.1.0-rc.7\u002Fpackages\u002Fsdk\u002FREADME.md",[327],"an out-of-process TypeScript SDK","\nfor custom integrations. For agents that genuinely need shell and filesystem\naccess, its approval, policy, and sandbox seams provide controls Pi doesn't\nsupply by itself.",[12,752,753],{},"BitterClip already has a backend, an editor, jobs, permissions, and one\nestablished set of editing operations. Putting another full platform in the\nmiddle would force us to answer the same question over and over: does this state\nbelong to Rails or to the harness?",[12,755,756],{},"DeepSeek Harness can be pared down. That is one of its strengths. For\nBitterClip, though, we would need to build a custom profile, keep conversation\ndata on our side of the boundary, extend ACP, and adapt its MCP tool names and\npresentation to our existing editor. Most of that work would be spent making\nthe platform deliberately smaller.",[12,758,759,760,765],{},"The current upstream\n",[323,761,764],{"href":762,"rel":763},"https:\u002F\u002Fgithub.com\u002Fdeepseek-ai\u002Fdeepseek-harness\u002Fblob\u002Fdsh-v0.1.0-rc.7\u002Fpackages\u002Facp\u002Facp\u002FREADME.md",[327],"ACP adapter","\nis the clearest example. The harness has live internal events—its own web UI uses\nthem—but the upstream ACP adapter is built for clean automation: create a fresh\nsession, submit a prompt, wait for a committed answer, cancel if needed. Our\ninteractive editor lets people watch tools run, reopen old conversations,\ninspect what changed, and undo edits. We would have to extend the adapter before\nthe harness could replace what is serving today.",[12,767,768],{},"All of that is possible. It just wouldn't improve BitterClip enough to justify\nthe work today.",[32,770,772],{"id":771},"pi-is-not-a-security-boundary","Pi is not a security boundary",[12,774,775,776,781],{},"There is an important caveat. Pi's normal coding-agent experience includes\nfile and shell tools, and Pi\n",[323,777,780],{"href":778,"rel":779},"https:\u002F\u002Fgithub.com\u002Fearendil-works\u002Fpi\u002Fblob\u002Fv0.84.1\u002FREADME.md#permissions--containerization",[327],"doesn't provide a built-in permission system",".\nBy default it runs with the permissions of its process.",[12,783,784],{},"Our safety doesn't come from the word “minimal.” It comes from the system we\nbuilt around the runtime:",[786,787,788,791,794,797,800],"ul",{},[391,789,790],{},"the unwanted tools are absent from the live registry, not hidden by the UI;",[391,792,793],{},"the agent runs as a non-root user in a separate container, with bounded,\nprivate, non-executable temporary storage and no persistent volume;",[391,795,796],{},"every product action goes back through Rails authorization;",[391,798,799],{},"the model never chooses which account it is acting for; and",[391,801,802],{},"agent edits carry a revision and receipt, so people can see exactly what\nchanged and undo it.",[12,804,805],{},"The container is useful hardening, not a complete sandbox around Bun. This is\nalso why we don't call our setup “Pi out of the box.” We use Pi as a library\nand take responsibility for the boundary.",[32,807,809],{"id":808},"the-tradeoffs-we-accepted","The tradeoffs we accepted",[12,811,812],{},"Pi is small, but the integration work is still ours. We own the ACP adapter, the\nMCP-to-Pi tool bridge, conversation storage, and the tests around them.",[12,814,815],{},"There is another catch: Pi owns the format for conversation history. Rails\nstores those session bytes without parsing the conversation itself. That keeps\nus from quietly rebuilding Pi in Ruby, but upgrades need careful migration and\nresume testing.",[12,817,818],{},"Finally, a narrow system can fail quietly. An empty allowlist leaves you with an\nagent that chats perfectly and cannot do a thing. So startup checks both\nfailures: zero Pi built-ins and every expected BitterClip tool. That turns the\nbackground-music failure from our opening into a boot error instead of a bad\nanswer in front of a user.",[12,820,821],{},"Those are real costs. They are still smaller than owning two product backends.",[32,823,825],{"id":824},"when-we-would-choose-deepseek-harness-instead","When we would choose DeepSeek Harness instead",[12,827,828],{},"We would put DeepSeek Harness near the top of the list if the harness itself\nwere the product:",[786,830,831,834,837,840,843],{},[391,832,833],{},"a coding or research workbench with several frontends;",[391,835,836],{},"a system where users assemble agents from plugins;",[391,838,839],{},"a multi-agent environment with jobs, goals, workflows, and shared policy;",[391,841,842],{},"a platform that needs a rich, replayable event model as its primary state; or",[391,844,845],{},"a new product without an existing backend that already owns tools,\nauthorization, and durable work.",[12,847,848],{},"In that situation, DeepSeek Harness's larger surface is not overhead. It is the\nthing you would otherwise have to build.",[32,850,852],{"id":851},"the-five-questions-we-would-ask-again","The five questions we would ask again",[12,854,855],{},"If you are choosing an agent harness for an application, start with the product\nboundary rather than a feature matrix:",[388,857,858,861,864,867,870],{},[391,859,860],{},"What must the model never be able to do?",[391,862,863],{},"Which system stores the real customer data and enforces permissions?",[391,865,866],{},"Do you need an agent platform, or only an agent loop inside an existing\nproduct?",[391,868,869],{},"At runtime, can you prove exactly which tools the model can use?",[391,871,872],{},"Can you replace the harness without replacing your product?",[12,874,875],{},"For BitterClip, those answers pointed to Pi. It isn't a universal winner. It\nlet us keep the agent narrow without rebuilding the parts of BitterClip that\nalready worked.",[12,877,878],{},"If we had to make the choice again, we would start with the same question: where\nshould the harness stop and the product begin?",[279,880],{},[12,882,883],{},[24,884,885],{},"Version note: this field report describes BitterClip's pinned Pi 0.84.1\nintegration and DeepSeek Harness v0.1.0-rc.7, reviewed on August 18, 2026.\nDeepSeek Harness is in developer preview and changing quickly. We will revisit\nthe comparison as its embedded interfaces mature.",[887,888,889],"style",{},"html pre.shiki code .scLw-, html code.shiki .scLw-{--shiki-default:#F47067}html pre.shiki code .sDGpf, html code.shiki .sDGpf{--shiki-default:#6CB6FF}html pre.shiki code .sLyBy, html code.shiki .sLyBy{--shiki-default:#DCBDFB}html pre.shiki code .s1ain, html code.shiki .s1ain{--shiki-default:#ADBAC7}html pre.shiki code .s7B5-, html code.shiki .s7B5-{--shiki-default:#F69D50}html pre.shiki code .sP_-H, html code.shiki .sP_-H{--shiki-default:#96D0FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":91,"searchDepth":92,"depth":92,"links":891},[892,893,894,895,896,897,898,899,900],{"id":338,"depth":95,"text":339},{"id":365,"depth":95,"text":366},{"id":411,"depth":95,"text":412},{"id":629,"depth":95,"text":630},{"id":728,"depth":95,"text":729},{"id":771,"depth":95,"text":772},{"id":808,"depth":95,"text":809},{"id":824,"depth":95,"text":825},{"id":851,"depth":95,"text":852},"The Creator trial lasts seven days and requires a card: $0 today, then $24\u002Fmonth unless you cancel before it ends. It includes $5 of agent work for one recording up to two hours. Upload a recording and ask for a moment, a Clip, or a Render—then inspect exactly what changed before you export.","Put the agent to work on a real recording","2026-08-18","A concrete look at why BitterClip uses the Pi agent harness for its embedded AI agent, how it works, and when DeepSeek Harness would fit better.","BitterClip's embedded-agent architecture, with the editor speaking ACP to Pi and Pi limited to BitterClip MCP tools, beside DeepSeek Harness as a larger plugin platform.","\u002Fimages\u002Fblog\u002Fpi-vs-deepseek-harness\u002Fpi-vs-deepseek-harness.svg",{},"\u002Fimages\u002Fblog\u002Fpi-vs-deepseek-harness\u002Fpi-vs-deepseek-harness-og.png","\u002Fblog\u002Fpi-vs-deepseek-harness",{"title":307,"description":904},"blog\u002Fpi-vs-deepseek-harness",[913,334,914,426,302],"Pi","agent harnesses","82Oi1XctzVOIYxjeRGXpLnbEQneZ-nSHDoO5NqMiPWU",{"id":917,"title":918,"author":7,"body":919,"ctaLine":98,"ctaTitle":98,"date":99,"description":1164,"extension":101,"heroAlt":1165,"heroImage":1166,"meta":1167,"navigation":104,"ogImage":1168,"path":1169,"seo":1170,"stem":1171,"tags":1172,"updated":98,"__hash__":1176},"blog\u002Fblog\u002Fwe-stopped-making-templates.md","We stopped making templates",{"type":9,"value":920,"toc":1158},[921,924,927,931,938,1094,1097,1101,1104,1115,1118,1122,1128,1131,1134,1138,1141,1144,1147,1150,1155],[12,922,923],{},"Open any clip tool and you'll find the same thing: a wall of templates.\nHundreds of them. Someone designed each one eighteen months ago, and it shows\n— they're frozen at whatever taste, trends, and tools existed the day they\nshipped. Your job is to scroll until one feels close enough, and then live\nwith \"close enough\" forever.",[12,925,926],{},"We shipped Identity Studio without a template wall, and it wasn't an\noversight. It was the whole point.",[32,928,930],{"id":929},"an-effect-is-a-program","An effect is a program",[12,932,933,934,937],{},"In BitterClip, an opener isn't a video file with your logo composited on\ntop. It's a ",[19,935,936],{},"scene"," — a compact program with a stage, elements, and\nmotion, keyed to time and sound. This is what a minimal one looks like:",[148,939,943],{"className":940,"code":941,"language":942,"meta":91,"style":91},"language-js shiki shiki-themes github-dark-dimmed","export const scene = {\n  id: 'my-scene',\n  mount(ctx) {\n    const root = document.createElement('div')\n    root.className = 'scene my-scene'\n    root.innerHTML = '\u003Cstyle>.my-scene{background:#000}\u003C\u002Fstyle>\u003Cb>YOUR MARK\u003C\u002Fb>'\n    ctx.layer.append(root)\n    return { root }\n  },\n  frame(ctx) {\n    \u002F\u002F motion, keyed to ctx.sync.progress and the soundtrack's amplitude\n    ctx.refs.root.style.opacity = ctx.sync.progress\n  },\n}\n","js",[155,944,945,961,972,986,1010,1020,1030,1041,1049,1054,1065,1072,1083,1088],{"__ignoreMap":91},[457,946,947,950,953,956,958],{"class":459,"line":460},[457,948,949],{"class":463},"export",[457,951,952],{"class":463}," const",[457,954,955],{"class":467}," scene",[457,957,471],{"class":463},[457,959,960],{"class":481}," {\n",[457,962,963,966,969],{"class":459,"line":95},[457,964,965],{"class":481},"  id: ",[457,967,968],{"class":564},"'my-scene'",[457,970,971],{"class":481},",\n",[457,973,974,977,980,983],{"class":459,"line":92},[457,975,976],{"class":477},"  mount",[457,978,979],{"class":481},"(",[457,981,982],{"class":503},"ctx",[457,984,985],{"class":481},") {\n",[457,987,988,991,994,996,999,1002,1004,1007],{"class":459,"line":521},[457,989,990],{"class":463},"    const",[457,992,993],{"class":467}," root",[457,995,471],{"class":463},[457,997,998],{"class":481}," document.",[457,1000,1001],{"class":477},"createElement",[457,1003,979],{"class":481},[457,1005,1006],{"class":564},"'div'",[457,1008,1009],{"class":481},")\n",[457,1011,1012,1015,1017],{"class":459,"line":546},[457,1013,1014],{"class":481},"    root.className ",[457,1016,535],{"class":463},[457,1018,1019],{"class":564}," 'scene my-scene'\n",[457,1021,1022,1025,1027],{"class":459,"line":552},[457,1023,1024],{"class":481},"    root.innerHTML ",[457,1026,535],{"class":463},[457,1028,1029],{"class":564}," '\u003Cstyle>.my-scene{background:#000}\u003C\u002Fstyle>\u003Cb>YOUR MARK\u003C\u002Fb>'\n",[457,1031,1032,1035,1038],{"class":459,"line":558},[457,1033,1034],{"class":481},"    ctx.layer.",[457,1036,1037],{"class":477},"append",[457,1039,1040],{"class":481},"(root)\n",[457,1042,1043,1046],{"class":459,"line":602},[457,1044,1045],{"class":463},"    return",[457,1047,1048],{"class":481}," { root }\n",[457,1050,1051],{"class":459,"line":608},[457,1052,1053],{"class":481},"  },\n",[457,1055,1056,1059,1061,1063],{"class":459,"line":614},[457,1057,1058],{"class":477},"  frame",[457,1060,979],{"class":481},[457,1062,982],{"class":503},[457,1064,985],{"class":481},[457,1066,1068],{"class":459,"line":1067},11,[457,1069,1071],{"class":1070},"sVrTk","    \u002F\u002F motion, keyed to ctx.sync.progress and the soundtrack's amplitude\n",[457,1073,1075,1078,1080],{"class":459,"line":1074},12,[457,1076,1077],{"class":481},"    ctx.refs.root.style.opacity ",[457,1079,535],{"class":463},[457,1081,1082],{"class":481}," ctx.sync.progress\n",[457,1084,1086],{"class":459,"line":1085},13,[457,1087,1053],{"class":481},[457,1089,1091],{"class":459,"line":1090},14,[457,1092,1093],{"class":481},"}\n",[12,1095,1096],{},"The real ones are richer — the Signal Lock effect that glitches your\nwordmark into focus is a few hundred lines — but the shape is the same:\nplain code, drawing on a stage, in time with sound. When your render bakes,\nthe scene bakes with it, into the actual MP4.",[32,1098,1100],{"id":1099},"why-code-instead-of-templates","Why code instead of templates",[12,1102,1103],{},"Because code is the one format that gets better on its own.",[12,1105,1106,1107,1110,1111,1114],{},"A template is a frozen decision. Code is a ",[24,1108,1109],{},"language"," — and the striking\nthing about the last few years is that models have gotten very, very good at\nlanguages. When motion design is code, your AI assistant can do what a\nmotion designer does: write a draft, ",[19,1112,1113],{},"look at rendered frames of its own\nwork",", notice the wordmark is drifting or the beat lands late, revise, and\nlook again. That loop — write, preview, critique, revise — runs right inside\nyour ChatGPT or Claude conversation, against your brand pack, until the\nopener feels intentional.",[12,1116,1117],{},"We watched an assistant that had never seen these tools take a logo and a\none-line brief and produce a working signature opener, end to end, in one\nconversation. Not by picking template #47 — by writing the scene.",[32,1119,1121],{"id":1120},"the-bet-underneath","The bet underneath",[12,1123,1124,1125],{},"Here's the honest version of the bet: ",[19,1126,1127],{},"models improve every quarter;\ntemplate libraries don't.",[12,1129,1130],{},"If we shipped five hundred templates today, they'd be stale by spring, and\nthe only fix would be us designing five hundred more. Instead we shipped a\nsmall set of signature effects we're proud of — and a contract that lets any\nsufficiently good model author new ones. Every time the models get better at\ncode, at visual judgment, at taste, your ceiling rises. You didn't upgrade\nanything. Your subscription didn't change. The tool underneath your\nassistant just became a better designer.",[12,1132,1133],{},"That's the principle we build on across BitterClip: prefer general\nmechanisms that ride the improvement curve over special-cased features that\nfreeze it. Effects-as-code is the most visible example — the same idea runs\nthrough how assistants read transcripts, pick moments, and cut episodes.",[32,1135,1137],{"id":1136},"what-stays-yours","What stays yours",[12,1139,1140],{},"Here's the part I should be honest about, because I lived it: the fiddling\ndoesn't go away. It moves up a level.",[12,1142,1143],{},"The signature effects that ship with BitterClip — Signal Lock included —\nwere made in exactly this loop, and it took a long, iterative process to\nget them right. But I never wrote a line of the code. I worked the way a\nproducer works: watch the take, react in plain language — \"I want the\nletters to feel like they're being smeared horizontally, but not\nvertically,\" \"the flash is too eager,\" \"let it settle a beat later\" — and\nlet the model translate taste into code. Less operating a timeline, more being Rick\nRubin on the couch: you don't play the instruments; you know when it's\nright.",[12,1145,1146],{},"That's the job that's left, and it's the good part. You bring the brand,\nthe references, the \"again, but calmer,\" and the final yes. The assistant\nbrings the hands. And because every scene is inspectable code bound to your\naccount, you can always open the lab, see exactly what it made, and change\nyour mind tomorrow.",[12,1148,1149],{},"The template wall asked you to settle. This asks you to produce.",[12,1151,1152],{},[24,1153,1154],{},"Your show, your taste, better hands every quarter.",[887,1156,1157],{},"html pre.shiki code .scLw-, html code.shiki .scLw-{--shiki-default:#F47067}html pre.shiki code .sDGpf, html code.shiki .sDGpf{--shiki-default:#6CB6FF}html pre.shiki code .s1ain, html code.shiki .s1ain{--shiki-default:#ADBAC7}html pre.shiki code .sP_-H, html code.shiki .sP_-H{--shiki-default:#96D0FF}html pre.shiki code .sLyBy, html code.shiki .sLyBy{--shiki-default:#DCBDFB}html pre.shiki code .s7B5-, html code.shiki .s7B5-{--shiki-default:#F69D50}html pre.shiki code .sVrTk, html code.shiki .sVrTk{--shiki-default:#768390}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":91,"searchDepth":92,"depth":92,"links":1159},[1160,1161,1162,1163],{"id":929,"depth":95,"text":930},{"id":1099,"depth":95,"text":1100},{"id":1120,"depth":95,"text":1121},{"id":1136,"depth":95,"text":1137},"Every effect in BitterClip is real code — which means your AI assistant can write one, look at rendered frames of its own work, and make it better. Why we built motion design that way.","The Signal Lock scene as code — a dark editor panel where the frame function carries the direction note 'smeared horizontally — but not vertically'.","\u002Fimages\u002Fblog\u002Feffects-are-code\u002Fscene-code.jpg",{},"\u002Fimages\u002Fblog\u002Feffects-are-code\u002Fscene-code-og.jpg","\u002Fblog\u002Fwe-stopped-making-templates",{"title":918,"description":1164},"blog\u002Fwe-stopped-making-templates",[1173,1174,1175],"Identity Studio","effects","AI assistants","yfYdWq2woxsH4UROz8h8uLAOYGYaUt-qnQq3xGHMThw",{"id":1178,"title":1179,"author":7,"body":1180,"ctaLine":98,"ctaTitle":98,"date":99,"description":1329,"extension":101,"heroAlt":1330,"heroImage":1331,"meta":1332,"navigation":104,"ogImage":1333,"path":1334,"seo":1335,"stem":1336,"tags":1337,"updated":98,"__hash__":1340},"blog\u002Fblog\u002Fyour-show-has-a-signature-now.md","Your show has a signature now",{"type":9,"value":1181,"toc":1323},[1182,1185,1192,1195,1199,1209,1215,1221,1227,1231,1234,1240,1246,1249,1252,1261,1265,1268,1280,1286,1289,1304,1307,1311,1318],[12,1183,1184],{},"Clips made by tools look like they came from a tool. You've seen it: the\nsame caption style, the same hard cut into the same watermark, ten near-identical\nshorts a day. The clip might be good. It still doesn't feel like it belongs to\nanyone.",[12,1186,1187,1188,1191],{},"A show you take seriously opens a certain way. The wordmark lands. The\nepisode title reads. The sound resolves. ",[24,1189,1190],{},"Then"," the moment plays. That beat —\ntwo seconds, maybe three — is the difference between \"a clip\" and \"an episode\nof something.\"",[12,1193,1194],{},"Today that beat is part of BitterClip.",[32,1196,1198],{"id":1197},"what-shipped","What shipped",[12,1200,1201,1204,1205,1208],{},[19,1202,1203],{},"Every project now has an FX tab."," Pick a signature effect — Signal Lock,\nHarmonic Resolve, and a growing set — bind it to your brand, and every render\nfrom that project opens and closes as ",[24,1206,1207],{},"yours",". Brand packs are strict dark or\nlight: your logo, wordmark, palette, fonts, and tagline on a pure stage, no\nmud in between. Opener titles are per-episode, so \"Episode 14: The Deadlift\nSession\" is baked into the video itself, not slapped on as a thumbnail.",[12,1210,1211],{},[163,1212],{"alt":1213,"src":1214},"Project FX tab showing the signature shelf with saved opener and outro effects.","\u002Fimages\u002Fblog\u002Fidentity-studio\u002Ffx-tab.jpg",[12,1216,1217,1220],{},[19,1218,1219],{},"Signature Studio is the full-screen lab."," Audition motion and sound\ntogether, tune the beat until it lands, and save the result to your identity\nlibrary. The library lives at your account level — build the look once, set\nit as the default for a project, and every future render carries it.",[12,1222,1223,1226],{},[19,1224,1225],{},"And it survives all the way to the file."," This isn't a preview skin. The\nopener, the outro, the title, the captions — they're rendered into the MP4\nyou download or publish, through the same pipeline that cuts the clip\nitself.",[32,1228,1230],{"id":1229},"the-part-were-most-excited-about-your-assistant-can-design-it","The part we're most excited about: your assistant can design it",[12,1232,1233],{},"Here's the thing we built underneath, and it's the reason this release exists.",[12,1235,1236,1237],{},"Motion design in BitterClip isn't a template picker. Every effect is a small\npiece of real code — a scene with a stage, elements, and motion keyed to time\nand sound. Which means something interesting: ",[19,1238,1239],{},"a model can write one.",[12,1241,1242,1245],{},[323,1243,1244],{"href":379},"Connect ChatGPT or Claude",", hand it your logo,\nand describe the vibe —\n\"minimal, confident, dark, one pulse of color when the wordmark locks in.\"\nYour assistant ingests the asset, writes your brand pack, and then writes the\nscene itself. It previews actual frames of its own work, looks at them,\nrevises the code, and previews again — the same loop a motion designer runs,\ncompressed into your conversation. When it feels right, it saves the result\nas your project's opener.",[12,1247,1248],{},"We watched an AI assistant that had never seen these tools before take a\nlogo and a one-line brief and produce a working signature opener —\nfull-frame stage, wordmark resolving on the beat, motion locked to the\nsoundtrack — end to end, in one conversation.",[12,1250,1251],{},"Why build it this way instead of shipping a hundred templates? Because\ntemplates are frozen at whatever taste we had the day we made them, and\nmodels get better every quarter. Effects-as-code means the ceiling on your\nopener is the ceiling on your assistant — and that ceiling keeps moving up.\nYou bring the taste and the yes\u002Fno. The assistant brings the hands.",[12,1253,1254],{},[24,1255,1256,1257,1260],{},"Want to see it on your own show? ",[323,1258,1259],{"href":379},"Connect your assistant","\nand ask for an opener.",[32,1262,1264],{"id":1263},"built-with-our-design-partners","Built with our design partners",[12,1266,1267],{},"This release didn't come from a roadmap. It came from early customers who\nkept telling us what a finished show actually needs.",[12,1269,1270,1273,1274,1279],{},[19,1271,1272],{},"Frontier Studio"," pushed us hardest here — Rohan, who hosts the\n",[323,1275,1278],{"href":1276,"rel":1277},"https:\u002F\u002Fwww.youtube.com\u002F@rohan_karunakaran",[327],"Founder-Led Podcast",", is the\nreason we leaned into signatures at all. When we offered to start\nexperimenting with his show's raw footage, he texted back:",[1281,1282,1283],"blockquote",{},[12,1284,1285],{},"Read my mind. MVP for a podcast: 30-sec sizzle intro hook, tightly\nedited, light audio\u002Fcolor grading on full episode. As close to\none-shotted thumbnail & title, description template based on library\ntemplate. Click to publish.",[12,1287,1288],{},"That text is the bar this release is built against: the hook, then the\nsignature, then the episode — the whole broadcast package, produced for\nevery episode, with taste applied once and carried automatically. \"Does\nthis feel like a real show?\" was the question every effect had to survive.",[12,1290,1291,1294,1295,1300,1301,1303],{},[19,1292,1293],{},"Andrew"," of ",[323,1296,1299],{"href":1297,"rel":1298},"https:\u002F\u002Fwww.strengthandpositions.com\u002F",[327],"Strength & Positions","\ncoaches in person and films every session. The highlight reels\nhe sends his clients aren't marketing — they're part of the coaching: a\ncondensed memory of the session's best work, something a client holds onto\nbetween visits. Reel after reel, they become a running record of progress,\nand that continuity ",[24,1302,26],{}," the relationship. What Andrew asked of us is that\neach reel feel like part of that ongoing story — same look, same care, an\nepisode of something the client is in — rather than a loose file in a text\nthread.",[12,1305,1306],{},"If you're producing a show or building a client business on recorded\nsessions and want to push on BitterClip with us, we'd love to hear from you.",[32,1308,1310],{"id":1309},"getting-the-finished-thing-out","Getting the finished thing out",[12,1312,1313,1314,1317],{},"One more piece, because a signature clip that's stuck inside a tool isn't\nfinished: you can now mint a ",[19,1315,1316],{},"public download link"," for any rendered\noutput. It's a direct MP4 URL that expires (7 days by default, up to 14) —\nhand it to a client, drop it into a Zapier flow, feed it to a captioning or\nscheduling tool. No integration required on their side; if it can fetch a\nURL, it can take your clip. Ask your assistant for \"a public link to that\nrender\" and it's done.",[12,1319,1320],{},[24,1321,1322],{},"Know what mattered in the recording — then make it look like yours.",{"title":91,"searchDepth":92,"depth":92,"links":1324},[1325,1326,1327,1328],{"id":1197,"depth":95,"text":1198},{"id":1229,"depth":95,"text":1230},{"id":1263,"depth":95,"text":1264},{"id":1309,"depth":95,"text":1310},"Introducing Identity Studio: branded openers, outros, and a signature look for every project — designed by you in a full-screen studio, or by your AI assistant, live, in the conversation.","Signature Studio full-screen lab showing a BitterClip wordmark opener mid-animation on a dark stage.","\u002Fimages\u002Fblog\u002Fidentity-studio\u002Fsignature-studio-hero.jpg",{},"\u002Fimages\u002Fblog\u002Fidentity-studio\u002Fyour-show-has-a-signature-now-og.jpg","\u002Fblog\u002Fyour-show-has-a-signature-now",{"title":1179,"description":1329},"blog\u002Fyour-show-has-a-signature-now",[1173,1338,1339],"product launch","video branding","R41POMcmRu2SQqP91iEXTCFh5nHczB8ea3-YWyIfQPQ",{"id":1342,"app_brand_name":372,"app_origin":1343,"brand_name":1344,"company_support_url":1345,"company_url":1346,"extension":1347,"intended_site_origin":1348,"mcp_resource_url":1349,"meta":1350,"og_image_default":1351,"pricing_url":1352,"signup_url":1353,"site_origin":1354,"stem":1355,"support_email":1356,"__hash__":1357},"site\u002F_data\u002Fsite.yml","https:\u002F\u002Fapp.bitterclip.com","Showbrew","https:\u002F\u002Fcompany.sheetgenius.com\u002Fbitterclip\u002Fsupport\u002F","https:\u002F\u002Fcompany.sheetgenius.com\u002F","yml","https:\u002F\u002Fshowbrew.com","https:\u002F\u002Fapp.bitterclip.com\u002Fmcp",{},"\u002Fimages\u002Fshowbrew-og.png","https:\u002F\u002Fbitterclip.com\u002F#pricing","https:\u002F\u002Fapp.bitterclip.com\u002Fsign_up?plan=clip","https:\u002F\u002Fbitterclip.com","_data\u002Fsite","hello@bitterclip.com","lp_DIYW8yRANwIgWUc2X8g6xSdNBj_obL52xQi7qnu0",1788747558710]