{"id":26382737,"url":"https://github.com/flngsquirrl/spractice","last_synced_at":"2026-05-18T11:05:30.820Z","repository":{"id":59954570,"uuid":"524704166","full_name":"flngsquirrl/SPractice","owner":"flngsquirrl","description":"Personal practice app | iOS","archived":false,"fork":false,"pushed_at":"2025-03-06T09:29:58.000Z","size":2101,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-07-12T03:51:39.011Z","etag":null,"topics":["ios16","swift5-7","swiftui"],"latest_commit_sha":null,"homepage":"","language":"Swift","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/flngsquirrl.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}},"created_at":"2022-08-14T15:08:38.000Z","updated_at":"2025-03-06T09:30:02.000Z","dependencies_parsed_at":"2025-07-12T03:42:59.277Z","dependency_job_id":"455b9a20-f7d1-46a8-8b3d-10c85e28d38a","html_url":"https://github.com/flngsquirrl/SPractice","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/flngsquirrl/SPractice","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flngsquirrl%2FSPractice","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flngsquirrl%2FSPractice/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flngsquirrl%2FSPractice/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flngsquirrl%2FSPractice/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flngsquirrl","download_url":"https://codeload.github.com/flngsquirrl/SPractice/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flngsquirrl%2FSPractice/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33175859,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-18T09:27:30.708Z","status":"ssl_error","status_checked_at":"2026-05-18T09:27:28.300Z","response_time":71,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":["ios16","swift5-7","swiftui"],"created_at":"2025-03-17T06:18:38.821Z","updated_at":"2026-05-18T11:05:30.777Z","avatar_url":"https://github.com/flngsquirrl.png","language":"Swift","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cimg width=\"200\" alt=\"programs_dark\" src=\"https://user-images.githubusercontent.com/95634326/194914734-ae3e3e84-9ff5-4c30-bea2-987974f26860.png\"/\u003e\n\n# SPractice\n\n## Intro\n\nHow do you practice? Do you prefer workout or yoga?  \nWell, good news is you can combine or alternate.  \nAnd use your time wisely.\n\nThis is an application for you personal practice.\n\n\n### Exercises\n\nThere are 3 types of exercises, that define how you practice.\n\n- flow  \nYou decide when you finish and notify the app by pressing a button.  \nGood, when you go at your own pace (Sun Salutations) or count (how about 50 squats, uh?).\n    \n- timer  \nYou set the time and practice with the count down.  \n2 minutes of Cat-Cow or Jump Rope.\n    \n- tabata  \nIt is a famous HIIT technique, repeated intervals of activity and rest.  \nWorks good with all sorts of Planks.\n\n### Programs\n\nPrograms are built out of exercises.\n\nYou probably have a favourite sequence or a few.  \nBut even if you don’t, try different combinations to find something that feels right.\n\n### Examples\n\nSome examples are provided by default.  \nYou can modify or delete them at any time.  \nAnd restore from [Settings](#settings), if you change your mind later.\n\nBut feel free to create your own exercises and programs.\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"programs_dark\" src=\"https://user-images.githubusercontent.com/95634326/190706089-f345b132-5822-4f0b-872f-9c3736d8e413.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercises_dark\" src=\"https://user-images.githubusercontent.com/95634326/190860887-a63d1655-661a-4c7f-bcb4-5f0d7cda2edd.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"300\" alt=\"programs_light\" src=\"https://user-images.githubusercontent.com/95634326/190711976-e55ff19e-f273-44ed-bcf4-ff7eb94726ec.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercises_light\" src=\"https://user-images.githubusercontent.com/95634326/190860878-f057e140-45f1-449b-858e-966e3932b4dd.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Create an exercise\n\nGive the exercise a name and, optionally, a description.  \nYou can stop here, if this is what you want to use as a template.  \nOr continue by settings its type, duration and intensity.\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"exercise_flow_dark\" src=\"https://user-images.githubusercontent.com/95634326/190710950-e5a4fd23-a98e-46e9-ac37-0bcc062ab1a0.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercise_timer_dark\" src=\"https://user-images.githubusercontent.com/95634326/190707345-0f8b1ac8-851f-4347-908c-f76245b1a564.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercise_tabata_dark\" src=\"https://user-images.githubusercontent.com/95634326/190707358-3f8dd431-8900-4953-901a-0fddf52ab055.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"300\" alt=\"exercise_flow_light\" src=\"https://user-images.githubusercontent.com/95634326/190710816-b3bd25ea-9242-4a91-905a-627880ae86c6.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercise_timer_light\" src=\"https://user-images.githubusercontent.com/95634326/190710838-6f64a6ad-9eee-4bfd-836e-3a58548535b8.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"exercise_tabata_light\" src=\"https://user-images.githubusercontent.com/95634326/190710843-8638dce4-5827-4eb2-9409-c0fd3c9db961.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Create a program\n\nStart by giving the program a name and, if needed, a description.  \nThen build a sequence selecting exercises from templates or creating new.  \n\nTake a look at the program's duration.  \nThis is how long the practice will last.\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"program_create_dark\" src=\"https://user-images.githubusercontent.com/95634326/190708503-b63fa80a-37ed-4bf6-a9c9-96bd3717d468.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_select_dark\" src=\"https://user-images.githubusercontent.com/95634326/190860914-a4e2f3ef-9875-43cc-afcc-fa1444994bf2.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_select_2_dark\" src=\"https://user-images.githubusercontent.com/95634326/190708566-6154b9b8-0207-4fd1-b721-14e00d68f21a.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_personal_dark\" src=\"https://user-images.githubusercontent.com/95634326/190708836-e52313a6-5ec5-4dd1-bcd2-13b245eb39cd.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"300\" alt=\"program_create_light\" src=\"https://user-images.githubusercontent.com/95634326/190712267-b161ddf3-4898-47fa-be13-7a093f6636aa.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_select_light\" src=\"https://user-images.githubusercontent.com/95634326/190860925-45d020fd-69fa-44fc-a71b-59571b18cb4e.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_select_2_light\" src=\"https://user-images.githubusercontent.com/95634326/190710213-4a0b1c2b-31ee-4fa7-8211-17f0817cc6ad.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"program_personal_light\" src=\"https://user-images.githubusercontent.com/95634326/190710217-45443b36-b2fa-4802-961b-259a9d4ed9cd.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Configure a practice\n\nThere are some helpful configs to improve your practice.  \n\nFirst, you can **add rest intervals** between the exercises.  \nUse them to prepare for the next exercise or take a sip of water.  \n\nSecond, you can **pause after every exercise**.  \nIt means, when an exercise is over, you should press \"Run\" to start the next.  \nThis gives you more control, but requires more interaction.  \n\nThird, you can **turn the sound notifications on and off**.  \nWhen on, the sound signal will let you know when the exercise or its task is about to finish.  \n\nReady? Then lets practice!\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"program_details_dark\" src=\"https://user-images.githubusercontent.com/95634326/190728011-54c480b9-26d5-4bfb-9a0c-723fcb16c495.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_settings_dark\" src=\"https://user-images.githubusercontent.com/95634326/190728069-b8f4463b-1c1e-4bd9-86d4-1a3f66648997.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"300\" alt=\"program_details_light\" src=\"https://user-images.githubusercontent.com/95634326/190727544-9929de3a-a229-4c3c-9172-4394fc027c6d.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_settings_light\" src=\"https://user-images.githubusercontent.com/95634326/190727583-8b0f4feb-d02e-445b-8428-54197b92e9bd.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Practice\n\nYou can pause, restart an exercise or the whole practice at any moment.  \nYou can also turn the sound on and off, view exercise details or practice summary.  \n\nPress \"Run\" and start practicing)\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"practice_dark\" src=\"https://user-images.githubusercontent.com/95634326/190728856-cc6d00eb-8143-4b85-bfe3-518d2d91d249.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_2_dark\" src=\"https://user-images.githubusercontent.com/95634326/190747703-e4d6f9d8-a0cd-46f1-9673-4f0afb834d45.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_3_dark\" src=\"https://user-images.githubusercontent.com/95634326/190747736-29c74498-77e0-479d-9d59-0eeef80d54f0.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"ex_info_dark\" src=\"https://user-images.githubusercontent.com/95634326/190747896-4f472787-ff17-4885-8f7c-5fb9b26e6094.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_summary_dark\" src=\"https://user-images.githubusercontent.com/95634326/190729704-1013a984-2a90-4423-a317-419c6621cae8.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"300\" alt=\"practice_light\" src=\"https://user-images.githubusercontent.com/95634326/190728796-3a5dab6d-fcfe-4cca-b061-126c09733d8e.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_2_light\" src=\"https://user-images.githubusercontent.com/95634326/190748187-b8971b92-bdc7-45f2-8192-261457865594.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_3_light\" src=\"https://user-images.githubusercontent.com/95634326/190748222-24badefc-d059-49ae-981e-d42b9798763f.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"ex_info_light\" src=\"https://user-images.githubusercontent.com/95634326/190748253-8e471337-7df8-44ef-b29b-a5cef440a9e3.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"practice_summary_light\" src=\"https://user-images.githubusercontent.com/95634326/190729658-4f5e32e7-e517-42b0-836e-2a055ec45294.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n### Settings\n\nIn Settings you can:\n- set intervals for tabata exercises;\n- set name and duration for rest intervals;\n- configure auto-finish for flow exercises;\n- manage modified examples.\n\n\u003cdetails\u003e\n\u003csummary\u003eSee screenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"settings_dark\" src=\"https://user-images.githubusercontent.com/95634326/190730731-7a7effa7-47e3-47c9-89fe-0b97e9de0e0a.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"about_dark\" src=\"https://user-images.githubusercontent.com/95634326/190735067-6a883323-13a0-48df-9e8f-00940c55d720.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"tabata_dark\" src=\"https://user-images.githubusercontent.com/95634326/190735289-c0a4a7ca-ebfa-47ff-ae13-8e97739c5a0f.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"rest_dark\" src=\"https://user-images.githubusercontent.com/95634326/190735652-29be3938-7741-4a44-b859-12f16c2e4542.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"flow_dark\" src=\"https://user-images.githubusercontent.com/95634326/190735882-de11add3-ba3c-449c-a8e1-6e10ddac478b.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"examples_dark\" src=\"https://user-images.githubusercontent.com/95634326/190736106-cf0af1b8-c66e-416c-8c17-c1b8a566e342.png#gh-dark-mode-only\"\u003e\n      \n\u003cimg width=\"300\" alt=\"settings_light\" src=\"https://user-images.githubusercontent.com/95634326/190730885-a2d76496-40ec-48ff-9165-e9b92067e9d4.png#gh-light-mode-only\"\u003e\n \u003cimg width=\"300\" alt=\"about_light\" src=\"https://user-images.githubusercontent.com/95634326/190737453-bddefc23-7a1e-481d-a096-9ef7d8e9357b.png#gh-light-mode-only\"\u003e\n \u003cimg width=\"300\" alt=\"tabata_light\" src=\"https://user-images.githubusercontent.com/95634326/190737936-58b9b9dc-1650-4569-ac36-a9e22c463d72.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"rest_light\" src=\"https://user-images.githubusercontent.com/95634326/190738074-e9748dea-ed6f-43d5-88bd-3c1427114c5d.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"flow_light\" src=\"https://user-images.githubusercontent.com/95634326/190738434-8ec7e557-bd0e-409b-9eaf-8710d958ec26.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"300\" alt=\"examples_light\" src=\"https://user-images.githubusercontent.com/95634326/190738563-d20c5e4e-bd0d-4af0-9136-a171ea5c1e6e.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n## Demos\n\n### Onboarding\n\nhttps://user-images.githubusercontent.com/95634326/190871112-ebf494da-b7f5-4de4-8bb4-0772a64deffe.mp4\n\n### Launch\n\nhttps://user-images.githubusercontent.com/95634326/190870383-7f771f50-3ff1-4e14-8543-6db7ed6cc08c.mp4\n\n### Run practice\n\nhttps://user-images.githubusercontent.com/95634326/190870208-7bdeae32-3d40-49fe-8295-bcb6129d6bbb.mp4\n\n### Add rest intervals\n\nhttps://user-images.githubusercontent.com/95634326/190870575-1c660d23-0ced-4206-aa05-73b0781009de.mp4\n\n### Edit program\n\nhttps://user-images.githubusercontent.com/95634326/190869809-976a9964-615e-4cef-9192-96a6d0edf61b.mp4\n\n### View info\n\nhttps://user-images.githubusercontent.com/95634326/190869964-9fc43b22-51d1-4572-842f-fef08e7969b1.mp4\n\n### Reset modified example\n\nhttps://user-images.githubusercontent.com/95634326/190869969-7f9777dd-b92e-4690-892c-449bb133542f.mp4\n\n## Additional screenshots\n\n### iPad layout\n\n\u003cdetails open\u003e\n\u003csummary\u003eScreenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_programs_dark\" src=\"https://user-images.githubusercontent.com/95634326/191806084-af91ab10-2aa8-4205-b671-5b4ff42aed6e.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_exercises_dark\" src=\"https://user-images.githubusercontent.com/95634326/191806090-bc7348d7-289f-46ce-887f-81a80a17390f.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_settings_dark\" src=\"https://user-images.githubusercontent.com/95634326/191806097-75ad8748-7b29-4193-ac4a-541408c85294.png#gh-dark-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_practice_dark\" src=\"https://user-images.githubusercontent.com/95634326/191806105-69636de7-4d57-4d58-a073-0238a7a474c3.png#gh-dark-mode-only\"\u003e\n\n\u003cimg width=\"400\" alt=\"ipad_programs_light\" src=\"https://user-images.githubusercontent.com/95634326/191806181-246ca083-1852-4a51-b7b0-9cc86bcf809f.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_exercises_light\" src=\"https://user-images.githubusercontent.com/95634326/191806185-627d87ee-25ad-44fb-922e-f8623bc3c51a.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_settings_light\" src=\"https://user-images.githubusercontent.com/95634326/191806189-391df87b-5005-491f-8264-f048fbca505a.png#gh-light-mode-only\"\u003e\n\u003cimg width=\"400\" alt=\"ipad_practice_light\" src=\"https://user-images.githubusercontent.com/95634326/191806197-7425240c-d3b3-4457-95b6-244466ed4fd0.png#gh-light-mode-only\"\u003e\n\u003c/p\u003e \n\u003c/details\u003e\n\n### Light vs Dark\n\n\u003cdetails open\u003e\n\u003csummary\u003eScreenshots\u003c/summary\u003e\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"programs_light\" src=\"https://user-images.githubusercontent.com/95634326/190711976-e55ff19e-f273-44ed-bcf4-ff7eb94726ec.png\"\u003e\n\u003cimg width=\"300\" alt=\"programs_dark\" src=\"https://user-images.githubusercontent.com/95634326/190706089-f345b132-5822-4f0b-872f-9c3736d8e413.png\"\u003e\n\u003c/p\u003e\n\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"program_details_light\" src=\"https://user-images.githubusercontent.com/95634326/190727544-9929de3a-a229-4c3c-9172-4394fc027c6d.png\"\u003e\n\u003cimg width=\"300\" alt=\"program_details_dark\" src=\"https://user-images.githubusercontent.com/95634326/190728011-54c480b9-26d5-4bfb-9a0c-723fcb16c495.png\"\u003e\n\u003c/p\u003e\n\n\u003cp float=\"left\"\u003e\n\u003cimg width=\"300\" alt=\"practice_light\" src=\"https://user-images.githubusercontent.com/95634326/190728796-3a5dab6d-fcfe-4cca-b061-126c09733d8e.png\"\u003e\n\u003cimg width=\"300\" alt=\"practice_dark\" src=\"https://user-images.githubusercontent.com/95634326/190728856-cc6d00eb-8143-4b85-bfe3-518d2d91d249.png\"\u003e\n\u003c/p\u003e\n\u003c/details\u003e\n\n## Targets\n\niOS 16\niPhone, iPad\n\n## Implementation details\n\nImplemented with Swift and SwiftUI.  \nExercise and program templates are stored as JSON files in the app directory on the device.  \nThe application doesn't need access to any of the user's private information.\n\n## Build instructions\n\n- clone the repo\n```\ngit clone https://github.com/flngsquirrl/SPractice.git\n```\n- download Carthage dependencies\n```\ncarthage bootstrap --use-xcframeworks --platform iOS\n```\n- build the project in Xcode\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflngsquirrl%2Fspractice","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflngsquirrl%2Fspractice","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflngsquirrl%2Fspractice/lists"}