Grindstep is published by an independent iOS developer (Apple Developer Team ID ZM8LF8494F). Questions: captainlongevity@gmail.com.
Everything you create in Grindstep — grinders, machines, bean bags, shots, recipes, taste tags, prices, and any bag cover photos you add — is stored locally on your device using Apple's on-device database. It stays on your iPhone. The learned recommendation engine, the control-chart math, the drift model, and the cost math all run on your device, on data you entered. Record processing and recommendations run locally. Apple StoreKit separately communicates with Apple for product information, purchases and purchase restoration; opening legal pages or sharing files also follows the destinations you choose.
Nothing. Grindstep has no user accounts, no sign-in, no server, no cloud sync, no analytics or crash-reporting SDK, and no advertising SDK. Its recommendations are computed on your device by ordinary arithmetic over your own shots. Because the App does not send data anywhere, no personal information is collected, shared, sold, or disclosed to us or to any third party.
The App does not use the camera, location, contacts, microphone, Bluetooth, or any tracking or advertising identifier. It requests no permission until the corresponding optional feature is used, and you can decline or revoke any permission in iOS Settings.
Because Grindstep does not sync to a cloud, it gives you full control of portability instead. Free JSON export includes supported grinder, machine, bean-bag and shot records, the house recipe, and embedded bag-cover image data. CSV exports a shot table rather than the whole archive, photos or every preference. Both formats are readable and not password-encrypted by the App. You can import compatible selected files and transfer a supported JSON archive to another device; it is not a copy of every device setting or temporary session state. These transfers happen through the iOS share sheet and the Files app under your direction; the App itself sends nothing to us or to any server. Where an exported file goes next is entirely your choice.
Your Grindstep data may be included in an iOS Backup (iCloud Backup or a Finder backup) when you have those enabled — this is Apple's standard device backup, managed by you in iOS, and is separate from the App. If you delete the App and have no iOS Backup and no export, your data is permanently lost, since we hold no copy.
Device-backup contents and recovery depend on your system settings, a successfully completed usable backup and Apple’s restoration process; enabling backup alone does not guarantee recovery of every record or original file. We cannot retrieve or restore your device backups.
Grindstep is a general-audience utility for home coffee preparation and is not directed to children. It collects no personal information from anyone.
The App accesses a small number of Apple APIs that require a declared reason (for example, reading the timestamp of files it wrote, and reading UserDefaults it owns). These are used solely for the App's own on-device functionality and never for tracking. The declared reasons are listed in the App's privacy manifest.
If this policy changes, the updated version will be posted here with a new "last updated" date. Because the App collects nothing, changes will generally be clarifications. If a future release ever introduced any data collection or transmission, it would be strictly opt-in with a clear in-app notice before anything left your device.
Grindstep's widget displays locally prepared summaries of app records. The app and its widget exchange the relevant summary and preferences through an on-device shared container; this is not a developer-operated record upload. Information displayed by a widget can be visible to people able to view the Home Screen or Lock Screen where it is placed. Use the widget and device display settings to control that visibility. Screenshots and independent copies remain separate from the records you later edit or delete.
Deleting a bean bag, grinder or machine removes that selected record after a successful save, rather than cascade-deleting shot history. Shots use separate identifiers and can remain with missing equipment or bag references. JSON import checks each equipment, bag and shot identifier separately: an existing parent does not cause every new incoming shot to be skipped. A supplied house recipe, engine settings and supported preferences can update current values. CSV imports create new supported shot records and may duplicate repeated imports; CSV is not a complete archive backup. Removing the App normally removes its local container, not independently kept original media, exported files, recipient copies or older backups. Manage those copies separately. Device-backup recovery requires a usable completed backup; the developer has no record archive to retrieve.
These legal pages are hosted on Vercel. Opening a page sends ordinary request information, such as the IP address, browser information and requested URL, to the host for delivery and security; see Vercel’s Privacy Notice. This website request is separate from App record storage. If you email support, we receive the address and information you choose to send so we can respond. Send only the details needed for that request.
In the updated app, Settings offers Add sample records with a confirmation. Samples are stored locally alongside ordinary records, can appear in supported totals, exports and widgets, and count toward applicable free limits. Adding samples keeps existing records and does not grant paid access. Existing samples from earlier versions remain until removed using the applicable record controls.
The updated App checks saves and deletions before reporting completion. A newly logged shot, its bean-inventory adjustment and applicable lock state save together; a failed attempt keeps the prior stored values and current open form for retry. Bag, grinder and machine deletion leaves separately stored shot history. Defaults retain their existing save-on-exit behavior and offer a checked Save & Back action. If saving defaults fails, proposed values remain temporarily in memory for reopening Settings > Defaults during the same App process; they are not a durable draft and may be lost if the process ends. Failed ordinary form entries similarly remain only while their current editing state exists. Imports check their database changes together. JSON adds missing record identifiers, skips existing matching records and may update the house recipe; repeated identifiers within one archive are rejected without importing that archive. Supported engine settings and preferences apply after successful database persistence as a separate step, so an interruption can leave only that database phase complete. CSV and supported external-format imports may create duplicates when repeated. When existing names are identical, CSV uses the first matching stored record rather than deleting or merging the others. Keep original archives and verify imported records and settings. None of these safeguards guarantees durable storage when a device save fails.