Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx skills add allxsmith/bestax --skill bestax-layout-scaffoldgit clone --depth 1 https://github.com/allxsmith/bestaxWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/allxsmith/bestax/bestax-layout-scaffold)<a href="https://agentmods.dev/skills/allxsmith/bestax/bestax-layout-scaffold"><img src="https://agentmods.dev/badge/skills/allxsmith/bestax/bestax-layout-scaffold/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/allxsmith/bestax/bestax-layout-scaffold"><img src="https://agentmods.dev/badge/skills/allxsmith/bestax/bestax-layout-scaffold.svg" alt="Reviewed on agentmods" width="80" height="20"></a>- NVIDIA SkillSpector warn
SkillSpector: 10 findings, up to medium
These are SkillSpector’s own severities. On a checked sample its high-severity flags on skills were ~96% false positives — a documented command, a public API, a “never do X” rule — so we show them as a caution to read, not a verdict. Why →
- medium Prompt Injection · line 122 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 122 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 126 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 144 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 147 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 149 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 150 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 151 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 152 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
- medium Prompt Injection · line 154 Large whitespace padding was detected (a block of blank lines or a long run of spaces). This can push injected instructions below or to the right of the visible area so a human reviewer never sees them while the agent still reads them. Manual review of the hidden content is recommended.Fix: Remove the large whitespace padding (blank-line blocks or long space runs) and review any content hidden below or to the right of it. Keep skill files compact and reviewable so no instructions can be
What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00063 | $0.07256 |
| Opus 5.5 | $0.00025 | $0.02902 |
| Sonnet 5.5 | $0.00013 | $0.01451 |
| Haiku 4.5 | $0.00006 | $0.00726 |
Grade A, and why
bestax-layout-scaffold scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured today.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 352 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Scaffolding a page layout with @allxsmith/bestax-bulma
Turn a high-level request ("admin dashboard", "landing page", "login screen", "product catalog") into a complete responsive page built from bestax-bulma layout components.
Behavioral rule
Select an archetype from the request and build it in one shot. Do not ask layout questions ("how many columns?", "where should the nav go?", "what width?") — infer the structure from the request and proceed. The archetype determines the structure; fill it with the requested content.
Ask at most one clarifying question, and only for a high-level fork the request genuinely does not imply: whether the page is public-facing (marketing) or an internal tool (authenticated app). When the request already signals this ("dashboard", "admin", "landing", "login", "pricing"), skip the question and default.
Select an archetype
| Request signals | Archetype |
|---|---|
| dashboard, admin, console, internal tool, authenticated app, "sidebar" | App shell |
| landing, marketing, homepage, product/pricing page, public site | Landing |
| login, sign up, auth, settings, checkout, a single focused form | Centered |
| catalog, gallery, products, listing, "grid of cards", search results | Card grid |
Default when ambiguous: internal tool → App shell; public-facing → Landing; one focused task → Centered; a collection of items → Card grid. For mixed requests, pick the dominant intent (e.g. "admin dashboard with a product list" → App shell whose main column holds a Card grid).
Approach
- Compose pages from the shipped layout components —
Container,Section,Hero,Footer,Level,Columns/Column,Grid/Cell,Navbar,Menu,Card. There is noTilecomponent. For uniform grids (card grids, galleries — same-shaped items) preferGrid/Cell: CSS Grid gives equal-height cells for free (per row — each row's cells match its tallest, same row-level behavior as the flex recipe). UseColumns/Columnfor proportional or per-breakpoint column layouts — and when cards there must be equal height, apply the flex recipe (Column display="flex" flexDirection="column"+Card flexGrow="1";height: 100%on the card doesn't help — the column's height is auto). - Rely on Bulma's responsive defaults:
Columnssit side by side on tablet and up and stack on mobile. Add responsivesize*props only to tune the breakpoints. - Interactive extras don't share a state API — never transfer one by analogy:
Collapse trigger={node} open/defaultOpen onOpenChange(onOpenChange(open)reports every trigger;onOpen/onClosefire only when the Collapse holds its own state), an accordion isCollapses value/defaultValue/onChangearound plainCollapsechildren indexed from 0 by position (number | null, ornumber[]withmultiple; hide an item withvisibility="hidden", never{cond && …}, or the open state shifts to its neighbour) rather than hand-rolled open-index state,Tabs value={i}/onChange(eachTabs.Tab/Tabs.Content.Itemrequiresindex={i}, andTabs.Contentmust be a child of<Tabs>— the active-tab context lives on it; a sibling panel never switches. The arrow keys, Home/End, Enter/Space, the single tab stop and thearia-controls/aria-labelledbylinks come built in, so add noonKeyDownor ARIA of your own;onChangefires when a tab is activated, never on arrow-key focus),Dropdown active/onActiveChange,ToggleButton pressed/defaultPressed onPressedChangefor a button that stays on or off (notButton isActive, which sets noaria-pressed; the label stays the same in both states; a set goes inButtons hasAddons role="group"with anaria-label, where it's alsoButtons.ToggleButton, and a row where only one can be on isSegmentedControl),SegmentedControl aria-label="…" value/defaultValue onChangefor a row of buttons where only one can be on, such as a list or grid view (oneSegmentedControl.Segment value="…"per option; a radio group with the single tab stop and the arrow keys built in, so add noonKeyDownof your own; an icon-only segment needs its ownaria-label; the arrows check as they move, soonChange(value)fires on each, and it can't be cleared; it carries no form value, so a choice a form submits isRadios),Popover trigger={<Button>…</Button>} open/defaultOpen onOpenChange(triggeris one element, not a node: Popover clones it to add the click and ARIA, so never wrap it in a clickable of your own; build the panel fromPopover.Header/Body/Footer/Close, and a panel without aPopover.HeaderneedsariaLabel),HoverCard trigger={<Link href="…">…</Link>}for a preview on hover or keyboard focus (triggeris one link or button, cloned the same way; the card's content goes straight in as children with no sub-components; a trigger inside aParagraphneedsappendToBody; hover and focus only unlessopenOnTapis set, which suits only a trigger with no tap action of its own, such as aButtonwith noonClick; on touch a link trigger just follows the link, so what the card shows must be on that page too, and a form is aPopover),ContextMenu aria-label="…" trigger={<Table.Tr>…</Table.Tr>}for actions on a right-click or a long press (triggeris one element, a row or a card, cloned rather than wrapped; the items areContextMenu.Item/ContextMenu.Divider, which areDropdown's; noopenprop,onOpenChangereports it; always put the same items in a visibleDropdownon the row too, since a context menu is only a shortcut),Steps value={i}/onStepClick items={[{label, icon?}]}(child form isSteps.Step, notSteps.Item).Reveal cascadestaggers only its direct children — to stagger a grid, put<Reveal delay={i * 80}>inside eachCell, not around the container. - An empty list, table or search with no results is
EmptyState, not a hand-builtBoxofIcon,TitleandButtons isCentered:<EmptyState icon="folder-open" title="No projects yet" titleAs="h3" description="…">with its one<Button>as a child (two or more go inEmptyState.Actions). Itstitleis always a heading, so settitleAsto the level under the list's own heading. It has no live region: after a search or a filter, keep aParagraphwithrole="status",aria-atomic="true"andvisibility="sr-only"beside the search field the whole time, saying the count, and have "Clear search" put focus back in the field. While data loads show aSkeletonor aLoader, and a failed load is aMessageor aNotification, never an EmptyState. The archetypes reference has the full pattern under Card grid. - A table people sort, search, page through or pick rows from is
DataTable, not aTablewith sort state,aria-sort, checkboxes and aPaginationwired by hand:<DataTable caption="Users" columns={[{ id: 'name', header: 'Name', sortable: true, isRowHeader: true }, …]} data={rows} selectionMode="multiple" pageSize={10} hasSearch />. A column is{ id, header }, readingrow[id], plusaccessor(the raw value, which sorts),format(its text, which the cell shows and the search matches) andcell(rich content). It needs acaption,aria-labeloraria-labelledby, and it shows its ownEmptyStateand says the match count itself.toolbar={table => …}holds buttons that act ontable.state.selectedor calltable.setFilter;useDataTable({ columns, data, … })returns the same table for<DataTable table={table} />or for markup of your own through itsget…Propsgetters;manualwithrowCounthands sorting, filtering and paging to a server.table.toCSV()writes what's shown as CSV, escaping formulas, for a download button; there's no Excel export. A table with nothing to sort, search or pick staysTable. - An order's history, a ticket's activity, a changelog or an activity feed is
Timeline, not a hand-built list with a border down the side:<Timeline titleAs="h3">with a<Timeline.Item title="Shipped" time="14 October 2026" dateTime="2026-10-14">per event, any detail as its children, and the whole date intime.titleAsis the level under the section's heading, or"p"in a busy feed. For something that moves along on its own, like a parcel or a deployment,active={i}marks progress andpending="Out for delivery"ends it on what's under way, oldest first. A journey the user moves through, like a wizard or a checkout, staysSteps. - Facts about one thing, each a label and its value (an order summary, a profile, a file's
details), are
DescriptionList, notColumnsof label and value or a two-columnTable:<DescriptionList aria-labelledby="order-heading">under aTitle id="order-heading", with a<DescriptionList.Item label="Order" value="#1234" />per fact. It stacks on a phone and puts the labels beside their values from tablet up, so add no breakpoint code;orientationpins it. Several values, or a label with an info tip, go in asDescriptionList.LabelandDescriptionList.Valuechildren. Several records with the same fields stay aTable, and so do facts a screen reader must announce with their labels, as aTablewithscope="row"headers. - A number shown to the reader (a price, a total, a count, a percentage, a dashboard figure) is
NumberFormatter, nottoLocaleString()or anIntl.NumberFormatbuilt by hand:<NumberFormatter value={8456.4} format={{ style: 'currency', currency: 'USD' }} />, with anyIntl.NumberFormatoptions informat(style: 'percent'takes a fraction,0.125for 12.5%). It writes in its ownlocale, else theLocaleProvider's, else the runtime's, so a server-rendered app sets alocaleon aLocaleProviderat the root. Its text is the number alone, so words go around it:Total: <NumberFormatter … />. Text that can't hold an element, anaria-labelor aplaceholder, gets the same fromconst format = useNumberFormat();andformat(1500, { style: 'currency', currency: 'EUR' }). - A file browser, a checkbox tree (permissions, filters) or an outline you browse is
TreeView, with<TreeView.Item value="…" label="…" icon="folder">items nested inside each other:<TreeView aria-label="Files" selectionMode="single">withselected/onSelectedChangepicks one, andselectionMode="checkbox"withchecked/onCheckedChangedraws boxes with mixed parents, where a parent's value checks its whole branch. For categories, where checking a parent means only the parent,selectionMode="checkbox-independent"draws a box per item that checks that item alone, with no mixed parents. Map the data with a recursive function, and render an item's children whether it's open or not. A folder that loads when it opens takeshasChildren,isLoadingwhile its children are on their way, andloadError="Couldn't load src"withonRetrywhen the load fails, settingisLoadingagain while the retry runs: the tree draws the Loading… and Retry rows and announces them, so don't hand-write a placeholder item. Its items aren't links, so the app's sidebar and any list of pages stay onMenuwithMenu.Item href. - A sidebar whose groups of links open and close is
Menu.Section, one per group, directly inMenu(never inside aMenu.ItemorMenu.List):<Menu.Section label="Components" defaultOpen>around that group'sMenu.List, withdefaultOpenon the group holding the current page (oropen/onOpenChangeto hold the state). Its heading is a real button witharia-expanded, and its links stay links, each a tab stop. NotTreeView, and not aCollapseinside a hand-written<li>. - An app's frame, a header across the top with a navigation column down the side, is
AppFrame, not afixedNavbaroverColumns:<AppFrame>withAppFrame.Header(aNavbarwith<AppFrame.Burger />in itsNavbar.Brand),AppFrame.Nav(theMenu) andAppFrame.Main(the page), plusAppFrame.AsideandAppFrame.Footerwhen there are any. The header and the column stick on their own, so nofixedand nohas-navbar-fixed-top; below desktop the column is a drawer the burger opens, and from desktop up the burger collapses it. It renders the page's<main>, so it goes at the top of the app, never inside a<main>. - Panes the user resizes are
Splitter(a file tree beside an editor, a list beside its detail, a query above its results), not hand-written drag code or fixedColumns:<Splitter height={480}>with a<Splitter.Pane label="Files" defaultSize={25} minSize="12rem">per pane. The handles go in on their own, each named by its pane'slabel, so give every pane one. Sizes are percentages, limits also takepxorrem,orientation="vertical"stacks them (and needs aheight), andcollapsiblewithcollapsed/onCollapsedChangelets a button hide a pane. Put scrolling content in aScrollAreainside the pane. - Content taller or wider than its space is
ScrollArea(release notes in a Card, a sidebar longer than the screen, a feed that grows then scrolls, a wide table on a phone), not aBoxwithoverflowY="auto"and a height in a style:<ScrollArea height={240} aria-label="…">, ormaxHeight="20rem"to grow with its content first. It needsaria-labeloraria-labelledby, since while it overflows it's a region a keyboard user tabs to. The helper props andclassNamego on its frame and therefon the element that scrolls.hasFadefades the edges that have more,orientation="horizontal"suits a wide table, andonEdgeReach={edge => …}loads more at an edge. - Something that stays in a corner of the screen (a floating button, a chat or help launcher,
a feedback tab, a consent notice) is
Affix, notpos="fixed"with offsets in a style:<Affix position="bottom-left"><Button color="primary">Feedback</Button></Affix>.positionis one of the four corners,'bottom-right'by default, and stays physical in right-to-left text. The spacing helpers nudge one further in (mb="6"lifts it over a bottom bar), andportalmoves it out of an ancestor with atransform. Two in one corner overlap, so put what shares a corner in one Affix. Tab reaches it where it is in the markup, whatever corner it shows in, so write it after the main content. For an element pinned once the page scrolls past it, usepos="sticky"with atopinstead. - A command palette (⌘K or Ctrl+K) is
Command.Dialog, not aModalwith anInputand a hand-writtenkeydownlistener:<Command.Dialog shortcut="mod+k" placeholder="…" actions={[…]} />, each action{ id, label, onSelect }withgroup,keywords,description,iconandhint(aKbd.Group) as it needs them. Typing filters the actions by label, keywords and description, Enter runs the top match, and running one closes the dialog.shortcutis off unless given, and it does nothing while the user types in a field. A button that opens it too usesopenandonOpenChange, witharia-keyshortcutson the button. The same list inline, in a page or a Popover, isCommand. For server results, build it from parts:Command.Input, thenCommand.ListofCommand.Items, orCommand.Empty, filtered fromonQueryChange. - Link lists (footer nav, sidebars): a bare
UnorderedListofListItems is already marker-less and flush — Bulma's reset unstylesul— so no prop or CSS is needed; bullets appear only insideContent. Navbar.Burger/Navbar.Menuare controlled — wire the sameactivestate to both:activeonNavbar.Menushows/hides the mobile menu, whileactive+onClickonNavbar.Burgermake the burger toggle it and animate. Left unwired, clicking the burger does nothing (no error, silent failure). For afixed="top"Navbar, add thehas-navbar-fixed-topclass to<html>so content is not hidden behind it — the library does not do this automatically, and an inline padding offset is not a substitute.- Style with helper props — no inline
style, no raw BulmaclassNames. Before writingstyle={{ … }}anywhere, translate each declaration with the mapping table below — the helper props cover the common cases. Bare markup has wrapper elements that take all helper props:<Span textSize="7" textColor="grey">,Paragraph,Strong— never a raw<span className="is-size-7 has-text-grey">. Table cells:Th/TdtaketextAlign="right",textWeight,textSizedirectly (theircolorprop colors the cell; for muted cell text wrap content inSpan textColor="grey"). Set the app-wide icon library once with<ConfigProvider iconLibrary="…">at the root rather thanlibraryon every<Icon>. An app in another language, or a right-to-left one, also getslanganddiron<html>and a<LocaleProvider locale="…">at the root, so overlays and date pickers follow it. - Alternating section bands are a prop, not CSS:
bgColor="scheme-main-bis"on every otherSection(next bandscheme-main-ter). The scheme values render as a dark-mode-safe inlinebackground-color: var(--bulma-scheme-*)— zero custom CSS — and still neverbgColor="light"/"white": those are fixed colors that stay light when dark mode flips the text. - Decorative CSS is budgeted: two compact rules, ≤10 lines per app — comments count:
at most one short inline note, never a file-header comment block — every value derived
from
--bulma-*. A marketing page gets at most one hero wash and one featured-card ring, applied viaclassName— no resets (Bulma ships one; body/list margins are already zero) and no grid textures, masks, or multi-layer backdrops; the components carry the design:
What ships with it
7 files beside SKILL.md in the same directory: the scripts, references and assets a skill reads on demand. Not counted in the per-session cost; read them before you install if any of them is executable.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- today Changed · +30 lines 90a276221204
- 4d ago Changed · +1 lines 0dfb6051e4d4
- 5d ago Changed · +11 lines ea2f055e7944
- 6d ago Changed · +20 lines a0773731eaf1
- 7d ago Changed · +7 lines ae62da92e5b7
- 8d ago Changed · +8 lines ec643ae92f47
- 13d ago Changed · +6 lines abc1604715ea
- 14d ago Changed · +4 lines c1dcc70a86c1
- 16d ago Changed · +18 lines 646d7c6f18a8
- 18d ago First seen · 247 lines · 63 tokens per session scan A 41eb129bb4a2
bestax-layout-scaffold is a skill published in the GitHub repository allxsmith/bestax (14 stars, last pushed yesterday), licensed MIT. It adds 63 tokens to every session and 7,256 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.
Other skills, from other repositories
animal-island-ui-style
Build React UIs in the animal-island-ui style — an a cozy island-style UI-inspired component library (warm earth tones, pill shapes, 3D game-button depth, soft motion). Use when (1) building pages or components with the animal-island-ui npm package in a React project; (2) generating a standalone single-file HTML page…
fast-typescript-check
Keep www-sacred's TypeScript fast to type-check and fast to run. Use when touching the ASCII/canvas animation components (the only real per-frame code here), tightening type-check wall-clock, or auditing a change for runtime or compiler regressions. Scoped to this repo — a React 19 / Next.js 16 component library plus…
port-sacred-terminal-ui-to-typescript-cli
Take a React Window.tsx (or any sacred component) and produce a terminal CLI screen written in TypeScript that uses Simulacrum — the sacred CLI framework in scripts/cli/lib/.
migrate-oxlint
Guide for migrating a project from ESLint to Oxlint. Use when asked to migrate, convert, or switch a JavaScript/TypeScript project's linter from ESLint to Oxlint.
build-with-tinybase
Scaffold, extend, and verify reactive local-first JavaScript or TypeScript applications with TinyBase. Use when choosing TinyBase for in-memory tabular or key-value state, generating an app with create-tinybase, adding schemas or UI bindings, resolving TinyBase import paths, configuring browser or database…
beui-pro
Choose, inspect, install, and compose licensed beUI Pro premium React blocks through authenticated MCP or the shadcn registry. Use when building or improving landing pages with beUI Pro, installing @beui-pro items, selecting premium heroes, features, pricing, social proof, CTAs, navigation, footers, or other page…