[{"data":1,"prerenderedAt":421},["ShallowReactive",2],{"search-projects":3,"search-posts":65},[4,15,28,38,47,55],{"path":5,"title":6,"description":7,"tech":8,"tags":11,"image":13,"imageFit":14,"coverLabel":14},"\u002Fprojects\u002Fcamera-video-converter","Camera Video Converter","Free, offline Android app that turns hard-to-share camera footage into standard 1080p MP4s, right on the phone.",[9,10],"kotlin","android",[12],"offline-first","\u002Fimg\u002Fproducts\u002Fcamera-video-converter.webp",null,{"path":16,"title":17,"description":18,"tech":19,"tags":23,"image":25,"imageFit":26,"coverLabel":27},"\u002Fprojects\u002Fopen-claude-agent-sdk","open-claude-agent-sdk","Drop-in, open-source replacement for @anthropic-ai\u002Fclaude-agent-sdk. Readable TypeScript that runs on the Claude CLI you already have installed.",[20,21,22],"typescript","bun","mcp",[24],"ai","\u002Fimg\u002Fproducts\u002Fopen-claude-agent-sdk-home.webp","contain","",{"path":29,"title":30,"description":31,"tech":32,"tags":35,"image":37,"imageFit":14,"coverLabel":14},"\u002Fprojects\u002Fyoutube-shorts-blocker","YouTube Shorts Blocker","A lightweight Chrome extension that hides YouTube Shorts everywhere and can redirect Shorts links.",[33,34],"javascript","chrome-extension",[36,12],"privacy","\u002Fimg\u002Fproducts\u002Fyoutube-shorts-blocker.webp",{"path":39,"title":40,"description":41,"tech":42,"tags":45,"image":46,"imageFit":14,"coverLabel":14},"\u002Fprojects\u002Fsub2utf","sub2utf","Converts subtitle files (.srt) from legacy encodings to UTF-8 so Plex shows č, ć, š, đ and ž correctly.",[43,44],"svelte","tauri",[],"\u002Fimg\u002Fproducts\u002Fsub2utf.webp",{"path":48,"title":49,"description":50,"tech":51,"tags":54,"image":14,"imageFit":14,"coverLabel":14},"\u002Fprojects\u002Fdocument-iteration-skill","document-iteration-skill","A lightweight markdown syntax for editing documents with Claude: leave feedback inline instead of asking it to regenerate the whole document.",[52,53],"markdown","claude",[24],{"path":56,"title":57,"description":58,"tech":59,"tags":62,"image":64,"imageFit":14,"coverLabel":14},"\u002Fprojects\u002Flitrpgvault","LitRPG Vault","A database of LitRPG and Progression Fantasy books: 250+ series with ratings, reading orders and audiobook links.",[60,61],"vue","nuxt",[63],"static","\u002Fimg\u002Fproducts\u002Flitrpgvault.webp",[66,358],{"path":67,"title":68,"description":69,"date":70,"tags":71,"body":73},"\u002Fblog\u002Fopen-claude-agent-sdk-0-50-0","open-claude-agent-sdk 0.50.0 fixes broken clean installs","Since v0.25.0 the package failed to import unless the official SDK was also installed. 0.50.0 fixes that and catches up with official SDK 0.3.276.","2026-09-22",[20,24,22,72],"open source",{"type":74,"value":75,"toc":350},"minimark",[76,87,126,133,138,157,164,185,189,236,240,246,262,265,269,272,275,278,282,317,321,335,338,346],[77,78,79,86],"p",{},[80,81,85],"a",{"href":82,"rel":83},"https:\u002F\u002Fgithub.com\u002Ffoksa\u002Fopen-claude-agent-sdk\u002Freleases\u002Ftag\u002Fv0.50.0",[84],"nofollow","open-claude-agent-sdk v0.50.0"," came out on September 19. The headline is a bug fix: from v0.25.0 on, importing the package on a clean install failed with this error:",[88,89,93],"pre",{"className":90,"code":91,"language":92,"meta":27,"style":27},"language-ts shiki shiki-themes github-light github-dark","import { query } from 'open-claude-agent-sdk';\n\u002F\u002F Error: Cannot find package '@anthropic-ai\u002Fclaude-agent-sdk'\n","ts",[94,95,96,119],"code",{"__ignoreMap":27},[97,98,101,105,109,112,116],"span",{"class":99,"line":100},"line",1,[97,102,104],{"class":103},"szBVR","import",[97,106,108],{"class":107},"sVt8B"," { query } ",[97,110,111],{"class":103},"from",[97,113,115],{"class":114},"sZZnC"," 'open-claude-agent-sdk'",[97,117,118],{"class":107},";\n",[97,120,122],{"class":99,"line":121},2,[97,123,125],{"class":124},"sJ8bj","\u002F\u002F Error: Cannot find package '@anthropic-ai\u002Fclaude-agent-sdk'\n",[77,127,128,129,132],{},"If you only installed this package, without the official SDK next to it, you were affected. The release also brings the API in line with the official ",[94,130,131],{},"@anthropic-ai\u002Fclaude-agent-sdk"," 0.3.276 and fixes several bugs found in a full review of the code.",[134,135,137],"h2",{"id":136},"how-to-upgrade","How to upgrade",[88,139,143],{"className":140,"code":141,"language":142,"meta":27,"style":27},"language-bash shiki shiki-themes github-light github-dark","npm install open-claude-agent-sdk@0.50.0\n","bash",[94,144,145],{"__ignoreMap":27},[97,146,147,151,154],{"class":99,"line":100},[97,148,150],{"class":149},"sScJk","npm",[97,152,153],{"class":114}," install",[97,155,156],{"class":114}," open-claude-agent-sdk@0.50.0\n",[77,158,159,160,163],{},"If you use TypeScript, also add the official SDK as a dev dependency. This package reuses its types but never loads it at runtime, and ",[94,161,162],{},"--omit=optional"," skips its bundled CLI binary:",[88,165,167],{"className":140,"code":166,"language":142,"meta":27,"style":27},"npm install -D @anthropic-ai\u002Fclaude-agent-sdk --omit=optional\n",[94,168,169],{"__ignoreMap":27},[97,170,171,173,175,179,182],{"class":99,"line":100},[97,172,150],{"class":149},[97,174,153],{"class":114},[97,176,178],{"class":177},"sj4cs"," -D",[97,180,181],{"class":114}," @anthropic-ai\u002Fclaude-agent-sdk",[97,183,184],{"class":177}," --omit=optional\n",[134,186,188],{"id":187},"breaking-changes","Breaking changes",[190,191,192,211],"ul",{},[193,194,195,202,203,206,207,210],"li",{},[196,197,198,201],"strong",{},[94,199,200],{},"abort()"," now stops for real."," It rejects the iteration with ",[94,204,205],{},"AbortError"," and kills the CLI, the same as the official SDK. Before, it only sent an interrupt, and you still got a final result. If you want a graceful stop, use ",[94,208,209],{},"q.interrupt()",".",[193,212,213,216,217,220,221,220,224,227,228,231,232,235],{},[196,214,215],{},"Some unsupported helpers are removed:"," ",[94,218,219],{},"startup",", ",[94,222,223],{},"resolveSettings",[94,225,226],{},"filterEscalatingDefaultMode"," and the ",[94,229,230],{},"sessionStore"," helpers. ",[94,233,234],{},"query()"," never supported them.",[134,237,239],{"id":238},"what-was-wrong","What was wrong",[77,241,242,243,245],{},"The package's entry point re-exported a few runtime values, such as ",[94,244,205],{}," and some constants, straight from the official SDK. The official SDK was only a dev dependency, so it wasn't there on a clean install, and the import failed.",[77,247,248,249,220,252,220,255,258,259,261],{},"Those values are now defined in this package. The session helpers (",[94,250,251],{},"listSessions",[94,253,254],{},"getSessionInfo",[94,256,257],{},"forkSession"," and others) are also its own code now instead of re-exports. That fixed two more bugs: ",[94,260,251],{}," returned nothing under Node, and sessions in long project paths were never found. The official SDK is now an optional peer dependency, used for types only.",[77,263,264],{},"To keep this from happening again, CI now packs the package, installs it in an empty project without the official SDK, and imports every entry point under Node.",[134,266,268],{"id":267},"how-it-slipped-through","How it slipped through",[77,270,271],{},"Honestly, I stopped paying close attention. At one point Anthropic decided the Claude Agent SDK could only be used through the API, and after that I lost a lot of my motivation to work on this project.",[77,273,274],{},"It kept going anyway. I have a Claude Code skill that updates the SDK to match each new official release, and for the most part it did the job well. But there was a stretch, around the later Opus 4.6 days and into Opus 4.7, when the models felt noticeably worse to me. They cut corners everywhere. The bug arrived in v0.25.0 on April 24, about a week after Opus 4.7 came out, so my guess is it came from that period: a re-export that looked fine, passed the tests on my machine (where the official SDK was always installed), and nobody double-checked.",[77,276,277],{},"What finally caught it was a full review of the code against the official SDK. That's also why this release has more fixes than usual.",[134,279,281],{"id":280},"other-fixes","Other fixes",[190,283,284,298,307],{},[193,285,286,289,290,293,294,297],{},[196,287,288],{},"Permissions:"," without a ",[94,291,292],{},"canUseTool"," callback, permission requests were quietly ",[196,295,296],{},"allowed",". They now fail, as they do in the official SDK.",[193,299,300,303,304,306],{},[196,301,302],{},"Hangs:"," a ",[94,305,292],{}," or hook callback that called a query method waited forever. It doesn't anymore.",[193,308,309,312,313,316],{},[196,310,311],{},"MCP:"," servers added mid-session with ",[94,314,315],{},"setMcpServers()"," were never registered. Now they are.",[134,318,320],{"id":319},"catching-up-with-the-official-sdk","Catching up with the official SDK",[77,322,323,324,327,328,330,331,334],{},"This release matches official SDK 0.3.276. It adds the ",[94,325,326],{},"projectConfigRoot"," option, passes more detail to ",[94,329,292],{}," callbacks (which MCP server a tool came from, its title and the matching ask rule), and improves how ",[94,332,333],{},"getSessionMessages"," handles messages queued during a tool call and parallel tool calls.",[77,336,337],{},"Each behavior change comes with a test that runs against both this package and the official SDK and compares the results.",[77,339,340,341,210],{},"The full list of changes is in the ",[80,342,345],{"href":343,"rel":344},"https:\u002F\u002Fgithub.com\u002Ffoksa\u002Fopen-claude-agent-sdk\u002Fcompare\u002Fv0.49.0...v0.50.0",[84],"v0.49.0...v0.50.0 comparison",[347,348,349],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}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);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}",{"title":27,"searchDepth":121,"depth":121,"links":351},[352,353,354,355,356,357],{"id":136,"depth":121,"text":137},{"id":187,"depth":121,"text":188},{"id":238,"depth":121,"text":239},{"id":267,"depth":121,"text":268},{"id":280,"depth":121,"text":281},{"id":319,"depth":121,"text":320},{"path":359,"title":360,"description":361,"date":362,"tags":363,"body":364},"\u002Fblog\u002Fcamera-video-converter-is-on-play-store","Camera Video Converter is on the Play Store","My free, offline Android app for making camera footage shareable is now on Google Play.","2026-09-02",[10,9,12],{"type":74,"value":365,"toc":418},[366,374,378,381,412],[77,367,368,369,373],{},"Man, that took a while, but finally: ",[80,370,6],{"href":371,"rel":372},"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=dev.foksa.cameravideoconverter",[84]," is live on the Google Play Store.",[134,375,377],{"id":376},"what-it-is","What it is",[77,379,380],{},"Footage from mirrorless cameras often won't play or share properly on a phone. Camera Video Converter turns those clips into ordinary MP4 files, up to 1080p, right on the device. It was built around Sony A6700 footage, but it accepts any unencrypted SDR H.264 or H.265 MP4 or MOV file.",[190,382,383,389,395,401],{},[193,384,385,388],{},[196,386,387],{},"Fully offline",": no internet permission, no ads, no analytics, no accounts. Your videos never leave the phone.",[193,390,391,394],{},[196,392,393],{},"Works from the share menu",": send a video to the app, convert it, and pass it on.",[193,396,397,400],{},[196,398,399],{},"Doesn't mess up colors",": HDR, Dolby Vision and Log footage are rejected rather than converted with the wrong colors.",[193,402,403,406,407,210],{},[196,404,405],{},"Free and open source",": the code is on ",[80,408,411],{"href":409,"rel":410},"https:\u002F\u002Fgithub.com\u002Ffoksa\u002Fcamera-video-converter",[84],"GitHub",[77,413,414,415,210],{},"More details and screenshots are on the ",[80,416,417],{"href":5},"project page",{"title":27,"searchDepth":121,"depth":121,"links":419},[420],{"id":376,"depth":121,"text":377},1790076223264]