[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"journal-post-summercms-0-5-3":3},{"author":4,"categories":8,"content":13,"content_html":14,"created_at":15,"excerpt":16,"featured_image_url":13,"featured_images":17,"id":18,"is_pinned":19,"metadata":13,"next_post":20,"previous_post":24,"published":28,"published_at":29,"reading_time":30,"related_posts":31,"slug":32,"sources":13,"tags":33,"title":34,"translations":13,"updated_at":35},{"first_name":5,"id":6,"last_name":5,"login":7},"",1,"jakubzych@gmail.com",[9],{"id":10,"name":11,"slug":12},2,"Framework","framework",null,"\u003Ch2>Highlights\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>summer make:*\u003C\u002Fcode> produces code that works without hand fixes: plugins land under \u003Ccode>plugins\u002F&lt;vendor&gt;\u002F&lt;name&gt;\u003C\u002Fcode>, admin controllers boot with their model, a delete button and an \u003Ccode>AdminFS\u003C\u002Fcode>, and migrations made in the same second run in the order they were created.\u003C\u002Fli>\n\u003Cli>Uploads that are not plain raster images are stored as downloads, so a public bucket or CDN no longer renders an uploaded HTML file.\u003C\u002Fli>\n\u003Cli>The admin tells open tabs when a new version has been deployed, and reloads once by itself when a deploy removed a code chunk the tab still needed.\u003C\u002Fli>\n\u003Cli>\u003Ccode>--help\u003C\u002Fcode>, \u003Ccode>list\u003C\u002Fcode> and shell completion no longer print plugin boot logs.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Added\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>Admin reload banner.\u003C\u002Fstrong> boardwalk computes a build id from the embedded admin and the binary's build info (Go version, VCS revision, dependency versions), sends it as \u003Ccode>X-Summer-Build\u003C\u002Fcode>, answers \u003Ccode>{prefix}\u002Fbuild.json\u003C\u002Fcode> and writes it into the admin page. An open tab checks it on focus, on visibility and every five minutes, and shows a non-blocking \"new version\" banner with Reload and Close. A failed chunk load after a deploy reloads the page once.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Role holders.\u003C\u002Fstrong> The Roles form has an Administrators tab listing who holds the role. Superusers stay hidden from editors who are not superusers.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Admin action audit log.\u003C\u002Fstrong> A successful toolbar or field action run is logged with the admin id, controller, action and kind. Posted values and record contents are never logged.\u003C\u002Fli>\n\u003Cli>\u003Ccode>attach.IsInlineContentType\u003C\u002Fcode>, the one list of types served inline (JPEG, PNG, GIF, WebP, AVIF); the uploads route uses it too.\u003C\u002Fli>\n\u003Cli>\u003Ccode>bonfire.FlagBool\u003C\u002Fcode> and \u003Ccode>bonfire.ErrWriter\u003C\u002Fcode>; \u003Ccode>diary.Options.Args\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>make:admin-controller --model\u003C\u002Fcode>, defaulting to the singular of the controller name.\u003C\u002Fli>\n\u003Cli>\u003Ccode>make:command\u003C\u002Fcode> functions may take \u003Ccode>*backpack.App\u003C\u002Fcode>.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Changed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>make:plugin acme.blog\u003C\u002Fcode> now creates \u003Ccode>plugins\u002Facme\u002Fblog\u003C\u002Fcode>. Existing \u003Ccode>plugins\u002F&lt;name&gt;\u003C\u002Fcode> layouts keep working; moving one is optional (see \"Upgrading: plugins without a vendor directory\" on the Scaffolding page).\u003C\u002Fli>\n\u003Cli>Scaffolded files you edit start with \u003Ccode>\u002F\u002Fsummer:make &lt;kind&gt;\u003C\u002Fcode> instead of a \"Code generated … DO NOT EDIT\" header, so linters check them. Files with the old header are still picked up.\u003C\u002Fli>\n\u003Cli>\u003Ccode>summer new\u003C\u002Fcode> puts its starter plugin under \u003Ccode>plugins\u002F&lt;vendor&gt;\u002F&lt;name&gt;\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>attach.Store\u003C\u002Fcode> saves \u003Ccode>Content-Disposition: attachment\u003C\u002Fcode> with every blob that is not an inline raster image. PDFs and SVGs served straight from a public bucket or CDN now download instead of opening in the browser; the built-in uploads route already behaved this way.\u003C\u002Fli>\n\u003Cli>A delegated command that dies by a signal exits with 128+n (130 for Ctrl+C) instead of 1.\u003C\u002Fli>\n\u003Cli>The console no longer depends on fang; help and error rendering are bonfire's own.\u003C\u002Fli>\n\u003Cli>\u003Ccode>lagoon.AfterCommit\u003C\u002Fcode> logs a warning when work is registered after the statement's after-commit flush already ran (that work never runs).\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Fixed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>make:*\u003C\u002Fcode>, \u003Ccode>plugin:add\u003C\u002Fcode> and \u003Ccode>summer new\u003C\u002Fcode> no longer add a second \u003Ccode>toolchain\u003C\u002Fcode> line to a \u003Ccode>go.mod\u003C\u002Fcode> or \u003Ccode>go.work\u003C\u002Fcode> that already has one, which made Go refuse to load the workspace.\u003C\u002Fli>\n\u003Cli>The global flags' \u003Ccode>=value\u003C\u002Fcode> forms are read correctly, invalid UTF-8 no longer slips past output sanitising, and live views keep blank lines, print errors above themselves and shut down cleanly on a signal.\u003C\u002Fli>\n\u003Cli>A forced-colour console no longer drops records meant only for terminals.\u003C\u002Fli>\n\u003Cli>The lagoon README's \u003Ccode>OnDatabase\u003C\u002Fcode> example registers its callback before GORM's commit, and pivot-ordered reads are documented with an explicit join.\u003C\u002Fli>\n\u003C\u002Ful>\n","2026-10-28T22:29:54+00:00","Scaffolder fixes, safer uploads, a reload banner for new admin builds, quieter --help, and console fixes.",[],47,false,{"id":21,"slug":22,"title":23},51,"sm-oauthserver-plugin-0-1-4","sm-oauthserver-plugin 0.1.4",{"id":25,"slug":26,"title":27},54,"sm-user-plugin-0-1-17","sm-user-plugin 0.1.17",true,"2026-10-28T22:29:37+00:00",3,[],"summercms-0-5-3",[],"SummerCMS 0.5.3","2026-10-29T10:18:01+00:00"]