Workx is a single-user job search execution system: it helps you decide what to do today and keeps a clean timeline of actions taken.
It is built with a Ports & Adapters architecture. By default it runs in memory mode (seeded data). When Supabase env vars are present, it uses Supabase persistence.
Job discovery foundations are implemented via a manual ingestion flow (Remotive + WWR + Web3 + Remote OK sources) and a jobs list with filters. Automated scraping and ranking are future phases (see ROADMAP.md).
Workx is designed to be opened once per day.
When you open it, it helps you decide:
- Which applications require action today (especially overdue next actions).
- Which new jobs are worth converting into applications.
- What you can safely ignore.
Every feature should reduce decision fatigue and increase execution speed.
- Domain:
src/domain/**(framework-agnostic types and entities) - Ports:
src/ports/**(stable interfaces) - Adapters:
src/adapters/**(memory + optional Supabase) - Use cases:
src/services/usecases/**(business rules, writes, audit logs) - Composition:
src/composition/**(wire adapters to ports) - UI:
app/**(calls use cases only)
npm installCreate a .env.local with Supabase values to enable the Supabase adapter:
NEXT_PUBLIC_SUPABASE_URL=your_url
NEXT_PUBLIC_SUPABASE_PUBLISHABLE_DEFAULT_KEY=your_keyIf you want to ingest Web3 jobs, set:
WEB3_CAREER_TOKEN=your_web3_token
WEB3_TAG=react
WEB3_DEBUG=falseTo enforce a daily ingest cap, set:
INGEST_DAILY_CAP=2Apply the schema in supabase/schema.sql to your Supabase project.
npm run devWith the dev server running, you can trigger manual ingestion from Remotive:
curl "http://localhost:3000/api/ingest?source=Remotive&limit=50"Or ingest from We Work Remotely:
curl "http://localhost:3000/api/ingest?source=WWR&limit=50"Or ingest from Web3:
curl "http://localhost:3000/api/ingest?source=Web3&limit=50"Note: Web3 API max limit is 100 (higher values are capped).
Or ingest from Remote OK:
curl "http://localhost:3000/api/ingest?source=Remote%20OK&limit=50"Remote OK requests attribution and direct job links; keep the source label and URL intact.
To ingest from all configured sources at once:
curl "http://localhost:3000/api/ingest?source=all&limit=50"This will upsert jobs by externalId and make them available in the Jobs page.
Check ingest status (daily cap + last runs):
curl "http://localhost:3000/api/ingest/status"Legacy endpoints still work:
curl "http://localhost:3000/api/ingest/remotive?limit=50"
curl "http://localhost:3000/api/ingest/wwr?limit=50"npm run dev- local dev servernpm run test- run Vitestnpm run lint- lint
- All dates for
nextActionAtare date-only strings:YYYY-MM-DD. - All writes append an audit log entry via use cases.