[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-105288":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":16,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":17,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":33,"readmeContent":34,"aiSummary":10,"trendingCount":15,"starSnapshotCount":15,"syncStatus":35,"lastSyncTime":36,"discoverSource":37},105288,"shipwords","shipwords-dev\u002Fshipwords","shipwords-dev","Ship a money-making AI site for every new keyword. Cloudflare-native starter with auth, credits, payments and AI generation. | 新词站群框架：一个新词一个站，一个下午上线。起量的继续迭代，没起来的放着不管。不变的共享，变的独立。","https:\u002F\u002Fshipwords.dev",null,"TypeScript",311,205,4,0,27,81,79.06,"MIT License",false,"main",[23,24,25,26,27,28,29,30,31,32],"ai","cloudflare","cloudflare-workers","d1","react","saas-boilerplate","saas-starter","seo","stripe","tanstack-start","2026-11-01 00:13:33","\u003Cdiv align=\"center\">\n\n\u003Ca href=\"https:\u002F\u002Fshipwords.dev\u002F\">\u003Cimg src=\"apps\u002Fwww\u002Fpublic\u002Fimg\u002Fog.jpg\" alt=\"shipwords: One keyword. One site.\" width=\"100%\">\u003C\u002Fa>\n\n**An open-source framework for new-keyword site fleets: a new site in an afternoon, taking payments the day it launches.**\n\n[![CI](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Factions\u002Fworkflows\u002Fci.yml\u002Fbadge.svg)](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Factions\u002Fworkflows\u002Fci.yml)\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-MIT-blue.svg)](LICENSE)\n[![Cloudflare Workers](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCloudflare-Workers-F38020?logo=cloudflare&logoColor=white)](https:\u002F\u002Fworkers.cloudflare.com\u002F)\n[![TanStack Start](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTanStack-Start-FF4154?logo=reactquery&logoColor=white)](https:\u002F\u002Ftanstack.com\u002Fstart)\n[![TypeScript](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FTypeScript-3178C6?logo=typescript&logoColor=white)](https:\u002F\u002Fwww.typescriptlang.org\u002F)\n[![GitHub stars](https:\u002F\u002Fimg.shields.io\u002Fgithub\u002Fstars\u002Fshipwords-dev\u002Fshipwords?style=flat&logo=github)](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fstargazers)\n\n**English** · [中文](README.zh-CN.md)\n\n\u003C\u002Fdiv>\n\nshipwords is a free, MIT-licensed framework for running a fleet of new-keyword AI image and video sites on Cloudflare, one site per keyword. What stays the same is shared: accounts, payments, credits and AI generation are written once. What changes is each site's own: pages, look and domain. Website: [shipwords.dev](https:\u002F\u002Fshipwords.dev\u002F).\n\n## Why shipwords\n\n**Built for a fleet of new-keyword sites.** Put up a site for every new keyword, keep improving the ones that take off, and leave the rest alone. Fix a bug in the shared core once, and every site can take the update on its next deploy. Each site deploys on its own, with its own database, storage and payment account, so launching or retiring one never touches the others.\n\n**Proven AI, built in.** [tinydeskai.io](https:\u002F\u002Ftinydeskai.io\u002F) is built on shipwords, and its full source is in [`sites\u002Ftinydeskai-example`](sites\u002Ftinydeskai-example), ready to fork.\n\n- **Video templates**: turn a viral clip into a template; visitors upload photos and get the same video back. That's how Tiny Desk AI works.\n- **Face swap that holds up**: the whole clip in one pass. Each uploaded photo replaces a performer, face, hair and clothes, with mouths still on the beat. If an original face is still there, the job fails and the credits come back.\n- **The popular models, built in**: GPT Image, Nano Banana, Seedream, FLUX, Seedance, Veo, Kling, Wan and more, behind one Yir API key, paid per generation.\n\n**Takes money out of the box.** Every site comes with:\n\n- Google and email sign-in, account page\n- Stripe and PayPal, credit packs and subscriptions, orders and refunds\n- Email notifications\n- Free guest tries with abuse limits (reCAPTCHA v3)\n- Privacy, terms, refund and DMCA pages\n- SEO, `sitemap.xml`, `robots.txt`, `llms.txt`, analytics\n\nThe money code is shared and tested: double charges, repeated or out-of-order payment events and refunds for failed jobs are all covered.\n\n## Build a site with your coding agent\n\nNo keyword yet? [new-term-radar](https:\u002F\u002Fgithub.com\u002Fzhuyansen\u002Fnew-term-radar), a separate open-source project, catches new AI terms on X, Hugging Face, GitHub and sitemaps every day, before keyword tools list them.\n\nPaste this into Claude Code, Codex or Cursor, with your own keyword:\n\n```text\nRead shipwords.dev\u002Fllms.txt and build a site for \"\u003Cyour keyword>\"\n```\n\nThe agent clones the repo, creates the site and runs it locally. The rules it follows are in [AGENTS.md](AGENTS.md).\n\n## Quick start\n\nRequirements: Node 24 (see `.nvmrc`), pnpm 10 (`corepack enable`), and Git Bash or WSL on Windows. To go live you will also need a Cloudflare account and a Stripe or PayPal account.\n\n1. Fork or clone this repo, then install:\n\n   ```bash\n   pnpm install\n   ```\n\n2. Create your first site from the template, then install again so the new site gets its dependencies:\n\n   ```bash\n   pnpm new-site my-tool --domain my-tool.com\n   pnpm install\n   ```\n\n3. Put local secrets outside the repo and link them in:\n\n   ```bash\n   mkdir -p ~\u002F.config\u002Fshipwords\n   cp sites\u002Fmy-tool\u002F.dev.vars.example ~\u002F.config\u002Fshipwords\u002Fmy-tool.dev.vars   # fill in test keys\n   pnpm setup:worktree\n   ```\n\n   The example file runs as-is: email sign-in works (the code is printed in the dev server's terminal), new accounts get sign-up credits, and generations use the mock upstream (`UPSTREAM_MOCK=1`), so no model key is needed. Fill in more as you need it:\n   - **Real generations**: a [Yir API key](https:\u002F\u002Fyir.ai\u002F?utm_source=shipwords&utm_medium=readme), with `UPSTREAM_MOCK` turned off.\n   - **Buying credits**: a Stripe test key (`sk_test_…`), then `node ..\u002F..\u002Ftools\u002Fstripe-listen.mjs` in the site directory to forward webhooks.\n   - **Guest free tries**: reCAPTCHA keys. Without them, visitors sign in before their first generation.\n   - **Google sign-in**: a Google OAuth client with `http:\u002F\u002Flocalhost:\u003Cport>` as an origin. Optional; email sign-in works without it.\n\n4. Run it:\n\n   ```bash\n   cd sites\u002Fmy-tool\n   pnpm db:generate && pnpm db:migrate:local\n   pnpm dev\n   ```\n\nWhen you are ready to go live, follow [docs\u002Fsite-launch.md](docs\u002Fsite-launch.md).\n\n## What it costs\n\nThe code is free under MIT, including commercial use. What you pay for:\n\n- Domains (Cloudflare Registrar sells them at cost).\n- Cloudflare usage. Sites that stitch video clips together use Cloudflare Containers and need the Workers Paid plan.\n- Stripe or PayPal fees on each order.\n- Model calls on Yir, billed per request. Each job's maximum cost is set in `src\u002Fmodels.server.ts`.\n\n## Repository layout\n\n| Directory                  | What it holds                                                                                                                                                                                                            |\n| -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| `packages\u002Fcore`            | D1 + Drizzle, credit ledger with idempotent writes, Stripe and PayPal billing (packs, subscriptions, refunds, disputes), Better Auth, guest quota + reCAPTCHA v3, SEO\u002FGEO helpers, analytics proxy, headless React hooks |\n| `packages\u002Fjobs`            | Workflow-based generation runtime with a one-way job state machine and automatic refunds, upstream adapter interface, Yir adapter (`@yir-ai\u002Fsdk`), mock upstream for local dev, optional ffmpeg compose container        |\n| `templates\u002Fai-site`        | A complete, working AI image site copied by `pnpm new-site`: home, pricing, account, login, policy pages, `sitemap.xml`, `robots.txt`, `llms.txt`                                                                        |\n| `sites\u002F\u003Csite>`             | Your sites, one per keyword, each deployed on its own                                                                                                                                                                    |\n| `sites\u002Ftinydeskai-example` | The full source of tinydeskai.io (video effect: photo slots, one-pass video edit, output check, ffmpeg compose, content pages)                                                                                           |\n| `apps\u002F\u003Csidecar>`           | Optional small Workers that belong to no single site                                                                                                                                                                     |\n| `tools\u002F`                   | `new-site` scaffolder, `check-site` launch checks, `list-sites`, worktree setup, dev-port, Stripe webhook forwarding (Node built-ins only, with tests)                                                                   |\n| `docs\u002F`                    | Architecture, local development, launch handbook                                                                                                                                                                         |\n\nEach site is a TanStack Start + React 19 app on its own Cloudflare Worker, with D1, R2 and Workflows.\n\n## Common commands\n\n```bash\npnpm new-site \u003Cdir> --domain \u003Cdomain>   # scaffold sites\u002F\u003Cdir> from the template\npnpm list-sites                         # site list generated from each site's code and README\npnpm setup:worktree                     # copy local secrets into a new worktree, fix dev ports\npnpm --filter \".\u002Fsites\u002F\u003Csite>\" dev\npnpm --filter \".\u002Fsites\u002F\u003Csite>\" check    # typecheck + build + launch checks\npnpm check:packages                     # core + jobs: typecheck + tests\npnpm check:template\npnpm lint && pnpm test:tools\n```\n\n## Docs\n\n- [Architecture and design choices](docs\u002Farchitecture.md)\n- [Local development](docs\u002Flocal-development.md)\n- [Site launch handbook](docs\u002Fsite-launch.md)\n- [Rules for AI coding agents](AGENTS.md)\n- [Contributing](CONTRIBUTING.md) and [security policy](SECURITY.md)\n\n## Community\n\nQuestions, ideas and sites you shipped go in [GitHub Discussions](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fdiscussions): [Q&A](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fdiscussions\u002Fcategories\u002Fq-a), [Show and tell](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fdiscussions\u002Fcategories\u002Fshow-and-tell), [Ideas](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fdiscussions\u002Fcategories\u002Fideas). Bugs go in [Issues](https:\u002F\u002Fgithub.com\u002Fshipwords-dev\u002Fshipwords\u002Fissues).\n\n## License\n\n[MIT](LICENSE)\n",2,"2026-10-31 04:26:20","CREATED_QUERY"]