{"id":17815874,"url":"https://github.com/bmorphism/c-house-town","last_synced_at":"2025-10-10T09:05:29.596Z","repository":{"id":250219784,"uuid":"833816074","full_name":"bmorphism/c-house-town","owner":"bmorphism","description":null,"archived":false,"fork":false,"pushed_at":"2024-07-25T21:13:04.000Z","size":18244,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-06T11:45:56.404Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/bmorphism.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-07-25T20:10:35.000Z","updated_at":"2025-09-25T16:17:03.000Z","dependencies_parsed_at":"2024-07-26T00:10:41.587Z","dependency_job_id":null,"html_url":"https://github.com/bmorphism/c-house-town","commit_stats":null,"previous_names":["bmorphism/c-house-town"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/bmorphism/c-house-town","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmorphism%2Fc-house-town","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmorphism%2Fc-house-town/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmorphism%2Fc-house-town/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmorphism%2Fc-house-town/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/bmorphism","download_url":"https://codeload.github.com/bmorphism/c-house-town/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/bmorphism%2Fc-house-town/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279003390,"owners_count":26083579,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-10T02:00:06.843Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-27T16:25:13.372Z","updated_at":"2025-10-10T09:05:29.572Z","avatar_url":"https://github.com/bmorphism.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# AI Town 🏠💻💌\n\n[Live Demo](https://www.convex.dev/ai-town)\n\n[Join our community Discord: AI Stack Devs](https://discord.gg/PQUmTBTGmT)\n\n\u003cimg width=\"1454\" alt=\"Screen Shot 2023-08-14 at 10 01 00 AM\" src=\"https://github.com/a16z-infra/ai-town/assets/3489963/a4c91f17-23ed-47ec-8c4e-9f9a8505057d\"\u003e\n\nAI Town is a virtual town where AI characters live, chat and socialize.\n\nThis project is a deployable starter kit for easily building and customizing your own version of AI town.\nInspired by the research paper [_Generative Agents: Interactive Simulacra of Human Behavior_](https://arxiv.org/pdf/2304.03442.pdf).\n\nThe primary goal of this project, beyond just being a lot of fun to work on,\nis to provide a platform with a strong foundation that is meant to be extended.\nThe back-end natively supports shared global state, transactions, and a simulation engine\nand should be suitable from everything from a simple project to play around with to a scalable, multi-player game.\nA secondary goal is to make a JS/TS framework available as most simulators in this space\n(including the original paper above) are written in Python.\n\n## Overview\n\n- 💻 [Stack](#stack)\n- 🧠 [Installation](#installation)\n- 🐳 [Docker Installation](#docker-installation)\n- 💻️ [Windows Installation](#windows-installation)\n- 👤 [Customize - run YOUR OWN simulated world](#customize-your-own-simulation)\n- 👩‍💻 [Deploying](#deploy-the-app)\n- 🏆 [Credits](#credits)\n\n## Stack\n\n- Game engine, database, and vector search: [Convex](https://convex.dev/)\n- Auth (Optional): [Clerk](https://clerk.com/)\n- Default chat model is `llama3` and embeddings with `mxbai-embed-large`.\n- Local inference: [Ollama](https://github.com/jmorganca/ollama)\n- Configurable for other cloud LLMs: [Together.ai](https://together.ai/) or anything\n  that speaks the [OpenAI API](https://platform.openai.com/).\n  PRs welcome to add more cloud provider support.\n- Pixel Art Generation: [Replicate](https://replicate.com/), [Fal.ai](https://serverless.fal.ai/lora)\n- Background Music Generation: [Replicate](https://replicate.com/) using [MusicGen](https://huggingface.co/spaces/facebook/MusicGen)\n\n## Installation\n\n**Note**: There is a one-click install of a fork of this project on\n[Pinokio](https://pinokio.computer/item?uri=https://github.com/cocktailpeanutlabs/aitown)\nfor anyone interested in running but not modifying it 😎\n\n### 1. Clone repo and Install packages\n\n```bash\ngit clone https://github.com/a16z-infra/ai-town.git\ncd ai-town\nnpm install\n```\n\n### 2. To develop locally with [Convex](https://convex.dev):\n\nEither\n[download a pre-built binary(recommended)](https://github.com/get-convex/convex-backend/releases),\nor [build it from source and run it](https://stack.convex.dev/building-the-oss-backend).\n\n```sh\n# For new Macs:\ncurl  -L -O https://github.com/get-convex/convex-backend/releases/latest/download/convex-local-backend-aarch64-apple-darwin.zip\nunzip convex-local-backend-aarch64-apple-darwin.zip\n\nbrew install just\n\n# Runs the server\n./convex-local-backend\n```\n\nThis also [installs `just`](https://github.com/casey/just?tab=readme-ov-file#installation)\n(e.g. `brew install just` or `cargo install just`).\nWe use `just` like `make` to add extra params, so you run `just convex ...`\ninstead of `npx convex ...` for local development.\n\nIf you're running the pre-built binary on Mac and there's an Apple warning,\ngo to the folder it's in and right-click it and select \"Open\" to bypass.\nFrom then on you can run it from the commandline.\nOr you can compile it from source and run it (see above).\n\n### 3. To run a local LLM, download and run [Ollama](https://ollama.com/).\n\nYou can leave the app running or run `ollama serve`.\n`ollama serve` will warn you if the app is already running.\nRun `ollama pull llama3` to have it download `llama3`.\nTest it out with `ollama run llama3`.\nIf you want to customize which model to use, adjust convex/util/llm.ts or set\n`just convex env set LLM_MODEL # model`.\nOllama model options can be found [here](https://ollama.ai/library).\n\nYou might want to set `NUM_MEMORIES_TO_SEARCH` to `1` in constants.ts,\nto reduce the size of conversation prompts, if you see slowness.\n\nCheck out `convex/config.ts` to configure which models to offer to the UI,\nor to set it up to talk to a cloud-hosted LLM.\n\n### 4. Adding background music with Replicate (Optional)\n\nFor Daily background music generation, create a\n[Replicate](https://replicate.com/) account and create a token in your Profile's\n[API Token page](https://replicate.com/account/api-tokens).\n`just convex env set REPLICATE_API_TOKEN # token`\n\n### 5. Run the code\n\nTo run both the front and and back end:\n\n```bash\nnpm run dev\n```\n\n**Note**: If you encounter a node version error on the convex server upon application startup, please use node version 18, which is the most stable. One way to do this is by [installing nvm](https://nodejs.org/en/download/package-manager) and running `nvm install 18` or `nvm use 18`. Do this before both the `npm run dev` above and the `./convex-local-backend` in Step 2.\n\nYou can now visit http://localhost:5173.\n\nIf you'd rather run the frontend in a separate terminal from Convex (which syncs\nyour backend functions as they're saved), you can run these two commands:\n\n```bash\nnpm run dev:frontend\nnpm run dev:backend\n```\n\nSee package.json for details, but dev:backend runs `just convex dev`\n\n**Note**: The simulation will pause after 5 minutes if the window is idle.\nLoading the page will unpause it.\nYou can also manually freeze \u0026 unfreeze the world with a button in the UI.\nIf you want to run the world without the\nbrowser, you can comment-out the \"stop inactive worlds\" cron in `convex/crons.ts`.\n\n### Various commands to run / test / debug\n\n**To stop the back end, in case of too much activity**\n\nThis will stop running the engine and agents. You can still run queries and\nrun functions to debug.\n\n```bash\njust convex run testing:stop\n```\n\n**To restart the back end after stopping it**\n\n```bash\njust convex run testing:resume\n```\n\n**To kick the engine in case the game engine or agents aren't running**\n\n```bash\njust convex run testing:kick\n```\n\n**To archive the world**\n\nIf you'd like to reset the world and start from scratch, you can archive the current world:\n\n```bash\njust convex run testing:archive\n```\n\nThen, you can still look at the world's data in the dashboard, but the engine and agents will\nno longer run.\n\nYou can then create a fresh world with `init`.\n\n```bash\njust convex run init\n```\n\n**To clear all databases**\n\nYou can wipe all tables with the `wipeAllTables` testing function.\n\n```bash\njust convex run testing:wipeAllTables\n```\n\n**To pause your backend deployment**\n\nYou can go to the [dashboard](https://dashboard.convex.dev) to your deployment\nsettings to pause and un-pause your deployment. This will stop all functions, whether invoked\nfrom the client, scheduled, or as a cron job. See this as a last resort, as\nthere are gentler ways of stopping above. Once you\n\n## Docker Installation\n\n### Before Launching Docker\n\nModify your `package.json` file to add the `--host` option to your front-end server (Vite):\n\n```json\n{\n  \"name\": \"ai-town\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"dev\": \"npm-run-all --parallel dev:frontend dev:backend\",\n    \"build\": \"tsc \u0026\u0026 vite build\",\n    \"lint\": \"eslint .\",\n    \"predev\": \"just convex dev --run init --until-success\",\n    \"dev:backend\": \"just convex dev --tail-logs\",\n    \"dev:frontend\": \"vite --host\", // \u003c------------------------------------------ modify this line\n    \"test\": \"NODE_OPTIONS=--experimental-vm-modules jest --verbose\",\n    \"le\": \"vite src/editor/\"\n  }\n}\n```\n\n### Launching Docker Compose\n\nRun the following command to launch Docker Compose:\n```sh\ndocker-compose up --build\n```\n\nOnce completed, you can close the terminal.\n\n### Launching an Interactive Docker Terminal\n\nIn another terminal, still in the `aitown` directory, launch an interactive Docker terminal:\n```bash\ndocker-compose exec ai-town /bin/bash\n```\n\n### Running Locally\n\n1. Download and unzip the local Convex backend:\n    ```bash\n    curl -L -O https://github.com/get-convex/convex-backend/releases/download/precompiled-2024-06-28-91981ab/convex-local-backend-x86_64-unknown-linux-gnu.zip\n    unzip convex-local-backend-x86_64-unknown-linux-gnu.zip\n    ```\n   \n2. Verify the `convex-local-backend` file is in the directory, then remove the zip file:\n    ```bash\n    rm convex-local-backend-x86_64-unknown-linux-gnu.zip\n    ```\n\n3. Make the file executable:\n    ```bash\n    chmod +x /usr/src/app/convex-local-backend\n    ```\n\n4. Launch the Convex backend server:\n    ```bash\n    ./convex-local-backend\n    ```\n\n### Relaunching an Interactive Docker Terminal for aitown server\n\nIn another terminal, in the `aitown` directory, relaunch:\n```sh\ndocker-compose exec ai-town /bin/bash\n```\n\n### Configuring Socat\n\nConfigure `socat` with the host's IP address:\n\n```sh\nHOST_IP=YOUR-HOST-IP  # Use your host's IP address (not the Docker IP)\nsocat TCP-LISTEN:11434,fork TCP:$HOST_IP:11434 \u0026\n```\n\n### Testing the Connection\n\nTest the connection:\n```bash\ncurl http://localhost:11434/\n```\n\nIf it says \"Ollama is running\", it's good!\n\n### Starting Services\n\nMake sure Convex knows where to find Ollama (to skip a random mysterious bug ...):\n```bash\njust convex env set OLLAMA_HOST http://localhost:11434\n```\n\nUpdate the browser list:\n```bash\nnpx update-browserslist-db@latest\n```\n\nLaunch AI Town:\n```bash\nnpm run dev\n```\n\n### For relaunching\nlaunch container then \nSimply open two terminal in your AI-town folder with docker-compose exec ai-town /bin/bash\n\nLaunch the Convex backend server:\n    ```bash\n    ./convex-local-backend\n    ```\nAnd in the second terminal simply Configuring Socat, Launch AI Town.\n\n## Windows Installation\n\n### Prerequisites\n\n1. **Windows 10/11 with WSL2 installed**\n2. **Internet connection**\n\n### 1. Install WSL2\n\nFirst, you need to install WSL2. Follow [this guide](https://docs.microsoft.com/en-us/windows/wsl/install) to set up WSL2 on your Windows machine. We recommend using Ubuntu as your Linux distribution.\n\n### 2. Update Packages\n\nOpen your WSL terminal (Ubuntu) and update your packages:\n\n    sudo apt update\n\n### 3. Install NVM and Node.js\n\nNVM (Node Version Manager) helps manage multiple versions of Node.js. Install NVM and Node.js 18 (the stable version):\n\n    curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash\n    export NVM_DIR=\"$([ -z \"${XDG_CONFIG_HOME-}\" ] \u0026\u0026 printf %s \"${HOME}/.nvm\" || printf %s \"${XDG_CONFIG_HOME}/nvm\")\"\n    [ -s \"$NVM_DIR/nvm.sh\" ] \u0026\u0026 \\. \"$NVM_DIR/nvm.sh\"\n    source ~/.bashrc\n    nvm install 18\n    nvm use 18\n\n### 4. Install Python and Pip\n\nPython is required for some dependencies. Install Python and Pip:\n\n    sudo apt-get install python3 python3-pip\n    sudo ln -s /usr/bin/python3 /usr/bin/python\n\n### 5. Install Additional Tools\n\nInstall `unzip` and `socat`:\n\n    sudo apt install unzip socat\n\n### 6. Install Rust and Cargo\n\nCargo is the Rust package manager. Install Rust and Cargo:\n\n    curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n    source $HOME/.cargo/env\n\n### 7. Install `just` with Cargo\n\n`just` is used to run commands. Install it with Cargo:\n\n    cargo install just\n    export PATH=\"$HOME/.cargo/bin:$PATH\"\n    just --version\n\n### 8. Configure `socat` to Bridge Ports for Ollama\n\nRun the following command to bridge ports, allowing communication between Convex and Ollama:\n\n    socat TCP-LISTEN:11434,fork TCP:$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):11434 \u0026\n\nTest if it's working:\n\n    curl http://127.0.0.1:11434\n\nIf it responds OK, the Ollama API is accessible.\n\n### 9. Clone the AI Town Repository\n\nClone the AI Town repository from GitHub:\n\n    git clone https://github.com/a16z-infra/ai-town.git\n    cd ai-town\n\n### 10. Install NPM Packages\n\nInstall the necessary npm packages:\n\n    npm install\n\n### 11. Install Precompiled Convex\n\nDownload and install the precompiled version of Convex:\n\n    curl -L -O https://github.com/get-convex/convex-backend/releases/download/precompiled-2024-06-28-91981ab/convex-local-backend-x86_64-unknown-linux-gnu.zip\n    unzip convex-local-backend-x86_64-unknown-linux-gnu.zip\n    rm convex-local-backend-x86_64-unknown-linux-gnu.zip\n    chmod +x convex-local-backend\n\n### 12. Launch Convex\n\nIn a separate terminal, launch Convex:\n\n    ./convex-local-backend\n\n### 13. Configure Convex to Use Ollama\n\nSet the Ollama host in Convex:\n\n    just convex env set OLLAMA_HOST http://localhost:11434\n\n### 14. Launch AI Town\n\nFinally, launch AI Town:\n\n    npm run dev\n\nVisit `http://localhost:5173` in your browser to see AI Town in action.\n\n### Relaunching AI Town on windows WSL : \n\nIf you need to restart the services:\n\n1. Ensure `socat` is running:\n\n    socat TCP-LISTEN:11434,fork TCP:$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):11434 \u0026\n\n2. Launch Convex:\n\n    ./convex-local-backend\n\nIn another terminal : \n3. Launch AI Town:\n\n    npm run dev\n\n\n\n\n## Customize your own simulation\n\nNOTE: every time you change character data, you should re-run\n`just convex run testing:wipeAllTables` and then\n`npm run dev` to re-upload everything to Convex.\nThis is because character data is sent to Convex on the initial load.\nHowever, beware that `just convex run testing:wipeAllTables` WILL wipe all of your data.\n\n1. Create your own characters and stories: All characters and stories, as well as their spritesheet references are stored in [characters.ts](./data/characters.ts). You can start by changing character descriptions.\n\n2. Updating spritesheets: in `data/characters.ts`, you will see this code:\n\n```ts\nexport const characters = [\n  {\n    name: 'f1',\n    textureUrl: '/assets/32x32folk.png',\n    spritesheetData: f1SpritesheetData,\n    speed: 0.1,\n  },\n  ...\n];\n```\n\nYou should find a sprite sheet for your character, and define sprite motion / assets in the corresponding file (in the above example, `f1SpritesheetData` was defined in f1.ts)\n\n3. Update the Background (Environment): The map gets loaded in `convex/init.ts` from `data/gentle.js`. To update the map, follow these steps:\n\n   - Use [Tiled](https://www.mapeditor.org/) to export tilemaps as a JSON file (2 layers named bgtiles and objmap)\n   - Use the `convertMap.js` script to convert the JSON to a format that the engine can use.\n\n```console\nnode data/convertMap.js \u003cmapDataPath\u003e \u003cassetPath\u003e \u003ctilesetpxw\u003e \u003ctilesetpxh\u003e\n```\n\n- `\u003cmapDataPath\u003e`: Path to the Tiled JSON file.\n- `\u003cassetPath\u003e`: Path to tileset images.\n- `\u003ctilesetpxw\u003e`: Tileset width in pixels.\n- `\u003ctilesetpxh\u003e`: Tileset height in pixels.\n  Generates `converted-map.js` that you can use like `gentle.js`\n\n4. Change the background music by modifying the prompt in `convex/music.ts`\n5. Change how often to generate new music at `convex/crons.ts` by modifying the `generate new background music` job\n\n## Using a cloud AI Provider\n\nConfigure `convex/util/llm.ts` or set these env variables:\n\n```sh\njust convex env set LLM_API_HOST # url\njust convex env set LLM_MODEL # model\n```\n\nThe embeddings model config needs to be changed [in code](./convex/util/llm.ts),\nsince you need to specify the embeddings dimension.\n\n### Keys\n\nFor Together.ai, visit https://api.together.xyz/settings/api-keys\nFor OpenAI, visit https://platform.openai.com/account/api-keys\n\n## Using hosted Convex\n\nYou can run your Convex backend in the cloud by just running\n\n```sh\nnpx convex dev --until-success --configure\n```\n\nAnd updating the `package.json` scripts to remove `just`:\nchange `just convex ...` to `convex ...`.\n\nYou'll then need to set any environment variables you had locally in the cloud\nenvironment with `npx convex env set` or on the dashboard:\nhttps://dashboard.convex.dev/deployment/settings/environment-variables\n\n## Deploy the app\n\n### Deploy Convex functions to prod environment\n\nBefore you can run the app, you will need to make sure the Convex functions are deployed to its production environment.\n\n1. Run `npx convex deploy` to deploy the convex functions to production\n2. Run `npx convex run init --prod`\n\nIf you have existing data you want to clear, you can run `npx convex run testing:wipeAllTables --prod`\n\n### Adding Auth (Optional)\n\nYou can add clerk auth back in with `git revert b44a436`.\nOr just look at that diff for what changed to remove it.\n\n**Make a Clerk account**\n\n- Go to https://dashboard.clerk.com/ and click on \"Add Application\"\n- Name your application and select the sign-in providers you would like to offer users\n- Create Application\n- Add `VITE_CLERK_PUBLISHABLE_KEY` and `CLERK_SECRET_KEY` to `.env.local`\n\n```bash\nVITE_CLERK_PUBLISHABLE_KEY=pk_***\nCLERK_SECRET_KEY=sk_***\n```\n\n- Go to JWT Templates and create a new Convex Template.\n- Copy the JWKS endpoint URL for use below.\n\n```sh\njust convex env set CLERK_ISSUER_URL # e.g. https://your-issuer-url.clerk.accounts.dev/\n```\n\n### Deploy to Vercel\n\n- Register an account on Vercel and then [install the Vercel CLI](https://vercel.com/docs/cli).\n- **If you are using Github Codespaces**: You will need to [install the Vercel CLI](https://vercel.com/docs/cli) and authenticate from your codespaces cli by running `vercel login`.\n- Deploy the app to Vercel with `vercel --prod`.\n\n## Using local inference from a cloud deployment.\n\nWe support using [Ollama](https://github.com/jmorganca/ollama) for conversation generations.\nTo have it accessible from the web, you can use Tunnelmole or Ngrok or similar.\n\n**Using Tunnelmole**\n\n[Tunnelmole](https://github.com/robbie-cahill/tunnelmole-client) is an open source tunneling tool.\n\nYou can install Tunnelmole using one of the following options:\n\n- NPM: `npm install -g tunnelmole`\n- Linux: `curl -s https://tunnelmole.com/sh/install-linux.sh | sudo bash`\n- Mac: `curl -s https://tunnelmole.com/sh/install-mac.sh --output install-mac.sh \u0026\u0026 sudo bash install-mac.sh`\n- Windows: Install with NPM, or if you don't have NodeJS installed, download the `exe` file for Windows [here](https://tunnelmole.com/downloads/tmole.exe) and put it somewhere in your PATH.\n\nOnce Tunnelmole is installed, run the following command:\n\n```\ntmole 11434\n```\n\nTunnelmole should output a unique url once you run this command.\n\n**Using Ngrok**\n\nNgrok is a popular closed source tunneling tool.\n\n- [Install Ngrok](https://ngrok.com/docs/getting-started/)\n\nOnce ngrok is installed and authenticated, run the following command:\n\n```\nngrok http http://localhost:11434\n```\n\nNgrok should output a unique url once you run this command.\n\n**Add Ollama endpoint to Convex**\n\n```sh\njust convex env set OLLAMA_HOST # your tunnelmole/ngrok unique url from the previous step\n```\n\n**Update Ollama domains**\n\nOllama has a list of accepted domains. Add the ngrok domain so it won't reject\ntraffic. see ollama.ai for more details.\n\n## Credits\n\n- All interactions, background music and rendering on the \u003cGame/\u003e component in the project are powered by [PixiJS](https://pixijs.com/).\n- Tilesheet:\n  - https://opengameart.org/content/16x16-game-assets by George Bailey\n  - https://opengameart.org/content/16x16-rpg-tileset by hilau\n- We used https://github.com/pierpo/phaser3-simple-rpg for the original POC of this project. We have since re-wrote the whole app, but appreciated the easy starting point\n- Original assets by [ansimuz](https://opengameart.org/content/tiny-rpg-forest)\n- The UI is based on original assets by [Mounir Tohami](https://mounirtohami.itch.io/pixel-art-gui-elements)\n\n# 🧑‍🏫 What is Convex?\n\n[Convex](https://convex.dev) is a hosted backend platform with a\nbuilt-in database that lets you write your\n[database schema](https://docs.convex.dev/database/schemas) and\n[server functions](https://docs.convex.dev/functions) in\n[TypeScript](https://docs.convex.dev/typescript). Server-side database\n[queries](https://docs.convex.dev/functions/query-functions) automatically\n[cache](https://docs.convex.dev/functions/query-functions#caching--reactivity) and\n[subscribe](https://docs.convex.dev/client/react#reactivity) to data, powering a\n[realtime `useQuery` hook](https://docs.convex.dev/client/react#fetching-data) in our\n[React client](https://docs.convex.dev/client/react). There are also clients for\n[Python](https://docs.convex.dev/client/python),\n[Rust](https://docs.convex.dev/client/rust),\n[ReactNative](https://docs.convex.dev/client/react-native), and\n[Node](https://docs.convex.dev/client/javascript), as well as a straightforward\n[HTTP API](https://docs.convex.dev/http-api/).\n\nThe database supports\n[NoSQL-style documents](https://docs.convex.dev/database/document-storage) with\n[opt-in schema validation](https://docs.convex.dev/database/schemas),\n[relationships](https://docs.convex.dev/database/document-ids) and\n[custom indexes](https://docs.convex.dev/database/indexes/)\n(including on fields in nested objects).\n\nThe\n[`query`](https://docs.convex.dev/functions/query-functions) and\n[`mutation`](https://docs.convex.dev/functions/mutation-functions) server functions have transactional,\nlow latency access to the database and leverage our\n[`v8` runtime](https://docs.convex.dev/functions/runtimes) with\n[determinism guardrails](https://docs.convex.dev/functions/runtimes#using-randomness-and-time-in-queries-and-mutations)\nto provide the strongest ACID guarantees on the market:\nimmediate consistency,\nserializable isolation, and\nautomatic conflict resolution via\n[optimistic multi-version concurrency control](https://docs.convex.dev/database/advanced/occ) (OCC / MVCC).\n\nThe [`action` server functions](https://docs.convex.dev/functions/actions) have\naccess to external APIs and enable other side-effects and non-determinism in\neither our\n[optimized `v8` runtime](https://docs.convex.dev/functions/runtimes) or a more\n[flexible `node` runtime](https://docs.convex.dev/functions/runtimes#nodejs-runtime).\n\nFunctions can run in the background via\n[scheduling](https://docs.convex.dev/scheduling/scheduled-functions) and\n[cron jobs](https://docs.convex.dev/scheduling/cron-jobs).\n\nDevelopment is cloud-first, with\n[hot reloads for server function](https://docs.convex.dev/cli#run-the-convex-dev-server) editing via the\n[CLI](https://docs.convex.dev/cli),\n[preview deployments](https://docs.convex.dev/production/hosting/preview-deployments),\n[logging and exception reporting integrations](https://docs.convex.dev/production/integrations/),\nThere is a\n[dashboard UI](https://docs.convex.dev/dashboard) to\n[browse and edit data](https://docs.convex.dev/dashboard/deployments/data),\n[edit environment variables](https://docs.convex.dev/production/environment-variables),\n[view logs](https://docs.convex.dev/dashboard/deployments/logs),\n[run server functions](https://docs.convex.dev/dashboard/deployments/functions), and more.\n\nThere are built-in features for\n[reactive pagination](https://docs.convex.dev/database/pagination),\n[file storage](https://docs.convex.dev/file-storage),\n[reactive text search](https://docs.convex.dev/text-search),\n[vector search](https://docs.convex.dev/vector-search),\n[https endpoints](https://docs.convex.dev/functions/http-actions) (for webhooks),\n[snapshot import/export](https://docs.convex.dev/database/import-export/),\n[streaming import/export](https://docs.convex.dev/production/integrations/streaming-import-export), and\n[runtime validation](https://docs.convex.dev/database/schemas#validators) for\n[function arguments](https://docs.convex.dev/functions/args-validation) and\n[database data](https://docs.convex.dev/database/schemas#schema-validation).\n\nEverything scales automatically, and it’s [free to start](https://www.convex.dev/plans).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmorphism%2Fc-house-town","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbmorphism%2Fc-house-town","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbmorphism%2Fc-house-town/lists"}