[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"journal-post-summercms-0-4-0":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>\u003Cstrong>An Artisan-style console.\u003C\u002Fstrong> \u003Ccode>list\u003C\u002Fcode> groups commands by namespace, \u003Ccode>help &lt;command&gt;\u003C\u002Fcode> shows a long description and worked examples, and every command accepts the same global options: \u003Ccode>-v\u003C\u002Fcode>, \u003Ccode>-vv\u003C\u002Fcode> and \u003Ccode>-vvv\u003C\u002Fcode>, \u003Ccode>-q\u003C\u002Fcode>, \u003Ccode>--ansi\u003C\u002Fcode> and \u003Ccode>--no-ansi\u003C\u002Fcode>, \u003Ccode>-n\u003C\u002Fcode> and \u003Ccode>--env\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Logging with components and daily files.\u003C\u002Fstrong> The new \u003Ccode>diary\u003C\u002Fcode> module sends every log record through a named component (\u003Ccode>http\u003C\u002Fcode>, \u003Ccode>db\u003C\u002Fcode>, \u003Ccode>river\u003C\u002Fcode>, \u003Ccode>serve\u003C\u002Fcode>, \u003Ccode>queue\u003C\u002Fcode> and one per plugin), redacts secrets on the console and writes warnings and up to \u003Ccode>storage\u002Flogs\u002Fsummer-YYYY-MM-DD.log\u003C\u002Fcode>, kept for 14 days. Configure it in \u003Ccode>config\u002Flog.yaml\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Startup summaries and shutdown reports.\u003C\u002Fstrong> \u003Ccode>serve\u003C\u002Fcode> opens with a compact block (version, environment, URL, admin, database host and migration state, plugins, queue, scheduler, mail, cache, realtime and search) and closes on Ctrl+C with a report of requests served and drained, worker jobs and uptime. \u003Ccode>queue:work\u003C\u002Fcode> and \u003Ccode>schedule:run\u003C\u002Fcode> do the same.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Added\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>list --format=json\u003C\u002Fcode> and help with examples for every framework command and every \u003Ccode>summer\u003C\u002Fcode> tool command.\u003C\u002Fli>\n\u003Cli>Error blocks with a hint where the framework knows the fix: an empty or unreachable database, an invalid \u003Ccode>app.key\u003C\u002Fcode>, a missing uploads bucket, pending migrations, and running an application binary or a \u003Ccode>summer make:\u003C\u002Fcode> command from the wrong directory.\u003C\u002Fli>\n\u003Cli>\u003Ccode>--json\u003C\u002Fcode> on \u003Ccode>migrate:status\u003C\u002Fcode>, \u003Ccode>key:generate\u003C\u002Fcode>, \u003Ccode>route:list\u003C\u002Fcode>, \u003Ccode>admin:token:create\u003C\u002Fcode>, \u003Ccode>admin:token:list\u003C\u002Fcode>, \u003Ccode>admin:token:scopes\u003C\u002Fcode> and \u003Ccode>websockets:health\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Ccode>--pretend\u003C\u002Fcode> on \u003Ccode>migrate\u003C\u002Fcode>, \u003Ccode>migrate:rollback\u003C\u002Fcode> and \u003Ccode>deferred:purge\u003C\u002Fcode>, which show what would change without writing.\u003C\u002Fli>\n\u003Cli>\u003Ccode>--force\u003C\u002Fcode> on \u003Ccode>migrate\u003C\u002Fcode>, \u003Ccode>migrate:rollback\u003C\u002Fcode>, \u003Ccode>deferred:purge\u003C\u002Fcode> and \u003Ccode>queue:clear\u003C\u002Fcode>, which skips the production confirmation.\u003C\u002Fli>\n\u003Cli>Result lines: \u003Ccode>Applied N migrations\u003C\u002Fcode> or \u003Ccode>Nothing to migrate\u003C\u002Fcode>, \u003Ccode>Rolled back &lt;id&gt; of &lt;plugin&gt;\u003C\u002Fcode>, \u003Ccode>Cleared N jobs from &lt;queue&gt;\u003C\u002Fcode>, \u003Ccode>Built bin\u002F&lt;app&gt; in &lt;time&gt;\u003C\u002Fcode> and \u003Ccode>Created &lt;path&gt;\u003C\u002Fcode> for each scaffolded file.\u003C\u002Fli>\n\u003Cli>Spinners, progress bars and prompts behind the console output, so they disappear under \u003Ccode>-q\u003C\u002Fcode> and off a terminal.\u003C\u002Fli>\n\u003Cli>For plugin authors: \u003Ccode>bonfire.Example\u003C\u002Fcode>, \u003Ccode>Command.Long\u003C\u002Fcode>, \u003Ccode>Command.Examples\u003C\u002Fcode> and \u003Ccode>Command.Hidden\u003C\u002Fcode>; \u003Ccode>bonfire.CheckDocs\u003C\u002Fcode> to test that commands are documented; \u003Ccode>bonfire.WithHint\u003C\u002Fcode>, \u003Ccode>bonfire.Reported\u003C\u002Fcode> and \u003Ccode>bonfire.Usage\u003C\u002Fcode> for errors; \u003Ccode>diary.For(\"&lt;component&gt;\")\u003C\u002Fcode> for a plugin's own logger.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Changed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Run \u003Ccode>summer build\u003C\u002Fcode> after you move to 0.4: the generated \u003Ccode>main.go\u003C\u002Fcode> now sets up logging before the configuration is read, parses the global options and returns the new exit codes.\u003C\u002Fli>\n\u003Cli>Two commands with the same name, or a command flag named like a global option, stop the binary at start-up with an error naming it.\u003C\u002Fli>\n\u003Cli>Daily log files are on by default. The \u003Ccode>storage\u002Flogs\u003C\u002Fcode> directory must be writable; set \u003Ccode>log.default: console\u003C\u002Fcode> to keep console-only logging.\u003C\u002Fli>\n\u003Cli>The request log is on by default: one record per request with the route pattern (never the path), status, duration and request id. Silence it with \u003Ccode>components: {http: warn}\u003C\u002Fcode> or turn it off with \u003Ccode>http.access_log: false\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>GORM logs through component \u003Ccode>db\u003C\u002Fcode> and no longer logs record-not-found; River logs through component \u003Ccode>river\u003C\u002Fcode>, warnings and up by default.\u003C\u002Fli>\n\u003Cli>A failed command exits 1 and a usage error (unknown command or flag, wrong number of arguments) exits 2.\u003C\u002Fli>\n\u003Cli>\u003Ccode>-q\u003C\u002Fcode> hides information lines, spinners and progress bars, but still prints the data a command exists to produce: tokens, keys and \u003Ccode>--json\u003C\u002Fcode> output.\u003C\u002Fli>\n\u003Cli>\u003Ccode>migrate\u003C\u002Fcode>, \u003Ccode>migrate:rollback\u003C\u002Fcode>, \u003Ccode>deferred:purge\u003C\u002Fcode> and \u003Ccode>queue:clear\u003C\u002Fcode> ask for confirmation in production on an interactive terminal only; deploy scripts over SSH run as before.\u003C\u002Fli>\n\u003Cli>Off a terminal, \u003Ccode>serve\u003C\u002Fcode> logs a \u003Ccode>startup summary\u003C\u002Fcode> record and keeps the \u003Ccode>listening on &lt;addr&gt;\u003C\u002Fcode> line that scripts wait for.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Fixed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>summer dev\u003C\u002Fcode> now runs \u003Ccode>bin\u002F&lt;app&gt; serve\u003C\u002Fcode>; before, it started the binary without a command, which printed the help and stopped.\u003C\u002Fli>\n\u003Cli>\u003Ccode>summer dev\u003C\u002Fcode> stops the old server before it starts the rebuilt one, so the restart no longer fails on a busy port.\u003C\u002Fli>\n\u003Cli>\u003Ccode>summer dev\u003C\u002Fcode> exits 0 after Ctrl+C with a short report instead of printing the cancellation as an error.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>See \"Upgrading to 0.4\" in the upgrading guide for the full list.\u003C\u002Fp>\n","2026-10-21T13:44:58+00:00","An Artisan-style console: help with examples, global options on every command, component logging with daily files, and startup summaries and shutdown reports.",[],35,false,{"id":21,"slug":22,"title":23},34,"summercms-0-3-1","SummerCMS 0.3.1",{"id":25,"slug":26,"title":27},36,"summercms-0-4-1","SummerCMS 0.4.1",true,"2026-10-21T13:43:16+00:00",3,[],"summercms-0-4-0",[],"SummerCMS 0.4.0","2026-10-29T10:18:11+00:00"]