Skip to content

tuckthomas/ApplyFill

Repository files navigation

ApplyFill logo

ApplyFill

Enter job-application information once. Reuse it across applications and targeted resumes.

.NET 10 PostgreSQL 18 React 19 Playwright 1.61 pnpm 11.7

ApplyFill is a privacy-focused job-application workspace. It keeps a reusable Job Profile, resumes, tracked applications, and Browser Agent history on the user's computer. Its managed browser works through multi-page applications inside the normal ApplyFill layout while the user watches, pauses, stops, or takes control at any time.

What is implemented

  • A .NET 10 API with profile, resume, company, job-application, and application-run resources.
  • PostgreSQL 18 as the authoritative local datastore, including encrypted application-only profile data and optimistic concurrency.
  • A managed Chromium worker built with Microsoft Playwright.
  • A multi-page Browser Agent surface with live frames, reconnecting updates, activity history, questions, pause/resume, take-control, stop, and final-review controls.
  • Provider-neutral local model/runtime manifests under private-ai/catalog/ so evaluated vision and OCR models can be replaced without changing product workflows or database schemas.
  • Vision/OCR resume import with Merge, Replace, or Cancel review, retained original-file preview, structured validation, and user-controlled contact-value replacement.
  • A shared PDF viewer with thumbnails, page navigation, zoom, fullscreen, and download across resume import and Resume Builder, plus PDF, DOCX, and JSON exports.
  • Normalized company profiles with searchable create-or-select application entry, company filtering, and company-specific ATS sign-ins.
  • Normalized job-title profiles with searchable create-or-select application entry, so repeated titles such as Credit Analyst are stored once per installation and reused across applications.
  • A default application pipeline of Saved, Staging, Applied, Interviewing, Offer Received, Rejected, and Withdrawn, plus Settings controls for creating and activating a custom labeled status model used by the dashboard Kanban board.
  • Installation-key encryption for company sign-in passwords. Selected sign-ins are supplied directly to the managed browser and excluded from model prompts.
  • JavaScript-capable job-posting archives with rendered HTML, a screenshot, HAR network data, structured metadata, and capture hashes stored with each application.

Privacy boundary

ApplyFill is local software, not a cloud account:

  • User records are stored in PostgreSQL on the user's computer.
  • Managed Chromium sessions, screenshots, prompts, model responses, artifacts, and action history stay on that computer unless the user intentionally exports or shares them.
  • Private AI runs through local model services. The ordinary UI does not expose model providers, runtimes, ports, quantization, or processor settings.
  • Sensitive application-only fields are separated from ordinary profile content and protected with installation-bound ASP.NET Core Data Protection keys. Back up the matching keys with the database; neither is useful alone after a restore.
  • The Browser Agent necessarily communicates with the job sites the user opens. Those sites receive data only through normal browsing and application submission.
  • Final submission requires explicit approval. ApplyFill does not silently submit an application.

Local operation does not protect an unlocked computer, compromised operating system, malicious job site, screen capture, or files copied outside ApplyFill. See Privacy and security.

Architecture

flowchart LR
    user["User"] <--> ui["React 19 + Vite UI"]
    ui <--> api["ASP.NET Core 10 API"]
    api <--> postgres["PostgreSQL 18"]
    ui <--> stream["SignalR browser stream"]
    stream <--> worker[".NET managed-browser worker"]
    worker <--> chromium["Playwright Chromium"]
    api <--> models["Local Private AI services"]
    worker <--> models
    models --> registry["Versioned model/runtime catalog"]
Loading
Area Software Responsibility
Application API ASP.NET Core 10 Local HTTP API, validation, concurrency, health, and persistence boundaries
Data PostgreSQL 18.4 Authoritative profiles, resumes, companies, encrypted credentials, applications, posting archives, runs, checkpoints, and audit records
Browser automation Microsoft Playwright 1.61 + managed Chromium Navigation, JavaScript page capture, observation, user input, uploads, and multi-page continuity
Frontend React 19, TypeScript 6, Vite 8 ApplyFill shell, editors, Browser Agent controls, and review surfaces
Private AI Versioned native runtime/model adapters Local vision, OCR, planning, resume import, and writing assistance
Realtime SignalR Run updates, frame notices, reconnect, and control state

The public API is versioned under /api/v1/. Development OpenAPI is available at /openapi/v1.json. Browser Agent streaming uses /hubs/browser-agent.

Requirements

  • Windows 10/11 or another supported .NET/Playwright development host.
  • .NET 10 SDK matching global.json.
  • Node.js with Corepack and pnpm 11.7.
  • Docker Desktop or another Compose-compatible engine for the PostgreSQL 18 development database.
  • Sufficient local disk for Chromium, the database, artifacts, and user-approved Private AI model downloads.

