All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
0.30.0 - 2026-10-19
Added
- cli: Record the project's package manager in package.json (
c5b0b92) - z: Describe a JSON payload whose shape is not fixed (
999d0e8) - vukem: Give the operational seams their own names and checks (
131e904) - z: Let the validate tag express an optional value and a default (
51fbbfc) - cpu: Report the container's CPU quota for pools the runtime does not size (
073560f) - vukemtest: Decode a response body into a struct (
9f218a9)
Fixed
- apidocs: Run the accessibility pass in a microtask, not a frame (
6664021) - cli: Make the make:* generators produce lint-clean code (
0977763) - docker: Make the lockfile an explicit build input of the assets stage (
f29c478) - cli: Gate install:auth --social and give its packages a doc.go (
856512c) - upload: Refuse a type the content detector cannot produce (
7912ed6)
Security
- cli: Teach the API ability model the scaffold already enforces (
b8087dc) - archive: Read a user archive under a policy and return safe keys (
0d1e0c8) - mediatype: Name the types an app produces, not the ones it accepts (
933de25)
0.29.0 - 2026-10-18
Added
- site: Serve sitemap.xml and robots.txt for search engines (
0b09352) - cli: Add -prefix to openapi:export and the codegen generators (
9062d20) - api: Add RegisterWith for a caller-supplied input schema (
bbc07c4) - ulid: Add a monotonic ULID generator with Valid and TimeOf (
f71f287) - auth: Accept the token from extra headers, with Vary (
3604e4c) - queue: Let a handler report a permanent failure and see its attempt (
6d90e21) - postgres: Add an sse.Broker on LISTEN/NOTIFY (
f6ce304) - openapi: Carry examples in schemas, parameters and media types (
cb9fff1) - openapi: Reject a path prefix that matches no route (
0ab4aaf) - schema: Expose a Schema's dialect and record a migration's SQL (
ad353df) - queue: Ship the queue tables as a registrable migration (
ddfe2fd) - session: Ship the sessions table as a registrable migration (
f5ae66b) - cache: Ship the cache table as a registrable migration (
4430efb) - webhook: Ship the delivery log table as a registrable migration (
38fdf2c) - schema: Add stores.Migrations for the tables vukem owns (
0408641) - ui: Give the generated password fields a toggle and live rule checks (
e5b876c) - cli: Choose the auth message catalogs with install:auth --locales (
6ca182d)
Changed
- auth: Read the listed token owner from its row (
da63a05) - cli: Keep starter package comments in a doc.go (
264fb46)
Fixed
- apidocs: Give Scalar's caption labels and combobox field accessible markup (
082ab73) - release: Match changelog headings literally and refuse an empty body (
89a19bb) - openapi: Describe path parameters from their doc tag (
174cdb3) - cli: Pin install:billing to contrib/stripe v0.4.0 (
9b51f70) - cli: Keep the demo resource's links inside the demo (
c3eb298) - cli: Generate the Dockerfile for the package manager the project uses (
3e3c92c) - docker: Give the starter image a mailer so its commands can run (
04b9c2b) - cli: Make a fresh scaffold pass the repository's golangci-lint (
d76e7b7) - cli: Scope the API keys install:api mints instead of granting "*" (
7791277) - cli: Commit the generated git hooks with the executable bit (
be9ceea)
Security
- vukem: Add WithOpenAPI so an app owns its document info (
697c8a0) - cli: Scaffold the project standards behind flags on vukem new (
68e6763) - cli: Point a new project at the documentation it needs next (
bc09220)
0.28.0 - 2026-10-18
Added
- site: Wrap code blocks and add Term and Quote components (
7328830) - signed: Add Signer.WithClock for the app clock (
b1fc8b0) - api: Eager-load includes and add a cursor-aware Request.CursorPaginate (
ab96f97) - apidocs: Configurable route names for several references (
751431c) - vukem: Add MiddlewareOptions.CSRFTokenFallback (
656bc11) - vukem: Add WithViewFuncs for custom template functions (
f5d6d4f) - vukem: Add WithEventsFake and WithRateLimiters options (
f3f7efc) - BREAKING: config: Resolve @file: secrets in the process environment (
ea204d2) - otel: Read OTEL_SERVICE_VERSION into service.version (
5c32abe) - config: Escape a literal @file: value as @@file: (
46a7c04)
Fixed
- site: Fit the header on 390px phones (
cbc14fe) - cli: Ignore .env.local in new projects (
4a47421) - site: Fit code blocks and steps on phones (
d077dac) - authz: Let T values use the policy registered for *T (
242e495) - inertia: Name the page script after Config.RootID (
6c57955) - inertia: Keep X-Inertia-Location on https behind a trusted proxy (
a43acd6) - app: Warn about a missing Inertia error page without WithEnv (
e8b6990) - authz: Document the shallow copy for value subjects and test fallback edges (
a0ab556) - schema: Pluralise Constrained() targets like the orm (
0605a43) - schema: Rebind ? placeholders in Raw for the dialect (
43c7aa0) - orm: Name the Field() name in built-in rule messages (
46745cd) - BREAKING: orm: Read Chunk batches by keyset instead of OFFSET (
7e8b6ce) - BREAKING: orm: Cap Paginate and CursorPaginate per page at 100 (
9f0bedf) - mongo: Answer 404 for ErrNotFound and return [] from All (
2f02c82) - orm: Group OR filters in keyset Chunk and check the selected key up front (
56659b5) - auth: Match the Bearer scheme case-insensitively (
a7f1ed1) - jwt: Answer key set and user store outages with 503 (
2d5e1b4) - cli: Revoke API tokens instead of deleting them on email proof (
e75382d) - cli: Require the password and a rate limit to regenerate 2fa recovery codes (
4d78c0a) - BREAKING: cli: Refuse install:auth --social x (
694b6ae) - upload: Accept Verify keys for types outside the extension table (
7658d96) - storage: Send the real Last-Modified and hide local temporary files (
d031b68) - BREAKING: storage: Require UploadRules.Types in PutUploaded (
d30d7aa) - schedule: Log lock errors and measure took from the task start (
fb039f7) - upload: Keep scanner causes and log tus completion failures (
709123d) - events: Name listeners by function and recover sync panics (
eeb50d5) - vukem: Explain queue commands on in-process queue drivers (
ff78253) - BREAKING: mail: Validate tags for every transport (
938c891) - mail: Retry network errors in the Resend and Mailtrap transports (
78da6ed) - BREAKING: vukem: Fail boot on a mail transport that cannot send (
a74ee8d) - events: Re-panic http.ErrAbortHandler and wrap error panics from sync listeners (
01ee89d) - api: Parse typed handler input with the request context and logger (
0958e16) - BREAKING: api: Replay only representation headers on idempotent repeats (
1925d67) - cli: Create the output directory of codegen:types -o (
eee86eb) - graphql: Cost page-size arguments by their SDL default when omitted (
903c041) - BREAKING: graphql: Reject introspection in Handler unless opted in (
03d0326) - BREAKING: graphql: Validate nested inputs, mask Validate errors, check fields at build (
3625e30) - openapi: Reject duplicate operationIds (
beb0ac6) - api: Never replay credential headers on idempotent repeats (
4282e95) - BREAKING: middleware: Let a route raise the router-wide body limit (
bd64d69) - web: Send the c.Status code with the next writer's headers (
daefe5c) - BREAKING: web: Reject unknown JSON fields in BindJSON as documented (
1387d1b) - web: Answer 422 when FormFile reads a non-multipart request (
c6243d2) - BREAKING: router: Make a group's "/" route exact like the root route (
e6f8e5c) - router: Strip inlined-closure suffixes from middleware names (
46edb46) - middleware: Detect fingerprints strictly and add ETags to embedded files (
d11e4dd) - csrf: Trigger the token fallback on the session cookie only (
b24352c) - web: Pass the error to error views in debug mode (
067a370) - session: Report no id for cookie sessions, even after Regenerate (
4bbb51e) - z: Use the singular in default messages for a count of 1 (
a1b5717) - z: Leave Nullable-only keys out of the JSON Schema required list (
004e63f) - middleware: Keep an earlier body limit in MethodOverride (
ab1b31b) - web: Apply a pending status only to 200 and commit it on Flush (
ff0e6fb) - BREAKING: view: Refuse custom template functions that replace built-ins (
ed9a6df) - BREAKING: telegram: Honour info min level, never nil handler, html-safe send truncation (
9f8715c) - broadcast: Reject channels with an empty dot segment (
0c30e19) - BREAKING: webhook: Namespace dedupe keys per provider or route (
e722635) - webhook: Record deliveries dropped for a disabled endpoint (
a177d48) - BREAKING: stripe: Form-encode every map and slice type, refuse the rest (
9958167) - cli: Pin install:billing to the latest contrib/stripe tag (
79ef0c4) - BREAKING: i18n: Refuse plural objects without other, explain bad catalog names (
be0512e) - devtools: Treat X-Forwarded-Proto, X-Forwarded-Port and Via as proxied (
b10eb56) - flags: Stop repeating the flags prefix on invalid values (
a15d214) - admin: Mount flag routes only for registered flags, skip no-op audits (
da22e46) - admin: Match short secret words in column names as whole segments (
f0e20df) - admin: Match secret words anywhere, exempt only known counters (
2d8d4c2) - webhook: Never namespace dedupe keys by the raw request path (
d477a32) - telegram: Count UTF-16 units and skip self-closing tags when truncating (
05ee8b9) - stripe: Bound param nesting, refuse NaN/Inf and send []byte as a string (
91d625a) - vukemtest: Restore Accept after JSON sends, match HX-Trigger lists and stored nils (
d916cd5) - cli: Validate generator input before writing and create the policies registry (
0a17532) - cli: Run templ generate before app-command rebuilds and watch .buildtags (
727d365) - cli: Check bootstrap/app.go can be patched before install:inertia deletes files (
0580ff6) - cli: Read APP_ENV from .env too when choosing embedded resources (
e8166d5) - cli: Build the release binary with CGO_ENABLED=0 like the Dockerfile (
0f5d2e1) - vukem: Report every boot configuration error at once (
d31d8dc) - flags: Fail closed when a FLAG_ @file: secret cannot be read (
430b7db) - vukem: Check @file: secrets are regular files before opening them (
6d98bce) - schema: Defer closing the table listing rows on every return (
320f9a1)
Security
- vukem: Send security headers on the maintenance 503 (
8eff044) - BREAKING: openapi: Consistent operationIds, plain route bodies, unknown schemes fail (
22a766c) - api: Document v0.28 API, OpenAPI and GraphQL fixes and refresh stale names (
88691b5)
0.27.0 - 2026-10-18
Added
- site: Add a changelog page linked from the header (
6381fa5) - auth: Add ProblemJSON so every API auth failure is problem+json (
0c183cf) - vukem: Warn once when proxy headers arrive without TRUSTED_PROXIES (
06ee06a) - ratelimit: Export IPKey and group throttle keys by it (
b0e40f5) - vukem: Let lazy store funcs fall back with ErrUseDefault (
7c2b800) - telegram: Read the Bot API base URL from TELEGRAM_API_URL (
eaab1b3) - fixinline: Check every go:fix inline wrapper against go fix (
8655ddb) - database: Add ScanTime for timestamps SQLite returns as text (
7198679) - factory: Add en and pt-BR locales with commerce and address data (
9c5bf18) - factory: Add CreateMany to insert factory models in batches (
7dc730b) - vukem: Select seeders and pass seeder flags in db:seed (
4312444) - flags: Add typed feature flags with a cached database store (
30031c3) - vukem: Register feature flags with WithFlags and build them with app.Flags (
ffed272) - admin: Add a feature flags page with audit events (
041c0f5) - cli: Add install:flags and wire feature flags into the admin scaffold (
f70d6b0) - web: Let a frontend adapter render the error page (
358087f) - cli: Ship an Error page in the Inertia starters (
f9c00a7) - BREAKING: vukem: Cap request headers at 64 KiB with HTTP_MAX_HEADER_BYTES (
320b89b) - grpc: Let operators raise the gRPC port's header cap (
7db5602) - vukem: Keep an existing ErrorPage hook and warn without an Error page (
0ab65c5)
Changed
- vukem: Group the root package files by theme (
a90f9c8) - factory: Replace NewFakerWithLocale with Faker.WithLocale (
fe297b4) - flags: Type scopes, version cached values and describe flags with Info (
5593d07) - web: Pass error pages to the hook as a web.ErrorPage struct (
b34be2b)
Fixed
- BREAKING: cli: Require the account's login to verify an email address (
37da4e1) - cli: Send expired verification links to the resend page (
379620d) - BREAKING: ratelimit: Key IPv6 clients by their /64 in ByIP (
6f66901) - vukem: Harden the ErrUseDefault fallback of lazy store funcs (
9ac99f1) - BREAKING: grpc: Give the gRPC port its own cleartext opt-in (
91cf1f5) - BREAKING: otel: Export metrics to the generic OTLP endpoint by default (
4cb0b8e) - apicheck: Reject trailing braces and foreign-major exception versions (
4156585) - orm: Scan text timestamps into time fields on SQLite (
fc0eac7) - vukem: Fail closed on db:seed --class without a name (
4de9aa6) - database: Accept space-separated RFC 3339 text in ScanTime (
ea2ef1c) - flags: Match FLAG_ keys exactly when checking for unknown flags (
7895fad) - vukem: Refuse FLAG_ keys in .env when no flag is registered (
c5c2697) - admin: Redact string flag values and survive a failed audit row (
52881da) - cli: Make install:flags safe to re-run (
7bbcbf6) - apidocs: Load the API reference with zero CSP violations (
770263f)
Security
- repo: Move the community health files into .github (
49c22b0) - apicheck: Add a versioned exception list for security-driven breaks (
e4542e7) - BREAKING: inertia: Render an Error page for errors on Inertia requests (
d9d3876) - web: Render the built-in status pages under the default CSP (
83fcc01)
0.26.0 - 2026-10-17
Added
- stripe: Add typed Accounts v2, refunds and transfer reversals (
3ae351a) - BREAKING: cache: Add Sharer contract and fail closed on undeclared stores (
7b86743) - redis: Declare the cache store shared (
bcd81e0) - cache: Bound Unwrap chains with cache.Layers (
25e49bb) - database: Add RebindChecked that rejects unterminated SQL and mixed placeholders (
a5864e0) - BREAKING: queue: Pop same-millisecond database jobs in push order (
b644749) - signed: Verify links signed with previous keys (
acad399) - social: Accept state cookies signed with previous keys (
febfa33) - session: Open cookie sessions sealed with previous keys (
5658c74) - middleware: Accept maintenance bypass cookies from previous keys (
efccd58) - cli: Add key:rotate and pass previous keys in auth scaffolds (
8cdca11) - grpc: Add ErrorContext to translate keyed errors into the request locale (
ae3a3ca) - schema: Add Schema.HasColumn for upgrade migrations (
99e2b8a) - BREAKING: auth: Soft revoke API tokens with revoked_at (
6cf8d9c) - cli: Add revoked_at to the install:auth access_tokens table (
534c3d8) - cli: Revoke API tokens with Tokens.RevokeAll on password reset (
d66f523) - BREAKING: i18n: Return the config error from Middleware instead of panicking (
43df6fd) - mail: Add the Mailtrap Email API transport (
1c70018) - vukem: Select the Mailtrap transport with MAIL_MAILER=mailtrap (
0689a31)
Changed
- graphql: Derive the 5xx check from errs.Status (
6cd0ccb) - BREAKING: orm: Remove the deprecated BeforeCreater and AfterCreater aliases (
ad02707) - BREAKING: mail: Remove the deprecated WithAttachments alias (
7c57159) - BREAKING: stripe: Remove the deprecated Client.Do (
a5affc3)
Fixed
- BREAKING: stripe: Map v2 errors and validate Call paths and object ids (
4550bf6) - BREAKING: schedule: Check OnOneServer locks with cache.Shared (
3c6f831) - BREAKING: vukem: Require a declared shared cache for RATE_LIMIT_STORE=cache (
5ba0290) - schedule: Name cache.Sharer in ErrLocksNotShared (
42fe1c1) - database: Quote only an 80-byte prefix of the query in RebindChecked errors (
e7aea62) - queue: Add the seq column only on an unknown-column probe error (
cd7434a) - cli: Keep the starter upload test off the filesystem (
f4a0be4) - cli: Make key:rotate atomic and keep .env line syntax (
c063b95) - graphql: Keep loader batches whole while siblings make progress (
dc529e4) - graphql: Translate keyed resolver errors into the request locale (
427aab1) - graphql: Hide field errors wrapped in a 5xx HTTPError (
6e05325) - BREAKING: grpc: Send 5xx HTTPErrors as "internal error" and log their cause (
35832ec) - graphql: Cap how long a pending loader batch waits for progress (
2a6c078) - BREAKING: grpc: Mask unknown Validate errors and 5xx headers (
aa000e2) - auth: Answer 503 when the token store fails (
58a101b) - auth: Keep revoking possible on access_tokens without revoked_at (
30404bd) - mail: Harden Mailtrap error decoding and redirects (
a9f7b84)
Security
- cache: Document the cache.Sharer contract (
73c41d0) - vukem: Honour APP_PREVIOUS_KEYS in every APP_KEY-derived feature (
6c5084c) - web: Add AuditEvent for routine audit records at info (
35995da) - BREAKING: cli: Make the install:auth sign-up enumeration-safe (
53788f2) - BREAKING: cli: Require verified email and rate limit sign-up in install:auth (
0eb6fa2) - BREAKING: cli: End squatter access when the email is proven (
99edfe5)
0.25.0 - 2026-10-17
Added
- middleware: Log peer address and resolved client IP per request (
c6da5ad) - middleware: Add HSTSForce and HSTS_FORCE for untrusted TLS proxies (
98135e2) - stripe: Add connect resources and per-request idempotency and account options (
7970378) - stripe: Accept connect webhook secrets and expose event account (
e253c0f) - router: Report whether routes were compiled (
26f12d5) - vukem: Add WithRoutesAfterBoot for routes that need booted services (
8596784) - vukem: Let seeders reach the app with WithAppSeeders (
d2c820a) - vukem: Name seeders through an optional Name method (
da31331) - export: Stream CSV, JSON and NDJSON downloads (
50f9f6b) - errs: Add message keys and a request translator to errors (
3200fb9) - web: Show keyed http errors in the request locale (
67dd98b) - i18n: Ship built-in en and pt-BR framework messages (
5a54ca2) - auth: Translate guard errors through message keys (
6b52fdd) - social: Add message keys to callback errors (
9eed6e8) - orm: Translate unique and exists rule messages (
7c20d74) - mail: Build envelopes from the send context with ContextEnveloper (
f977288) - telegram: Add SendSync/ContactSync, Filter and RateLimit (
ed796d4) - vukem: Add TELEGRAM_LOG, TELEGRAM_RATE_LIMIT and WithTelegram (
a0e4030) - webhook: Add DeliveryLogFunc and document DeliveryLog as the extension point (
9fa44c8) - grpc: Serve rpc services on their own port as an app runner (
54bec2a) - s3: Add idempotent region-aware CreateBucket (
1586a42) - totp: Encode qr codes up to version 40 (
b078d4f) - api: Add Op.ValidateResponse to check typed handler output (
5b1736e) - BREAKING: openapi: Emit zod 4 schemas and inline request body schemas (
6204877) - vukem: Run codegen:types without a database or APP_KEY (
1f1077f) - BREAKING: i18n: Add locale source order and allowed locales to MiddlewareConfig (
3d1680d) - vukem: Add MiddlewareOptions.I18n and APIMiddlewareWith (
64f3d12) - inertia: Add RenderStatus for pages with a non-200 status (
3ffb56f) - i18n: Fail closed on invalid middleware config and vary on cookie (
d80a1ec) - vukem: Install the locale resolver in APIMiddleware (
9a35a8e) - vukem: Add ServeOpenAPIWith for prefixed, production-opted documents (
0d9b5b5) - BREAKING: schema: Add partial indexes with Index/UniqueIndex(...).Where(expr) (
52f1906) - database: Add Rebind for portable raw SQL placeholders (
1012e20) - database: Fan out query observers and add vukem.WithQueryObservers (
f983e9d) - uuid: Add stdlib UUID v4/v7 package (
6faedf8) - session: List a user's sessions and revoke one by handle (
5c70a2a) - vukem: Read SESSION_RECORD_CLIENT into the session config (
98d49bc) - auth: End sessions on every driver with a per-user session version (
81efca9) - vukemtest: Add WithSession and stamp the session version in ActingAs (
62a0836) - redis: Implement session.ListStore on the session store (
80c6b94) - cli: End every session on password reset with a session version (
bd4e878) - queue: Add Queue.SetClock and the queue.Clock driver interface (
5d334ee) - queue: Bound the worker drain with WorkOptions.StopTimeout (
486ff01) - queue: Add DispatchKindTx (
cafe81e) - redis: Implement queue.Clock on the queue driver (
84aceaf) - mail: Add Mailer.SendLaterTx (
add0822) - schedule: Add Task.OnOneServer (
3d4ac45) - BREAKING: app: Run a queue worker in serve for persistent queues (
8324377) - app: Add MailLaterTx (
a1a3f17) - app: Refuse OnOneServer schedules on the in-process cache (
08d912d) - schedule: Namespace task locks with Options.Namespace (
3c536b3) - httpclient: Add Options.WrapTransport for tracing and metrics (
27e4822) - vukem: Add App.Instrument hooks for database, queue and mail (
2ac2c2f) - otel: Add metrics, data-layer spans and OTEL_* settings from app.Source (
a76a55d) - otel: Export metrics over OTLP/HTTP from OTEL_* settings (
4ee0cb1)
Changed
- stripe: Deprecate Do in favour of Call (
d944d94)
Fixed
- middleware: Warn when HSTS_FORCE is ignored and document its scope and log privacy (
3674147) - tools: Report compatible apidiff changes as unchecked in gate mode (
77a74ed) - stripe: Refuse account scope on platform calls and decode expanded ids (
61133d0) - router: Mark the router compiled before building it (
eb7bff3) - vukem: Fail closed around routes after boot and keep the boot error (
35172ca) - middleware: Hijack through wrapped writers in gzip (
5bde2ca) - web: Sanitize Download file names (
9eb6303) - export: Renew write deadline per write and always abort mid-stream (
806c5b2) - i18n: Fill only existing catalogs of the same locale with built-in messages (
99b6c23) - errs: Copy the params given to NewKey (
ec9f1be) - broadcast: Show keyed sse refusals in the request locale (
6b4bc1d) - sse: Release a topic's broker subscription when its last subscriber leaves (
23abd7b) - telegram: Report errors outside the queue lock and never forward OnError records (
6e02e03) - sse: Make every subscriber wait for its topic relay and fail closed (
9eb5277) - vukem: Show telegram log forwarding off in about (
5cee6b7) - graphql: Fold go names of json-tagged fields in the default resolver (
27ac7f1) - graphql: Free a websocket subscription id before its terminal message (
b917414) - grpc: Refuse a cleartext production port in Server too (
1e8b11b) - BREAKING: z: Treat required on a list as present, not non-empty (
5cd14ca) - openapi: Emit minLength 1 for required strings (
abafd04) - BREAKING: openapi: Suffix component names that shadow typescript globals (
514d1c8) - vukem: Never boot a warmup app and export openapi in warmup (
5c34f59) - openapi: Reserve the fetch types the generated client uses (
d817eae) - openapi: Fail typescript codegen on colliding generated names (
2435e2b) - web: Answer 422 for z.FieldError and z.Issues returned by handlers (
bea0e86) - BREAKING: z: Hide the text of plain Refine and Custom errors (
6bdc413) - web: Fail closed on z issues and skip redirect-back for GET (
36110d0) - upload: Send z validation messages from tus completion (
e80f03b) - apidocs: Keep the nonce-only CSP and pass axe serious checks (
8ce814f) - auth: Answer problem+json on token routes and use the app clock (
890d919) - auth: Force JSON only on the error path of API guards (
cdae9a9) - openapi: Match PathPrefix on whole path segments (
6d9196b) - apidocs: Limit the CSP shim to plain style values and hide scalar.com links (
95da209) - orm: Share the Rebind lexer for WhereRaw placeholder counting (
82972f7) - dbtest: Bound each conformance subtest and shrink the MySQL bulk insert (
db74695) - orm: Lex MySQL -- comments, backticks and SQLite brackets per dialect (
d33721a) - orm: Reject $n in WhereRaw and fail closed on unterminated WHERE SQL (
d21a30b) - database: Contain panicking query observers and ignore typed nils (
e5432a9) - auth: Bind remember-me tokens to the user's session version (
e26bdc0) - cli: Delete remember-me tokens when ending a user's other sessions (
493583f) - redis: Key sessions by SHA-256 of the id and re-key legacy keys (
cb3f49b) - auth: Harden session version checks and remember-me deletion (
9ac9923) - session: Strip control and format runes from the recorded user agent (
0854dad) - app: Follow the app clock in the queue and its drivers (
e6dfa9c) - app: Stop waiting for runners that ignore ctx after SHUTDOWN_TIMEOUT (
8ad882a) - cli: Queue the verification mail in the auth scaffold (
290116c) - queue: Return reserve errors from Work with StopWhenEmpty (
d358031) - app: Create the database queue tables at boot (
c8f5c5e) - app: Namespace schedule locks by APP_NAME (
77667c7) - queue: Free only shutdown-caused interruptions, at most three in a row (
a8b4a0b) - app: Give runners three seconds of grace after SHUTDOWN_TIMEOUT (
fad85c2) - app: Name the database queue in its boot error (
ec100e3) - httpclient: Fail closed when WrapTransport returns nil (
3b3c6f8) - otel: Harden provider boot, shutdown and globals; add db.system.name (
d745922) - vukem: Chain Instrument query hooks through database observers (
2df56d3) - queue: Contain panicking job observers and add AddObserver (
d1f047b) - vukem: Add Instrument job hooks through queue.AddObserver (
88b4aee) - tools: Exempt the sessiontest conformance suite from the coverage gate (
b223724)
Security
- site: Expand cache, scheduler, idempotency, two-factor, redis and mongodb pages (
03a9a83)
0.24.0 - 2026-10-17
Added
- schema: Add named CHECK constraints with Check and DropCheck (
adb5339) - orm: Add row locks with LockForUpdate, ForShare, SkipLocked and NoWait (
9f70c15) - orm: Add CreateMany for batched multi-row inserts (
f420758) - z: Add FieldErrorKey for translatable refine messages (
c4a3e06) - z: Add StringSchema.Preprocess to normalize before checks (
39c6e26) - errs: Add ValidationError.Append without a result (
1bc6fc1) - vukemtest: Add Build to assert that an app fails to build or boot (
c9d0b10) - vukemtest: Add flash assertions for web and Inertia responses (
ff26679) - vukemtest: Add AssertNoFlash and require a present flash value (
d5f7c8b) - vukem: Run the scheduler inside serve (
fab0830) - BREAKING: vukem: Run the scheduler inside serve by default (
0cf2d69) - s3: Bind presigned PUT URLs to content type and length (
74a04f4) - mongo: Add OpenLazy and document MONGO_DATABASE and authSource (
c567860) - redis: Add OpenLazy so the app can boot while Redis is down (
3362b03) - middleware: Add CSPSources and ReportURI to SecureHeadersConfig (
b245387) - vukem: Add DefaultMiddlewareWith with CSP, stateless and bypass options (
f0aac24) - auth: Add a configurable prefix to api tokens (
0c7a622) - webhook: Add hmac, a middleware constructor that fails at boot (
ffc315a) - BREAKING: cli: Translate install:auth messages with en and pt-BR catalogs (
b1b3926) - database: Add the vukem_nosqlite build tag to leave SQLite out (
063cabc) - cli: Add vukem new --minimal and project build tags (
a879c31) - session: Store hashed ids and revoke a user's other sessions (
a79cc72) - auth: Record the session user on login (
9a33939) - cli: End other sessions on password reset and 2fa enable (
be85d8b) - database: Add Tx.AfterCommit hooks (
55ec70e) - app: Add WithJobsFunc so job handlers reach the app (
4dc4cf0) - mail: Add Mailer.SendLater (
d5740c3) - app: Encrypt queued mail payloads and wire Mailer.SendLater (
9640bd9) - vukem: Add ReadyHandler, CheckHealth and per-check health timeouts (
16b84b5) - vukem: Expose Stdout, Stderr and Stdin to app commands (
9b520b7) - BREAKING: vukem: Boot without APP_KEY outside production and fail closed on use (
2b73e60) - vukem: Add lazy cache, session and queue store options (
515e4fc) - middleware: Honour X-Forwarded-Proto only from trusted proxies (
d6fc83f) - vukem: Read TRUSTED_PROXIES and TRUST_FORWARDED_PROTO from the environment (
59b87a4) - cli: Ship a production Dockerfile and .dockerignore in every starter (
48742fb) - web: Read the client IP from a named proxy header (
5290e94) - cli: Build the starter image with the tags in .buildtags (
1584b64) - vukem: Warn at boot when TRUSTED_PROXIES trusts every address (
d6081c3)
Fixed
- orm: Make CreateMany fail closed on unordered ids and pk-only models (
c4a849f) - z: Revalidate Preprocess output and reject a nil func (
ad38233) - BREAKING: z: Honor FieldError path in Custom parser errors (
b3c5a4b) - session: Expire store sessions by the manager clock (
b1d8ac6) - session: Make the store clock race-free and test Prune with it (
83ba81a) - schedule: Bound the wait for running tasks on shutdown (
8d48a39) - admin: Match % and _ literally in list search (
18933b5) - middleware: Refuse wildcard hosts and unsafe schemes in CSPSources (
4ca3a65) - vukem: Refuse SessionBypass with Stateless and document bypass matching (
3c1c541) - social: Record used oauth states in the cache store (
d7b5e3f) - BREAKING: jwt: Require audience and issuer with a remote key set (
c0717df) - social: Stop reflecting the provider error parameter (
e0e36fd) - BREAKING: api: Bound query page and filter value lists (
ca25efb) - BREAKING: api: Scope idempotency keys by the authenticated principal (
035a90f) - auth: Keep the session when the user lookup fails (
9f3cc10) - auth: Treat wrapped no-rows errors from providers as not found (
2eb7730) - BREAKING: jwt: Detect shared key sets by interface and fail guards at boot (
df31f51) - api: Make idempotency scopes unambiguous across guards and prefixes (
a58f81c) - api: Keep default query limits for non-positive values (
9cd965e) - vite: Serve public files from the app while the dev server runs (
c73b941) - cli: Load htmx before the vite entry in starter layouts (
450f18e) - cli: Create the social user before returning it (
7f2b27f) - cli: Let the app's language catalog and English subjects back auth messages (
fec8ced) - session: Never resurrect revoked sessions and harden legacy re-key (
ed1a998) - auth: Namespace the session owner by guard (
5c9170a) - cli: Flash recovery codes before revoking sessions on 2fa enable (
e20e534) - BREAKING: queue: Refuse delays on sync and dispatch after commit without TxPusher (
01d1f13) - cli: Queue the password reset mail in the auth scaffold (
da122af) - database: Keep Tx comparable (
07e5add) - mail: Keep Mailer comparable (
74d7ef5) - database: Isolate AfterCommit hook panics and reject foreign Tx (
6acdbd0) - app: Turn a WithJobsFunc panic into the Queue error (
336f95c) - BREAKING: app: Refuse clear-text queued mail jobs by default (
af48ee4) - vukem: Type the readiness body and log write errors (
82f8a76) - BREAKING: signed,social: Refuse signing keys shorter than 32 bytes (
1308ec2) - vukem: Tolerate a missing APP_KEY only with an explicit development or test APP_ENV (
39e64d5) - cli: Derive scaffold signing keys with app.DeriveKey (
b846bd5) - vukem: Run at most one goroutine per health check (
cd7941c) - vukem: Reject nil lazy stores and detect the memory cache through any option (
eb51232) - upload: Log presign response write errors (
4338d07) - vukem: Bracket IPv6 hosts in the listen address (
0c9f8c2) - web: Return client IPs from headers in canonical form (
113d0ff) - middleware: Require one X-Forwarded-Proto line and trusted proxies (
50ca1a4)
Security
- api: State that op.security does not authenticate the route (
7cd989c)
0.23.0 - 2026-10-17
Added
- webhook: Add signed outgoing webhooks with retries and delivery log (
6706466) - postgres: Add pgtest helper for per-test databases (
c7d563c) - vukem: Add key:generate app command (
95d074a) - imaging: Add contrib/imaging for safe image thumbnails (
ddd6588) - ratelimit: Add a fixed-window limiter over a shared counter (
5da8705) - app: Choose the rate limit store with RATE_LIMIT_STORE (
a3d7737) - cli: Build scaffold rate limiters from RATE_LIMIT_STORE (
9ee7034) - app: Prune expired database cache entries hourly (
a1f9c0d) - app: Find the cache pruner through wrapped stores (
8c1bd87) - site: Add last-updated dates and a pt-BR locale (
e06cde3)
Changed
- cache: Increment database counters in one statement (
7a4814e) - site: Remove the docs version switcher (
9ebc88d)
Fixed
- webhook: Harden outgoing deliveries after review (
91fd77b) - postgres: Make pgtest cleanup robust to reconnecting pools (
1493ae4) - vukem: Send key:generate diagnostics to stderr (
7ceadeb) - imaging: Apply review findings to thumbnails (
2e33e83) - cache: Make database Increment atomic across connections (
96eff2c) - ratelimit: Hash every window key and validate limiter names (
162b6fc) - app: Refuse RATE_LIMIT_STORE=cache over the memory cache (
e977575)
Security
- webhook: Document outgoing webhooks and their security guarantees (
eb9127b) - app: Check unknown RATE_LIMIT_STORE values as a security default (
6e05120) - ratelimit: Document shared rate limits and RATE_LIMIT_STORE (
2a790ca)
0.22.0 - 2026-10-17
Added
- auth: Add owner-scoped Tokens.RevokeFor and Tokens.List (
08e001d) - webhook: Add Standard Webhooks verifier and event dedupe (
bc69938) - inertia: Share locale and translations with I18n middleware (
9813474) - upload: Cap image dimensions to stop decompression bombs (
d1bb6b8) - auth: Redirect unverified browsers to the verification notice (
230c19c) - cli: Detect the JavaScript package manager from the lockfile (
317867f) - cli: Tailwind-only Inertia starters with class-based dark mode (
d7f908d)
Fixed
- queue: Settle database jobs only while holding the reservation (
d9655c2) - cache: Store database cache values as BYTEA on Postgres (
64c3d20) - session: Do not create a session for read-only visits (
e08a266) - vukemtest: Send the app's asset version from Inertia("") (
b0c348d) - vukemtest: Keep GetJSON's Accept header to that request (
54b6716) - cli: Use a real PNG header in the starter upload test (
50994e0) - cli: Embed starter resources when APP_ENV=production (
c5c6d54) - cli: Render the 2FA QR code as an image, not raw HTML (
61b3696)
Security
- api: Refuse idempotency keys with an empty caller scope (
9963ad9) - session: Prune expired database sessions hourly (
043c3a4) - vukemtest: Add AssertHeaderContains and AssertHeaderMissing (
fa713e9)
0.21.1 - 2026-10-17
Added
- logging: Aggregate repeated identical errors (
023820b) - otel: Add trace and span ids to log records (
48a79fd)
Fixed
- crypt: Bound integer arithmetic flagged by CodeQL (
db3662c)
Security
- cli: Pin govulncheck as a go tool in new apps (
a56c203)
0.21.0 - 2026-10-17
Added
- site: Version the docs per minor with a header switcher (
77ffd25) - examples: Add the JSON API example with typed task routes (
b40242e) - examples: Add the SaaS example with Inertia, auth and billing (
27129b8)
Changed
- BREAKING: dbtest: Unexport the conformance fixture models (
0e2650a)
Deprecated
- orm: Rename create hook interfaces to BeforeCreator and AfterCreator (
acdab3e) - mail: Rename WithAttachments to Attachable (
3fb8926)
Fixed
- web: Reject same-host redirects to scheme-relative paths (
56dd98e) - graphql: Bound introspection selections (
f04dd80) - graphql: Mask 4xx errors that wrap a cause (
c3aa7e4) - web: Read every X-Forwarded-For line in Ctx.IP (
8188ae4) - middleware: Parse the media type before treating a body as JSON (
c5cb0d6) - httpclient: Block IPv6 ranges that embed IPv4 addresses (
4254b55) - grpc: Hide the text of server-fault connect errors (
30e98a9) - BREAKING: app: Refuse to boot with an unknown APP_ENV (
4824717) - BREAKING: ratelimit: Key by client IP unless a verified token is available (
994276b) - cli: Require the second factor for generated API tokens (
c34e04e) - cli: Normalize login throttle keys and revoke tokens on reset (
1ef3674) - upload: Verify only keys that Presign could have issued (
31f6178) - upload: Strip format characters from sanitized file names (
5077f1c) - upload: Count nameless multipart parts toward the limits (
5897d11) - middleware: Handle an empty path in the maintenance bypass check (
95a19ba) - mail: Reject attachment content types with line breaks (
6396868) - auth: Consume remember-me tokens atomically (
9afea58)
Security
- web: Add package overviews and examples for the http core (
f2d6475) - repo: Publish the 1.x stability policy, release cadence and upgrade guides (
e317f16) - repo: Rename the agent security rules to secure-coding.md (
3d4003b) - BREAKING: hash: Replace DefaultArgon2 var with DefaultArgon2Params (
0405c29) - repo: Add fuzz targets for untrusted-input parsers (
231f5e9) - web: Check the cleaned redirect path in SafeRedirect (
bdf0fbe) - storage: Hide dot directories and sandbox served files (
88da87a) - repo: Name the test or mechanism behind every security default (
e31231c) - security: Record the B.5.2 security review (
8ebefd8)
0.20.1 - 2026-10-17
Changed
- web: Allocate the response writer inside Ctx and add WriteString (
aa08aba) - orm: Reuse scan buffers across rows and presize limited Get (
b1b628b)
Fixed
- release: Ignore driver and contrib tags when finding the previous release (
c71f5fe)
Security
- docs: Document release signing, sboms and verification (
8b8c995)
0.20.0 - 2026-10-17
Added
- graphql: Add the contrib/graphql module with lexer and parser (
fc7fa9d) - graphql: Add schemas, validation, execution and introspection (
85a1b9a) - graphql: Add the batching loader with ORM helpers (
68a6a36) - cli: Add install:billing for Stripe subscriptions (
a6295fd) - graphql: Add subscriptions over graphql-ws and SSE (
fbf13ae) - app: Serve http/2 cleartext outside production (
5724c54) - grpc: Add the contrib/grpc module on connect-go (
3bfc1d2) - cli: Add make:proto and codegen:rpc (
30147cb) - admin: Add the admin panel package (
28a8c8c) - cli: Add install:admin and make:admin-resource (
ba460a5)
Changed
- BREAKING: grpc: Name the production reflection opt-out insecure (
724a841)
Fixed
- session: Flush through writers that only implement Unwrap (
bfae772)
Security
- graphql: Serve GraphQL over HTTP with persisted queries (
08527d5) - graphql: Document the contrib/graphql module (
e966941)
0.19.0 - 2026-10-16
Added
- social: Add Apple, LinkedIn and X sign-in (
79df84d) - stripe: Add the Stripe API client and webhook module (
fc3b71b) - s3: Add the S3 storage driver module (
4f8294a) - database: Add the mysql dialect and a url-to-dsn driver hook (
6ac1996) - schema: Generate mysql ddl and drop tables on mysql (
a543b86) - orm: Support the mysql dialect in inserts and queries (
87c0e0a) - queue: Run the database queue on mysql (
2a1f0ff) - cache: Run the database cache store on mysql (
7729bf4) - session: Add a mysql option to the sql session store (
9519aee) - boost: Read the database schema on mysql (
3c431da) - mysql: Add the drivers/mysql module for mysql 8 and mariadb 11 (
6fd67f0) - openapi: Generate typed TypeScript and Go API clients (
7c36729) - cli: Add the codegen:client app command (
d7e4ad4) - web: Add context session helpers and Partial for components (
2b600b5) - vite: Carry the Vite instance in the request context (
2dd3849) - cli: Add the templ starter (
be88bcd) - database: Add a query observer hook (
9d47072) - queue: Add a job observer hook (
3caf7c2) - events: Add a dispatch observer hook (
8a4952a) - devtools: Add the /_vukem development dashboard (
ea5bb39) - broadcast: Add channel broadcasting with an SSE transport (
c9d297f) - websocket: Serve the broadcast protocol over WebSockets (
e3319f1) - web: Let a route body limit replace the router default (
3b7b0c0) - BREAKING: middleware: Read _method from the query for multipart forms (
2aee55f) - z: Add z.File for uploaded files (
eee6e80) - cli: Add an upload demo with progress to the HTMX starter (
9f7966d) - cli: Add install:auth --2fa for TOTP two-factor authentication (
443cbfa)
Fixed
- cli: Drop the html/template upload demo from the templ starter (
cd40371)
Security
- websocket: Add the WebSocket driver module (
02b4f59) - upload: Add streaming, resumable and direct uploads (
c201582)
0.18.0 - 2026-10-16
Added
- vite: Add the vite package and view tag functions (
a118c48) - inertia: Add the Inertia v3 core adapter (
b7eb1cd) - cli: Add Vukem Boost for coding agents (
979619a) - inertia: Add prop types and partial reload filtering (
bc79c40) - inertia: Add history encryption, flash, prefetch and precognition (
bfde089) - inertia: Add the SSR client with client-side fallback (
0b1de61) - cli: Ship Vite and Tailwind v4 in the HTMX starter and prompt for the stack (
810e832) - vukemtest: Add WithInertia and Inertia assertions (
c850fdb) - cli: Add codegen:routes for typed frontend routes (
28ed3b5) - cli: Add the Inertia React starter and install:inertia (
9e671dc) - cli: Add Inertia auth pages to install:auth (
907a4cc) - web: Add a youch-style debug error page (
a6499ea) - sse: Add server-sent event streams and a topic hub (
441b456) - cli: Add maintenance mode with vukem down and up (
684a942) - auth: Add the JWT guard with JWKS rotation and refresh tokens (
55fdb77) - crypt: Add encryption with key rotation and encrypted cookies (
2ce4c00) - orm: Add the Encrypted column type (
2f1d6df) - z: Record message keys and localize issues (
8b2a353) - web: Localize validation issues from the request context (
334454d) - i18n: Add JSON catalogs, plurals and locale resolution (
b85a9ad) - view: Add the t and locale template functions (
5818c2e) - i18n: Wire translations into the app (
b9a736e) - cli: Add the Inertia Vue starter (
f35e398) - auth: Add the TOTP package with a stdlib QR encoder (
a117db6) - cli: Add the Inertia Svelte starter (
051cfbe)
Fixed
- site: Align the docs TOC with the header and drop the pre-1.0 callouts (
d3d0332)
Security
- otel: Add the OpenTelemetry driver module (
ea81f06)
0.17.0 - 2026-10-16
Added
- site: Add the Vukem icon, align the header and open on the docs (
0eb9623) - redis: Add the Redis driver module (
8691588) - mongo: Add the MongoDB driver module (
7a4d0f3)
Security
- repo: Rewrite the README after the Laravel layout (
90360c0)
0.16.0 - 2026-10-16
Added
- queue: Add typed jobs, workers and the sync and memory drivers (
405c978) - queue: Add the database driver, DispatchTx and failed-job commands (
91be143) - queue: Add make:job, queue.Fake, queued mail and queued listeners (
305e9ca) - schedule: Add the scheduler with cron expressions and overlap locks (
e42e3d8)
0.15.0 - 2026-10-16
Added
- api: Add typed handlers with api.Register (
36b8638) - openapi: Generate OpenAPI 3.1 documents from the router (
7334aa8) - vukemtest: Assert responses match the OpenAPI document (
186c1e0) - openapi: Export JSON Schema and generate TypeScript and Zod types (
e9b2c71) - api: Add the Idempotency-Key middleware (
f11fdd9) - apidocs: Serve a Scalar API reference for the OpenAPI document (
e94f6fa)
0.14.0 - 2026-10-16
Added
- examples: Add the blog example and auth.Optional (
5e13d26)
Security
- site: Document every alpha feature (
a1e5d62)
0.13.0 - 2026-10-16
Security
- security: Add SSRF-safe client, webhook signatures and security events (
393b165)
0.12.0 - 2026-10-16
Added
- logging: Add the Telegram slog handler (
8fc0ad3)
0.11.0 - 2026-10-16
Added
- subsystems: Add cache, file storage and typed events (
b0dceeb)
0.10.0 - 2026-10-16
Added
- cli: Add the JSON API starter and install:api (
253f10f)
0.9.0 - 2026-10-16
Added
- cli: Add install:auth --social with account linking (
120ea0f)
0.8.0 - 2026-10-16
Added
- cli: Add install:auth with registration, verification and password resets (
e68047e)
0.7.0 - 2026-10-16
Added
- mail: Add mailables with SMTP, Resend, log and array transports (
052df72)
0.6.0 - 2026-10-16
Added
- authz: Add gates and policies with fail-closed authorization (
a84543d)
0.5.0 - 2026-10-16
Added
- auth: Add hashers, session and token guards, and auth middleware (
4a5a95f) - social: Add OAuth2/OIDC social login with PKCE (
d60638f)
0.4.0 - 2026-10-16
Added
- orm: Add relations, factories, seeders and database rules (
0ca2389)
0.3.0 - 2026-10-16
Added
- postgres: Add the PostgreSQL driver module and conformance suite (
8283d33)
Changed
- BREAKING: Rename the framework to Vukem (
f7e19e0)
0.2.0 - 2026-10-16
Added
- api: Add REST toolkit with pagination, query conventions and rate limiting (
6e779bd)
0.1.1 - 2026-10-16
Added
- cli: Answer JSON from the starter's post controller (
fc2cf50)
0.1.0 - 2026-10-16
Changed
- Maintenance release (no user-facing changes).
0.0.12 - 2026-10-16
Added
- BREAKING: cli: Add vukem new with the HTMX + SQLite starter (
92d44b2)
0.0.11 - 2026-10-16
Added
- cli: Add the vukem command with generators, serve, build and delegation (
0abc848)
0.0.10 - 2026-10-16
Added
- vukemtest: Add testing toolkit with fluent client and DB assertions (
c3a9400)
0.0.9 - 2026-10-16
Added
- view: Add html/template views, htmx 4 helpers and fragments (
e45d36e)
0.0.8 - 2026-10-16
Added
- orm: Add database connections, generic query builder and migrations (
2d17f79)
0.0.7 - 2026-10-16
Added
- session: Add sessions, flash, old input and csrf protection (
a62538f)
0.0.6 - 2026-10-16
Added
- z: Add zod-style typed schemas and web parsing (
23b1438) - site: Add documentation site with Next.js 16, Tailwind v4 and Base UI (
aaa45f6)
Fixed
- deps: Require go1.27.2 toolchain for standard library security fixes (
bcab5a8)
0.0.5 - 2026-10-16
Added
- middleware: Add built-in middleware, app HTTP wiring and commands (
2af9fd4)
0.0.4 - 2026-10-16
Added
- router: Add ServeMux router, web.Ctx, errs and problem details (
9ba13bd)
0.0.3 - 2026-10-16
Added
- app: Add App, provider lifecycle, runners and HTTP server (
255eee4)
0.0.2 - 2026-10-16
Added
- config: Add .env parser, typed struct loading, secrets and app key (
736332a)
0.0.1 - 2026-10-16
Project foundation. No framework code yet; see PLAN.md for the roadmap.
Added
- Research on Laravel 13, AdonisJS v7, Goravel, the Go ecosystem, Inertia v3 and htmx 4 (
docs/golang-web-search.md). - Design decision log (
docs/brainstorming.md) and design docs: architecture, configuration, HTTP, REST APIs, security (OWASP Top 10:2025), databases, authentication, frontend, CLI, subsystems, testing and tooling. - Phased plan (
PLAN.md): Prototype, ALPHA, BETA and 1.0 Stable, with verifiable tasks and exit criteria. - Conventional Commits validator (
internal/tools/commitlint) used by thecommit-msghook. - Tooling: golangci-lint v2 (gofumpt, gci, golines, depguard), markdownlint-cli2, lefthook hooks, Taskfile, git-cliff,
.editorconfigand.gitattributes. - GitHub workflows (CI, PR title, CodeQL), Dependabot, issue forms and PR template.
- README, MIT license, CONTRIBUTING, SECURITY and CODE_OF_CONDUCT.
- Agent configuration:
AGENTS.md,CLAUDE.md, path-scoped.claude/rules/, Go skills and project settings.