{"id":16473395,"url":"https://github.com/vikpe/qw-hub-api","last_synced_at":"2026-03-02T22:06:54.579Z","repository":{"id":41302467,"uuid":"497018931","full_name":"vikpe/qw-hub-api","owner":"vikpe","description":"API serving QuakeWorld info.","archived":false,"fork":false,"pushed_at":"2025-01-02T12:05:11.000Z","size":335,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-14T14:50:32.941Z","etag":null,"topics":["api","quake","quakeworld","servers"],"latest_commit_sha":null,"homepage":"https://hub.quakeworld.nu","language":"HTML","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/vikpe.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"open_collective":"quakeworld"}},"created_at":"2022-05-27T14:02:51.000Z","updated_at":"2025-01-02T12:05:14.000Z","dependencies_parsed_at":"2023-10-16T18:56:13.817Z","dependency_job_id":"27cc4e32-61a3-4528-941b-8e2916fb6d57","html_url":"https://github.com/vikpe/qw-hub-api","commit_stats":{"total_commits":270,"total_committers":2,"mean_commits":135.0,"dds":"0.033333333333333326","last_synced_commit":"e4f816dec87df76f2a0ef9e9673c04f00e0c475d"},"previous_names":["vikpe/qws"],"tags_count":44,"template":false,"template_full_name":null,"purl":"pkg:github/vikpe/qw-hub-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vikpe%2Fqw-hub-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vikpe%2Fqw-hub-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vikpe%2Fqw-hub-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vikpe%2Fqw-hub-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vikpe","download_url":"https://codeload.github.com/vikpe/qw-hub-api/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vikpe%2Fqw-hub-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30021917,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-02T21:50:36.781Z","status":"ssl_error","status_checked_at":"2026-03-02T21:50:28.329Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["api","quake","quakeworld","servers"],"created_at":"2024-10-11T12:26:48.853Z","updated_at":"2026-03-02T22:06:54.545Z","avatar_url":"https://github.com/vikpe.png","language":"HTML","funding_links":["https://opencollective.com/quakeworld"],"categories":[],"sub_categories":[],"readme":"# QW Hub API [![Test](https://github.com/vikpe/qw-hub-api/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/vikpe/qw-hub-api/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/vikpe/qw-hub-api/branch/main/graph/badge.svg)](https://codecov.io/gh/vikpe/qw-hub-api) [![Go Report Card](https://goreportcard.com/badge/github.com/vikpe/qw-hub-api)](https://goreportcard.com/report/github.com/vikpe/qw-hub-api)\n\n\u003e Web API serving QuakeWorld info\n\n## Usage\n\n1) Rename/edit `config.sample.json` to `config.json`.\n2) Rename/edit `.env.example` to `.env`.\n3) Build\n4) `./qw-hub-api`\n\n## Config\n\nSee [config.sample.json](./config.sample.json)\n\n**Example**\n\n```json\n{\n  \"port\": 3000,\n  \"servers\": {\n    \"active_server_interval\": 4,\n    \"server_interval\": 30,\n    \"master_interval\": 14400,\n    \"master_servers\": [\n      \"master.quakeworld.nu:27000\",\n      \"master.quakeservers.net:27000\",\n      \"qwmaster.fodquake.net:27000\"\n    ]\n  },\n  \"qtv_demo_sources\": [\n    {\n      \"address\": \"de.quake.world:28000\",\n      \"demo_date_format\": \"ymd\",\n      \"timezone\": \"UTC\"\n    },\n    {\n      \"address\": \"troopers.fi:28000\",\n      \"demo_date_format\": \"ymd\",\n      \"timezone\": \"Europe/Helsinki\"\n    },\n    {\n      \"address\": \"quake.se:28000\",\n      \"demo_date_format\": \"Ymd\",\n      \"timezone\": \"Europe/Stockholm\"\n    }\n  ],\n  \"streamers\": {\n    \"annihilazor\": \"anni\",\n    \"quakeworld\": \"[streambot]\",\n    \"suddendeathTV\": \"suddendeathTV\",\n    \"vikpe\": \"XantoM\"\n  }\n}\n```\n\n## API endpoints\n\n| URL                                | description                                                               |  \n|------------------------------------|---------------------------------------------------------------------------|\n| `/v2/servers`                      | All servers                                                               |  \n| `/v2/servers/mvdsv`                | MVDSV servers                                                             |  \n| `/v2/servers/qwfwd`                | QWFWD servers (proxies)                                                   |  \n| `/v2/servers/qtv`                  | QTV servers                                                               |\n|                                    |                                                                           |\n| `/v2/servers/\u003caddress\u003e`            | Server details                                                            |\n| `/v2/servers/\u003caddress\u003e/lastscores` | Server lastscores                                                         |\n| `/v2/servers/\u003caddress\u003e/laststats`  | Server laststats                                                          |\n|                                    |                                                                           |\n| `/v2/server_groups`                | List server groups                                                        |\n| `/v2/server_groups/\u003chost or ip\u003e`   | Server group details                                                      |\n|                                    |                                                                           |\n| `/v2/masters/\u003caddress\u003e`            | List servers on master                                                    |\n|                                    |                                                                           |\n| `/v2/demos`                        | Demos from popular servers                                                |  \n| `/v2/streams`                      | Twitch streams casting Quake                                              |  \n| `/v2/events`                       | Events (from [Wiki](https://wiki.quakeworld.nu/))                         |  \n| `/v2/news`                         | News (from [QuakeWorld.nu](https://www.quakeworld.nu/))                   |  \n| `/v2/forum_posts`                  | Forum posts (from [QuakeWorld.nu Forum](https://www.quakeworld.nu/forum)) |  \n\n## Endpoint details\n\n### MVDSV servers\n\n\u003e `/v2/servers/mvdsv`\n\n| Param          | Type                     | Example             | Description                                   |\n|----------------|--------------------------|---------------------|-----------------------------------------------|\n| **empty**      | `include\\|exclude\\|only` | `empty=include`     | Include empty servers (default `exclude`)     |\n| **hostname**   | `string`                 | `hostname=quake.se` | Servers matching hostname `quake.se`          |\n| **has_player** | `string`                 | `has_player=xantom` | Servers where `xantom` is connected as player |\n| **has_client** | `string`                 | `has_client=xantom` | Servers where `xantom` is connected           |\n| **limit**      | `int`                    | `limit=10`          | Limit to `10` servers                         |\n\n### Demos\n\n\u003e `/v2/demos`\n\n| Param           | Type          | Default | Example                | Description                                             |\n|-----------------|---------------|---------|------------------------|---------------------------------------------------------|\n| **q**           | `string`      |         | `q=2on2 xantom dm3`    | Demos where filename matches `2on2`, `xantom` and `dm3` |\n| **mode**        | `string`      |         | `mode=2on2`            | Demos with mode `2on2`                                  |\n| **qtv_address** | `string`      |         | `qtv_address=quake.se` | Demos from `quake.se` qtv server                        |\n| **limit**       | `int [1-500]` | `100`   | `limit=10`             | Limit to `10` demos                                     |\n\n## Build\n\n```shell\ngo build\n```\n\n## Development\n\nRun locally.\n\n```shell\n./qw-hub-api\n```\n\nNow you try an endpoint, e.g. http://localhost:3000/v2/servers\n\n## Credits\n\n* eb\n* Tuna\n* XantoM\n\n## Related projects\n\n* [hub.quakeworld.nu](https://github.com/quakeworldnu/hub.quakeworld.nu)\n* [streambot](https://github.com/vikpe/qw-streambot)\n* [masterstat](https://github.com/vikpe/masterstat)\n* [masterstat-cli](https://github.com/vikpe/masterstat-cli)\n* [serverstat](https://github.com/vikpe/serverstat)\n* [serverstat-cli](https://github.com/vikpe/serverstat-cli)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvikpe%2Fqw-hub-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvikpe%2Fqw-hub-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvikpe%2Fqw-hub-api/lists"}