Open source repository of G(r)oROTI 🍖, a selfhosted Return On Time Invested web application written in Go
The UI and functionalities are really basic. Here is a quick overview:
- create an anonymous ROTI in seconds
- find latest ROTIs in homepage (can be disabled with "Hide this ROTI" checkbox)
- Enable / disable textbox feedbacks in votes with a checkbox
- share the link (or QR code) with people that need to vote
- by default, ROTIs are cleaned 30 days after creation
- golang (memory, gc...), http (latency, codes...) and groroti metrics are exposed on
/-/metricspath - export ROTI results with a csv or a PNG file
![]() |
![]() |
|---|---|
![]() |
![]() |
You can download the linux binary for arm64 and amd64 in the releases page. To build it yourself, see building section of this page.
Public docker images are available on GitHub Container Registry.
You can pull/run the latest version by running:
docker pull ghcr.io/deezer/groroti:latest
docker run -p 3000:3000 -e FRONTEND_URL=https://groroti.mydomain.tld ghcr.io/deezer/groroti:latestAside from frontend URL, to customize other parameters, see Configuration section on this page.
You can deploy the helm chart in this repository with (change your values with your own):
cd helm
cp values-example.yaml values.yaml
helm install groroti -f values.yaml .
#or if already installed
helm upgrade groroti -f values.yaml .Install clever-tools (npm i -g clever-tools), create an account on Clever cloud website. Then login in a terminal
clever loginCreate an app on clever cloud
clever create --type go grorotiSet SERVER_PORT to match clever cloud golang image (8080 instead of 3000)
clever env set SERVER_PORT 8080Get URL (from clever cloud console) of the app and then change the FRONTEND_URL
clever env set FRONTEND_URL "https://app-xxx-xxx-xxx-xxx-xxx.cleverapps.io"Or better yet, add a domain and put a DNS record on it
clever domain add groroti.mydomain.tld
clever env set FRONTEND_URL "https://groroti.mydomain.tld"Tell clever cloud to use gomod method to install dependancies instead of goget (deprecated, will fail in this case)
clever env set CC_GO_BUILD_TOOL gomodDeploy on clever cloud
clever deployYou can customize some of the features of GroROTI. All those fields are optional:
- configuration file path - default is "config.toml", can be overridden with GROROTI_CONFIG environment variable
- server listening address - default is "0.0.0.0", can be overridden with SERVER_ADDR environment variable or server_addr in configuration file
- server listening port - default is "3000", can be overridden with SERVER_PORT environment variable or server_port in configuration file
- 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
- 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
- qr code size - default is "384" (in pixels), can be overridden with QR_CODE_SIZE environment variable or qr_code_size in configuration file
- 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
- enable tracing - default is "false", can be overridden with ENABLE_TRACING environment variable or enable_tracing in configuration file
- otlp endpoint - default is "localhost:4318", can be overridden with OTLP_ENDPOINT environment variable or otlp_endpoint in configuration file
- otlp HTTP basic auth username - default is empty, which means no HTTP basic auth. Can be overridden with OTLP_BASIC_USERNAME environment variable or otlp_basic_username in configuration file
- otlp HTTP basic auth password - default is empty, which means no HTTP basic auth. Can be overridden with OTLP_BASIC_PASSWORD environment variable or otlp_basic_password in configuration file
This software requires Go 1.25+
To use gorelease in the Makefile to crosscompile to amd64 AND arm64, you need make and docker (Makefile doesn't work well with Podman)
You may also need to run the following commands
mkdir datadir/ sysroot/
touch config.tomlIf you plan to use goreleaser and the cross compiling system, you'll need:
pvpbzip2- sysroots folders (you can find an oudated example here, and the documentation explains how to do it properly here using "the script")
git submodule add https://github.com/goreleaser/goreleaser-cross-example-sysroot.git sysrootsThe Makefile has an alias to help you run the server in dev mode with a simple make dev command
make dev
SERVER_ADDR=127.0.0.1 SERVER_PORT=3000 FRONTEND_URL=http://localhost:3000 go run main.go
2022/05/09 22:41:56 Start listening on 127.0.0.1:3000All building operations for the project (both binaries and docker images) are done using GoReleaser by default.
You can use the install target of the Makefile to build the binary for you
VERSION=1.2.3 make buildNote: don't forget the prerequisites (see above). You can build it on any commit using the --snapshot goreleaser option:
make snapshotYou can then test/run locally using the binary of the docker image:
#binary
dist/GroROTI_linux_amd64_v1/groroti
#docker image
docker run -p 3000:3000 docker.io/deezer/groroti:latest-amd64Deezer staff can push a new release by tagging the git repository to create a new release, and running goreleaser:
git tag -a 1.0.0 -m "1.0.0 release"
git push origin 1.0.0This will trigger a github action that will test the code, build the binary, build the docker image and push it on ghcr.io.
Should 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
go build -ldflags="-extldflags '-static'"
docker build -t localgroroti .
docker run -p 3000:3000 localgrorotiNote: you can't use Goreleaser without the "Pro" version when using Podman.
font Luciole under Creative Commons Attribution 4.0 International Public License, © Laurent Bourcellier & Jonathan Perez. See ReadMe.txt .



