{"id":19764268,"url":"https://github.com/theobori/nix-teeworlds","last_synced_at":"2026-06-07T22:31:51.602Z","repository":{"id":261865337,"uuid":"882498764","full_name":"theobori/nix-teeworlds","owner":"theobori","description":"A Teeworlds server-side management for the Nix ecosystem","archived":false,"fork":false,"pushed_at":"2024-11-09T18:33:00.000Z","size":36,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-28T10:37:51.064Z","etag":null,"topics":["nix","nix-flake","nixos-module","teeworlds-server"],"latest_commit_sha":null,"homepage":"","language":"Nix","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/theobori.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","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-11-02T23:51:00.000Z","updated_at":"2024-11-19T22:07:05.000Z","dependencies_parsed_at":null,"dependency_job_id":"fbf26d33-e4b2-4d70-9c3e-ed687caa06f8","html_url":"https://github.com/theobori/nix-teeworlds","commit_stats":null,"previous_names":["theobori/nix-teeworlds"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/theobori/nix-teeworlds","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Fnix-teeworlds","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Fnix-teeworlds/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Fnix-teeworlds/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Fnix-teeworlds/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theobori","download_url":"https://codeload.github.com/theobori/nix-teeworlds/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Fnix-teeworlds/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34041087,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-07T02:00:07.652Z","response_time":124,"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":["nix","nix-flake","nixos-module","teeworlds-server"],"created_at":"2024-11-12T04:12:59.077Z","updated_at":"2026-06-07T22:31:51.596Z","avatar_url":"https://github.com/theobori.png","language":"Nix","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Nix Teeworlds\n\n[![check](https://github.com/theobori/nix-teeworlds/actions/workflows/check.yml/badge.svg)](https://github.com/theobori/nix-teeworlds/actions/workflows/check.yml)\n\nThe aim of this project is to be able to declare Teeworlds servers in Nix. To achieve this, this repository provides various Nix expressions, including a NixOS module, packages for different Teeworlds game modes and default overlays adding these packages.\n\nThe module is designed to be flexible, so it's entirely possible to use your own Teeworlds resources, such as a custom data folder, your own server configuration, your own packages and much more.\n\nThe NixOS `nix-teeworlds` module is inspired by [nix-minecraft](https://github.com/Infinidoge/nix-minecraft) and the [teeworlds](https://github.com/NixOS/nixpkgs/blob/master/nixos/modules/services/games/teeworlds.nix) module in the official Nix expression collection.\n\n## Installation\n\nInside your `flake.nix`, you can start by adding the following lines.\n\n```nix\n{\n  inputs = {\n    nix-teeworlds.url = \"github:theobori/nix-teeworlds\";\n  };\n}\n```\n\nYou can then include the module and its default overlay in the system configuration as shown below.\n\n```nix\n{ inputs, ... }: {\n  imports = with inputs; [ nix-teeworlds.nixosModules.nix-teeworlds ];\n  nixpkgs.overlays = with inputs; [ nix-teeworlds.overlays.default ];\n}\n```\n\n## Contribute\n\nIf you want to help the project, you can follow the guidelines in [CONTRIBUTING.md](./CONTRIBUTING.md).\n\n## Packages\n\nAll packages written in [packages](./packages) are compatible with the `nix run` command, even without specifying a Teeworlds server configuration file (like `autoexec.cfg`).\n\nFor example, you could create an [infclassR](https://github.com/infclass/teeworlds-infclassR) server with the following command.\n\n```bash\nnix run github:theobori/nix-teeworlds#infclassr-server\n```\n\nThe following packages are available.\n- `fixed-ddnet-server`\n- `fng2-server`\n- `infclassr-server`\n- `ddnet-insta-server`\n\n## Examples\n\nYou can find examples of how to configure `nix-teeworlds` in the folder [examples](./examples).\n\n## Module\n\n\u003e Make sure that all ports specified in a server configuration are also specified in the Nix configuration. Otherwise, they will not be authorized by the firewall.\n\u003e For example, if you have `sv_port 8304`, you must also have `services.nix-teeworlds.servers.\u003cname\u003e.settings.port = 8304` on the Nix side.\n\n### `services.nix-teeworlds.enable`\n\nWhether to enable Enable nix-teeworlds servers…\n\n*Type:* boolean\n\n*Default:* `false`\n\n*Example:* `true`\n\n### `services.nix-teeworlds.group`\n\nGroup under which the Teeworlds servers will run.\n\n*Type:* string\n\n*Default:* `\"nix-teeworlds\"`\n\n### `services.nix-teeworlds.openFirewall`\n\nWhether to open ports for each server.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.rootDir`\n\nDirectory where all server-related files will be stored.\n\n*Type:* string\n\n*Default:* `\"/srv/nix-teeworlds\"`\n\n### `services.nix-teeworlds.servers`\n\nAttribute set of Teeworlds server configurations.\n\nEach attribute defines a separate server instance with its own settings.\n\n*Type:* attribute set of (submodule)\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.enable`\n\nWhether to enable Enable this Teeworlds server…\n\n*Type:* boolean\n\n*Default:* `false`\n\n*Example:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.enableService`\n\nWhether to enable this server systemd service unit.\n\n*Type:* boolean\n\n*Default:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.package`\n\nThe teeworlds-server package to use.\n\n*Type:* package\n\n*Default:* `pkgs.teeworlds-server`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.binaryName`\n\nCustom binary name to use for the server executable.\n\nIf null, uses the default from the package.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.cfgName`\n\nServer configuration file name.\n\n*Type:* string\n\n*Default:* `\"server.cfg\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.dataDir`\n\nCustom data directory path for the server.\n\nIf null, uses the default from the package.\n\n*Type:* null or path or package or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole`\n\nExternal console configuration.\n\n*Type:* submodule\n\n*Default:* `{ }`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.enable`\n\nWhether to enable Enable the external console…\n\n*Type:* boolean\n\n*Default:* `false`\n\n*Example:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.authTimeout`\n\nTime in seconds before the the econ authentication times out.\n\n*Type:* signed integer\n\n*Default:* `30`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.banTime`\n\nThe time a client gets banned if econ authentication fails. 0 just closes the connection.\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.bindAddr`\n\nAddress to bind the external console to. Anything but ‘localhost’ is dangerous!\n\n*Type:* string\n\n*Default:* `\"localhost\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.outputLevel`\n\nAdjusts the amount of information in the external console.\n\n*Type:* signed integer\n\n*Default:* `1`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.password`\n\nExternal console password.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.externalConsole.port`\n\nPort to use for the external console.\n\n*Type:* signed integer\n\n*Default:* `1234`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.extraConfig`\n\nAdditional configuration lines to append to the server configuration.\n\n*Type:* null or strings concatenated with “\\\\n”\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game`\n\nGame configuration.\n\n*Type:* submodule\n\n*Default:* `{ }`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.countdown`\n\nNumber of seconds to freeze the game in a countdown before match starts (0 enables only for survival gamemodes, -1 disables).\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.gameType`\n\nGame type (This setting needs the map to be reloaded in order to take effect).\n\n*Type:* string\n\n*Default:* `\"dm\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.map`\n\nMap to use on the server.\n\n*Type:* string\n\n*Default:* `\"dm1\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.mapRotation`\n\nMaps to rotate between.\n\n*Type:* string\n\n*Default:* `\"\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.matchSwap`\n\nSwap teams between matches.\n\n*Type:* boolean\n\n*Default:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.matchesPerMap`\n\nNumber of matches on each map before rotating.\n\n*Type:* signed integer\n\n*Default:* `1`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.playerReadyMode`\n\nWhen enabled, players can pause/unpause the game and start the game on warmup via their ready state.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.playerSlots`\n\nNumber of slots to reserve for players.\n\n*Type:* signed integer\n\n*Default:* `8`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.powerups`\n\nAllow powerups like ninja.\n\n*Type:* boolean\n\n*Default:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.respawnDelayTDM`\n\nTime needed to respawn after death in tdm gametype.\n\n*Type:* signed integer\n\n*Default:* `3`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.scoreLimit`\n\nScore limit of the game (0 disables it).\n\n*Type:* signed integer\n\n*Default:* `20`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.strictSpectateMode`\n\nRestricts information like health, ammo and armour in spectator mode.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.teamDamage`\n\nTeam damage.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.teambalanceTime`\n\nHow many minutes to wait before autobalancing teams.\n\n*Type:* signed integer\n\n*Default:* `1`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.timeLimit`\n\nTime limit of the game (in case of equal points there will be sudden death) (0 disables).\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.tournamentMode`\n\nTournament mode. When enabled, players joins the server as spectator (2=additional restricted spectator chat).\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.voteSpectate`\n\nAllow voting to move players to spectators.\n\n*Type:* boolean\n\n*Default:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.voteSpectateRejoinDelay`\n\nHow many minutes to wait before a player can rejoin after being moved to spectators by vote.\n\n*Type:* signed integer\n\n*Default:* `3`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.game.warmup`\n\nNumber of seconds to do warmup before match starts (0 disables, -1 all players ready).\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.openFirewall`\n\nWhether to open ports in the firewall for this server.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.quickConfig`\n\nCustom configuration to use instead of the basic one.\n\nOnly used when useQuickConfig is enabled.\n\n*Type:* strings concatenated with “\\\\n”\n\n*Default:* `\"\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.remoteConsole`\n\nRemote console console configuration.\n\n*Type:* submodule\n\n*Default:* `{ }`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.remoteConsole.rconBanTime`\n\nThe time a client gets banned if remote console authentication fails. 0 makes it just use kick.\n\n*Type:* signed integer\n\n*Default:* `5`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.remoteConsole.rconMaxTries`\n\nMaximum number of tries for remote console authentication.\n\n*Type:* signed integer\n\n*Default:* `3`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.remoteConsole.rconModPassword`\n\nRemote console password for moderators (limited access).\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.remoteConsole.rconPassword`\n\nPassword to access the remote console (if not set, rcon is disabled).\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings`\n\nSettings configuration.\n\n*Type:* submodule\n\n*Default:* `{ }`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.enableSpamProtection`\n\nWhether to enable chat spam protection.\n\n*Type:* boolean\n\n*Default:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.bindAddress`\n\nAddress to bind.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.externalPort`\n\nPort to report to the master servers (e.g. in case of a firewall rename).\n\n*Type:* signed integer\n\n*Default:* `0`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.highBandwidth`\n\nUse high bandwidth mode. Doubles the bandwidth required for the server. LAN use only.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.hostname`\n\nServer hostname.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.inactiveKick`\n\nHow to deal with inactive clients (1=move player to spectator, 2=move to free spectator slot/kick, 3=kick).\n\n*Type:* one of 1, 2, 3\n\n*Default:* `2`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.inactiveKickSpec`\n\nKick inactive spectators.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.inactiveKickTime`\n\nHow many minutes to wait before taking care of inactive clients.\n\n*Type:* signed integer\n\n*Default:* `3`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.mapDownloadSpeed`\n\nNumber of map data packages a client gets on each request.\n\n*Type:* signed integer\n\n*Default:* `8`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.maxClients`\n\nNumber of clients that can be connected to the server at the same time.\n\n*Type:* signed integer\n\n*Default:* `12`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.maxClientsPerIp`\n\nMaximum number of clients with the same IP that can connect to the server.\n\n*Type:* signed integer\n\n*Default:* `4`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.motd`\n\nMessage of the day, shown in server info and when joining a server.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.name`\n\nName of the server.\n\n*Type:* string\n\n*Default:* `\"unnamed server\"`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.password`\n\nPassword to connect to the server.\n\n*Type:* null or string\n\n*Default:* `null`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.port`\n\nPort the server will listen on.\n\n*Type:* signed integer\n\n*Default:* `8303`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.settings.register`\n\nWhether to register this server on the masters servers.\n\n*Type:* boolean\n\n*Default:* `false`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.useQuickConfig`\n\nWhether to enable Enable quick configuration…\n\n*Type:* boolean\n\n*Default:* `false`\n\n*Example:* `true`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.votes`\n\nServer votes configuration.\n\n*Type:* attribute set of (submodule)\n\n*Default:* `{ }`\n\n### `services.nix-teeworlds.servers.\u003cname\u003e.votes.\u003cname\u003e.commands`\n\nList of command to execute when this vote is voted.\n\n*Type:* list of string\n\n### `services.nix-teeworlds.user`\n\nUser under which the Teeworlds servers will run.\n\n*Type:* string\n\n*Default:* `\"nix-teeworlds\"`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheobori%2Fnix-teeworlds","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheobori%2Fnix-teeworlds","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheobori%2Fnix-teeworlds/lists"}