# YunYouJun/cook: a Nuxt recipe app with a Feishu-backed data pipeline

> Cook is an MIT-licensed Nuxt 3 recipe site aimed at cooks with limited ingredients. Its recipe data is pulled from Feishu spreadsheets through a CLI, and the same codebase builds a static site, a Docker image, and Capacitor mobile shells.

**YunYouJun/cook** — 🍲 好的，今天我们来做菜！OK, Let's Cook!

- Repository: https://github.com/YunYouJun/cook
- Website: https://cook.yunyoujun.cn
- Stars: 6,515 · Forks: 427
- Language: TypeScript
- License: MIT
- Published: 2026-09-22 · Updated: 2026-09-22 · Language: en
- Canonical page: https://hysenlabs.com/projects/yunyoujun-cook

## The problem Cook targets: recipes for a nearly empty kitchen

Most recipe sites assume a stocked pantry. Cook starts from the opposite constraint. The README states the project's origin directly: it was built so that people isolating at home with limited ingredients could still cook, and recipe ingredients are therefore kept within a narrow, familiar range. That is a design decision with consequences. The recipe set is deliberately shallow rather than encyclopedic, and the README notes the project is primarily Chinese and will not be translated to English because the ingredients it covers are named in Chinese.

The audience follows from that. A Chinese-speaking home cook who wants to know what can be made from a short list of items is the target user. A developer who wants a self-hosted recipe front end with a data pipeline they control is the second audience. Someone looking for a general-purpose recipe database, or for an English-language cooking app, is not served here at all, and the README is honest about that rather than pretending otherwise.

## How the data flows from a Feishu spreadsheet to a static site

The architecture is a build-time pipeline wrapped in a Nuxt application. Recipe content does not live in the repository as the source of truth. It lives in a Feishu spreadsheet, and the repository provides two CLI commands to move it: pnpm fetch pulls the latest data from Feishu, and pnpm convert turns a local CSV into JSON. The .env.example file shows what fetch needs: FEISHU_APP_ID and FEISHU_APP_SECRET, obtained from an app created at open.feishu.cn, and the comment says these credentials are used by the cook fetch command.

The build script encodes the dependency. Running pnpm build executes convert followed by generate, so a normal build works from whatever CSV is already present and never touches the network. pnpm build:full runs fetch first, then generate, which is the path you want when the spreadsheet has changed. The generate step is nuxt generate, producing a static output directory that the Dockerfile copies into nginx. The package.json also exposes start:generate, which serves dist through npx serve, and start, which runs the Node server entry point at .output/server/index.mjs.

This split is the most interesting thing about the project. It means the deployed artifact is static and cheap to host, while the editorial workflow stays in a spreadsheet that non-developers can edit. The cost is that the repository alone does not contain a complete recipe set unless the CSV is committed, and the README points contributors to the Feishu wiki and a submission form rather than to a pull request workflow for content.

## Installing Cook locally and running the dev server

The README's development section assumes pnpm. The package.json pins packageManager to pnpm@11.21.0 and engines to node >=22.0.0, so a Node 22 or newer runtime is the baseline before anything else works. The commands below are copied from the README's startup block. The first installs dependencies; the second optionally pulls fresh recipe data from Feishu; the third converts an existing local CSV into JSON; the last starts the dev server.

```bash
pnpm install
pnpm fetch
pnpm convert
pnpm dev
# http://localhost:3333
```

After pnpm dev, the README says the app is available at http://localhost:3333. Note that pnpm fetch requires the Feishu credentials from .env.example. If you do not have them, skip fetch and rely on convert against a CSV you supply, or on data already in the repository. The README states that detailed environment configuration and the Feishu data pull are documented separately in the development docs at cook-docs.pages.dev, so treat the .env.example as the minimum and the docs as the fuller reference.

## Deploying the Docker image and where the port mapping bites

The README gives a Docker path that does not require a local Node toolchain. The image is published as yunyoujun/cook:latest, and the run command maps host port 8080 to container port 80.

```bash
docker pull yunyoujun/cook:latest
docker run -it -d --name cook -p 8080:80 yunyoujun/cook:latest

docker start cook
docker stop cook
```

The Dockerfile explains why port 80 is the target: a node:24-alpine builder stage installs pnpm@11.21.0, runs pnpm install --frozen-lockfile and pnpm run build, then a second nginx:stable-alpine stage copies /app/dist into /usr/share/nginx/html and exposes 80. So the container serves pre-generated static files, not a running Nuxt server. Two consequences follow. First, the image contains whatever recipe data was present at build time, so updating recipes means rebuilding or pulling a newer image. Second, because the build runs pnpm run build (convert plus generate) and not build:full, the image build never calls Feishu. If you want your own recipes in the image, you need the CSV in the build context.

## The mobile shells, and what happened to the mini program

The repository contains android/ and ios/ directories, capacitor.config.ts, ionic.config.json, and a set of @capacitor packages in dependencies, including app, browser, core, dialog, haptics, ios, keyboard, preferences and status-bar. Scripts such as dev:android, dev:ios, sync and open:ios point at a Capacitor workflow. The .env.example reserves APPLE_DEVELOPMENT_TEAM for iOS signing. The README links to an Ionic Nuxt cookbook for local development of the app and says a new APP version is in development.

