Build Internal Tools Faster with AI Coding Rules
Use AI coding rules to standardize admin dashboards, CRUD apps, and internal utilities. Ship internal tools in hours instead of days with shared patterns.
Internal tools deserve standards too
Every engineering team builds internal tools. Admin dashboards. User management panels. Content moderation queues. Billing adjustment utilities. Data migration scripts.
These tools share a dirty secret: they're almost always built under time pressure, by whoever happens to be free, with minimal code review. The result is a graveyard of inconsistent UIs, duplicated logic, and one-off patterns that nobody wants to maintain.
AI coding assistants can help you build internal tools faster. But without rules, they'll generate a different pattern every time. One dashboard uses a data table with inline editing. Another uses modals. A third puts everything in a form. Your internal tools end up looking like they were built by five different companies.
The fix is straightforward: write AI rules that encode your internal tool patterns, then share those rules with your team. Every internal tool comes out consistent, and developers spend their time on business logic instead of reinventing the scaffold.
Why internal tools are the perfect use case for AI rules
Internal tools have properties that make them ideal candidates for rule-driven development:
Repetitive structure. Most internal tools follow the same template: list records, filter and search, view details, edit fields, perform actions. Once you've built one admin dashboard, the next nine are variations on the same theme.
Lower design bar. Internal users care about functionality, not pixel-perfect design. This means AI-generated UI is good enough out of the box, as long as it follows your component library.
Speed matters more than polish. When the ops team needs a tool to fix billing records, they need it this week, not next quarter. AI rules that standardize the scaffold let you skip the "how should I structure this?" phase entirely.
Fewer stakeholders. External products require design reviews, PM input, and cross-team alignment. Internal tools usually just need to work. This means fewer cycles between writing code and shipping it.
Standardizing your internal tool patterns
The first step is documenting the patterns your team already uses (or should use). Here's a rule set that covers the most common internal tool scenarios:
Page layout and navigation
## Internal tool layout
All internal tools use the AdminLayout component from `@/components/admin/AdminLayout`.
Structure:
- Sidebar navigation on the left (collapsible)
- Breadcrumb bar at the top
- Main content area with max-width 1200px
- Page title as h1, description text below it
Navigation items are defined in `@/config/admin-nav.ts`.
Do not hardcode navigation links in components.
Data tables
Data tables appear in nearly every internal tool. Without a rule, the AI will generate a different table implementation each time.
## Data tables
Use the DataTable component from `@/components/admin/DataTable` for all list views.
Required features for every table:
- Column sorting (click header to toggle)
- Text search across visible columns
- Pagination with configurable page size (10, 25, 50, 100)
- Row selection with bulk action bar
- Loading skeleton state
- Empty state with descriptive message
Column definitions go in a separate `columns.tsx` file next to the page component.
Never define columns inline.
For server-side pagination, use the useTableQuery hook from `@/hooks/useTableQuery`.
CRUD operations
## CRUD patterns
All create/edit operations use modal dialogs, not separate pages.
Use the FormModal component from `@/components/admin/FormModal`.
Form structure:
1. Validate all inputs with Zod schemas
2. Show inline field errors below each input
3. Disable the submit button while the mutation is in flight
4. Show a toast notification on success
5. Refetch the table data after mutation
Delete operations always require a confirmation dialog.
Use ConfirmDialog from `@/components/admin/ConfirmDialog`.
The confirmation message must include the name/ID of the item being deleted.
Form validation conventions
## Form validation
Define Zod schemas in a `schema.ts` file next to the feature.
Reuse the same schema for client-side form validation and API route validation.
Naming convention:
- `create[Entity]Schema` for creation forms
- `update[Entity]Schema` for edit forms (usually `create[Entity]Schema.partial()`)
Always validate:
- Required fields: use `.min(1, "Required")` instead of just `.string()`
- Email fields: `.email("Invalid email address")`
- URLs: `.url("Invalid URL")`
- Numeric ranges: `.min()` and `.max()` with descriptive messages
- String length limits: prevent oversized inputs before they hit the database
Do not rely on HTML5 form validation alone. Zod is the source of truth.
Admin dashboard rules in practice
Let's walk through a concrete example. Your ops team needs a tool to manage feature flags. Without rules, a developer might spend the first hour deciding on layout, table structure, and form patterns. With rules, the AI already knows the answers.
A developer opens their editor and writes:
Build a feature flags management page. Users should be able to:
- View all feature flags in a table with name, status, description, and last modified date
- Create new flags with a name, description, and default state
- Toggle flags on/off from the table
- Edit flag details in a modal
- Delete flags with confirmation
With the rules above installed, the AI generates code that uses your AdminLayout, your DataTable component, your FormModal, your Zod validation pattern, and your confirmation dialog. The output is consistent with every other internal tool your team has built.
The developer spends their time on the feature flag-specific logic (percentage rollouts, user targeting, environment scoping) instead of rebuilding the scaffold from scratch.
Shared component library rules
If your team maintains a shared component library for internal tools, rules can act as living documentation that the AI actually reads.
## Internal component library
All internal tools use components from `@/components/admin/`. Do not install or use
third-party UI libraries for internal tools. Everything you need is already built.
Available components:
- AdminLayout: Page shell with sidebar and breadcrumbs
- DataTable: Sortable, filterable, paginated table
- FormModal: Modal dialog with form, validation, and submit handling
- ConfirmDialog: Confirmation prompt for destructive actions
- StatCard: Metric card for dashboards (label, value, trend indicator)
- StatusBadge: Colored badge for status fields (active, inactive, pending, error)
- ActionMenu: Dropdown menu for row-level actions in tables
- SearchInput: Debounced search field with clear button
- DateRangePicker: Date range selection for filtering
- ExportButton: CSV/JSON export for table data
If you need a component that doesn't exist, build it in `@/components/admin/`
following the existing patterns. Do not create one-off components inside feature folders.
This rule does two things. First, it tells the AI exactly which components to reach for, preventing it from generating custom implementations or suggesting external libraries. Second, it serves as a catalog for developers who might not know what's already available.
CRUD app templates and project scaffolding
For teams that build internal tools frequently, it's worth creating a meta-rule that describes how to scaffold a new tool from scratch:
## New internal tool scaffold
When creating a new internal tool, follow this file structure:
app/admin/[tool-name]/
page.tsx # Main list view with DataTable
columns.tsx # Column definitions for the table
schema.ts # Zod schemas for create/update
[id]/
page.tsx # Detail view (if needed)
_components/
CreateModal.tsx # Create form in FormModal
EditModal.tsx # Edit form in FormModal
[ToolName]Actions.tsx # Row action handlers
Every new tool starts with the list view. Build the table first, then add create,
then edit, then delete. This order ensures you have data to test against at each step.
When a developer asks the AI to "build a new admin tool for managing X," the AI follows this structure automatically. No ambiguity, no variation, no wasted time deciding where files go.
Distributing internal tool rules across your team
Writing these rules is only useful if every developer on your team has them installed. If one person builds feature flags with the standard patterns and another person builds user management with completely different patterns, you've gained nothing.
This is where a shared registry becomes important. Instead of copying rule files between repositories or hoping everyone reads the wiki, you publish your internal tool rules once and everyone installs them.
npm install -g @localskills/cli
localskills login
# Publish your internal tool rules
localskills publish internal-tools.md --team my-team --name internal-tool-patterns
# Every developer installs them
localskills install my-team/internal-tool-patterns --target cursor claude windsurf
When you update the patterns (adding a new component, changing a convention), publish a new version and have the team pull:
localskills publish internal-tools.md --team my-team --name internal-tool-patterns -m "Added DateRangePicker to component catalog"
For a full walkthrough of the publishing process, see Publish Your First Skill.
Layering internal tool rules with team standards
Your internal tool rules shouldn't exist in isolation. They work best when layered on top of your general team coding standards:
# Base layer: general coding standards
localskills install my-team/coding-standards --target cursor claude
# Second layer: internal tool patterns
localskills install my-team/internal-tool-patterns --target cursor claude
The base standards handle language conventions, error handling, testing requirements, and architectural boundaries. The internal tool layer handles layout, components, CRUD patterns, and admin-specific conventions. Together, they give the AI complete context for building tools that match both your general engineering standards and your internal tool conventions.
For guidance on setting up the base layer, see how to standardize AI coding across your team.
Enforcing patterns, not just suggesting them
There's a meaningful difference between a rules file that says "we prefer modals for editing" and one that says "use the FormModal component from this path with this exact pattern." The more specific your rules, the less room the AI has to improvise.
This is especially true for internal tools, where consistency matters more than creativity. Nobody wants a "creative" approach to the billing adjustment form. They want it to look and work exactly like every other form in the admin panel.
Some tips for writing rules that actually get followed:
Name specific files and paths. "Use our data table component" is vague. "@/components/admin/DataTable" is actionable.
Include the expected structure. Show the file layout. Show the import patterns. The AI replicates what it sees.
State what not to do. "Do not use inline table implementations" prevents the most common deviation. If you have more standards like this to encode, read how to enforce coding standards with AI assistants.
Provide examples for edge cases. What happens when the table is empty? What does the loading state look like? What if the form has conditional fields? Cover these in the rules and the AI handles them consistently.
Measuring the impact
After rolling out internal tool rules, track a few things:
Build time. How long does it take to go from "we need a tool for X" to "it's deployed"? With standardized patterns, most CRUD tools should take a day or less instead of a week.
Maintenance burden. Count the bugs and support requests per internal tool. Consistent patterns mean fewer surprises. When every tool handles errors the same way, you fix the pattern once and it's fixed everywhere.
Onboarding to internal tools. When a new developer needs to modify an existing internal tool, how quickly can they find their way around? Consistent structure means the answer is "immediately." For more on reducing onboarding friction, see how to onboard new developers with AI rules.
Pattern drift. Review your internal tools quarterly. Are they still consistent? If drift is creeping in, your rules need to be more specific or your team needs a reminder to pull the latest version.
Start with one tool, then scale
You don't need to write rules for every scenario on day one. Pick your most common internal tool pattern, write rules for it, and use those rules to build the next tool your team needs.
After the second or third tool built with the same rules, the patterns will be battle-tested. That's when you publish them as a shared skill and roll them out to the whole team.
The goal is simple: every internal tool your team builds should look like it was built by the same person, following the same playbook. AI rules make that possible without slowing anyone down.
Stop rebuilding the same scaffold for every internal tool. Standardize your patterns, share them with your team, and let AI handle the repetitive parts.
Create a free account on localskills.sh and publish your internal tool rules today.
npm install -g @localskills/cli
localskills login
localskills publish