Skip to content

A resume from a page: paste a URL on the new-resume form, or send {url} to the import API - #100

Merged
ralyodio merged 1 commit into
masterfrom
resume-from-url
Sep 12, 2026
Merged

A resume from a page: paste a URL on the new-resume form, or send {url} to the import API#100
ralyodio merged 1 commit into
masterfrom
resume-from-url

Conversation

@ralyodio

Copy link
Copy Markdown
Contributor

Summary

  • New-resume page gets a second card, "Start from a page": paste a URL, the page is read and becomes the resume draft.
  • POST /api/v1/resumes/import accepts {"url": "https://..."} (JSON) or a url form field beside the existing file.
  • src/core/browse.ts: with OBSCURA_MCP_URL set, the page goes through Obscura's built-in MCP server (browser_navigate, then browser_markdown), a real browser engine, so client-rendered pages come out whole. Without it, plain fetch plus an HTML-to-Markdown reducer (main/article, headings, lists, links; nav, footer, scripts dropped). Public http(s) only: loopback, RFC1918, link-local and IPv4-in-IPv6 addresses are refused before any fetch.
  • Obscura's HTTP MCP has no auth of its own, so the URL must be a private one (Railway internal hostname). It runs as service obscura in the agenticjobs Railway project, bound to the private network only; OBSCURA_MCP_URL=http://obscura.railway.internal:3000/mcp on web.
  • The API answers with a warning that a page carries navigation and footers a resume does not.

Test plan

  • test/browse.test.ts: HTML reduction, private-address refusal before fetch, the fetch path, the Obscura tool sequence with arguments, the empty-page refusal
  • full suite passes
  • live: after deploy, paste https://agenticjobs.work/candidates/anthony-ettinger on /me/resumes/new

🤖 Generated with Claude Code

https://claude.ai/code/session_01FMT2v1YxmgcDuionrfT719

…l} to the import API

A profile, a personal site, an online resume. With an Obscura MCP server
configured (OBSCURA_MCP_URL, private network only: its HTTP transport has no
auth of its own) the page is rendered by a real browser engine and its own
browser_markdown tool does the conversion, so a page that renders client
side comes out whole. Without one the page is fetched and reduced to
Markdown here: main content, headings, lists, links, no nav or footer.

Only public http(s) addresses are read; loopback, RFC1918, link-local and
IPv4-in-IPv6 are refused before any fetch. The result is a draft the person
edits, with the URL kept as its source, and the API says so in a warning.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FMT2v1YxmgcDuionrfT719
@ralyodio
ralyodio merged commit 6150b8f into master Sep 12, 2026
4 checks passed
@ralyodio
ralyodio deleted the resume-from-url branch September 12, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant