DEV Community

Adeogun Joseph Daniel
Adeogun Joseph Daniel

Posted on

FormSloth

Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady Submission πŸ¦₯

What I Built

FormSloth is a Chrome and Edge extension that fills repetitive forms from answers you write once.

Hackathon sign-ups and scholarship forms keep asking the same things. Browser autofill handles name and email. It does nothing for "why do you want to join?" or "tell us about yourself", so those paragraphs get copied out of an old document every time.

You write your answers once on a profile page. On a form, one click fills every field the extension recognizes. For a question it has not seen before, a small Gemma model running on your own computer drafts a reply from your profile. Drafts get a dashed orange outline so you know to read them before you submit.

It is for students and anyone else who applies to things often. I built it because I do.

Demo

A short walkthrough built from screenshots, not a live screen recording:

Code

FormSloth

A browser extension that fills repetitive forms from answers you write once. A small local Gemma model drafts replies to questions it has not seen before. Nothing leaves your machine.

Built for the DEV Hacktoberfest Open-Source AI Challenge, Week 3 (Slow and Steady).

The problem

Hackathon sign-ups, scholarship forms and event registrations all ask the same things: name, email, school, GitHub, why do you want to join. Browser autofill handles the short fields. It does nothing for the open questions, and those are the ones people copy and paste from an old document every time.

How it works

  1. You write your answers once on the profile page. The extension ships with about thirty common questions, each with a list of label phrases that should trigger it (for example "where are you from" and "country of residence" both map to Country).
  2. On a form, click Fill this form. Each…

How I Built It

The extension is plain JavaScript on Manifest V3, with no build step.

The question bank. It ships with about thirty common questions. Each has a list of label phrases that should trigger it, so "where are you from" and "country of residence" both map to Country. When a field's label matches several phrases, the longest one wins, which is why "team name" does not get your personal name. This step uses no AI, so it is instant.

The model. Questions the bank does not know go to gemma3:1b through Ollama, which runs on 127.0.0.1. I picked the 1B size because my laptop has 4GB of RAM and no GPU, and a bigger model would not fit comfortably. I also capped the context at 2048 tokens and the answer at 150, and kept the model loaded for 15 minutes so it only loads once per session.

What it leaves alone. Passwords, card and ID fields, checkboxes and radio buttons, address and date fields, and any field that already has text in it.

How I used AI tools. I wrote two GitHub issues and assigned both to Copilot's coding agent. It opened one pull request that added the CI workflow and another that expanded the question bank. I read both diffs, checked the new match phrases for collisions, and merged them. Claude helped me plan the project and scaffold the first version. I tested everything on real forms and fixed what broke.

What broke.

  • A form asked for "project ideas" and my bank only knew "project idea". Matching is by whole word, so it missed. Allowing an optional plural fixed it.
  • Ollama returns a 403 to browser extensions by default. You have to set OLLAMA_ORIGINS and restart it.
  • I told the model in the prompt not to state preferences. A form asked for my favorite tool to build with, and it answered with Framer Motion, which my profile lists as a skill and never as a favorite. The 1B model ignored the instruction. I added a check in code that skips any question asking for a favorite or a preference, and I answer those myself. <!-- Confirm after the rerun that this question now stays empty. -->

Why Does Open Innovation Matter?

A profile for forms holds your phone number, your school and your reasons for wanting things. I did not want that sent to a hosted API every time I fill a form.

With a local open model, the only network request the extension makes goes to my own machine. There is no API key and no cost per form. It also let me pick a model small enough for the laptop I actually own, and tune its limits to match.

The trade is real. A hosted model would be faster and would write better drafts. On my machine the first draft takes a couple of minutes. I accepted that because slow and private suits a form I fill once in a while, and I still read every draft before it goes anywhere.

The Lazy Payoff

The short fields fill instantly. On a hackathon registration form, the bank filled 9 fields with no model involved.

On a Google Form with four open questions, Gemma drafted all four in 2 minutes 49 seconds. The first answer took about 2 minutes because it included loading the model into memory. The other three took 49 seconds together. I edited one of the four before submitting.

That is a small test on two forms, and I have not timed how long I would take to type the same answers, so I will not claim a number for time saved. What it does save is the copy and paste, and the blank-page feeling of a paragraph question at the end of a long form.

Prize Categories

Best Use of Gemma: Gemma runs locally through Ollama and drafts the answers the question bank cannot. The post covers where the 1B model drifted and what I did about it.

Best Use of GitHub Copilot: Copilot's coding agent opened the pull requests for the CI workflow and the question bank expansion. Both are merged in the repo, and the Actions page shows CI passing on main.

Copilot's pull request that adds the CI workflow

Pull request #2: Add CI workflow

Copilot's pull request that expands the question bank

Pull request #4: Expand the question bank

CI run on main after pull request #2 was merged

CI runs on main after both pull requests were merged

The issues I assigned to Copilot were #1 and #3, and CI results are on the Actions page.

Top comments (0)