ultratears
Unofficial native Windows port of Tears of the Kingdom 1.4.3 using static recompilation. Builds locally from the player's own extracted game dump; no game files included.
A cosy isometric fishing tycoon. Tow the net, haul the catch, build up the boat.
Translation pending
GamesTypeScript · JavaScriptGitHub @paperhurtsOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
A cosy isometric fishing tycoon for the browser. Tow a net through schools of fish, haul the catch home, build up the boat, build up the island, sail further, find bigger things.
Taken from the repository README
Loading the full README.
Read the full README ↗A cosy isometric fishing game for phones and browsers, made by a family. You tow a net through schools of fish, sell the catch at the dock, and spend the coins on a bigger net, a deeper hold, a faster engine and a better boat. Then you sail further out.
There is a lot further out. The sea runs from the home island past three lines of buoys to the far far sea. Along the way you find thirteen islands, a castle that becomes your headquarters, and a tar ocean behind a metal bridge. There are bosses on land and at sea, companions who fight beside you and ride their own boats, and dives into a trench and the abyss. There are mini-games too, and a Battle Barge for re-fighting any boss you've beaten. Most of the world was designed by the owner's kid: his drawings and answers are written into project.md next to what each thing became.
Play it: https://net-profit.paperhurts.dev. It works best on a phone held upright. Add it to the home screen and it installs as an app and plays offline.
Stuck? The game has a player's guide, on the title card and in the shop, and on its own at https://net-profit.paperhurts.dev/guide.html. It covers how to play, where everything is and how to beat it, with every answer folded away until you open it.
supabase/migrations).Add #tester to the address (https://net-profit.paperhurts.dev/#tester) to get the tester panel. From there you can:
It is how new features get checked without playing for hours to reach them.
npm install
npm run dev
Then open http://localhost:4830/ on this machine. To try it on a phone on the same Wi-Fi, run npm run dev -- --host and open the Network URL Vite prints. A Tailscale hostname works too. On Windows, reaching the dev server over the LAN needs an inbound firewall rule for TCP 4830. Test at 390x780 portrait first: that is the screen the game is made for.
| Command | What it does |
|---|---|
npm run dev | Dev server with hot reload, on port 4830 |
npm run build | Production build into dist/ |
npm run preview | Serve the production build, on port 4831 |
npm run typecheck | TypeScript, strict |
npm run lint | Biome lint and format check |
npm run format | Biome format, in place |
npm run test:unit | Vitest: the game's logic, drawing and save format |
npm run test:e2e | Playwright smoke tests: the real game at phone size, driven through the window.__np debug hook. First run: npx playwright install chromium |
npm test | Unit then smoke |
Ports are pinned: dev on 4830, preview and the smoke tests on 4831. Other projects on the same machine use Vite's defaults.
No game framework: a custom canvas renderer draws everything, in an isometric projection (src/core/iso.ts).
index.html holds the page, its styles and every card and panel (the shop, the sea map, the tester panel and the rest).src/main.js is the game: its loop, its state, and the wiring between everything below. It began as the original prototype's script and is being split into typed modules; new work goes into the modules.src/world/ has the places: islands, docks, buoy lines, the tar ocean, the castle's rooms.src/entities/ has everything that moves: the boat, the net, the walker on foot, fish, bosses, companions.src/render/ has the drawing of each.src/data/ has tables and rules: gear, armour, trophies, the castle's upgrades and the rest.src/fishing/, src/input/, src/audio/ and src/ui/ are the rod, the joystick and keys, the sound, and the message queue.src/state/ holds the save format (with its migrations) and the online save code.legacy/net-profit.html is the original single-file prototype. It stays as the reference for how the boat and net feel. Do not edit it.tests/unit/ has the Vitest tests and tests/smoke.spec.ts the Playwright ones.public/ has the icons, the app manifest, the service worker that keeps it playable offline, and guide.html, the player's guide. Every change a player will meet updates the guide in the same PR.Everything about the design lives in project.md: the pillars, the tuning tables, every shipped feature in order with the kid's answers behind it, the persistence format, and the roadmap. CLAUDE.md has the rules for working on the code.
CI runs on every pull request (.github/workflows/ci.yml): typecheck, lint, unit tests, then the smoke tests. Merging to main builds the game and deploys dist/ to GitHub Pages (deploy.yml). The repository's Pages source is GitHub Actions, so nothing deploys from the branch itself, and only the game and its player's guide are served, not the docs. An open game notices the new version when it comes back to the front and offers to update.