FAQ
Why DuckDB and not Postgres / SQLite / a hosted DB?
DuckDB is a single-file embedded database with first-class SQL and zero
operational overhead — no separate server, no auth surface, no schema
migrations to coordinate. Combined with the Quack
extension, the same file the Go process writes can be queried remotely
from your laptop’s duckdb CLI. SQLite would work but lacks the remote-read
ergonomics; Postgres or a hosted DB would add a network hop, credentials,
and a separate operational thing to keep alive for what is fundamentally a
tiny single-writer workload.
Is survey_id opaque, or do you parse the date?
Opaque. The server validates it against ^[a-z0-9][a-z0-9_-]{0,63}$ and
treats it as a string. ISO-style dates (2026-06-04) work, slugs
(weekly-42) work, anything else that matches the regex works. The date
format is a convention, not enforced.
How do I delete an accidental vote?
Per-survey wipe via the Quack admin channel:
make survey-reset SURVEY_ID=<id> CONFIRM=yesThe CONFIRM=yes gate is there so a stray re-run of make survey-reset in
shell history doesn’t quietly wipe a different survey. There’s no per-row
delete by design — votes are deduplicated by hash, but the hash itself is
designed to be unreversible after the daily salt rotates.
Can I run it without Quack exposed publicly?
Yes. The Quack listener is on a separate port (SURVEY_QUACK_ADDR, default
:9494). On the FreeBSD path, this is bound LAN-only and reached via a
custom DNS host. On Railway, the TCP Proxy adds a public hostname, but
authentication is by token (a base64 32-byte secret) — no token, no
connection. You can also skip the Quack proxy entirely on Railway and shell
into the container to query the file directly. See
Querying for the alternatives.
What’s the cost? Free vs. Typeform / Polldaddy / etc.?
Paid survey tools (Typeform, Polldaddy, SurveyMonkey, etc.) usually have a free tier capped at a few responses, then charge per-response or per-month. pollmd costs whatever your existing Railway/EC2/Hetzner/FreeBSD box costs — typically nothing extra. The DuckDB file grows by ~50 bytes per vote, so storage is a rounding error.