Open-source project
setube/taoyuan avatar
setube/taoyuan

Taoyuan: a text-heavy farming sim where the whole economy runs in the browser

桃源乡: 一款文字版田园模拟经营游戏,灵感来自星露谷物语,采用像素 + 中国风视觉设计。

587 stars86 forksTypeScriptNOASSERTION

At a glance

What is it?
Taoyuan is a Chinese-language text farming simulation inspired by Stardew Valley, built on Vue 3 and Pinia with 26 stores, 23 game panels and a hundred and thirteen recipes, and it ships as a web app, an Electron desktop build and an Android package. The licence is CC BY-NC 4.0, so it is free to share but not to sell.
Who is it for?
Taoyuan suits a player who wants a farming loop that runs in a browser tab and who reads Chinese, and it suits a developer looking at a Vue 3 and Pinia codebase that is large enough to be a real application rather than a demo. It does not suit a commercial deployment, because the CC BY-NC 4.0 licence forbids commercial use without the author's written permission, and the README says so explicitly.
Can I use it commercially?
Check first. The repository uses a licence we do not classify automatically, so read its LICENSE file before any commercial use.
Is it still maintained?
Yes. The repository last received commits 12 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

A farming sim where the numbers and the text carry the game

Taoyuan is described as a text version rural simulation management game, inspired by Stardew Valley, with a pixel plus Chinese style visual design. The game is at taoyuan.wenzi.games.

What text-heavy means here is that the simulation is narrated. The README lists a day and night cycle from 6:00 to 2:00 the next day, 28 days per season, four seasons, and six weather conditions including clear, rain, thunderstorm, snow, strong wind and green rain. Character creation asks for a name and a gender, and there are 6 farmsteads each with a distinct bonus, such as a fishing bonus for the stream, a foraging bonus for the bamboo grove or a mining bonus for the hillside, and NPCs address the player differently depending on gender.

The scale is large enough that the structure tells you where the work went. There are 38 crops with four-season rotation, 19 animals split between a chicken coop with 8 kinds and a ranch with 11 kinds, 60 fish across 6 fishing spots, 113 cooking recipes, 21 processing machines with more than 150 processing recipes, 34 villagers of whom 12 are marriageable, 6 hidden spirit NPCs, 120 mine floors with a boss fight every 20 floors, a separate desert area, a museum, an adventurers guild, and a breeding system with 400 crossbreeding recipes across 10 generations.

The design specification is short and unusually concrete for a game README. The colour palette is a traditional Chinese palette, with an ink background of #1a1a1a, a red gold accent of #c8a45c, a vermilion warning colour of #c34043 and a bamboo green success colour of #5a9e6f. The font is the zpix pixel font with font smoothing disabled. The UI style is flat hard-edged buttons, 1px thin borders, a maximum 2px corner radius and spacing in multiples of 4px, and the layout is responsive with bottom navigation on mobile, a sidebar on desktop and a 768px breakpoint.

The licence is CC BY-NC 4.0, which the README states allows free sharing and adaptation but forbids commercial use without the author's written permission.

Vue 3 and Pinia, with 26 stores and 23 panels

The technical stack is listed as a table, and the numbers in it are the interesting part.

Vue 3.5 with the composition API and script setup, TypeScript 5.9 with strict type checking, Vite 7 for the build and dev server, Pinia 3 for state management with 26 stores, TailwindCSS 3 with atomic styles and CSS variables for custom themes, Vue Router 5 for client-side routing across 23 game panels, Tone.js 15 for procedural audio, Electron 39 for the desktop client, lucide-vue-next for icons and VueUse 14 for composable utilities. CryptoJS 4 handles AES encryption of saves.

