Changes for version 0.31 - 2026-08-23
- ADDS: kits. `punk new MyApp --kit diy` generates through Punk::Kit::Diy instead of the basic skeleton
- A kit subclasses Punk::Generate, keeps its templates in skel/ beside its own module, and declares the options it takes, which are read out of argv before Getopt runs so they parse and show up under `punk new --kit NAME --help` like the command's own
- ADDS: hook before_render. Runs once per $c->render, after Punk's own binds (url, csp_nonce, locale), with the data hashref the engine is about to receive - so a plugin can put a value into every template without the handler passing it.
- ADDS: Punk::Command->load_app, the public form of what every application-loading command does, for a command in another distributio
- ADDS: $t->request_header in Punk::Test - a header on every request from here on
- ADDS: named routes. A route takes { name => 'book' }, and $c->url_for('book', id => 42) gives back its path
- In a template, {% url.books %} for a static route and {% row | url_for('book') %} for one with captures
- ADDS: `layout` as a render option. $c->render($tpl, \%data, layout => undef) renders a template without the configured wrapper
- ADDS: $c->fragment($tpl, \%data, %opts) - render with no layout and Cache-Control: private
- ADDS: $app->databases - the configured databases read back, a deep copy keyed by name with `default` for the unnamed one
- ADDS: $app->on_compile($code, $owner?) - a callback for to_app, run in registration order after every keyword has recorded and before anything is compiled
- ADDS: filter operators on Punk::Model search and count, on both backends: = != < <= > >= in not_in like starts_with, as { column => { op => value } } beside the plain equality.
- ADDS: order_by on search - a column, or [ column => 'asc'|'desc', ... ] pairs
- ADDS: count(\%filter) on the model and both backends.
- ADDS: $c->txn(sub { my ($tx) = @_; ... }) and $c->txn($database => sub { ... }), with Punk::Txn
Documentation
the Punk command line
Modules
a MVC web framework
the per-application registry and boot compiler
the authentication battery
password hashing
cross-origin resource sharing
single-use CSRF tokens
a pluggable cache with TTL
a cache store on disk, shared by the whole worker pool
an in process cache store, bounded by bytes
the punk command line: registry, dispatcher and commands
YAML configuration with secrets kept out of the file
the per-request object
base class for Punk controllers
the development error page
an async result that runs on the loop, or blocks
scaffold a new Punk application
security response headers
a level-based logger
the storage-agnostic model tier
the default DBI backend for Punk models
a non-blocking backend for Punk models
a directory of markdown as a documentation site
the api mount: spec-first operations
base class for Punk plugins
content addressed storage for uploads
Content-Security-Policy with a per request nonce
ETags and 304s for dynamic responses
liveness and readiness probes that mean different things
translations and language negotiation
Idempotency on unsafe methods
a Prometheus endpoint whose labels cannot run away
give every request an id
sitemap.xml and robots.txt from the route table
rate limiting and IP blocking over Hyperman's shared arena
a lazy wrapper over the PSGI environment
a response builder
the compiled-at-boot route tables (XS)
the handle an under returns
a Server-Sent Events stream
the bounded body of a ranged send_file response
signed cookie sessions
server-side sessions, on any store
serving files from a directory
an in-process test client for Punk applications
a pure-Perl RFC 6455 codec for testing WebSocket servers
the client side of one WebSocket connection
the transaction a < $c-txn >> block receives
the outbound HTTP agent on the context
an uploaded file from a multipart form
collecting request validation
the Template::Stencil view engine
the pluggable view engine registry (XS)
a WebSocket connection
pub/sub groups of WebSocket connections
Examples
- example/Chat/README.pod
- example/Chat/app.psgi
- example/Chat/bin/make-cert
- example/Chat/bin/punk-chat
- example/Chat/bin/tls-proxy
- example/Chat/docs/api.md
- example/Chat/docs/index.md
- example/Chat/docs/reference/config.md
- example/Chat/docs/running.md
- example/Chat/docs/websockets.md
- example/Chat/lib/Chat.pm
- example/Chat/lib/Chat/Auth.pm
- example/Chat/lib/Chat/Bus.pm
- example/Chat/lib/Chat/Controller/API/Message.pm
- example/Chat/lib/Chat/Controller/WS/Chat.pm
- example/Chat/lib/Chat/Controller/Web/Chat.pm
- example/Chat/lib/Chat/Model/Message.pm
- example/Chat/lib/Chat/Schema.pm
- example/Chat/openapi.json
- example/Chat/root/static/chat.css
- example/Chat/root/static/chat.js
- example/Chat/root/templates/index.tmpl
- example/Chat/root/templates/layout.tmpl
- example/Chat/root/templates/room.tmpl
- example/Chat/tls/server.crt
- example/Chat/tls/server.key