Capture a posting from the message on screen and send it to Postulo for review #1

Open
opened 2026-10-01 07:21:55 +00:00 by tiagoagueda · 1 comment
Owner

The skeleton reads the subject and the sender of the message on screen and stops there: Capture this posting is drawn and switched off. This issue is what the extension is for, and the issues that count, list and review captures all stand on it. It is not in the list of improvements, which takes it for granted.

What Postulo accepts

Read in the core, and tried against its own readers on 2026-10-01:

  • POST /api/v1/captures (the captures scope) takes a url, which is an http or https address or empty, and optionally the page as html. With html, Postulo fetches nothing and reads what it is given. Without it, Postulo fetches the address itself, and that counts against the account's capture allowance (30 an hour by default).
  • When its readers find nothing that looks like a posting, the answer is 422, "Nothing resembling a job posting was found there." Corrections sent as data are applied only after a successful read.
  • A message can be read as a posting when it carries the posting's address. A page made of a message's body, with a title and the address, is read (the title becomes the posting's). The same page with an empty address is refused, and so is a body with no title.
  • POST /api/v1/captures/preview says what would be read and stores nothing; POST /api/v1/captures/known says whether Postulo already holds a posting at an address.

What the extension should do

  1. Read the message when the button is pressed, not before: its subject, sender, date, body and links (messages.getFull, under the messagesRead permission the skeleton already has).
  2. Find the posting's address among the links, leaving out the ones that are plainly not it (unsubscribe, tracking, social networks). One candidate is chosen; several are offered.
  3. Build the page to send: the message's body under its cleaned subject as the title (cleanSubject in src/lib/mail.js), with scripts, styles and remote images dropped and its size capped, as the browser extension trims a page.
  4. Show it before it goes: the posting as a form, filled from what Postulo's preview reads, with the sender offered as the company and marked as a guess. What the person corrects goes as data.
  5. Say "captured before" when Postulo already holds that address.
  6. Send for review, and say what became of it, with a link to its review.

Decisions

  • The message as the page, or the address alone. Sending only the address has Postulo fetch the posting itself: the real page, but it spends the allowance and fails for a page behind a sign-in. Recommended: the message as the page when it has text, the address alone as a second button.
  • A message with no address (a recruiter writing directly). It cannot be captured with the server as it is. Recommended: say so, and offer #9. Capturing it would need Postulo to accept a posting a client assembled; not filed on postulo/postulo.
  • Kept until Postulo answers. The browser extension keeps a capture in the browser and sends it later (store.js, outbox.js in postulo-chromium). Recommended: share those two files through shared.json, so a capture made while Postulo is away is not lost.
  • A digest. An alert listing ten postings is the browser extension's page of results. Recommended: a second step, after one posting per message works.

Privacy

Once this lands the extension sends something, so the repository needs a PRIVACY.md and the README's Privacy, as it stands changes: what is read (the message on screen, when the button is pressed), what is sent (the address and the trimmed body, to the person's own Postulo and nowhere else), and what is kept. Remote images in a message are never loaded.

Done when

  • A message carrying a posting's address is captured from the popup, corrected, sent, and appears in Postulo's review queue with a link back to it.
  • A message with no address says why it cannot be captured.
  • The reading of a message (links, the page built from it) is pure functions tested with node --test.
  • test/i18n.test.mjs requires every new key in every language the extension ships, with identical placeholders: three today, more once #7 lands.

Not in the list of improvements of 2026-09-30; filed with it because every item on it depends on this.

The skeleton reads the subject and the sender of the message on screen and stops there: *Capture this posting* is drawn and switched off. This issue is what the extension is for, and the issues that count, list and review captures all stand on it. It is not in the list of improvements, which takes it for granted. ## What Postulo accepts Read in the core, and tried against its own readers on 2026-10-01: - `POST /api/v1/captures` (the `captures` scope) takes a `url`, which is an http or https address or empty, and optionally the page as `html`. With `html`, Postulo fetches nothing and reads what it is given. Without it, Postulo fetches the address itself, and that counts against the account's capture allowance (30 an hour by default). - When its readers find nothing that looks like a posting, the answer is 422, "Nothing resembling a job posting was found there." Corrections sent as `data` are applied only after a successful read. - **A message can be read as a posting when it carries the posting's address.** A page made of a message's body, with a title and the address, is read (the title becomes the posting's). The same page with an empty address is refused, and so is a body with no title. - `POST /api/v1/captures/preview` says what would be read and stores nothing; `POST /api/v1/captures/known` says whether Postulo already holds a posting at an address. ## What the extension should do 1. **Read the message** when the button is pressed, not before: its subject, sender, date, body and links (`messages.getFull`, under the `messagesRead` permission the skeleton already has). 2. **Find the posting's address** among the links, leaving out the ones that are plainly not it (unsubscribe, tracking, social networks). One candidate is chosen; several are offered. 3. **Build the page to send**: the message's body under its cleaned subject as the title (`cleanSubject` in `src/lib/mail.js`), with scripts, styles and remote images dropped and its size capped, as the browser extension trims a page. 4. **Show it before it goes**: the posting as a form, filled from what Postulo's preview reads, with the sender offered as the company and marked as a guess. What the person corrects goes as `data`. 5. **Say "captured before"** when Postulo already holds that address. 6. **Send for review**, and say what became of it, with a link to its review. ## Decisions - **The message as the page, or the address alone.** Sending only the address has Postulo fetch the posting itself: the real page, but it spends the allowance and fails for a page behind a sign-in. Recommended: the message as the page when it has text, the address alone as a second button. - **A message with no address** (a recruiter writing directly). It cannot be captured with the server as it is. Recommended: say so, and offer #9. Capturing it would need Postulo to accept a posting a client assembled; not filed on postulo/postulo. - **Kept until Postulo answers.** The browser extension keeps a capture in the browser and sends it later (`store.js`, `outbox.js` in postulo-chromium). Recommended: share those two files through `shared.json`, so a capture made while Postulo is away is not lost. - **A digest.** An alert listing ten postings is the browser extension's page of results. Recommended: a second step, after one posting per message works. ## Privacy Once this lands the extension sends something, so the repository needs a PRIVACY.md and the README's *Privacy, as it stands* changes: what is read (the message on screen, when the button is pressed), what is sent (the address and the trimmed body, to the person's own Postulo and nowhere else), and what is kept. Remote images in a message are never loaded. ## Done when - A message carrying a posting's address is captured from the popup, corrected, sent, and appears in Postulo's review queue with a link back to it. - A message with no address says why it cannot be captured. - The reading of a message (links, the page built from it) is pure functions tested with `node --test`. - `test/i18n.test.mjs` requires every new key in every language the extension ships, with identical placeholders: three today, more once #7 lands. Not in the list of improvements of 2026-09-30; filed with it because every item on it depends on this.
Author
Owner

From the status review of 2026-10-30: the extension is still a skeleton while everything it needs on the core side exists (the listings:bind scope, listing history, core #271). Suggested order: this issue (capture), then #9 (file a message into a listing's history), then #2 and #4 (badge and review list). The shared files pinned at chromium 7998de3 are 28 commits old and should move first.

From the status review of 2026-10-30: the extension is still a skeleton while everything it needs on the core side exists (the `listings:bind` scope, listing history, core #271). Suggested order: this issue (capture), then #9 (file a message into a listing's history), then #2 and #4 (badge and review list). The shared files pinned at chromium `7998de3` are 28 commits old and should move first.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
Postulo/postulo-thunderbird#1
No description provided.