[{"data":1,"prerenderedAt":257},["ShallowReactive",2],{"\u002Fblog\u002Fsub-store-cloudflare\u002F:en":3,"\u002Fblog\u002Fsub-store-cloudflare\u002F-surround:en":152,"blog-all-posts:en":153},{"id":4,"title":5,"author":6,"body":10,"date":135,"description":136,"extension":137,"image":138,"locale":139,"meta":140,"minRead":141,"navigation":142,"original":142,"path":143,"pinned":144,"seo":145,"source":138,"sourceUrl":138,"stem":146,"tags":147,"updated":138,"__hash__":151},"blog\u002Fblog\u002Fsub-store-cloudflare.en.md","I moved my proxy subscription aggregation to Cloudflare",{"name":7,"avatar":8},"Chen Dahuang",{"src":9,"alt":7},"\u002Favatar.jpg",{"type":11,"value":12,"toc":127},"minimark",[13,17,28,33,36,39,52,55,58,62,65,86,89,93,96,99,107,114,118,121,124],[14,15,16],"p",{},"I've used proxy services for three or four years now, and at times I've run my own VPS nodes. There's always been one annoying thing: three or five subscriptions plus a few self-hosted boxes scattered in the client, added one by one, with routing rules having to be reconfigured in every single client. New device, new client, or setting someone in the family up — and you go through the whole ritual again.",[14,18,19,20,27],{},"Then I thought: there's no reason to manage subscriptions separately inside clients. Pull them all into one link, define the rules server-side, and let the client simply subscribe — clean. I'd used Sub-Store's approach before, but it ran on your own server and I found maintenance a hassle. So this time I wrote a Cloudflare-hosted version myself, called sub-store-cloudflare, open-sourced on ",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Fgithub.com\u002Frealchendahuang\u002Fsub-store-cloudflare",[25],"nofollow","GitHub",".",[29,30,32],"h2",{"id":31},"it-really-just-does-one-thing","It really just does one thing",[14,34,35],{},"Merges multiple subscription sources into one subscription.",[14,37,38],{},"Concretely, you can throw a few things into it:",[40,41,42,46,49],"ul",{},[43,44,45],"li",{},"Subscription links from several proxy services",[43,47,48],{},"Node text from your own VPS (vless, trojan, ss, vmess — all fine)",[43,50,51],{},"Even paste in a temporary chunk of nodes",[14,53,54],{},"Once inside, the Worker fetches and de-duplicates them, filters according to the rules you give it, then renames, adds flags, and resolves domains as needed. Everything comes out merged into one combined subscription — clients subscribe to that single link and done.",[14,56,57],{},"Rules live on the server side. It ships with a few common Mihomo templates — acl4ssr, Loyalsoldier's whitelist\u002Fblacklist, ai-streaming and the like — with routing groups and rule sets all configured in the cloud. Feed the subscription into clients like mihomo\u002Fclash, surge, sing-box, shadowrocket, and what downloads is a finished subscription with routing rules already built in — no manual rule-writing or rule-set URL maintenance on that end.",[29,59,61],{"id":60},"why-cloudflare-specifically","Why Cloudflare specifically",[14,63,64],{},"Pragmatic reasons:",[40,66,67,74,80],{},[43,68,69,73],{},[70,71,72],"strong",{},"No server."," Workers + D1, and the free quota is enough for personal use — saves both server money and upkeep.",[43,75,76,79],{},[70,77,78],{},"The workers.dev domain is itself outside the wall."," Your client connecting to fetch the subscription works out of the box — no \"server is abroad but the node still needs a ladder to pull its own subscription\" nesting-doll nonsense.",[43,81,82,85],{},[70,83,84],{},"Once deployed, it's a web admin panel plus a download endpoint."," Switch clients on your phone and you can still open a web page to change config.",[14,87,88],{},"I deliberately kept the stack small: Worker + Static Assets + D1 + Worker Secrets. KV, R2, Durable Objects, Queue, Cron are all off the critical path — the fewer, the better.",[29,90,92],{"id":91},"two-deployment-paths-on-purpose","Two deployment paths, on purpose",[14,94,95],{},"The first is for people who just want to use it: click the Deploy to Cloudflare button in the repo. Cloudflare pulls the repo, creates the Worker and D1, asks you for two tokens, and hands you a management link with a token when done. Step by step, no command line.",[14,97,98],{},"The second is for me and for people who like tinkering: one-click install with an AI agent.",[14,100,101,102,106],{},"The repo ships an agent protocol (AGENTS.md + a SKILL inside the agent). You write your subscription sources, the combined subscriptions you want, and the rule templates into a local config file, run ",[103,104,105],"code",{},"pnpm run install:cloudflare",", and the agent checks your Cloudflare login, creates the database, writes secrets, migrates, deploys, imports config, verifies the links, and finally hands you the management link and download link.",[14,108,109,110,113],{},"I deployed my own link exactly this way, so I recommend this route — less fuss. When using it with Codex \u002F Claude Code, just copy the prompt from ",[103,111,112],{},"agent\u002Finstall.prompt.md"," in the repo.",[29,115,117],{"id":116},"who-its-for","Who it's for",[14,119,120],{},"Straight talk: if you have more than one proxy service plus a few self-hosted nodes and want them merged into a single subscription for your own use — this is your project. If you're happily getting by with just one service, you really don't need this.",[14,122,123],{},"Code is fully open source, AGPL. The frontend interaction is a nod to the original Sub-Store; the original runs in a container and covers a wider client ecosystem. Mine is a leaner Cloudflare-native form — easier to modify and deploy directly, not a line-by-line clone.",[14,125,126],{},"Interested people can browse the repo — the README is fairly complete, just follow the deployment steps.",{"title":128,"searchDepth":129,"depth":129,"links":130},"",2,[131,132,133,134],{"id":31,"depth":129,"text":32},{"id":60,"depth":129,"text":61},{"id":91,"depth":129,"text":92},{"id":116,"depth":129,"text":117},"2026-06-28","Merge multiple proxy services plus your own nodes into one single subscription, with routing rules configured server-side — clients just subscribe.","md",null,"en",{},4,true,"\u002Fblog\u002Fsub-store-cloudflare",false,{"title":5,"description":136},"blog\u002Fsub-store-cloudflare.en",[148,149,150],"Cloudflare","Circumvention","Open-source project","88d3l-n5zJllqIBodN2MbEY0Y36gyWCKwEvbba-Oe5Y",[138,138],[154,163,171,180,187,195,202,210,218,224,231,233,240,248],{"path":155,"title":156,"description":157,"date":158,"minRead":159,"tags":160},"\u002Fblog\u002Fagent-harness-selection","After tinkering with Pi Agent, OMP, Codex, and ZCode, why I finally chose OpenCode + OpenChamber","A retrospective on choosing an Agent Harness: three criteria — GUI experience, vendor lock-in, and freedom for secondary development — ruled out Pi Agent, OMP, Codex, and ZCode, and finally settled on the OpenCode core + OpenChamber interface.","2026-08-06",6,[161,162],"AI Agent","Tool selection",{"path":164,"title":165,"description":166,"date":167,"minRead":159,"tags":168},"\u002Fblog\u002Fcloudflare-broke-stack","2026 indie dev best practices: the Cloudflare \"broke-ass all-in-one\" stack","The zero-cost tech stack for indie developers: Codex for writing code, GitHub for version control, Stripe for payments, TanStack Start for frontend, Hono + Workers for backend, D1 for database, R2 for storage, KV for caching — all running on Cloudflare.","2026-06-15",[148,169,170],"Indie development","Tech stack",{"path":172,"title":173,"description":174,"date":175,"minRead":159,"tags":176},"\u002Fblog\u002Fdeepseek-api-web-search","DeepSeek's API has built-in web search — freeload the official search via the Responses API","DeepSeek built web search straight into the API: call deepseek-v4-flash through the Responses interface and declare the web_search tool. No third-party search engine integration, no search API key required.","2026-08-05",[177,178,179],"DeepSeek","API","AI tools",{"path":181,"title":182,"description":183,"date":175,"minRead":184,"tags":185},"\u002Fblog\u002Fdeepseek-v4-flash-review","DeepSeek V4 Flash stable release, hands-on: cheap, fast, 1M context, built-in search","A few days deep-diving the stable DeepSeek V4 Flash release: aggressively cheap, lightning fast, 1M context, official built-in web search, fully open source. The one weakness is multimodality — but you can patch it by combining other models.",7,[177,186,179],"Model review",{"path":188,"title":189,"description":190,"date":167,"minRead":191,"tags":192},"\u002Fblog\u002Ffree-cloudflare","How free users can squeeze Cloudflare dry — how far does the free tier actually get you?","Cloudflare's free tier can carry an entire personal internet infrastructure: DNS, CDN, Pages, Workers, KV, D1, R2, email, Tunnel, AI Gateway and more.",8,[148,193,194],"Free tier","Deployment",{"path":196,"title":197,"description":198,"date":199,"minRead":191,"tags":200},"\u002Fblog\u002Fmodel-harness-decoupling","The First-Party Harness Isn't Always the Best Answer: In the Open-Model Era, Pick Your Model and Harness Separately","Using Claude? Go Claude Code. In the open-model era that instinct deserves an upgrade. The first-party advantage is real, but training a good model and building a good harness are two different kinds of engineering — here's why models and harnesses are now separable choices, plus a positioning map of five harnesses.","2026-09-09",[161,201,162],"Harness",{"path":203,"title":204,"description":205,"date":199,"minRead":191,"tags":206},"\u002Fblog\u002Fopencode-productive-stack","Stable, Fast, Productive, Cheap: My AI Coding Stack, Documented","OpenCode + OpenChamber + two DeepSeek V4 Flash subscriptions: 15 projects running code simultaneously and the quota barely moved. The full configuration laid out — context pruning, layered memory, desktop automation, and the \"stick with the original pairing\" lesson.",[207,208,209],"OpenCode","AI Coding","Configuration",{"path":211,"title":212,"description":213,"date":214,"minRead":215,"tags":216},"\u002Fblog\u002Fproduct-faxin-principle","The founding-intention principle: why indie developers must learn to let go","Why do you set out? Who do you set out for? Which problem are you actually trying to solve? A product's sharpness comes from what you dare to cut.","2026-06-20",10,[217,169],"Product thinking",{"path":219,"title":220,"description":221,"date":214,"minRead":191,"tags":222},"\u002Fblog\u002Fproduct-pain-vs-itch","Don't get carried away when users say \"that's awesome\": pain points vs. itch points","Verbal approval is worth nothing. There's only one hard standard for judging demand: what the user is willing to pay.",[217,223],"Demand judgment",{"path":225,"title":226,"description":227,"date":158,"minRead":228,"tags":229},"\u002Fblog\u002Fqwen-vision-for-deepseek","Giving DeepSeek multimodality: the Qwen-3.7-Flash vision approach","DeepSeek V4 Flash has no multimodality — what do you do for image understanding? After surveying the market, the most cost-effective option right now is Qwen-3.7-Flash: recognizing an image costs almost nothing, and pairing it with V4 Flash patches the gap.",5,[177,230,186],"Multimodality",{"path":143,"title":5,"description":136,"date":135,"minRead":141,"tags":232},[148,149,150],{"path":234,"title":235,"description":236,"date":199,"minRead":184,"tags":237},"\u002Fblog\u002Ftui-cognitive-bandwidth","TUI Is Killing Your Cognitive Bandwidth: Time to Shatter the \"Geek Filter\" in AI Coding","A pile of AI coding agents are rushing to ship TUIs, stuffing interaction back into the 1980s terminal paradigm and calling it \"immersive\" and \"respectful of programmers.\" This piece breaks down the three mechanisms by which TUI systematically lowers your cognitive bandwidth — and why Web UI is the right answer.",[208,238,239],"Interaction design","Essay",{"path":241,"title":242,"description":243,"date":244,"minRead":159,"tags":245},"\u002Fblog\u002Fvalue-not-external","Debating whether something has value is itself worthless","Our value is not defined by anyone. In the age of AI, how should we understand ourselves?","2026-06-18",[246,247],"AI thinking","Humanistic essay",{"path":249,"title":250,"description":251,"date":252,"minRead":253,"tags":254},"\u002Fblog\u002Fx-growth-1000-followers","Gained 1000+ followers in a little over a day — here's what I did","In June I ran my X account seriously and gained 1000+ followers in a little over a day. This post records what I did and the feedback I got.","2026-06-16",12,[255,256],"X operations","Content growth",1789752313225]