hireping
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Viewing readonly version of main branch: v74View latest version
Tracks new AI jobs.
HirePing is a small Val Town app that watches:
- Anthropic jobs from Greenhouse's public Job Board API
- OpenAI jobs from Ashby's public postings API
On each run it:
- fetches the latest job listings
- compares them to the current snapshot
- detects new jobs and archived jobs
- records job observations
- stores full payloads only for newly discovered jobs
- emails a summary when there are new or archived jobs
src/cron.ts: main app flow, diffing, logging, and email sendingsrc/anthropic/source.ts: Anthropic source backed by Greenhouse's public APIsrc/openai/source.ts: OpenAI source backed by Ashby's public APIsrc/db.ts: SQLite schema and writessrc/jobs.ts: shared job type and snapshot helperssrc/test/app_test.ts: local end-to-end app test
Current lightweight snapshot of active jobs.
url- primary keysourcelast_seen_at
This table no longer stores full payload blobs.
Full payloads for newly discovered jobs only.
url- primary keysourceraw_jsoncaptured_at
Jobs that disappeared from the latest snapshot.
url- primary keysourcearchived_at
The full payload still lives in job_payloads (keyed by url), so it can be looked up there.
One row per job URL tracking when it was first and most recently seen.
url- primary keyfirst_seen_at- set on insert, never updatedlast_seen_at- bumped on every run the job appears in
When there are changes, HirePing sends an email with:
- new jobs
- archived jobs
The subject lists the actual titles, only including the sections that have entries:
- both:
New: <title>; <title> · Archived: <title> - new only:
New: <title>; <title> - archived only:
Archived: <title>
- Anthropic uses
https://boards-api.greenhouse.io/v1/boards/anthropic/jobs?content=true - OpenAI uses Ashby's public posting API behind
https://openai.com/careers/search/ jobsis intentionally small so snapshot syncs stay cheap- full payloads are only stored for
newJobs, and those writes are batched in groups of 10 - the app logs each major run step to make production failures easier to localize
Local verification:
deno task check deno test -A src/test/app_test.ts
