{"id":49070208,"url":"https://github.com/danielabar/my-yoga","last_synced_at":"2026-04-20T07:04:53.065Z","repository":{"id":350869662,"uuid":"1208177261","full_name":"danielabar/my-yoga","owner":"danielabar","description":"A guided evening yoga practice","archived":false,"fork":false,"pushed_at":"2026-04-12T14:20:02.000Z","size":1049,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-12T15:28:00.644Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://danielabar.github.io/my-yoga/","language":"JavaScript","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/danielabar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","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-04-11T23:28:17.000Z","updated_at":"2026-04-12T14:20:08.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/danielabar/my-yoga","commit_stats":null,"previous_names":["danielabar/my-yoga"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/danielabar/my-yoga","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielabar%2Fmy-yoga","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielabar%2Fmy-yoga/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielabar%2Fmy-yoga/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielabar%2Fmy-yoga/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/danielabar","download_url":"https://codeload.github.com/danielabar/my-yoga/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/danielabar%2Fmy-yoga/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32036803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-20T00:18:06.643Z","status":"online","status_checked_at":"2026-04-20T02:00:06.527Z","response_time":94,"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-04-20T07:04:52.315Z","updated_at":"2026-04-20T07:04:53.039Z","avatar_url":"https://github.com/danielabar.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# My Yoga\n\nA quiet, guided evening yoga practice — vanilla HTML, CSS, and JavaScript. No framework, no bundler, no build step.\n\nLive at **https://danielabar.github.io/my-yoga/**\n\n## What it is\n\nA single guided sequence of gentle stretches and mindful breathing designed to close your day. The app speaks each pose aloud using the browser's speech synthesis, shows a breath-circle animation, and keeps the screen awake so you can set your phone down and follow along.\n\n**Evening unwinding only.** Forward folds, supine twists, hip openers, bound angle, neck rolls, Cat-Cow, Child's Pose, body scan. No standing poses, no Warriors, no core work, no Sun Salutations — anything that elevates heart rate is out of scope by design. There are a thousand apps for that; this one is for people who already train and want yoga purely for stretching, mindfulness, and relaxation.\n\n## Running locally\n\n```bash\nnpm install\nnpm run dev\n```\n\nOpens a local server at `http://localhost:3000`.\n\nThe screen-wake feature requires a **secure context** (HTTPS or `localhost`). It won't work over `file://` or plain HTTP.\n\n## Testing\n\n[Playwright](https://playwright.dev/) is the single test runner for both unit and e2e tests.\n\n```bash\nnpm test              # unit + e2e (the CI command)\nnpm run test:unit     # unit tests only\nnpm run test:e2e      # e2e tests only (Gherkin/BDD via playwright-bdd)\n```\n\nUnit tests (`tests/unit/`) run in Node — pure function imports, no browser. E2E tests (`tests/e2e/`) use playwright-bdd with Gherkin features against `http://localhost:3000` (Playwright's `webServer` config starts the server automatically).\n\n## Deploying\n\nDeployment is automated via GitHub Actions:\n\n- **CI** (`.github/workflows/ci.yml`) — runs all tests on pull requests to `main`.\n- **CD** (`.github/workflows/cd.yml`) — runs all tests, then deploys to GitHub Pages on push to `main`.\n\nThe deploy uses `actions/deploy-pages` (not a `gh-pages` branch). GitHub Pages must be configured with **Source: GitHub Actions** in the repo settings.\n\nNo build step — the repo root is deployed as-is.\n\n## Project structure\n\n```\nindex.html                        app shell (\u003cheader\u003e, \u003cnav\u003e, \u003cmain\u003e)\njs/\n  app.js                          entry point (boots wake-lock + router)\n  router.js                       pushState SPA router (/ → practice, /about → about)\n  session.js                      session orchestrator (wake-lock, voice, UI)\n  wake-lock.js                    screen wake lock manager\n  voice.js                        speechSynthesis wrapper\n  settings.js                     persisted user settings (voice, rate, pitch)\n  format-time.js                  M:SS time formatter\n  sequence-loader.js              fetch + validate sequence JSON\n  base-path.js                    auto-detect GitHub Pages subpath\n  ui/\n    template-loader.js            fetch + cache view templates\n    breath-circle.js              breath animation driver\n    pose-card.js                  current-pose card renderer\n    progress.js                   progress bar + time display\nviews/\n  practice/                       main yoga session screen\n    template.html\n    script.js\n  about/                          about page\n    template.html\n    script.js\ncss/\n  index.css                       import manifest (load order)\n  global.css                      layer declaration + design tokens\n  colors.css                      OKLCH color primitives + semantic tokens\n  reset.css, base.css             browser reset + base element styles\n  layout.css, nav.css             page layout + navigation\n  buttons.css, breath-circle.css  component styles\n  pose-card.css, progress.css\n  practice.css, about.css\n  settings.css, utilities.css\nconfig/\n  sequences/evening.json          the 27-pose evening sequence\nfonts/                            self-hosted Cormorant Garamond + Nunito\ntests/\n  unit/                           pure-function unit tests\n  e2e/                            Gherkin features + step definitions\ndocs/                             architecture, CSS, sequence format\n```\n\n## Documentation\n\n- [Architecture](docs/architecture.md) — views, session lifecycle, modules, wake-lock design\n- [CSS architecture](docs/css-architecture.md) — layers, color system, design tokens\n- [Sequence format](docs/sequence-format.md) — JSON schema for pose sequences\n\n## License\n\nMIT — see [`LICENSE.txt`](./LICENSE.txt).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielabar%2Fmy-yoga","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdanielabar%2Fmy-yoga","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdanielabar%2Fmy-yoga/lists"}