Inspiration
I own 4 guitars and I'm constantly swapping string sets and tunings. Every time I picked one up, I had the same questions: When did I last restring this? What's on it right now? Did I actually like any set in the past? My "system" was a camera roll full of photos of string packs, Evernote notes, and empty string boxes shoved into guitar cases. At some point I decided to build a single place to collect all this information in a form of iOS app -- this is how Restrings was born.
When I talked to other players, everyone had some version of the same mess. Restrings is the app I wanted: a logbook for the life of your strings.
What it does
Restrings keeps a restringing history for every instrument you own. You log the string set, the tuning and setup, and how it felt. Restrings then shows you at a glance how long each guitar has been on its current strings and which set to put on next.
It's built for players who play a lot, own several guitars, and like to experiment with strings and tunings.
Your data syncs across your devices through your own iCloud. There's no account and no sign-up, and I can't see your data because I don't run a server.
Restrings is free to download with a freemium monetization: as a free user you can add unlimited guitars, and you can add infinite number of restrings to the first instrument you added. Restrings Pro subscription unlocks unlimited restrings to all your instruments.
How I built it
- 100% native SwiftUI. I wanted it to feel like it belongs on iOS.
- Core Data +
NSPersistentCloudKitContaineron the CloudKit private database. There's no backend to run, users own their data, and the privacy story stays simple. - RevenueCat handles purchases, entitlements, and Offerings. I built the paywall by hand in SwiftUI instead of using a remote paywall tool, so it matches the rest of the app. RevenueCat Offerings and Experiments will let me A/B test price points without shipping a new build.
- Accounts without accounts. I derive an anonymous ID from the user's CloudKit record and pass it to RevenueCat's
logIn()and PostHog'sdistinct_id. That gives a stable identity across devices with no login screen and nothing tied to a real person. - PostHog is connected to RevenueCat's native integration. The whole funnel lives in one place: install → onboarding → paywall view → trial start → purchase. There's no IDFA, no ad SDKs, and no ATT prompt.
- Launch pipeline: TestFlight external groups for beta testers and contractors, freelance designers for the App Store screenshots, and my own DSLR photos of string packs for the hero image. Then waitlist fueled with Meta ads, warmed up IG account with 1K followers, then App Store release and marketing to all channels available to me with the budget I have.
Challenges I ran into
- CoreData + CloudKit is hard. I was learning a lot on how to implement CloudKit sync and I am glad I finally nailed it.
- CloudKit schemas are forever. Once a schema is promoted to Production, you can only add to it. I made sure the schema is extendable for the feature set I have in mind. ** Deciding how tunings relate to restrings (one per restring, or shared across many) became an important decision in the project.
- Shipping solo, on nights and weekends. Half of shipping wasn't code: forming an LLC, getting a D-U-N-S number, moving to an Organization developer account, and writing the privacy policy, privacy manifests, and nutrition labels. What I miss sometimes is a fellow teammate who can give me a second opinion on my decisions.
Accomplishments that we're proud of
- I shipped a native subscription app solo inside the Shipaton window.
- It has a genuinely privacy-first design: no account, no tracking, and your logs live only in your own iCloud.
- Monetization was instrumented from day one. Every step from install to purchase is measured, and price experiments are ready to run.
- Outside testers caught a first-run bug before launch, which convinced me to put the app in front of other people much earlier.
- Hired designers to help me with icon (which I think looks really cool), and App Store sshots, which I plan to test very soon.
What I learned
- With CloudKit, make your data-model decisions before Production, not after.
- A native paywall plus RevenueCat Offerings was all I needed. Remote paywall editing solves a problem I didn't have, but trying it is 100% in my list
- Getting the non-code work done (legal setup, privacy compliance, store assets) early is what actually made the deadline.
What's next for Restrings
- Restring reminders based on your own history, not a generic "every 3 months."
- Scan a string pack. Point the camera at the pack and have on-device Apple Intelligence (Foundation Models) fill in brand and gauge. It stays private, with no server involved.
- Recommendations for which set to try next, based on your own notes and ratings.
- "Buy again" button for every string set.
- Price iteration based on what the Experiments show.
Log in or sign up for Devpost to join the conversation.