litestar-org/litestar-skills/litestar-granian
Claude Code and agent skill by litestar-org/litestar-skills
- community
Checking that the SKILL.md file is still in the repository.
Auto-activate for litestar_granian, GranianPlugin, litestar run Granian options, runtime threads, HTTP/2, TLS, access logs, metrics, static mounts, or worker lifecycle. Not for non-Granian servers.
Install
npx vskill@latest install litestar-org/litestar-skills/litestar-granianSKILL.md
litestar-granian
litestar-granian replaces Litestar's run command with a supervised Granian command and bridges Litestar's active log formatter into Granian worker processes. It requires Granian 2.8.0 or later (using Granian 2.8.7).
Code Style Rules
- Keep handlers async when they perform I/O.
- Configure the server at the command line or programmatically via
granian.Granian. GranianPlugintakes only an optionalstaticmode keyword argument ("off"or"auto").- Use the
litestar runoption names documented here. Do not substitute similarly named options from older Granian or Uvicorn releases.
Quick Reference
Register the plugin
GranianPlugin registers the Granian-backed run command. When litestar run starts, litestar-granian inspects the active "litestar" standard-library logger (or app.logging_config, including standard_lib_logging_config wrapped by StructlogPlugin), serializes the active formatter into a temporary JSON dictConfig (--log-config), and reconstructs matching generic (_granian) and access (granian.access) formatters inside Granian worker processes.
Defaults in 0.17.0 / Granian 2.8.7
| Concern | Default | ||
|---|---|---|---|
| Sockets and Bind | 127.0.0.1:8000 | ||
| HTTP mode | auto (HTTP/1 and HTTP/2 supported; HTTP/3 not supported) | ||
| Workers | 1 worker (process on GIL builds; thread on free-threaded builds) | ||
| Runtime threads | 1 per worker | ||
| Runtime blocking threads | Automatically selected (512 in Granian when unset) | ||
| Blocking threads | 1 on ASGI (fixed; > 1 only supported on WSGI; 30s idle timeout) | ||
| Runtime mode | auto (resolves to mt on ASGI) | ||
| Event loop | auto (Granian's standard selection; optional loops require their extras) | ||
| Async task implementation | asyncio (optional experimental rust on Python < 3.12) | ||
| Backlog | 1024 globally (minimum 128) | ||
| Backpressure | backlog / workers per worker (minimum 1) | ||
| Granian log | Enabled at info (--granian-log, --granian-log-level) | ||
| Access log | Disabled (--granian-access-log, --granian-access-log-fmt) | ||
| WebSockets | Enabled (--ws); automatically disabled in HTTP/2-only mode | ||
| Process supervision | Supervised process group (always) | ||
| Reload | Disabled (--reload; not supported on free-threaded Python) | ||
| Metrics | Disabled; 127.0.0.1:9090 when enabled with --metrics | ||
| Static-file cache | 86400 seconds; no implicit route or mount | ||
| Minimum TLS protocol | TLS 1.3 (`--ssl-protocol-min [tls1.2\ | tls1.3]`) |
Valid Production Controls
Use these option families:
| Concern | Options | |||
|---|---|---|---|---|
| Processes and runtime | --workers (--wc, --web-concurrency, -W), --blocking-threads, --blocking-threads-idle-timeout, --runtime-threads, --runtime-blocking-threads, --runtime-mode, --loop, --task-impl | |||
| Capacity and flow control | --backlog, --backpressure | |||
| Protocols | `--http [auto\ | 1\ | 2], --ws / --no-ws, --http1-`, `--http2-` | |
| Granian logging | --granian-log / --granian-no-log, --granian-log-level, --granian-access-log / --granian-no-access-log, --granian-access-log-fmt | |||
| Litestar logging | --log-config (formatter matching is automatic) | |||
| TLS & mTLS | --ssl-certificate (--ssl-certfile alias), --ssl-keyfile, --ssl-keyfile-password, --ssl-protocol-min, --ssl-ca, --ssl-crl, --ssl-client-verify / --no-ssl-client-verify, --create-self-signed-cert | |||
| Worker lifecycle | --respawn-failed-workers / --no-respawn-failed-workers, --respawn-interval, --workers-lifetime, --workers-kill-timeout, --workers-max-rss, --rss-sample-interval, --rss-samples | |||
| Reload & debug (dev) | --reload (-r), --reload-paths (--reload-dir, -R), --reload-include (-I), --reload-exclude (-E), --reload-ignore-dirs, --reload-ignore-patterns, --reload-ignore-paths, --reload-tick, --reload-ignore-worker-failure, --debug (-d), --pdb (--use-pdb, -P) | |||
| Operations | --uds (--unix-domain-socket, -U), --uds-permissions, --fd (--file-descriptor, -F), --url-path-prefix, --process-name, --pid-file, --working-dir, --env-files, --metrics / --no-metrics, --metrics-address, --metrics-port, --metrics-scrape-interval | |||
| Static mounts | Repeatable --static-path-route and --static-path-mount, plus --static-path-dir-to-file and --static-path-expires |
Supervision and Litestar CLI Parity
litestar run has one execution model: the Litestar parent enters server lifespans once and supervises a fresh Granian child process group.
- POSIX: Starts Granian in a new session (
start_new_session=True) and forwards signals (SIGINT,SIGTERM,SIGHUP) to the process group (os.killpg). - Windows: Uses a new process group (
CREATE_NEW_PROCESS_GROUP) andCTRL_BREAK_EVENTfor graceful shutdown, escalating to list-basedtaskkillonly if needed. - Graceful Shutdown & Deadlines: The first termination signal is forwarded once and starts a deadline of
--workers-kill-timeoutplus five seconds (the CLI default is 5 seconds). A second signal or an expired deadline kills the process group. - Server Lifespans: Litestar's server lifespans stay active until Granian exits and are unwound cleanly after child termination.
- Sidecar Variables: Server-lifespan sidecars receive the resolved
LITESTAR_APP,LITESTAR_HOST, andLITESTAR_PORT, which is how frontend dev-server sidecars (e.g. Vite) learn the real server bind. - Socket Activation: Inherited file descriptors (
-F/--fd/--file-descriptor) are supported on POSIX systems (e.g. systemd socket activation).
Native Static Discovery
GranianPlugin(static=...) is the plugin's only constructor option:
"off"(the default) keeps Litestar's static routing."auto"lets Granian serve exactly one compatible static provider natively when its configuration is safe, and falls back to Litestar otherwise.- Explicit
--static-path-*CLI mounts always take precedence over either mode. Any other value raisesValueErrorat construction.
Metrics and Observability
Metrics are off by default and are controlled only by --metrics / --no-metrics. --metrics exposes Granian server and worker metrics only at http://<metrics-address>:<metrics-port>/metrics. When no Litestar Prometheus middleware is detected, the command warns that application-level request metrics are not being exported — register Litestar's PrometheusPlugin alongside it when request metrics are desired.
Proxy Headers (granian.utils.proxies)
Granian does not expose --proxy-headers or --forwarded-allow-ips CLI flags. When running behind a reverse proxy that sets X-Forwarded-For and X-Forwarded-Proto, register granian.utils.proxies.wrap_asgi_with_proxy_headers on Litestar(middleware=[...]):
Programmatic / Embedded Runtime
Granian can also be executed programmatically directly from Python:
<workflow>
Workflow
Step 1: Match the project's deployment stack
Use GranianPlugin when the project already uses litestar-granian or needs its Granian-specific CLI, HTTP/2, runtime, worker-lifecycle, metrics, or static mount controls.
Keep the project's existing ASGI server when its deployment platform, process manager, observability, or operational runbooks depend on that server. Do not replace an established server solely because Granian is available.
Use the bare granian CLI only when deployment tooling intentionally invokes Granian directly. Its CLI is a separate surface; consult the matching Granian release instead of copying litestar run options.
Step 2: Install and register
Add GranianPlugin() to Litestar(plugins=[...]), then run the application through litestar --app <module>:<app> run.
Step 3: Configure logging
Supervised execution is standard and matches Granian's formatter to Litestar's automatically:
--in-subprocess / --no-subprocess and --use-litestar-logger / --no-litestar-logger are accepted for backwards compatibility, but they are ignored and print a deprecation warning. Remove them from deployment scripts.
Pass an explicit JSON --log-config only when overriding the automatic formatter matching completely.
Step 4: Configure the deployment and capacity
Measure the application before changing workers, runtime threads, or backpressure. Preserve the auto runtime defaults unless load tests justify a specific runtime mode.
Terminate TLS at the platform proxy when that is the project's established boundary. For Granian-managed TLS, pass both the certificate and key:
Step 5: Verify the effective command
Confirm the required options appear, start the service, exercise health and WebSocket endpoints, and load-test production capacity settings.
</workflow>
<guardrails>
Guardrails
This is the start of the file. Read the full SKILL.md on GitHub.
Security
- Security scanPassed, 100 of 100Pattern checks on the skill's files.
- Model reviewNot runA model review is scheduled for the next rescan.
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingskills/litestar-granian/SKILL.md
Popularity
- 7-day trend score
- 0
Not refreshed yet.
Works with
Any agent vskill installs to: 56 targets in all. These 39 have a page on this site.
- Claude Code
- Cursor
- GitHub Copilot
- Windsurf
- Codex
- Gemini CLI
- Cline
- Amp
- Roo Code
- Goose
- Continue
- Kilo Code
- Junie
- Trae
- OpenHands
- Qwen Code
- AI Agent
- Tabnine Chat
- Sourcegraph Cody
- Amazon Q
- Firebase Genkit
- Sweep
- Devin
- Phind
- Mentat
- Claude Desktop
- Aider
- GPT Pilot
- Plandex
- bolt.new
- v0
- Replit Agent
- Anse
- TypingMind
- BetterChatGPT
- LibreChat
- Warp AI
- Pieces
- Fig AI
Embed badge
[](https://verified-skill.com/skills/litestar-org/litestar-skills/litestar-granian)