Nyvo — Your identity, transformed into living art. Every morning.

Inspiration

We kept noticing something embarrassing: the screen people look at more than any other — the lock screen — is almost always the most generic thing on their phone. A stock gradient. A photo from six months ago. Meanwhile the same person has spent real time curating their Spotify, their Instagram, their whole digital self. The lock screen just... never got that treatment.

We got obsessed with changing that.

The AI image generation piece was obvious once we started thinking about it — but every app we tried had the same problem. You generate some cool portraits, you save your favorites, and then the app disappears into a folder and you never open it again. That felt like a fundamental failure of the format. If the thing you're making is a daily wallpaper, why does it require you to show up daily?

So we asked: what if the app just... did it? What if you went to sleep and woke up to something new, made of you, already on your screen? No tapping required.

That question became Nyvo. An AI portrait studio, a personal styling engine, and a delivery system that runs while you sleep — powered by GPT Image Generation, and built so the best version of the experience requires nothing from you after setup.

What it does

Nyvo generates a premium AI wallpaper from your identity, every day, and applies it to your device automatically.

  • Identity-first generation — Upload selfies once, and Nyvo builds a visual identity memory: your features, your aesthetic direction (Noir, Dreamy, Cyberpunk...), your reference inspirations. Every wallpaper is generated of you, not just "for" you.
  • A daily ritual, hands-free — Every night, a scheduled pipeline renders tomorrow's wallpaper while you sleep. In the morning it's already on your lock screen. On iPhone, a network-free native App Intent hands the day's image to Apple's Set Wallpaper action; on Android, a native module applies it directly.
  • Mood Studio — Tell Nyvo how your day feels — energy, weather, music, work mode — and it tunes the next render's palette and atmosphere accordingly.
  • Direction → Create → Preview → Remix → Apply — A full creative flow: pick a direction, let Nyvo create, preview it on lock-screen and home-screen mockups, remix variations (lighting, color, composition), and apply.
  • Timeline, Collections & Favorites — Every wallpaper is archived date-keyed, so your identity becomes a growing gallery — a visual diary of your year.
  • Premium subscription — Nyvo Premium (monthly/yearly) unlocks unlimited generations, remixes, and full automation, powered end-to-end by RevenueCat.

How we built it

Stack: React Native (Expo SDK 54, RN 0.81, React 19) with Expo Router, Supabase (Postgres, Auth, Edge Functions), Cloudflare R2 for private wallpaper delivery, GPT Image Generation, and RevenueCat for subscriptions across both stores.

The generation pipeline. Every user gets a personal render slot spread across the 1 AM local hour — a 0–59 minute offset assigned via a Postgres function so we don't spike the generation queue at the top of every hour. Timezones are locked server-side once per day with clock-drift validation; all time math runs in UTC in TypeScript. Each image flows straight from OpenAI into a private Cloudflare R2 bucket, gets size + SHA-256 verified before it's marked active, and only then does the client get a short-lived signed URL to fetch it. It's not glamorous engineering but it has to work every night without anyone watching.

The iOS apply problem. Apple doesn't give you a wallpaper API. We knew this going in and figured we'd find a reasonable workaround. We did not find a reasonable workaround — we found a very unreasonable one that actually works. The app prefetches the date-keyed wallpaper into a shared App Group container; silent push, foreground refresh, and background fetch all take a shot at preparing the file; and a network-free Swift App Intent hands today's image — or yesterday's, or a fallback — to Apple's Set Wallpaper Shortcut action, which a personal automation runs at sunrise. A cache-confirmation handshake means we only release the automation trigger once the primary device has confirmed the file is actually there. It took a lot of TestFlight runs before we trusted it.

RevenueCat integration. Premium runs on react-native-purchases with webhook + REST reconciliation on the backend. The thing that burned us early: the native store receipt goes active before RevenueCat's REST API catches up. So a user pays, their device is happy, and our backend briefly disagrees. We serialized first-purchase generation behind verified entitlement sync with bounded recovery for delayed activation. Invisible to the user. Took us longer than we'd like to admit to figure out.

