Public Build
Built in the open.
We're building Noovo in the open. Every feature, every milestone. You see it all.
-
π Lights Off, Everywhere: the website finally does dark mode
Nothing wakes you up at midnight quite like opening an article and getting flashbanged by warm white. Small thing, but it's the kind of seam that makes an app and its website feel like two different products. Now they feel like one. π
-
π Crash Reports: getting the names back
You cannot debug what you cannot read, and for a few builds my crash dashboard looked busy while telling me nothing at all. The upload is deliberately opt-in: no token, no upload, build still green, because the only thing worse than unreadable crashes is a release that refuses to build. The last mile is a token I still have to create by hand, so for now call it wired rather than proven. π
-
π One City, Three Names
The part I keep turning over: we had already built canonical place keys, a merge pass, a search fold. All of it on, all of it working, and none of it anywhere near the code that was actually annoying me. The notification just took the string the geocoder handed it and ran. Three good features cannot cover for one path that never called them. πΊοΈ
-
π°οΈ You Haven't Been There Yet: Place Stats Fixed
A wrong number is worse than no number. If Noovo tells you three friends have been to Lisbon and one of them is still packing, you quietly stop believing the rest of the page too. Small bugs with an expensive side effect. π
-
ποΈ Mikey and 2 Others Are Going
The plan for this was written before we knew about the licensing, and it said to hang the Going on the event's id. Borrowed events do not have one. So as written, the feature would have worked on exactly the handful of events we typed in by hand and none of the ones anybody would actually want to go to. A good reminder that a roadmap entry from six weeks ago is a hypothesis, not an instruction. ποΈ
-
ποΈ The Button That Sends You Away
Nearly shipped a dead button. The sheet was listening for "open this event" from the notifications screen, but a tap on a push notification gets handled above the navigator, before any screen exists at all, so on a cold start that tap would have opened precisely nothing. Moved the listener up next to the chat widget, which had already solved the identical problem and which I should have copied in the first place. ποΈ
-
ποΈ Because You Both Surf: interests finally do something
Spent longer on the sentence than on the matching. When the message runs out of room something has to give, and it is always the event title, never the reason. "Because you and Mikey both enjoy surfing" is why anyone opens it. A truncated festival name with no explanation is just noise. Also caught myself letting it name an interest the event didn't actually have, which would have been a small confident lie landing every morning. ποΈ
-
πͺ Sign-up: seeing where people step out
Nobody opens a travel app hoping to text a business on WhatsApp before they've even picked a photo. I wanted to fix the step and stop guessing, so the next time someone drifts off I'll know exactly where. Turns out asking nicely is a feature. πͺ
-
β You're Both Into Coffee: Interests on the Profile
Most of this epic shipped without a single person seeing anything, which is a strange way to build. The list of interests was never the point. The point is the line that says you're both into Diving, because that is a conversation nobody was going to start otherwise. β
-
π Plumbing: nothing to see here yet
Almost shipped a bug where saving your interests wiped them from the graph a second later, because the save path deletes every row and re-adds the ones that survived. Copying that logic across would have removed the connections it had just made, then quietly patched itself overnight on the repair pass, which is the kind of bug that hides instead of announcing itself. Worth it though: Events only works if the app already knows what you care about and where you'll be, so a boring change now buys an interesting one later. π€Ώ
-
π€Ώ Also into Diving: interests break the tie
The change I like most here is the one that made the feature smaller. A shared hobby is a good reason to look twice at someone and a bad reason to put them ahead of the friend of a friend you were always going to click with. Interests get a nudge, not a vote. Next job is giving those interests somewhere real to go π€Ώ
-
π¬ Every Trip Gets a Room
The trip chat is the one I actually wanted. A trip is already a group of people who agreed to be somewhere together, so making them go and build a group chat by hand was asking them to redo work the app already knew about. It still waits for the first message, because a room nobody talks in is just a row in a table. ποΈ
-
π Circles Catches Up On Its Own
I spent a week blaming cold starts. The server was fine. It was us, opening the app like a door kicked in and then never asking again. Now we knock, wait our turn, and keep listening. πͺ
-
π Push Notifications Now Open the Trip
The annoying part of this bug is that it was invisible in every screenshot and every demo. The app looked fine, the notification looked fine, it just quietly went nowhere the moment you actually tapped it on your phone. Glad this one's closed π
-
β° A Nudge for the Quiet Ones
Half feature, half archaeology through my own unmerged work. Turns out I'd already solved "why do pushes stop arriving for dormant users" once and just forgot to ship it. Merging that one next. π°οΈ
-
π· The Blog Stops Being a Wall of Text
-
π Finishing What I Already Started
The most humbling kind of bug report is finding out you already solved it once. ποΈ
-
π Five Logins a Minute for Everyone (Fixed)
None of these bit anyone yet, which is exactly the problem: they only show up the day two people sign up in the same minute. I would rather find them in a quiet week than read about them in Sentry the morning after a launch post. Boring PR, sleeping better. ποΈ
-
π©Ή Every button now does what it says
A button that looks like it works but does nothing is worse than one that is plainly broken. At least a broken one tells you. The part I actually care about is the guard test underneath: from now on, if anyone reaches for the OS alert again, the build fails before it ever reaches a phone. Quiet fixes, loud guardrails. π
-
π§± The Frontend Gets Guardrails
Every bug in this PR is one I would have found eventually, one at a time, from a confused message in the WhatsApp group. The gate is the part that matters. It catches the next hundred while I sleep. π§±
-
ποΈ The Rematch: 100 at Once, Zero Crashes
There is a specific kind of satisfaction in recreating the worst day your infrastructure ever had and watching it shrug. The best part of the receipt is the last line: staying on the five dollar database plan, because the fix was never about capacity. Some victories you buy. The good ones you engineer ποΈ
-
π‘οΈ One User, Thirty Database Workers: Never Again
Funny thing about building a social app: your first power user of the day is also your first load test, and mine arrived before breakfast. I spent the morning reading the crash logs like a detective novel where the culprit turns out to be my own event pipeline. Bursts are love. The system just needed to learn to receive it π‘οΈ
-
π§ Teaching the Server to Say "One Moment, Please"
Turns out the fix for a system that panics under pressure is the same as for a person: know your capacity, say no gracefully, and trust that the other side will come back in a moment. I taught my server boundaries this week. Therapists would charge more π§
-
π₯ The room where it happens
Flipping the flag felt bigger than shipping the code. Four PRs of invisible plumbing and now there is a bubble on the screen that was not there yesterday. Next up: making it feel as good as it works π
-
β¨ We sweated the three dots
Table stakes are strange to build: nobody will ever praise a typing indicator, but everyone would notice a chat without one. Polish is the tax a feature pays to read as normal. Paid in full π§Ύ
-
π¬ Chat learned to whisper
Funny thing about building chat: the hard part was not making it loud, it was making it quiet. Anyone can blast a push per message, the craft is knowing you are already reading the room and saying nothing. Two bricks down, the visible one is next π§±
-
π¬ A bubble you can actually poke
The fun part of optimistic UI: the message has to appear before the server has heard of it, then quietly become real. Get it right and nobody notices anything happened, which is the whole point. Plumbing that aspires to be invisible π
-
π¬ Chat: The Foundation Is In
Funny how messaging feels like table stakes until you sit down to build it. Read cursors, group roles, what happens when a group owner deletes their account, all of it needs an answer before the first bubble ever renders. Foundations first, bubbles next π¬
-
πΎ Somewhere in Japan, now actually on the map
Classic bug shape: the feature was finished and standing behind a door that never opened. The filter ran first and quietly threw away every trip it was built for. The fun kind of fix, where everything already worked and just needed the door unlocked πΊοΈ
-
πΈοΈ Open Settings, But Make It Web-Safe
My favorite detail is that the error handler was sitting right there, ready to catch a failure that arrived faster than promises allow. Sometimes the fix is one line and the story is the whole point. πΈοΈ
-
β Fixed the frozen landing page background
My favorite kind of bug: math that is perfectly fine until time runs backwards. The browser was technically correct to refuse a negative circle, I just wish it had not taken the whole sky down with it. β
-
πΈοΈ The Social Graph Gets a Real Graph
A social travel app was always secretly a graph problem wearing a spreadsheet costume. Nobody will ever see this ship, but the part of Noovo that figures out who you should be traveling with now thinks in hops instead of joins. Quietly one of my favorite kinds of milestone: invisible today, load-bearing forever. πΈοΈ
-
π§ 28 friends were not in Caesarea
The math was right and the sentence was wrong, which is somehow worse. A notification only earns its buzz if it tells you something you did not already know, and my friends living twenty minutes away did not qualify. πΊοΈ
-
β‘ The create button stopped stalling
Funny how the fix for a slow button is almost never making things faster. It's deciding what the user actually needs to wait for, which turns out to be almost nothing. π
-
π± One Message and You're Verified
Spent half the day convinced our webhook code was broken, and the fix turned out to be one toggle in Meta's dashboard. Classic. But there's something quietly satisfying about this one: a stranger sends us a six-character message on WhatsApp, and two seconds later three systems on two continents agree they're really them. Verified numbers mean contact discovery actually works, which means the person you'd travel with can actually find you. That's the whole point of the app, hiding inside a settings row. π±
-
π€ No WhatsApp? No Dead End.
Funny how the hard part of "verify a phone number for free" isn't the cryptography or the webhooks, it's the person who simply doesn't have WhatsApp. The old behavior was technically correct and completely heartless: here's a download page, good luck, we'll be here spinning. The new dialog just tells the truth like a friend would: it runs on WhatsApp for now, it's free, and honestly, this can wait. Turns out most edge cases are just people, standing in front of an app, asking it to be straight with them. π€
-
π Who's Reading, and When
I've been publishing articles into the dark and calling it content marketing. Now I get to see which ones people actually finish, and which ones only ClaudeBot loves. Writing for an audience of robots wasn't the plan, but knowing beats guessing every time. π‘
-
πͺ Now You See It. Now You Don't.
I shipped analytics, wrote the proud journal entry, and the build system undid the whole thing before a single visitor was counted. Caught it on one last look at the dev site before promoting, which is the entire reason that habit exists. The computer does exactly what you told it to, six weeks ago, forever. πͺ
-
π Articles that publish themselves
Turns out every article we never wrote was really just the friction of a deploy wearing a disguise. Take that to zero and the blog becomes a place I actually want to show up. π
-
π§Ή Leaner map avatars, fewer memory spikes
Funny how the fix Google nudged us toward also quietly killed a memory leak we were never going to go looking for. The overlay had been politely hoarding every face it ever saw. Not anymore. π§
-
π§ Circles, sorted: People, Overlaps, Places
Funny how the fix was mostly deletion. The overlap sections were fine, they were just filed under the wrong drawer, and moving them made both tabs read like they finally know what they are for. People, overlaps, places. Say what you mean. π§
-
πΊοΈ Open dates, now with a place attached
Funny how the smallest gaps are the ones users actually hit. Free time was always meant to be a trip with the destination left blank, so the fact that editing one had no way to fill that blank in was a hole shaped exactly like the feature. Reusing the trip wizard meant almost no new code, just pointing the door somewhere useful. πͺ
-
?? Mock users who finally look like their names
Funny how a wrong face is the thing your eye snags on every single time. You stop seeing the map, the trips, the whole point, and just think why does that Tokyo guy look like my aunt from Stockholm. Sweating the fake people so the real ones feel real. ??
-
πͺͺ Your username, yours from the first tap
This one stung a little, because the happy path looked perfect every time I read it. The bug lived in the gap between two API calls, not in either one. A photo upload that politely said "profile's done now" before the user had even chosen their name. Names are identity, so getting handed one you didn't pick is the worst kind of small bug. Fixed at the root, and added a test that fails loudly if anyone ever reorders that flow again. πͺͺ
-
π On the List: Someday Trips Get Their Own Confirmation
Funny how a four-word copy change can feel like the whole point. A booked trip and a someday dream are not the same emotion, and the app shouldn't pretend they are. Also nice to delete an await and have the thing get both nicer and faster. πΊοΈ
-
π The connect nudge knows when you've connected
The detail I like most is the phone gate. Finding your friends and letting them find you are the same coin, and stapling them together at the moment of intent feels right. Small change, but it quietly closes a loop that was open. π
-
π¨ Email links now open the app, not the browser
-
πΊοΈ The map faces come back when you do
Funny how often the bug is not the thing doing work, but the thing that forgot to. The map drew everything perfectly, it just never thought to ask for the photos again after a nap. Reminders are half of software. π΄
-
πΊοΈ Where your circle goes, now with the view
Funny how much a photo does. The same data that read as a spreadsheet now reads as somewhere you might actually go. Cutting five down to three helped too, because a top five nobody scrolls is really a top three with noise. πΊοΈ
-
β¨ A Living Map Under the Landing Page
π Funny thing about a map app: for the longest time our own front door was justβ¦ a still photo of a map. Now the dots actually wander, occasionally bump into each other, and ripple β which is exactly the feeling we keep promising people the product will give them. The homepage finally does the thing it talks about. β¨
-
π§ Places search: a city keeps to its own country
Funny how the data model tells on you. A trip's first country and first city were never required to agree, so one confident traveller's India-then-Johannesburg route invented a whole new Johannesburg in India. The real lesson is that a denormalized shortcut is a promise you have to keep coherent, or search will happily repeat your fib to everyone. πΊοΈ
-
πΊοΈ Map avatars learn to glide into a pair
-
ποΈ Someday trips you can actually join
-
π Overlaps earns its own tab
-
π€ Find your people, right inside Circles
-
π² One step at a time, and a free WhatsApp tick
Funny how the free part took the most thought. Anyone can pay Meta to text a code. Getting the user to text us instead, and catching it on a webhook, costs nothing and feels a little like a magic trick. πͺ
-
π§ Tel Aviv stops being three places
Entity resolution is one of those problems that sounds academic until your own app shows you three Tel Avivs. Funny how the fix is just the thing people do without thinking: that is the same place, only said differently. π§
-
π§ Places that know where you could go
This is the one that feels most like the actual product to me. Noovo is supposed to notice the overlap you would have missed, and a someday place lighting up because a friend just booked it is exactly that. Three PRs in, the Circles tab finally argues for a trip instead of just listing people. π§
-
πΊοΈ The friends map gets its faces back on iPhone
-
πΊοΈ Places start keeping notes
-
π Avatars Back on the iPhone Map
-
ποΈ Profile lists, folded into one shelf
-
π Overlapping Trips, Resolved Your Way
-
π Find Your People: Contact Discovery, One Tap
-
π§ Open to travel, back on the timeline
-
π Flags on the Route Line
-
βοΈ Step one of the trip wizard finally breathes
-
βοΈ Bookends for every trip
-
π Join, on a need-to-see basis
-
π§ Trip creation, in three beats
-
π¬ Unsubscribe That Lands You Back Home
-
π§³ Free Time Becomes a Trip: The Data Migration
-
πΊοΈ The map learned to read a crowd
-
π An Unread Tab for Notifications
-
πͺΈ Open to Travel Goes Coral
-
π Notifications That Show Up in Real Time
-
πΊοΈ One Trip, Many Places: The Foundation
-
π§ Same Country, Same Time
-
π§΅ A Trip Becomes a Route
-
πͺ§ Reading a Trip That Goes Places
-
πΎ The Map Draws the Whole Journey
-
β¨ Someday trips, for plans without a date
-
π§© Two Words for the Same Thing
-
π Someday Trips, Together: Join and Promote Design
-
π§ Circles overlaps, decluttered and a merge button that answers
-
π The Link Button That Finally Links
-
πͺ Closed the Sign-In Limbo
-
β¨οΈ The Keyboard Gets Out of the Way
-
π The Timeline Now Explains Itself
-
π Google Contacts Import, Un-Broken
-
π₯ Trip Signals: a tap that means something
-
πΊοΈ Create a trip, land on the map
-
πΊοΈ Overlap notifications, broken into real moments
-
π Notifications that come to life
-
βοΈ Trips that name themselves
-
π Merge trips instead of just joining them
-
π» The Whisper lands on iOS
-
π Every back button finally lines up
-
π Apple Sign In Fixed: iOS Login Unblocked
-
π°οΈ LastGps Poison Fix: false "Didn't make it to {city}?" nags
-
β¨οΈ Keyboard Never Covers the Field You're Typing In
-
π Birthday Picker: Native Platform Control
-
πͺ Frosted Glass, Per-Platform: Overlay Cards Fixed on Native
-
π¨ Theme Switches Cleanly, Avatars Show, Checkmarks Visible
-
πͺ΅ The build log gets its own page
-
π Auth flow restructured: Google first, Apple second, FB on ice
-
π Scheduler Reads Live GPS: Cape Town False-Positive Fixed
-
π’ Free-time cards in Who's Going: one tap to plan together
-
β© Timeline scrubber reaches free-time too, not just trips
-
π‘ Birthday Wheel Stops Glitching on 120 Hz Android
-
π’ Free-time green heatmap + free-time overlap chip
-
π’ Android Versioning on Autopilot
-
π€ Request to Join: Optimistic + Dates + Auto-Add
-
π¦ Firefox Stops Hijacking the Contact Page
-
π Lock the App to LTR (Hebrew Half-Mirror Fix)
-
π€ Live on Google Play: launch readiness shipped
-
πΊοΈ SEO Content Hub: Six Articles, Built for Retrieval
-
π€« Killed the spurious 'Google sign-in failed' toast on Android
-
β‘ Fast Startup: Disk Cache + Deferred Fetches
-
π In-app Update Prompt: Native Builds Tell Users When They're Behind
-
π― BadgeAwarder: Auto-Awards on Signup
-
π Badge Earned: Notifications Across Every Surface
-
β¨ Sign-up β Map: one continuous splash, no flash
-
ποΈ Badges: Pick Your Three
-
β³ Post-Auth Loader: Branded Spinner Replaces the Form
-
π Tap a Badge: See How It Was Earned
-
πͺ² Badges: Tooltip, Inline Editor, Bugdroid Bug
-
π Noovo Spinner: Orbiting Dots Around the Logo
-
π Instagram pill inline, plus IG-as-username auto-fill
-
ποΈ Fresh on your circle's calendar
-
ποΈ Origin & Charter: Badge Framework Ships
-
π Facebook is back: login, friend discovery, and a quiet "they joined" ping
-
π οΈ Fix Android crash on @-mention notification tap
-
πΈ Instagram handles land on profiles
-
π‘οΈ Backend Hardening: Admin Filter & (You) Labels
-
βοΈ AlmostDetection: BackgroundService Refactor
-
π Domain Errors: No More Bug Messages Leaking as 400s
-
π§Ή AuthController: EF Queries β Service
-
πΊοΈ Smart trip-day notifications
-
π¬ Overlap Detection on Trip Create
-
π Pin or Prompt: Move-Detection for Everyone
-
π Cape Town stops drowning: high-res polygons + correct centroids
-
π Trip Invites Speak in Tenses Now
-
Coral tagline + a whisper for the curious: Entry screen
-
π Forgot Password: Email Verification Reset Flow
-
π Username Lock & Email Re-verification
-
ποΈ Trips have IDs before they exist: share tokens for invites at form-fill time
-
πΊοΈ OG Cards Get Real Country Maps
-
π People β Circles: Hybrid IA + Plan-with-friend
-
πΊοΈ Where They've Been: Digest Email Gets a Past Tense
-
π― Show all the joiners: linked trip companions
-
βοΈ Trip Invites Stop Tripping Over Themselves
-
πͺ Every Search Is a Recruitment Moment
-
ποΈ Trip invites, visible where they matter
-
π Every Notification Resolves
-
πΊοΈ Profile Trips: Endless Scroll & Honest Stats
-
π Calendar Goes Back 70 Years
-
π§ Notifications Get a Brain
-
ποΈ Hard Delete: Nuke Your Data, No Waiting
-
π§Ή Codebase Review: Suggestions & Warnings Applied
-
π· Make It Yours: Custom Trip Cover Photos
-
πΊοΈ Scratch Map Visibility Fix: Countries Now True to State
-
β¨ UX Polish: Trip CTAs, Notification Jank, Comment Refresh
-
πΊοΈ Scratch Map Layering: Countries Stack Right
-
π Notification Tap Navigation: Tap to go, not just to read
-
ποΈ Trip Archival + Shared Trip Data: Past trips cleaned up, joined trips visible
-
π Year in Dates: Smart Year Display
-
π¨ Brand Identity Audit: Every Pixel Aligned
-
π Capacity Gate: The App Goes Live
-
π Crews Reframed: Private Visibility Lists
-
π¬ Animated Entry Screen: Brand Moment Before Login
-
ποΈ Timeline Scrubber: 6-Month Sliding Viewport
-
ποΈ Crew Delete: Cascading Visibility & Rich Confirmation
-
π¬ In-App Feedback Widget: Soft Launch Ready
-
βοΈ Inline Crew Editing: Search & Remove Without Leaving
-
β‘ Trip Creation Goes Sub-Second
-
π± Timeline scrubber: dodge iOS back-gesture
-
π PostHog Analytics: Eyes on the Map
-
π§ Empty State Revamp: 2-Step Onboarding Flow
-
π Full-Fidelity Analytics: Every Click Tracked
-
π§ͺ Testing Infrastructure: From Zero to 101 Tests
-
π Dev Environment: Deploy to Dev First, Promote to Prod
-
π§ Digest Email Glow-Up: Unsubscribe Fix + Redesign
-
π¬ Email Digest: Stop the Notification Flood
-
π€ Friends in Common: Smarter Suggestion Scoring
-
π² Instagram Invite: Copy Message + Confirmation Modal
-
π Desktop scroll-forward overlays for horizontal sections
-
π₯οΈ Desktop Top Nav: Responsive Navigation
-
π Birthday Wheel Picker & Gender Field
-
π Crews Go Private: Visibility Management Revamp
-
π― 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 π―
-
π Pre-fill destination from disparity popup
-
β‘ Auto-Save: Kill the Save Button
-
π― Smart Who's Going Ranking
-
π Notification Polish: Sizing & Stale State Handling
-
π Apple Sign-In: App Store Compliance Unlocked
-
π¨ Not Here Yet: Inline Contact Invites
-
π Google Contacts Discovery: The Email-Only Friends
-
πΊοΈ Scratch Map Now Tracks Trip Edits
-
π₯ Facebook Friend Discovery: Who's Already Here
-
π Private Trips on Scratch Map + LocationHistory Backfill
-
π§Ή Single Source of Truth: Invite Consolidation
-
π₯ Who's Coming?: Trip Invite Flow
-
π Timezone Awareness: Dates That Don't Lie
-
π― Trip Suggestions: Date Picker & Timeblock Fix
-
βοΈ Edit & Delete Free Time from Profile
-
π§Ή Code Quality Sweep: type safety, god files, middleware
-
π¬ 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 π
-
π 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. π
-
π 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. πͺΆ
-
β¨ 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. β¨
-
π 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. π»
-
π₯ 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. π©οΈ
-
π Notification Visual Differentiation: Icons, Card Tiers, Date Headers
-
β‘ http Performance: Compression, Pooling & Caching
-
π 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. ποΈ
-
π·οΈ 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. π·οΈ
-
π§Ή 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. π§Ή
-
π 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. π
-
π 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. π’
-
β¨ 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. π’
-
π 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. π§Ή
-
π‘οΈ 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. π
-
π οΈ 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. β
-
π 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. π―
-
π 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. π
-
π 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 β‘
-
π 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. π©οΈ
-
π 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." π
-
π― 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. π―
-
π 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. π±
-
π 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. πΊοΈ
-
πΌοΈ 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 πΈ
-
β¨ 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. πͺ
-
β¨ 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. π
-
π₯ 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. π
-
πΊοΈ 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. π
-
π€ 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 π
-
π€ 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. π§Ή
-
π 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. πΊοΈ
-
πΊοΈ 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. π
-
π 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. π
-
πͺΊ 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. πͺΊ
-
β‘ 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. β‘
-
πΊοΈ 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. π―
-
π§© 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. π§©
-
πΊοΈ 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 πΊοΈ
-
πΊοΈ 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. π
-
β¨ 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 β¨
-
π 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. π±
-
π» 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. π»
-
π§βπ€βπ§ 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. π§³
-
π 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. π
-
π§ 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. π§Ή
-
π§ 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 π
-
π§ 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. π¬
-
π€ 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. π
-
π¨ 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. π©
-
π§ 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. π¬
-
π¨ 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. π¨
-
πΊοΈ 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. πΊοΈ
-
π₯ 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. βοΈ
-
β¨ 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. β¨
-
π‘οΈ 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. π―
-
π± 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. π
-
π¦ 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. π
-
π§ 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. π
-
π¬ 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. π₯
-
π¨ 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. π¨
-
π 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. π
-
πΊοΈ 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. π
-
π 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. π β¨
-
πΈ 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. π·
-
π₯ 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. π
-
π₯ 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. π
-
π 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 π
-
π« 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. π
-
π‘οΈ 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. π‘οΈ
-
π 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. β¨
-
ποΈ 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. π
-
π 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. π
-
π 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. π
-
βοΈ 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. β¨
-
πΊοΈ 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?!" β¨
-
π 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. π
-
π¨ 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. βοΈ
-
π 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. π
-
πΊοΈ 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. π§
-
π£οΈ 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. π€
-
πΊοΈ 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. β¨
-
πΊοΈ 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. π
-
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." πΊοΈ
-
π 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. π§΅
-
β‘ 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. β‘
-
π οΈ 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. β¨
-
π 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. πͺ
-
π Started inviting the first few ppl to the wait list
Now that this is basically done - next is socials and then back to development π
-
β¨ 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. β¨βοΈ
-
π¨ 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. π€β¨
-
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 β¨
-
π¨ 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. π¨
-
π₯ 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. π₯
-
π 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. π π
-
π§ 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." βοΈβ€οΈ
-
π± All country codes + searchable phone picker: global phone auth
From 3 countries to 200+. The whole world just got an invitation to the party. ππ
-
π 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. π
-
π¨ 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. π
-
π‘ Notion-backed public timeline API
-
Editorial luxury landing page: fixed hero, marquee, snap-scroll carousels
-
πΊοΈ 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. π¨βπ³π₯
-
π Firebase Phone Auth: bye bye Twilio
Twilio charged per SMS. Firebase does it for free. Sometimes breaking up really is an upgrade. πβ‘οΈπ
-
π§ React Navigation & app shell: real app UX
-
π¨ Design system born: theme tokens & Ionicons
-
π Waitlist landing page goes live: the viral engine begins
-
π 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. π₯
-
π 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. π±β¨
-
βοΈ 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. π
-
πͺ 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. β‘
-
π€ 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. π΅
-
πΈοΈ Registered.dev domain
Registered Chuvali.dev on Porkbun.com with password doubled
-
βοΈ Added Azure free trial account
$200 worth of credit for 30 days + infra for BE deployment
-
π» 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. π§
-
π 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. β‘
-
π 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. π€
-
π 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. ποΈ
-
π 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. π
-
π€ 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. π€
-
ποΈ 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. π οΈ
-
π± 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. πΆ
-
π€ 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. π€πΊ
-
π 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. π
-
π± 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 β¨