Questify

2.12.0

Released

Features

  • Quest Jam examples now recur. A template describes a Jam and its rhythm, and each cycle is minted as its own row, so the weekly and monthly examples roll forward indefinitely and every run keeps its own participants and leaderboard. The index is populated between runs too: a Jam with gaps between cycles shows its next one as upcoming rather than showing nothing. (#531)

  • Added a public Terms of Service page at /terms, linked from the shared site footer (so it appears on the landing page and every in-app page), from the signup form as the acceptance users agree to when they create an account, and from the pricing page's support fine print. It covers accounts, acceptable use, content ownership, the limits of AI output, subscriptions and refunds, liability, and Ontario as the governing law. (#530)

Fixes

  • The Quest Jams index is no longer empty on the live site. The three example Jams added in #517 were written into supabase/seed.sql, which supabase db push --include-seed records the hash of without executing once the project knows the path — so they had never existed in production, and the page had shown its empty state since the feature shipped. (#531)

Technical changes· 7 entries for database, tooling, CI, tests and docs

Database

  • Added quest_jam_templates and ensure_quest_jam_cycles(), which mints the current and next cycle of every active template. Minting is idempotent under concurrent callers, refuses to write a window that has already closed, and rejects a template whose cycles would overlap. Retiring a template leaves the Jams it created intact. (#531)

CI/CD

  • The Playwright job no longer runs as a matrix over NEXT_PUBLIC_FEATURE_ONBOARDING_WIZARD. With the flag gone there is a single behaviour to exercise, so E2E runs once per CI run rather than twice, and its failure artifact is a single playwright-report again. (#533)

  • Both Lighthouse workflows now audit /terms. It is linked from the shared footer on every page, so a regression there is site-wide; measured 99/100/100/100 against a production build, on par with /privacy. The test that pins the audit path list covers it. (#530)

  • The Supabase workflow now fails a pull request that changes what seed.sql inserts without shipping a migration alongside it. Seeded data that production needed has been lost this way three times; the rule was written in a comment and is now enforced. Comment and formatting edits to the file are ignored. (#531)

Tests

  • Dropped the onboarding cases that only asserted flag-off behaviour, in the E2E suite and in the middleware, callback, auth-action, and query unit tests. The two redirect-safety cases that had relied on the flag being off — an off-site next at /auth/callback and at login — now pin an already-onboarded user, so they still assert the rejected destination rather than the wizard hand-off. (#533)

  • Replaced the Quest Jam seed test, which asserted three fixed rows and stayed green for weeks while the production page was empty because it was testing the seed rather than the deployment. It now runs after migrations alone — the same guard #505 put on the public quest catalog — and asserts the property that matters: every active template has a live or upcoming Jam on the index. (#531)

Refactors

  • Removed the NEXT_PUBLIC_FEATURE_ONBOARDING_WIZARD feature flag: the first-run onboarding wizard is now unconditional. Middleware, the post-auth redirect resolver, and /onboarding itself decide purely on stored onboarding progress, and the variable is gone from apps/web/src/lib/env.ts, .env.example, apps/web/Dockerfile, docker-compose.yml, turbo.json, and the Playwright web-server env allow-list. Users who already have a completed_at stamp — which includes everyone backfilled when the table was created — are still never routed into it. (#533)