Files
podstalk/docs/specs/2026-08-19-allow-signup-env-design.md
jbrechtel d4d552b3f4
Build and Deploy / build-and-deploy (push) Successful in 1m44s
Fix sign-in page to show Sign Up link only when sign-up is enabled
2026-08-19 10:22:09 -04:00

2.1 KiB

Allow Sign-Up Via Environment Variable

Date: 2026-08-19 Status: Draft

Summary

Replace the current "count of users" check that gates sign-up with a single environment variable. This lets an operator explicitly control whether public sign-up is available, instead of Podstalk inferring it from how many users already exist.

Motivation

Today ServeSignup disables sign-up once a user already exists (store.UserCount() > 0). That is implicit and easy to get wrong: the first user must register before anyone can log in, and once that happens no one can ever register again. Controlling this with an explicit environment variable is predictable and self-documenting.

Behavior

New environment variable: PODSTALK_ALLOW_SIGNUP.

  • Unset or any falsy value (false, 0, no, off): sign-up disabled.
  • Truthy value (true, 1, yes, on): sign-up enabled.

Default (unset) is disabled.

Changes

main.go

Read PODSTALK_ALLOW_SIGNUP from the environment and resolve it with a truthy-value parser. Set the resulting boolean on the AuthHandler.

handler/auth.go

  • Add an AllowSignup bool field to AuthHandler.
  • ServeSignup: redirect to /signin when !AllowSignup (replaces the UserCount() > 0 check).
  • Replace the hasUsers() helper (driven by user count) with a check on AllowSignup, so the Sign In page shows/ hides the "Sign Up" nav link based on whether sign-up is enabled. The sign-in template passes AllowSignup and renders the link with {{if .AllowSignup}}.

Unchanged

store.UserCount() remains in the store package. It is no longer used by authentication but is left in place as a general utility.

Out of Scope

  • No admin/user-management UI to invite specific users.
  • No change to the existing adduser CLI command (operator provisioning still works regardless of the sign-up toggle).
  • No change to sign-in/sign-out behavior.

Testing

  • scripts/build passes (gofmt, go vet, go build, docker build).
  • Manual verification is limited by the sandbox; behavior relies on the straightforward boolean branch and the truthy parser.