The design. Warm off-white canvas, sculptural black matte forms, ink-brush textures layered inside UI components at 5–15% opacity, serif display typography, floating left rail instead of a bottom tab bar. We wanted it to feel like a fashion magazine that somehow became an app. That sounds pretentious but it's the brief we gave ourselves and we think it landed.

Challenges we ran into

1. Making a wallpaper app without a wallpaper API. The core feature of the product is something Apple explicitly doesn't allow. We went through several approaches that didn't work before landing on the App Group prefetch + Swift App Intent + Shortcuts architecture. Even then we had to build out a whole versioning matrix for which builds could trigger which delivery paths — legacy builds get a fallback route, newer builds gate the trigger on cache confirmation. It was the hardest thing we built. It is also, genuinely, the product.

2. App Review and subscriptions. Apple rejected our purchase flow. The fix wasn't adding a privacy policy link buried in Settings — it was putting visible Terms and Privacy links plus a clear auto-renewal disclosure in the actual paywall UI. Two review cycles to figure that out. We now think of compliance as product design, not legal homework.

3. The receipt race condition. Real paying users hit this. Purchase succeeds on device, backend doesn't agree yet because RevenueCat's REST API hasn't caught up with the store. We added serialized entitlement verification with bounded recovery. The fix was quiet — users never saw it — but it would have burned the people most excited about Nyvo if we hadn't caught it.

4. Storage migration under live traffic. We outgrew Supabase Storage and moved to Cloudflare R2 with 100+ wallpapers already in production. Byte-for-byte verification on canary accounts first, kept Supabase objects as rollback sources, then flipped the write path. Not a single broken image. We were more nervous about this than we probably showed.

5. Keeping a scheduled pipeline honest. Daily generation has to be self-healing. A missed cron tick, a double-fire, a queued job whose identity references got deleted mid-queue — any of these can silently break a user's daily ritual. We added scheduler repair and duplicate protection so the pipeline can take a hit and recover without anyone noticing.

Accomplishments that we're proud of

  • We shipped. To both stores. Google Play and App Store, production builds, real RevenueCat subscriptions, inside the Shipaton window. First commit to two live monetizing apps in under four months. That's the one.
  • The automation actually works. Users wake up to a new wallpaper with zero manual steps. Most "AI avatar" apps quietly give up on this part. We didn't, because it's the whole point.
  • 113+ verified wallpapers through the pipeline with byte-level delivery verification. Boring and reliable. Exactly right for a background service.
  • A monetization stack we can trust. Webhook + REST reconciliation means purchases survive reinstatements, device transfers, and delayed delivery without landing on the wrong account.
  • A design that people notice. We get comments on the UI from people who aren't designers. That's the bar we were trying to clear.

What we learned

  • Don't take the shortcut on the core feature. Every workaround we considered for iOS wallpaper delivery — manual apply buttons, share sheets — would have made Nyvo a worse product in a way that couldn't be fixed later. The hard path was the right path.
  • Client state and server state are different systems. Design for the gap. Receipts, entitlements, webhooks — they all have clocks that don't perfectly sync. Verify on the server before you gate the feature.
  • Compliance belongs in the design file, not the rejection letter. Subscription disclosures and legal links are part of the paywall. Build them that way from the start.
  • Scheduled systems need to assume they'll fail. Repair logic and duplicate protection aren't polish — they're what separates "worked in the demo" from "still working on day 60."
  • Migrate with paranoia. The storage migration would have been terrifying without byte-level verification and rollback sources. With them, it was almost boring. Almost.

What's next for Nyvo

  • Android apply verification at scale — testing home/lock/both application across a wider device matrix.
  • Smarter identity memory — refining how the model understands "you" over time, based on uploads and favorites.
  • Social surfaces — public collections, mood-based discovery, turning personal galleries into inspiration for others.
  • Watch & widgets — the daily ritual, complication-sized.
  • Growth — the product loop is proven. Now the wallpaper itself becomes the distribution: every lock screen is showing something no other phone in the world has.

Built with React Native + Expo, Supabase, Cloudflare R2, GPT Image Generation — and monetized with RevenueCat.

Built With

Share this project:

Updates

Submission history