volfpeter/holm/holm-web
Claude Code and agent skill by volfpeter/holm
- community
Checking that the SKILL.md file is still in the repository.
Use when working on web apps built with holm, or to answer questions about holm. Covers file-system routing, layouts, pages, actions, page metadata, form handling, error handling, partial HTML and HTMX considerations.
Install
npx vskill@latest install volfpeter/holm/holm-webSKILL.md
Building holm web applications
Architecture summary
FastAPI: underlying web framework; allholmpages, layouts, actions, and metadata are FastAPI dependencies (so they can all beasync)htmy: async, pure-Python HTML component engine; JSX-like syntax withhtml.div(...), full typing, async support, and context (no prop drilling)FastHX(fasthx.htmy.HTMY): the rendering layer;htmy.page()renders HTML for all requests;htmy.hx()renders HTML only for HTMX requests, otherwise keeps FastAPI route behaviorholm: file-system based routing (similar to Next.js), automatic layout composition, page metadata, actions, and submit handlers- Optional Jinja2 layout/template support via
layout.jinjaandholm.JinjaTemplate— seereferences/jinja.md
Application initialization
Call holm.App() directly within a module in the root application package
Optional:
- pass a pre-configured
FastAPIapp - pass a custom
fasthx.htmy.HTMYrenderer
File-system based routing
| File | Purpose | HTTP method | |
|---|---|---|---|
page.py | Page callable | GET / | |
page.py + handle_submit | Submit handler | POST / | |
layout.py | Layout callable, wraps pages/layouts in subpackages | — | |
layout.jinja | Jinja2-based layout (alternative to layout.py) | — | |
actions.py | Action functions decorated with @action.* | custom paths/methods | |
api.py | APIRouter (JSON or rendering APIs) | custom paths/methods | |
error.py / errors.py | Error handlers (root only) | — |
Dynamic routes: _id_ or {id} package names become path parameters (/user/{id})
Private packages: prefix with underscore (_components) — ignored entirely
The default path for actions is the decorated function's name, underscores replaced with hyphens
Apply REST principles whenever possible
URL construction
- Pages and submit handlers:
"my_app.page","my_app.users.page"(path is the same, method is different) - Actions:
"my_app.users.actions.enable_user"
Pages vs Actions
- Pages (
page.py) return full HTML (wrapped in layouts); they handle regular browser navigation requests - Actions (
@action.*) return HTML fragments without layouts by default; ideal for HTML/HTMX partials
Reference files
| File | Load when… | |
|---|---|---|
references/layouts.md | Creating or modifying layouts | |
references/jinja.md | Using Jinja2 templates/layouts (layout.jinja, JinjaTemplate) | |
references/pages.md | Creating or modifying pages or page metadata | |
references/actions.md | Creating actions or HTMX partials | |
references/forms.md | Creating submit handlers or form submissions | |
references/apis.md | Creating custom api.py routers with JSON or mixed rendering | |
references/htmx-integration.md | Adding HTMX interactivity, partial rendering, or boosted navigation | |
references/htmy-context.md | Working with the htmy rendering context or request processors | |
references/htmy.md | Creating or modifying htmy components | |
references/error-handling.md | Setting up custom error handlers |
Gotchas
- Forms without
method="POST"submit as GET and hitpage(), nothandle_submit() page.pyandactions.pyandapi.pyin the same package have their routes merged into a singleAPIRouter- Returning
Responseobjects from pages, actions, or handlers bypasses rendering holmauto-wrapspage()andlayout()list/tuple returns inFragment. Do not return a list/tuple unless it is a component sequencehtmydoes not flatten nested component sequences:[comp1, comp2]is valid, but[[comp1, comp2]]is not. Use list unpacking orFragmentwhen mapping/generating components- Strongly prefer
ComponentTypeandComponentSequencereturn type annotations overComponentto avoid component nesting problems! holmuseshtmy.page()for both pages and actions automatically. Actions always return HTML; useapi.pyif you need standard FastAPI behavior- Path parameters from
_id_or{id}packages are available as standard FastAPI dependencies in pages, layouts, actions, metadata, and APIs
Security
- Security scanPassed, 95 of 100Pattern checks on the skill's files.
- Model reviewPassed
Quality evaluation
- Task evaluationNot runNo evaluation yet. Run one in Skill Studio.
Source
- SKILL.md in the repositoryCheckingholm/resources/skills/holm-web/SKILL.md
Popularity
- Repository stars
- 132
- Repository forks
- 4
- 7-day trend score
- 24
Stars and forks are for the whole GitHub repository, not this skill alone. 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/volfpeter/holm/holm-web)