product
One job seeker (the project owner) tailoring a resume to a specific job description in a desktop browser (Chrome, ~1440px) during focused application-prep sessions. The browser is the product surface. A required device-local Electron companion starts and keeps the loopback server available, shows the complete five-provider setup catalog, encrypts supported API keys locally, offers official installation guidance for missing CLIs and provider-owned external-terminal sign-in, manages portable workspace backups and extension pairing, and opens RoleFit in the default browser. It is not a second Drafting Desk and does not own resume editing, tracker state, or workspace files. The user knows the resume content intimately; the tool's job is to speed up tailoring, reviewing, and exporting while detecting and surfacing potentially unsupported claims for human review. Local-first, single-user; no RoleFit accounts, hosted backend, cloud credential service, database, or synchronization. Native macOS and Windows distribution keeps a fail-closed signed-release pipeline and a separate, explicitly unsigned preview channel while project-owned signing identities are unavailable. Preview downloads are checksum-covered GitHub prereleases and must disclose the expected Gatekeeper or SmartScreen warning. The browser remains the only working product surface. The public site is a static product/download page, never a hosted copy of the workbench.
RoleFit AI can turn a prepared job posting, a base resume, and a candidate-authored cover letter or base variant into honest, tailored application materials. Prepare is the first/default page and the sole job-intake surface: the paired browser extension is primary, with URL fetch and pasted text as deliberate fallbacks. Its complete editable brief exposes tracked job facts, one role context, responsibilities, required and preferred qualifications, technical keywords, seniority and domain signals, benefits, and extraction or candidate-review gaps. Resume proposals remain constrained by server-side grounding and anti-fabrication checks, with a recruiter-style review for fit scoring and gap analysis. Candidate gaps restored from a saved Apply record are labeled historical until Review runs against the current materials.
The cover letter is one Tailor click. RoleFit resolves the date, candidate name, role, company, greeting, and sign-off itself, sends the whole candidate evidence corpus with the source letter, and lets the model choose which experiences and honest-context notes this particular posting warrants. Bracketed text in a base variant is a drafting instruction, never candidate evidence. Grounding, placeholder rejection, and a single silent repair pass all run on the server; a valid letter goes straight into the editor with an exact one-click Restore of the document it replaced, and a letter that still fails after repair is discarded with the current one kept.
The letter asks a question only when a fact genuinely cannot be resolved — a
missing company, role title, or candidate name, or a template that names a
private fact such as a referral. A hiring manager's name, a reason for interest,
which experience to lead with, and tone are never questions: an authored
greeting supplies a recipient and the company hiring team is always a correct
fallback. Both editors share
deterministic typesetting and PDF export, and the same recovery and naming
behavior: unsaved edits go to a per-tab recovery draft either page can restore,
including a cover letter changed only by title or style. Workspace adoption
never deletes a live sibling tab's draft and notifies that tab that the saved
workspace changed. A document is named
Name_Company_Resume / Name_Company_Cover_Letter so
one role's materials read as one application. Selecting a saved variant changes
the document content, not that application output name, and both editor
sublabels show the same Role at Company target.
.resume and .cover are their separate reloadable formats. The product also
includes application-question drafts and a lightweight application pipeline
tracker. Prepare gives Resume and Cover Letter matching material cards, each
with its own named-variant selector and Include toggle. Resume starts included
and Cover Letter starts excluded. Apply creates the tracked application once the
job is prepared and stores only included, ready materials; it also supports a
tracker-only application with both cards excluded. On a later re-Apply, an
excluded slot is left untouched so a previously saved artifact is never deleted
or replaced implicitly. The resume and cover letter keep independent
saved/unsaved states and an explicit "Update application" action in their own
Save menus that rewrites only that document. Regenerating or editing a document
never rewrites a stored one. An application keeps one space-efficient
representation of each document:
editable .resume/.cover source for documents saved from RoleFit, or the PDF
when the user explicitly uploads one. Its Documents tab previews or downloads
either form and accepts additional PDF files the posting asked for. Tracker
text and analytics projections never count as a saved document and cannot
reload or overwrite the strict source.
Opening a stored application restores its validated posting and documents into
the current session, lands on Prepare, and preserves the dirty-document
replacement guard.
A versioned .rolefit-backup file
ports the saved local workspace and allowlisted RoleFit preferences between
devices without creating an account or synchronization service. An original resume (text) is converted
once into the structured model, which is the source of truth thereafter (and can
be saved/reloaded as a .resume file). Success = a one-page,
interview-defensible resume exported in minutes after every AI proposal has been
reviewed against source evidence.
Provider setup is explicit: the companion offers Claude Code, Codex, and Antigravity CLIs plus OpenAI and Claude APIs, while the browser shows only providers the user added. A configured provider that becomes unavailable stays visible but disabled with reconnect guidance; a never-added provider is absent. Because Antigravity 1.1.x has no non-interactive auth-status command, an added, installed Antigravity CLI is request-eligible as Ready to verify while its auth state remains unknown; the first real provider request verifies the provider-owned session or reports sign-in recovery guidance. With none configured, editing, tracking, and export remain available while AI actions stop with a direct instruction to add a provider. RoleFit never chooses a paid replacement silently.
The companion defaults to local port 5181 and may persist another available
port after explicit confirmation and restart. Browser-local state is scoped by
origin, so a different port has separate draft/preferences storage. Workspace
and provider data keep their operating-system-local locations, and extension
preparation follows the companion's resolved numeric localhost port through a
generated extension runtime config. A port-changing restart tells the user to
reload the unpacked extension once; there is no live native synchronization or
localhost scanning. Health identifies a compatible server as
companion-launched or standalone without treating that public response as proof
of ownership; only the current private utility-process handle proves that this
companion started it. Startup may connect to or gracefully stop a standalone
development server, use or gracefully restart a previous companion service on
macOS/Linux, or persist another available port. RoleFit never stops an
unidentified listener, never force-kills a compatible listener, and does not
offer process termination on Windows where an equivalent graceful signal is
unavailable.
Calm, dense, trustworthy. A compact desktop-first job-prep workspace that disappears into the task. Quiet competence, not salesmanship.
- Marketing landing-page patterns inside the Drafting Desk, oversized in-app heroes, and gradient-heavy working surfaces. The separate public product page follows its own calm editorial contract.
- SaaS dashboard clichés (hero metrics, identical card grids).
- Sales-style or hype copy; in-product manuals and multi-sentence help essays.
- Fake loading states, shimmer, decorative motion.
- Nested card-in-card containers.
- Honesty is the product: never imply the AI can safely supply missing facts; ground proposals in provided evidence and surface gaps or placeholders for human review instead of hiding them.
- Preserve the compact masthead + full-width studio workflow: the masthead
carries the brand plus the global Apply action. Read-only Sessions is
ambient awareness immediately above Settings in the bottom studio-rail
utilities group, outside
OUTPUT_TABSand the APG tablist. Expanded it reads Sessions + count; collapsed it becomes an icon + compact count/working state, and its popover opens rightward within the viewport. The rail starts with a PREPARE group containing Prepare, followed by DRAFT and TRACK groups. Prepare is the first/default and sole job-intake surface; tabbed workspaces continue with Resume and its consistent Open/Save/Polish document action bar and a post-polish review rail, Cover letter with the matching document action bar, its plain editor and a compact rail that reports readiness before Tailor and provenance after it, Materials, the Applications tracker, and Analytics. The engine-painted page remains the sole editor, the review rail navigates back to exact fields, and the editor itself remains the live preview. Saved-application PDF preview is a tracker detail, not a second live editing/compile surface. Changes refine this workflow, never reshape it. - Density with calm: restrained contrast, compact spacing, short labels, icons for repeated controls; one true card only for repeated items.
- Recovery-friendly: inline, localized, user-safe errors near the affected workflow; never raw provider errors, stack traces, or resume text in chrome.
- Restraint over systems: no global toast/banner/loading frameworks; reuse
the per-surface CSS classes in
src/styles/, shared editor primitives from@typeset/editor, and each owner's tokens rather than forking controls. - Make workflow state truthful: Distill, Tailor, and Review show their exact ordered step, stop after failure/user cancellation, identify the cause, and never present a deterministic brief as a successful AI run.
- Preserve product boundaries: RoleFit owns job/AI/tracker orchestration and host chrome; shared document editing, formatting, layout, files, and PDF remain package-owned and consistent with standalone Typeset.
- Keep provider setup local and least-privileged: API keys are write-only from
the companion renderer, encrypted through Electron
safeStorage, and never enter browser storage or HTTP. CLI authentication stays provider-owned; RoleFit never asks for provider passwords, MFA values, or OAuth codes. - Make portability explicit and recoverable: the companion's Workspace section owns Back up and Restore. A backup includes only validated app-managed resumes, history, tracker data, saved PDFs, and mirrored allowlisted browser preferences. It excludes provider setup, API keys, CLI sessions, arbitrary workspace files, and unsaved recovery drafts. Restore refuses to run while live RoleFit browser tabs are detected, validates a complete staging workspace before replacement, and keeps the previous saved workspace as a local safety copy; the browser adopts restored preferences on its next load.
- Keep application readiness singular: the masthead and Prepare page expose the same Apply command and blocker model. The current job must be prepared and preparation for selected work must be idle. Resume and Cover Letter each have an Include toggle; only included material must be ready, and both may be excluded. Resume defaults on and Cover Letter defaults off. A later re-Apply must preserve any previously saved artifact for an excluded slot. Prepare may summarize a current matching AI Review or a matching historical saved review; before either exists it says "Not reviewed" and never substitutes a local fit estimate.
- Preserve safe extension automation: a claimed extension posting opens and
progresses on Prepare. Automatic resume tailoring stays there and ranks
actual saved
.resumecontents against the prepared job. Resume and cover letter use one rule: weight required qualifications, declared technology, responsibilities, and role signals; auto-select a meaningful unique winner only while the editor is clean and not restored from an application. A tie or incomplete comparison makes no recommendation and keeps the current selection. Do not add persisted variant metadata or another document schema for this decision. - Keep the complete prepared job correctable without another AI run. Along with role, company, location, type, source, work authorization, compensation, and one role context, expose responsibilities, required and preferred qualifications, technical keywords, seniority and domain signals, benefits, and extraction or candidate-review gaps. Preserve the captured posting separately, persist the complete corrected brief on Apply, and restore both without feeding benefits into resume tailoring. Treat restored candidate gaps as historical until a matching Review replaces them.
WCAG AA contrast for text (recently audited; --ink-faint darkened to pass).
Keyboard access for all changed controls (APG tabs nav, focus-visible rings,
24px minimum icon hit targets). aria-live for async preview/export status.
Desktop is primary; content wraps rather than clips at narrow widths. At 720px
and below, precise Resume authoring yields to a focused width notice, but
Prepare, navigation, Cover letter, Materials, Applications, and Analytics remain
available.