{"id":35419878,"url":"https://github.com/jofoerster/habitsync","last_synced_at":"2026-02-15T10:22:53.400Z","repository":{"id":309719576,"uuid":"1037295796","full_name":"jofoerster/habitsync","owner":"jofoerster","description":"Self hosted Habit Tracker featuring goals and challenges with friends","archived":false,"fork":false,"pushed_at":"2026-01-11T12:12:56.000Z","size":39251,"stargazers_count":212,"open_issues_count":11,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-11T14:53:51.976Z","etag":null,"topics":["goal-tracking","habit-tracking","oidc","pwa","self-hosted","sso"],"latest_commit_sha":null,"homepage":"https://demo.habitsync.de","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jofoerster.png","metadata":{"files":{"readme":"README-Home-Assistant.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":"2025-08-13T11:05:43.000Z","updated_at":"2026-01-11T14:18:09.000Z","dependencies_parsed_at":null,"dependency_job_id":"3334b216-f18f-4ff7-b608-0daf334553cc","html_url":"https://github.com/jofoerster/habitsync","commit_stats":null,"previous_names":["jofoerster/habitsync"],"tags_count":85,"template":false,"template_full_name":null,"purl":"pkg:github/jofoerster/habitsync","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jofoerster%2Fhabitsync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jofoerster%2Fhabitsync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jofoerster%2Fhabitsync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jofoerster%2Fhabitsync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jofoerster","download_url":"https://codeload.github.com/jofoerster/habitsync/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jofoerster%2Fhabitsync/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28478398,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-16T11:59:17.896Z","status":"ssl_error","status_checked_at":"2026-01-16T11:55:55.838Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["goal-tracking","habit-tracking","oidc","pwa","self-hosted","sso"],"created_at":"2026-01-02T16:18:37.901Z","updated_at":"2026-01-16T12:00:44.347Z","avatar_url":"https://github.com/jofoerster.png","language":"TypeScript","funding_links":[],"categories":["pwa"],"sub_categories":[],"readme":"# Integrationg with Home Assistant\n\nUse the following example configurations in your main `configuration.yaml` and restart Home Assistant.\nReplace `\u003cyour-api-host\u003e` and `\u003cyour-habit-uuid\u003e` with your actual API host and habit UUID (copy from the url when in\nhabit details page).\nTo authenticate, you can create an API key on the profile page. Best practice is to save it in `secrets.yaml`.\n\n```yaml\n# configuration.yaml\n\nrest_command:\n  # 1. Create a record with default value 1 for a specific habit.\n  create_habit_record_simple:\n    url: \"http://\u003cyour-api-host\u003e/api/record/\u003cyour-habit-uuid\u003e/simple?value=1.0\"\n    method: \"POST\"\n    headers:\n      X-Api-Key: \"\u003cyour-api-key-or-reference-to-secrets\u003e\"\n\n  # 2. A reusable command that can create a record for any habit\n  #    with a dynamic value, offset, and timezone. The variables (e.g., {{ habit_uuid }})\n  #    must be provided when you call this service.\n  create_habit_record_complex:\n    url: \"http://\u003cyour-api-host\u003e/api/record/{{ habit_uuid }}/simple?value={{ value }}\u0026offset={{ offset }}\u0026timeZone={{ time_zone }}\"\n    method: \"POST\"\n    headers:\n      X-Api-Key: \"\u003cyour-api-key-or-reference-to-secrets\u003e\"\n\ntemplate:\n  - button:\n      # 1. Pressing this in the UI will call the 'create_habit_record_simple' command.\n      - name: \"Log Simple Habit (Default Value)\"\n        unique_id: log_simple_habit_default_value_button\n        press:\n          - service: rest_command.create_habit_record_simple\n\n      # 2. This button calls the complex rest_command with a set of\n      #    pre-defined parameters. These could also be dynamic.\n      - name: \"Log Yesterday's Habit (Complex Example)\"\n        unique_id: log_yesterdays_habit_complex_example_button\n        press:\n          - service: rest_command.create_habit_record_complex\n            data:\n              habit_uuid: \"\u003cyour-habit-uuid\u003e\"\n              value: 5.5\n              offset: -1\n              time_zone: \"Europe/Berlin\"\n\nsensor:\n  - platform: rest\n    # 1. Gets the record for the current day (API defaults offset to 0 and uses server timezone).\n    name: \"Habit Today's Value\"\n    unique_id: habit_today_value_sensor\n    resource: \"http://\u003cyour-api-host\u003e/api/record/\u003cyour-habit-uuid\u003e/simple\"\n    headers:\n      X-Api-Key: \"\u003cyour-api-key-or-reference-to-secrets\u003e\"\n    value_template: \"{{ value_json.recordValue }}\"\n    json_attributes:\n      - \"uuid\"\n      - \"habitUuid\"\n      - \"epochDay\"\n      - \"completion\"\n    scan_interval: 60 # Poll every 1 minute\n\n  - platform: rest\n    # 2. Gets the record for yesterday using a specific timezone.\n    name: \"Habit Yesterday's Value\"\n    unique_id: habit_yesterday_value_sensor_complex\n    resource: \"http://\u003cyour-api-host\u003e/api/record/\u003cyour-habit-uuid\u003e/simple?offset=-1\u0026timeZone=Europe/Berlin\"\n    headers:\n      X-Api-Key: \"\u003cyour-api-key-or-reference-to-secrets\u003e\"\n    value_template: \"{{ value_json.recordValue }}\"\n    json_attributes:\n      - \"uuid\"\n      - \"habitUuid\"\n      - \"epochDay\"\n      - \"completion\"\n    scan_interval: 60\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjofoerster%2Fhabitsync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjofoerster%2Fhabitsync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjofoerster%2Fhabitsync/lists"}