Everything hard about this sits in the last mile: an assistant can write a sharper skills paragraph in seconds, and then the only way into the document is to paste it and repair the formatting by hand. Editing through LibreOffice's object model instead of a Markdown round trip removes that step, and pairing it with a ranked read of the posting means the rewrite is aimed at something specific rather than generically polished.
Two servers that work as one pass. The keyword extractor reads a job description and returns a ranked structure — critical down to nice-to-have, alongside the tools, technologies, methodologies, core responsibilities, role level and company context it found. The document editor writes the tailored content back into an .odt resume: it does not convert the file, it drives LibreOffice's own document-object model over a local socket and replaces the text between paired bookmarks, so fonts, paragraph styles, spacing and page structure survive exactly as the template author set them, and output goes to a timestamped file rather than over the template. Editable regions are whatever bookmark pairs a template defines; the one that ships exposes summary, skills and three work-experience blocks. The editor talks to a headless LibreOffice, which has to be running before it can open anything.
- A job description parsed into ranked keywords, from critical to nice-to-have, with a requirements summary, the tools and methodologies named in the posting, the core responsibilities, and the role's level and scope
- The editable regions the current template exposes, listed by name
- One section's content replaced, with the template's fonts, styles and layout preserved
- Several sections replaced atomically in a single pass, rather than one call at a time
- Output written to a timestamped file, so the template itself is never overwritten
