{"id":25215596,"url":"https://github.com/deezer/groroti","last_synced_at":"2025-10-25T14:31:19.506Z","repository":{"id":238548773,"uuid":"796740323","full_name":"deezer/GroROTI","owner":"deezer","description":"G(r)oROTI is a selfhosted Return On Time Invested web application written in Go ","archived":false,"fork":false,"pushed_at":"2024-05-17T09:33:18.000Z","size":877,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-05-18T08:54:30.490Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/deezer.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":"2024-05-06T14:39:47.000Z","updated_at":"2024-05-28T15:34:53.251Z","dependencies_parsed_at":"2024-05-28T15:34:42.791Z","dependency_job_id":"2a2ae9dc-dc19-4c3c-a27f-987505b69314","html_url":"https://github.com/deezer/GroROTI","commit_stats":null,"previous_names":["deezer/groroti"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deezer%2FGroROTI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deezer%2FGroROTI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deezer%2FGroROTI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/deezer%2FGroROTI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/deezer","download_url":"https://codeload.github.com/deezer/GroROTI/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238161490,"owners_count":19426669,"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":[],"created_at":"2025-02-10T18:15:06.053Z","updated_at":"2025-10-25T14:31:13.985Z","avatar_url":"https://github.com/deezer.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GroROTI 🍖\n\nOpen source repository of G(r)oROTI 🍖, a selfhosted **Return On Time Invested** web application written in Go\n\nThe UI and functionalities are really basic. Here is a quick overview:\n* create an anonymous ROTI in seconds\n* find latest ROTIs in homepage (can be disabled with \"Hide this ROTI\" checkbox)\n* Enable / disable textbox feedbacks in votes with a checkbox\n* share the link (or QR code) with people that need to vote\n* by default, ROTIs are cleaned 30 days after creation\n* golang (memory, gc...), http (latency, codes...) and groroti metrics are exposed on `/-/metrics` path\n* export ROTI results with a csv or a PNG file\n\n| \u003cimg src=\"binaries/home.png\"\u003e | \u003cimg src=\"binaries/vote.png\"\u003e |\n| -------- | ------- |\n| \u003cimg src=\"binaries/roti.png\"\u003e | \u003cimg src=\"binaries/metrics.png\"\u003e |\n\n## Run it!\n\n### Locally with the binary\n\nYou can download the linux binary for arm64 and amd64 in the [releases page](https://github.com/deezer/GroROTI/releases). To build it yourself, see [building section](https://github.com/deezer/GroROTI?tab=readme-ov-file#build-it) of this page.\n\n### With the docker image\n\nPublic docker images are available on [hub.docker.com](https://hub.docker.com/u/deezer).\n\nYou can pull/run the latest version by running:\n\n```bash\ndocker pull deezer/groroti:latest\ndocker run -p 3000:3000 -e FRONTEND_URL=https://groroti.mydomain.tld deezer/groroti\n```\n\nAside from frontend URL, to customize other parameters, see [Configuration section](https://github.com/deezer/GroROTI?tab=readme-ov-file#Configuration) on this page.\n\n### Deploy with Kubernetes\n\nYou can deploy the helm chart in this repository with (change your values with your own):\n\n```bash\ncd helm\ncp values-example.yaml values.yaml\nhelm install groroti -f values.yaml .\n#or if already installed\nhelm upgrade groroti -f values.yaml .\n```\n\n### Deploy on Clever Cloud\n\nInstall clever-tools (`npm i -g clever-tools`), create an account on Clever cloud website. Then login in a terminal \n\n```bash\nclever login\n```\n\nCreate an app on clever cloud\n\n```bash\nclever create --type go groroti\n```\n\nSet SERVER_PORT to match clever cloud golang image (8080 instead of 3000)\n\n```bash\nclever env set SERVER_PORT 8080\n```\n\nGet URL (from clever cloud console) of the app and then change the FRONTEND_URL\n\n```bash\nclever env set FRONTEND_URL \"https://app-xxx-xxx-xxx-xxx-xxx.cleverapps.io\"\n```\n\nOr better yet, add a domain and put a DNS record on it\n\n```bash\nclever domain add groroti.mydomain.tld\nclever env set FRONTEND_URL \"https://groroti.mydomain.tld\"\n```\n\nTell clever cloud to use `gomod` method to install dependancies instead of `goget` (deprecated, will fail in this case)\n\n```bash\nclever env set CC_GO_BUILD_TOOL gomod\n```\n\nDeploy on clever cloud\n\n```bash\nclever deploy\n```\n\n## Configure it!\n\nYou can customize some of the features of GroROTI:\n\n* **configuration file path** - default is \"config.toml\", can be overridden with *GROROTI_CONFIG* environment variable\n* **server listening address** - default is \"0.0.0.0\", can be overridden with *SERVER_ADDR* environment variable or *server_addr* in configuration file\n* **server listening port** - default is \"3000\", can be overridden with *SERVER_PORT* environment variable or *server_port* in configuration file\n* **url for internal links** - default is \"http://localhost:3000\" but QR codes won't work (obviously). You can override this with *FRONTEND_URL* environment variable or *frontend_url* in configuration file\n* **vote input step** - default is \"0.5\" but this can be customized (to allow only int for example) with *VOTE_STEP* environment variable or *vote_step* in configuration file\n* **qr code size** - default is \"384\" (in pixels), can be overridden with *QR_CODE_SIZE* environment variable or *qr_code_size* in configuration file\n* **clean over time** - when a new ROTI is created, remove all ROTIs that are older than xxx. Default is 30 (in days), can be overridden with *CLEAN_OVER_TIME* environment variable or *clean_over_time* in configuration file\n\n## Build it!\n\n### Prerequisites\n\nThis software requires Go 1.22+\n\n### Run dev version\n\nThe `Makefile` has an alias to help you run the server in dev mode with a simple `make dev` command\n\n```console\nmake dev\nSERVER_ADDR=127.0.0.1 SERVER_PORT=3000 FRONTEND_URL=http://localhost:3000 go run main.go\n2022/05/09 22:41:56 Start listening on 127.0.0.1:3000\n```\n\nAll building operations for the project (both binaries and docker images) are done using GoReleaser by default.\n\n### goreleaser\n\nYou can build it on any commit using the `--snapshot` goreleaser option:\n\n```bash\nmake snapshot\n```\n\nYou can then test/run locally using the binary of the docker image:\n\n```bash\n#binary\ndist/GroROTI_linux_amd64_v1/groroti\n\n#docker image\ndocker run -p 3000:3000 docker.io/deezer/groroti:latest-amd64\n```\n\n### goreleaser for Deezer staff \n\nDeezer staff can push a new release by tagging the git repository to create a new release, and running `goreleaser`:\n\n```bash\ngit tag -a 1.0.0 -m \"1.0.0 release\"\ngit push origin 1.0.0\nexport GITHUB_TOKEN=\"ghx_xxxxxxxxxxxxxxxxxx\" #or use ~/.config/goreleaser/github_token file\ngoreleaser release\n```\n\n### manually\n\nShould you decide to not use GoReleaser to build your binary / image, you should know that the Docker image requires the binary to be builded with `-extldflags '-static'` ldflags\n\n```bash\ngo build -ldflags=\"-extldflags '-static'\"\ndocker build -t localgroroti .\ndocker run -p 3000:3000 localgroroti\n```\n\n## Additionnal licences\n\nfonts Luciole under Creative Commons Attribution 4.0 International Public License, © Laurent Bourcellier \u0026 Jonathan Perez. See [ReadMe.txt](internal/staticEmbed/static/ReadMe.txt) .\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeezer%2Fgroroti","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdeezer%2Fgroroti","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdeezer%2Fgroroti/lists"}