[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"journal-post-summercms-0-3-1":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":10,"related_posts":30,"slug":31,"sources":13,"tags":32,"title":33,"translations":13,"updated_at":34},{"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>One-time cache values.\u003C\u002Fstrong> \u003Ccode>Cache.Pull\u003C\u002Fcode> reads a value and deletes it in one atomic step, so a code or ticket stored in the cache can be redeemed only once, even when two requests race for it.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Branded error pages for browsers.\u003C\u002Fstrong> A visitor who opens a missing page, uses a wrong method or hits a server error in the browser now sees a SummerCMS page instead of a bare line of text. API clients see the same responses as before.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Added\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>cooler.Cache.Pull(ctx, key)\u003C\u002Fcode> returns the value at a key and removes it, like Laravel's \u003Ccode>Cache::pull\u003C\u002Fcode>. Of two concurrent callers, at most one gets the value; missing and expired keys report \"not found\". The Redis driver uses \u003Ccode>GETDEL\u003C\u002Fcode> (Redis 6.2 or newer); the memory driver runs under the per-key lock. The caching guide has a new \"One-time values\" section.\u003C\u002Fli>\n\u003Cli>surf renders a self-contained HTML page for framework-generated 404, 405 and 500 responses to browser navigations: unmatched routes, wrong methods, failed route constraints, the unpublished uploads route and recovered panics. API paths, the admin, JSON and XHR requests keep their exact bodies.\u003C\u002Fli>\n\u003Cli>The error page shows the method, path and request ID only with \u003Ccode>app.debug\u003C\u002Fcode> on or outside production.\u003C\u002Fli>\n\u003Cli>Applications and themes can replace the page by publishing a \u003Ccode>surf.ErrorPageRenderer\u003C\u002Fcode> from \u003Ccode>Register\u003C\u002Fcode>; \u003Ccode>http.error_pages.enabled: false\u003C\u002Fcode> turns the HTML pages off for every client.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Changed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Ccode>cooler.Cache\u003C\u002Fcode> has a new method, \u003Ccode>Pull\u003C\u002Fcode>. If you implement the interface yourself, for example as a test fake, add it when upgrading.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Fixed\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>The caching docs now name the site's purge-token variable correctly: \u003Ccode>NUXT_CACHE_PURGE_TOKEN\u003C\u002Fcode> (and \u003Ccode>NUXT_CACHE_PURGE_ALLOW_PROXIED\u003C\u002Fcode>), not a \u003Ccode>NUXT_SITE_*\u003C\u002Fcode> name, which the SEO module would publish in every page's payload.\u003C\u002Fli>\n\u003C\u002Ful>\n","2026-10-20T22:03:10+00:00","One-time cache values with Cache.Pull and branded error pages for browser visitors.",[],34,false,{"id":21,"slug":22,"title":23},33,"summercms-0-3-0","SummerCMS 0.3.0",{"id":25,"slug":26,"title":27},35,"summercms-0-4-0","SummerCMS 0.4.0",true,"2026-10-20T22:00:28+00:00",[],"summercms-0-3-1",[],"SummerCMS 0.3.1","2026-10-29T10:18:11+00:00"]