{"data":{"slug":"hmdsimdev-heartmorrow","name":"heartmorrow","tagline":"LLM-powered dating simulator","github_url":"https://github.com/HMDSimDev/heartmorrow","owner":"HMDSimDev","repo":"heartmorrow","owner_avatar_url":"https://avatars.githubusercontent.com/u/295296238?v=4","primary_language":"TypeScript","stars":184,"forks":20,"topics":["ai","dating-simulator","game","llm","llms","local-ai","local-llm","node","nodejs","simulator"],"archived":false,"github_pushed_at":"2026-08-18T05:42:54+00:00","maintenance_label":"Steady","stars_delta_30d":12,"url":"https://www.graphcanon.com/tools/hmdsimdev-heartmorrow","markdown_url":"https://www.graphcanon.com/tools/hmdsimdev-heartmorrow.md","api_url":"https://www.graphcanon.com/api/graphcanon/tools/hmdsimdev-heartmorrow","graph_url":"https://www.graphcanon.com/api/graphcanon/graph?tool=hmdsimdev-heartmorrow","description":"AI-powered dating simulator","homepage_url":"https://heartmorrow.com/","license":"Unlicense","open_issues":2,"watchers":4,"ai_summary":"A dating simulator leveraging LLMs for interaction, developed using TypeScript with Node.js and pnpm.","readme_excerpt":"## Requirements\n\n> **Using the [self-contained installer](#quick-start) or [Docker](#run-in-docker)?** You can\n> skip the Node and pnpm requirements below — `install.sh` / `install.ps1` download a pinned,\n> local Node and activate the right pnpm for you, and the Docker build brings its own. The\n> only thing you'd still want is an LLM server to actually play.\n\n- **Node.js 24+** — the server uses Node's built-in `node:sqlite` (stable, flag-free on\n  Node 24), so installation never compiles a native C addon.\n- **pnpm** — the repo pins **`pnpm@11.7.0`** via `packageManager`, so running `corepack\n  enable` once will fetch the right version automatically (or `npm i -g pnpm`).\n- *(Optional, but basically needed to actually play)* an **OpenAI-API-compatible** LLM server, either local or a cloud API.\n\n---\n\n---\n\n## Quick start\n\nThe fastest way in is the **self-contained installer**. It needs *no prerequisites* — not\neven Node or pnpm. It downloads a pinned, official Node.js into a local `./.runtime/node`\nfolder (verified against nodejs.org's SHA-256 checksums, nothing installed system-wide),\nactivates the exact pnpm pinned in `package.json` via corepack, installs dependencies, and\nseeds the sample database. Then a matching `run` script starts the app.\n\n**macOS / Linux**\n\n```bash\n./install.sh      # one-time setup (downloads Node locally, installs, seeds)\n./run.sh          # start the server + web client\n```\n\n**Windows**\n\n```powershell\npowershell -ExecutionPolicy Bypass -File .\\install.ps1   # one-time setup\n.\\run.bat                                                # start the app\n```\n\n> **Unattended/CI?** Pass `-y`/`--yes` to `install.sh` (or `-Yes` to `install.ps1`), or set\n> `HEARTMORROW_YES=1`, to skip the Node-download confirmation prompt.\n\n> **📱 Works on Termux, too.** The Linux installer runs as-is under\n> [Termux](https://termux.dev/) on Android — `./install.sh` then `./run.sh` — so you can host\n> Heartmorrow right on your phone and play it from the device's browser. (Point it at a local\n> or remote LLM the same way you would anywhere else.)\n\nBoth installers are **idempotent** — re-run them anytime; they skip the Node download if the\nvendored copy is already present.\n\nThen open **http://localhost:5173**.\n\n---\n\n### Manual install\n\nAlready have **Node.js 24+** and **pnpm**? Skip the installer and run the steps yourself:\n\n```bash\n\n---\n\n### Run in Docker\n\nPrefer containers? A [`Dockerfile`](Dockerfile) and [`docker-compose.yml`](docker-compose.yml)\nare included. This needs **no local Node or pnpm** — only Docker — and bundles everything\ninto a single container that builds the web client and serves it **and** the API from one\nprocess on one port.\n\n```bash\ndocker compose up --build\n```\n\nThen open **http://localhost:8787**. (In Docker the API server serves the web client itself,\nso there's just the one port — no separate `:5173` like in dev.)\n\nA few things worth knowing:\n\n- **Point it at your model.** Your LLM runs on the *host*, not inside the container, so\n  `localhost` from within the container is the container itself. `docker-compose.yml`\n  pre-wires `host.docker.internal` — just set `LLM_BASE_URL` there to your provider's port\n  (LM Studio `1234`, Ollama `11434`, etc.). You can still change every LLM setting live in\n  **Settings** afterward.\n- **Your save persists.** The SQLite DB and uploaded art live in a named `heartmorrow-data` volume\n  mounted at `/data`, so rebuilding the image keeps your game. Back up that volume (or swap\n  it for a bind mount like `./data:/data`) to back up your save.\n- **(Optional) seed sample data.** A fresh container starts with an empty database. To load\n  the sample world + characters into the volume:\n  ```bash\n  docker compose run --rm heartmorrow apps/server/node_modules/.bin/tsx apps/server/src/seed.ts\n  ```\n\n> 🔒 It’s bound to localhost on purpose. Heartmorrow has no authentication — anything that can reach the API can drive your game and read its data. The compose file publishes the port on 127.0.","github_created_at":"2026-06-20T05:44:15+00:00","created_at":"2026-07-15T11:01:44.809539+00:00","updated_at":"2026-09-20T05:08:29.08195+00:00","categories":[{"slug":"developer-tools","name":"Developer Tools","url":"https://www.graphcanon.com/categories/developer-tools","markdown_url":"https://www.graphcanon.com/categories/developer-tools.md","api_url":"https://www.graphcanon.com/api/graphcanon/categories/developer-tools"},{"slug":"llm-frameworks","name":"LLM Frameworks","url":"https://www.graphcanon.com/categories/llm-frameworks","markdown_url":"https://www.graphcanon.com/categories/llm-frameworks.md","api_url":"https://www.graphcanon.com/api/graphcanon/categories/llm-frameworks"}],"tags":[{"slug":"ai","name":"ai"},{"slug":"dating-simulator","name":"dating-simulator"},{"slug":"game","name":"game"},{"slug":"llm","name":"llm"},{"slug":"local-ai","name":"local-ai"},{"slug":"local-llm","name":"local-llm"},{"slug":"nodejs","name":"nodejs"}],"trust":{"provenance":{"is_fork":false,"github_id":1274989973,"owner_type":"User","methodology":"github_public_v1","parent_repo":null,"near_duplicate_slugs":[]},"computed_at":"2026-09-20T05:08:26.702Z","maintenance":{"label":"Steady","score":60,"methodology":"github_public_v1","releases_90d":0,"days_since_push":32,"last_release_at":null,"stars_delta_30d":12,"open_issues_delta_30d":2},"security_summary":{"status":"ok","scanner":"osv@v1","low_count":0,"high_count":0,"last_scan_at":"2026-07-15T11:01:46.365Z","medium_count":0,"scan_profile":"deps","critical_count":0}},"capability_facts":{"mcp":{"source":"repo_scan","observed_at":"2026-09-20T05:08:27.724Z","server_manifest":false},"scan":{"source":"repo_scan","observed_at":"2026-09-20T05:08:27.724Z"},"deploy":{"source":"dockerfile:Dockerfile","self_host":true,"observed_at":"2026-09-20T05:08:27.724Z","managed_saas":false},"has_cli":{"value":true,"source":"package.json:bin|scripts","observed_at":"2026-09-20T05:08:27.724Z"},"languages":{"value":["typescript","javascript"],"source":"github.language+package.json","observed_at":"2026-09-20T05:08:27.724Z"},"has_docker":{"value":true,"source":"dockerfile:Dockerfile","observed_at":"2026-09-20T05:08:27.724Z"},"license_spdx":{"value":"Unlicense","source":"github.license","observed_at":"2026-09-20T05:08:27.724Z"}},"decision_facts":{"hosting":null,"pricing":null,"requirements":null,"constraints":null,"when_to_use":["You aim to develop an interactive dating simulation leveraging LLM technology.","Your project requires a self-contained installation without system-wide changes.","Testing or running on mobile devices, such as Android phones via Termux."],"when_not_to_use":["Seeking a tool with extensive non-dating game functionalities.","If you need more direct control over the environment setup rather than using provided scripts."],"source":"enrich:decision_facts","observed_at":"2026-07-17T13:48:36.088Z"},"constraint_facets":null,"decision_summary":[{"label":"Adopt for","value":"LLM-powered dating simulator built with TypeScript."}]}}