Repository navigation
Job posts: postings by URL or keyword, and the real people behind each one - #107
Merged
Merged
Conversation
…behind each one
Paste job posting URLs, or search Workable, Greenhouse, Lever and Ashby by
keyword ("senior software engineer (remote)") through ValueSERP. Each posting
is read from its board's keyless API, then ValueSERP searches LinkedIn for the
company's founders, engineering leaders and recruiters. A result is kept only
when it names the company as itself, and the company's own site is read for
addresses (attached to the person whose name they are) and names (a person the
site names is marked on_company_site, which is what tells one Raydar from
another). A contact joins a campaign through intakeSocialPeople with their
employer's domain set, so find_email can work; nothing is sent.
API /api/v1/job-posts, og jobs, six MCP tools, /jobs in the PWA, worker job
resolve_job_post, migration 0046. Uses the existing VALUESERP_API_KEY.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
app.env on dev2 is the runtime's only env and nothing wrote it but a human over ssh. A secret a feature needs (VALUESERP_API_KEY for job posts) now ships as a repo secret: the step upserts it into app.env, keeps a numbered backup when anything changes, skips unset secrets, and passes values on stdin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…d job-post credits The public auth routes mail whatever address they are handed (the b1dz pattern: a Tor-rotating script drove signup and forgot-password into ~130 strangers' inboxes), and the job-post routes spend ValueSERP credits. Both now go through form-guard's sliding-window limiter: - per IP: register 5/h, forgot-password 5/h, login 30/15 min - per target address: forgot-password 3/h, so rotating IPs cannot keep mailing one stranger - per user: verify-resend 5/h - per workspace: job search 20/h, inline resolve 60/h, URL adds 30/h - the quoted User-Agent the b1dz bot carried is refused (403) Refusals are 429 with Retry-After, so the 4xx reaches nginx's log for ThreatCrush. The caller is keyed on X-Real-IP, which dev2's nginx sets to $remote_addr; the first X-Forwarded-For hop is client-controlled, so the public directory's limiter now prefers X-Real-IP too. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Review the following changes in direct dependencies. Learn more about Socket for GitHub.
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
A CRUD list of job postings (pasted URLs, or a ValueSERP keyword search across Workable / Greenhouse / Lever / Ashby) and, for each, the real people behind it: founders, engineering leaders and recruiters found on LinkedIn through ValueSERP, with the search result kept as evidence.
site:linkedin.com/in "<Company>" (founder OR CEO OR CTO OR …). Results that don't name the company as itself are dropped ("Raydar Studios" ≠ "Raydar").david@raydar.xyz→ David Phillips); names on the site seton_company_site. Once the site names anyone, a result whose own headline doesn't claim the company sinks (the music "Raydar" founder seen live).intakeSocialPeople, settingcurrent_company_idsofind_emailhas a domain. Nothing sends; approval unchanged.Surfaces:
/api/v1/job-posts,og jobs …, MCP (list_job_posts,search_job_posts,add_job_posts,find_job_post_contacts,promote_job_post_contact,update_job_post),/jobspage (linked from Products), worker jobresolve_job_post, migration0046_job_posts(SQLite + PG). Docs:docs/job-posts.md.Verified
bun run check: format, typecheck, 2132 tests green;apps/webtsc clean.david@raydar.xyzfrom raydar.xyz) first; keyword search "senior software engineer (remote)" found 30 postings, saved 3 (Pavago, GiveDirectly, Brigit), and the worker resolved each to named people.To ship
VALUESERP_API_KEYmust be set on the outreachgraph Railway service (a key exists in theprofullstack-sharable-keysvault). Without it, URLs can still be added and read; keyword search is refused with that reason.🤖 Generated with Claude Code