{"id":18666902,"url":"https://github.com/elsbrock/hetzner-radar","last_synced_at":"2025-04-11T23:33:20.970Z","repository":{"id":252843423,"uuid":"841374327","full_name":"elsbrock/hetzner-radar","owner":"elsbrock","description":"🕵️ Track prices of the Hetzner dedicated server auction","archived":false,"fork":false,"pushed_at":"2025-04-07T07:19:31.000Z","size":695471,"stargazers_count":77,"open_issues_count":6,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-04-07T07:26:36.839Z","etag":null,"topics":["cloudflare","cloudflare-d1","cloudflare-workers","duckdb","hetzner","sqlite","sveltekit","tailwind","wasm"],"latest_commit_sha":null,"homepage":"https://radar.iodev.org/","language":"Svelte","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/elsbrock.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":{"github":"elsbrock"}},"created_at":"2024-08-12T09:27:15.000Z","updated_at":"2025-04-02T18:57:34.000Z","dependencies_parsed_at":"2024-10-27T17:57:24.819Z","dependency_job_id":"a2053f7d-d27b-42dd-86fe-16bd7439f32b","html_url":"https://github.com/elsbrock/hetzner-radar","commit_stats":null,"previous_names":["elsbrock/hetzner-radar"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsbrock%2Fhetzner-radar","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsbrock%2Fhetzner-radar/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsbrock%2Fhetzner-radar/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/elsbrock%2Fhetzner-radar/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/elsbrock","download_url":"https://codeload.github.com/elsbrock/hetzner-radar/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248495931,"owners_count":21113724,"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":["cloudflare","cloudflare-d1","cloudflare-workers","duckdb","hetzner","sqlite","sveltekit","tailwind","wasm"],"created_at":"2024-11-07T08:34:41.384Z","updated_at":"2025-04-11T23:33:20.961Z","avatar_url":"https://github.com/elsbrock.png","language":"Svelte","funding_links":["https://github.com/sponsors/elsbrock"],"categories":["TypeScript"],"sub_categories":[],"readme":"# Hetzner Radar\n\nHetzner Radar is a tool that tracks the prices of Hetzner's [Dedicated Server\nAuction](https://www.hetzner.com/sb/) over time, helping customers identify the\nbest configurations and prices. While Hetzner's auction site allows filtering by\ncertain criteria, it only provides a snapshot at a given moment. Hetzner Radar\naims to enhance this by offering advanced filtering, a comprehensive pricing\nhistory and target price alerts. Additionally, we track server volumes and other\nrelevant statistics.\n\nhttps://github.com/user-attachments/assets/cb49e923-0315-49aa-a3c2-2dbef2ee0596\n\n\u003e [!NOTE]\n\u003e This is an independent project and is not officially affiliated with Hetzner.\n\u003e \"Hetzner\" is a trademark owned by its respective owners. This project does\n\u003e not claim any official endorsement by Hetzner, nor does it guarantee\n\u003e correctness of the data. Use at your own risk.\n\n## Features\n\n* Track server prices and volumes over time.\n* Find all configurations that match your filter criteria.\n* View the lowest price seen for a specific configuration.\n* *New*: Get notified when your target price is met.\n\n## Architecture\n\nThis is a client- and backend architecture, with the website statically\nbuilt using SvelteKit. DuckDB is used in the background for querying the\ndatabase on the client.\n\nIn addition, we use Cloudflare Workers to for session management, storing\nalerts and sending email notifications.\n\nWe fetch the latest auction data from Hetzner once per hour, rebuild the\ndatabase, update the website and push new configurations to the backend.\nThe raw data is stored in the `data` branch, where we currently maintain\nthree months of history. We may consider purging older data if the branch\nbecomes too large.\n\nThe project is deployed on Cloudflare Pages.\n\n## Development\n\nTo set up your development environment, you'll need Python 3 for data ingestion\nand Node.js to run or build the website.\n\nYou can also use the provided Nix Flake to set up your environment (though it is\nsomewhat neglected at the moment).\n\n### Preparing the Database\n\nThis step is optional if you just want to work on the frontend. You can simply\ndownload the latest snapshot from the website:\n\n```\nwget https://static.radar.iodev.org/sb.duckdb -O static/sb.duckdb\n```\n\nIf you just want to inspect or play with the dataset, you can do so by running.\n\n```\nduckdb -cmd \"attach 'https://static.radar.iodev.org/sb.duckdb' (read_only); use sb;\"\n```\n\nInspect the schema using the `.schema` pragma.\n\nWe use Python 3 to create a DuckDB database and ingest the auction data.\n\n```sh\npoetry shell\n# Add the `data` branch under /data\ngit worktree add data data\n# Build the DuckDB database\npython scripts/import.py data static/sb.duckdb\n```\n\n### Running the Website\n\nTo run the website, simply use the `dev` target. To build a static version, use\n`build`.\n\n```sh\nnpm install\nnpm run dev\n```\n## Contributions\n\nContributions are welcome and encouraged! Whether it's fixing a bug, adding a\nnew feature, or optimizing performance, your input can make Hetzner Radar even\nbetter. If you have an idea or a patch, feel free to submit a pull request or\nopen an issue.\n\nBefore contributing, please ensure that your changes align with the project's\ngoals and architecture. If you're unsure or would like to discuss your ideas,\ndon't hesitate to start a discussion in the issues section.\n\nI'm happy to review and merge any meaningful contributions that improve the\nproject. Thank you for helping to make Hetzner Radar better for everyone!\n\n## Disclaimer\n\nThis project was created by a satisfied Hetzner customer and is intended in good\nfaith. The project is designed to be beneficial for all parties involved. If you\nhave any concerns, please reach out.\n\nPlease note that this is an independent project and is not officially affiliated\nwith Hetzner. \"Hetzner\" is a trademark owned by its respective owners. This\nproject does not claim any official endorsement by Hetzner, nor does it\nguarantee correctness of the data. Use at your own risk.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felsbrock%2Fhetzner-radar","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Felsbrock%2Fhetzner-radar","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Felsbrock%2Fhetzner-radar/lists"}