An NVIDIA GPU is optional. Evaluated CPU and partial-offload paths are represented separately in the model catalog; ApplyFill chooses an evaluated option automatically.

Development setup

From the repository root, start the complete local stack with one command:

pwsh -NoProfile -File .\scripts\local\start.ps1

The launcher checks prerequisites, starts PostgreSQL, applies database migrations, starts the API and managed-browser worker, and opens the Vite app at http://127.0.0.1:5173/. It uses Corepack's project-pinned pnpm, so a global pnpm command is not required.

Use the companion scripts to inspect or stop the stack:

pwsh -NoProfile -File .\scripts\local\status.ps1
pwsh -NoProfile -File .\scripts\local\stop.ps1

For individual service development, the equivalent manual sequence is:

Copy-Item .env.example .env
# Replace both placeholder database passwords in .env.
docker compose up -d postgres

dotnet tool restore
dotnet restore ApplyFill.slnx
dotnet ef database update --project src/ResumeBuilder.Infrastructure --startup-project src/ResumeBuilder.Api

dotnet run --project src/ResumeBuilder.Api

In a second terminal:

dotnet build src/ResumeBuilder.BrowserWorker/ResumeBuilder.BrowserWorker.csproj
pwsh src/ResumeBuilder.BrowserWorker/bin/Debug/net10.0/playwright.ps1 install chromium
dotnet run --project src/ResumeBuilder.BrowserWorker

In a third terminal:

cd frontend
corepack pnpm install
corepack pnpm dev -- --host 127.0.0.1 --port 5173

Open http://127.0.0.1:5173/. Local service addresses belong in development configuration; ordinary users should never configure ports or start individual services.

Verification

dotnet build ApplyFill.slnx --no-restore
dotnet test ApplyFill.slnx --no-build

cd frontend
corepack pnpm lint
corepack pnpm test
corepack pnpm build

PostgreSQL integration tests use Testcontainers and require a running container engine. Browser-worker tests use synthetic local fixtures rather than mutable public job sites.

Database maintenance scripts are under scripts/database/:

pwsh scripts/database/backup.ps1
pwsh scripts/database/restore.ps1 -BackupFile <path>
pwsh scripts/database/reset-development.ps1

See Development guide for service configuration and troubleshooting.

Browser Agent controls

The Browser Agent is available from the Agentic AI tab of a saved application in the Job Tracker.

  • Pause stops new agent actions at a safe boundary.
  • Take Control gives mouse and keyboard input exclusively to the user.
  • Return Control resumes automation from a fresh observation.
  • Stop ends the run and retains the configured recovery record.
  • Login, MFA, CAPTCHA, sensitive disclosures, legal attestations, unsupported controls, and uncertainty become explicit questions.
  • Approve & Submit appears only at final review; submission never occurs merely because the agent reached the last page.

See Using the Browser Agent.

Gallery

These are real product captures from the current ApplyFill interface. Gallery images must never contain real identifiers, credentials, cookies, or private resumes.

Dashboard Job tracker
ApplyFill dashboard ApplyFill job tracker
Browser Agent Private AI setup
ApplyFill Browser Agent ApplyFill Private AI settings
Vision resume import Job Profile
ApplyFill vision resume import ApplyFill Job Profile

| Resume workspace | | --- | --- | | ApplyFill resume workspace |

Job Profile Builder

Personal information Education
ApplyFill personal information form ApplyFill education form
Work experience Projects
ApplyFill work experience form ApplyFill project form
Skills Application questions
ApplyFill skills autocomplete ApplyFill application questions

Repository layout

frontend/                         React/Vite application
private-ai/catalog/               Versioned local model and runtime manifests
src/ResumeBuilder.Api/            Local ASP.NET Core API
src/ResumeBuilder.Application/    Use cases, contracts, and validation
src/ResumeBuilder.Domain/         Domain state and invariants
src/ResumeBuilder.Infrastructure/ PostgreSQL and local infrastructure
src/ResumeBuilder.BrowserWorker/  Managed Chromium runtime and orchestration
tests/                            .NET unit/integration/worker tests
scripts/database/                 Backup, restore, and development reset
scripts/local/                    One-command local start, status, and stop
docs/                             Architecture, privacy, user, and developer docs
.agents/                          Agent guidance and plan lifecycle

Current limitations

  • This repository is a development build. A one-click end-user installer/updater is not yet published.
  • Real job sites can change without notice. Policy gates and user control remain mandatory even after a synthetic fixture passes.
  • Private AI quality depends on the installed model and available memory; unsupported hardware must fail clearly instead of selecting an untested fallback.
  • Back up PostgreSQL data and the matching installation keys before destructive maintenance.

License

See LICENSE and THIRD_PARTY_NOTICES.md.

About

Reusable job application profile builder that stores personal info, work history, education, skills, and resume content once, then uses that structured data to generate resumes and support faster application autofill.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages