Jobber/documentation/ghostwriter.md
Shaheer Sarfaraz d0b4091a60
Ghostwriter Introduced (#166)
* initlal commit

* Ghostwriter always enabled

* rename code

* ghostwriter panel

* separate component

* ui improvements

* single thread

* copy improvement

* dont pop up keyboard shortcuts

* markdown renderer

* ghostwriter button placement

* better UX

* ghostwriter copy

* meta shortcut

* better settings menu

* formatting

* doocumentation

* add tests

* race condition

* race condition 2

* pass title

* more comments

* comments

* formtting
2026-02-15 22:03:37 +00:00

61 lines
1.9 KiB
Markdown

# Ghostwriter
Ghostwriter is the per-job AI chat assistant in JobOps. It is optional to use and is designed for drafting application content with job-specific context already loaded.
## What Ghostwriter is for
Ghostwriter is not a generic chat box. For each job, it uses:
- The current job description and job metadata
- A reduced snapshot of your resume/profile
- Your global Ghostwriter writing style settings
This makes it useful for:
- Drafting role-specific answers
- Cover letter and outreach drafts
- Interview prep talking points tied to the current JD
- Rephrasing content to match your preferred style
## Where it appears
- Available from job details in `discovered` and `ready` flows
- Opens as a right-side drawer
- One persistent conversation per job
## Writing style settings impact
Ghostwriter settings are global and affect new generations:
- `Tone`: adds a tone instruction in the Ghostwriter system prompt
- `Formality`: adds a formality instruction
- `Constraints`: appended as explicit writing constraints
- `Do-not-use terms`: appended as language to avoid
Defaults:
- Tone: `professional`
- Formality: `medium`
- Constraints: empty
- Do-not-use terms: empty
## Context + safety model
Ghostwriter context is assembled server-side with size limits and sanitization:
- Job snapshot is truncated to fit prompt budget
- Profile snapshot includes only relevant slices (summary, skills, projects, experience)
- System prompt enforces read-only assistant behavior
- Logging stores metadata only (not raw full prompt/response dumps)
## API surface (current)
Primary per-job endpoints:
- `GET /api/jobs/:id/chat/messages`
- `POST /api/jobs/:id/chat/messages` (supports streaming)
- `POST /api/jobs/:id/chat/runs/:runId/cancel`
- `POST /api/jobs/:id/chat/messages/:assistantMessageId/regenerate` (supports streaming)
Compatibility endpoints for thread resources remain present, but UI behavior is one conversation per job.