What is gone is the WeChat mini program. The README states plainly that it was taken down after being judged as diverting traffic because it linked to Bilibili videos, and that no mini program version will be offered again. Anyone arriving with a memory of searching for the mini program should read that as final, not as a temporary outage. The PWA feature is also struck through in the README, with the note that an APP version is being worked on instead. Both are examples of the documentation being updated to match reality rather than left to mislead.

## Limitations: beta versioning, Feishu coupling, and no English

Three constraints matter more than any feature list. The first is version status. The most recent release listed is v2.0.0-beta.17, published on 2026-08-17, and package.json carries version 2.0.0-beta.17. This is a beta line, not a stable 2.x. The last push to the repository was on 2026-08-17 as well, so the project is not dormant, but a beta label on the current release means interfaces and data formats can still move.

The second is the Feishu dependency. If you want to run the fetch path, you need an app on the Feishu open platform and its App ID and App Secret. That is an external account and an external service in the critical path of content updates. The alternative, convert from a local CSV, works without any credentials, but then you own the CSV format and the conversion output. The README does not document a rollback path for a bad fetch, and it does not describe how conflicts between local edits and spreadsheet edits are resolved.

The third is language. The README says the project does not intend to translate to English. If your users read English, you are adopting a codebase whose content model and ingredient vocabulary are Chinese. That is not a bug to patch; it is the stated scope.

## How Cook differs from Xiachufang and iCook

The closest comparisons people search for are Xiachufang and iCook, both of which are recipe platforms rather than self-hostable software. The difference is not the recipe count. Xiachufang and iCook are hosted products: you browse their catalog, their data stays on their servers, and you cannot fork their front end or point their data pipeline at your own spreadsheet. Cook is the opposite arrangement. It is an MIT-licensed codebase you run yourself, and its content is whatever you put into the Feishu sheet or the CSV.

That trade is stark. A hosted platform gives you a large, maintained catalog and no operational work. Cook gives you control over presentation, hosting and data source, in exchange for running a Nuxt 3 workspace, keeping pnpm and Node versions aligned, and maintaining a Feishu app if you use the fetch command. If your goal is simply to find a recipe tonight, a hosted platform wins. If your goal is a recipe site with your own ingredient vocabulary and your own domain, Cook is the shape of tool you want, and the small catalog is a feature of its constrained-ingredient premise rather than a gap.

## Licence and the ongoing cost of keeping Cook running

The repository is MIT-licensed, with a LICENSE file at the top level. MIT is permissive: it allows use, modification and redistribution, and it requires preserving the copyright notice and licence text. It does not impose copyleft obligations on your own code. This is a description of the licence text, not legal advice; if you are redistributing the project commercially, read the LICENSE file and the licences of the dependencies it pulls in.

The upgrade cost is mostly dependency churn. The workspace pins pnpm@11.21.0 through packageManager and engines, requires Node 22 or newer, and depends on Capacitor 8.x packages and a workspace package named @yunyoujun/cook. Because the current line is 2.0.0-beta.17, expect to read release notes between upgrades rather than assuming compatibility. Static hosting keeps the runtime cost near zero: the Docker image is nginx serving files, so there is no database and no server process to monitor. The recurring work is the content pipeline, not the deployment.

## Conclusion

Cook fits teams or individuals who want a self-hosted, Chinese-language recipe front end and are willing to maintain a Nuxt 3 workspace plus a Feishu app for data. It is the wrong tool if your recipes are in English, if you need a stable release rather than v2.0.0-beta.17, or if you cannot obtain Feishu credentials and would rather edit JSON by hand. Before adopting it, verify that pnpm install completes on Node 22 or newer, that pnpm convert produces usable JSON from your own CSV, and that the Docker image's port mapping on 8080 to 80 matches your reverse proxy.

## FAQ

### How do I install and run YunYouJun/cook locally?

The README's development section uses pnpm: run pnpm install for dependencies, optionally pnpm fetch to pull recipe data from Feishu, pnpm convert to turn a local CSV into JSON, then pnpm dev, which serves the app at http://localhost:3333. Node 22 or newer and pnpm 11.21.0 are required by the engines and packageManager fields.

### Can I run YunYouJun/cook with Docker instead of installing Node?

Yes. The README gives docker pull yunyoujun/cook:latest followed by docker run -it -d --name cook -p 8080:80 yunyoujun/cook:latest, after which the site is reachable on host port 8080. The Dockerfile builds with pnpm and serves the generated dist directory through nginx on port 80.

### Does YunYouJun/cook need Feishu credentials to build?

Only for the fetch path. The .env.example file defines FEISHU_APP_ID and FEISHU_APP_SECRET for the cook fetch command, but the standard pnpm build runs convert and generate without contacting Feishu, and pnpm build:full is the variant that fetches first.

### Is there an English version of YunYouJun/cook?

No. The README states the project is primarily Chinese and that the maintainers do not intend to translate it to English, because the ingredients it covers are named in Chinese.

### Is the WeChat mini program version of Cook still available?

No. The README says the mini program was removed after being judged as diverting traffic for linking to Bilibili videos, and that no mini program version will be provided again.

## Sources

- [License: MIT](https://github.com/YunYouJun/cook/blob/main/LICENSE)
- [Project website](https://cook.yunyoujun.cn)
- [README](https://github.com/YunYouJun/cook/blob/main/README.md)
- [Releases](https://github.com/YunYouJun/cook/releases)
- [YunYouJun/cook on GitHub](https://github.com/YunYouJun/cook)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/yunyoujun-cook
