{"id":51629476,"url":"https://github.com/avidrucker/us-quest","last_synced_at":"2026-07-13T05:32:40.758Z","repository":{"id":367005905,"uuid":"1278746406","full_name":"avidrucker/us-quest","owner":"avidrucker","description":null,"archived":false,"fork":false,"pushed_at":"2026-06-24T06:14:25.000Z","size":256,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-24T08:13:12.123Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/avidrucker.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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-24T04:16:27.000Z","updated_at":"2026-06-24T06:14:28.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/avidrucker/us-quest","commit_stats":null,"previous_names":["avidrucker/us-quest"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/avidrucker/us-quest","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avidrucker%2Fus-quest","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avidrucker%2Fus-quest/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avidrucker%2Fus-quest/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avidrucker%2Fus-quest/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/avidrucker","download_url":"https://codeload.github.com/avidrucker/us-quest/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avidrucker%2Fus-quest/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35412244,"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-13T02:00:06.543Z","response_time":119,"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":[],"created_at":"2026-07-13T05:32:40.239Z","updated_at":"2026-07-13T05:32:40.749Z","avatar_url":"https://github.com/avidrucker.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Adventures in Us 💛\n\nA tiny, offline-first **branching choose-your-own-adventure** builder and player —\nwrite a little interactive quiz/story, play through its branches one passage at a\ntime, save it locally, and share it as a single tappable link (no server, no\naccount).\n\n**Live demo:** https://avidrucker.github.io/us-quest/\n\n\u003e A ClojureScript learning project exploring re-frame architecture with\n\u003e domain-driven design, BDD scenarios, and red-green TDD.\n\n## What it does\n\n- **Play** — read a passage, pick a choice (A/B/C/D-style), and the next passage\n  appends below with a gentle scroll, until you reach an ending.\n- **Author** — a form-based editor: add passages (text + optional emoji/image),\n  add choices that branch to other passages, set the start, with live validation\n  and an in-place preview.\n- **Save** — your library persists in the browser via `localStorage`.\n- **Share** — encode an entire adventure into a URL; opening the link imports and\n  plays it. No backend involved.\n\n## Architecture\n\nThree clean layers, each independently testable:\n\n| Layer | Namespace(s) | Responsibility |\n|-------|--------------|----------------|\n| Domain (pure) | `adventure.domain` (CLJC) | The adventure data model + pure functions (build, traverse, validate). No re-frame, no DOM. |\n| State | `adventure.events` / `subs` / `db` / `fx` | re-frame app-db, pure event handlers, derived subscriptions, and isolated effects (localStorage, share links). |\n| View | `adventure.views` (Reagent) | Library, player, and editor components, routed by `:route`. |\n\nThe adventure **is data** — a flat map of passages keyed by id — which makes\nauthoring, saving, and sharing all just \"move some immutable data around.\"\nFunction contracts are enforced with [malli](https://github.com/metosin/malli) +\n[guardrails](https://github.com/fulcrologic/guardrails).\n\n## Develop\n\n```bash\nnpm install\nnpm run dev      # shadow-cljs watch → http://localhost:8080/index.html\nnpm test         # compile + run the cljs.test suite (node)\nnpm run e2e      # Playwright browser smoke tests (boots the dev build itself)\nnpm run release  # optimized build into public/js\n```\n\n`npm run e2e` uses the system Chrome (`channel: 'chrome'`); its `webServer`\nconfig starts `npm run dev` automatically, so no separate server is needed.\n\n## Deploy\n\nDeploys are **automatic**: every push to `main` runs\n[`.github/workflows/deploy.yml`](.github/workflows/deploy.yml), which gates on\n`npm test`, builds an optimized release, and publishes it to the `gh-pages`\nbranch (served at the live demo above). No manual build-and-push step. You can\nalso trigger it by hand from the Actions tab (`workflow_dispatch`).\n\n## Tech\n\nClojureScript · [shadow-cljs](https://github.com/thheller/shadow-cljs) ·\n[Reagent](https://reagent-project.github.io/) ·\n[re-frame](https://day8.github.io/re-frame/) · malli · guardrails · cljs.test\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favidrucker%2Fus-quest","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Favidrucker%2Fus-quest","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favidrucker%2Fus-quest/lists"}