openvibers/openvibe.work CHANGELOG.md
CHANGELOG.md
| 1 | # Changelog |
| 2 | |
| 3 | What changed in OpenVibe.Work, newest first. Each site also publishes its patch notes at /updates. |
| 4 | |
| 5 | ## 0.2.0 — 2026-10-08 |
| 6 | |
| 7 | **Job listings, searchable, with their provenance — and saved searches.** |
| 8 | |
| 9 | - **Listings, gathered from open boards.** A background ingest reads Arbeitnow, Remotive and RemoteOK through their |
| 10 | public APIs (server/jobs/sources.js, server/ingest/). Each board's terms are applied as written: the source is named |
| 11 | and the original listing is linked on every page that shows it, and only a short plain-text excerpt is stored — never |
| 12 | the full description. Every listing keeps the board's own id and URL, and a listing without both a title, a company, |
| 13 | an id and an http(s) link back is refused rather than published. The ingest is off unless `WORK_INGEST=on`, calls a |
| 14 | source at most every six hours (exactly the four a day Remotive's terms allow), upserts on `(source, source_id)`, and |
| 15 | expires a listing no board has shown for 30 days. |
| 16 | - **Search** at `/jobs` (`q`, `remote`, `type`, `location`), newest first, 30 a page with a cursor, with facets for |
| 17 | remote and job type. One listing at `/jobs/:id`, with a schema.org `JobPosting` whose `url` is the original. |
| 18 | - **Saved searches** for a signed-in person: save the search you are looking at, and `/saved` shows each one with the |
| 19 | count of listings that appeared since you last looked (opening the page is what clears it). |
| 20 | - **The API** at `/api/v1`: `GET /jobs`, `GET /jobs/:id`, `GET /sources` (each board's terms as applied and its last |
| 21 | fetch), and `POST`/`GET`/`DELETE /saved-searches`. Reading is public; a saved search is a person's. |
| 22 | - **Pages**: a home page with the search box, the latest remote listings and each source with its count; `/sources`, |
| 23 | which states each board's terms as applied; and `/docs` for the API. A sitemap carrying the newest listings, and |
| 24 | `llms.txt` pointing a crawler at the listings and the sources. |
| 25 | - **Limits**: the search and the saved-search writes have per-caller budgets of their own |
| 26 | (`work.jobs.search`, `work.saved_searches.write`). |
| 27 | - **New tables**: `work_listings`, `work_saved_searches`, `work_source_fetches` (`migrations/0002_listings.sql`). |
| 28 | - **New tools**: `npm run ingest` reads every board once and exits. |
| 29 | - Also: `test/skeleton.test.js` now skips itself in a generated service (this repository, whose skeleton placeholders |
| 30 | were already rewritten), saying so, rather than asserting against a rewrite that can no longer happen. |
| 31 | |
| 32 | ## 0.1.0 — 2026-10-08 |
| 33 | |
| 34 | - **First release:** the service starts from the OpenVibe skeleton — sign-in with OpenVibe.Network (OAuth 2 + PKCE), server-rendered pages through the OpenVibe Frame, the `/api/v1` mount with per-caller limits, crawl artifacts, PostgreSQL migrations, the deploy files and the test suite. |
| 35 |