From 0654778cf033347142a5c66328cc399434a60bcc Mon Sep 17 00:00:00 2001 From: Mbali Simelane Date: Tue, 11 Aug 2026 20:36:12 +0200 Subject: [PATCH 1/4] Update README.md Create a new branch for this commit and start a pull request. --- web/README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/web/README.md b/web/README.md index 8f41e37..6cf093e 100644 --- a/web/README.md +++ b/web/README.md @@ -45,3 +45,19 @@ Pure Career OS helpers used by the SPA live in `lib/` (bullet memory, cadence, r - **Board pack** (`CareerOps_board_pack.json`) — skill modes + Settings import (upsert). Schema v5 adds contacts, posted `comp_range`/`comp_raw`, and profile target band. API keys never exported or imported. - **Full JSON** / **CSV** — Settings → Your data. + +## Edge functions + +> **Source note:** the implementations of these functions are **not included in this public repo**. `web/ui/state.mjs` calls them by name via `sb.functions.invoke(...)`, assuming a Supabase project with matching Edge Functions deployed. If you're self-hosting, you'll need to write and deploy your own implementations (or point at a hosted backend that provides them) — see `web/config.js` for wiring the Supabase URL/anon key. + +| Function | When the UI calls it | Required for a board-only install? | +|---|---|---| +| `run-search-mt` | User clicks **🔍 Run job search** (or the onboarding "Run my first search") — scans configured company career boards for matching roles. | **Optional.** Board CRUD works without it; you can add roles manually via **+ Add role**. | +| `fetch-jd` | Auto-loads a job description from a posting URL — when opening a role's drawer/panel, on ATS "liveness" checks for a card, and after adding a role via LinkedIn/URL search. | **Optional.** You can paste the JD manually via "Edit / paste" instead. | +| `resume-match` | User clicks **Check my match** to score a resume against a JD. | **Optional if** a BYO OpenAI-compatible key is set in Settings (the match runs client-side instead). **Required** for match scoring otherwise. | +| `resume-rewrite` | **✨ Tailor resume**, cover letter, and single-bullet rewrite actions. | Same as above — optional with a BYO key, otherwise required for AI tailoring. | +| `chat` | The in-app AI chat / advisor brief. | Same bypass logic — optional with a BYO key, otherwise required for chat/advisor. | +| `ai-free` | Settings screen, to show remaining free-tier daily uses. | **Optional** — cosmetic only; affects the usage display, not functionality. | +| `humanize` | **✨ Humanize wording** button. | **Optional** — only used if the user has connected an ai-text-humanizer.com account. | + +**Minimal viable install:** none of the 7 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO key to skip them entirely). \ No newline at end of file From 25e88a6bbe175b58b565d9027fb1fca9cc6f8b91 Mon Sep 17 00:00:00 2001 From: Mbali Simelane Date: Tue, 11 Aug 2026 20:47:25 +0200 Subject: [PATCH 2/4] Update README.md docs: list edge functions the SPA calls --- web/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web/README.md b/web/README.md index 6cf093e..23b1c98 100644 --- a/web/README.md +++ b/web/README.md @@ -52,12 +52,12 @@ Pure Career OS helpers used by the SPA live in `lib/` (bullet memory, cadence, r | Function | When the UI calls it | Required for a board-only install? | |---|---|---| -| `run-search-mt` | User clicks **🔍 Run job search** (or the onboarding "Run my first search") — scans configured company career boards for matching roles. | **Optional.** Board CRUD works without it; you can add roles manually via **+ Add role**. | +| `run-search-mt` | User clicks **Run job search** (or the onboarding "Run my first search") — scans configured company career boards for matching roles. | **Optional.** Board CRUD works without it; you can add roles manually via **+ Add role**. | | `fetch-jd` | Auto-loads a job description from a posting URL — when opening a role's drawer/panel, on ATS "liveness" checks for a card, and after adding a role via LinkedIn/URL search. | **Optional.** You can paste the JD manually via "Edit / paste" instead. | | `resume-match` | User clicks **Check my match** to score a resume against a JD. | **Optional if** a BYO OpenAI-compatible key is set in Settings (the match runs client-side instead). **Required** for match scoring otherwise. | -| `resume-rewrite` | **✨ Tailor resume**, cover letter, and single-bullet rewrite actions. | Same as above — optional with a BYO key, otherwise required for AI tailoring. | +| `resume-rewrite` | **Tailor resume**, cover letter, and single-bullet rewrite actions. | Same as above — optional with a BYO key, otherwise required for AI tailoring. | | `chat` | The in-app AI chat / advisor brief. | Same bypass logic — optional with a BYO key, otherwise required for chat/advisor. | | `ai-free` | Settings screen, to show remaining free-tier daily uses. | **Optional** — cosmetic only; affects the usage display, not functionality. | -| `humanize` | **✨ Humanize wording** button. | **Optional** — only used if the user has connected an ai-text-humanizer.com account. | +| `humanize` | **Humanize wording** button. | **Optional** — only used if the user has connected an ai-text-humanizer.com account. | **Minimal viable install:** none of the 7 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO key to skip them entirely). \ No newline at end of file From 3227dd370dd763891d38f54c7d4ee1ebdabd477e Mon Sep 17 00:00:00 2001 From: Mbali Simelane Date: Tue, 11 Aug 2026 20:49:22 +0200 Subject: [PATCH 3/4] Update README.md docs: list edge functions the SPA calls --- web/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/README.md b/web/README.md index 23b1c98..185d4f2 100644 --- a/web/README.md +++ b/web/README.md @@ -60,4 +60,4 @@ Pure Career OS helpers used by the SPA live in `lib/` (bullet memory, cadence, r | `ai-free` | Settings screen, to show remaining free-tier daily uses. | **Optional** — cosmetic only; affects the usage display, not functionality. | | `humanize` | **Humanize wording** button. | **Optional** — only used if the user has connected an ai-text-humanizer.com account. | -**Minimal viable install:** none of the 7 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO key to skip them entirely). \ No newline at end of file +**Minimal viable install:** none of the 7 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO key to skip them entirely) \ No newline at end of file From 2946ec1677931c910bfaca0a8a62a3251f077b13 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 12 Aug 2026 03:02:58 +0000 Subject: [PATCH 4/4] docs: complete edge functions list for self-host Address review feedback on #15: document upsert/clear_provider_secret, point source note at supabase/functions (fetch-jd and humanize still absent), and clarify BYO OpenAI-compat bypass. Co-authored-by: Mbali Simelane --- web/README.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/web/README.md b/web/README.md index 185d4f2..5400bfc 100644 --- a/web/README.md +++ b/web/README.md @@ -48,16 +48,18 @@ Pure Career OS helpers used by the SPA live in `lib/` (bullet memory, cadence, r ## Edge functions -> **Source note:** the implementations of these functions are **not included in this public repo**. `web/ui/state.mjs` calls them by name via `sb.functions.invoke(...)`, assuming a Supabase project with matching Edge Functions deployed. If you're self-hosting, you'll need to write and deploy your own implementations (or point at a hosted backend that provides them) — see `web/config.js` for wiring the Supabase URL/anon key. +> **Source note:** `web/ui/state.mjs` and `web/ui/settings.mjs` call these by name via `sb.functions.invoke(...)`. Reference implementations for most live under [`supabase/functions/`](../supabase/functions/README.md) — deploy those (or your own equivalents) against your Supabase project. **`fetch-jd` and `humanize` are not in this public repo**; self-hosters must supply those (or skip the UI features that call them). Wire the project via `web/config.js`. | Function | When the UI calls it | Required for a board-only install? | |---|---|---| | `run-search-mt` | User clicks **Run job search** (or the onboarding "Run my first search") — scans configured company career boards for matching roles. | **Optional.** Board CRUD works without it; you can add roles manually via **+ Add role**. | | `fetch-jd` | Auto-loads a job description from a posting URL — when opening a role's drawer/panel, on ATS "liveness" checks for a card, and after adding a role via LinkedIn/URL search. | **Optional.** You can paste the JD manually via "Edit / paste" instead. | -| `resume-match` | User clicks **Check my match** to score a resume against a JD. | **Optional if** a BYO OpenAI-compatible key is set in Settings (the match runs client-side instead). **Required** for match scoring otherwise. | -| `resume-rewrite` | **Tailor resume**, cover letter, and single-bullet rewrite actions. | Same as above — optional with a BYO key, otherwise required for AI tailoring. | -| `chat` | The in-app AI chat / advisor brief. | Same bypass logic — optional with a BYO key, otherwise required for chat/advisor. | -| `ai-free` | Settings screen, to show remaining free-tier daily uses. | **Optional** — cosmetic only; affects the usage display, not functionality. | +| `resume-match` | User clicks **Check my match** to score a resume against a JD. | **Optional if** a BYO OpenAI-compatible key is set in Settings (the match runs client-side instead). **Required** for match scoring otherwise. Claude/Kimi keys on file still go through this function. | +| `resume-rewrite` | **Tailor resume**, cover letter, and single-bullet rewrite actions. | Same as above — optional with a BYO OpenAI-compat key, otherwise required for AI tailoring. | +| `chat` | Advise / in-app assistant follow-ups. | Same bypass logic — optional with a BYO OpenAI-compat key, otherwise required for chat/advisor. | +| `ai-free` | Settings screen, to show remaining free-tier daily uses. | **Optional** — cosmetic for the SPA usage display; free-tier LLM serving is configured server-side. | | `humanize` | **Humanize wording** button. | **Optional** — only used if the user has connected an ai-text-humanizer.com account. | +| `upsert_provider_secret` | Settings save path when storing Claude / Kimi / humanizer secrets. | **Optional.** Without it, Settings falls back to plaintext profile columns for self-host. | +| `clear_provider_secret` | Settings when removing a stored provider secret. | **Optional.** Same plaintext fallback as above. | -**Minimal viable install:** none of the 7 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO key to skip them entirely) \ No newline at end of file +**Minimal viable install:** none of the 9 functions are strictly required. Core board operations (add/drag/tag roles, verdicts, outcomes, notes) call Supabase tables directly (`sb.from('mt_roles')`, etc.), not Edge Functions. Search and JD auto-fetch need `run-search-mt` / `fetch-jd`; AI scoring/tailoring/chat need the rest (or a BYO OpenAI-compat key to skip those three client-side); secret vault helpers are only needed if you want encrypted Settings storage instead of plaintext profile columns.