dotfiles/.claude/skills/fill-web-form/SKILL.md
Fill a web form using data extracted from local documents (PDFs, images, spreadsheets). Uses Claude Desktop (Cowork) with Chrome integration to read source documents and navigate/fill browser forms. Use when the user wants to automate filling an online form from document data.
npx skillsauth add kdeldycke/dotfiles fill-web-formInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Read local documents (PDFs, images, spreadsheets), extract structured data, then navigate to a web form in Chrome and fill it in. Claude Desktop reads the documents; Claude in Chrome interacts with the form.
This skill requires Claude Desktop (Cowork mode) with Chrome integration. It cannot run from Claude Code in a terminal. If invoked from Claude Code, print the setup instructions below and stop.
Download from https://claude.ai/download if not already installed.
Install the "Claude" extension in Chrome or Chromium:
fcoeoabgfenejglbffodgkkbkcdhcgfnEdit ~/Library/Application Support/Claude/claude_desktop_config.json:
{
"preferences": {
"allowAllBrowserActions": true
}
}
Open Chrome/Chromium, navigate to the target form URL, and log in manually. Claude cannot handle login/2FA flows: the session must already be authenticated before starting.
chromePermissionMode: "skip_all_permission_checks" in its configThere is no single CLI command that bootstraps everything. The closest workflow:
# 1. Ensure Chromium is running with the target site logged in
open -a Chromium "https://example.com/form"
# 2. Open Claude Desktop (it will connect to the running Chrome via the extension)
open -a Claude
# 3. In the Claude Desktop Cowork session:
# - Upload source documents
# - Enable Chrome integration
# - Type: "Read the uploaded documents and fill the form at https://example.com/form"
To open Claude Desktop to a specific conversation via URL scheme:
open "claude://conversation/SESSION_UUID"
Source documents (uploaded to Claude Desktop)
-> Claude Desktop extracts structured data
-> Claude in Chrome navigates to form URL
-> Form fields filled using read_page + form_input / computer actions
-> User reviews and submits
Claude Desktop and Claude in Chrome share the same conversation context within a Cowork session. When Chrome integration is enabled, Claude gains access to browser tools: read_page, form_input, computer (click, type, scroll), navigate, and screenshot.
navigate or instruct the user to open the form URL in Chromeread_page to understand the form structureFor each form field:
read_page(filter="interactive") to get element refsform_input(ref="ref_XXXX", value="...") for text inputs, selects, and textareascomputer(action="left_click", ref="ref_XXXX") for radio buttons, checkboxes, and custom widgetscomputer(action="key", text="Tab") after each field to trigger any reactive validationscreenshot to verify the field was filled correctlyread_page(filter="interactive") # Returns ref_XXXX for each input/button
read_page(filter="all") # Returns full page content with refs
form_input(ref="ref_1251", value="John Doe")
computer(action="left_click", ref="ref_XXXX")
computer(action="left_click", ref="ref_XXXX") # Focus the field
computer(action="key", text="some text") # Type into it
form_input(ref="ref_XXXX", value="Option Text") # For standard <select>
# For custom dropdowns (common in SPA frameworks):
computer(action="left_click", ref="ref_XXXX") # Open dropdown
wait(duration=1)
read_page(filter="interactive") # Find the option
computer(action="left_click", ref="ref_YYYY") # Click the option
wait(duration=2) # After navigation or AJAX calls
screenshot # Verify the page state
After completing each step:
read_pagecomputer(action="left_click", ref="ref_XXXX")wait(duration=3) for the next step to loadscreenshot to confirm advancementform_input works for text fields but not radio buttonscomputer(action="left_click", ref=...)let filled = 0;
document.querySelectorAll('input[type="text"]').forEach((el) => {
if (el.value.trim() === '') {
const setter = Object.getOwnPropertyDescriptor(
window.HTMLInputElement.prototype, 'value'
).set;
setter.call(el, '0');
el.dispatchEvent(new Event('input', {
bubbles: true
}));
el.dispatchEvent(new Event('change', {
bubbles: true
}));
filled++;
}
});
`Filled ${filled} fields`;
form_input usually worksform_input works reliably for all standard inputscomputer(action="left_click") to open the file picker| Problem | Solution |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------ |
| Form field not accepting input | Try computer(left_click) to focus first, then form_input |
| Radio/checkbox not responding to form_input | Use computer(left_click, ref=...) instead |
| Dropdown options not visible | Click the dropdown trigger, wait(1), then read_page to find options |
| Page navigation returns 404 | SPA context may need to be established first: navigate to the app root, then click through to the form |
| Validation error after filling | Check for red error indicators, use read_page to find error messages |
| Field shows wrong value after fill | Tab out of the field to trigger formatting, then screenshot to verify |
| Multi-page form loses progress | Use "Save as Draft" if available after each step |
tools
Create or update an upstream contributions page (docs/upstream.md) tracking the project's relationship with its dependencies. Discovers merged PRs, reported issues, workarounds, and declined features.
documentation
Detect stale translations in readme.*.md and contributing.*.md files by comparing structure and content against the English source, then draft updated translations for changed sections.
testing
Two-way comparison and synchronization of Sphinx documentation across sibling projects. Discovers discrepancies in conf.py, install.md, index.md toctree, pyproject.toml docs dependencies, extra-deps sections, readme badges, and static assets. Use when you want to align documentation structure, catch stale dependencies, or push improvements across your Sphinx-enabled repositories.
tools
Optimize GitHub topics for discoverability by analyzing competition on topic pages.