Live demo: poll.nobloat.org
There is also an article about this.
A minimal alternative to Doodle, born out of frustration with it's ongoing enshiti*ion.
- Plain Go stdlib only, no dependencies (see go.mod), plus a little JavaScript and CSS
- One statically compiled binary, in the spirit of nobloat.org
- No node, npm, react/svelte/angular/vue or database
- Create and ansswer polls without an account
- Optional mails via SMTP with personal links to manage a poll or change an answer
- GDPR friendly: each poll is one
.jsonfile - Spam protection without CAPTCHAs with proof of work
- Admin (Basic Auth) can list and manage all polls
- Easy theming, with light and dark mode.
- Translations: English, German, French, Spanish
- Scaling to millions of polls with thousands of participants voting at the same time
minimal
elegant
business
fun
make dev # Mailpit (mail UI on http://localhost:8025) + go run . (creates .env from .env.sample)
make test # go vet + go test -race
make build # static ./poll binary
make package # Docker image ghcr.io/nobloat/poll:<git tag, or main>
make push # package + push (TAG=… to override)
make screenshots # all pages × themes × desktop/phone × light/dark (needs chromium + ImageMagick)- Admin: http://localhost:8737/a (
admin/admin) - Example polls: an empty
./datagets the polls fromseed/;rm -rf dataresets them
- Configure with environment variables;
.env.sampledocuments every setting - Listens on
:8737(PORTto change), stores polls in./data(/datain the image) - Startup validates the config; mail is queued on disk and retried after SMTP failures or restarts
mkdir data
docker run -d --restart unless-stopped --env-file .env --user 1000:1000 -v ./data:/data \
-p 127.0.0.1:8737:8737 ghcr.io/nobloat/poll:latestOr with Docker Compose:
services:
poll:
image: ghcr.io/nobloat/poll:latest
restart: unless-stopped
env_file: .env
user: "1000:1000"
volumes: [./data:/data]
ports: ["127.0.0.1:8737:8737"]- Built-in themes in
static/themes/:minimal(default),elegant,business,fun THEMEsets the default; each poll can pick its own in the poll form- A theme is a small CSS file that overrides the
:rootvariables instatic/app.css(colors, font, borders, corners, shadows, buttons) and may refine any other rule - Add one: put it in
static/themes/<name>.cssand rebuild, it's picked up automatically - Use
light-dark(light, dark)for colors - Fonts: only the built-in generic families (
system-ui,ui-monospace,ui-serif,ui-rounded,sans-serif, …), no font files
- All texts, including mails, are in
i18n/:en.json,de.json,fr.json,es.json - Add a language: copy
en.jsonto<code>.json(e.g.it.json), translate the values (keep keys and%splaceholders), rebuild - The language comes from the browser's
Accept-Language, English is the fallback - Mails use the language a participant had when they answered
make testfails if a file is missing a key or has extra ones



