Public Build

Built in the open.

We're building Noovo in the open. Every feature, every milestone. You see it all.

  1. ๐Ÿ‘ป The Whisper lands on iOS

    Funny how the most honest little feature on the map was the one secretly broken on half our phones. A no-op hiding behind optional chaining is the quietest kind of bug, no crash, no log, just a ghost that politely refused to haunt iPhones. Glad it finally shows up to work. ๐Ÿ‘ป

  2. ๐Ÿ“ Every back button finally lines up

    Funny how the dullest bugs are the ones that sail right through. A header twenty four pixels too high shipped happily because every screen was copying the same guess instead of asking the phone where the notch actually is. Now they ask, and the build refuses to let anyone guess again. ๐Ÿ“

  3. ๐ŸŽ Apple Sign In Fixed: iOS Login Unblocked

    Classic launch gremlin: the button worked, the Apple sheet worked, the whole dance worked, and then the server quietly said "who are you?" because nobody told it which app to trust. One empty config field stood between us and working iOS logins. Found it, fixed it, and added a tripwire so the next person who blanks it gets a loud error instead of a silent week of confused testers. ๐ŸŽ

  4. ๐Ÿ›ฐ๏ธ LastGps Poison Fix: false "Didn't make it to {city}?" nags

    Three rounds of "why is this STILL happening" before the data cracked it: the notification was never about where anyone actually was โ€” a future trip's coordinates were cosplaying as live GPS. Faridabad pretending to be Cape Town. Easy to ship a fix that papers over your own test account and miss that the real user is still getting nagged. The lesson I keep relearning: trust the timestamps and the 7th decimal place, not the story you expect. ๐Ÿ“œ

  5. โŒจ๏ธ Keyboard Never Covers the Field You're Typing In

  6. ๐ŸŽ‚ Birthday Picker: Native Platform Control

    Six patches to fake a scroll wheel the OS already ships for free. Sometimes the most senior move is deleting your own cleverness and letting the platform do its job. The birthday picker finally just works โ€” because it's no longer ours. ๐ŸŽ‚

  7. ๐ŸชŸ Frosted Glass, Per-Platform: Overlay Cards Fixed on Native

    Funny how the prettiest effect we have, the frosted glass, is the one Android refuses to give us over a map. The honest fix was admitting each platform gets a different best: web blurs for real, iOS finally blurs for real too, and Android gets a tasteful tint until we screenshot-and-blur the map ourselves. Felt good to turn a one-line opacity bug into an actual surface system, with a test so we stop fixing it for the seventh time. ๐ŸชŸ

  8. ๐ŸŽจ Theme Switches Cleanly, Avatars Show, Checkmarks Visible

    Funny how the unglamorous fixes are the ones users actually feel. Nobody notices a theme that just works โ€” but a half-dark form or a friend whose face never loads quietly tells them the app is flaky. Chasing these down on the slow iPhone 11 was the right call: if it holds there, it holds everywhere. ๐Ÿžโ†’โœจ

  9. ๐Ÿชต The build log gets its own page

    Slightly funny that the page about how we build was itself built the wrong way first. I shipped it as an app route, then remembered the whole marketing site is static HTML for a reason, and rebuilt it to match. The log finally practices what it preaches. ๐Ÿชต

  10. ๐Ÿ” Auth flow restructured: Google first, Apple second, FB on ice

    Funny which decisions get made by the platform owners instead of you. Wanted FB Login on day one; Meta wants my business papers first. So Google goes up top, Apple takes second on iOS, email lives below the line, and FB sits in node_modules with the lights off until either I incorporate or the data tells me nobody cared anyway. The flip-back is one boolean โ€” the question now is whether I ever bother. ๐Ÿคทโ€โ™‚๏ธ

  1. ๐Ÿ“ Scheduler Reads Live GPS: Cape Town False-Positive Fixed

    Funny lesson: the bug only existed because the system was treating where you live and where you are as the same thing. Two ideas, one variable, several months of false confidence. The fix is mostly just naming things honestly. ๐Ÿ“

  2. ๐ŸŸข Free-time cards in Who's Going: one tap to plan together

    The first time I built Who's Going, surfacing free-time as cards felt like premature scope. Two surfaces later โ€” the green heat layer yesterday, this strip today โ€” it's clear free-time wants to live everywhere a trip lives. Coral and green, side by side, whether on a curve or in a card. ๐ŸŒฟ

  3. โฉ Timeline scrubber reaches free-time too, not just trips

    Two days of work to give free-time its own visual story โ€” a green curve, a chip, a card โ€” and then realising you forgot the part where the user can actually drag to it. Funny how the last 10% of the loop is usually the one no one writes a ticket for. ๐Ÿ”„

  4. ๐ŸŽก Birthday Wheel Stops Glitching on 120 Hz Android

    Bugs that only happen on someone else's device are the worst kind. "I can't reproduce it" is a meme until you realize the entire delta is 60 vs 120 Hz and a JS thread that's been re-rendering on every scroll frame. Lesson re-relearned: any imperative scroll guarded by 'is the user touching the wheel right now?' is a time bomb when the answer changes mid-frame. Gate on intent (did the parent want a different value?), not on the moving target. ๐ŸŽก

  5. ๐ŸŸข Free-time green heatmap + free-time overlap chip

    Funny how 'just add a second colour' turned into the right architectural moment to extract the overlap math into its own file. Eight tests later the chip writes itself. Two-signal heatmaps from now on โ€” the day the app stops being a one-note instrument. ๐ŸŽถ

  6. ๐Ÿ”ข Android Versioning on Autopilot

    Tiny change, outsized peace of mind. Every uploaded AAB is now a number I never have to think about, and the version that shows up on a tester's device is the same number sitting on the commit they're running. The fewer things in my head before tapping Upload, the better. ๐Ÿค–

  7. ๐Ÿค Request to Join: Optimistic + Dates + Auto-Add

    Two friction points I'd been quietly tolerating for months: the 1-second spinner before 'Request sent' (vs Follow's instant flip), and the 'I'm in' affirm sheet that asked the requester to confirm they wanted what they'd already explicitly asked for. Both gone in one branch โ€” plus a real concession to the way people actually travel together (arrive a day late, leave a day early). Felt good to delete that affirm-sheet step. ๐Ÿ‘‹

  8. ๐ŸฆŠ Firefox Stops Hijacking the Contact Page

    Funny one. Spent months proudly setting up App Links so the website would feel like a soft front door into the app, only to discover Firefox was treating that front door like a trampoline. Chrome had quietly papered over it the whole time. Lesson: claim only what you can route, and let the marketing pages be marketing pages. ๐Ÿ˜„

  9. ๐Ÿ”€ Lock the App to LTR (Hebrew Half-Mirror Fix)

    Built the whole app assuming reading goes left to right and it never occurred to me that someone in Tel Aviv would put their phone into Hebrew and find a scrubber that fights their finger. The right answer is a real RTL audit; the fast answer is two lines that admit the app only speaks one direction for now. Filing both: the fix and the IOU. ๐Ÿ“

  10. ๐Ÿค– Live on Google Play: launch readiness shipped

    Three months from "started building" to "live on the Play Store" feels like a blink. The thing I'll remember about this one is the review catching the silent referral drop on the App-Link happy path โ€” would've been the kind of bug nobody noticed for weeks because the success cases all looked fine, but the inviter quietly never got credit. Glad we caught it before flipping the switch. ๐Ÿš€

  11. ๐Ÿ—บ๏ธ SEO Content Hub: Six Articles, Built for Retrieval

    The funny part is that the highest-leverage thing I shipped today might be a robots.txt file. We've spent months on the app and a couple of hours on the layer that decides whether GPT, Claude, and Perplexity can even see Noovo when someone asks them about social trip planning. Wide retrieval is coming โ€” better to be cited than to be ranked. ๐Ÿ”

  12. ๐Ÿคซ Killed the spurious 'Google sign-in failed' toast on Android

    Classic case of a safety net leaving fingerprints. The Android activity-restart contingency was always going to write the stash, and on every code path EXCEPT the actual restart, it was just sitting there waiting to fail. Three layers of cleanup feels like a lot for a toast โ€” but Android Google login is the hottest funnel right now and a confusing error message every cold start would have killed installs. Worth every line. ๐Ÿงน

  13. โšก Fast Startup: Disk Cache + Deferred Fetches

    Funny realization: the splash was effectively punishing returning users for the exact reason they should have been rewarded โ€” we already had all their data on the device the last time they were here. Persisting it took half a day; the perceived first-paint went from "is this thing broken" to "oh." Should have been the move from day one. โšก

  14. ๐Ÿ”” In-app Update Prompt: Native Builds Tell Users When They're Behind

    We've been hand-rolling APKs locally and sending them to testers โ€” every old install was a black hole where stale users couldn't even tell they were stale. The pragmatic answer ate one afternoon: bump a number in a JSON, the next foreground floats a banner. No EAS Update saga required. Future-me, when you raise minimumBuild for real, write the blocking modal then โ€” don't preemptively ship it. ๐Ÿ“ฆ

  15. ๐ŸŽฏ BadgeAwarder: Auto-Awards on Signup

    The architecture call was nice here โ€” "Proper architecture prep for future badges awarded." The pattern-match dispatch on BadgeCriteria types means adding a hypothetical FirstNTripsCreated(100) is genuinely one new record type + one new evaluator method, with the type checker enforcing the wiring. The infra investment pays off the moment we ship our second growth badge. ๐Ÿ—๏ธ

  16. ๐Ÿ”” Badge Earned: Notifications Across Every Surface

    The pre-check that guards against re-notifying for already-held badges was the small detail I'm glad we got right. Without it, the very first admin retry or migration replay would have sent every existing Founding Crew #1โ€“#200 a "Badge earned" notification overnight โ€” the kind of bug that would make 200 people simultaneously check their phones and find it duller than they hoped. Quiet-by-default is the brand. ๐Ÿคซ

  17. โœจ Sign-up โ†’ Map: one continuous splash, no flash

    Third time's the charm with the splash. We added a branded interstitial because we worried the form looked frozen during auth โ€” turns out the cure was louder than the disease. Every first impression matters: small icon, map, done. ๐Ÿ‘‹

  18. ๐ŸŽ–๏ธ Badges: Pick Your Three

    The Android 12 fix was the satisfying one โ€” every render of the "12" looked subtly wrong for a week and I kept assuming it was the arc geometry. Turned out the rotation was pivoting on the moving arc point instead of the text's anchor, so the position drifted ~11 units off-track. Tiny rotation math, very visible result. Also: if your "sans-serif font" is rendering as a serif, suspect the family name before the design ๐Ÿค”

  19. โณ Post-Auth Loader: Branded Spinner Replaces the Form

    The kind of fix that's invisible when it works โ€” nobody's going to email me saying "thanks for the loading spinner" โ€” but the alternative is making people wonder if they just signed up into the void. The map is the payoff; let's at least admit we're going to fetch it. ๐ŸŒ€

  20. ๐Ÿ” Tap a Badge: See How It Was Earned

    The fun part was deciding the founding-crew numbering rule. We could have used award-row order (when the migration ran), but that bunches everyone at the same SYSUTCDATETIME() with no real signal. Going by User.CreatedAt means #001 actually IS the first to join. Felt like the right kind of permanence โ€” a badge whose number means something โœจ

  21. ๐Ÿชฒ Badges: Tooltip, Inline Editor, Bugdroid Bug

    Itamar's bug report was a gift โ€” "sometimes it hides, sometimes it doesn't, especially in dark/light toggle" is one of those user-side observations that maps cleanly to ONE specific failure mode (SVG ID collision when multiple instances mount at once). Took longer to write the comment explaining the fix than to write the fix. ๐Ÿ”โ†’๐Ÿงน

  22. ๐ŸŒ€ Noovo Spinner: Orbiting Dots Around the Logo

    One of those things that doesn't sell a feature but quietly builds the brand. The default Material/iOS spinner is a tell that you didn't bother โ€” every app on the user's phone uses one. Ours now has a fingerprint. Cost: ~120 lines of math + animation. Worth every line. ๐ŸŒ€

  23. ๐ŸŒˆ Instagram pill inline, plus IG-as-username auto-fill

    Big lesson from the v1: shipping a feature 'technically correct' but visually tucked away is functionally a bug. The pill belongs next to identity โ€” not below it. And making the IG handle pre-fill the username feels obvious in hindsight: of course people want their travel handle to match their @ on the grid. Onboarding just got 30%% lighter. ๐Ÿ๏ธ

  24. ๐Ÿ—“๏ธ Fresh on your circle's calendar

    Funny how the smallest change โ€” swapping a static cap-3 list for a "newest first, show me more" feed โ€” totally flips the vibe. Before: "here's three trips, scroll on." Now: it actually feels like there's a heartbeat on the People tab. And free weeks finally get to share the stage with trips, where they always belonged. ๐Ÿ“…

  25. ๐ŸŽ–๏ธ Origin & Charter: Badge Framework Ships

    Originally roadmap #410 said "single specific badge, refactor later if we ever add more." Turns out "later" was nine days later. Glad I went with the generalized framework now rather than the bool field โ€” the third badge will cost a row in the seed table instead of a migration. The twelve charter members are still placeholder emails until the campaign closes, but the migration is defensive enough that running it twice is harmless. ๐Ÿ––๏ธ

  26. ๐Ÿ“˜ Facebook is back: login, friend discovery, and a quiet "they joined" ping

    Funny that the hardest part of "FB friend joined Noovo" wasn't the Graph API or the dispatch โ€” it was making sure we don't ping Sarah three times when Alex signs up using her referral code AND auto-follows her AND happens to be her FB friend. One notification, the loudest one wins. ๐Ÿ“˜

  27. ๐Ÿ› ๏ธ Fix Android crash on @-mention notification tap

    First real Sentry-reported crash from a real user, and Shelley got to be the unlucky pioneer โ€” sorry, Shelley. The bug was hiding in plain sight since April: a stale layout event inside a setTimeout that Android decided was finally time to invalidate. Three lines of code, one less force-quit. ๐Ÿ”ฉ

  28. ๐Ÿ“ธ Instagram handles land on profiles

    Funny how the smallest fields move the most โ€” every social product I've ever built lived or died on whether you could click out to where the relationship really happens. Noovo's not trying to keep anyone hostage; if your future trip-mate wants to vet you on the grid first, we just hand them the door. โœจ

  29. ๐Ÿ›ก๏ธ Backend Hardening: Admin Filter & (You) Labels

    Funny how a class-level [AdminApiKey] attribute is one line, and that one line replaces forty lines of copy-paste plus accidentally locks down two endpoints I didn't realize were exposed. Boring fixes are sometimes the most satisfying. ๐Ÿ›ก๏ธ

  30. โš™๏ธ AlmostDetection: BackgroundService Refactor

    Wild that the engine for one of our distinctive features had no tests. Five small ones now โ€” enough to catch the obvious regressions, not enough to lock the implementation in place. The kind of test scope I'd want from someone else's PR. ๐Ÿงช

  31. ๐Ÿ”’ Domain Errors: No More Bug Messages Leaking as 400s

    Migrations like this one are sneaky-important: the user-visible behavior doesn't change at all on the happy path. The win is invisible โ€” the day a real bug ships, the customer won't see its raw stack trace where they expect a clean error message. โšœ๏ธ

  32. ๐Ÿงน AuthController: EF Queries โ†’ Service

    Today turned into a 5-PR review-fix sprint: AdminFilter+isSelf, AlmostDetection BackgroundService, DomainValidationException sweep, both schedulers, and now this. The whole May 8 backend review is fixed. The codebase weighs the same but is noticeably less crooked. ๐Ÿช›

  33. ๐Ÿ—บ๏ธ Smart trip-day notifications

    We were sending users 'You're in Lisbon โ€” want to log a trip?' on the morning their Lisbon trip started. They had logged the trip. The system knew. The system was just being incurious. The fix was less about new code and more about teaching the existing notification path to ask: 'do they already have a trip here, today?' before opening its mouth. ๐ŸคซโœŒ๏ธ

  34. ๐Ÿ›ฌ Overlap Detection on Trip Create

    Classic Noovo bug shape: every piece existed (Convergence model, suppression rules, push pipeline) but the wire between "trip created" and "check for overlap" was justโ€ฆ not soldered. Built a beautiful overlap engine, then forgot to plug it in. The whole feature was one method call away from working for two months. ๐Ÿ˜ฎโ€๐Ÿ’จ

  1. ๐Ÿ“ Pin or Prompt: Move-Detection for Everyone

    Funny one. The dangerous Play Store permission was already approved for a feature 5% of users would use. Today it justifies its existence โ€” every traveler who lands somewhere new gets a soft pull back into the app. Not new code, mostly. Just the gate moved one line up. ๐Ÿ—บ๏ธ

  2. ๐ŸŒ Cape Town stops drowning: high-res polygons + correct centroids

    Funny what you find when you look. Was hunting for one Cape Town dot in the ocean and discovered Portugal's centroid had been chilling halfway to the Azores this whole time. The map quietly lying for months. ๐ŸŒŠ

  3. ๐ŸŽญ Trip Invites Speak in Tenses Now

    Tiny thing but it bugged me every time โ€” you'd invite a friend to a trip happening right now and the app would calmly announce you'd โ€œinvited them to your trip to Bangkok.โ€ No you didn't, you're in Bangkok, come already. Fixed. The voice matches the moment across card, push, and email body in one shot. Small pivot, big vibe. ๐Ÿ’ฌ

  4. Coral tagline + a whisper for the curious: Entry screen

    Funny how long we've been comfortable with a logo that made everyone squint. The whisper is the bit I like most โ€” it only shows up if you actually pause, which is the only kind of visitor who'd have read an explainer anyway. ๐Ÿคซ

  5. ๐Ÿ”‘ Forgot Password: Email Verification Reset Flow

    Can't believe we shipped a login screen without a forgot password link for this long. At least the pattern was already there from signup verification โ€” same 6-digit code, same Resend API, just a different cache prefix. The OAuth detection is a nice touch though, saves users from a dead-end flow when they signed up with Google and don't even have a password to reset. ๐Ÿ”

  6. ๐Ÿ”’ Username Lock & Email Re-verification

    Satisfying when a feature is mostly "delete code and add one line." The backend change was literally removing the username update block and adding EmailVerifiedAt = null. The existing VerifyEmailScreen gate did the rest. Less code, more trust. ๐Ÿ”

  7. ๐ŸŽŸ๏ธ Trips have IDs before they exist: share tokens for invites at form-fill time

    Spent half an hour staring at a choice between a draft-trip flag, a temp-ID lock table, and a GUID, and the GUID just kept winning โ€” nothing to clean up, nothing to leak into the feed, and the recipient-side flow stays boringly identical to the post-create path. The funniest part is the backfill: two people on either side of a ten-second race, and the server quietly files them both under the same memory. ๐Ÿ”

  8. ๐Ÿ—บ๏ธ OG Cards Get Real Country Maps

    This one mattered because link previews are the single most-seen surface Noovo has โ€” every invite, every share, every referral runs through a WhatsApp thumbnail. A blocky grid and a broken date felt like "we haven't shipped yet." A real map with your country lit up in green and a dot on your spot feels like the app is paying attention. First impressions for maybe one cent a year. ๐Ÿ—บ๏ธ

  9. ๐ŸŸ  People โ†’ Circles: Hybrid IA + Plan-with-friend

    Three specialists, one tab. Copywriter wanted Orbit, growth and design both picked Circles โ€” the second opinion won the day because Circles reads cleaner in push notifications and a first-time user actually knows what it is. The real prize is the free-time overlap rail though: itโ€™s the most direct path weโ€™ve ever shipped from โ€œIโ€™m freeโ€ to โ€œweโ€™re going.โ€ Three taps. ๐Ÿ”ฅ

  10. ๐Ÿ—บ๏ธ Where They've Been: Digest Email Gets a Past Tense

    Funny how a single missing date check can quietly gaslight your users โ€” "Alice is planning a trip to Paris!" no she's not, she went in 2024. The fix is small but the principle matters: "On the horizon" has to actually point forward, or the whole metaphor falls apart. ๐Ÿ—บ๏ธ

  11. ๐Ÿ‘ฏ Show all the joiners: linked trip companions

    The link badge used to whisper "you're with Alice" even when Bob and Carol were also tagging along โ€” which quietly flattened group energy into a 1:1 moment. Fixing this was a small backend tweak but it makes the social signal finally match the actual social reality of a trip ๐Ÿ‘ฏ

  12. โœ‰๏ธ Trip Invites Stop Tripping Over Themselves

    Three of these papercuts had been on my mental list for weeks and I kept telling myself they were too small to be worth a branch. Turns out shipping the small stuff is exactly what makes the invite flow feel like it was built on purpose instead of by accident ๐Ÿ“จ

  13. ๐Ÿช Every Search Is a Recruitment Moment

    There's something quietly rude about an app that lets you search for a friend, fails to find them, and just shrugs. Turns out the fix was one shared row and six import lines. Every dead-end is now a little "hey, I know a guy" moment โ€” which is maybe the most honest shape a growth loop can take. ๐Ÿ“ฌ

  14. ๐ŸŽŸ๏ธ Trip invites, visible where they matter

    The three bugs here all had the same flavour: we asked people to take an action on a trip, then made the state of that action invisible to everyone involved. Owners couldn't see their outbox. Invitees couldn't see they'd already knocked. New users didn't even know a trip was waiting for them. Fixing all three in one pass felt less like three features and more like finally showing people the receipts. ๐Ÿงพ

  15. ๐Ÿ”• Every Notification Resolves

    Tiny fix, big mental-load drop. Nothing erodes trust in an inbox faster than that little blue dot refusing to die after you've clearly read the thing. Now there's exactly one path through resolve, and a guardrail in CLAUDE.md so the next notification type can't quietly reintroduce the bug. Inbox hygiene is a love language. ๐Ÿงผ

  16. ๐Ÿ—บ๏ธ Profile Trips: Endless Scroll & Honest Stats

    Funny how a missing pageSize param can quietly turn into a trust bug โ€” power users with 30+ trips were seeing a profile that said "22 trips" and clearly wasn't theirs. Backend already supported pagination; the frontend just never asked. Now it asks, and the totals come from a real aggregate query so even the math is honest. ๐Ÿ“œ

  17. ๐Ÿ“… Calendar Goes Back 70 Years

    Funny that something as boring as a calendar bound is one of the most emotionally loaded fixes โ€” turns out 'going back 10 years' silently told users 'your earlier life doesn't belong here.' Now grandma can log her 1972 hitchhike across Europe. That feels right. ๐Ÿ—บ๏ธ

  18. ๐Ÿง  Notifications Get a Brain

    The first version of the inbox treated every event in isolation โ€” fine when there are five notification types, painful at twenty. This is the moment notifications stop being a log and start being a feed with judgement: 'I already told you the more useful version of this thing, I'm not going to whisper the boring version too.' Feels like a quiet but real maturation. ๐Ÿง 

  19. ๐Ÿ—‘๏ธ Hard Delete: Nuke Your Data, No Waiting

    Feels good to give users genuine control over their data. The 30-day grace period is kind, but some people just want a clean break โ€” and now they can have one. Bonus: found and fixed three FK constraint gaps in the existing purge job that were silently ticking time bombs. Two birds, one PR. ๐Ÿ’ฃ

  20. ๐Ÿงน Codebase Review: Suggestions & Warnings Applied

    The fun part of doing your own architecture review is that the auditor and the engineer can't argue โ€” they just have to ship the fixes. Two 1000+ line services finally got broken up, three picker components stopped reaching into the API layer, and the magic strings are dead. The codebase feels noticeably less load-bearing today ๐ŸŸ

  21. ๐Ÿ“ท Make It Yours: Custom Trip Cover Photos

    We were one Unsplash key revoke away from a million identical Eiffel Towers โ€” and more importantly, none of those trips ever felt like the person planning them. Letting people pin their own photos is the smallest possible step toward trips that look like memories instead of stock catalogs. Tiny feature, surprisingly emotional. ๐Ÿ“ธ

  22. ๐Ÿ—บ๏ธ Scratch Map Visibility Fix: Countries Now True to State

    Three bugs, one root cause: we had two visibility systems and the scratch map was still reading the old one. The ghost-country thing was particularly sneaky โ€” seed trips had no CountryCode so the cleanup code silently skipped them every time. At least now when you delete a trip, the map actually believes you. ๐Ÿ—บ๏ธ

  23. โœจ UX Polish: Trip CTAs, Notification Jank, Comment Refresh

    The kind of session where you fix four things and each one is just "stop doing the thing you're already doing to yourself." Self-triggering loops, buttons that navigate to nowhere, optimistic updates immediately overwritten by their own echo. All resolved with refs and params โ€” no new abstractions, just wiring that should've been there from day one. ๐Ÿ”ง

  24. ๐Ÿ—บ๏ธ Scratch Map Layering: Countries Stack Right

    Turns out "paint in order" is harder than it sounds when your if/else chain was written by someone who thought priority meant "check first." The API is now the single source of truth for what you've been to vs what's private โ€” no more client-side trip lists sneaking in. Your map, your layers, your rules. ๐ŸŽจ

  25. ๐Ÿ”” Notification Tap Navigation: Tap to go, not just to read

    This one's been bugging me for a while. Notifications that just sit there like read receipts instead of taking you somewhere felt broken. Now the whole card is a doorway. The crimson trip names are a nice touch too โ€” they pop without screaming. ๐Ÿšจ

  26. ๐Ÿ—„๏ธ Trip Archival + Shared Trip Data: Past trips cleaned up, joined trips visible

    This one's been bugging me for a while. Someone joins your trip and their scratchmap doesn't even know they went? And hiding past trips nuked everything even if you'd explicitly shared it with close friends? Felt like the data model was gaslighting users. Now it actually respects intent. ๐Ÿ› ๏ธ

  27. ๐Ÿ“… Year in Dates: Smart Year Display

    This one's been bugging me for a while โ€” seeing "Dec 20" on a trip from last year feels misleading, like it's coming up soon. Now dates from other years wear their year proudly. Bonus: killed 9 copy-pasted formatters in the process. Fewer places for bugs to hide. ๐Ÿงน

  28. ๐ŸŽจ Brand Identity Audit: Every Pixel Aligned

    Turns out we had a brand identity doc that said one thing and an app that said another 101 times. The fonts were system defaults half the time, buttons couldn't agree on their own border radius, and the avatar fallback was screaming crimson at you when it should've been whispering cream. Now every pixel actually speaks the same language. The kind of PR where nothing looks dramatically different but everything feels right. ๐Ÿงน

  29. ๐Ÿ”’ Capacity Gate: The App Goes Live

    The moment we've been building toward. Instead of throwing the doors open, we're letting people in 200 at a time โ€” each one vouched for by someone already inside. Feels right for a social app about real friendships. Let's see if the referral loop catches fire. ๐Ÿ”ฅ

  30. ๐Ÿ”’ Crews Reframed: Private Visibility Lists

    This one's subtle but important. If people think crews are shared groups, they'll hesitate to organize people into blunt categories like 'work acquaintances I don't want seeing my party trips'. The whole point is that it's YOUR mental model, not theirs. Now the UI actually says that. ๐Ÿ”

  31. ๐ŸŽฌ Animated Entry Screen: Brand Moment Before Login

    This is the first thing anyone will ever see of Noovo. No forms, no friction โ€” just the logo breathing to life and two clear choices. Itโ€™s a small screen but it sets the entire emotional tone. Weโ€™re not a waitlist anymore, weโ€™re a product. ๐Ÿš€

  32. ๐ŸŽš๏ธ Timeline Scrubber: 6-Month Sliding Viewport

    This one was overdue. The scrubber was technically "working" but if you had a trip in 2028 it became a blurry pixel slider. Now it feels like scrubbing through a proper timeline โ€” 6 months at a glance, smooth panning for the rest. The edge-scroll mechanic is chef's kiss. ๐ŸŽš๏ธ

  33. ๐Ÿ—‘๏ธ Crew Delete: Cascading Visibility & Rich Confirmation

    This one felt like defusing a quiet landmine. Crews looked like they deleted fine, but behind the scenes trips were silently becoming invisible to everyone. The fix is satisfying though: now you get a full breakdown of what changes before you commit, and the cascade handles all the edge cases. Privacy is a feature, not an accident.

  34. ๐Ÿ’ฌ In-App Feedback Widget: Soft Launch Ready

    This is the one that makes soft launch actually work. You can have the best app in the world but if your first 50 users can't tell you what's broken, you're flying blind. Now they just tap and talk. Simple as it should be ๐ŸŽค

  35. โœ๏ธ Inline Crew Editing: Search & Remove Without Leaving

    The separate "Add Members" screen always felt like one screen too many. Crews are small, personal lists. You should be able to tweak them without a navigation round-trip. Same energy as editing a playlist inline instead of opening a modal. Small win, big feel.

  36. โšก Trip Creation Goes Sub-Second

    15 seconds to create a trip. Fifteen! Turns out we were running 6 relevance queries, N dedup checks, reward writes, and location history all inside the same DB transaction that the user was waiting on. Classic case of "it worked fine with 3 followers." Now the response is just insert + free time split + done, everything else fires in the background. The Channel<T> pattern we already had for notification dispatch was perfect for this โ€” no new infrastructure, just a new queue. โšก

  37. ๐Ÿ“ฑ Timeline scrubber: dodge iOS back-gesture

    The kind of bug where you know exactly what's happening but can't believe the fix is this simple. Just show a week of the past and suddenly the OS stops fighting you. Sometimes the best solutions are just... getting out of the way. ๐Ÿ“ฑ

  38. ๐Ÿ“Š PostHog Analytics: Eyes on the Map

    We've been flying blind for months โ€” building features based on gut feeling and vibes. Now we actually get to see what people do when they open the app. Curious to find out if anyone actually uses the Go tab or if they just live on the map. Time to let the data cook ๐Ÿ”

  39. ๐Ÿงญ Empty State Revamp: 2-Step Onboarding Flow

    The old empty state tried to do everything at once โ€” suggest friends, share links, add trips, set free time โ€” all in one giant card. No wonder users felt paralyzed. Breaking it into two focused steps (people first, plans second) is the kind of UX clarity that makes onboarding feel intentional instead of overwhelming. Also very satisfying to finally kill that phantom FindFriendsScreen gate that haunted iPhone users. ๐Ÿ‘ป

  40. ๐Ÿ” Full-Fidelity Analytics: Every Click Tracked

    Two milestones in one day. First PostHog went in, now every button in the app has a name. No more guessing what users do between login and churn โ€” we can literally replay their entire journey click by click. Can't wait to see the first funnel analysis ๐Ÿฟ

  41. ๐Ÿงช Testing Infrastructure: From Zero to 101 Tests

    Honestly kind of wild that we shipped 300+ PRs with zero automated tests. The fact that nothing exploded is either a testament to good architecture or sheer luck. Either way, the safety net is here now. Every future feature gets tests baked in from day one, and nothing touches prod without passing the gate. Feels like we just graduated from "move fast and break things" to "move fast and know immediately when things break." ๐Ÿ›ก๏ธ

  42. ๐Ÿญ Dev Environment: Deploy to Dev First, Promote to Prod

    Two infrastructure PRs in one day โ€” testing and dev environment. We went from "yolo push to prod" to a proper pipeline with a safety net at every step. The seed data covering 25 entity types means the dev environment actually looks like a real app now, not a ghost town with three users and no comments. Future us will be grateful. ๐Ÿ—๏ธ

  43. ๐Ÿ“ง Digest Email Glow-Up: Unsubscribe Fix + Redesign

    The unsubscribe bug was one of those "how did we not catch this" moments โ€” every digest email was a nuclear unsubscribe button in disguise. Now it's surgical: digest off, realtime stays. And honestly the old digest looked like a tax form. Cards + emojis + FOMO copy = emails people might actually read. โœจ

  44. ๐Ÿ“ฌ Email Digest: Stop the Notification Flood

    This one's been bugging me for a while. Every time someone followed a user, bam โ€” another email. Comments? Email. Reactions? Email. The inbox was becoming a second notification center nobody asked for. Now the daily digest collects all the nice-to-know stuff into one morning email, and only the real magic (your worlds are about to collide!) gets the instant treatment. Users get control, we stop being annoying. Win-win. ๐Ÿ“ฎ

  45. ๐Ÿค Friends in Common: Smarter Suggestion Scoring

    Turns out we were telling people they had "mutual friends" with someone they'd barely even knocked on the door of. The suggestion engine now has actual social awareness: it knows the difference between a friend, a follower, and a pending request. Three signals, three weights, one honest label. The Who pillar just got a little smarter ๐Ÿง 

  46. ๐Ÿ“ฒ Instagram Invite: Copy Message + Confirmation Modal

    The old flow was literally: copy a bare URL, yeet the user into Instagram, and hope for the best. Now we actually tell them what happened and what to do next. It's the little things that turn "I'll invite someone later" into "oh that was easy." ๐Ÿซถ

  47. ๐Ÿ‘† Desktop scroll-forward overlays for horizontal sections

    Small thing but it bugged me every time I used the app on my laptop โ€” horizontal carousels with no scroll affordance feel like dead ends on desktop. Now there's a little chevron that says "hey, there's more over here." One component, six scroll sections, zero native impact. The kind of polish that makes web feel intentional, not just a mobile afterthought. ๐Ÿ–ฑ๏ธ

  48. ๐Ÿ–ฅ๏ธ Desktop Top Nav: Responsive Navigation

    This one's been bugging me for a while. The bottom tab bar on a 27" monitor just screams "I'm a phone app pretending to be a website." Now desktop users get a proper top nav with the frosted glass treatment, and mobile stays exactly the same. Small change, big legitimacy boost. ๐ŸงŠ

  1. ๐ŸŽ‚ Birthday Wheel Picker & Gender Field

    Small details like this matter more than they seem. Nobody wants to type their birthday in YYYY-MM-DD format โ€” that's a developer's date picker, not a human's. The wheel just feels right. And gender as a nullable enum means we're not storing empty strings or sentinel values. Clean data from day one. ๐ŸŽฏ

  2. ๐Ÿ”’ Crews Go Private: Visibility Management Revamp

    This one's been brewing for a while. The original crews model was trying to be two things at once โ€” a social group AND a privacy tool โ€” and it was awkward for both. Now crews are purely yours, like a contact list that nobody else can see. The Include/Exclude toggle is the real unlock: "hide this trip from my work colleagues" is such a natural thing to want. The scratchmap awareness was the hardest part but it had to be right โ€” you can't have someone's visited countries leaking through a privacy boundary. ๐Ÿ”

  3. ๐ŸŽฏ Relevant Notifications: Stop the Noise

    This one's been bugging me. Every time someone posted a trip, ALL their followers got pinged โ€” even if they had zero connection to the destination. Now the system actually thinks before it speaks: are you going near there? Do you live there? Are you free then? Are you involved? If not, silence. Notifications should feel like a friend tapping your shoulder, not a megaphone in your face ๐ŸŽฏ

  4. ๐Ÿ“ Pre-fill destination from disparity popup

    Tiny change, big feel. The disparity card already knows your city โ€” seemed silly not to hand it to the trip form. Reduces friction at exactly the moment someone decides to plan. ๐ŸŽฏ

  5. โšก Auto-Save: Kill the Save Button

    The Save button always felt like a tax on momentum โ€” you're mid-flow tweaking trip dates and suddenly you have to consciously "commit" your edits. Now changes just land. The per-field PATCH was the right call too; no more praying that two rapid edits don't clobber each other. One less friction point between thought and action โšก

  6. ๐ŸŽฏ Smart Who's Going Ranking

    This one's been bugging me โ€” having your own trips buried in the strip felt wrong. Now the whole strip is smarter: your trips first, then ranked by social relevance. Same brain as the follow suggestions, different body. The map tab just got a quiet personality upgrade ๐Ÿง 

  7. ๐Ÿ”” Notification Polish: Sizing & Stale State Handling

    This one's been bugging me for a while โ€” ghost follow requests from deleted users just sitting there with useless buttons. Now the backend checks the real state of things on every fetch, so stale notifications resolve themselves. The sizing fix was overdue too; notifications should feel like a clean feed, not a jigsaw puzzle. ๐Ÿงน

  8. ๐ŸŽ Apple Sign-In: App Store Compliance Unlocked

    Three auth providers. The holy trinity of "let me sign in without thinking." Apple was the missing piece that kept us one rejection away from App Store limbo. Now users can tap the black button, biometric, done. The real unlock here isn't auth -- it's that every user who would have bounced at the signup wall now enters the invite funnel. More signups = more invites = more trips. ๐Ÿ

  9. ๐Ÿ“จ Not Here Yet: Inline Contact Invites

    The old invite screen was basically a share button in a trenchcoat. Now every contact has an Invite pill right next to their name. Tap, SMS opens, done. The bet is simple: showing 300 real names is more compelling than one generic "share your link" button. Every person you add is another trip you won't accidentally miss. ๐Ÿ“ฉ

  10. ๐Ÿ” Google Contacts Discovery: The Email-Only Friends

    Your phone contacts and your Google contacts aren't always the same people. That's literally the copy on the button, and it's literally the insight. Every person you've ever emailed is now a potential friend on the map. The hashing happens server-side so the frontend just sends one token and gets matches back. Clean. ๐Ÿ“ง

  11. ๐Ÿ—บ๏ธ Scratch Map Now Tracks Trip Edits

    This one's the kind of bug that quietly erodes trust. Your scratch map should be a trophy wall, not a filing error. Four mutation paths, zero LocationHistory awareness โ€” now all four are wired up. The scratch map finally tells the truth. ๐Ÿ‡ฒ๐Ÿ‡ฆโ†’๐Ÿ‡ซ๐Ÿ‡ท

  12. ๐Ÿ‘ฅ Facebook Friend Discovery: Who's Already Here

    Four PRs in one session: Apple Sign-In, inline contact invites, Google Contacts, Facebook friends. The full network import suite. A new user now has four pathways to populate their map: phone contacts, Google email contacts, Facebook friends, and the referral link. The empty map problem just got a lot smaller. ๐ŸŒ

  13. ๐Ÿ”’ Private Trips on Scratch Map + LocationHistory Backfill

    Your scratch map is your trophy wall, but not every trophy needs to be on display. Now your secret getaways stay secret while still counting toward your map. The backfill means everyone's map is finally telling the whole truth from day one. ๐Ÿ ๐Ÿ”’

  14. ๐Ÿงน Single Source of Truth: Invite Consolidation

    This one's been bugging me for a while. Four screens doing the same thing four different ways, each drifting further apart with every PR. Now there's exactly one place to change invite behavior and it ripples everywhere. -419 lines feels like spring cleaning. ๐Ÿงน

  15. ๐Ÿ‘ฅ Who's Coming?: Trip Invite Flow

    Every trip starts with Who. Now the form actually asks. The follow-gate is doing double duty here: it explains the social contract ("they need to follow you back") while also driving organic follow requests with context. The clipboard share message sounds human enough that people won't edit it before pasting. That's the bar. ๐ŸŽฏ

  16. ๐ŸŒ Timezone Awareness: Dates That Don't Lie

    This one's been quietly haunting us โ€” dates lying to users depending on which timezone their browser was in. Turns out 10 different components each had their own date formatter doing `new Date()` and hoping for the best. Now there's one source of truth, and the coral timezone badge is a nice touch โ€” it only lights up when the gap actually matters (morning flips to evening). The LocationTimezone cache means we'll basically never hit Google's API after the first month of usage. ๐ŸŒ

  17. ๐ŸŽฏ Trip Suggestions: Date Picker & Timeblock Fix

    This one's been bugging me โ€” the whole point of 'shorten trip' is to snap back to the last clean timeblock, not just stamp 'right now' on it. Now users actually get to pick the date too, which makes the suggestions feel like suggestions instead of commands. Small fix, big UX difference ๐ŸŽฏ

  18. โœ๏ธ Edit & Delete Free Time from Profile

    This one was hiding in plain sight โ€” the backend had PUT and DELETE endpoints since day one, the API client had the methods, but there was literally no button to press. Five files, zero new patterns. Sometimes the best features are just finishing what you started. ๐Ÿ”“

  19. ๐Ÿงน Code Quality Sweep: type safety, god files, middleware

    This one felt like cleaning the garage โ€” you know it needs doing but you keep putting it off. 94 untyped casts scattered across 26 files is the kind of thing that silently makes every future PR harder. Now there's one typed exit point and the codebase actually tells you when you mess up a style property instead of shrugging. The middleware cleanup is quietly my favourite part: 31 identical try-catch blocks doing the exact same thing, gone. ๐Ÿงน

  20. ๐Ÿ’ฌ Comment Notifications: Show the Message, Not the Trip Name

    Small but meaningful UX fix. Showing "New comment on your trip 'Barcelona Summer'" told you nothing โ€” now you see the actual message and can decide if it's worth opening. The mention gatekeeping is the kind of quiet guardrail that prevents confusion before it starts. No one wants a notification they can't act on ๐Ÿ™

  21. ๐Ÿ”— Deep Links That Actually Work

    Turns out we've been logging people out every hour since launch and nobody noticed because they just assumed the app was buggy. Classic. The deep link thing was even sneakier โ€” the landing page was hijacking the URL before the auth flow could even see it. Two birds, one commit. ๐Ÿ”—

  22. ๐Ÿ”— Unified Suggestions: One List to Rule Them All

    Three screens, three fetch calls, three stale lists โ€” the classic 'works on my screen' problem but within the same app. One shared hook later and suggestions finally behave like they belong to the same user. The dismiss button glow-down was overdue too; nobody needs a neon EXIT sign on a business card. ๐Ÿชถ

  23. โœจ MapWaitingCard Redesign: 2-task onboarding nudge

    The old card was trying to do three things at once and none of them well. Strikethrough text as a reward is like getting a participation trophy that's already crossed out. The new 2-task model is tighter โ€” find your people, then give the map something to show. The phantom pop-up bug was especially sneaky: convergence detection toggling the card mount/unmount. Now it just stays put. Simple things should be simple. โœจ

  24. ๐Ÿ“ Location Disparity Fixer: Smart Trip Suggestions

    This one's been bugging me since Alice's Istanbul test. Your map should know where you actually are, and when that doesn't match what you told it, it should help you fix it โ€” not just silently show the wrong thing. The 'secretly here' ghost marker is a nice touch: gentle enough that dismissing isn't annoying, but persistent enough that the truth is always one tap away. ๐Ÿ‘ป

  25. ๐Ÿ‘ฅ Group Trips: Data Model & Core Backend

    This one's been brewing for a while. The single-owner trip model was always going to hit a wall once convergence detection started surfacing "you're both going to Paris" moments with no way to act on them. Now the plumbing is in place: solo trips stay yours, group trips are the shared overlap, and every existing query knows the difference. 28 files touched, zero data lost. The fun part starts with the frontend PRs. ๐Ÿ›ฉ๏ธ

  26. ๐Ÿ”” Notification Visual Differentiation: Icons, Card Tiers, Date Headers

    This one's been bugging me for a while โ€” the notification feed felt like a wall of text where everything screamed at the same volume. Now convergences actually look like the big moments they are, and the little colored circles make the whole feed scannable in a heartbeat. Small change, big upgrade to the feel of the app ๐ŸŽจ

  27. โšก http Performance: Compression, Pooling & Caching

    The alert was doing its job โ€” it just exposed that we'd never really optimized the response pipeline. Background services were like roommates who all try to shower at the same time when the hot water heater is still warming up. Now they wait 30 seconds. Brotli compression alone should shave a good chunk off those response times for the chunkier JSON payloads. โšก

  28. ๐Ÿ”” Notification Preferences Redesign: Grouped, Sane, Scannable

    Settings screens are the unsexy part of building an app but they say so much about whether you respect a user's time. A wall of 15 toggles screams "we added these because we could." Grouped categories with master switches says "we thought about this." Small win, big signal. ๐Ÿš๏ธ

  29. ๐Ÿท๏ธ Username on Profile Completion: Real-Time Uniqueness

    This one's about reducing friction at the front door. Nobody should have to submit a form, get rejected, and retype everything just because 'alex' was taken. Now you know before you even finish typing. Tiny feature, big vibe shift. ๐Ÿท๏ธ

  30. ๐Ÿงน Frontend Component Consolidation & Dedup

    This one's been bugging me for weeks โ€” every new screen copy-pasted the same debounce+search+follow pattern and they'd slowly drift apart. "People you might know" vs "People you may know" is the kind of thing that screams "nobody owns this." Now somebody does. One hook, one button, one row. The next screen that needs user search will take 10 minutes instead of an hour. ๐Ÿงน

  31. ๐ŸŽ‚ Smart Suggestions: Scoring, Birthdays & Dismiss

    This one feels like the first time suggestions actually make sense. Before it was just "here are some random humans" โ€” now there's real signal behind every card. The dismiss button is the kind of small thing that makes a huge UX difference: you're not stuck staring at someone you already decided you don't want to follow. And birthdays? Pure delight feature. ๐ŸŽ‰

  32. ๐Ÿ’š Engagement Nudges: Free Time Celebration, Green Glow Education, New User Checklist

    The free time toast was always the weak link โ€” you do the thing we need most (declare availability) and get a 2-second green pill as a reward. Now it gets a proper moment: green glow illustration, overlapping friends, next-step CTAs. The calendar banner showing "Emma is free then!" during trip creation might be the sneakiest engagement win here though. It turns date-picking into social discovery. ๐ŸŸข

  33. โœจ Engagement Nudges: celebrations, friend overlaps, onboarding checklist

    This is the "empty room problem" PR โ€” the one that makes the app feel like something's happening even when you're the first of your friends to sign up. The green glow teaching moment is my favorite bit; instead of explaining the mechanic in a tooltip wall, we just show it to you the moment it matters. Now the map has a pulse before anyone else arrives. ๐ŸŸข

  34. ๐Ÿ”™ Revert Onboarding: Not Ready for Production

    The codebase review was brutal but honest โ€” onboarding was living in prod when it shouldn't have been. Better to pull it clean now and re-ship it properly when the flow is dialled in. 888 lines lighter feels good. ๐Ÿงน

  35. ๐Ÿ›ก๏ธ Rate Limiting on Auth: No More Brute Force

    This was the #1 finding from the codebase review. Honestly a bit embarrassing it took this long โ€” auth endpoints without rate limiting is security 101. Better late than never though. The .NET 8 built-in rate limiter is clean and zero-dependency. ๐Ÿ”’

  36. ๐Ÿ› ๏ธ IsTravelWindow Persisted: No More Fragile Computed Properties

    One of those changes where you wonder how it worked at all before. The computed property silently broke every time someone forgot to use the Location == null workaround. Now it's just a bool column โ€” simple, queryable, correct. โœ…

  37. ๐Ÿš€ Migrations in CI/CD: No More Startup Race Conditions

    The TODO comment in Program.cs has been there since day one. Finally resolved it. Need to add the PRODUCTION_DB_CONNECTION_STRING secret and test the pipeline, but the architecture is right. ๐ŸŽฏ

  38. ๐Ÿ“ Nomadic Location: GPS auto-detection & trip-end prompts

    The (0,0) hack was one of those "we'll fix it later" things from month one โ€” nomadic users literally showing up in the middle of the Atlantic Ocean. Now they get real GPS-tracked pins that update as they move between cities. The trip-end prompt is a nice fallback for people who don't want to give GPS permission. One step closer to the map actually reflecting where everyone is. ๐ŸŒ

  39. ๐Ÿ”„ Real-Time Data Sync: Close All Gaps

    This one's been bugging me for a while โ€” you'd follow someone and the suggestions just... sat there, staring at you. Now the whole app breathes together. Follow someone, the map updates, the people page updates, the explore page updates. Comments appear live for other viewers. Feels like the app is actually alive now โšก

  40. ๐Ÿ”ญ Observability Infrastructure: Sentry + Structured Logging

    Finally flying with instruments instead of blind. The Melanie Kraus incident was the wake-up call โ€” we literally could not answer "what happened" for a paying user. Now every request is logged with who did it and what they were doing, and any crash on either side lands in Sentry with full context. The free tier gives us 5K errors/month which is plenty for our scale. Next step: actually create the Sentry projects and flip the DSN switches. ๐Ÿ›ฉ๏ธ

  41. ๐Ÿ‘‹ Onboarding Flow: First Impressions Matter

    First impressions are everything. Before today, new users landed on an empty map with zero context about what Noovo even does. Now they get the story in four swipes: your friends travel, we show you where, we tell you when you overlap, and here's how to find your people. This is the difference between "what is this app" and "oh I need this." ๐ŸŒ

  42. ๐ŸŽฏ Guided Tour Onboarding: Learn by Doing

    The old carousel was a brochure nobody asked for. This version puts you in the driver's seat from second one โ€” real screens, real data, real convergence. You learn what Noovo does by actually doing it. The moment a new user sees "you're both going to the same place" with their own fake trip and the Guide's trip overlapping... that's the hook. That's the entire pitch in one tooltip. ๐ŸŽฏ

  43. ๐Ÿ” People Search: Autofill, Email/Phone, Follow States & Invite CTA

    The search was technically working but felt broken โ€” you'd type a friend's email and get nothing back, the keyboard would suggest your own email address, and there was zero indication of who you already follow. These are the kind of paper cuts that make people give up on a social feature before it clicks. The invite CTA is sneaky important too โ€” every dead-end search is now a growth opportunity instead of a dead end. ๐ŸŒฑ

  44. ๐Ÿ“‡ Contact Discovery: Find Friends Already on Noovo

    This is the one that closes the loop. Every social app that made it past launch had a contact graph moment โ€” the instant you open the app and see people you actually know. We finally have that. The hashing approach means we never store raw contacts, which keeps us clean for privacy reviews. Next up: Google Contacts API for web users and reverse-match notifications when a friend joins. ๐Ÿ—บ๏ธ

  45. ๐Ÿ–ผ๏ธ Trip Hero Images: Unsplash + Blob Cache

    This one's been cooking since the first trip card mockup โ€” trips without photos felt like empty promises. Now the app fills itself with real imagery as people use it, no manual curation needed. The lazy cache means zero upfront cost and the blob store keeps us off Unsplash rate limits. Feels like the app just got 10x more alive ๐Ÿ“ธ

  46. โœจ Frosted Glass Design System: Map Overlays Get That Apple Polish

    This is the kind of thing that makes the whole app feel like it belongs on a device. Every surface now has that quiet depth โ€” you see the map breathing behind the overlay and it just feels right. The side panels too. One design token to rule them all. ๐ŸชŸ

  47. โœจ Map Count Avatar Redesign: Pill Shape + Glimmer

    Honestly this one's been nagging me for a while. The old count circle was functional but forgettable โ€” just a white circle with a number. Now it actually tells you something: "7 ยท Paris" is way more useful than hovering to find out. The glimmer is subtle enough that it doesn't scream "look at me" but alive enough that you notice it. Small win, big feel. ๐ŸŒŸ

  48. ๐Ÿ‘ฅ Crews Go Collective: Members Can Add, Invite, Share

    This one felt like finally taking the training wheels off. Crews were always meant to be "your people" โ€” not "the owner's curated list." Now any member can pull someone in, share a link, plan a trip for the crew. The Google+ Circles mistake dies here. ๐Ÿ™Œ

  49. ๐Ÿ—บ๏ธ Above the Fold: Empty State Redesign

    Turns out the most important button on the whole app was hiding below the scroll. Classic. The frosted card floating over the map feels like it was always supposed to be there. ๐ŸŒ

  50. ๐Ÿค Invite Friends: Post-Signup Social Sharing

    This one's been on my mind since day one โ€” the whole point of Noovo is seeing where your friends are headed, so if nobody you know is on it, there's no magic. Putting the invite right in the onboarding funnel instead of hiding it three taps deep in Settings is the kind of thing that should've been there from the start. Let's see if it moves the needle on early friend graphs ๐Ÿš€

  51. ๐Ÿ‘ค You Tab โ†’ Own Profile Landing

    This one was overdue. The "You" tab showing a settings list was like opening your Instagram profile and seeing a preferences form. Now it actually shows YOU โ€” your travel identity, your people, your plans. The gear icon is right there if you need settings, but the default view is finally what it should be. Also snuck in shared hooks to kill the copy-paste between own-profile and other-user-profile screens. Clean. ๐Ÿงน

  52. ๐Ÿ“ Map Avatar Clustering: Unified Pipeline

    There's something satisfying about watching scattered dots on a map finally snap into place. Two rendering pipelines becoming one โ€” it's the kind of cleanup that makes you wonder why it wasn't always this way. Now your friends cluster together whether they're globe-trotting or couch-surfing, and Germany stays firmly in Europe where it belongs. ๐Ÿ—บ๏ธ

  53. ๐Ÿ—บ๏ธ Unified Map Clustering & Timeline Polish

    Turns out having two separate rendering pipelines for "people on trips" and "people at home" was the map equivalent of maintaining two address books. Now it's one pipeline, one clustering algorithm, and friends just show up where they are. Also finally caught that react-native-web has been quietly serving system fonts this whole time instead of Plus Jakarta Sans. Every Text element on the app was living a lie. Not anymore. ๐Ÿ”

  54. ๐Ÿ’Š Convergence Pill: Ambient Over Interruptive

    The old card was trying too hard. Popping in between two components like an eager waiter โ€” 'Excuse me, your friends are travelling!' Now it's a quiet pill at the bottom of the map. You notice it when you're ready to notice it. That's the Noovo way. ๐Ÿ’Š

  55. ๐Ÿชบ Travel Windows: "I'm Free" Date Ranges

    This is the first step toward decoupling the who/where/when axes of trip planning. Most apps force you to know everything upfront โ€” we're saying "just tell us when you're free and we'll do the rest." The notification loop where a friend's trip triggers your travel window is where the magic lives. ๐Ÿชบ

  56. โšก Backend Performance: 4 queries โ†’ 1, indexes, AsNoTracking

    Four database calls to load a profile? That's like driving to four different stores for ingredients when one supermarket has everything. Single query with subqueries is the way. The AsNoTracking sweep was long overdue too โ€” we were tracking entities we never intended to modify. โšก

  57. ๐Ÿ—บ๏ธ Map Avatar Declutter: Pixel-Based Spread & Fan-Out

    This one's been bugging me since the first time three friends went to Barcelona and the map showed what looked like a crimson smudge. Union-find for merging overlapping pins felt like overkill until I realized it handles transitive overlaps perfectly โ€” A overlaps B, B overlaps C, so they all merge. The fan-out ring animation is genuinely satisfying to click. ๐ŸŽฏ

  58. ๐Ÿงฉ Free Time breaks free: separate entity, separate UX

    This one felt like untangling a knot. Free time pretending to be a trip was causing confusion everywhere โ€” in the data model, in the UI copy, in the profile display. Now it stands on its own, and the auto-split logic is genuinely satisfying: book a trip that lands in your free window, and the system just figures it out. The green "Free" badges on the map are a nice touch too โ€” you can see at a glance who's available. This is how convergence starts. ๐Ÿงฉ

  59. ๐Ÿ—บ๏ธ Map Inline Views: Trip/Profile Panel Overlay

    This one feels like a real UX upgrade. Navigating away from the map to see trip details always felt jarring โ€” you lose your bearings. Now the map stays put and the details slide in from the right like a proper desktop app. The trick of wrapping an independent NavigationContainer means we got this for free without touching any existing screens. Small change, big feel difference ๐Ÿ—บ๏ธ

  60. ๐Ÿ—บ๏ธ Map Pill Fix: Smaller, Tooltip, Default On

    Classic case of the migration saying one thing and the model saying another. Every single user had the Everyone view locked without knowing why. Now it just works โ€” and if someone does turn it off, they'll actually understand what to do when they tap that lock. Small fix, big difference in first impressions. ๐Ÿ”“

  61. โœจ Frosted Glass: Map Surfaces Get Transparency

    This is one of those changes where the before/after is subtle but the feel is completely different. The map stops being a background behind opaque boxes and starts being a surface that everything floats above. First time the /product-design and /uiux skills reviewed the plan before implementation โ€” caught a blur radius issue that would have shipped blurry map labels bleeding through the sheet. Design review pays for itself โœจ

  62. ๐Ÿ‘† Touch-to-Expand: Mobile Web Hover Parity

    Embarrassing how long the catalogue was just... dead on mobile web. Hover-only interactions are a desktop trap โ€” you build for the device in front of you and forget half your users can't even see what you shipped. The chevron nudge is a nice touch (pun intended). Now every phone user gets the same 'oh, that's where Sarah's going' moment. ๐Ÿ“ฑ

  63. ๐Ÿ‘ป Ghost Avatar Bleeds: Off-Screen Pin Presence

    This one's subtle but it changes how the map feels. Instead of chevron dots saying "something's over there," you now see actual faces bleeding in from the edge โ€” your friend's photo materializing as you drift toward them. The map stops being a tool and starts being a living thing that reaches for you. ๐Ÿ‘ป

  64. ๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘ Groups โ†’ Crews: Trip-Centric Redesign

    "Group" was doing absolutely nothing for us โ€” it's the word every app uses for everything. "Crew" actually sounds like people who travel together. And making trips the hero of the crew page instead of a flat contacts list? Should've done this from the start. The empty state โ†’ plan a trip loop is the real win here. ๐Ÿงณ

  65. ๐Ÿ“… Calendar Date Picker: No More Typing yyyy-MM-DD

    Asking someone to type a date in ISO format on a phone keyboard is borderline hostile UX. The kind of thing where you know it's bad but keep shipping other stuff because 'it works.' Finally fixed it. Tapping a calendar grid and seeing your trip range light up in crimson just feels right. ๐Ÿ“†

  66. ๐Ÿ”ง Audit Fixes: Unsubscribe, Resend, Personalization, Illustration

    This is the kind of thing that separates shipping fast from shipping sloppy. Four PRs went out without being checked against the spec โ€” not catastrophic, but the kind of drift that compounds. Unsubscribe links missing from half the waitlist emails, the verification flow still on deprecated SMTP while everything else moved to Resend, actor names rendered as plain text when the spec literally says "crimson profile link." Caught it all in one pass, fixed it in one PR. Feels good to close the loop. ๐Ÿงน

  67. ๐Ÿ“ง Email Unsubscribe

    The boring-but-essential kind of shipping. Every email we send now has a proper unsubscribe link โ€” no dark patterns, no hoops. Just one click and you're out. Building trust one footer at a time ๐Ÿ’Œ

  68. ๐Ÿ“ง Google Workspace email setup

    Finally got around to this one. It's one of those invisible things that makes everything feel more real โ€” when someone replies to a Noovo email and it actually lands in a proper inbox instead of bouncing off a noreply wall. Small step, big difference in how legit the whole thing feels. ๐Ÿ“ฌ

  69. ๐Ÿค Invite Friends to Trip

    This one feels like a turning point. The backend for trip invitations has been sitting there for weeks, fully built but invisible to users. Now it's alive โ€” search a friend, tap invite, done. The social layer of Noovo is finally starting to breathe. ๐ŸŒŸ

  70. ๐Ÿ“จ Invite Friends: Empty State Growth Loop

    This is probably the most important screen in the whole app and nobody will ever screenshot it. The empty state is where churn lives โ€” if someone opens Noovo and sees nothing, they leave. Now they see "Your map is quiet" with one-tap ways to fill it. The SMS pre-compose with the referral link is the real unlock here. ๐Ÿ“ฉ

  71. ๐Ÿ“ง Personalized Email Templates: Every Notification Type Gets Its Own Voice

    Emails were the one part of Noovo that still felt like a generic SaaS robot wrote them. Every notification type was the same template with a different title jammed in. Now a convergence alert actually feels urgent, a welcome email actually onboards you, and a follow notification actually makes you want to check who it is. Small thing, big difference in how the app feels when it lands in your inbox. ๐Ÿ“ฌ

  72. ๐ŸŽจ OG Cards Get a Glow-Up: Plus Jakarta Sans + Branded Layouts

    Arial on a social card is like showing up to a pitch meeting in sweatpants. The OG card is literally the first thing someone sees when a link gets shared โ€” it's free advertising, and we were running it in a system font on a blank canvas. Now every shared trip link actually looks like it came from a real product. Next up: destination photos when we integrate a proper photo API. ๐ŸŽจ

  73. ๐Ÿ—บ๏ธ Enhanced Map View: Bottom Sheet, Filters & Toggle

    This is the moment the map stops being a decoration and starts being a destination. Users can now browse, filter, and preview trips without ever leaving the map โ€” that's the kind of low-friction browsing that keeps people exploring. The bottom sheet pattern especially feels right: it rewards curiosity without punishing it with a full page load. ๐Ÿ—บ๏ธ

  74. ๐Ÿ‘ฅ Profile Glow-Up: Companions, Free Hints, Own-Profile Polish

    This is the one that makes the profile feel alive. Seeing who you've actually traveled with โ€” not just who you follow โ€” that's the real social graph. And the "You're free then!" nudge? That's the pull. You see your friend's upcoming trip, you realize nothing's stopping you, and suddenly you're thinking about it. That's how trips happen. โœˆ๏ธ

  75. โœจ Skeleton Crew: Empty States & Loading Shimmer

    This one felt like cleaning the house before guests arrive. Every screen had its own little version of "nothing here" โ€” some with icons, some without, most just plain text floating in space. Now there's one component that handles it all, and the skeletons actually pulse instead of sitting there like dead pixels. Small thing, but the app feels alive even when it's empty. โœจ

  76. ๐Ÿ›ก๏ธ Error Boundaries & Toast Notifications

    This one's been bugging me for a while. Every screen was doing its own thing with errors โ€” some showed alerts, some set inline state, some just swallowed failures silently. Now the API client itself fires toasts, so every single request failure gets surfaced to the user automatically. Screens can still keep inline error state where it makes sense, but the baseline experience is: if something breaks, you'll know. Clean separation. ๐ŸŽฏ

  77. ๐Ÿ“ฑ Ready for the Stores: App Store Prep

    It's funny how the moment you write the store listing, the whole product crystallizes. You realize what you're actually selling isn't a map or a notification โ€” it's the feeling of "wait, you were THERE too?!" turned into "let's make sure that never happens again." One eas build command away from being real. ๐Ÿš€

  78. ๐Ÿ“ฆ Ship It: Android Build Pipeline

    This one was a grind. Every layer of the stack had its own opinion about where Node lives, where the monorepo root is, and which Kotlin version is blessed. But now we own the build โ€” cloud and local. No more black-box EAS-only pipeline. When Google says go, we push one button. ๐Ÿš€

  79. ๐Ÿงญ Travel Passport: Profile Screen Enhancement

    This is the change that makes profiles actually worth visiting. Before this, tapping someone's profile was a dead end โ€” name, bio, follow button, done. Now it tells a story: where they've been, where they're going, and whether your paths might cross. The convergence banner is the secret weapon โ€” seeing "You're both in Tokyo!" on a friend's profile is the moment Noovo stops being a trip list and starts being something magical. ๐ŸŒ

  80. ๐Ÿ’ฌ Talk Back: Trip Comments & Reactions

    This one feels like a turning point. Trips were always a bit lonely โ€” you'd post one and it'd just... sit there. Now people can actually react, drop a comment, start a conversation. It's the difference between a bulletin board and a group chat. The social flywheel starts spinning here. ๐Ÿ”ฅ

  81. ๐ŸŽจ Show the World: OG Card Rendering

    This one's about presence. Every shared link is a tiny ambassador for Noovo โ€” and now it looks the part. The crimson strip, the avatar, the dates... it's not just a link, it's an invitation. Next up: share infrastructure to wire these cards into the actual sharing flow. ๐ŸŽจ

  82. ๐Ÿ”— Share Infrastructure: OG Tags, Deep Links & Social Previews

    Sharing is the growth lever. If a trip link looks like a bare URL in a WhatsApp chat, nobody clicks it. Now it renders a proper card with the destination, dates, and who's going โ€” that's the kind of thing that makes someone think "wait, I should be on this app too." Deep links close the loop: tap the card, land on the trip. First real viral surface. ๐ŸŒ

  83. ๐Ÿ—บ๏ธ Friends Also Going: Trip Overlap Detection

    This is the feature that makes Noovo feel alive. Before, we were doing overlap detection on the client with whatever trips happened to be in the feed cache. Now the server knows about every visible trip from every friend โ€” proper visibility checks, proper geo math. When you open a trip and see "Friends also going," that's the moment the Living Map stops being a concept and starts being real. ๐ŸŒ

  84. ๐Ÿ  Almost Detection: Friend Near Home

    This one feels like unlocking a second dimension of convergence. The original engine only sees trip-to-trip โ€” two travelers crossing paths abroad. But the most natural overlap is the one nobody plans: your friend just happens to be visiting your city. Now Noovo catches that too, quietly scanning in the background. The home base is the anchor point, and every friend's trip is a potential pull. ๐Ÿ โœจ

  85. ๐Ÿ“ธ Say Cheese: Profile Photo Upload

    There's something about putting a face to a profile that makes the whole app feel more alive. Until now everyone was just initials in a colored circle โ€” functional but soulless. Now when you scroll through your trip and see your friends' actual faces, it feels like people are really there. The Avatar component with its initials fallback means the transition is graceful too โ€” no broken images, just a smooth upgrade from anonymous to personal. ๐Ÿ“ท

  86. ๐Ÿ‘ฅ Follow Lists: See Whoโ€™s Watching

    This one feels like the app is finally becoming social for real. Seeing follower lists makes the connections tangible โ€” itโ€™s not just a count anymore, itโ€™s faces and names. The email leak catch was a good reminder to stay sharp on privacy as we open up the social graph. ๐Ÿ”’

  87. ๐Ÿ‘ฅ Groups API: Your Crew, Your Rules

    This one feels like a turning point. Up until now trips were these isolated things you could only share via visibility toggles. Groups flip that โ€” now you build your crew first, then share naturally. Itโ€™s the difference between broadcasting and actually planning together. The social graph just got real. ๐Ÿš€

  88. ๐Ÿ”” Notifications Convergence Layer: Filter, Detect, Invite

    This one matters because itโ€™s the first time notifications actually feel like they belong to a travel app instead of a generic feed. The near-miss detection is the quiet star here โ€” telling someone theyโ€™re three days away from crossing paths with a friend is the kind of nudge that turns a solo trip into a reunion. Filter tabs make the screen liveable at scale, and inline invite actions remove a whole navigation round-trip. Building momentum ๐ŸŒ

  89. ๐Ÿ‘ซ Groups Screens: Your Crew Has a Home Now

    Two PRs in one day โ€” backend and frontend, back to back. Groups are the missing glue between "I have friends on Noovo" and "I actually share trips with my people." It's wild how much more real the app feels when you can name your crew and manage who sees what. The social layer went from abstract to tangible today. ๐ŸŒŸ

  90. ๐Ÿ›ก๏ธ Architecture Hardening: Scale-Ready Foundations

    This is the kind of work that doesn't get you demo-day applause but saves you from 3am production fires. Every one of those 34 int.Parse("0") fallbacks was a ticking time bomb โ€” one bad JWT and you're silently operating on the wrong user's data. Now it throws loud and clear. The email leak was another quiet one โ€” anyone viewing a profile could see the owner's email address. These are the patterns you fix before your first real users, not after. ๐Ÿ›ก๏ธ

  91. ๐Ÿ”€ Convergence Service: Trip Overlap Detection

    This is the heartbeat of what makes Noovo different. Every other travel app helps you plan alone โ€” convergence tells you when youโ€™re about to be in the same place as your people. Haversine math, 80km radius, instant notifications. The โ€œwait, youโ€™re going to Barcelona too?!โ€ moment, automated. โœจ

  92. ๐Ÿ‘๏ธ Trip Visibility Controls: Who Can See Your Trips

    This is one of those features you donโ€™t notice until itโ€™s missing. People need to feel safe sharing their plans before theyโ€™ll share at all. A tiny lock icon on a trip card says more than a paragraph of privacy policy. Trust is the foundation of social travel. ๐Ÿ”’

  93. ๐Ÿ”ญ Explore Screen: Social Discovery Feed

    Before this, Explore was a ghost town with a guilt-trip message. Now itโ€™s the page you actually want to open โ€” where are my friends going, whatโ€™s trending, whoโ€™s overlapping with me. Zero backend changes, all intelligence computed client-side. The feed is the product now. ๐ŸŒ

  94. ๐Ÿ” Find Your People: User Search & Discovery lands in the Explore tab

    This one felt overdue. The Explore tab has been staring at us since day one, just saying โ€œyour circle is quiet.โ€ Now it actually helps you find people. The social loop is finally closed โ€” search, follow, see their trips. Simple but essential plumbing for everything that comes next. ๐Ÿ”

  1. โœ๏ธ Your Trips, Your Rules: Edit & Delete

    It's the little things that make an app feel real. Being able to fix a typo in your trip title or nuke a plan that fell through โ€” that's not a feature, that's respect for the user. Also lowkey proud of how clean the shared TripForm came out. One component, two screens, zero duplication. โœจ

  2. ๐Ÿ—บ๏ธ Living Map: Avatars, Smooth Panning & Who's Going

    This is the one where the map stopped feeling like a data viz and started feeling like a window into your friends' lives. Seeing actual faces on the globe instead of letters -- turns out that's the whole difference between "oh cool, a map" and "wait, Sarah's in Tokyo right now?!" โœจ

  3. ๐Ÿ  Home Screen Polish: Empty States & Convergence

    There's something poetic about an empty state. It's the first thing a new user sees โ€” before any trips, before any friends. That blank screen is your one shot at a first impression, and "Your world is quiet" with a gentle nudge to start exploring feels so much better than... nothing. The convergence card is the real magic though โ€” the app is starting to think for you. ๐ŸŒ

  4. ๐ŸŽจ Trip Detail gets the full treatment: hero header, convergence, mini-map

    Trip detail was the last screen that felt like a developer built it instead of a traveler. The hero gradient, the flag emoji, the โ€œothers nearbyโ€ section โ€” this is where the app starts to feel like it has a soul. You open a trip and immediately feel the excitement of where youโ€™re headed. Thatโ€™s the whole point. โœˆ๏ธ

  5. ๐Ÿ“ City-Level Location: Privacy-First Autocomplete

    This one felt like a design decision disguised as a feature task. We could've gone full precise-location from day one, but that's the kind of thing that scares users away before they even try the app. City-level is how people actually talk about travel โ€” "I'm going to Barcelona", not "I'm at 41.38ยฐN". The structured country codes we're storing now will make convergence matching dead simple when we get there. Privacy as a feature, not an afterthought. ๐ŸŒ

  6. ๐Ÿ—บ๏ธ Map Viewport Overhaul: Stable View, Trip Arrows & Timeline Scrubber

    This one felt like finally giving the map a soul. Before, the viewport was fighting you every time new trips loaded โ€” now it just... stays put and lets you explore. The off-screen arrows are my favorite touch though โ€” your friends' trips are always calling to you from the edges of the screen like little beacons. ๐Ÿงญ

  7. ๐Ÿ—ฃ๏ธ Copy Audit: Every Error Now Sounds Like Us

    The little things are the brand. Nobody remembers your loading spinner, but they remember how it felt when something broke โ€” did the app bark at them or did it just say "Try again?" like a friend would. Twenty-eight messages rewritten, and now they all sound like us. ๐ŸŽค

  8. ๐Ÿ—บ๏ธ Plan It: The Trip Wizard Is Live

    Three steps to put yourself on the map. The convergence hints are the quiet magic โ€” you're picking dates and the app just casually tells you Sarah's already there that week. That's the moment someone goes from "planning a trip" to "planning a trip together." That's the whole point. โœจ

  9. ๐Ÿ—บ๏ธ The Living Map: Home Screen Reimagined

    This one felt like finding the shape of the thing. The three pillars were always there conceptually, but now they live in the same surface โ€” you don't choose Who, Where, or When, you just interact and the right one finds you. That moment when you scrub the timeline and watch friend dots converge on Barcelona? That's the app doing the social math you can't do in your head. That's Noovo. ๐ŸŒ

  10. Map / Explore / Plan / Alerts / You: the tab bar speaks Noovo now

    The moment an app stops sounding like every other app is the moment it starts feeling like yours. "Sign in to see your map" hits different than "Use your email and password to sign in." ๐Ÿ—บ๏ธ

  11. ๐Ÿ“ Location autocomplete lands: the map now understands where you mean

    Typing "Tel Aviv" and watching it resolve to a dot on the map with real coordinates feels like the moment the app stops being a form and starts being a planning tool. The placeId is the thread that ties everything together. ๐Ÿงต

  12. โšก Throttle Resend emails + retry failed sends

    The emails were firing as fast as the code could loop โ€” fine for 5 signups, not so fine for 500. Now there's a proper speed limit (2/sec, matching Resend's cap) and failed sends actually get retried instead of vanishing into the void. The mark-after-send flip is the quiet hero here โ€” no more "we said we sent it but we didn't" situations. โšก

  13. ๐Ÿ› ๏ธ Skill Glow-Up: Richer Notion Timeline Entries

    It's the little things, honestly. Every PR used to drop a bland "Work" tag into the timeline and call it a day. Now each entry actually reads like something a human wrote at 2am while feeling proud of what they shipped. The tools that build the tools deserve love too. โœจ

  14. ๐Ÿ’Š Brand Evolution: Real Connection & Spark-to-Pull

    Today the brand found its backbone. "We build for the trip, not the feed" isn't just a tagline โ€” it's the answer to "what kind of company are we building?" Every trip starts with a pull now. And honestly? It always did. We just finally named it right. ๐Ÿ’ช

  15. ๐Ÿ““ Started inviting the first few ppl to the wait list

    Now that this is basically done - next is socials and then back to development ๐Ÿ˜Š

  16. โœจ Waitlist Copy Refresh & UI Polish

    Words matter. We went through every single line on the landing page and asked: does this make someone excited to travel, or anxious about what they're missing? The answer was clear โ€” flip the script. Now every sentence leans forward instead of looking back. Also, that little logo in the corner? It knows when to blend in. Subtle flex. โœจโœˆ๏ธ

  17. ๐ŸŽจ Landing page overhaul + brand voice rebrand

    The landing page finally sounds like Noovo. Every section rewritten spark-first, three pillars woven through the whole thing. The hero image swap was the cherry on top โ€” friends from behind looking out at the world, not a 3D render of someone else's app. This one felt like finding the voice. ๐ŸŽคโœจ

  18. Brand identity design pass

    21 commits, one for each design fix, so we can revert any that don't feel right. The milestone ladder might be my favourite thing we've shipped โ€” it actually makes you want to invite friends now โœจ

  19. ๐ŸŽจ Waitlist page redesign v2

    Scroll down and the world moves with you โ€” stories glide in from the left, features drift from the right, and the hero image stays loyal in the background like a best friend who never leaves. Real sign-up numbers replaced the placeholder thousands. The landing page stopped performing and started being. ๐ŸŽจ

  20. ๐Ÿ”ฅ Amass Your Homies: Waitlist Rebrand

    โ€˜Skip the lineโ€™ was fine, but โ€˜amass your homiesโ€™ is us. The waitlist stopped being a queue and became a crew recruitment mission. Founding Crew at 5, Inner Circle at 10 โ€” even the tier names sound like friend groups. And the emails actually deliver now, which helps. ๐Ÿ”ฅ

  21. ๐ŸŒ noovotravel.com is home: domain migration complete

    We finally have our own place. No more couch-surfing on a subdomain โ€” noovotravel.com is ours, the lights are on, and the welcome mat is out. Feels like moving into your first apartment. ๐Ÿ ๐Ÿ”‘

  22. ๐Ÿ“ง Waitlist email automation: nurture sequences & analytics

    The waitlist now sends love letters on autopilot. Day 3: "hey, remember us?" Day 7: "look how pretty we are." Day 14: "seriously, bring your friends." โœ‰๏ธโค๏ธ

  23. ๐Ÿ“ฑ All country codes + searchable phone picker: global phone auth

    From 3 countries to 200+. The whole world just got an invitation to the party. ๐ŸŒ๐ŸŽ‰

  24. ๐Ÿ”— Post-signup viral loop: share, track, climb the waitlist

    Sign up, see your spot, share the link, watch yourself climb. This is the moment the waitlist stops being a list and starts being a game. ๐Ÿš€

  25. ๐ŸŽจ Landing page gets a glow-up: Noovo brand identity + built-in-public timeline

    From 'generic startup blue' to 'this is actually Noovo.' The landing page finally looks like it belongs to the brand it represents. Plus Jakarta Sans hits different, the warm neutrals feel like home, and that auto-updating timeline? Every ship is a story now. The best part: future PRs write themselves onto the page. Literally. Ship it. ๐Ÿš€

  26. ๐Ÿ“ก Notion-backed public timeline API

  27. Editorial luxury landing page: fixed hero, marquee, snap-scroll carousels

  28. ๐Ÿ—บ๏ธ Home screen with map, profile editing & rewards system

    Open the app and see a MAP with your TRIPS on it. This is the moment it stopped feeling like a tech project and started feeling like a product. Weโ€™re cooking. ๐Ÿ‘จโ€๐Ÿณ๐Ÿ”ฅ

  29. ๐Ÿ“ž Firebase Phone Auth: bye bye Twilio

    Twilio charged per SMS. Firebase does it for free. Sometimes breaking up really is an upgrade. ๐Ÿ’”โžก๏ธ๐Ÿ’š

  30. ๐Ÿงญ React Navigation & app shell: real app UX

  31. ๐ŸŽจ Design system born: theme tokens & Ionicons

  32. ๐Ÿš€ Waitlist landing page goes live: the viral engine begins

  33. ๐Ÿ“ˆ Google spark โ†’ Google blaze account

    Firebase's free tier got us through the door, but phone auth needs the Blaze plan. Set up spend alerts at $1, $2, $3 because nobody wants a surprise cloud bill โ€” especially not when you're pre-revenue and every dollar is runway. ๐Ÿ”ฅ

  34. ๐Ÿ“ž Phone auth hardening: validation fix + profile completion + autofill

    Your phone knows your number better than you do. Now our app does too. No more fumbling with country codes โ€” just tap, autofill, done. ๐Ÿ“ฑโœจ

  35. โœ‰๏ธ Email verification & OAuth trifecta complete

    Google, Facebook, email+password โ€” the auth holy trinity is complete. Also added email verification because trust issues are a feature, not a bug. ๐Ÿ”’

  36. ๐Ÿช„ Claude Code Max - Mooore Power!!

    Went from Pro to Max because the context window kept running out mid-feature. Turns out when you're building an entire app with AI, you need the AI to remember what it built yesterday. The upgrade paid for itself in the first session. โšก

  37. ๐Ÿ‘ค Facebook Login goes live: OAuth family grows

    Zuckerbergโ€™s login button now graces our app. Had to write a privacy policy and a data deletion page to get here. Worth it for that sweet blue F. ๐Ÿ”ต

  38. ๐Ÿ•ธ๏ธ Registered.dev domain

    Registered Chuvali.dev on Porkbun.com with password doubled

  39. โ˜๏ธ Added Azure free trial account

    $200 worth of credit for 30 days + infra for BE deployment

  40. ๐Ÿ’ป App runs in the browser: web compatibility achieved

    "Will it run in a browser?" asked no one, because we just made it happen anyway. SecureStore on native, localStorage on web. Smooth like butter. ๐Ÿงˆ

  41. ๐Ÿ”” Notification system: in-app, email, push & real-time via SignalR

    In-app, email, push, AND real-time? In one day? The AI agents earned their electricity bill today. Somebody get them a raise. โšก

  42. ๐Ÿ”Œ Frontend meets backend: data layer wired up

    The frontend and backend finally shook hands. Data started flowing. It felt like introducing two friends who immediately hit it off. ๐Ÿค

  43. ๐Ÿ” First login ever! Authentication system goes live

    Typed in a username and password. Clicked login. Got a JWT back. Stared at it for 5 minutes like it was a winning lottery ticket. ๐ŸŽŸ๏ธ

  44. ๐ŸŒ noovo.chuvali.dev is born: deployed to Vercel

    Sent the link to exactly one person (myself, on another device). Refreshed 47 times. It worked every single time. Unreasonably proud. ๐ŸŒ

  45. ๐Ÿค– Got Claude Pro account to use Claude Code

    The moment the team doubled โ€” from one human to one human and an AI that never sleeps. Claude Pro was the unlock that let us move at startup speed without a startup headcount. Best $20/month ever spent. ๐Ÿค–

  46. ๐Ÿ—๏ธ Backend foundations: trips crud, social graph & groups

    Trips, friends, groups โ€” all the social plumbing nobody sees but everyone needs. The unglamorous hero of Day 1. ๐Ÿ› ๏ธ

  47. ๐Ÿ“ฑ Frontend born: Expo React Native app scaffolded

    Sheโ€™s not much to look at yet, but sheโ€™s ours. First pixels on screen โ€” the emotional equivalent of hearing a baby cry for the first time. ๐Ÿ‘ถ

  48. ๐Ÿค– AI dev team assembled: 7 specialist agents reporting for duty

    One developer walks into a bar. Seven AI agents follow. The bartender asks "whoโ€™s paying?" Anthropic, probably. ๐Ÿค–๐Ÿบ

  49. ๐Ÿ’ญ Hosting - Decided on Vercel

    The first real infrastructure decision. Vercel for the frontend because it just works โ€” push to main and it's live. No Docker, no YAML rituals, no "works on my machine." For a two-person-and-some-AI team, velocity beats customization every time. ๐Ÿš€

  50. ๐ŸŒฑ First commit, first dream: project initialized

    Every empire starts with a single line of code. This one started with dotnet new. Look at us now โœจ