base on Battery charging limiter for macOS. # BatFi
BatFi helps you optimize your macOS battery performance by managing charging levels intelligently, yet giving you full control – charging to 100% only when it's needed.
<a href="https://micropixels.gumroad.com/l/batfi">
<img width="200" alt="buy_on_gumroad" src="https://github-production-user-asset-6210df.s3.amazonaws.com/2467137/269984099-a4628c9d-10a8-4c83-a3cc-dfe04fef71d8.png">
</a>
<p><sub><sup>Requires macOS Ventura or later and Apple Silicon Mac</sup></sub></p>
<br>
## Why?
Maintaining a lithium-ion battery at a high state of charge can significantly reduce its lifespan. Although macOS offers a feature that automatically postpones charging the battery to 100%, it lacks user control. This automated approach relies on machine learning to adapt to user habits, leaving users without the ability to determine when and how long the charging should be delayed. Consequently, this solution may not be effective for users with irregular computer usage patterns or for devices frequently connected to power sources, such as monitors like Apple's Studio Display or Pro Display XDR.
On the other hand, BatFi works differently. The app allows you to set a user-chosen limit for charging the battery and maintain it indefinitely. With BatFi, you have the flexibility to decide when to charge the battery to 100% based on your usage needs.
<p float="left">
<img src="https://github.com/rurza/BatFi/assets/2467137/db8870bb-0a61-4088-a361-b44d0db2cff7" width=300>
<img src="https://github.com/rurza/BatFi/assets/2467137/8cf4f6e3-fbe9-48ee-b034-b6fa8f0dc50c" width=300>
<img src="https://github.com/rurza/BatFi/assets/2467137/ad75de07-157b-48ba-8584-27ce930d078e" width=300>
</p>
## Localization
The app uses [String Catalog](https://developer.apple.com/documentation/xcode/localizing-and-varying-text-with-a-string-catalog) which makes localization super straightforward.
<details>
<summary>If you know how to use Git</summary>
1) Install Xcode 15 ([Mac App Store](https://apps.apple.com/us/app/xcode/id497799835?mt=12))
2) Fork this repo, the develop branch
3) There are two `.xcstrings` files. One related to the app's UI and second one for the App Intents (used for Siri Shortcuts):
- App UI `./BatFiKit/Sources/L10n/Localizable.xcstrings`
- App Intents `./App/Localizable.xcstrings`
4) Open and edit them with Xcode 15. I highly recommend to use Apple conventions for basic commands, like "Quit" etc. You can find all of them on [Apple Localization Terms Glossary](https://applelocalization.com/macos)
5) Commit changes and make pull request
</details>
<details>
<summary>If you have no idea what Git is</summary>
1) Install Xcode 15 ([Mac App Store](https://apps.apple.com/us/app/xcode/id497799835?mt=12))
2) Download [App UI Localizable.xcstrings](https://github.com/rurza/BatFi/blob/develop/BatFiKit/Sources/L10n/Localizable.xcstrings) using the "Download raw file" button in the top right corner
3) Download [App Intents Localizable.xcstrings](https://github.com/rurza/BatFi/blob/develop/App/Localizable.xcstrings) using the "Download raw file" button in the top right corner
4) Open and edit downloaded file. It'll open in Xcode. I highly recommend to use Apple conventions for basic commands, like "Quit" etc. You can find all of them on [Apple Localization Terms Glossary](https://applelocalization.com/macos)
5) Send it to me:
[email protected]
</details>
", Assign "at most 3 tags" to the expected json: {"id":"11138","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"