The source tree in the README describes the same architecture in directory form. Under src/ there is a views/ directory with page-level components including MainMenu.vue for the new game, save management and import and export, and GameLayout.vue for the main layout of status bar, sidebar, log and modals, and a game/ directory holding the 23 game panels, among them FarmView, AnimalView, HomeView for the house and warehouse, ShopView, NpcView, FishingView, FishPondView, MiningView, HanhaiView for the desert, CookingView, ProcessingView for the workshops, BreedingView, MuseumView, GuildView and InventoryView. Alongside that there is components/game/ with 20 subcomponents for minigames, dialogs and the status bar, stores/ with the 26 Pinia stores, composables/ for reusable logic covering navigation, daily settlement, logging, audio and dialogue, data/ with 40 game data modules for crops, items, NPCs, fish and recipes, types/ for the TypeScript definitions, router/ for the Vue Router configuration, and assets/ holding the zpix pixel font and the logo.

Two of those directories carry the actual game. The 40 modules in data/ are the content, and the 26 stores in stores/ are the state machine, which is why the README describes the game as a set of systems rather than a single loop.

The package.json confirms the Vue 3 and Pinia choices with specific versions, pinia at 3.0.4, vue at 3.5.24 and vue-router at 5.0.2, and it also shows Capacitor for the Android build with @capacitor/core, app, filesystem and android at version 8, plus tone at 15.1.22 for the audio.

Running it with bun, and three ways to deploy it

The build tooling is bun, and the scripts are short:

bash
bun install

bun dev

bun run build

bun run preview

bun run build:electron

The package.json shows the same scripts in the same order with their real commands. dev is vite, build is vue-tsc -b followed by vite build, preview is vite preview, and build:electron is a long one that type checks, builds, bundles electron/main.js and electron/preload.js with esbuild and then runs electron-builder. There is also a build:android and a build:apk script, the latter running the Android build and then the gradlew assembleRelease task.

The Docker route offers three choices, and the first is the prebuilt image:

bash
docker run -d -p 8080:80 ghcr.io/setube/taoyuan:latest

docker run -d -p 8080:80 ghcr.io/setube/taoyuan:<version>

docker build -t taoyuan .
docker run -d -p 8080:80 taoyuan

The Dockerfile is a two-stage build. The builder stage is oven/bun:1-alpine, it copies package.json and bun.lock, installs with --frozen-lockfile, copies the source and runs the build. The production stage is nginx:alpine, it copies in the nginx configuration, clears the default static files, copies the build output from the builder and exposes port 80.

Two details in that Dockerfile are worth noting. The image is not a Node server, it is nginx serving static files, so there is no application server in the production path and the whole game is client side. And the build output is copied from /app/docs, which is where the Vite build lands.

The published image is on the GitHub Container Registry, and the game is also on TapTap, which is a mobile app store, with a HelloGitHub feature badge. The project is in Chinese throughout, and the README has an English and a Chinese version of itself for the client, admin and other pages.

Saves, encryption and the state that survives a session

The save system is the part of the game that touches the platform rather than the fiction, and the README describes it precisely.

There are 3 save slots, using localStorage with AES encryption, with daily autosave, and they support import, export and WebDAV cloud sync. The crypto-js dependency in the stack table is listed with the purpose of save AES encryption.

Local storage plus AES is an honest choice for a browser game with no server. It means a save is confined to one browser profile, which is why the import and export path and the WebDAV sync exist, and it means the key handling is in the client, so the encryption is protecting the data at rest in localStorage rather than protecting it from the player.

The systems table in the README fills in the rest of the rules, and it reads like a design document. Stamina starts at 120, every action costs some, and medicinal food can raise the cap to 180. The farm is 38 crops on a plot that starts at 4x4 and expands to 8x8, with 3 sprinkler types for automatic watering, 6 fertilisers, a greenhouse for year-round planting and 8 fruit trees that take 28 days to bear. Quality has four tiers, ordinary, fine, premium and supreme, which multiply the sale price by 1.0, 1.25, 1.5 and 2.0 and also affect gifting.

