Skip to content

profiles: professional facets (title, company, seniority) + LinkedIn lookup - #185

Merged
ralyodio merged 1 commit into
mainfrom
feat/profile-professional-facets
Oct 6, 2026
Merged

ralyodio merged 1 commit into
mainfrom
feat/profile-professional-facets

Conversation

@ralyodio

@ralyodio ralyodio commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

What

Professional facets on nichedb.dev profiles, read only from what the person (or a public page an adapter already crawls) published.

  • Parsing (packages/core/src/profiles.js): Title: / Job Title: / Role: / Position: and Company: / Employer: identity lines, case-insensitive. Company reads Acme, acme.com, https://acme.com, Acme (https://acme.com), [Acme](https://acme.com); a social page (LinkedIn company URL etc.) is never taken as the domain; an email is never kept. Title: CEO at Acme names both. Nothing is guessed from the headline.
  • Seniority: keyword rules on the title, most senior first: c-suite (founder, CxO, chief, president, owner but not product owner, chair, managing/general partner), vp, director (incl. head of), manager, senior (senior/sr/staff/principal/lead), entry (intern/junior/trainee/apprentice/graduate/entry level); otherwise null.
  • Tags on the profiles collection item: title:<slug>, company:<domain> (slug of the name when no domain), seniority:<level>, so ?tags= works.
  • Fields in profileOut (REST, MCP get_profile/search_profiles, CLI): title, company {name, domain}, seniority, facets.
  • Filtering: GET /api/v1/profiles?title=&company=&seniority=&tags=, same on search_profiles, nichedb profiles --title/--company/--seniority/--tags. Matched on profiles.data->'facets' (@>); rows pick it up on their next rebuild (pull or edit).
  • LinkedIn lookup only: GET /api/v1/profiles?linkedin=<url>, MCP find_profile_by_linkedin, nichedb profiles --linkedin <url>. Public profiles only. There is deliberately no email lookup (would be an address oracle).
  • installmap founders now write Title and Company lines, so existing founders gain the facets on the next crawl. Company is not an OpenProfile identity key, so the company URL cannot fuse a founder into the org profile (tested).

No schema change, no new index, no Apollo or private data, nothing new stores emails.

Tests

New cases in test/profiles.test.js (seniority rules, parsing, tags, view, filter SQL on PGlite, LinkedIn keys), test/installmap.test.js, apps/web/src/routes/profiles.test.js (API fields, filters, LinkedIn lookup incl. private/email/non-LinkedIn), apps/cli/test/cli.test.js. Local full run: 2350 pass, 1 unrelated local failure (podcasts-podcastindex-catalog tar/timeout in this sandbox).

Not done: the OpenProfile spec in logicsrc does not yet list Title/Company as named keys.

🤖 Generated with Claude Code

…lookup

Read a job title (`Title:`, `Job Title:`, `Role:`, `Position:`) and an
employer (`Company:`, `Employer:`) from a profile's identity block, case
insensitively, and derive a seniority (c-suite, vp, director, manager,
senior, entry) from keywords in the title. `CEO at Acme` names both; nothing
is guessed from the headline. Company is not an identity key, so its URL
never fuses people.

- profileView stores title, company {name, domain}, seniority and facets
  (only when stated, so other profiles keep their view and item hash)
- profileItem tags title:<slug>, company:<domain|slug>, seniority:<level>,
  so ?tags= filters the profiles collection
- profileOut (REST, MCP, CLI) carries title, company, seniority, facets
- GET /api/v1/profiles, search_profiles and `nichedb profiles` take
  title, company, seniority and tags (matched on data.facets)
- LinkedIn-only lookup: GET /api/v1/profiles?linkedin=<url>,
  find_profile_by_linkedin, `nichedb profiles --linkedin`; public profiles
  only, and deliberately no lookup by email
- installmap founders now write Title and Company lines, so the next crawl
  gives existing founders the facets

No schema change and no new index.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ralyodio
ralyodio merged commit 9b9e479 into main Oct 6, 2026
3 checks passed
@ralyodio
ralyodio deleted the feat/profile-professional-facets branch October 6, 2026 13:15
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