{"id":15426181,"url":"https://github.com/cryptaliagy/golinks","last_synced_at":"2026-03-07T07:31:26.055Z","repository":{"id":44936356,"uuid":"270745976","full_name":"cryptaliagy/golinks","owner":"cryptaliagy","description":"A personal redirect service written in Rust","archived":false,"fork":false,"pushed_at":"2025-04-08T02:11:39.000Z","size":12685,"stargazers_count":20,"open_issues_count":1,"forks_count":1,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-08-09T21:38:57.932Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","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/cryptaliagy.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,"zenodo":null}},"created_at":"2020-06-08T16:42:39.000Z","updated_at":"2025-01-28T15:30:35.000Z","dependencies_parsed_at":"2024-03-08T20:08:51.131Z","dependency_job_id":"18e29a15-c05b-4217-9229-45e9486fd267","html_url":"https://github.com/cryptaliagy/golinks","commit_stats":{"total_commits":76,"total_committers":6,"mean_commits":"12.666666666666666","dds":0.6578947368421053,"last_synced_commit":"3b134f4beb7c4cfecca96e3c55e37d5e8942a2fc"},"previous_names":["cryptaliagy/golinks","taliamax/golinks"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cryptaliagy/golinks","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptaliagy%2Fgolinks","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptaliagy%2Fgolinks/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptaliagy%2Fgolinks/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptaliagy%2Fgolinks/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cryptaliagy","download_url":"https://codeload.github.com/cryptaliagy/golinks/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cryptaliagy%2Fgolinks/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30209721,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-07T05:23:27.321Z","status":"ssl_error","status_checked_at":"2026-03-07T05:00:17.256Z","response_time":53,"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":[],"created_at":"2024-10-01T17:55:06.751Z","updated_at":"2026-03-07T07:31:26.039Z","avatar_url":"https://github.com/cryptaliagy.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Personal GoLinks\n\nInspired by golinks.io\n\nThis application is a redirect service written in Rust that uses routes statically defined in a YAML file to provide easy link shortening.\n\nAlthough prior versions written in Go (`\u003e=1.0 \u003c1.1`) supported stateful updates to the running routes, this was removed from the Rust implementation (`\u003e=1.1`) as I was only deploying the application in my cluster, and ultimately I still managed my available routes by synchronizing the running state with a YAML file that a client used.\n\nSince the application now uses a `ConfigMap` to deploy to a cluster, I am able to scale up to as many replicas as I want without having to worry about persistance or synchronizing storage. This doesn't matter for a service that is only being used by me, but was a fun experiment.\n\n## Quickstart\n\n1. Install Rust\n1. Clone repository\n1. Write a `links.yaml` file\n1. Run `cargo run`\n1. Go to `localhost:8000/heartbeat` and see the JSON output\n\n### Example `links.yaml` file\n\n```yaml\nroutes:\n  golinks: https://github.com/cryptaliagy/golinks\n  google: https://google.com\n  github: https://github.com\n```\n\n## Quickstart (Docker)\n\n1. Create a `conf` directory and write a `links.yaml` file in it (see above for example).\n1. Pull the container with `docker pull ghcr.io/cryptaliagy/golinks:latest`\n1. Run the container with `docker run -e GOLINKS_ROUTES=/conf/links.yaml ROCKET_LOG_LEVEL=normal -v \"$(pwd)\"/conf:/conf -p 8000:8000 ghcr.io/cryptaliagy/golinks:latest`\n1. Go to `localhost:8000/heartbeat` and see the JSON output\n\n## Installation (Helm)\n\n```bash\nhelm repo add golinks https://cryptaliagy.github.io/golinks/charts\nhelm repo update\nhelm install golinks/golinks\n```\n\n### K3s HelmChart CRD\n\n\u003e NOTE: Make sure you configure ingress/service in your values file contents appropriately.\n\n```yaml\n---\napiVersion: helm.cattle.io/v1\nkind: HelmChart\nmetadata:\n  name: golinks\n  namespace: charts\nspec:\n  chart: golinks\n  repo: https://cryptaliagy.github.io/golinks/charts\n  targetNamespace: golinks\n  valuesContent: |-\n    routes:\n      golinks: https://github.com/cryptaliagy/golinks\n      google: https://google.com\n```\n\n## Installation (Manifest)\n\nGenerate a manifest from Helm\n\n```bash\nhelm template --repo https://cryptaliagy.github.io/golinks/charts golinks -g \u003e golinks.yaml\n```\n\nEdit it as desired then apply it to the cluster\n\n```bash\nkubectl apply -f golinks.yaml\n```\n\n## Additional Notes\n\nThis service is very simple, and as such is designed to be as minimal as possible. Running on my machine, the container took up ~1MB of memory, and simple route profiling showed that routes took ~20-40 μs.\n\nThe final container image size is \u003c10MB and uses an image based on `scratch` with a statically-linked binary. This also means that the `latest` and `x.y.z` versioned containers do not have a shell or any additional tools. For potential debugging purposes, a `debug` (and `x.y.z-debug`) container is available. This uses the same binary that `latest` (and `x.y.z`) uses, but is based on `alpine:latest` to include a shell, package manager, etc.\n\n### Deploying to Cloud Services\n\nIf you would like to deploy this to a cloud service and do not have the ability to mount a file (or otherwise would like the container to be fully atomic), you can build your own image that includes the route configs. To do this, first author a `links.yaml` file, then use the following Dockerfile:\n\n```Dockerfile\nFROM ghcr.io/cryptaliagy/golinks:latest\n\nCOPY links.yaml /links.yaml\n```\n\nThis image can then be pushed to a container registry and deployed in the cloud service of your choice.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptaliagy%2Fgolinks","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcryptaliagy%2Fgolinks","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcryptaliagy%2Fgolinks/lists"}