{"id":13569162,"url":"https://github.com/cfoust/sour","last_synced_at":"2025-04-04T05:31:39.680Z","repository":{"id":41370509,"uuid":"396077321","full_name":"cfoust/sour","owner":"cfoust","description":"Sauerbraten for the web in a single Docker image.","archived":false,"fork":false,"pushed_at":"2024-11-30T11:06:46.000Z","size":432081,"stargazers_count":160,"open_issues_count":32,"forks_count":31,"subscribers_count":6,"default_branch":"main","last_synced_at":"2024-11-30T12:18:54.298Z","etag":null,"topics":["cube","emscripten","first-person-shooter","game","golang","metaverse","multiplatform","multiplayer","typescript"],"latest_commit_sha":null,"homepage":"https://sourga.me/","language":"C++","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/cfoust.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":"2021-08-14T17:19:29.000Z","updated_at":"2024-11-30T11:06:50.000Z","dependencies_parsed_at":"2024-01-14T03:48:53.561Z","dependency_job_id":"a4d6802c-c20d-4345-b66b-9bce2b225667","html_url":"https://github.com/cfoust/sour","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfoust%2Fsour","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfoust%2Fsour/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfoust%2Fsour/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfoust%2Fsour/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cfoust","download_url":"https://codeload.github.com/cfoust/sour/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247128702,"owners_count":20888232,"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","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":["cube","emscripten","first-person-shooter","game","golang","metaverse","multiplatform","multiplayer","typescript"],"created_at":"2024-08-01T14:00:36.606Z","updated_at":"2025-04-04T05:31:39.663Z","avatar_url":"https://github.com/cfoust.png","language":"C++","funding_links":[],"categories":["Projects"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://sourga.me\" target=\"_blank\"\u003e\n        \u003cimg src=\"gh-assets/header.png\" alt=\"Sour Cover Image\"\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://discord.gg/WP3EbYym4M\"\u003e\u003cimg src=\"https://img.shields.io/discord/1071091858576523274?color=5865F2\u0026label=discord\u0026style=flat-square\" alt=\"Discord\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/cfoust/sour/releases\"\u003e\u003cimg src=\"https://img.shields.io/github/downloads/cfoust/sour/latest/total?style=flat-square\" alt=\"sour releases\" /\u003e\u003c/a\u003e\n    \u003ca href=\"https://github.com/cfoust/sour/blob/main/LICENSE\"\u003e\u003cimg src=\"https://img.shields.io/github/license/cfoust/sour?color=48AC75\u0026style=flat-square\" alt=\"sour License Badge MIT\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## What is this?\n\nSour is a \u003ca target=\"_blank\" href=\"http://sauerbraten.org/\"\u003eCube 2: Sauerbraten\u003c/a\u003e server that serves a fully-featured web-version of Sauerbraten (with support for mobile devices) in addition to accepting connections from the traditional, desktop version of the game. Sour is the easiest way to play Sauerbraten with your friends.\n\n\u003ca target=\"_blank\" href=\"https://sourga.me/\"\u003eGive it a try.\u003c/a\u003e\n\n## Installation\n\nYou can download an archive containing the Sour server and all necessary assets from [the releases page](https://github.com/cfoust/sour/releases). For now, only Linux and macOS are supported.\n\nYou can also install Sour via `brew`:\n\n```bash\n# Install the latest version:\nbrew install cfoust/taps/sour\n\n# Or a specific one:\nbrew install cfoust/taps/sour@0.2.2\n```\n\nIn addition to all of the base game assets, these archives only contain three maps: `complex`, `dust2`, and `turbine`.\n\n## Running Sour\n\nTo run Sour, extract a release archive anywhere you wish, navigate to that directory, and run `./sour`. If you installed Sour with `brew`, just run `sour` in any terminal session.\n\nRunning `sour` will start a Sour server accessible to web clients at `http://0.0.0.0:1337` and to desktop clients on port 28785. In other words, you should be able to connect to the Sour server in the Sauerbraten desktop client by running `/connect localhost`.\n\nBy serving on `0.0.0.0` by default, the Sour server will be available to other devices on the local network at IP of the device running the Sour server.\n\n## Configuration\n\nSour is highly configurable. When run without arguments, `sour` defaults to running `sour serve` with the [default Sour configuration](https://github.com/cfoust/sour/blob/main/pkg/config/default.yaml). You change Sour's configuration by providing the path to a configuration file to `sour serve`:\n\n```bash\nsour serve config.yaml\n```\n\nSour can be configured using `.yaml` or `.json` files; the structure is the same in both cases.\n\nTo print the default configuration to standard output, run `sour config`:\n\n```bash\nsour config \u003e config.yaml\n```\n\nSour also supports merging configurations together.\n\n```bash\nsour serve config_a.yaml some_path/config_b.json config_c.yaml\n```\n\nThese configurations are merged from left to right using [CUE](https://cuelang.org/docs/). In other words, configurations are evaluated in order from left to right. CUE merges JSON data by overwriting values (if they're scalar, such as strings, booleans, and numbers) or combining values (if they're arrays). In effect, this means that configurations can specify values for only a subset of properties without problems.\n\n## Goals\n\n- **Modernize Sauerbraten.** The gaming landscape has changed. Provide a modern multiplayer experience with matchmaking, private games, rankings, and seamless collaboration on maps. Make as much of this functionality available to the unmodified desktop game as possible.\n- **Preserve the experience of playing the original game.** While it is possible that Sour may someday support arbitrary game modes, assets, clients, and server code, the vanilla game experience should still be available.\n- **Be the best example of a cross-platform, open-source FPS.** Deployment of Sour on your own infrastructure with whatever configuration you like should be easy. Every aspect of Sour should be configurable.\n\n## Architecture\n\nHere is a high level description of the repository's contents:\n\n- `pkg` and `cmd`: All Go code used in Sour and its services.\n  - `cmd/sourdump`: A Go program that calculates the minimum list of files necessary for the game to load a given map.\n  - `cmd/sour`: The Sour game server, which provides a number of services to web clients:\n    - Gives clients both on the web and desktop client access to game servers managed by Sour.\n- `game`: All of the Cube 2 code and Emscripten compilation scripts. Originally this was a fork of [BananaBread](https://github.com/kripken/BananaBread), kripken's original attempt at compiling Sauerbraten for the web. Since then I have upgraded the game to the newest mainline version several times and moved to WebGL2.\n- `client`: A React web application that uses the compiled Sauerbraten game found in `game`, pulls assets, and proxies all server communication over a WebSocket.\n- `assets`: Scripts for building web-compatible game assets. This is an extremely complicated topic and easily the most difficult aspect of shipping Sauerbraten to the web. Check out this [section's README](services/assets) for more information.\n\n## Contributing\n\nJoin us on [Discord](https://discord.gg/WP3EbYym4M) to chat with us and see how you can help out! Check out the [issues tab](https://github.com/cfoust/sour/issues) to get an idea of what needs doing.\n\n## Inspiration\n\nSome years ago I came across [BananaBread](https://github.com/kripken/BananaBread), which was a basic tech demo that used [Emscripten](https://emscripten.org/) to compile Sauerbraten for the web. The project was limited in scope and done at a time when bandwidth was a lot more precious.\n\n## License\n\nEach project that was forked into this repository has its own original license intact, though the glue code and subsequent modifications I have made are licensed according to the MIT license specified in `LICENSE`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfoust%2Fsour","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcfoust%2Fsour","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfoust%2Fsour/lists"}