Tools are a watering can, hoe, pickaxe and fishing rod, each with three upgrade levels from basic through iron to refined steel, and they reduce stamina cost. The inventory holds 20 to 36 slots with a stacking limit of 99 per slot and a separate toolbar, and the warehouse has 5 chest types, wood, copper, iron, gold and void, with the void chest supporting remote access and being assignable as an ingredient or product chest to automate workshop input and output.

The fishing system is the one with a real minigame: 6 fishing spots, 60 fish species, and a real-time minigame where a long press controls the hook height and pulling in time brings in the catch, plus bait, floats, crab traps and panning for gold in the rain.

Procedural audio, and the release cadence

The audio is generated rather than recorded, and that is a notable choice for a game with this much content.

Tone.js 15 is listed for procedural audio synthesis, covering both background music and sound effects. The README describes 19 background music tracks spanning the four seasons, festivals, minigames, combat and the desert area, plus more than 80 sound effects, using a Chinese pentatonic scale of five notes, and the weather and time of day dynamically modify the timbre and the rhythm.

A pentatonic scale is the right musical system for the aesthetic, and generating the music means the sound reacts to the game state rather than looping a fixed track. The cost is that the music is not composed in the sense a musician would recognise, and there is no way in the README to change the scale or the instrument set.

The release history shows a project shipping quickly. Version 3.2.0 was published on 2026-10-04, 3.2.5 on 2026-10-08 and 3.3.0 on 2026-10-12, with the last push on 2026-10-12, so three releases in eight days. The version in package.json is 3.3.0, and the package is private, which is normal for an application that is published as a container image and as builds rather than as an npm library.

The repository layout is broad because the project targets several platforms. There is an electron/ directory, an android/ directory, a capacitor.config.ts and a project.config.json for the Android build, a Dockerfile and a Dockerfile.ci, an nginx.conf for the production image, tailwind.config.js, vite.config.ts, eslint.config.js, a .prettierrc, and a go.mod with a go 1.25.4 directive, which is curious in a TypeScript project and probably serves a small helper tool.

The community channels are a QQ group and the GitHub repository, and the licence file sits at the root.

Editorial conclusion

Taoyuan suits a player who wants a farming loop that runs in a browser tab and who reads Chinese, and it suits a developer looking at a Vue 3 and Pinia codebase that is large enough to be a real application rather than a demo. It does not suit a commercial deployment, because the CC BY-NC 4.0 licence forbids commercial use without the author's written permission, and the README says so explicitly. Before you fork it, read the data/ directory first, because the 40 game data modules are where the content lives, and check the save format, since the three save slots use localStorage with AES encryption and support import, export and WebDAV sync.

Frequently asked questions

How do I run Taoyuan locally?

The project uses bun. Run bun install to install dependencies, bun dev to start the dev server, bun run build for the type check and production build, bun run preview to preview the build, and bun run build:electron to produce the desktop client.

How do I deploy Taoyuan with Docker?

You can run the prebuilt image ghcr.io/setube/taoyuan:latest with docker run -d -p 8080:80, pin a specific version the same way, or build the image locally with docker build -t taoyuan . and run it. The Dockerfile is a two-stage build that compiles with bun and serves the static output with nginx.

Can I use Taoyuan commercially?

No, not without written permission from the author. The project is licensed under CC BY-NC 4.0, which permits free sharing and adaptation but forbids commercial use, and the README states that commercial use is prohibited without the author's written authorisation.

How are Taoyuan saves stored?

There are 3 save slots in localStorage with AES encryption, with daily autosave, and they support import, export and WebDAV cloud sync. The settings and the log live in the same way, and the crypto-js dependency handles the save encryption.

Official sources

  1. Issues
  2. Project website
  3. README
  4. Releases
  5. setube/taoyuan on GitHub
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/setube-taoyuan.svg)](https://hysenlabs.com/projects/setube-taoyuan)

Was this useful?