{"id":51577192,"url":"https://github.com/royashbrook/lifescored","last_synced_at":"2026-07-11T01:32:07.058Z","repository":{"id":364448764,"uuid":"1267812237","full_name":"royashbrook/lifescored","owner":"royashbrook","description":"You are already a number. Every rule cited, every weight editable.","archived":false,"fork":false,"pushed_at":"2026-06-29T17:04:42.000Z","size":440,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-29T19:07:26.300Z","etag":null,"topics":["cloudflare-workers","life-score","svelte","transparency"],"latest_commit_sha":null,"homepage":null,"language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/royashbrook.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-12T22:08:48.000Z","updated_at":"2026-06-29T17:04:46.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/royashbrook/lifescored","commit_stats":null,"previous_names":["royashbrook/lifescored"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/royashbrook/lifescored","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/royashbrook%2Flifescored","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/royashbrook%2Flifescored/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/royashbrook%2Flifescored/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/royashbrook%2Flifescored/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/royashbrook","download_url":"https://codeload.github.com/royashbrook/lifescored/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/royashbrook%2Flifescored/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35348376,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-10T02:00:06.465Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cloudflare-workers","life-score","svelte","transparency"],"created_at":"2026-07-11T01:32:06.698Z","updated_at":"2026-07-11T01:32:07.012Z","avatar_url":"https://github.com/royashbrook.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# life. scored.\n\n[![deploy](https://github.com/royashbrook/lifescored/actions/workflows/deploy.yml/badge.svg)](https://github.com/royashbrook/lifescored/actions/workflows/deploy.yml)\n\n**You are already a number.**\n\nA credit score, an actuarial row, a callback probability — this app rebuilds those numbers in the open: every rule cited or flagged as a guess, every weight visible and editable. Transparency, not judgment.\n\n[check it out - lifescored.com](https://lifescored.com)\n\n## Stack\n\n- Svelte 5 + SvelteKit, prerendered static pages, deployed to Cloudflare Workers\n- One dynamic endpoint: `POST /api/narrative` — KV-cached Gemini narratives with a\n  deterministic local fallback (the app is fully functional with no API key at all)\n- All user data stays in the browser (localStorage + URL-fragment share links)\n- Traffic is measured with Cloudflare Web Analytics — cookieless and aggregate; it cannot see your inputs, which never leave your device anyway.\n\n## Develop\n\n    npm install\n    npm run dev      # app at localhost:5173 (narrative falls back to local composer)\n    npm test         # vitest suite: rulebook invariants, engine, codec, worker handler\n    npm run check    # svelte-check\n\n## Deploy (Cloudflare free tier)\n\nDeploys run automatically from GitHub Actions on every push to `main`\n([`.github/workflows/deploy.yml`](.github/workflows/deploy.yml)): the workflow\nruns the full test suite + typecheck, and only then builds and deploys.\n\n**One-time setup:**\n\nSecrets are kept in [hush](https://github.com/royashbrook/hush): stored once in your OS keychain,\nthen piped straight into the consumer — they never get pasted into a terminal, echoed, or printed.\nThis project's hush items use a `lifescored-` prefix so they group together in a keychain search.\n(No hush? Drop the `hush pipe … --` prefix and run the bare `npx wrangler` / `gh` command; hush just\nwraps it.) Local dev needs no secrets at all — the narrative falls back to a local composer.\n\n1. Create the KV namespace and paste its id into `wrangler.jsonc`:\n\n       npx wrangler kv namespace create NARRATIVE_KV\n\n2. Set the Gemini key as a Worker secret (persists across deploys; optional —\n   omit to run AI-free with the local narrative fallback):\n\n       hush set lifescored-gemini-key                                   # paste it once, hidden dialog\n       hush pipe lifescored-gemini-key -- npx wrangler secret put GEMINI_API_KEY\n\n3. Give GitHub Actions the deploy credentials\n   (Settings → Secrets and variables → Actions):\n\n       hush set lifescored-cloudflare-api-token                         # \"Edit Cloudflare Workers\" token\n       hush pipe lifescored-cloudflare-api-token -- gh secret set CLOUDFLARE_API_TOKEN\n       gh secret set CLOUDFLARE_ACCOUNT_ID --body \"\u003cyour-account-id\u003e\"    # account id isn't secret\n\nPush to `main` and the action ships it. To deploy by hand instead:\n\n       npm run deploy\n\n## Deploy your own\n\nFork the repo, do the one-time setup above with your own Cloudflare account, and\npush. The app is fully functional with no Gemini key at all.\n\n## Editing the rulebook\n\nRules live in `src/lib/rulebook/\u003cdomain\u003e.ts`. Each rule is declarative: logic,\nevidence tag (`SOURCED`/`SPECULATIVE`), citation with access date, a pure\n`position(inputs)` (the measured fact, normalized to a numeric position), declared\n`bounds` (negative floors only where the cited system itself subtracts; the wealth\nrules are uncapped above), and a `weightRationale` justifying its weight against\nthe 1.0× income baseline; the engine computes `points = round(position × weight)`.\nAdd a rule, and the UI, weight editor, share\ncodec, and about-page source list pick it up automatically. `npm test` enforces\nthe invariants (bounds, integer scores, citation present).\n\n## Use it from an agent (MCP or skill)\n\nThe whole rulebook + exact math is published so any agent can compute a score **on its own side** — nothing about a person is ever sent to lifescored.com.\n\n- **MCP server** — `com.lifescored/mcp` on the [official registry](https://registry.modelcontextprotocol.io); endpoint `https://lifescored.com/mcp` (stateless Streamable HTTP, no auth, accepts no personal data). Tools: `get_rulebook`, `get_input_schema`, `get_methodology`, `how_to_give_feedback`.\n- **Skill** — a drop-in [`skills/lifescored/`](skills/lifescored/SKILL.md) skill. Copy it into your agent's skills directory (e.g. `~/.claude/skills/`). It prefers the MCP and falls back to `rules.json`.\n- **Raw data** — [`https://lifescored.com/rules.json`](https://lifescored.com/rules.json) and [`/llms.txt`](https://lifescored.com/llms.txt).\n\n## Contributing\n\nEvery commit must reference a GitHub issue number, e.g. `feat: add presets (#2)` or `refs #5`. A `commit-msg` hook enforces this automatically — it is installed via `core.hooksPath` pointing to `.githooks/`, which activates on `npm install` (the `prepare` script runs `git config core.hooksPath .githooks`). Merge commits and reverts are exempt. To find or open an issue: `gh issue list` / `gh issue create`.\n\n## License\n\nMIT — see LICENSE.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froyashbrook%2Flifescored","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Froyashbrook%2Flifescored","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Froyashbrook%2Flifescored/lists"}