{"id":40394845,"url":"https://github.com/peterklingelhofer/exhale","last_synced_at":"2026-01-20T13:03:28.365Z","repository":{"id":115165392,"uuid":"606934173","full_name":"peterklingelhofer/exhale","owner":"peterklingelhofer","description":"A customizable visual prompt tool in the form of a screen overlay to facilitate breathwork practice","archived":false,"fork":false,"pushed_at":"2026-01-10T23:45:45.000Z","size":5922,"stargazers_count":31,"open_issues_count":4,"forks_count":6,"subscribers_count":2,"default_branch":"main","last_synced_at":"2026-01-11T06:32:32.547Z","etag":null,"topics":["breath","breathe","breathing","breathwork","electron","exercise","mac","mindfulness","osx","practice","python","swift","typescript","windows"],"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/peterklingelhofer.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":null,"patreon":null,"open_collective":null,"ko_fi":null,"tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"lfx_crowdfunding":null,"polar":null,"buy_me_a_coffee":null,"custom":["https://www.paypal.com/paypalme/peterklingelhofer"]}},"created_at":"2023-02-27T00:37:26.000Z","updated_at":"2026-01-10T23:30:21.000Z","dependencies_parsed_at":null,"dependency_job_id":"ad7361d0-0ae0-4948-b284-f45191194408","html_url":"https://github.com/peterklingelhofer/exhale","commit_stats":null,"previous_names":[],"tags_count":63,"template":false,"template_full_name":null,"purl":"pkg:github/peterklingelhofer/exhale","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterklingelhofer%2Fexhale","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterklingelhofer%2Fexhale/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterklingelhofer%2Fexhale/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterklingelhofer%2Fexhale/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peterklingelhofer","download_url":"https://codeload.github.com/peterklingelhofer/exhale/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peterklingelhofer%2Fexhale/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28603408,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-20T12:01:53.233Z","status":"ssl_error","status_checked_at":"2026-01-20T12:01:46.545Z","response_time":117,"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":["breath","breathe","breathing","breathwork","electron","exercise","mac","mindfulness","osx","practice","python","swift","typescript","windows"],"created_at":"2026-01-20T13:03:28.293Z","updated_at":"2026-01-20T13:03:28.360Z","avatar_url":"https://github.com/peterklingelhofer.png","language":"Swift","funding_links":["https://www.paypal.com/paypalme/peterklingelhofer"],"categories":[],"sub_categories":[],"readme":"# exhale\n\n## Introduction\n\nResearch indicates we blink less and breathe more shallowly when we are looking at screens. This minimal app is an internal tool I created for myself that I released for the public in case others find it useful, and is intended as a friendly indicator and reminder to continue to take full and deep breaths. As looking at screens for long periods of time is typically less than ideal, this tool is intended as a means to potentially ameliorate those negative impacts.\n\nEach of these implementations allows users to set an inhale, inhale hold, exhale, and exhale hold duration, in seconds, to fit their needs. For beginners who might be curious what a good starting value might be for these, I recommend keeping it simple, using `4` for the in duration and `4` for the out duration. Eventually you can work your way up to `6` and `8`, and set the out duration to be twice that of the in duration to facilitate activation of the parasympathetic nervous system. Some users might like to start out with box breathing, which is inhale `4`, inhale hold `4`, exhale `4`, exhale hold `4`. Remember, if intense feelings arise while practicing, taking a break is encouraged - it's important to not overdo it.\n\n## Disclaimer\n\nThe information and guidance provided by this breathing app are intended for general informational purposes only and should not be construed as medical advice, diagnosis, or treatment. The creator of this app is not a medical professional, and the app is not a substitute for professional medical advice or consultation with a qualified healthcare provider. Always seek the advice of a physician or other qualified healthcare provider with any questions you may have regarding a medical condition or health objectives. Do not disregard or delay seeking professional medical advice because of the information or suggestions provided by this app. In the event of a medical emergency, call your doctor or dial your local emergency number immediately. Use of this app is at your own risk, and the creator assumes no responsibility for any adverse effects or consequences resulting from its use.\n\n## Download\n\n[\u003cimg src=\"https://user-images.githubusercontent.com/60944077/232312847-df673556-fb5e-49b4-8037-4d38267e6e18.png\"  width=\"157\" height=\"63\"\u003e\u003c/img\u003e](https://apps.apple.com/us/app/exhale-breath/id6447758995?mt=12)\n\nYou can download the build for your respective operating system on the [Releases](https://github.com/peterklingelhofer/exhale/releases) page. Using the latest release is recommended, but if you run into issues you could try a previous release to see if that yields better results. If you do encounter a problem, please [document the issue you encountered](https://github.com/peterklingelhofer/exhale/issues/new).\n\n## Mac App Usage\n\n![circle-swift](https://user-images.githubusercontent.com/60944077/226204981-f390facc-4f6c-4bec-8784-23203aa64efc.gif)\n![rectangle-swift](https://user-images.githubusercontent.com/60944077/226204986-7522cb4d-7df1-4d65-96de-e629197e9854.gif)\n\u003cimg width=\"677\" alt=\"Settings macOS app\" src=\"https://github.com/user-attachments/assets/76920109-a53b-4959-b556-359ddc14ffe3\" /\u003e\n\n\nNote: This is built natively in Swift.\n\nTo launch the app on Catalina or newer for the first time, you may have to right click and select \"Open\" instead of double clicking on it, and you may need to do this twice. That's Apple's take on \"security\" for non-notarized binaries, or if you are not connected to the Internet.\n\nYou can use \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003e,\u003c/kbd\u003e to toggle settings open and closed. The **Tint** feature (or Pause) can be used to tint your screen the color of your selected background color, or make your screen darker than otherwise possible for nighttime work (which can compound with both [Night Shift](https://support.apple.com/en-us/102191) and [f.lux](https://justgetflux.com/).\n\n#### Global Keyboard Shortcuts:\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eA\u003c/kbd\u003e: **Start Animation**\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eS\u003c/kbd\u003e: **Stop Animation**\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eD\u003c/kbd\u003e: **Tint Screen**\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eF\u003c/kbd\u003e: **Reset to Defaults**\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eW\u003c/kbd\u003e or\n\n\u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003e,\u003c/kbd\u003e: **Open/Close Preferences**\n\n\n**Notice:** A high opacity value can obscure the Preferences pane in the current workspace.\nTo change this value back, you can use \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eF\u003c/kbd\u003e to **Reset to Defaults**, or if you'd like to persist your other settings:\n1. Swipe left or right with four fingers on your trackpad to switch to a different workspace, or four finger swipe up and select an alternate workspace at the top.\n2. From the top bar menu, click Preferences to close the Preferences pane in the previous workspace.\n3. Access the top bar menu again, click Preferences to open the Preferences pane in the current workspace, and adjust your Opacity value accordingly.\n4. Switch back to the original workspace.\n\n                                        \n#### Development\n\n```sh\ngit clone https://github.com/peterklingelhofer/exhale.git\ncd exhale\ncd swift\nxed .\n```\n\n## Windows \u0026 Linux App Usage\n\n![exhaleElectron](https://user-images.githubusercontent.com/60944077/224524962-56da25cc-e3d9-4d4b-9171-f185be9d709c.gif)\n![exhaleElectronCircular](https://user-images.githubusercontent.com/60944077/224865780-0e61721e-2345-49aa-830d-0e157b6f4366.gif)\n\u003cimg width=\"912\" alt=\"Screenshot 2024-06-01 at 1 35 36 PM\" src=\"https://github.com/peterklingelhofer/exhale/assets/60944077/b2eb9450-8dcf-4934-b6c9-08328ef6a167\"\u003e\n\nNote: This implementation is built with TypeScript \u0026 Electron. The macOS will build but it is not very performant and is far more CPU-intensive than the native Swift build, and as a result the Swift build is recommended for macOS users.\n\nModify settings by going to **Application** (found in the top right via `\u003e\u003e`) \u003e **Local storage** \u003e **file://**. While the Developer Tools are open, you can resize the window, and opacity values are ignored, so you can position the window and change settings to your liking, and then close the Dev Tools window by clicking the `x` in the top right, or use \u003ckbd\u003eF12\u003c/kbd\u003e or \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eI\u003c/kbd\u003e(Linux/Windows) or \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003eShift\u003c/kbd\u003e + \u003ckbd\u003eI\u003c/kbd\u003e (macOS) to toggle Developer Tools to [access and modify these settings](https://developer.chrome.com/docs/devtools/storage/localstorage/#edit), and \u003ckbd\u003eCtrl\u003c/kbd\u003e + \u003ckbd\u003eR\u003c/kbd\u003e (Linux/Windows) or \u003ckbd\u003eCmd\u003c/kbd\u003e + \u003ckbd\u003eR\u003c/kbd\u003e (macOS) to refresh the app to use your newly selected settings. If no settings appear on the first run of the application, you can manually add them), following the format of the `storedValues` variable in [`/src/renderer.ts`](https://github.com/peterklingelhofer/exhale/blob/main/src/renderer.ts). To add them manually, go to the **Console** and copy paste the following code into the console and press \u003ckbd\u003eEnter\u003c/kbd\u003e or \u003ckbd\u003eReturn\u003c/kbd\u003e to populate your `localStorage` (these are the defaults as of the time of writing):\n\n```ts\nlocalStorage = {\n  colorExhale = \"rgb(0, 0, 255)\",\n  colorInhale = \"rgb(255, 0, 0)\",\n  colorStyle = \"linear\", // can be \"linear\" or \"constant\"\n  shape = \"fullscreen\", // can be \"circle\" or \"rectangle\" or \"fullscreen\"\n  durationInhale = 5,\n  durationPostInhalePause = 0,\n  durationExhale = 10,\n  durationPostExhalePause = 0,\n  opacity = 0.25,\n};\n```\n\nOnce added, you can modify all values from the **Local Storage** pane. Or, if you prefer the terminal, in the **Console** you can write `localStorage.opacity = \"0.15\"` for example.\n\n\u003cimg width=\"371\" alt=\"Screen Shot 2023-03-11 at 2 12 30 PM\" src=\"https://user-images.githubusercontent.com/60944077/224511531-c0d615a1-1859-47b6-a78b-7d38276d80be.png\"\u003e\n\n#### Development\n\n```sh\ngit clone https://github.com/peterklingelhofer/exhale.git\ncd exhale\ncd typescript\npnpm install\npnpm start\n```\n\nTo recompile automatically and use [electron-reload](https://github.com/yan-foto/electron-reload), run in a separate terminal:\n\n```sh\npnpm watch\n```\n\n## Python Script Usage\n\n![exhalePython](https://user-images.githubusercontent.com/60944077/222979803-c88ebc65-b799-4ca7-b265-54beb27fcb00.gif)\n\nNote: This implementation seems to work well on Windows and macOS, but not Linux for some reason.\n\n```sh\ngit clone https://github.com/peterklingelhofer/exhale.git\ncd exhale\ncd python\npython main.py\n```\n\nModify variables at the top of the file for preferred in and out duration, in seconds.\n\nFor the full-screen resizable version, use, `IS_FULL_SCREEN = True` which makes the window entirely resizable by clicking and dragging from the corners.\n\n\n## Perl Script\n\nCompanion repository made in Perl can be found [here](https://github.com/franco3445/Breathing).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterklingelhofer%2Fexhale","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeterklingelhofer%2Fexhale","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeterklingelhofer%2Fexhale/lists"}